Skip to content

Commit 2cef734

Browse files
committed
Add internet function for tke.
1 parent f4aebd3 commit 2cef734

File tree

3 files changed

+504
-13
lines changed

3 files changed

+504
-13
lines changed

tencentcloud/extension_tke.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,3 +51,13 @@ const (
5151
)
5252

5353
var TKE_CLUSTER_OS_TYPES = []string{TKE_CLUSTER_OS_TYPE_DOCKER_CUSTOMIZE, TKE_CLUSTER_OS_TYPE_GENERAL}
54+
55+
const (
56+
TkeInternetStatusCreating = "Creating"
57+
TkeInternetStatusCreateFailed = "CreateFailed"
58+
TkeInternetStatusCreated = "Created"
59+
TkeInternetStatusDeleting = "Deleting"
60+
TkeInternetStatusDeleted = "Deleted"
61+
TkeInternetStatusDeletedFailed = "DeletedFailed"
62+
TkeInternetStatusNotfound = "NotFound"
63+
)

tencentcloud/resource_tc_kubernetes_cluster.go

Lines changed: 319 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,25 @@ func resourceTencentCloudTkeCluster() *schema.Resource {
441441
ValidateFunc: validateStringLengthInRange(4, 100),
442442
Description: "Vpc Id of the cluster.",
443443
},
444+
"cluster_internet": {
445+
Type: schema.TypeBool,
446+
Default: false,
447+
Optional: true,
448+
Description: "Open internet access or not",
449+
},
450+
"managed_cluster_internet_security_policies": {
451+
Type: schema.TypeList,
452+
Computed: true,
453+
Optional: true,
454+
Elem: &schema.Schema{Type: schema.TypeString},
455+
Description: "Security policies for managed cluster internet, like:'192.168.1.0/24' or '113.116.51.27', '0.0.0.0/0' means all. This field can set only when field `cluster_deploy_type` is 'MANAGED_CLUSTER' and `cluster_internet` is true.",
456+
},
457+
"independent_cluster_intranet_subnet_id": {
458+
Type: schema.TypeString,
459+
Optional: true,
460+
ForceNew: true,
461+
Description: "Subnet id who can access this independent cluster, this field can set only only where field `cluster_deploy_type` is 'INDEPENDENT_CLUSTER'.",
462+
},
444463
"project_id": {
445464
Type: schema.TypeInt,
446465
ForceNew: true,
@@ -792,16 +811,33 @@ func resourceTencentCloudTkeClusterCreate(d *schema.ResourceData, meta interface
792811
logId := getLogId(contextNil)
793812
ctx := context.WithValue(context.TODO(), "logId", logId)
794813

795-
var basic ClusterBasicSetting
796-
var advanced ClusterAdvancedSettings
797-
var cvms RunInstancesForNode
798-
var iAdvanced InstanceAdvancedSettings
799-
var cidrSet ClusterCidrSettings
800-
cvms.Master = []string{}
801-
cvms.Work = []string{}
802-
814+
var (
815+
basic ClusterBasicSetting
816+
advanced ClusterAdvancedSettings
817+
cvms RunInstancesForNode
818+
iAdvanced InstanceAdvancedSettings
819+
cidrSet ClusterCidrSettings
820+
securityPolicies []string
821+
clusterInternet = d.Get("cluster_internet").(bool)
822+
intranetSubnetId = d.Get("independent_cluster_intranet_subnet_id").(string)
823+
)
824+
825+
if temp, ok := d.GetOkExists("managed_cluster_internet_security_policies"); ok {
826+
securityPolicies = helper.InterfacesStrings(temp.([]interface{}))
827+
}
803828
clusterDeployType := d.Get("cluster_deploy_type").(string)
804829

830+
if intranetSubnetId != "" && clusterDeployType != TKE_DEPLOY_TYPE_INDEPENDENT {
831+
return fmt.Errorf("`independent_cluster_intranet_subnet_id` can set only only where field `cluster_deploy_type` is 'INDEPENDENT_CLUSTER'")
832+
}
833+
834+
if len(securityPolicies) > 0 {
835+
if clusterDeployType == TKE_DEPLOY_TYPE_INDEPENDENT || !clusterInternet {
836+
return fmt.Errorf("`managed_cluster_internet_security_policies` can set only when field" +
837+
" `cluster_deploy_type` is 'MANAGED_CLUSTER' and `cluster_internet` is true")
838+
}
839+
}
840+
805841
vpcId := d.Get("vpc_id").(string)
806842
if vpcId != "" {
807843
basic.VpcId = vpcId
@@ -930,6 +966,107 @@ func resourceTencentCloudTkeClusterCreate(d *schema.ResourceData, meta interface
930966
log.Printf("[WARN]%s resource.kubernetes_cluster.read after create fail , %s", logId, err.Error())
931967
}
932968

969+
//TKE_DEPLOY_TYPE_MANAGED Open the internet
970+
if clusterDeployType == TKE_DEPLOY_TYPE_MANAGED && clusterInternet {
971+
err = resource.Retry(writeRetryTimeout, func() *resource.RetryError {
972+
inErr := service.CreateClusterEndpointVip(ctx, id, securityPolicies)
973+
if inErr != nil {
974+
return retryError(inErr)
975+
}
976+
return nil
977+
})
978+
if err != nil {
979+
return err
980+
}
981+
err = resource.Retry(2*readRetryTimeout, func() *resource.RetryError {
982+
status, message, inErr := service.DescribeClusterEndpointVipStatus(ctx, id)
983+
if inErr != nil {
984+
return retryError(inErr)
985+
}
986+
if status == TkeInternetStatusCreating {
987+
return resource.RetryableError(
988+
fmt.Errorf("%s create cluster endpoint vip status still is %s", id, status))
989+
}
990+
if status == TkeInternetStatusNotfound || status == TkeInternetStatusCreated {
991+
return nil
992+
}
993+
return resource.NonRetryableError(
994+
fmt.Errorf("%s create cluster endpoint vip error ,status is %s,message is %s", id, status, message))
995+
})
996+
if err != nil {
997+
return err
998+
}
999+
}
1000+
1001+
//TKE_DEPLOY_TYPE_INDEPENDENT Open the internet or set subnet
1002+
if clusterDeployType == TKE_DEPLOY_TYPE_INDEPENDENT {
1003+
1004+
//open intranet
1005+
if intranetSubnetId != "" {
1006+
err = resource.Retry(writeRetryTimeout, func() *resource.RetryError {
1007+
inErr := service.CreateClusterEndpoint(ctx, id, intranetSubnetId, false)
1008+
if inErr != nil {
1009+
return retryError(inErr)
1010+
}
1011+
return nil
1012+
})
1013+
if err != nil {
1014+
return err
1015+
}
1016+
1017+
err = resource.Retry(2*readRetryTimeout, func() *resource.RetryError {
1018+
status, message, inErr := service.DescribeClusterEndpointStatus(ctx, id)
1019+
if inErr != nil {
1020+
return retryError(inErr)
1021+
}
1022+
if status == TkeInternetStatusCreating {
1023+
return resource.RetryableError(
1024+
fmt.Errorf("%s create intranet cluster endpoint status still is %s", id, status))
1025+
}
1026+
if status == TkeInternetStatusNotfound || status == TkeInternetStatusCreated {
1027+
return nil
1028+
}
1029+
return resource.NonRetryableError(
1030+
fmt.Errorf("%s create intranet cluster endpoint error ,status is %s,message is %s", id, status, message))
1031+
})
1032+
if err != nil {
1033+
return err
1034+
}
1035+
}
1036+
//open internet
1037+
if clusterInternet {
1038+
err = resource.Retry(writeRetryTimeout, func() *resource.RetryError {
1039+
inErr := service.CreateClusterEndpoint(ctx, id, "", true)
1040+
if inErr != nil {
1041+
return retryError(inErr)
1042+
}
1043+
return nil
1044+
})
1045+
if err != nil {
1046+
return err
1047+
}
1048+
err = resource.Retry(2*readRetryTimeout, func() *resource.RetryError {
1049+
status, message, inErr := service.DescribeClusterEndpointStatus(ctx, id)
1050+
if inErr != nil {
1051+
return retryError(inErr)
1052+
}
1053+
if status == TkeInternetStatusCreating {
1054+
return resource.RetryableError(
1055+
fmt.Errorf("%s create cluster internet endpoint status still is %s", id, status))
1056+
}
1057+
if status == TkeInternetStatusNotfound || status == TkeInternetStatusCreated {
1058+
return nil
1059+
}
1060+
return resource.NonRetryableError(
1061+
fmt.Errorf("%s create cluster internet endpoint error ,status is %s,message is %s", id, status, message))
1062+
})
1063+
if err != nil {
1064+
return err
1065+
}
1066+
}
1067+
1068+
}
1069+
9331070
return nil
9341071
}
9351072

@@ -1047,6 +1184,12 @@ func resourceTencentCloudTkeClusterRead(d *schema.ResourceData, meta interface{}
10471184
_ = d.Set("pgw_endpoint", emptyStrFunc(securityRet.Response.PgwEndpoint))
10481185
_ = d.Set("security_policy", policies)
10491186

1187+
if emptyStrFunc(securityRet.Response.ClusterExternalEndpoint) == "" {
1188+
_ = d.Set("cluster_internet", false)
1189+
} else {
1190+
_ = d.Set("cluster_internet", true)
1191+
}
1192+
_ = d.Set("managed_cluster_internet_security_policies", policies)
10501193
return nil
10511194
}
10521195

@@ -1059,16 +1202,179 @@ func resourceTencentCloudTkeClusterUpdate(d *schema.ResourceData, meta interface
10591202

10601203
client := meta.(*TencentCloudClient).apiV3Conn
10611204
service := TagService{client: client}
1205+
tkeService := TkeService{client: meta.(*TencentCloudClient).apiV3Conn}
10621206
region := client.Region
1207+
d.Partial(true)
10631208

1064-
oldTags, newTags := d.GetChange("tags")
1065-
replaceTags, deleteTags := diffTags(oldTags.(map[string]interface{}), newTags.(map[string]interface{}))
1209+
if d.HasChange("tags") {
1210+
oldTags, newTags := d.GetChange("tags")
1211+
replaceTags, deleteTags := diffTags(oldTags.(map[string]interface{}), newTags.(map[string]interface{}))
10661212

1067-
resourceName := BuildTagResourceName("ccs", "cluster", region, id)
1068-
if err := service.ModifyTags(ctx, resourceName, replaceTags, deleteTags); err != nil {
1069-
return err
1213+
resourceName := BuildTagResourceName("ccs", "cluster", region, id)
1214+
if err := service.ModifyTags(ctx, resourceName, replaceTags, deleteTags); err != nil {
1215+
return err
1216+
}
1217+
d.SetPartial("tags")
1218+
}
1219+
1220+
var (
1221+
clusterDeployType = d.Get("cluster_deploy_type").(string)
1222+
clusterInternet = d.Get("cluster_internet").(bool)
1223+
securityPolicies []string
1224+
)
1225+
1226+
if temp, ok := d.GetOkExists("managed_cluster_internet_security_policies"); ok {
1227+
securityPolicies = helper.InterfacesStrings(temp.([]interface{}))
1228+
}
1229+
1230+
if clusterDeployType == TKE_DEPLOY_TYPE_INDEPENDENT {
1231+
if d.HasChange("cluster_internet") {
1232+
//open
1233+
if clusterInternet {
1234+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
1235+
inErr := tkeService.CreateClusterEndpoint(ctx, id, "", true)
1236+
if inErr != nil {
1237+
return retryError(inErr)
1238+
}
1239+
return nil
1240+
})
1241+
if err != nil {
1242+
return err
1243+
}
1244+
err = resource.Retry(2*readRetryTimeout, func() *resource.RetryError {
1245+
status, message, inErr := tkeService.DescribeClusterEndpointStatus(ctx, id)
1246+
if inErr != nil {
1247+
return retryError(inErr)
1248+
}
1249+
if status == TkeInternetStatusCreating {
1250+
return resource.RetryableError(
1251+
fmt.Errorf("%s create cluster internet endpoint status still is %s", id, status))
1252+
}
1253+
if status == TkeInternetStatusNotfound || status == TkeInternetStatusCreated {
1254+
return nil
1255+
}
1256+
return resource.NonRetryableError(
1257+
fmt.Errorf("%s create cluster internet endpoint error ,status is %s,message is %s", id, status, message))
1258+
})
1259+
if err != nil {
1260+
return err
1261+
}
1262+
//close
1263+
} else {
1264+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
1265+
inErr := tkeService.DeleteClusterEndpoint(ctx, id)
1266+
if inErr != nil {
1267+
return retryError(inErr)
1268+
}
1269+
return nil
1270+
})
1271+
if err != nil {
1272+
return err
1273+
}
1274+
err = resource.Retry(2*readRetryTimeout, func() *resource.RetryError {
1275+
status, message, inErr := tkeService.DescribeClusterEndpointStatus(ctx, id)
1276+
if inErr != nil {
1277+
return retryError(inErr)
1278+
}
1279+
if status == TkeInternetStatusDeleting {
1280+
return resource.RetryableError(
1281+
fmt.Errorf("%s close cluster internet endpoint status still is %s", id, status))
1282+
}
1283+
if status == TkeInternetStatusNotfound || status == TkeInternetStatusDeleted {
1284+
return nil
1285+
}
1286+
return resource.NonRetryableError(
1287+
fmt.Errorf("%s close cluster internet endpoint error ,status is %s,message is %s", id, status, message))
1288+
})
1289+
if err != nil {
1290+
return err
1291+
}
1292+
}
1293+
1294+
}
1295+
}
1296+
1297+
if clusterDeployType == TKE_DEPLOY_TYPE_MANAGED {
1298+
if d.HasChange("cluster_internet") {
1299+
//open
1300+
if clusterInternet {
1301+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
1302+
inErr := tkeService.CreateClusterEndpointVip(ctx, id, securityPolicies)
1303+
if inErr != nil {
1304+
return retryError(inErr)
1305+
}
1306+
return nil
1307+
})
1308+
if err != nil {
1309+
return err
1310+
}
1311+
err = resource.Retry(2*readRetryTimeout, func() *resource.RetryError {
1312+
status, message, inErr := tkeService.DescribeClusterEndpointVipStatus(ctx, id)
1313+
if inErr != nil {
1314+
return retryError(inErr)
1315+
}
1316+
if status == TkeInternetStatusCreating {
1317+
return resource.RetryableError(
1318+
fmt.Errorf("%s create cluster endpoint vip status still is %s", id, status))
1319+
}
1320+
if status == TkeInternetStatusNotfound || status == TkeInternetStatusCreated {
1321+
return nil
1322+
}
1323+
return resource.NonRetryableError(
1324+
fmt.Errorf("%s create cluster endpoint vip error ,status is %s,message is %s", id, status, message))
1325+
})
1326+
if err != nil {
1327+
return err
1328+
}
1329+
//close
1330+
} else {
1331+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
1332+
inErr := tkeService.DeleteClusterEndpointVip(ctx, id)
1333+
if inErr != nil {
1334+
return retryError(inErr)
1335+
}
1336+
return nil
1337+
})
1338+
if err != nil {
1339+
return err
1340+
}
1341+
err = resource.Retry(2*readRetryTimeout, func() *resource.RetryError {
1342+
status, message, inErr := tkeService.DescribeClusterEndpointVipStatus(ctx, id)
1343+
if inErr != nil {
1344+
return retryError(inErr)
1345+
}
1346+
if status == TkeInternetStatusDeleting {
1347+
return resource.RetryableError(
1348+
fmt.Errorf("%s close cluster internet endpoint status still is %s", id, status))
1349+
}
1350+
if status == TkeInternetStatusNotfound || status == TkeInternetStatusDeleted {
1351+
return nil
1352+
}
1353+
return resource.NonRetryableError(
1354+
fmt.Errorf("%s close cluster internet endpoint error ,status is %s,message is %s", id, status, message))
1355+
})
1356+
if err != nil {
1357+
return err
1358+
}
1359+
1360+
}
1361+
d.SetPartial("cluster_internet")
1362+
d.SetPartial("managed_cluster_internet_security_policies")
1363+
//modify managed_cluster_internet_security_policies
1364+
} else {
1365+
if clusterInternet && d.HasChange("managed_cluster_internet_security_policies") {
1366+
if len(securityPolicies) == 0 {
1367+
return fmt.Errorf("`managed_cluster_internet_security_policies` can not delete once be setted")
1368+
}
1369+
if err := tkeService.ModifyClusterEndpointSP(ctx, id, securityPolicies); err != nil {
1370+
return err
1371+
}
1372+
}
1373+
d.SetPartial("managed_cluster_internet_security_policies")
1374+
}
10701375
}
10711376

1377+
d.Partial(false)
10721378
if err := resourceTencentCloudTkeClusterRead(d, meta); err != nil {
10731379
log.Printf("[WARN]%s resource.kubernetes_cluster.read after update fail , %s", logId, err.Error())
10741380
}

0 commit comments

Comments
 (0)