@@ -441,6 +441,25 @@ func resourceTencentCloudTkeCluster() *schema.Resource {
441
441
ValidateFunc : validateStringLengthInRange (4 , 100 ),
442
442
Description : "Vpc Id of the cluster." ,
443
443
},
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
+ },
444
463
"project_id" : {
445
464
Type : schema .TypeInt ,
446
465
ForceNew : true ,
@@ -792,16 +811,33 @@ func resourceTencentCloudTkeClusterCreate(d *schema.ResourceData, meta interface
792
811
logId := getLogId (contextNil )
793
812
ctx := context .WithValue (context .TODO (), "logId" , logId )
794
813
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
+ }
803
828
clusterDeployType := d .Get ("cluster_deploy_type" ).(string )
804
829
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
+
805
841
vpcId := d .Get ("vpc_id" ).(string )
806
842
if vpcId != "" {
807
843
basic .VpcId = vpcId
@@ -930,6 +966,107 @@ func resourceTencentCloudTkeClusterCreate(d *schema.ResourceData, meta interface
930
966
log .Printf ("[WARN]%s resource.kubernetes_cluster.read after create fail , %s" , logId , err .Error ())
931
967
}
932
968
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
+
933
1070
return nil
934
1071
}
935
1072
@@ -1047,6 +1184,12 @@ func resourceTencentCloudTkeClusterRead(d *schema.ResourceData, meta interface{}
1047
1184
_ = d .Set ("pgw_endpoint" , emptyStrFunc (securityRet .Response .PgwEndpoint ))
1048
1185
_ = d .Set ("security_policy" , policies )
1049
1186
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 )
1050
1193
return nil
1051
1194
}
1052
1195
@@ -1059,16 +1202,179 @@ func resourceTencentCloudTkeClusterUpdate(d *schema.ResourceData, meta interface
1059
1202
1060
1203
client := meta .(* TencentCloudClient ).apiV3Conn
1061
1204
service := TagService {client : client }
1205
+ tkeService := TkeService {client : meta .(* TencentCloudClient ).apiV3Conn }
1062
1206
region := client .Region
1207
+ d .Partial (true )
1063
1208
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 {}))
1066
1212
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
+ }
1070
1375
}
1071
1376
1377
+ d .Partial (false )
1072
1378
if err := resourceTencentCloudTkeClusterRead (d , meta ); err != nil {
1073
1379
log .Printf ("[WARN]%s resource.kubernetes_cluster.read after update fail , %s" , logId , err .Error ())
1074
1380
}
0 commit comments