Skip to content

Commit bc336bc

Browse files
tongyimingmikatong
andauthored
fix cvm data-disk order (#1968)
* fix cvm data-disk order * add changelog * update * update * update * update --------- Co-authored-by: mikatong <mikatong@tencent.com>
1 parent 8351a67 commit bc336bc

File tree

3 files changed

+75
-2
lines changed

3 files changed

+75
-2
lines changed

.changelog/1968.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:bug
2+
resource/tencentcloud_instance: fix data-disks order issue
3+
```

tencentcloud/resource_tc_instance.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,8 @@ import (
139139
"encoding/base64"
140140
"fmt"
141141
"log"
142+
"sort"
143+
"strconv"
142144
"strings"
143145
"time"
144146

@@ -992,6 +994,8 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
992994
//set data_disks
993995
dataDiskList := make([]map[string]interface{}, 0, len(instance.DataDisks))
994996
diskSizeMap := map[string]*uint64{}
997+
diskOrderMap := make(map[string]int)
998+
995999
if len(instance.DataDisks) > 0 {
9961000
var diskIds []*string
9971001
for i := range instance.DataDisks {
@@ -1017,6 +1021,13 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
10171021
return resource.RetryableError(fmt.Errorf("data_disk[%d] is expending", i))
10181022
}
10191023
diskSizeMap[*disk.DiskId] = disk.DiskSize
1024+
items := strings.Split(*disk.DiskName, "_")
1025+
diskOrder := items[len(items)-1]
1026+
diskOrderInt, err := strconv.Atoi(diskOrder)
1027+
if err != nil {
1028+
return resource.NonRetryableError(err)
1029+
}
1030+
diskOrderMap[*disk.DiskId] = diskOrderInt
10201031
}
10211032
return nil
10221033
})
@@ -1039,6 +1050,11 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
10391050
dataDisk["throughput_performance"] = disk.ThroughputPerformance
10401051
dataDiskList = append(dataDiskList, dataDisk)
10411052
}
1053+
sort.SliceStable(dataDiskList, func(idx1, idx2 int) bool {
1054+
dataDiskIdIdx1 := *dataDiskList[idx1]["data_disk_id"].(*string)
1055+
dataDiskIdIdx2 := *dataDiskList[idx2]["data_disk_id"].(*string)
1056+
return diskOrderMap[dataDiskIdIdx1] < diskOrderMap[dataDiskIdIdx2]
1057+
})
10421058
_ = d.Set("data_disks", dataDiskList)
10431059

10441060
if len(instance.PrivateIpAddresses) > 0 {

tencentcloud/resource_tc_instance_test.go

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ func testSweepCvmInstance(region string) error {
6464
func TestAccTencentCloudInstanceResource_Basic(t *testing.T) {
6565
t.Parallel()
6666

67-
id := "tencentcloud_instance.foo"
67+
id := "tencentcloud_instance.cvm_basic"
6868
resource.Test(t, resource.TestCase{
6969
PreCheck: func() { testAccPreCheck(t) },
7070
IDRefreshName: id,
@@ -564,6 +564,31 @@ func TestAccTencentCloudInstanceResource_WithSpotpaid(t *testing.T) {
564564
})
565565
}
566566

567+
func TestAccTencentCloudInstanceResource_DataDiskOrder(t *testing.T) {
568+
t.Parallel()
569+
570+
id := "tencentcloud_instance.foo"
571+
resource.Test(t, resource.TestCase{
572+
PreCheck: func() { testAccPreCheck(t) },
573+
IDRefreshName: id,
574+
Providers: testAccProviders,
575+
CheckDestroy: testAccCheckInstanceDestroy,
576+
Steps: []resource.TestStep{
577+
{
578+
PreConfig: func() { testAccStepPreConfigSetTempAKSK(t, ACCOUNT_TYPE_COMMON) },
579+
Config: testAccTencentCloudInstanceWithDataDiskOrder,
580+
Check: resource.ComposeTestCheckFunc(
581+
testAccCheckTencentCloudDataSourceID(id),
582+
testAccCheckTencentCloudInstanceExists(id),
583+
resource.TestCheckResourceAttr(id, "data_disks.0.data_disk_size", "100"),
584+
resource.TestCheckResourceAttr(id, "data_disks.1.data_disk_size", "50"),
585+
resource.TestCheckResourceAttr(id, "data_disks.2.data_disk_size", "70"),
586+
),
587+
},
588+
},
589+
})
590+
}
591+
567592
func TestAccTencentCloudNeedFixInstancePostpaidToPrepaid(t *testing.T) {
568593

569594
id := "tencentcloud_instance.foo"
@@ -698,6 +723,19 @@ func testAccCheckInstanceDestroy(s *terraform.State) error {
698723
}
699724

700725
const testAccTencentCloudInstanceBasic = defaultInstanceVariable + `
726+
resource "tencentcloud_instance" "cvm_basic" {
727+
instance_name = var.instance_name
728+
availability_zone = var.availability_cvm_zone
729+
image_id = data.tencentcloud_images.default.images.0.image_id
730+
instance_type = data.tencentcloud_instance_types.default.instance_types.0.instance_type
731+
vpc_id = var.cvm_vpc_id
732+
subnet_id = var.cvm_subnet_id
733+
system_disk_type = "CLOUD_PREMIUM"
734+
project_id = 0
735+
}
736+
`
737+
738+
const testAccTencentCloudInstanceWithDataDiskOrder = defaultInstanceVariable + `
701739
resource "tencentcloud_instance" "foo" {
702740
instance_name = var.instance_name
703741
availability_zone = var.availability_cvm_zone
@@ -707,6 +745,22 @@ resource "tencentcloud_instance" "foo" {
707745
subnet_id = var.cvm_subnet_id
708746
system_disk_type = "CLOUD_PREMIUM"
709747
project_id = 0
748+
749+
data_disks {
750+
data_disk_size = 100
751+
data_disk_type = "CLOUD_PREMIUM"
752+
delete_with_instance = true
753+
}
754+
data_disks {
755+
data_disk_size = 50
756+
data_disk_type = "CLOUD_PREMIUM"
757+
delete_with_instance = true
758+
}
759+
data_disks {
760+
data_disk_size = 70
761+
data_disk_type = "CLOUD_PREMIUM"
762+
delete_with_instance = true
763+
}
710764
}
711765
`
712766

@@ -763,7 +817,7 @@ data "tencentcloud_instance_types" "new_type" {
763817
memory_size = 2
764818
}
765819
766-
resource "tencentcloud_instance" "foo" {
820+
resource "tencentcloud_instance" "cvm_basic" {
767821
instance_name = var.instance_name
768822
availability_zone = var.availability_cvm_zone
769823
image_id = data.tencentcloud_images.default.images.0.image_id

0 commit comments

Comments
 (0)