diff --git a/go.mod b/go.mod
index 012256169f..ad3b42fcec 100644
--- a/go.mod
+++ b/go.mod
@@ -47,7 +47,7 @@ require (
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cloudaudit v1.0.1033
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cls v1.0.1046
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1060
- github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1014
+ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1053
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp v1.0.762
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.1058
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dayu v1.0.335
diff --git a/go.sum b/go.sum
index a73ebf1f04..c4f0a7a5c1 100644
--- a/go.sum
+++ b/go.sum
@@ -826,8 +826,6 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/apigateway v1.0.763 h1:
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/apigateway v1.0.763/go.mod h1:OlRreot089Ec7bEYMUovUBSuCD/x0D0ONPZ0g3YA5hg=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/apm v1.0.825 h1:yiC2lsZ3nNsZ/6Vm7FKFEkAJ37sqzIfmdL7DY0LouMc=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/apm v1.0.825/go.mod h1:6qtSa8OZKwJOWoOCYWVZd6+T62O96AxbPll0I43d4yw=
-github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/as v1.0.1050 h1:uLV7suHZzLYQ7FzzPotAxHp8U2Cyu79Q9+DjHfGBS1o=
-github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/as v1.0.1050/go.mod h1:z8L5Brgaqaq9DK0p8wzOB+6alOD/qWABzkCFmitewAE=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/as v1.0.1052 h1:d7eK/iFBAL1P75UWcc+wupp2/W1KQHdTxB/YpJTaoUA=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/as v1.0.1052/go.mod h1:o/8YQckpRRJ12COW2g9J9Fx+v5noOAsHkKVQpTctM+g=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/bi v1.0.824 h1:DVKvZ6h+qd7tadUrCjVAkCCmE3TsbK2ZmwGd3AJcpWc=
@@ -919,7 +917,6 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1004/go.mod
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1008/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1010/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1013/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
-github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1014/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1015/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1018/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1031/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
@@ -929,21 +926,22 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1037/go.mod
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1038/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1045/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1046/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
-github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1050/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
-github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1051 h1:3mg0L9vv9eO8UN4Oa7vNawe6yUIuXf9D0Q79rUmnblo=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1051/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
-github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1052 h1:RCs8aH5Gy1sn4qc22KweqQE7usx1S2reyZcedo0ZXBI=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1052/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1056 h1:bOSZ7cOXvBe8MCBqDBTtpyKIqx9q6woxqIPK5M9FhNY=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1056/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1060 h1:0FEYKm73CROpZGfRWqyyhNkk5ndBUDqNNb5SP0BL5jg=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1060/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
+github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1058 h1:VVv5rEFtGbxEB23V3gJO5pFHEXGlOh9duEWEtNm+w6c=
+github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1058/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
+github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1053 h1:Qrwvu384xBXaAl8Vv5qvOKwBNOL73x0iyjQ0MocSidI=
+github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1053/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/controlcenter v1.0.993 h1:WlPgXldQCxt7qi5Xrc6j6zTrsXWzN5BcOGs7Irq7fwQ=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/controlcenter v1.0.993/go.mod h1:Z9U8zNtyuyKhjS0698wqsrG/kLx1TQ5CEixXBwVe7xY=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/csip v1.0.860 h1:F3esKBIT3HW9+7Gt8cVgf8X06VdGIczpgLBUECzSEzU=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/csip v1.0.860/go.mod h1:NZo1WplQcC314kMlCRUoy8NQju2BnolIJj7NAWgsuhY=
-github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1014 h1:9O8b2DIwrJLRncfm6e05lIqkBLKNkvABiF+PNs7exB8=
-github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1014/go.mod h1:BgFyE+WpUJPLy3cHpBaM0gDbrptmzY5+dfid/4UhBR8=
+github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1053 h1:x193cxbzh+bXxxcq9NGzriW0jCxQHJd6mT79kcfUqSs=
+github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1053/go.mod h1:yM5i22uG9HKuUwwz+XvrDW9oBtZdb7avyDrMrS/FBIs=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp v1.0.762 h1:2egy69SP/wPsmnfozcQVZ6tUY6F6N/TpEe/7xtXrc/8=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp v1.0.762/go.mod h1:1XylIfNUbAzmNqi4XMhwcM3VhmUHdu1OYybOeaJ4sOw=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.692 h1:lD44AqXCzkraZiCeMjL7dZmvuyurpyQRKwPHA6Ux5To=
diff --git a/tencentcloud/services/cvm/resource_tc_instance.go b/tencentcloud/services/cvm/resource_tc_instance.go
index 9aad54bb83..e5808bfd56 100644
--- a/tencentcloud/services/cvm/resource_tc_instance.go
+++ b/tencentcloud/services/cvm/resource_tc_instance.go
@@ -2,7 +2,9 @@ package cvm
import (
"context"
+ "crypto/sha256"
"encoding/base64"
+ "encoding/hex"
"fmt"
"log"
"sort"
@@ -17,6 +19,7 @@ import (
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+ cbs "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cbs/v20170312"
sdkErrors "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors"
cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
@@ -244,6 +247,12 @@ func ResourceTencentCloudInstance() *schema.Resource {
Computed: true,
Description: "System disk snapshot ID used to initialize the system disk. When system disk type is `LOCAL_BASIC` and `LOCAL_SSD`, disk id is not supported.",
},
+ "system_disk_name": {
+ Type: schema.TypeString,
+ Optional: true,
+ Computed: true,
+ Description: "Name of the system disk.",
+ },
"system_disk_resize_online": {
Type: schema.TypeBool,
Optional: true,
@@ -264,11 +273,16 @@ func ResourceTencentCloudInstance() *schema.Resource {
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, LOCAL_NVME: local NVME disk, specified in the InstanceType, LOCAL_PRO: local HDD disk, specified in the InstanceType, CLOUD_BASIC: HDD cloud disk, CLOUD_PREMIUM: Premium Cloud Storage, CLOUD_SSD: SSD, CLOUD_HSSD: Enhanced SSD, CLOUD_TSSD: Tremendous SSD, CLOUD_BSSD: Balanced SSD.",
},
"data_disk_size": {
- Type: schema.TypeInt,
- Required: true,
- //ForceNew: true,
+ Type: schema.TypeInt,
+ Required: true,
Description: "Size of the data disk, and unit is GB.",
},
+ "data_disk_name": {
+ Type: schema.TypeString,
+ Optional: true,
+ Computed: true,
+ Description: "Name of data disk.",
+ },
"data_disk_snapshot_id": {
Type: schema.TypeString,
Optional: true,
@@ -613,6 +627,10 @@ func resourceTencentCloudInstanceCreate(d *schema.ResourceData, meta interface{}
request.SystemDisk.DiskId = helper.String(v.(string))
}
+ if v, ok := d.GetOk("system_disk_name"); ok {
+ request.SystemDisk.DiskName = helper.String(v.(string))
+ }
+
if v, ok := d.GetOk("data_disks"); ok {
dataDisks := v.([]interface{})
request.DataDisks = make([]*cvm.DataDisk, 0, len(dataDisks))
@@ -627,6 +645,13 @@ func resourceTencentCloudInstanceCreate(d *schema.ResourceData, meta interface{}
ThroughputPerformance: &throughputPerformance,
}
+ if v, ok := value["data_disk_name"]; ok && v != nil {
+ diskName := v.(string)
+ if diskName != "" {
+ dataDisk.DiskName = helper.String(diskName)
+ }
+ }
+
if v, ok := value["data_disk_snapshot_id"]; ok && v != nil {
snapshotId := v.(string)
if snapshotId != "" {
@@ -957,17 +982,57 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
delete(tags, "tencentcloud:autoscaling:auto-scaling-group-id")
_ = d.Set("tags", tags)
- //set data_disks
- var hasDataDisks, isCombineDataDisks bool
+ // set system_disk_name
+ if instance.SystemDisk.DiskId != nil {
+ err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
+ disks, err := cbsService.DescribeDiskList(ctx, []*string{instance.SystemDisk.DiskId})
+ if err != nil {
+ return resource.NonRetryableError(err)
+ }
+
+ for i := range disks {
+ disk := disks[i]
+ if *disk.DiskState == "EXPANDING" {
+ return resource.RetryableError(fmt.Errorf("data_disk[%d] is expending", i))
+ }
+
+ if *disk.DiskId == *instance.SystemDisk.DiskId {
+ _ = d.Set("system_disk_name", disk.DiskName)
+ }
+ }
+
+ return nil
+ })
+
+ if err != nil {
+ return err
+ }
+ }
+
+ // set data_disks
+ var hasDataDisks, isCombineDataDisks, hasDataDisksName bool
dataDiskList := make([]map[string]interface{}, 0, len(instance.DataDisks))
diskSizeMap := map[string]*uint64{}
diskOrderMap := make(map[string]int)
- if _, ok := d.GetOk("data_disks"); ok {
+ if v, ok := d.GetOk("data_disks"); ok {
hasDataDisks = true
+ // check has data disk name
+ dataDisks := v.([]interface{})
+ for _, item := range dataDisks {
+ value := item.(map[string]interface{})
+ if v, ok := value["data_disk_name"]; ok && v != nil {
+ diskName := v.(string)
+ if diskName != "" {
+ hasDataDisksName = true
+ break
+ }
+ }
+ }
}
- if len(instance.DataDisks) > 0 {
+ // scene with has disks name
+ if len(instance.DataDisks) > 0 && !hasDataDisksName {
var diskIds []*string
for i := range instance.DataDisks {
id := instance.DataDisks[i].DiskId
@@ -1015,48 +1080,275 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
if err != nil {
return err
}
- }
- tmpDataDisks := make([]interface{}, 0, len(instance.DataDisks))
- if v, ok := d.GetOk("data_disks"); ok {
- tmpDataDisks = v.([]interface{})
- }
+ tmpDataDisks := make([]interface{}, 0, len(instance.DataDisks))
+ if v, ok := d.GetOk("data_disks"); ok {
+ tmpDataDisks = v.([]interface{})
+ }
- for index, disk := range instance.DataDisks {
- dataDisk := make(map[string]interface{}, 5)
- dataDisk["data_disk_id"] = disk.DiskId
- if disk.DiskId == nil {
- dataDisk["data_disk_size"] = disk.DiskSize
- } else if size, ok := diskSizeMap[*disk.DiskId]; ok {
- dataDisk["data_disk_size"] = size
+ for _, disk := range instance.DataDisks {
+ dataDisk := make(map[string]interface{}, 5)
+ dataDisk["data_disk_id"] = disk.DiskId
+ if disk.DiskId == nil {
+ dataDisk["data_disk_size"] = disk.DiskSize
+ } else if size, ok := diskSizeMap[*disk.DiskId]; ok {
+ dataDisk["data_disk_size"] = size
+ }
+
+ dataDisk["data_disk_type"] = disk.DiskType
+ dataDisk["data_disk_snapshot_id"] = disk.SnapshotId
+ dataDisk["delete_with_instance"] = disk.DeleteWithInstance
+ dataDisk["encrypt"] = disk.Encrypt
+ dataDisk["throughput_performance"] = disk.ThroughputPerformance
+ dataDiskList = append(dataDiskList, dataDisk)
+ }
+
+ if hasDataDisks && !isCombineDataDisks {
+ sort.SliceStable(dataDiskList, func(idx1, idx2 int) bool {
+ dataDiskIdIdx1 := *dataDiskList[idx1]["data_disk_id"].(*string)
+ dataDiskIdIdx2 := *dataDiskList[idx2]["data_disk_id"].(*string)
+ return diskOrderMap[dataDiskIdIdx1] < diskOrderMap[dataDiskIdIdx2]
+ })
+ }
+
+ // set data disk delete_with_instance_prepaid
+ for i := range dataDiskList {
+ dataDiskList[i]["delete_with_instance_prepaid"] = false
+ if hasDataDisks {
+ tmpDataDisk := tmpDataDisks[i].(map[string]interface{})
+ if deleteWithInstancePrepaidBool, ok := tmpDataDisk["delete_with_instance_prepaid"].(bool); ok {
+ dataDiskList[i]["delete_with_instance_prepaid"] = deleteWithInstancePrepaidBool
+ }
+ }
+ }
+
+ // set data disk name
+ finalDiskIds := make([]*string, 0, len(dataDiskList))
+ for _, item := range dataDiskList {
+ diskId := item["data_disk_id"].(*string)
+ finalDiskIds = append(finalDiskIds, diskId)
}
- dataDisk["delete_with_instance_prepaid"] = false
- if len(tmpDataDisks) == len(instance.DataDisks) {
- tmpDataDisk := tmpDataDisks[index].(map[string]interface{})
- if deleteWithInstancePrepaid, ok := tmpDataDisk["delete_with_instance_prepaid"]; ok {
- deleteWithInstancePrepaidBool := deleteWithInstancePrepaid.(bool)
- dataDisk["delete_with_instance_prepaid"] = deleteWithInstancePrepaidBool
+ if len(finalDiskIds) != 0 {
+ err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
+ disks, err := cbsService.DescribeDiskList(ctx, finalDiskIds)
+ if err != nil {
+ return resource.NonRetryableError(err)
+ }
+
+ for _, disk := range disks {
+ diskId := disk.DiskId
+ for _, v := range dataDiskList {
+ tmpDiskId := v["data_disk_id"].(*string)
+ if *diskId == *tmpDiskId {
+ v["data_disk_name"] = disk.DiskName
+ break
+ }
+ }
+ }
+
+ return nil
+ })
+
+ if err != nil {
+ return err
}
}
- dataDisk["data_disk_type"] = disk.DiskType
- dataDisk["data_disk_snapshot_id"] = disk.SnapshotId
- dataDisk["delete_with_instance"] = disk.DeleteWithInstance
- dataDisk["encrypt"] = disk.Encrypt
- dataDisk["throughput_performance"] = disk.ThroughputPerformance
- dataDiskList = append(dataDiskList, dataDisk)
- }
+ _ = d.Set("data_disks", dataDiskList)
+ } else if len(instance.DataDisks) > 0 && hasDataDisksName {
+ // scene with no disks name
+ dDiskHash := make([]map[string]interface{}, 0)
+ // get source disk hash
+ if v, ok := d.GetOk("data_disks"); ok {
+ dataDisks := v.([]interface{})
+ for index, item := range dataDisks {
+ value := item.(map[string]interface{})
+ tmpMap := make(map[string]interface{})
+ diskName := strconv.Itoa(index)
+ diskType := value["data_disk_type"].(string)
+ diskSize := int64(value["data_disk_size"].(int))
+ deleteWithInstance := value["delete_with_instance"].(bool)
+ encrypt := value["encrypt"].(bool)
+ if tmpV, ok := value["data_disk_name"].(string); ok && tmpV != "" {
+ diskName = tmpV
+ }
+
+ diskObj := diskHash{
+ diskType: diskType,
+ diskSize: diskSize,
+ deleteWithInstance: deleteWithInstance,
+ encrypt: encrypt,
+ }
- if hasDataDisks && !isCombineDataDisks {
- sort.SliceStable(dataDiskList, func(idx1, idx2 int) bool {
- dataDiskIdIdx1 := *dataDiskList[idx1]["data_disk_id"].(*string)
- dataDiskIdIdx2 := *dataDiskList[idx2]["data_disk_id"].(*string)
- return diskOrderMap[dataDiskIdIdx1] < diskOrderMap[dataDiskIdIdx2]
+ // set hash
+ tmpMap[diskName] = getDataDiskHash(diskObj)
+ tmpMap["index"] = index
+ tmpMap["flag"] = 0
+ dDiskHash = append(dDiskHash, tmpMap)
+ }
+ }
+
+ tmpDataDiskMap := make(map[int]interface{}, 0)
+ var diskIds []*string
+ var cbsDisks []*cbs.Disk
+ for i := range instance.DataDisks {
+ id := instance.DataDisks[i].DiskId
+ if id == nil {
+ continue
+ }
+
+ if strings.HasPrefix(*id, "disk-") {
+ diskIds = append(diskIds, id)
+ }
+ }
+
+ err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
+ cbsDisks, err = cbsService.DescribeDiskList(ctx, diskIds)
+ if err != nil {
+ return resource.NonRetryableError(err)
+ }
+
+ for i := range cbsDisks {
+ disk := cbsDisks[i]
+ if *disk.DiskState == "EXPANDING" {
+ return resource.RetryableError(fmt.Errorf("data_disk[%d] is expending", i))
+ }
+ }
+
+ return nil
})
- }
- _ = d.Set("data_disks", dataDiskList)
+ if err != nil {
+ return err
+ }
+
+ // make data disks data
+ sourceDataDisks := make([]*map[string]interface{}, 0)
+ for _, cvmDisk := range instance.DataDisks {
+ for _, cbsDisk := range cbsDisks {
+ if *cvmDisk.DiskId == *cbsDisk.DiskId {
+ dataDisk := make(map[string]interface{}, 10)
+ dataDisk["data_disk_id"] = cvmDisk.DiskId
+ dataDisk["data_disk_size"] = cvmDisk.DiskSize
+ dataDisk["data_disk_name"] = cbsDisk.DiskName
+ dataDisk["data_disk_type"] = cvmDisk.DiskType
+ dataDisk["data_disk_snapshot_id"] = cvmDisk.SnapshotId
+ dataDisk["delete_with_instance"] = cvmDisk.DeleteWithInstance
+ dataDisk["encrypt"] = cvmDisk.Encrypt
+ dataDisk["throughput_performance"] = cvmDisk.ThroughputPerformance
+ dataDisk["flag"] = 0
+ sourceDataDisks = append(sourceDataDisks, &dataDisk)
+ break
+ }
+ }
+ }
+
+ // has set disk name first
+ for v := range sourceDataDisks {
+ for i := range dDiskHash {
+ disk := *sourceDataDisks[v]
+ diskFlag := disk["flag"].(int)
+ diskName := disk["data_disk_name"].(*string)
+ diskType := disk["data_disk_type"].(*string)
+ diskSize := disk["data_disk_size"].(*int64)
+ deleteWithInstance := disk["delete_with_instance"].(*bool)
+ encrypt := disk["encrypt"].(*bool)
+ tmpHash := getDataDiskHash(diskHash{
+ diskType: *diskType,
+ diskSize: *diskSize,
+ deleteWithInstance: *deleteWithInstance,
+ encrypt: *encrypt,
+ })
+
+ // get disk name
+ hashItem := dDiskHash[i]
+ if _, ok := hashItem[*diskName]; ok {
+ // check hash and flag
+ if hashItem["flag"] == 0 && diskFlag == 0 && tmpHash == hashItem[*diskName] {
+ dataDisk := make(map[string]interface{}, 8)
+ dataDisk["data_disk_id"] = disk["data_disk_id"]
+ dataDisk["data_disk_size"] = disk["data_disk_size"]
+ dataDisk["data_disk_name"] = disk["data_disk_name"]
+ dataDisk["data_disk_type"] = disk["data_disk_type"]
+ dataDisk["data_disk_snapshot_id"] = disk["data_disk_snapshot_id"]
+ dataDisk["delete_with_instance"] = disk["delete_with_instance"]
+ dataDisk["encrypt"] = disk["encrypt"]
+ dataDisk["throughput_performance"] = disk["throughput_performance"]
+ tmpDataDiskMap[hashItem["index"].(int)] = dataDisk
+ hashItem["flag"] = 1
+ disk["flag"] = 1
+ break
+ }
+ }
+ }
+ }
+
+ // no set disk name last
+ for v := range sourceDataDisks {
+ for i := range dDiskHash {
+ disk := *sourceDataDisks[v]
+ diskFlag := disk["flag"].(int)
+ diskType := disk["data_disk_type"].(*string)
+ diskSize := disk["data_disk_size"].(*int64)
+ deleteWithInstance := disk["delete_with_instance"].(*bool)
+ encrypt := disk["encrypt"].(*bool)
+ tmpHash := getDataDiskHash(diskHash{
+ diskType: *diskType,
+ diskSize: *diskSize,
+ deleteWithInstance: *deleteWithInstance,
+ encrypt: *encrypt,
+ })
+
+ // check hash and flag
+ hashItem := dDiskHash[i]
+ if hashItem["flag"] == 0 && diskFlag == 0 && tmpHash == hashItem[strconv.Itoa(i)] {
+ dataDisk := make(map[string]interface{}, 8)
+ dataDisk["data_disk_id"] = disk["data_disk_id"]
+ dataDisk["data_disk_size"] = disk["data_disk_size"]
+ dataDisk["data_disk_name"] = disk["data_disk_name"]
+ dataDisk["data_disk_type"] = disk["data_disk_type"]
+ dataDisk["data_disk_snapshot_id"] = disk["data_disk_snapshot_id"]
+ dataDisk["delete_with_instance"] = disk["delete_with_instance"]
+ dataDisk["encrypt"] = disk["encrypt"]
+ dataDisk["throughput_performance"] = disk["throughput_performance"]
+ tmpDataDiskMap[hashItem["index"].(int)] = dataDisk
+ hashItem["flag"] = 1
+ disk["flag"] = 1
+ break
+ }
+ }
+ }
+
+ keys := make([]int, 0, len(tmpDataDiskMap))
+ for k := range tmpDataDiskMap {
+ keys = append(keys, k)
+ }
+
+ sort.Ints(keys)
+ for _, v := range keys {
+ tmpDataDisk := tmpDataDiskMap[v].(map[string]interface{})
+ dataDiskList = append(dataDiskList, tmpDataDisk)
+ }
+
+ // set data disk delete_with_instance_prepaid
+ if v, ok := d.GetOk("data_disks"); ok {
+ tmpDataDisks := v.([]interface{})
+ for i := range tmpDataDisks {
+ dataDiskList[i]["delete_with_instance_prepaid"] = false
+ if hasDataDisks {
+ tmpDataDisk := tmpDataDisks[i].(map[string]interface{})
+ if deleteWithInstancePrepaidBool, ok := tmpDataDisk["delete_with_instance_prepaid"].(bool); ok {
+ dataDiskList[i]["delete_with_instance_prepaid"] = deleteWithInstancePrepaidBool
+ }
+ }
+ }
+ }
+
+ _ = d.Set("data_disks", dataDiskList)
+ } else {
+ _ = d.Set("data_disks", dataDiskList)
+ }
if len(instance.PrivateIpAddresses) > 0 {
_ = d.Set("private_ip", instance.PrivateIpAddresses[0])
@@ -1402,15 +1694,22 @@ func resourceTencentCloudInstanceUpdate(d *schema.ResourceData, meta interface{}
for i := range nv {
sizeKey := fmt.Sprintf("data_disks.%d.data_disk_size", i)
idKey := fmt.Sprintf("data_disks.%d.data_disk_id", i)
- if !d.HasChange(sizeKey) {
- continue
+ nameKey := fmt.Sprintf("data_disks.%d.data_disk_name", i)
+ if d.HasChange(sizeKey) {
+ size := d.Get(sizeKey).(int)
+ diskId := d.Get(idKey).(string)
+ err := cbsService.ResizeDisk(ctx, diskId, size)
+ if err != nil {
+ return fmt.Errorf("an error occurred when modifying data disk size: %s, reason: %s", sizeKey, err.Error())
+ }
}
-
- size := d.Get(sizeKey).(int)
- diskId := d.Get(idKey).(string)
- err := cbsService.ResizeDisk(ctx, diskId, size)
- if err != nil {
- return fmt.Errorf("an error occurred when modifying %s, reason: %s", sizeKey, err.Error())
+ if d.HasChange(nameKey) {
+ name := d.Get(nameKey).(string)
+ diskId := d.Get(idKey).(string)
+ err := cbsService.ModifyDiskAttributes(ctx, diskId, name, -1)
+ if err != nil {
+ return fmt.Errorf("an error occurred when modifying data disk name: %s, reason: %s", name, err.Error())
+ }
}
}
}
@@ -1474,6 +1773,20 @@ func resourceTencentCloudInstanceUpdate(d *schema.ResourceData, meta interface{}
}
}
+ if d.HasChange("system_disk_name") {
+ systemDiskName := d.Get("system_disk_name").(string)
+ if v, ok := d.GetOk("system_disk_id"); ok {
+ systemDiskId := v.(string)
+ cbsService := svccbs.NewCbsService(meta.(tccommon.ProviderMeta).GetAPIV3Conn())
+ err := cbsService.ModifyDiskAttributes(ctx, systemDiskId, systemDiskName, -1)
+ if err != nil {
+ return fmt.Errorf("an error occurred when modifying system disk name %s, reason: %s", systemDiskName, err.Error())
+ }
+ } else {
+ return fmt.Errorf("system disk name do not support change because of no system disk ID.")
+ }
+ }
+
if d.HasChange("instance_type") {
err := cvmService.ModifyInstanceType(ctx, instanceId, d.Get("instance_type").(string))
if err != nil {
@@ -2089,3 +2402,19 @@ func waitIpRelease(ctx context.Context, vpcService vpc.VpcService, instance *cvm
return nil
}
+
+type diskHash struct {
+ diskType string
+ diskSize int64
+ deleteWithInstance bool
+ encrypt bool
+}
+
+func getDataDiskHash(obj diskHash) string {
+ h := sha256.New()
+ h.Write([]byte(obj.diskType))
+ h.Write([]byte(fmt.Sprintf("%d", obj.diskSize)))
+ h.Write([]byte(fmt.Sprintf("%t", obj.deleteWithInstance)))
+ h.Write([]byte(fmt.Sprintf("%t", obj.encrypt)))
+ return hex.EncodeToString(h.Sum(nil))
+}
diff --git a/tencentcloud/services/cvm/resource_tc_instance_test.go b/tencentcloud/services/cvm/resource_tc_instance_test.go
index b0c470ee66..7d173298e0 100644
--- a/tencentcloud/services/cvm/resource_tc_instance_test.go
+++ b/tencentcloud/services/cvm/resource_tc_instance_test.go
@@ -527,16 +527,19 @@ resource "tencentcloud_instance" "foo" {
image_id = data.tencentcloud_images.default.images.0.image_id
instance_type = data.tencentcloud_instance_types.default.instance_types.0.instance_type
system_disk_size = 100
+ system_disk_name = "sys_cbs_test1"
data_disks {
delete_with_instance = true
data_disk_type = "CLOUD_PREMIUM"
data_disk_size = 100
+ data_disk_name = "data_cbs_test1"
}
data_disks {
data_disk_type = "CLOUD_PREMIUM"
data_disk_size = 100
delete_with_instance = true
+ data_disk_name = "data_cbs_test2"
}
disable_security_service = true
disable_automation_service = true
@@ -580,16 +583,19 @@ resource "tencentcloud_instance" "foo" {
image_id = data.tencentcloud_images.default.images.0.image_id
instance_type = data.tencentcloud_instance_types.default.instance_types.0.instance_type
system_disk_size = 100
+ system_disk_name = "sys_cbs_test1"
data_disks {
data_disk_size = 150
delete_with_instance = true
data_disk_type = "CLOUD_PREMIUM"
+ data_disk_name = "data_cbs_test1_update"
}
data_disks {
data_disk_size = 150
delete_with_instance = true
data_disk_type = "CLOUD_PREMIUM"
+ data_disk_name = "data_cbs_test2_update"
}
disable_security_service = true
disable_automation_service = true
diff --git a/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/http/request.go b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/http/request.go
index 2fc015850f..0dac4447fe 100644
--- a/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/http/request.go
+++ b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/http/request.go
@@ -3,7 +3,6 @@ package common
import (
"context"
"io"
-
//"log"
"math/rand"
"net/url"
diff --git a/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312/client.go b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312/client.go
index fabd1188c4..cf1f32cd2a 100644
--- a/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312/client.go
+++ b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312/client.go
@@ -3858,6 +3858,7 @@ func NewDescribeTaskInfoResponse() (response *DescribeTaskInfoResponse) {
// 可能返回的错误码:
// INTERNALERROR = "InternalError"
// INVALIDPARAMETERVALUE = "InvalidParameterValue"
+// UNAUTHORIZEDOPERATION = "UnauthorizedOperation"
func (c *Client) DescribeTaskInfo(request *DescribeTaskInfoRequest) (response *DescribeTaskInfoResponse, err error) {
return c.DescribeTaskInfoWithContext(context.Background(), request)
}
@@ -3874,6 +3875,7 @@ func (c *Client) DescribeTaskInfo(request *DescribeTaskInfoRequest) (response *D
// 可能返回的错误码:
// INTERNALERROR = "InternalError"
// INVALIDPARAMETERVALUE = "InvalidParameterValue"
+// UNAUTHORIZEDOPERATION = "UnauthorizedOperation"
func (c *Client) DescribeTaskInfoWithContext(ctx context.Context, request *DescribeTaskInfoRequest) (response *DescribeTaskInfoResponse, err error) {
if request == nil {
request = NewDescribeTaskInfoRequest()
@@ -4493,7 +4495,7 @@ func NewImportImageResponse() (response *ImportImageResponse) {
}
// ImportImage
-// 本接口(ImportImage)用于导入镜像,导入后的镜像可用于创建实例。目前支持 RAW、VHD、QCOW2、VMDK 镜像格式。
+// 本接口(ImportImage)用于导入镜像,导入后的镜像可用于创建实例。目前支持RAW、VHD、QCOW2、VMDK镜像格式。
//
// 可能返回的错误码:
// IMAGEQUOTALIMITEXCEEDED = "ImageQuotaLimitExceeded"
@@ -4501,8 +4503,10 @@ func NewImportImageResponse() (response *ImportImageResponse) {
// INVALIDIMAGEOSTYPE_UNSUPPORTED = "InvalidImageOsType.Unsupported"
// INVALIDIMAGEOSVERSION_UNSUPPORTED = "InvalidImageOsVersion.Unsupported"
// INVALIDPARAMETER_INVALIDPARAMETERURLERROR = "InvalidParameter.InvalidParameterUrlError"
+// INVALIDPARAMETERVALUE_ISOMUSTIMPORTBYFORCE = "InvalidParameterValue.ISOMustImportByForce"
// INVALIDPARAMETERVALUE_INVALIDAPPIDFORMAT = "InvalidParameterValue.InvalidAppIdFormat"
// INVALIDPARAMETERVALUE_INVALIDBOOTMODE = "InvalidParameterValue.InvalidBootMode"
+// INVALIDPARAMETERVALUE_INVALIDIMAGEFAMILY = "InvalidParameterValue.InvalidImageFamily"
// INVALIDPARAMETERVALUE_INVALIDLICENSETYPE = "InvalidParameterValue.InvalidLicenseType"
// INVALIDPARAMETERVALUE_TAGKEYNOTFOUND = "InvalidParameterValue.TagKeyNotFound"
// INVALIDPARAMETERVALUE_TOOLARGE = "InvalidParameterValue.TooLarge"
@@ -4513,7 +4517,7 @@ func (c *Client) ImportImage(request *ImportImageRequest) (response *ImportImage
}
// ImportImage
-// 本接口(ImportImage)用于导入镜像,导入后的镜像可用于创建实例。目前支持 RAW、VHD、QCOW2、VMDK 镜像格式。
+// 本接口(ImportImage)用于导入镜像,导入后的镜像可用于创建实例。目前支持RAW、VHD、QCOW2、VMDK镜像格式。
//
// 可能返回的错误码:
// IMAGEQUOTALIMITEXCEEDED = "ImageQuotaLimitExceeded"
@@ -4521,8 +4525,10 @@ func (c *Client) ImportImage(request *ImportImageRequest) (response *ImportImage
// INVALIDIMAGEOSTYPE_UNSUPPORTED = "InvalidImageOsType.Unsupported"
// INVALIDIMAGEOSVERSION_UNSUPPORTED = "InvalidImageOsVersion.Unsupported"
// INVALIDPARAMETER_INVALIDPARAMETERURLERROR = "InvalidParameter.InvalidParameterUrlError"
+// INVALIDPARAMETERVALUE_ISOMUSTIMPORTBYFORCE = "InvalidParameterValue.ISOMustImportByForce"
// INVALIDPARAMETERVALUE_INVALIDAPPIDFORMAT = "InvalidParameterValue.InvalidAppIdFormat"
// INVALIDPARAMETERVALUE_INVALIDBOOTMODE = "InvalidParameterValue.InvalidBootMode"
+// INVALIDPARAMETERVALUE_INVALIDIMAGEFAMILY = "InvalidParameterValue.InvalidImageFamily"
// INVALIDPARAMETERVALUE_INVALIDLICENSETYPE = "InvalidParameterValue.InvalidLicenseType"
// INVALIDPARAMETERVALUE_TAGKEYNOTFOUND = "InvalidParameterValue.TagKeyNotFound"
// INVALIDPARAMETERVALUE_TOOLARGE = "InvalidParameterValue.TooLarge"
@@ -5262,6 +5268,10 @@ func NewInquiryPriceResetInstancesTypeResponse() (response *InquiryPriceResetIns
// INVALIDINSTANCEID_NOTFOUND = "InvalidInstanceId.NotFound"
// INVALIDINSTANCETYPE_MALFORMED = "InvalidInstanceType.Malformed"
// INVALIDPARAMETER = "InvalidParameter"
+// INVALIDPARAMETER_HOSTIDCUSTOMIZEDINSTANCETYPENOTSUPPORT = "InvalidParameter.HostIdCustomizedInstanceTypeNotSupport"
+// INVALIDPARAMETER_HOSTIDINSTANCETYPENOTSUPPORT = "InvalidParameter.HostIdInstanceTypeNotSupport"
+// INVALIDPARAMETER_HOSTIDSTANDARDINSTANCETYPENOTSUPPORT = "InvalidParameter.HostIdStandardInstanceTypeNotSupport"
+// INVALIDPARAMETER_INSTANCETYPESUPPORTEDHOSTNOTFOUND = "InvalidParameter.InstanceTypeSupportedHostNotFound"
// INVALIDPARAMETERVALUE = "InvalidParameterValue"
// INVALIDPARAMETERVALUE_BASICNETWORKINSTANCEFAMILY = "InvalidParameterValue.BasicNetworkInstanceFamily"
// INVALIDPARAMETERVALUE_GPUINSTANCEFAMILY = "InvalidParameterValue.GPUInstanceFamily"
@@ -5315,6 +5325,10 @@ func (c *Client) InquiryPriceResetInstancesType(request *InquiryPriceResetInstan
// INVALIDINSTANCEID_NOTFOUND = "InvalidInstanceId.NotFound"
// INVALIDINSTANCETYPE_MALFORMED = "InvalidInstanceType.Malformed"
// INVALIDPARAMETER = "InvalidParameter"
+// INVALIDPARAMETER_HOSTIDCUSTOMIZEDINSTANCETYPENOTSUPPORT = "InvalidParameter.HostIdCustomizedInstanceTypeNotSupport"
+// INVALIDPARAMETER_HOSTIDINSTANCETYPENOTSUPPORT = "InvalidParameter.HostIdInstanceTypeNotSupport"
+// INVALIDPARAMETER_HOSTIDSTANDARDINSTANCETYPENOTSUPPORT = "InvalidParameter.HostIdStandardInstanceTypeNotSupport"
+// INVALIDPARAMETER_INSTANCETYPESUPPORTEDHOSTNOTFOUND = "InvalidParameter.InstanceTypeSupportedHostNotFound"
// INVALIDPARAMETERVALUE = "InvalidParameterValue"
// INVALIDPARAMETERVALUE_BASICNETWORKINSTANCEFAMILY = "InvalidParameterValue.BasicNetworkInstanceFamily"
// INVALIDPARAMETERVALUE_GPUINSTANCEFAMILY = "InvalidParameterValue.GPUInstanceFamily"
@@ -7676,6 +7690,7 @@ func NewRepairTaskControlResponse() (response *RepairTaskControlResponse) {
// 可能返回的错误码:
// INTERNALERROR = "InternalError"
// INVALIDPARAMETER = "InvalidParameter"
+// UNAUTHORIZEDOPERATION = "UnauthorizedOperation"
func (c *Client) RepairTaskControl(request *RepairTaskControlRequest) (response *RepairTaskControlResponse, err error) {
return c.RepairTaskControlWithContext(context.Background(), request)
}
@@ -7696,6 +7711,7 @@ func (c *Client) RepairTaskControl(request *RepairTaskControlRequest) (response
// 可能返回的错误码:
// INTERNALERROR = "InternalError"
// INVALIDPARAMETER = "InvalidParameter"
+// UNAUTHORIZEDOPERATION = "UnauthorizedOperation"
func (c *Client) RepairTaskControlWithContext(ctx context.Context, request *RepairTaskControlRequest) (response *RepairTaskControlResponse, err error) {
if request == nil {
request = NewRepairTaskControlRequest()
@@ -9219,6 +9235,7 @@ func NewSyncImagesResponse() (response *SyncImagesResponse) {
// INVALIDIMAGEID_TOOLARGE = "InvalidImageId.TooLarge"
// INVALIDIMAGENAME_DUPLICATE = "InvalidImageName.Duplicate"
// INVALIDPARAMETER_INSTANCEIMAGENOTSUPPORT = "InvalidParameter.InstanceImageNotSupport"
+// INVALIDPARAMETER_INVALIDKMSKEYID = "InvalidParameter.InvalidKmsKeyId"
// INVALIDPARAMETERVALUE_INVALIDIMAGEID = "InvalidParameterValue.InvalidImageId"
// INVALIDPARAMETERVALUE_INVALIDIMAGESTATE = "InvalidParameterValue.InvalidImageState"
// INVALIDPARAMETERVALUE_INVALIDREGION = "InvalidParameterValue.InvalidRegion"
@@ -9228,6 +9245,7 @@ func NewSyncImagesResponse() (response *SyncImagesResponse) {
// UNSUPPORTEDOPERATION_ENCRYPTEDIMAGESNOTSUPPORTED = "UnsupportedOperation.EncryptedImagesNotSupported"
// UNSUPPORTEDOPERATION_LOCATIONIMAGENOTSUPPORTED = "UnsupportedOperation.LocationImageNotSupported"
// UNSUPPORTEDOPERATION_REGION = "UnsupportedOperation.Region"
+// UNSUPPORTEDOPERATION_SYNCENCRYPTIMAGENOTSUPPORT = "UnsupportedOperation.SyncEncryptImageNotSupport"
func (c *Client) SyncImages(request *SyncImagesRequest) (response *SyncImagesResponse, err error) {
return c.SyncImagesWithContext(context.Background(), request)
}
@@ -9252,6 +9270,7 @@ func (c *Client) SyncImages(request *SyncImagesRequest) (response *SyncImagesRes
// INVALIDIMAGEID_TOOLARGE = "InvalidImageId.TooLarge"
// INVALIDIMAGENAME_DUPLICATE = "InvalidImageName.Duplicate"
// INVALIDPARAMETER_INSTANCEIMAGENOTSUPPORT = "InvalidParameter.InstanceImageNotSupport"
+// INVALIDPARAMETER_INVALIDKMSKEYID = "InvalidParameter.InvalidKmsKeyId"
// INVALIDPARAMETERVALUE_INVALIDIMAGEID = "InvalidParameterValue.InvalidImageId"
// INVALIDPARAMETERVALUE_INVALIDIMAGESTATE = "InvalidParameterValue.InvalidImageState"
// INVALIDPARAMETERVALUE_INVALIDREGION = "InvalidParameterValue.InvalidRegion"
@@ -9261,6 +9280,7 @@ func (c *Client) SyncImages(request *SyncImagesRequest) (response *SyncImagesRes
// UNSUPPORTEDOPERATION_ENCRYPTEDIMAGESNOTSUPPORTED = "UnsupportedOperation.EncryptedImagesNotSupported"
// UNSUPPORTEDOPERATION_LOCATIONIMAGENOTSUPPORTED = "UnsupportedOperation.LocationImageNotSupported"
// UNSUPPORTEDOPERATION_REGION = "UnsupportedOperation.Region"
+// UNSUPPORTEDOPERATION_SYNCENCRYPTIMAGENOTSUPPORT = "UnsupportedOperation.SyncEncryptImageNotSupport"
func (c *Client) SyncImagesWithContext(ctx context.Context, request *SyncImagesRequest) (response *SyncImagesResponse, err error) {
if request == nil {
request = NewSyncImagesRequest()
diff --git a/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312/errors.go b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312/errors.go
index 3b3945cc37..f72310e303 100644
--- a/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312/errors.go
+++ b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312/errors.go
@@ -284,6 +284,9 @@ const (
// 指定的私有网络ip格式不正确。
INVALIDPARAMETER_INVALIDIPFORMAT = "InvalidParameter.InvalidIpFormat"
+ // 指定的 KMS 密钥 ID 非法。
+ INVALIDPARAMETER_INVALIDKMSKEYID = "InvalidParameter.InvalidKmsKeyId"
+
// 不能同时指定ImageIds和Filters。
INVALIDPARAMETER_INVALIDPARAMETERCOEXISTIMAGEIDSFILTERS = "InvalidParameter.InvalidParameterCoexistImageIdsFilters"
@@ -404,6 +407,9 @@ const (
// ipv6地址无效
INVALIDPARAMETERVALUE_IPV6ADDRESSMALFORMED = "InvalidParameterValue.IPv6AddressMalformed"
+ // ISO文件必须强制导入
+ INVALIDPARAMETERVALUE_ISOMUSTIMPORTBYFORCE = "InvalidParameterValue.ISOMustImportByForce"
+
// HostName参数值不合法
INVALIDPARAMETERVALUE_ILLEGALHOSTNAME = "InvalidParameterValue.IllegalHostName"
@@ -1115,6 +1121,9 @@ const (
// 不支持关机不收费机器做同类型变配操作。
UNSUPPORTEDOPERATION_STOPPEDMODESTOPCHARGINGSAMEFAMILY = "UnsupportedOperation.StoppedModeStopChargingSameFamily"
+ // 指定的镜像不支持转为加密自定义镜像。
+ UNSUPPORTEDOPERATION_SYNCENCRYPTIMAGENOTSUPPORT = "UnsupportedOperation.SyncEncryptImageNotSupport"
+
// 请求不支持该类型系统盘。
UNSUPPORTEDOPERATION_SYSTEMDISKTYPE = "UnsupportedOperation.SystemDiskType"
diff --git a/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312/models.go b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312/models.go
index 3303667c5f..0e393dd9d1 100644
--- a/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312/models.go
+++ b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312/models.go
@@ -57,6 +57,19 @@ type ActionTimer struct {
// 扩展数据
// 注意:此字段可能返回 null,表示取不到有效值。
Externals *Externals `json:"Externals,omitnil,omitempty" name:"Externals"`
+
+ // 定时器ID。
+ ActionTimerId *string `json:"ActionTimerId,omitnil,omitempty" name:"ActionTimerId"`
+
+ // 定时器状态,取值范围:
+ //
+ // UNDO:未触发
+ // DOING:触发中
+ // DONE:已经触发
+ Status *string `json:"Status,omitnil,omitempty" name:"Status"`
+
+ // 定时器对应的实例ID。
+ InstanceId *string `json:"InstanceId,omitnil,omitempty" name:"InstanceId"`
}
// Predefined struct for user
@@ -160,26 +173,26 @@ func (r *AllocateHostsResponse) FromJsonString(s string) error {
// Predefined struct for user
type AssociateInstancesKeyPairsRequestParams struct {
- // 一个或多个待操作的实例ID,每次请求批量实例的上限为100。
可以通过以下方式获取可用的实例ID:
按照【可用区】进行过滤。可用区形如:ap-guangzhou-1。
类型:String
必选:否
可选项:可用区列表
//按照【项目ID】进行过滤,可通过调用[DescribeProject](https://cloud.tencent.com/document/api/378/4400)查询已创建的项目列表或登录[控制台](https://console.cloud.tencent.com/cvm/index)进行查看;也可以调用[AddProject](https://cloud.tencent.com/document/api/378/4398)创建新的项目。项目ID形如:1002189。
类型:Integer
必选:否
+ //按照【项目ID】进行过滤,可通过调用[DescribeProject](https://cloud.tencent.com/document/api/651/78725)查询已创建的项目列表或登录[控制台](https://console.cloud.tencent.com/cvm/index)进行查看;也可以调用[AddProject](https://cloud.tencent.com/document/api/651/81952)创建新的项目。项目ID形如:1002189。
类型:Integer
必选:否
//按照【[CDH](https://cloud.tencent.com/document/product/416) ID】进行过滤。[CDH](https://cloud.tencent.com/document/product/416) ID形如:host-xxxxxxxx。
类型:String
必选:否
//按照【CDH实例名称】进行过滤。
类型:String
必选:否
//按照【CDH实例状态】进行过滤。(PENDING:创建中 | LAUNCH_FAILURE:创建失败 | RUNNING:运行中 | EXPIRED:已过期)
类型:String
必选:否
+ //按照【CDH机型】进行过滤。
类型:String
必选:否
+ //按照【标签键】进行过滤。
类型:String
必选:否
按照【标签值】进行过滤。
类型:String
必选:否
按照【标签键值对】进行过滤。tag-key使用具体的标签键进行替换。使用请参考示例。
// 每次请求的`Filters`的上限为10,`Filter.Values`的上限为5。 Filters []*Filter `json:"Filters,omitnil,omitempty" name:"Filters"` @@ -2415,13 +2406,16 @@ type DescribeHostsRequest struct { //按照【可用区】进行过滤。可用区形如:ap-guangzhou-1。
类型:String
必选:否
可选项:可用区列表
//按照【项目ID】进行过滤,可通过调用[DescribeProject](https://cloud.tencent.com/document/api/378/4400)查询已创建的项目列表或登录[控制台](https://console.cloud.tencent.com/cvm/index)进行查看;也可以调用[AddProject](https://cloud.tencent.com/document/api/378/4398)创建新的项目。项目ID形如:1002189。
类型:Integer
必选:否
+ //按照【项目ID】进行过滤,可通过调用[DescribeProject](https://cloud.tencent.com/document/api/651/78725)查询已创建的项目列表或登录[控制台](https://console.cloud.tencent.com/cvm/index)进行查看;也可以调用[AddProject](https://cloud.tencent.com/document/api/651/81952)创建新的项目。项目ID形如:1002189。
类型:Integer
必选:否
//按照【[CDH](https://cloud.tencent.com/document/product/416) ID】进行过滤。[CDH](https://cloud.tencent.com/document/product/416) ID形如:host-xxxxxxxx。
类型:String
必选:否
//按照【CDH实例名称】进行过滤。
类型:String
必选:否
//按照【CDH实例状态】进行过滤。(PENDING:创建中 | LAUNCH_FAILURE:创建失败 | RUNNING:运行中 | EXPIRED:已过期)
类型:String
必选:否
+ //按照【CDH机型】进行过滤。
类型:String
必选:否
+ //按照【标签键】进行过滤。
类型:String
必选:否
按照【标签值】进行过滤。
类型:String
必选:否
按照【标签键值对】进行过滤。tag-key使用具体的标签键进行替换。使用请参考示例。
// 每次请求的`Filters`的上限为10,`Filter.Values`的上限为5。 Filters []*Filter `json:"Filters,omitnil,omitempty" name:"Filters"` @@ -3172,7 +3166,7 @@ type DescribeInstancesActionTimerRequestParams struct { // 按照一个或者多个实例ID查询。 InstanceIds []*string `json:"InstanceIds,omitnil,omitempty" name:"InstanceIds"` - // 定时任务执行时间,格式如:2018-05-01 19:00:00,必须大于当前时间5分钟。 + // 定时器动作,目前仅支持销毁一个值:TerminateInstances。 TimerAction *string `json:"TimerAction,omitnil,omitempty" name:"TimerAction"` // 执行时间的结束范围,用于条件筛选,格式如2018-05-01 19:00:00。 @@ -3181,7 +3175,7 @@ type DescribeInstancesActionTimerRequestParams struct { // 执行时间的开始范围,用于条件筛选,格式如2018-05-01 19:00:00。 StartActionTime *string `json:"StartActionTime,omitnil,omitempty" name:"StartActionTime"` - // 定时任务状态列表。