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 + } } } }