From b7e35a2d3070afc1db13b03b38b9e4f1c192fceb Mon Sep 17 00:00:00 2001
From: SevenEarth <391613297@qq.com>
Date: Tue, 17 Dec 2024 10:11:28 +0800
Subject: [PATCH 01/13] add
---
go.mod | 2 +-
go.sum | 14 +-
.../services/cvm/resource_tc_instance.go | 68 ++++++--
.../tencentcloud/common/http/request.go | 1 -
.../tencentcloud/cvm/v20170312/client.go | 24 ++-
.../tencentcloud/cvm/v20170312/errors.go | 9 +
.../tencentcloud/cvm/v20170312/models.go | 160 ++++++++++++------
vendor/modules.txt | 2 +-
8 files changed, 200 insertions(+), 80 deletions(-)
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..cf0f941d12 100644
--- a/tencentcloud/services/cvm/resource_tc_instance.go
+++ b/tencentcloud/services/cvm/resource_tc_instance.go
@@ -244,13 +244,19 @@ 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,
Description: "Resize online.",
},
"data_disks": {
- Type: schema.TypeList,
+ Type: schema.TypeSet,
Optional: true,
Computed: true,
ForceNew: true,
@@ -269,6 +275,12 @@ func ResourceTencentCloudInstance() *schema.Resource {
//ForceNew: 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,8 +625,12 @@ 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{})
+ dataDisks := v.(*schema.Set).List()
request.DataDisks = make([]*cvm.DataDisk, 0, len(dataDisks))
for _, d := range dataDisks {
value := d.(map[string]interface{})
@@ -627,6 +643,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 != "" {
@@ -924,6 +947,7 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
_ = d.Set("system_disk_type", instance.SystemDisk.DiskType)
_ = d.Set("system_disk_size", instance.SystemDisk.DiskSize)
_ = d.Set("system_disk_id", instance.SystemDisk.DiskId)
+ _ = d.Set("system_disk_name", instance.SystemDisk.DiskName)
_ = d.Set("instance_status", instance.InstanceState)
_ = d.Set("create_time", instance.CreatedTime)
_ = d.Set("expired_time", instance.ExpiredTime)
@@ -1019,7 +1043,7 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
tmpDataDisks := make([]interface{}, 0, len(instance.DataDisks))
if v, ok := d.GetOk("data_disks"); ok {
- tmpDataDisks = v.([]interface{})
+ tmpDataDisks = v.(*schema.Set).List()
}
for index, disk := range instance.DataDisks {
@@ -1040,6 +1064,7 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
}
}
+ dataDisk["data_disk_name"] = disk.DiskName
dataDisk["data_disk_type"] = disk.DiskType
dataDisk["data_disk_snapshot_id"] = disk.SnapshotId
dataDisk["delete_with_instance"] = disk.DeleteWithInstance
@@ -1402,15 +1427,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 +1506,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 {
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:
通过登录[控制台](https://console.cloud.tencent.com/cvm/index)查询实例ID。
通过调用接口 [DescribeInstances](https://cloud.tencent.com/document/api/213/15728) ,取返回信息中的`InstanceId`获取实例ID。
+ // 一个或多个待操作的实例ID,每次请求批量实例的上限为100。
可以通过以下方式获取可用的实例ID:
通过登录[控制台](https://console.cloud.tencent.com/cvm/index)查询实例ID。通过调用接口 [DescribeInstances](https://cloud.tencent.com/document/api/213/15728) ,取返回信息中的`InstanceId`获取实例ID。
InstanceIds []*string `json:"InstanceIds,omitnil,omitempty" name:"InstanceIds"`
- // 一个或多个待操作的密钥对ID,每次请求批量密钥对的上限为100。密钥对ID形如:`skey-3glfot13`。
可以通过以下方式获取可用的密钥ID:
通过登录[控制台](https://console.cloud.tencent.com/cvm/sshkey)查询密钥ID。
通过调用接口 [DescribeKeyPairs](https://cloud.tencent.com/document/api/213/15699) ,取返回信息中的`KeyId`获取密钥对ID。
+ // 一个或多个待操作的密钥对ID,每次请求批量密钥对的上限为100。密钥对ID形如:`skey-3glfot13`。
可以通过以下方式获取可用的密钥ID:
通过登录[控制台](https://console.cloud.tencent.com/cvm/sshkey)查询密钥ID。通过调用接口 [DescribeKeyPairs](https://cloud.tencent.com/document/api/213/15699) ,取返回信息中的`KeyId`获取密钥对ID。
KeyIds []*string `json:"KeyIds,omitnil,omitempty" name:"KeyIds"`
- // 是否对运行中的实例选择强制关机。建议对运行中的实例先手动关机,然后再绑定密钥。取值范围:
true:表示在正常关机失败后进行强制关机。
false:表示在正常关机失败后不进行强制关机。
默认取值:false。
+ // 是否对运行中的实例选择强制关机。建议对运行中的实例先手动关机,然后再绑定密钥。取值范围:
true:表示在正常关机失败后进行强制关机。false:表示在正常关机失败后不进行强制关机。默认取值:false。
ForceStop *bool `json:"ForceStop,omitnil,omitempty" name:"ForceStop"`
}
type AssociateInstancesKeyPairsRequest struct {
*tchttp.BaseRequest
- // 一个或多个待操作的实例ID,每次请求批量实例的上限为100。
可以通过以下方式获取可用的实例ID:
通过登录[控制台](https://console.cloud.tencent.com/cvm/index)查询实例ID。
通过调用接口 [DescribeInstances](https://cloud.tencent.com/document/api/213/15728) ,取返回信息中的`InstanceId`获取实例ID。
+ // 一个或多个待操作的实例ID,每次请求批量实例的上限为100。
可以通过以下方式获取可用的实例ID:
通过登录[控制台](https://console.cloud.tencent.com/cvm/index)查询实例ID。通过调用接口 [DescribeInstances](https://cloud.tencent.com/document/api/213/15728) ,取返回信息中的`InstanceId`获取实例ID。
InstanceIds []*string `json:"InstanceIds,omitnil,omitempty" name:"InstanceIds"`
- // 一个或多个待操作的密钥对ID,每次请求批量密钥对的上限为100。密钥对ID形如:`skey-3glfot13`。
可以通过以下方式获取可用的密钥ID:
通过登录[控制台](https://console.cloud.tencent.com/cvm/sshkey)查询密钥ID。
通过调用接口 [DescribeKeyPairs](https://cloud.tencent.com/document/api/213/15699) ,取返回信息中的`KeyId`获取密钥对ID。
+ // 一个或多个待操作的密钥对ID,每次请求批量密钥对的上限为100。密钥对ID形如:`skey-3glfot13`。
可以通过以下方式获取可用的密钥ID:
通过登录[控制台](https://console.cloud.tencent.com/cvm/sshkey)查询密钥ID。通过调用接口 [DescribeKeyPairs](https://cloud.tencent.com/document/api/213/15699) ,取返回信息中的`KeyId`获取密钥对ID。
KeyIds []*string `json:"KeyIds,omitnil,omitempty" name:"KeyIds"`
- // 是否对运行中的实例选择强制关机。建议对运行中的实例先手动关机,然后再绑定密钥。取值范围:
true:表示在正常关机失败后进行强制关机。
false:表示在正常关机失败后不进行强制关机。
默认取值:false。
+ // 是否对运行中的实例选择强制关机。建议对运行中的实例先手动关机,然后再绑定密钥。取值范围:
true:表示在正常关机失败后进行强制关机。false:表示在正常关机失败后不进行强制关机。默认取值:false。
ForceStop *bool `json:"ForceStop,omitnil,omitempty" name:"ForceStop"`
}
@@ -291,7 +304,7 @@ type ChargePrepaid struct {
// 购买实例的时长,单位:月。取值范围:1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 24, 36。
Period *uint64 `json:"Period,omitnil,omitempty" name:"Period"`
- // 自动续费标识。取值范围:
NOTIFY_AND_AUTO_RENEW:通知过期且自动续费
NOTIFY_AND_MANUAL_RENEW:通知过期不自动续费
DISABLE_NOTIFY_AND_MANUAL_RENEW:不通知过期不自动续费
默认取值:NOTIFY_AND_AUTO_RENEW。若该参数指定为NOTIFY_AND_AUTO_RENEW,在账户余额充足的情况下,实例到期后将按月自动续费。
+ // 自动续费标识。取值范围:NOTIFY_AND_AUTO_RENEW:通知过期且自动续费NOTIFY_AND_MANUAL_RENEW:通知过期不自动续费DISABLE_NOTIFY_AND_MANUAL_RENEW:不通知过期不自动续费
默认取值:NOTIFY_AND_AUTO_RENEW。若该参数指定为NOTIFY_AND_AUTO_RENEW,在账户余额充足的情况下,实例到期后将按月自动续费。
RenewFlag *string `json:"RenewFlag,omitnil,omitempty" name:"RenewFlag"`
}
@@ -1291,7 +1304,7 @@ type CreateLaunchTemplateVersionRequestParams struct {
//
对于付费模式为PREPAID或POSTPAID\_BY\_HOUR的实例创建,具体取值可通过调用接口[DescribeInstanceTypeConfigs](https://cloud.tencent.com/document/api/213/15749)来获得最新的规格表或参见[实例规格](https://cloud.tencent.com/document/product/213/11518)描述。若不指定该参数,则系统将根据当前地域的资源售卖情况动态指定默认机型。
对于付费模式为CDHPAID的实例创建,该参数以"CDH_"为前缀,根据CPU和内存配置生成,具体形式为:CDH_XCXG,例如对于创建CPU为1核,内存为1G大小的专用宿主机的实例,该参数应该为CDH_1C1G。
InstanceType *string `json:"InstanceType,omitnil,omitempty" name:"InstanceType"`
- // 指定有效的[镜像](https://cloud.tencent.com/document/product/213/4940)ID,格式形如`img-xxx`。镜像类型分为四种:
公共镜像自定义镜像共享镜像服务市场镜像
可通过以下方式获取可用的镜像ID:
`公共镜像`、`自定义镜像`、`共享镜像`的镜像ID可通过登录[控制台](https://console.cloud.tencent.com/cvm/image?rid=1&imageType=PUBLIC_IMAGE)查询;`服务镜像市场`的镜像ID可通过[云市场](https://market.cloud.tencent.com/list)查询。通过调用接口 [DescribeImages](https://cloud.tencent.com/document/api/213/15715) ,传入InstanceType获取当前机型支持的镜像列表,取返回信息中的`ImageId`字段。
+ // 指定有效的[镜像](https://cloud.tencent.com/document/product/213/4940)ID,格式形如`img-xxx`。镜像类型分为四种:
公共镜像自定义镜像共享镜像云镜像市场
可通过以下方式获取可用的镜像ID:
`公共镜像`、`自定义镜像`、`共享镜像`的镜像ID可通过登录[控制台](https://console.cloud.tencent.com/cvm/image?rid=1&imageType=PUBLIC_IMAGE)查询;`云镜像市场`的镜像ID可通过[云市场](https://market.cloud.tencent.com/list)查询。通过调用接口 [DescribeImages](https://cloud.tencent.com/document/api/213/15715) ,传入InstanceType获取当前机型支持的镜像列表,取返回信息中的`ImageId`字段。
ImageId *string `json:"ImageId,omitnil,omitempty" name:"ImageId"`
// 实例系统盘配置信息。若不指定该参数,则按照系统默认值进行分配。
@@ -1318,7 +1331,7 @@ type CreateLaunchTemplateVersionRequestParams struct {
// 实例所属安全组。该参数可以通过调用 [DescribeSecurityGroups](https://cloud.tencent.com/document/api/215/15808) 的返回值中的sgId字段来获取。若不指定该参数,则绑定默认安全组。
SecurityGroupIds []*string `json:"SecurityGroupIds,omitnil,omitempty" name:"SecurityGroupIds"`
- // 增强服务。通过该参数可以指定是否开启云安全、云监控等服务。若不指定该参数,则默认公共镜像开启云监控、云安全服务;自定义镜像与镜像市场镜像默认不开启云监控,云安全服务,而使用镜像里保留的服务。
+ // 增强服务。通过该参数可以指定是否开启云安全、云监控等服务。若不指定该参数,则默认公共镜像开启云监控、云安全服务;自定义镜像与云镜像市场镜像默认不开启云监控,云安全服务,而使用镜像里保留的服务。
EnhancedService *EnhancedService `json:"EnhancedService,omitnil,omitempty" name:"EnhancedService"`
// 用于保证请求幂等性的字符串。该字符串由客户生成,需保证不同请求之间唯一,最大值不超过64个ASCII字符。若不指定该参数,则无法保证请求的幂等性。
@@ -1384,7 +1397,7 @@ type CreateLaunchTemplateVersionRequest struct {
//
对于付费模式为PREPAID或POSTPAID\_BY\_HOUR的实例创建,具体取值可通过调用接口[DescribeInstanceTypeConfigs](https://cloud.tencent.com/document/api/213/15749)来获得最新的规格表或参见[实例规格](https://cloud.tencent.com/document/product/213/11518)描述。若不指定该参数,则系统将根据当前地域的资源售卖情况动态指定默认机型。
对于付费模式为CDHPAID的实例创建,该参数以"CDH_"为前缀,根据CPU和内存配置生成,具体形式为:CDH_XCXG,例如对于创建CPU为1核,内存为1G大小的专用宿主机的实例,该参数应该为CDH_1C1G。
InstanceType *string `json:"InstanceType,omitnil,omitempty" name:"InstanceType"`
- // 指定有效的[镜像](https://cloud.tencent.com/document/product/213/4940)ID,格式形如`img-xxx`。镜像类型分为四种:
公共镜像自定义镜像共享镜像服务市场镜像
可通过以下方式获取可用的镜像ID:
`公共镜像`、`自定义镜像`、`共享镜像`的镜像ID可通过登录[控制台](https://console.cloud.tencent.com/cvm/image?rid=1&imageType=PUBLIC_IMAGE)查询;`服务镜像市场`的镜像ID可通过[云市场](https://market.cloud.tencent.com/list)查询。通过调用接口 [DescribeImages](https://cloud.tencent.com/document/api/213/15715) ,传入InstanceType获取当前机型支持的镜像列表,取返回信息中的`ImageId`字段。
+ // 指定有效的[镜像](https://cloud.tencent.com/document/product/213/4940)ID,格式形如`img-xxx`。镜像类型分为四种:
公共镜像自定义镜像共享镜像云镜像市场
可通过以下方式获取可用的镜像ID:
`公共镜像`、`自定义镜像`、`共享镜像`的镜像ID可通过登录[控制台](https://console.cloud.tencent.com/cvm/image?rid=1&imageType=PUBLIC_IMAGE)查询;`云镜像市场`的镜像ID可通过[云市场](https://market.cloud.tencent.com/list)查询。通过调用接口 [DescribeImages](https://cloud.tencent.com/document/api/213/15715) ,传入InstanceType获取当前机型支持的镜像列表,取返回信息中的`ImageId`字段。
ImageId *string `json:"ImageId,omitnil,omitempty" name:"ImageId"`
// 实例系统盘配置信息。若不指定该参数,则按照系统默认值进行分配。
@@ -1411,7 +1424,7 @@ type CreateLaunchTemplateVersionRequest struct {
// 实例所属安全组。该参数可以通过调用 [DescribeSecurityGroups](https://cloud.tencent.com/document/api/215/15808) 的返回值中的sgId字段来获取。若不指定该参数,则绑定默认安全组。
SecurityGroupIds []*string `json:"SecurityGroupIds,omitnil,omitempty" name:"SecurityGroupIds"`
- // 增强服务。通过该参数可以指定是否开启云安全、云监控等服务。若不指定该参数,则默认公共镜像开启云监控、云安全服务;自定义镜像与镜像市场镜像默认不开启云监控,云安全服务,而使用镜像里保留的服务。
+ // 增强服务。通过该参数可以指定是否开启云安全、云监控等服务。若不指定该参数,则默认公共镜像开启云监控、云安全服务;自定义镜像与云镜像市场镜像默认不开启云监控,云安全服务,而使用镜像里保留的服务。
EnhancedService *EnhancedService `json:"EnhancedService,omitnil,omitempty" name:"EnhancedService"`
// 用于保证请求幂等性的字符串。该字符串由客户生成,需保证不同请求之间唯一,最大值不超过64个ASCII字符。若不指定该参数,则无法保证请求的幂等性。
@@ -1533,37 +1546,7 @@ type DataDisk struct {
// 数据盘大小,单位:GB。最小调整步长为10G,不同数据盘类型取值范围不同,具体限制详见:[存储概述](https://cloud.tencent.com/document/product/213/4952)。默认值为0,表示不购买数据盘。更多限制详见产品文档。
DiskSize *int64 `json:"DiskSize,omitnil,omitempty" name:"DiskSize"`
- // 数据盘类型。数据盘类型限制详见[存储概述](https://cloud.tencent.com/document/product/213/4952)。取值范围:
- //
- // LOCAL_BASIC:本地硬盘
- //
- // LOCAL_SSD:本地SSD硬盘
- //
- // LOCAL_NVME:本地NVME硬盘,与InstanceType强相关,不支持指定
- //
- // LOCAL_PRO:本地HDD硬盘,与InstanceType强相关,不支持指定
- //
- // CLOUD_BASIC:普通云硬盘
- //
- // CLOUD_PREMIUM:高性能云硬盘
- //
- // CLOUD_SSD:SSD云硬盘
- //
- // CLOUD_HSSD:增强型SSD云硬盘
- //
- // CLOUD_TSSD:极速型SSD云硬盘
- //
- // CLOUD_BSSD:通用型SSD云硬盘
默认取值:LOCAL_BASIC。
该参数对`ResizeInstanceDisk`接口无效。
- //
- //
- //
- //
- //
- //
- //
- //
- //
- //
+ // 数据盘类型。数据盘类型限制详见[存储概述](https://cloud.tencent.com/document/product/213/4952)。取值范围:
LOCAL_BASIC:本地硬盘
LOCAL_SSD:本地SSD硬盘
LOCAL_NVME:本地NVME硬盘,与InstanceType强相关,不支持指定
LOCAL_PRO:本地HDD硬盘,与InstanceType强相关,不支持指定
CLOUD_BASIC:普通云硬盘
CLOUD_PREMIUM:高性能云硬盘
CLOUD_SSD:SSD云硬盘
CLOUD_HSSD:增强型SSD云硬盘
CLOUD_TSSD:极速型SSD云硬盘
CLOUD_BSSD:通用型SSD云硬盘
默认取值:LOCAL_BASIC。
该参数对`ResizeInstanceDisk`接口无效。
DiskType *string `json:"DiskType,omitnil,omitempty" name:"DiskType"`
// 数据盘ID。LOCAL_BASIC 和 LOCAL_SSD 类型没有ID,暂时不支持该参数。
@@ -1571,10 +1554,10 @@ type DataDisk struct {
DiskId *string `json:"DiskId,omitnil,omitempty" name:"DiskId"`
// 数据盘是否随子机销毁。取值范围:
- // TRUE:子机销毁时,销毁数据盘,只支持按小时后付费云盘
+ // true:子机销毁时,销毁数据盘,只支持按小时后付费云盘
//
- // FALSE:子机销毁时,保留数据盘
- // 默认取值:TRUE
+ // false:子机销毁时,保留数据盘
+ // 默认取值:true
// 该参数目前仅用于 `RunInstances` 接口。
//
// 注意:此字段可能返回 null,表示取不到有效值。
@@ -1613,6 +1596,11 @@ type DataDisk struct {
// 注:内测中。
// 注意:此字段可能返回 null,表示取不到有效值。
BurstPerformance *bool `json:"BurstPerformance,omitnil,omitempty" name:"BurstPerformance"`
+
+ // 磁盘名称,长度不超过128 个字符。
+ //
+ // 该参数正在邀测中,暂未开放使用。
+ DiskName *string `json:"DiskName,omitnil,omitempty" name:"DiskName"`
}
// Predefined struct for user
@@ -2392,13 +2380,16 @@ type DescribeHostsRequestParams struct {
// zone
// 按照【可用区】进行过滤。可用区形如:ap-guangzhou-1。
类型:String
必选:否
可选项:可用区列表
// project-id
- // 按照【项目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
必选:否
// host-id
// 按照【[CDH](https://cloud.tencent.com/document/product/416) ID】进行过滤。[CDH](https://cloud.tencent.com/document/product/416) ID形如:host-xxxxxxxx。
类型:String
必选:否
// host-name
// 按照【CDH实例名称】进行过滤。
类型:String
必选:否
// host-state
// 按照【CDH实例状态】进行过滤。(PENDING:创建中 | LAUNCH_FAILURE:创建失败 | RUNNING:运行中 | EXPIRED:已过期)
类型:String
必选:否
+ // host-type
+ // 按照【CDH机型】进行过滤。
类型:String
必选:否
+ // tag-key 按照【标签键】进行过滤。
类型:String
必选:否
tag-value 按照【标签值】进行过滤。
类型:String
必选:否
tag:tag-key 按照【标签键值对】进行过滤。tag-key使用具体的标签键进行替换。使用请参考示例。
// 每次请求的`Filters`的上限为10,`Filter.Values`的上限为5。
Filters []*Filter `json:"Filters,omitnil,omitempty" name:"Filters"`
@@ -2415,13 +2406,16 @@ type DescribeHostsRequest struct {
// zone
// 按照【可用区】进行过滤。可用区形如:ap-guangzhou-1。
类型:String
必选:否
可选项:可用区列表
// project-id
- // 按照【项目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
必选:否
// host-id
// 按照【[CDH](https://cloud.tencent.com/document/product/416) ID】进行过滤。[CDH](https://cloud.tencent.com/document/product/416) ID形如:host-xxxxxxxx。
类型:String
必选:否
// host-name
// 按照【CDH实例名称】进行过滤。
类型:String
必选:否
// host-state
// 按照【CDH实例状态】进行过滤。(PENDING:创建中 | LAUNCH_FAILURE:创建失败 | RUNNING:运行中 | EXPIRED:已过期)
类型:String
必选:否
+ // host-type
+ // 按照【CDH机型】进行过滤。
类型:String
必选:否
+ // tag-key 按照【标签键】进行过滤。
类型:String
必选:否
tag-value 按照【标签值】进行过滤。
类型:String
必选:否
tag:tag-key 按照【标签键值对】进行过滤。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"`
- // 定时任务状态列表。
UNDO:未执行
DOING:正在执行
DONE:执行完成。
+ // 定时任务状态列表。
UNDO:未执行
DOING:正在执行
DONE:执行完成。
StatusList []*string `json:"StatusList,omitnil,omitempty" name:"StatusList"`
}
@@ -3194,7 +3188,7 @@ type DescribeInstancesActionTimerRequest 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。
@@ -3203,7 +3197,7 @@ type DescribeInstancesActionTimerRequest struct {
// 执行时间的开始范围,用于条件筛选,格式如2018-05-01 19:00:00。
StartActionTime *string `json:"StartActionTime,omitnil,omitempty" name:"StartActionTime"`
- // 定时任务状态列表。
UNDO:未执行
DOING:正在执行
DONE:执行完成。
+ // 定时任务状态列表。
UNDO:未执行
DOING:正在执行
DONE:执行完成。
StatusList []*string `json:"StatusList,omitnil,omitempty" name:"StatusList"`
}
@@ -5291,6 +5285,11 @@ type ImageQuota struct {
TotalQuota *uint64 `json:"TotalQuota,omitnil,omitempty" name:"TotalQuota"`
}
+type ImportImageDataDisk struct {
+ // 数据盘镜像 COS 链接
+ ImageUrl *string `json:"ImageUrl,omitnil,omitempty" name:"ImageUrl"`
+}
+
// Predefined struct for user
type ImportImageRequestParams struct {
// 导入镜像的操作系统架构,`x86_64` 或 `i386`
@@ -5328,6 +5327,12 @@ type ImportImageRequestParams struct {
// 启动模式
BootMode *string `json:"BootMode,omitnil,omitempty" name:"BootMode"`
+
+ // 镜像族
+ ImageFamily *string `json:"ImageFamily,omitnil,omitempty" name:"ImageFamily"`
+
+ // 导入的数据盘列表
+ ImportImageDataDiskList []*ImportImageDataDisk `json:"ImportImageDataDiskList,omitnil,omitempty" name:"ImportImageDataDiskList"`
}
type ImportImageRequest struct {
@@ -5368,6 +5373,12 @@ type ImportImageRequest struct {
// 启动模式
BootMode *string `json:"BootMode,omitnil,omitempty" name:"BootMode"`
+
+ // 镜像族
+ ImageFamily *string `json:"ImageFamily,omitnil,omitempty" name:"ImageFamily"`
+
+ // 导入的数据盘列表
+ ImportImageDataDiskList []*ImportImageDataDisk `json:"ImportImageDataDiskList,omitnil,omitempty" name:"ImportImageDataDiskList"`
}
func (r *ImportImageRequest) ToJsonString() string {
@@ -5393,6 +5404,8 @@ func (r *ImportImageRequest) FromJsonString(s string) error {
delete(f, "TagSpecification")
delete(f, "LicenseType")
delete(f, "BootMode")
+ delete(f, "ImageFamily")
+ delete(f, "ImportImageDataDiskList")
if len(f) > 0 {
return tcerr.NewTencentCloudSDKError("ClientError.BuildRequestError", "ImportImageRequest has unknown keys!", "")
}
@@ -7078,7 +7091,6 @@ type LocalDiskType struct {
type LoginSettings struct {
// 实例登录密码。不同操作系统类型密码复杂度限制不一样,具体如下:Linux实例密码必须8到30位,至少包括两项[a-z],[A-Z]、[0-9] 和 [( ) \` ~ ! @ # $ % ^ & * - + = | { } [ ] : ; ' , . ? / ]中的特殊符号。Windows实例密码必须12到30位,至少包括三项[a-z],[A-Z],[0-9] 和 [( ) \` ~ ! @ # $ % ^ & * - + = | { } [ ] : ; ' , . ? /]中的特殊符号。若不指定该参数,则由系统随机生成密码,并通过站内信方式通知到用户。
- // 注意:此字段可能返回 null,表示取不到有效值。
Password *string `json:"Password,omitnil,omitempty" name:"Password"`
// 密钥ID列表。关联密钥后,就可以通过对应的私钥来访问实例;KeyId可通过接口[DescribeKeyPairs](https://cloud.tencent.com/document/api/213/15699)获取,密钥与密码不能同时指定,同时Windows操作系统不支持指定密钥。
@@ -7803,7 +7815,7 @@ type ModifyInstancesProjectRequestParams struct {
// 一个或多个待操作的实例ID。可通过 [DescribeInstances](https://cloud.tencent.com/document/api/213/15728) API返回值中的`InstanceId`获取。每次请求允许操作的实例数量上限是100。
InstanceIds []*string `json:"InstanceIds,omitnil,omitempty" name:"InstanceIds"`
- // 项目ID。项目可以使用[AddProject](https://cloud.tencent.com/document/product/651/81952)接口创建。可通过[`DescribeProject`](https://cloud.tencent.com/document/product/378/4400) API返回值中的`projectId`获取。后续使用[DescribeInstances](https://cloud.tencent.com/document/api/213/15728)接口查询实例时,项目ID可用于过滤结果。
+ // 项目ID。项目可以使用[AddProject](https://cloud.tencent.com/document/api/651/81952)接口创建。可通过[`DescribeProject`](https://cloud.tencent.com/document/api/651/78725) API返回值中的`projectId`获取。后续使用[DescribeInstances](https://cloud.tencent.com/document/api/213/15728)接口查询实例时,项目ID可用于过滤结果。
ProjectId *int64 `json:"ProjectId,omitnil,omitempty" name:"ProjectId"`
}
@@ -7813,7 +7825,7 @@ type ModifyInstancesProjectRequest struct {
// 一个或多个待操作的实例ID。可通过 [DescribeInstances](https://cloud.tencent.com/document/api/213/15728) API返回值中的`InstanceId`获取。每次请求允许操作的实例数量上限是100。
InstanceIds []*string `json:"InstanceIds,omitnil,omitempty" name:"InstanceIds"`
- // 项目ID。项目可以使用[AddProject](https://cloud.tencent.com/document/product/651/81952)接口创建。可通过[`DescribeProject`](https://cloud.tencent.com/document/product/378/4400) API返回值中的`projectId`获取。后续使用[DescribeInstances](https://cloud.tencent.com/document/api/213/15728)接口查询实例时,项目ID可用于过滤结果。
+ // 项目ID。项目可以使用[AddProject](https://cloud.tencent.com/document/api/651/81952)接口创建。可通过[`DescribeProject`](https://cloud.tencent.com/document/api/651/78725) API返回值中的`projectId`获取。后续使用[DescribeInstances](https://cloud.tencent.com/document/api/213/15728)接口查询实例时,项目ID可用于过滤结果。
ProjectId *int64 `json:"ProjectId,omitnil,omitempty" name:"ProjectId"`
}
@@ -10029,6 +10041,16 @@ type SyncImagesRequestParams struct {
// 是否需要返回目的地域的镜像ID。
// 默认值: false
ImageSetRequired *bool `json:"ImageSetRequired,omitnil,omitempty" name:"ImageSetRequired"`
+
+ // 是否复制为加密自定义镜像。
+ // 默认值为 false。
+ // 复制加密自定义镜像仅支持同地域。
+ Encrypt *bool `json:"Encrypt,omitnil,omitempty" name:"Encrypt"`
+
+ // 加密自定义镜像使用的 KMS 密钥 ID。
+ // 仅当复制加密镜像时,即 Encrypt 为 true 时,此参数有效;
+ // 不指定 KmsKeyId,默认使用 CBS 云产品 KMS 密钥。
+ KmsKeyId *string `json:"KmsKeyId,omitnil,omitempty" name:"KmsKeyId"`
}
type SyncImagesRequest struct {
@@ -10050,6 +10072,16 @@ type SyncImagesRequest struct {
// 是否需要返回目的地域的镜像ID。
// 默认值: false
ImageSetRequired *bool `json:"ImageSetRequired,omitnil,omitempty" name:"ImageSetRequired"`
+
+ // 是否复制为加密自定义镜像。
+ // 默认值为 false。
+ // 复制加密自定义镜像仅支持同地域。
+ Encrypt *bool `json:"Encrypt,omitnil,omitempty" name:"Encrypt"`
+
+ // 加密自定义镜像使用的 KMS 密钥 ID。
+ // 仅当复制加密镜像时,即 Encrypt 为 true 时,此参数有效;
+ // 不指定 KmsKeyId,默认使用 CBS 云产品 KMS 密钥。
+ KmsKeyId *string `json:"KmsKeyId,omitnil,omitempty" name:"KmsKeyId"`
}
func (r *SyncImagesRequest) ToJsonString() string {
@@ -10069,6 +10101,8 @@ func (r *SyncImagesRequest) FromJsonString(s string) error {
delete(f, "DryRun")
delete(f, "ImageName")
delete(f, "ImageSetRequired")
+ delete(f, "Encrypt")
+ delete(f, "KmsKeyId")
if len(f) > 0 {
return tcerr.NewTencentCloudSDKError("ClientError.BuildRequestError", "SyncImagesRequest has unknown keys!", "")
}
@@ -10101,7 +10135,16 @@ func (r *SyncImagesResponse) FromJsonString(s string) error {
}
type SystemDisk struct {
- // 系统盘类型。系统盘类型限制详见[存储概述](https://cloud.tencent.com/document/product/213/4952)。取值范围:
LOCAL_BASIC:本地硬盘
LOCAL_SSD:本地SSD硬盘
CLOUD_BASIC:普通云硬盘
CLOUD_SSD:SSD云硬盘
CLOUD_PREMIUM:高性能云硬盘
CLOUD_BSSD:通用性SSD云硬盘
CLOUD_HSSD:增强型SSD云硬盘
CLOUD_TSSD:极速型SSD云硬盘
默认取值:当前有库存的硬盘类型。
+ // 系统盘类型。系统盘类型限制详见[存储概述](https://cloud.tencent.com/document/product/213/4952)。取值范围:
+ // LOCAL_BASIC:本地硬盘
+ // LOCAL_SSD:本地SSD硬盘
+ // CLOUD_BASIC:普通云硬盘
+ // CLOUD_SSD:SSD云硬盘
+ // CLOUD_PREMIUM:高性能云硬盘
+ // CLOUD_BSSD:通用性SSD云硬盘
+ // CLOUD_HSSD:增强型SSD云硬盘
+ // CLOUD_TSSD:极速型SSD云硬盘
+ // 默认取值:当前有库存的硬盘类型。
DiskType *string `json:"DiskType,omitnil,omitempty" name:"DiskType"`
// 系统盘ID。LOCAL_BASIC 和 LOCAL_SSD 类型没有ID。暂时不支持该参数。
@@ -10114,6 +10157,12 @@ type SystemDisk struct {
// 所属的独享集群ID。
// 注意:此字段可能返回 null,表示取不到有效值。
CdcId *string `json:"CdcId,omitnil,omitempty" name:"CdcId"`
+
+ // 磁盘名称,长度不超过128 个字符。
+ //
+ // 该参数正在邀测中,暂未开放使用。
+ // 注意:此字段可能返回 null,表示取不到有效值。
+ DiskName *string `json:"DiskName,omitnil,omitempty" name:"DiskName"`
}
type Tag struct {
@@ -10261,7 +10310,6 @@ type ZoneInfo struct {
// ap-shanghai-8
// ap-mumbai-1
// ap-mumbai-2
- // eu-moscow-1
// ap-beijing-1(售罄)
// ap-beijing-2
// ap-beijing-3
diff --git a/vendor/modules.txt b/vendor/modules.txt
index 8e8ba25074..dc601ddebb 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -1177,7 +1177,7 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/controlcenter/v20230110
# github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/csip v1.0.860
## explicit; go 1.14
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/csip/v20221121
-# github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1014
+# github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1053
## explicit; go 1.14
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312
# github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp v1.0.762
From 1e96458b5949018975bfe139e3a682f7eadccc12 Mon Sep 17 00:00:00 2001
From: SevenEarth <391613297@qq.com>
Date: Thu, 5 Dec 2024 11:30:24 +0800
Subject: [PATCH 02/13] add
---
.../services/cvm/resource_tc_instance.go | 37 ++++++++++++++++---
1 file changed, 31 insertions(+), 6 deletions(-)
diff --git a/tencentcloud/services/cvm/resource_tc_instance.go b/tencentcloud/services/cvm/resource_tc_instance.go
index cf0f941d12..91f9a8fea0 100644
--- a/tencentcloud/services/cvm/resource_tc_instance.go
+++ b/tencentcloud/services/cvm/resource_tc_instance.go
@@ -256,7 +256,7 @@ func ResourceTencentCloudInstance() *schema.Resource {
Description: "Resize online.",
},
"data_disks": {
- Type: schema.TypeSet,
+ Type: schema.TypeList,
Optional: true,
Computed: true,
ForceNew: true,
@@ -630,7 +630,7 @@ func resourceTencentCloudInstanceCreate(d *schema.ResourceData, meta interface{}
}
if v, ok := d.GetOk("data_disks"); ok {
- dataDisks := v.(*schema.Set).List()
+ dataDisks := v.([]interface{})
request.DataDisks = make([]*cvm.DataDisk, 0, len(dataDisks))
for _, d := range dataDisks {
value := d.(map[string]interface{})
@@ -947,7 +947,6 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
_ = d.Set("system_disk_type", instance.SystemDisk.DiskType)
_ = d.Set("system_disk_size", instance.SystemDisk.DiskSize)
_ = d.Set("system_disk_id", instance.SystemDisk.DiskId)
- _ = d.Set("system_disk_name", instance.SystemDisk.DiskName)
_ = d.Set("instance_status", instance.InstanceState)
_ = d.Set("create_time", instance.CreatedTime)
_ = d.Set("expired_time", instance.ExpiredTime)
@@ -981,7 +980,34 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
delete(tags, "tencentcloud:autoscaling:auto-scaling-group-id")
_ = d.Set("tags", tags)
- //set data_disks
+ // 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 bool
dataDiskList := make([]map[string]interface{}, 0, len(instance.DataDisks))
diskSizeMap := map[string]*uint64{}
@@ -1043,7 +1069,7 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
tmpDataDisks := make([]interface{}, 0, len(instance.DataDisks))
if v, ok := d.GetOk("data_disks"); ok {
- tmpDataDisks = v.(*schema.Set).List()
+ tmpDataDisks = v.([]interface{})
}
for index, disk := range instance.DataDisks {
@@ -1064,7 +1090,6 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
}
}
- dataDisk["data_disk_name"] = disk.DiskName
dataDisk["data_disk_type"] = disk.DiskType
dataDisk["data_disk_snapshot_id"] = disk.SnapshotId
dataDisk["delete_with_instance"] = disk.DeleteWithInstance
From 7453bdfc52b791ca9821f5fa60b74fe1661cefbb Mon Sep 17 00:00:00 2001
From: SevenEarth <391613297@qq.com>
Date: Fri, 6 Dec 2024 20:39:35 +0800
Subject: [PATCH 03/13] add
---
.../services/cvm/resource_tc_instance.go | 264 +++++++++++++++---
1 file changed, 226 insertions(+), 38 deletions(-)
diff --git a/tencentcloud/services/cvm/resource_tc_instance.go b/tencentcloud/services/cvm/resource_tc_instance.go
index 91f9a8fea0..481996fdad 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"
@@ -270,9 +273,8 @@ 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": {
@@ -1008,16 +1010,28 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
}
// set data_disks
- var hasDataDisks, isCombineDataDisks bool
+ 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
+ }
+ }
+ }
}
- 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
@@ -1065,48 +1079,206 @@ 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 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
+ 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
+ }
+ }
+
+ 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)
}
- 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 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]
+ })
+ }
+
+ _ = 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 := string(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 v, ok := value["data_disk_name"].(string); ok && v != "" {
+ diskName = v
+ }
+
+ diskObj := diskHash{
+ diskType: diskType,
+ diskSize: diskSize,
+ deleteWithInstance: deleteWithInstance,
+ encrypt: encrypt,
+ }
+
+ // set hash
+ tmpMap[diskName] = getDataDiskHash(diskObj)
+ tmpMap["index"] = index
+ tmpMap["flag"] = 0
+ dDiskHash = append(dDiskHash, tmpMap)
}
}
- 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)
- }
+ 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)
+ }
- 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]
+ 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
+ }
+
+ // update instance DataDisks
+ for _, cvmDisk := range instance.DataDisks {
+ for _, cbsDisk := range cbsDisks {
+ if *cvmDisk.DiskId == *cbsDisk.DiskId {
+ dName := *cbsDisk.DiskName
+ cvmDisk.DiskName = &dName
+ break
+ }
+ }
+
+ fmt.Println(1111111111)
+ fmt.Println(1111111111)
+ fmt.Println(*cvmDisk.DiskName)
+ fmt.Println(1111111111)
+ fmt.Println(1111111111)
+ }
+
+ // has disk name first
+ for _, disk := range instance.DataDisks {
+ for _, hashItem := range dDiskHash {
+ diskName := *disk.DiskName
+ tmpHash := getDataDiskHash(diskHash{
+ diskType: *disk.DiskType,
+ diskSize: *disk.DiskSize,
+ deleteWithInstance: *disk.DeleteWithInstance,
+ encrypt: *disk.Encrypt,
+ })
+
+ // get disk name
+ if _, ok := hashItem[diskName]; ok {
+ // check hash and flag
+ if tmpHash == hashItem[diskName] && hashItem["flag"] == 0 {
+ dataDisk := make(map[string]interface{}, 5)
+ dataDisk["data_disk_id"] = disk.DiskId
+ dataDisk["data_disk_size"] = disk.DiskSize
+ dataDisk["data_disk_name"] = disk.DiskName
+ 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
+ tmpDataDiskMap[hashItem["index"].(int)] = dataDisk
+ hashItem["flag"] = 1
+ break
+ }
+ }
+ }
+ }
+
+ // no disk name last
+ for _, disk := range instance.DataDisks {
+ for index, hashItem := range dDiskHash {
+ tmpHash := getDataDiskHash(diskHash{
+ diskType: *disk.DiskType,
+ diskSize: *disk.DiskSize,
+ deleteWithInstance: *disk.DeleteWithInstance,
+ encrypt: *disk.Encrypt,
+ })
+
+ // check hash and flag
+ if tmpHash == hashItem[string(index)] && hashItem["flag"] == 0 {
+ dataDisk := make(map[string]interface{}, 5)
+ dataDisk["data_disk_id"] = disk.DiskId
+ dataDisk["data_disk_size"] = disk.DiskSize
+ dataDisk["data_disk_name"] = disk.DiskName
+ 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
+ tmpDataDiskMap[hashItem["index"].(int)] = dataDisk
+ hashItem["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)
+ }
+
+ _ = d.Set("data_disks", dataDiskList)
+ } else {
+ _ = d.Set("data_disks", dataDiskList)
+ }
if len(instance.PrivateIpAddresses) > 0 {
_ = d.Set("private_ip", instance.PrivateIpAddresses[0])
@@ -2160,3 +2332,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))
+}
From ef6d97b70ef26841bccaed13d418934c6ace35ed Mon Sep 17 00:00:00 2001
From: SevenEarth <391613297@qq.com>
Date: Fri, 6 Dec 2024 20:43:15 +0800
Subject: [PATCH 04/13] add
---
tencentcloud/services/cvm/resource_tc_instance.go | 6 ------
1 file changed, 6 deletions(-)
diff --git a/tencentcloud/services/cvm/resource_tc_instance.go b/tencentcloud/services/cvm/resource_tc_instance.go
index 481996fdad..354405de04 100644
--- a/tencentcloud/services/cvm/resource_tc_instance.go
+++ b/tencentcloud/services/cvm/resource_tc_instance.go
@@ -1196,12 +1196,6 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
break
}
}
-
- fmt.Println(1111111111)
- fmt.Println(1111111111)
- fmt.Println(*cvmDisk.DiskName)
- fmt.Println(1111111111)
- fmt.Println(1111111111)
}
// has disk name first
From c8980b55690726aed2a65f7eb9ce94b734fa4aa7 Mon Sep 17 00:00:00 2001
From: SevenEarth <391613297@qq.com>
Date: Mon, 9 Dec 2024 10:42:52 +0800
Subject: [PATCH 05/13] add
---
website/docs/r/instance.html.markdown | 2 ++
1 file changed, 2 insertions(+)
diff --git a/website/docs/r/instance.html.markdown b/website/docs/r/instance.html.markdown
index e911b9a1e6..9608916227 100644
--- a/website/docs/r/instance.html.markdown
+++ b/website/docs/r/instance.html.markdown
@@ -253,6 +253,7 @@ The following arguments are supported:
* `stopped_mode` - (Optional, String) Billing method of a pay-as-you-go instance after shutdown. Available values: `KEEP_CHARGING`,`STOP_CHARGING`. Default `KEEP_CHARGING`.
* `subnet_id` - (Optional, String) The ID of a VPC subnet. If you want to create instances in a VPC network, this parameter must be set.
* `system_disk_id` - (Optional, String) 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` - (Optional, String) Name of the system disk.
* `system_disk_resize_online` - (Optional, Bool) Resize online.
* `system_disk_size` - (Optional, Int) Size of the system disk. unit is GB, Default is 50GB. If modified, the instance may force stop.
* `system_disk_type` - (Optional, String) System disk type. For more information on limits of system 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_BASIC`: cloud disk, `CLOUD_SSD`: cloud SSD disk, `CLOUD_PREMIUM`: Premium Cloud Storage, `CLOUD_BSSD`: Basic SSD, `CLOUD_HSSD`: Enhanced SSD, `CLOUD_TSSD`: Tremendous SSD. NOTE: If modified, the instance may force stop.
@@ -266,6 +267,7 @@ The `data_disks` object supports the following:
* `data_disk_size` - (Required, Int) Size of the data disk, and unit is GB.
* `data_disk_type` - (Required, String, ForceNew) 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_id` - (Optional, String) Data disk ID used to initialize the data disk. When data disk type is `LOCAL_BASIC` and `LOCAL_SSD`, disk id is not supported.
+* `data_disk_name` - (Optional, String) Name of data disk.
* `data_disk_snapshot_id` - (Optional, String, ForceNew) Snapshot ID of the data disk. The selected data disk snapshot size must be smaller than the data disk size.
* `delete_with_instance_prepaid` - (Optional, Bool, ForceNew) 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.
* `delete_with_instance` - (Optional, Bool, ForceNew) Decides whether the disk is deleted with instance(only applied to `CLOUD_BASIC`, `CLOUD_SSD` and `CLOUD_PREMIUM` disk with `POSTPAID_BY_HOUR` instance), default is true.
From 3ec275f2b668b5cb4881d5ffcded68d4568b0787 Mon Sep 17 00:00:00 2001
From: SevenEarth <391613297@qq.com>
Date: Fri, 13 Dec 2024 17:29:33 +0800
Subject: [PATCH 06/13] add
---
.../services/cvm/resource_tc_instance.go | 33 +++++++++++++++++++
1 file changed, 33 insertions(+)
diff --git a/tencentcloud/services/cvm/resource_tc_instance.go b/tencentcloud/services/cvm/resource_tc_instance.go
index 354405de04..2a2767cf64 100644
--- a/tencentcloud/services/cvm/resource_tc_instance.go
+++ b/tencentcloud/services/cvm/resource_tc_instance.go
@@ -1119,6 +1119,39 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
})
}
+ // get data disk name
+ finalDiskIds := make([]*string, 0, len(dataDiskList))
+ for _, item := range dataDiskList {
+ diskId := item["data_disk_id"].(*string)
+ finalDiskIds = append(finalDiskIds, diskId)
+ }
+
+ 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
+ }
+ }
+
_ = d.Set("data_disks", dataDiskList)
} else if len(instance.DataDisks) > 0 && hasDataDisksName {
// scene with no disks name
From 0b54abff7b90c678bb228b34fbbe26e2d84ee9f2 Mon Sep 17 00:00:00 2001
From: SevenEarth <391613297@qq.com>
Date: Fri, 13 Dec 2024 18:47:43 +0800
Subject: [PATCH 07/13] add
---
tencentcloud/services/cvm/resource_tc_instance.go | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/tencentcloud/services/cvm/resource_tc_instance.go b/tencentcloud/services/cvm/resource_tc_instance.go
index 2a2767cf64..8353c85a5a 100644
--- a/tencentcloud/services/cvm/resource_tc_instance.go
+++ b/tencentcloud/services/cvm/resource_tc_instance.go
@@ -1167,8 +1167,8 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
diskSize := int64(value["data_disk_size"].(int))
deleteWithInstance := value["delete_with_instance"].(bool)
encrypt := value["encrypt"].(bool)
- if v, ok := value["data_disk_name"].(string); ok && v != "" {
- diskName = v
+ if tmpV, ok := value["data_disk_name"].(string); ok && tmpV != "" {
+ diskName = tmpV
}
diskObj := diskHash{
@@ -1231,7 +1231,7 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
}
}
- // has disk name first
+ // has set disk name first
for _, disk := range instance.DataDisks {
for _, hashItem := range dDiskHash {
diskName := *disk.DiskName
@@ -1243,7 +1243,7 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
})
// get disk name
- if _, ok := hashItem[diskName]; ok {
+ if v, ok := hashItem[diskName].(string); ok && v != "" {
// check hash and flag
if tmpHash == hashItem[diskName] && hashItem["flag"] == 0 {
dataDisk := make(map[string]interface{}, 5)
@@ -1263,7 +1263,7 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
}
}
- // no disk name last
+ // no set disk name last
for _, disk := range instance.DataDisks {
for index, hashItem := range dDiskHash {
tmpHash := getDataDiskHash(diskHash{
From 5e0286e5c193e33087ff2742c64f51954c5b5d0e Mon Sep 17 00:00:00 2001
From: SevenEarth <391613297@qq.com>
Date: Fri, 13 Dec 2024 19:39:39 +0800
Subject: [PATCH 08/13] add
---
tencentcloud/services/cvm/resource_tc_instance.go | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/tencentcloud/services/cvm/resource_tc_instance.go b/tencentcloud/services/cvm/resource_tc_instance.go
index 8353c85a5a..a526dbeb0f 100644
--- a/tencentcloud/services/cvm/resource_tc_instance.go
+++ b/tencentcloud/services/cvm/resource_tc_instance.go
@@ -1025,6 +1025,7 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
diskName := v.(string)
if diskName != "" {
hasDataDisksName = true
+ break
}
}
}
@@ -1162,7 +1163,7 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
for index, item := range dataDisks {
value := item.(map[string]interface{})
tmpMap := make(map[string]interface{})
- diskName := string(index)
+ diskName := strconv.Itoa(index)
diskType := value["data_disk_type"].(string)
diskSize := int64(value["data_disk_size"].(int))
deleteWithInstance := value["delete_with_instance"].(bool)
@@ -1274,7 +1275,7 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
})
// check hash and flag
- if tmpHash == hashItem[string(index)] && hashItem["flag"] == 0 {
+ if tmpHash == hashItem[strconv.Itoa(index)] && hashItem["flag"] == 0 {
dataDisk := make(map[string]interface{}, 5)
dataDisk["data_disk_id"] = disk.DiskId
dataDisk["data_disk_size"] = disk.DiskSize
From 30454f18f3da4e68220de9b9ebd3fabbe19c748c Mon Sep 17 00:00:00 2001
From: SevenEarth <391613297@qq.com>
Date: Mon, 16 Dec 2024 18:58:07 +0800
Subject: [PATCH 09/13] add
---
.../services/cvm/resource_tc_instance.go | 130 +++++++++++++-----
1 file changed, 93 insertions(+), 37 deletions(-)
diff --git a/tencentcloud/services/cvm/resource_tc_instance.go b/tencentcloud/services/cvm/resource_tc_instance.go
index a526dbeb0f..6b35d46083 100644
--- a/tencentcloud/services/cvm/resource_tc_instance.go
+++ b/tencentcloud/services/cvm/resource_tc_instance.go
@@ -5,6 +5,7 @@ import (
"crypto/sha256"
"encoding/base64"
"encoding/hex"
+ "encoding/json"
"fmt"
"log"
"sort"
@@ -1221,77 +1222,132 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
return err
}
- // update instance DataDisks
+ // make data disks data
+ sourceDataDisks := make([]*map[string]interface{}, 0)
for _, cvmDisk := range instance.DataDisks {
for _, cbsDisk := range cbsDisks {
if *cvmDisk.DiskId == *cbsDisk.DiskId {
- dName := *cbsDisk.DiskName
- cvmDisk.DiskName = &dName
+ 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
}
}
}
+ a, _ := json.Marshal(instance.DataDisks)
+ b, _ := json.Marshal(dDiskHash)
+ fmt.Println(1111111111111)
+ fmt.Println(1111111111111)
+ fmt.Printf("%+v\n", string(a))
+ fmt.Println(1111111111111)
+ fmt.Println(1111111111111)
+ fmt.Printf("%+v\n", string(b))
+ fmt.Println(1111111111111)
+ fmt.Println(1111111111111)
+
// has set disk name first
- for _, disk := range instance.DataDisks {
- for _, hashItem := range dDiskHash {
- diskName := *disk.DiskName
+ 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: *disk.DiskType,
- diskSize: *disk.DiskSize,
- deleteWithInstance: *disk.DeleteWithInstance,
- encrypt: *disk.Encrypt,
+ diskType: *diskType,
+ diskSize: *diskSize,
+ deleteWithInstance: *deleteWithInstance,
+ encrypt: *encrypt,
})
// get disk name
- if v, ok := hashItem[diskName].(string); ok && v != "" {
+ hashItem := dDiskHash[i]
+ if _, ok := hashItem[*diskName]; ok {
// check hash and flag
- if tmpHash == hashItem[diskName] && hashItem["flag"] == 0 {
- dataDisk := make(map[string]interface{}, 5)
- dataDisk["data_disk_id"] = disk.DiskId
- dataDisk["data_disk_size"] = disk.DiskSize
- dataDisk["data_disk_name"] = disk.DiskName
- 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
+ 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
}
}
}
}
+ c, _ := json.Marshal(sourceDataDisks)
+ c1, _ := json.Marshal(dDiskHash)
+ fmt.Println(2222222222222)
+ fmt.Println(2222222222222)
+ fmt.Printf("%+v\n", string(c))
+ fmt.Printf("%+v\n", string(c1))
+ fmt.Println(2222222222222)
+ fmt.Println(2222222222222)
+
// no set disk name last
- for _, disk := range instance.DataDisks {
- for index, hashItem := range dDiskHash {
+ 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: *disk.DiskType,
- diskSize: *disk.DiskSize,
- deleteWithInstance: *disk.DeleteWithInstance,
- encrypt: *disk.Encrypt,
+ diskType: *diskType,
+ diskSize: *diskSize,
+ deleteWithInstance: *deleteWithInstance,
+ encrypt: *encrypt,
})
// check hash and flag
- if tmpHash == hashItem[strconv.Itoa(index)] && hashItem["flag"] == 0 {
- dataDisk := make(map[string]interface{}, 5)
- dataDisk["data_disk_id"] = disk.DiskId
- dataDisk["data_disk_size"] = disk.DiskSize
- dataDisk["data_disk_name"] = disk.DiskName
- 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
+ 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
}
}
}
+ e, _ := json.Marshal(sourceDataDisks)
+ e1, _ := json.Marshal(dDiskHash)
+ fmt.Println(3333333333333)
+ fmt.Println(3333333333333)
+ fmt.Printf("%+v\n", string(e))
+ fmt.Printf("%+v\n", string(e1))
+ fmt.Println(3333333333333)
+ fmt.Println(3333333333333)
+
keys := make([]int, 0, len(tmpDataDiskMap))
for k := range tmpDataDiskMap {
keys = append(keys, k)
From f75323a1c85879d756a28094a406c7a0ecb4a529 Mon Sep 17 00:00:00 2001
From: SevenEarth <391613297@qq.com>
Date: Mon, 16 Dec 2024 19:05:14 +0800
Subject: [PATCH 10/13] add
---
.../services/cvm/resource_tc_instance.go | 30 -------------------
1 file changed, 30 deletions(-)
diff --git a/tencentcloud/services/cvm/resource_tc_instance.go b/tencentcloud/services/cvm/resource_tc_instance.go
index 6b35d46083..397ce92936 100644
--- a/tencentcloud/services/cvm/resource_tc_instance.go
+++ b/tencentcloud/services/cvm/resource_tc_instance.go
@@ -5,7 +5,6 @@ import (
"crypto/sha256"
"encoding/base64"
"encoding/hex"
- "encoding/json"
"fmt"
"log"
"sort"
@@ -1243,17 +1242,6 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
}
}
- a, _ := json.Marshal(instance.DataDisks)
- b, _ := json.Marshal(dDiskHash)
- fmt.Println(1111111111111)
- fmt.Println(1111111111111)
- fmt.Printf("%+v\n", string(a))
- fmt.Println(1111111111111)
- fmt.Println(1111111111111)
- fmt.Printf("%+v\n", string(b))
- fmt.Println(1111111111111)
- fmt.Println(1111111111111)
-
// has set disk name first
for v := range sourceDataDisks {
for i := range dDiskHash {
@@ -1294,15 +1282,6 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
}
}
- c, _ := json.Marshal(sourceDataDisks)
- c1, _ := json.Marshal(dDiskHash)
- fmt.Println(2222222222222)
- fmt.Println(2222222222222)
- fmt.Printf("%+v\n", string(c))
- fmt.Printf("%+v\n", string(c1))
- fmt.Println(2222222222222)
- fmt.Println(2222222222222)
-
// no set disk name last
for v := range sourceDataDisks {
for i := range dDiskHash {
@@ -1339,15 +1318,6 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
}
}
- e, _ := json.Marshal(sourceDataDisks)
- e1, _ := json.Marshal(dDiskHash)
- fmt.Println(3333333333333)
- fmt.Println(3333333333333)
- fmt.Printf("%+v\n", string(e))
- fmt.Printf("%+v\n", string(e1))
- fmt.Println(3333333333333)
- fmt.Println(3333333333333)
-
keys := make([]int, 0, len(tmpDataDiskMap))
for k := range tmpDataDiskMap {
keys = append(keys, k)
From 79131bf4b7f3c2443d1e2323b0571e8a4873f319 Mon Sep 17 00:00:00 2001
From: SevenEarth <391613297@qq.com>
Date: Mon, 16 Dec 2024 20:36:43 +0800
Subject: [PATCH 11/13] add
---
tencentcloud/services/cvm/resource_tc_instance_test.go | 6 ++++++
1 file changed, 6 insertions(+)
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
From c7cf7e3fa16ea289e1ee18cdb2701f9abf226ecc Mon Sep 17 00:00:00 2001
From: SevenEarth <391613297@qq.com>
Date: Wed, 18 Dec 2024 16:46:27 +0800
Subject: [PATCH 12/13] add
---
.../services/cvm/resource_tc_instance.go | 34 +++++++++++++------
1 file changed, 23 insertions(+), 11 deletions(-)
diff --git a/tencentcloud/services/cvm/resource_tc_instance.go b/tencentcloud/services/cvm/resource_tc_instance.go
index 397ce92936..dea57865c9 100644
--- a/tencentcloud/services/cvm/resource_tc_instance.go
+++ b/tencentcloud/services/cvm/resource_tc_instance.go
@@ -1086,7 +1086,7 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
tmpDataDisks = v.([]interface{})
}
- for index, disk := range instance.DataDisks {
+ for _, disk := range instance.DataDisks {
dataDisk := make(map[string]interface{}, 5)
dataDisk["data_disk_id"] = disk.DiskId
if disk.DiskId == nil {
@@ -1095,15 +1095,6 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
dataDisk["data_disk_size"] = size
}
- 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
- }
- }
-
dataDisk["data_disk_type"] = disk.DiskType
dataDisk["data_disk_snapshot_id"] = disk.SnapshotId
dataDisk["delete_with_instance"] = disk.DeleteWithInstance
@@ -1120,7 +1111,16 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
})
}
- // get data disk name
+ // set data disk delete_with_instance_prepaid
+ for i := range dataDiskList {
+ dataDiskList[i]["delete_with_instance_prepaid"] = false
+ 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)
@@ -1329,6 +1329,18 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta 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
+ 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)
From c47f492191bfa8cf6b42bb08521de491571de13e Mon Sep 17 00:00:00 2001
From: SevenEarth <391613297@qq.com>
Date: Wed, 18 Dec 2024 17:35:09 +0800
Subject: [PATCH 13/13] add
---
.../services/cvm/resource_tc_instance.go | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)
diff --git a/tencentcloud/services/cvm/resource_tc_instance.go b/tencentcloud/services/cvm/resource_tc_instance.go
index dea57865c9..e5808bfd56 100644
--- a/tencentcloud/services/cvm/resource_tc_instance.go
+++ b/tencentcloud/services/cvm/resource_tc_instance.go
@@ -1114,9 +1114,11 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
// set data disk delete_with_instance_prepaid
for i := range dataDiskList {
dataDiskList[i]["delete_with_instance_prepaid"] = false
- tmpDataDisk := tmpDataDisks[i].(map[string]interface{})
- if deleteWithInstancePrepaidBool, ok := tmpDataDisk["delete_with_instance_prepaid"].(bool); ok {
- dataDiskList[i]["delete_with_instance_prepaid"] = deleteWithInstancePrepaidBool
+ 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
+ }
}
}
@@ -1334,9 +1336,11 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
tmpDataDisks := v.([]interface{})
for i := range tmpDataDisks {
dataDiskList[i]["delete_with_instance_prepaid"] = false
- tmpDataDisk := tmpDataDisks[i].(map[string]interface{})
- if deleteWithInstancePrepaidBool, ok := tmpDataDisk["delete_with_instance_prepaid"].(bool); ok {
- dataDiskList[i]["delete_with_instance_prepaid"] = deleteWithInstancePrepaidBool
+ 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
+ }
}
}
}