7
7
"encoding/hex"
8
8
"fmt"
9
9
"log"
10
+ "reflect"
10
11
"sort"
11
12
"strconv"
12
13
"strings"
@@ -309,6 +310,13 @@ func ResourceTencentCloudInstance() *schema.Resource {
309
310
ForceNew : true ,
310
311
Description : "Decides whether the disk is deleted with instance(only applied to `CLOUD_BASIC`, `CLOUD_SSD` and `CLOUD_PREMIUM` disk with `PREPAID` instance), default is false." ,
311
312
},
313
+ "kms_key_id" : {
314
+ Type : schema .TypeString ,
315
+ Optional : true ,
316
+ ForceNew : true ,
317
+ Computed : true ,
318
+ Description : "Optional parameters. When purchasing an encryption disk, customize the key. When this parameter is passed in, the `encrypt` parameter need be set." ,
319
+ },
312
320
"encrypt" : {
313
321
Type : schema .TypeBool ,
314
322
Optional : true ,
@@ -678,6 +686,10 @@ func resourceTencentCloudInstanceCreate(d *schema.ResourceData, meta interface{}
678
686
dataDisk .DeleteWithInstance = & deleteWithInstanceBool
679
687
}
680
688
689
+ if v , ok := value ["kms_key_id" ]; ok && v != "" {
690
+ dataDisk .KmsKeyId = helper .String (v .(string ))
691
+ }
692
+
681
693
if encrypt , ok := value ["encrypt" ]; ok {
682
694
encryptBool := encrypt .(bool )
683
695
dataDisk .Encrypt = & encryptBool
@@ -1024,7 +1036,7 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
1024
1036
}
1025
1037
1026
1038
// set data_disks
1027
- var hasDataDisks , isCombineDataDisks , hasDataDisksId , hasDataDisksName bool
1039
+ var hasDataDisks , isCombineDataDisks , hasDataDisksId bool
1028
1040
dataDiskList := make ([]map [string ]interface {}, 0 , len (instance .DataDisks ))
1029
1041
diskSizeMap := map [string ]* uint64 {}
1030
1042
diskOrderMap := make (map [string ]int )
@@ -1044,13 +1056,6 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
1044
1056
hasDataDisksId = true
1045
1057
}
1046
1058
}
1047
-
1048
- if v , ok := value ["data_disk_name" ]; ok && v != nil {
1049
- diskName := v .(string )
1050
- if diskName != "" {
1051
- hasDataDisksName = true
1052
- }
1053
- }
1054
1059
}
1055
1060
}
1056
1061
@@ -1070,6 +1075,14 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
1070
1075
if value ["data_disk_id" ].(string ) == * item .DiskId {
1071
1076
value ["data_disk_name" ] = * item .DiskName
1072
1077
value ["data_disk_size" ] = int (* item .DiskSize )
1078
+ value ["data_disk_type" ] = * item .DiskType
1079
+ if item .KmsKeyId != nil {
1080
+ value ["kms_key_id" ] = * item .KmsKeyId
1081
+ }
1082
+
1083
+ value ["encrypt" ] = * item .Encrypt
1084
+ value ["throughput_performance" ] = * item .ThroughputPerformance
1085
+ value ["delete_with_instance" ] = * item .DeleteWithInstance
1073
1086
break
1074
1087
}
1075
1088
}
@@ -1087,7 +1100,7 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
1087
1100
}
1088
1101
1089
1102
// scene with has disks name
1090
- if len (instance .DataDisks ) > 0 && ! hasDataDisksName {
1103
+ if len (instance .DataDisks ) > 0 && ! hasDataDisksId {
1091
1104
var diskIds []* string
1092
1105
for i := range instance .DataDisks {
1093
1106
id := instance .DataDisks [i ].DiskId
@@ -1143,7 +1156,7 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
1143
1156
}
1144
1157
1145
1158
for _ , disk := range instance .DataDisks {
1146
- dataDisk := make (map [string ]interface {}, 5 )
1159
+ dataDisk := make (map [string ]interface {})
1147
1160
if ! strings .HasPrefix (* disk .DiskId , "disk-" ) {
1148
1161
continue
1149
1162
}
@@ -1158,6 +1171,7 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
1158
1171
dataDisk ["data_disk_type" ] = disk .DiskType
1159
1172
dataDisk ["data_disk_snapshot_id" ] = disk .SnapshotId
1160
1173
dataDisk ["delete_with_instance" ] = disk .DeleteWithInstance
1174
+ dataDisk ["kms_key_id" ] = disk .KmsKeyId
1161
1175
dataDisk ["encrypt" ] = disk .Encrypt
1162
1176
dataDisk ["throughput_performance" ] = disk .ThroughputPerformance
1163
1177
dataDiskList = append (dataDiskList , dataDisk )
@@ -1171,17 +1185,6 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
1171
1185
})
1172
1186
}
1173
1187
1174
- // set data disk delete_with_instance_prepaid
1175
- for i := range dataDiskList {
1176
- dataDiskList [i ]["delete_with_instance_prepaid" ] = false
1177
- if hasDataDisks {
1178
- tmpDataDisk := tmpDataDisks [i ].(map [string ]interface {})
1179
- if deleteWithInstancePrepaidBool , ok := tmpDataDisk ["delete_with_instance_prepaid" ].(bool ); ok {
1180
- dataDiskList [i ]["delete_with_instance_prepaid" ] = deleteWithInstancePrepaidBool
1181
- }
1182
- }
1183
- }
1184
-
1185
1188
// set data disk name
1186
1189
finalDiskIds := make ([]* string , 0 , len (dataDiskList ))
1187
1190
for _ , item := range dataDiskList {
@@ -1215,9 +1218,25 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
1215
1218
}
1216
1219
}
1217
1220
1218
- _ = d .Set ("data_disks" , dataDiskList )
1221
+ sortedDataDiskList , err := sortDataDisks (tmpDataDisks , dataDiskList )
1222
+ if err != nil {
1223
+ return err
1224
+ }
1225
+
1226
+ // set data disk delete_with_instance_prepaid
1227
+ for i := range sortedDataDiskList {
1228
+ sortedDataDiskList [i ]["delete_with_instance_prepaid" ] = false
1229
+ if hasDataDisks {
1230
+ tmpDataDisk := tmpDataDisks [i ].(map [string ]interface {})
1231
+ if deleteWithInstancePrepaidBool , ok := tmpDataDisk ["delete_with_instance_prepaid" ].(bool ); ok {
1232
+ sortedDataDiskList [i ]["delete_with_instance_prepaid" ] = deleteWithInstancePrepaidBool
1233
+ }
1234
+ }
1235
+ }
1236
+
1237
+ _ = d .Set ("data_disks" , sortedDataDiskList )
1219
1238
}
1220
- } else if len (instance .DataDisks ) > 0 && hasDataDisksName {
1239
+ } else if len (instance .DataDisks ) > 0 && hasDataDisksId {
1221
1240
// scene with no disks name
1222
1241
dDiskHash := make ([]map [string ]interface {}, 0 )
1223
1242
// get source disk hash
@@ -1234,6 +1253,7 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
1234
1253
diskType := value ["data_disk_type" ].(string )
1235
1254
diskSize := int64 (value ["data_disk_size" ].(int ))
1236
1255
deleteWithInstance := value ["delete_with_instance" ].(bool )
1256
+ kmsKeyId := value ["kms_key_id" ].(string )
1237
1257
encrypt := value ["encrypt" ].(bool )
1238
1258
if tmpV , ok := value ["data_disk_name" ].(string ); ok && tmpV != "" {
1239
1259
diskName = tmpV
@@ -1243,6 +1263,7 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
1243
1263
diskType : diskType ,
1244
1264
diskSize : diskSize ,
1245
1265
deleteWithInstance : deleteWithInstance ,
1266
+ kmsKeyId : kmsKeyId ,
1246
1267
encrypt : encrypt ,
1247
1268
}
1248
1269
@@ -1301,6 +1322,7 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
1301
1322
dataDisk ["data_disk_type" ] = cvmDisk .DiskType
1302
1323
dataDisk ["data_disk_snapshot_id" ] = cvmDisk .SnapshotId
1303
1324
dataDisk ["delete_with_instance" ] = cvmDisk .DeleteWithInstance
1325
+ dataDisk ["kms_key_id" ] = cvmDisk .KmsKeyId
1304
1326
dataDisk ["encrypt" ] = cvmDisk .Encrypt
1305
1327
dataDisk ["throughput_performance" ] = cvmDisk .ThroughputPerformance
1306
1328
dataDisk ["flag" ] = 0
@@ -1313,17 +1335,24 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
1313
1335
// has set disk name first
1314
1336
for v := range sourceDataDisks {
1315
1337
for i := range dDiskHash {
1338
+ var kmsKeyId * string
1316
1339
disk := * sourceDataDisks [v ]
1317
1340
diskFlag := disk ["flag" ].(int )
1318
1341
diskName := disk ["data_disk_name" ].(* string )
1319
1342
diskType := disk ["data_disk_type" ].(* string )
1320
1343
diskSize := disk ["data_disk_size" ].(* int64 )
1321
1344
deleteWithInstance := disk ["delete_with_instance" ].(* bool )
1345
+ if v , ok := disk ["kms_key_id" ].(* string ); ok && v != nil {
1346
+ kmsKeyId = v
1347
+ } else {
1348
+ kmsKeyId = helper .String ("" )
1349
+ }
1322
1350
encrypt := disk ["encrypt" ].(* bool )
1323
1351
tmpHash := getDataDiskHash (diskHash {
1324
1352
diskType : * diskType ,
1325
1353
diskSize : * diskSize ,
1326
1354
deleteWithInstance : * deleteWithInstance ,
1355
+ kmsKeyId : * kmsKeyId ,
1327
1356
encrypt : * encrypt ,
1328
1357
})
1329
1358
@@ -1339,6 +1368,7 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
1339
1368
dataDisk ["data_disk_type" ] = disk ["data_disk_type" ]
1340
1369
dataDisk ["data_disk_snapshot_id" ] = disk ["data_disk_snapshot_id" ]
1341
1370
dataDisk ["delete_with_instance" ] = disk ["delete_with_instance" ]
1371
+ dataDisk ["kms_key_id" ] = disk ["kms_key_id" ]
1342
1372
dataDisk ["encrypt" ] = disk ["encrypt" ]
1343
1373
dataDisk ["throughput_performance" ] = disk ["throughput_performance" ]
1344
1374
tmpDataDiskMap [hashItem ["index" ].(int )] = dataDisk
@@ -1353,16 +1383,23 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
1353
1383
// no set disk name last
1354
1384
for v := range sourceDataDisks {
1355
1385
for i := range dDiskHash {
1386
+ var kmsKeyId * string
1356
1387
disk := * sourceDataDisks [v ]
1357
1388
diskFlag := disk ["flag" ].(int )
1358
1389
diskType := disk ["data_disk_type" ].(* string )
1359
1390
diskSize := disk ["data_disk_size" ].(* int64 )
1360
1391
deleteWithInstance := disk ["delete_with_instance" ].(* bool )
1392
+ if v , ok := disk ["kms_key_id" ].(* string ); ok && v != nil {
1393
+ kmsKeyId = v
1394
+ } else {
1395
+ kmsKeyId = helper .String ("" )
1396
+ }
1361
1397
encrypt := disk ["encrypt" ].(* bool )
1362
1398
tmpHash := getDataDiskHash (diskHash {
1363
1399
diskType : * diskType ,
1364
1400
diskSize : * diskSize ,
1365
1401
deleteWithInstance : * deleteWithInstance ,
1402
+ kmsKeyId : * kmsKeyId ,
1366
1403
encrypt : * encrypt ,
1367
1404
})
1368
1405
@@ -1376,6 +1413,7 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
1376
1413
dataDisk ["data_disk_type" ] = disk ["data_disk_type" ]
1377
1414
dataDisk ["data_disk_snapshot_id" ] = disk ["data_disk_snapshot_id" ]
1378
1415
dataDisk ["delete_with_instance" ] = disk ["delete_with_instance" ]
1416
+ dataDisk ["kms_key_id" ] = disk ["kms_key_id" ]
1379
1417
dataDisk ["encrypt" ] = disk ["encrypt" ]
1380
1418
dataDisk ["throughput_performance" ] = disk ["throughput_performance" ]
1381
1419
tmpDataDiskMap [hashItem ["index" ].(int )] = dataDisk
@@ -2533,6 +2571,7 @@ type diskHash struct {
2533
2571
diskType string
2534
2572
diskSize int64
2535
2573
deleteWithInstance bool
2574
+ kmsKeyId string
2536
2575
encrypt bool
2537
2576
}
2538
2577
@@ -2541,6 +2580,121 @@ func getDataDiskHash(obj diskHash) string {
2541
2580
h .Write ([]byte (obj .diskType ))
2542
2581
h .Write ([]byte (fmt .Sprintf ("%d" , obj .diskSize )))
2543
2582
h .Write ([]byte (fmt .Sprintf ("%t" , obj .deleteWithInstance )))
2583
+ h .Write ([]byte (obj .kmsKeyId ))
2544
2584
h .Write ([]byte (fmt .Sprintf ("%t" , obj .encrypt )))
2545
2585
return hex .EncodeToString (h .Sum (nil ))
2546
2586
}
2587
+
2588
+ func sortDataDisks (tmpDataDisks []interface {}, dataDiskList []map [string ]interface {}) (sortedList []map [string ]interface {}, err error ) {
2589
+ // import
2590
+ if len (tmpDataDisks ) == 0 {
2591
+ return dataDiskList , nil
2592
+ }
2593
+
2594
+ if len (tmpDataDisks ) != len (dataDiskList ) {
2595
+ err = fmt .Errorf ("Inconsistent number of data disks." )
2596
+ return
2597
+ }
2598
+
2599
+ remainingDisks := make ([]map [string ]interface {}, len (dataDiskList ))
2600
+ copy (remainingDisks , dataDiskList )
2601
+
2602
+ for _ , tmpDisk := range tmpDataDisks {
2603
+ dMap := tmpDisk .(map [string ]interface {})
2604
+ tmpName , _ := dMap ["data_disk_name" ].(string )
2605
+ tmpSizeRaw := dMap ["data_disk_size" ]
2606
+ tmpSize , e := extractInt (tmpSizeRaw )
2607
+ if e != nil {
2608
+ return nil , e
2609
+ }
2610
+
2611
+ tmpType , _ := dMap ["data_disk_type" ].(string )
2612
+ tmpKmsKeyId , _ := dMap ["kms_key_id" ].(string )
2613
+ tmpEncrypt , _ := dMap ["encrypt" ].(bool )
2614
+ tmpDelWithIns , _ := dMap ["delete_with_instance" ].(bool )
2615
+ tmpTpRaw := dMap ["throughput_performance" ]
2616
+ tmpTp , e := extractInt (tmpTpRaw )
2617
+ if e != nil {
2618
+ return nil , e
2619
+ }
2620
+
2621
+ var matchedDisk map [string ]interface {}
2622
+ matchedIndex := - 1
2623
+
2624
+ for i , dataDisk := range remainingDisks {
2625
+ dataName , _ := dataDisk ["data_disk_name" ].(* string )
2626
+ dataSizeRaw := dataDisk ["data_disk_size" ]
2627
+ dataSize , e := extractInt (dataSizeRaw )
2628
+ if e != nil {
2629
+ return nil , e
2630
+ }
2631
+
2632
+ dataType , _ := dataDisk ["data_disk_type" ].(* string )
2633
+ dataKmsKeyId , _ := dataDisk ["kms_key_id" ].(* string )
2634
+ dataEncrypt , _ := dataDisk ["encrypt" ].(* bool )
2635
+ dataDelWithIns , _ := dataDisk ["delete_with_instance" ].(* bool )
2636
+ dataTpRaw := dataDisk ["throughput_performance" ]
2637
+ dataTp , e := extractInt (dataTpRaw )
2638
+ if e != nil {
2639
+ return nil , e
2640
+ }
2641
+
2642
+ match := true
2643
+ if tmpName != "" && * dataName != tmpName {
2644
+ match = false
2645
+ }
2646
+
2647
+ if tmpKmsKeyId != "" && dataKmsKeyId != nil {
2648
+ if tmpKmsKeyId != * dataKmsKeyId {
2649
+ match = false
2650
+ }
2651
+ }
2652
+
2653
+ if dataSize != tmpSize || * dataType != tmpType || * dataEncrypt != tmpEncrypt || * dataDelWithIns != tmpDelWithIns || dataTp != tmpTp {
2654
+ match = false
2655
+ }
2656
+
2657
+ if match {
2658
+ matchedDisk = dataDisk
2659
+ matchedIndex = i
2660
+ break
2661
+ }
2662
+ }
2663
+
2664
+ if matchedIndex == - 1 {
2665
+ err = fmt .Errorf ("Unable to find match: tmpDisk = %v" , tmpDisk )
2666
+ return
2667
+ }
2668
+
2669
+ sortedList = append (sortedList , matchedDisk )
2670
+ remainingDisks = append (remainingDisks [:matchedIndex ], remainingDisks [matchedIndex + 1 :]... )
2671
+ }
2672
+
2673
+ return
2674
+ }
2675
+
2676
+ func extractInt (value interface {}) (int , error ) {
2677
+ if value == nil {
2678
+ return 0 , fmt .Errorf ("value is nil." )
2679
+ }
2680
+
2681
+ if reflect .TypeOf (value ).Kind () == reflect .Ptr {
2682
+ ptrValue := reflect .ValueOf (value ).Elem ().Interface ()
2683
+ return extractInt (ptrValue )
2684
+ }
2685
+
2686
+ switch v := value .(type ) {
2687
+ case int :
2688
+ return v , nil
2689
+ case float64 :
2690
+ return int (v ), nil
2691
+ case uint64 :
2692
+ return int (v ), nil
2693
+ case int32 :
2694
+ return int (v ), nil
2695
+ case int64 :
2696
+ return int (v ), nil
2697
+ default :
2698
+ return 0 , fmt .Errorf ("Unrecognized numerical type: %T." , value )
2699
+ }
2700
+ }
0 commit comments