Skip to content

Commit 9fa0d99

Browse files
authored
feat: cvm - support datadisk modify (#867)
* feat: cvm - support datadisk modify * fix: cvm data disk desc
1 parent e5d7656 commit 9fa0d99

File tree

12 files changed

+5628
-407
lines changed

12 files changed

+5628
-407
lines changed

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ require (
3030
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.283
3131
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cloudaudit v1.0.199
3232
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cls v1.0.291
33-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.332
34-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.199
33+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.351
34+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.351
3535
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.199
3636
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dayu v1.0.335
3737
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dc v1.0.199

go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -483,8 +483,12 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.330 h1:yPUo
483483
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.330/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
484484
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.332 h1:sIRdZ4tihXEJEVL6EM0ZiK/ySOUYDMfTI9D0jA6CdPU=
485485
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.332/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
486+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.351 h1:BpVJoxG5kajBS7PYDeoujh4IDXr1sj3KNXn0GsceS2M=
487+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.351/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
486488
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.199 h1:ajgJogYSIQ5u1PIbiV5nsvr5K0fYpm1/T7Dy+mxEM6U=
487489
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.199/go.mod h1:AqyM/ZZMD7q5mHBqNY9YImbSpEpoEe7E/vrTbUWX+po=
490+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.351 h1:zqJsH5pxGT57La7NAOOyMQxsuM11pupNBwV1dzXcT24=
491+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.351/go.mod h1:IZH6xMdFwRrdxy6nEOdxdor+1AwDoOu/GG4PfPajwzM=
488492
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.199 h1:L0twFkJMOZzLkX08w8S14nX6oanD8YxMQDIaYXVim6A=
489493
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.199/go.mod h1:AvfGfE5JXkyMV6uGd6B++SIDp+VV/SSphg1q2RiANFw=
490494
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dayu v1.0.199 h1:CzZEt6l0qDjZUW8D8rUNQ/sKw6z6oYYdWuby3hlsn8g=

tencentcloud/resource_tc_instance.go

Lines changed: 78 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -364,9 +364,9 @@ func resourceTencentCloudInstance() *schema.Resource {
364364
Description: "Data disk type. For more information about limits on different data disk types, see [Storage Overview](https://intl.cloud.tencent.com/document/product/213/4952). Valid values: `LOCAL_BASIC`: local disk, `LOCAL_SSD`: local SSD disk, `CLOUD_PREMIUM`: Premium Cloud Storage, `CLOUD_SSD`: SSD, `CLOUD_HSSD`: Enhanced SSD. NOTE: `CLOUD_BASIC`, `LOCAL_BASIC` and `LOCAL_SSD` are deprecated.",
365365
},
366366
"data_disk_size": {
367-
Type: schema.TypeInt,
368-
Required: true,
369-
ForceNew: true,
367+
Type: schema.TypeInt,
368+
Required: true,
369+
//ForceNew: true,
370370
Description: "Size of the data disk, and unit is GB. If disk type is `CLOUD_SSD`, the size range is [100, 16000], and the others are [10-16000].",
371371
},
372372
"data_disk_snapshot_id": {
@@ -918,11 +918,37 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
918918

919919
//set data_disks
920920
dataDiskList := make([]map[string]interface{}, 0, len(instance.DataDisks))
921+
diskSizeMap := map[string]*uint64{}
922+
if len(instance.DataDisks) > 0 {
923+
var diskIds []*string
924+
cbsService := CbsService{client: meta.(*TencentCloudClient).apiV3Conn}
925+
for i := range instance.DataDisks {
926+
disk := instance.DataDisks[i]
927+
diskIds = append(diskIds, disk.DiskId)
928+
}
929+
err := resource.Retry(readRetryTimeout, func() *resource.RetryError {
930+
disks, err := cbsService.DescribeDiskList(ctx, diskIds)
931+
if err != nil {
932+
return resource.NonRetryableError(err)
933+
}
934+
for i := range disks {
935+
disk := disks[i]
936+
if *disk.DiskState == "EXPANDING" {
937+
return resource.RetryableError(fmt.Errorf("data_disk[%d] is expending", i))
938+
}
939+
diskSizeMap[*disk.DiskId] = disk.DiskSize
940+
}
941+
return nil
942+
})
943+
if err != nil {
944+
return err
945+
}
946+
}
921947
for _, disk := range instance.DataDisks {
922948
dataDisk := make(map[string]interface{}, 5)
923949
dataDisk["data_disk_snapshot_id"] = disk.SnapshotId
924950
dataDisk["data_disk_type"] = disk.DiskType
925-
dataDisk["data_disk_size"] = disk.DiskSize
951+
dataDisk["data_disk_size"] = diskSizeMap[*disk.DiskId]
926952
dataDisk["data_disk_id"] = disk.DiskId
927953
dataDisk["delete_with_instance"] = disk.DeleteWithInstance
928954
dataDisk["encrypt"] = disk.Encrypt
@@ -1232,6 +1258,53 @@ func resourceTencentCloudInstanceUpdate(d *schema.ResourceData, meta interface{}
12321258
d.SetPartial("key_name")
12331259
}
12341260
}
1261+
/* not available now
1262+
if d.HasChange("system_disk_size") {
1263+
size := d.Get("system_disk_size").(int)
1264+
//diskId := d.Get("system_disk_id").(string)
1265+
req := cvm.NewResizeInstanceDisksRequest()
1266+
req.InstanceId = &instanceId
1267+
req.SystemDisk = &cvm.SystemDisk{
1268+
DiskSize: helper.IntInt64(size),
1269+
}
1270+
1271+
err := cvmService.ResizeInstanceDisks(ctx, req)
1272+
if err != nil {
1273+
return fmt.Errorf("error: an error occured when modifying system_disk, reason: %s", err.Error())
1274+
}
1275+
instanceStoppedByDiskResize = true
1276+
d.SetPartial("system_disk_size")
1277+
}*/
1278+
if d.HasChange("data_disks") {
1279+
o, n := d.GetChange("data_disks")
1280+
ov := o.([]interface{})
1281+
nv := n.([]interface{})
1282+
1283+
if len(nv) != len(nv) {
1284+
return fmt.Errorf("error: data disk count has changed (%d -> %d) but doesn't support add or remove for now", len(ov), len(nv))
1285+
}
1286+
1287+
cbsService := CbsService{
1288+
client: meta.(*TencentCloudClient).apiV3Conn,
1289+
}
1290+
1291+
for i := range nv {
1292+
sizeKey := fmt.Sprintf("data_disks.%d.data_disk_size", i)
1293+
idKey := fmt.Sprintf("data_disks.%d.data_disk_id", i)
1294+
if !d.HasChange(sizeKey) {
1295+
continue
1296+
}
1297+
size := d.Get(sizeKey).(int)
1298+
diskId := d.Get(idKey).(string)
1299+
1300+
err := cbsService.ResizeDisk(ctx, diskId, size)
1301+
1302+
if err != nil {
1303+
return fmt.Errorf("an error occured when modifying %s, reason: %s", sizeKey, err.Error())
1304+
}
1305+
d.SetPartial(sizeKey)
1306+
}
1307+
}
12351308

12361309
var flag bool
12371310
if d.HasChange("running_flag") {
@@ -1372,7 +1445,7 @@ func resourceTencentCloudInstanceUpdate(d *schema.ResourceData, meta interface{}
13721445
}
13731446
}
13741447
//tag disk ids
1375-
if dataDisks, ok := d.GetOk("date_disk"); ok {
1448+
if dataDisks, ok := d.GetOk("data_disks"); ok {
13761449
dataDiskList := dataDisks.([]map[string]interface{})
13771450
for _, disk := range dataDiskList {
13781451
dataDiskId := disk["data_disk_id"].(string)

tencentcloud/resource_tc_instance_test.go

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,24 @@ func TestAccTencentCloudInstanceWithDataDisk(t *testing.T) {
115115
resource.TestCheckResourceAttr(id, "data_disks.0.data_disk_snapshot_id", ""),
116116
resource.TestCheckResourceAttr(id, "data_disks.1.data_disk_type", "CLOUD_PREMIUM"),
117117
resource.TestCheckResourceAttr(id, "data_disks.1.data_disk_size", "100"),
118-
resource.TestCheckResourceAttr(id, "data_disks.1.data_disk_snapshot_id", "snap-nvzu3dmh"),
118+
//TODO: snapshot is pre-paid required
119+
//resource.TestCheckResourceAttr(id, "data_disks.1.data_disk_snapshot_id", "snap-nvzu3dmh"),
120+
),
121+
},
122+
{
123+
Config: testAccTencentCloudInstanceWithDataDiskUpdate,
124+
Check: resource.ComposeTestCheckFunc(
125+
testAccCheckTencentCloudDataSourceID(id),
126+
testAccCheckTencentCloudInstanceExists(id),
127+
resource.TestCheckResourceAttr(id, "instance_status", "RUNNING"),
128+
resource.TestCheckResourceAttr(id, "system_disk_size", "50"),
129+
resource.TestCheckResourceAttr(id, "system_disk_type", "CLOUD_PREMIUM"),
130+
resource.TestCheckResourceAttr(id, "data_disks.0.data_disk_type", "CLOUD_PREMIUM"),
131+
resource.TestCheckResourceAttr(id, "data_disks.0.data_disk_size", "150"),
132+
resource.TestCheckResourceAttr(id, "data_disks.0.data_disk_snapshot_id", ""),
133+
resource.TestCheckResourceAttr(id, "data_disks.1.data_disk_type", "CLOUD_PREMIUM"),
134+
resource.TestCheckResourceAttr(id, "data_disks.1.data_disk_size", "150"),
135+
//resource.TestCheckResourceAttr(id, "data_disks.1.data_disk_snapshot_id", "snap-nvzu3dmh"),
119136
),
120137
},
121138
},
@@ -584,7 +601,7 @@ const testAccTencentCloudInstanceWithDataDisk = defaultInstanceVariable + `
584601
resource "tencentcloud_instance" "foo" {
585602
instance_name = var.instance_name
586603
availability_zone = data.tencentcloud_availability_zones.default.zones.0.name
587-
image_id = data.tencentcloud_images.default.images.0.image_id
604+
image_id = data.tencentcloud_images.default.images.1.image_id
588605
instance_type = data.tencentcloud_instance_types.default.instance_types.0.instance_type
589606
590607
system_disk_type = "CLOUD_PREMIUM"
@@ -593,13 +610,41 @@ resource "tencentcloud_instance" "foo" {
593610
data_disk_type = "CLOUD_PREMIUM"
594611
data_disk_size = 100
595612
delete_with_instance = true
596-
encrypt = true
613+
// encrypt = true
597614
}
598615
599616
data_disks {
600617
data_disk_type = "CLOUD_PREMIUM"
601618
data_disk_size = 100
602-
data_disk_snapshot_id = "snap-nvzu3dmh"
619+
# data_disk_snapshot_id = "snap-nvzu3dmh"
620+
delete_with_instance = true
621+
}
622+
623+
disable_security_service = true
624+
disable_monitor_service = true
625+
}
626+
`
627+
628+
const testAccTencentCloudInstanceWithDataDiskUpdate = defaultInstanceVariable + `
629+
resource "tencentcloud_instance" "foo" {
630+
instance_name = var.instance_name
631+
availability_zone = data.tencentcloud_availability_zones.default.zones.0.name
632+
image_id = data.tencentcloud_images.default.images.1.image_id
633+
instance_type = data.tencentcloud_instance_types.default.instance_types.0.instance_type
634+
635+
system_disk_type = "CLOUD_PREMIUM"
636+
637+
data_disks {
638+
data_disk_type = "CLOUD_PREMIUM"
639+
data_disk_size = 150
640+
delete_with_instance = true
641+
// encrypt = true
642+
}
643+
644+
data_disks {
645+
data_disk_type = "CLOUD_PREMIUM"
646+
data_disk_size = 150
647+
# data_disk_snapshot_id = "snap-nvzu3dmh"
603648
delete_with_instance = true
604649
}
605650

tencentcloud/service_tencentcloud_cbs.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,21 @@ type CbsService struct {
1616
}
1717

1818
func (me *CbsService) DescribeDiskById(ctx context.Context, diskId string) (disk *cbs.Disk, errRet error) {
19+
disks, err := me.DescribeDiskList(ctx, []*string{&diskId})
20+
if err != nil {
21+
errRet = err
22+
return
23+
}
24+
if len(disks) > 0 {
25+
disk = disks[0]
26+
}
27+
return
28+
}
29+
30+
func (me *CbsService) DescribeDiskList(ctx context.Context, diskIds []*string) (disk []*cbs.Disk, errRet error) {
1931
logId := getLogId(ctx)
2032
request := cbs.NewDescribeDisksRequest()
21-
request.DiskIds = []*string{&diskId}
33+
request.DiskIds = diskIds
2234
ratelimit.Check(request.GetAction())
2335
response, err := me.client.UseCbsClient().DescribeDisks(request)
2436
if err != nil {
@@ -31,7 +43,7 @@ func (me *CbsService) DescribeDiskById(ctx context.Context, diskId string) (disk
3143
logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
3244

3345
if len(response.Response.DiskSet) > 0 {
34-
disk = response.Response.DiskSet[0]
46+
disk = response.Response.DiskSet
3547
}
3648
return
3749
}

tencentcloud/service_tencentcloud_cvm.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1054,3 +1054,27 @@ func (me *CvmService) ModifyInstanceChargeType(ctx context.Context, instanceId s
10541054

10551055
return nil
10561056
}
1057+
1058+
func (me *CvmService) ResizeInstanceDisks(ctx context.Context, request *cvm.ResizeInstanceDisksRequest) (errRet error) {
1059+
logId := getLogId(ctx)
1060+
1061+
defer func() {
1062+
if errRet != nil {
1063+
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n",
1064+
logId, request.GetAction(), request.ToJsonString(), errRet.Error())
1065+
}
1066+
}()
1067+
1068+
ratelimit.Check(request.GetAction())
1069+
response, err := me.client.UseCvmClient().ResizeInstanceDisks(request)
1070+
1071+
if err != nil {
1072+
errRet = err
1073+
return
1074+
}
1075+
1076+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
1077+
logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
1078+
1079+
return
1080+
}

vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/http/request.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)