From ac87363a113fe186401935605d60348eb591e03d Mon Sep 17 00:00:00 2001
From: SevenEarth <391613297@qq.com>
Date: Thu, 23 May 2024 17:26:32 +0800
Subject: [PATCH 1/8] add
---
tencentcloud/services/cvm/1.go | 503 ++++++++++++++++++
.../cvm/resource_tc_cvm_renew_instance.go | 65 ++-
...source_tc_cvm_security_group_attachment.go | 134 +++--
...cvm_security_group_attachment_extension.go | 31 ++
.../cvm/resource_tc_cvm_sync_image.go | 73 +--
.../resource_tc_cvm_sync_image_extension.go | 22 +
.../services/cvm/resource_tc_eip_extension.go | 161 ++++++
.../docs/r/cvm_renew_instance.html.markdown | 13 +-
...vm_security_group_attachment.html.markdown | 4 +-
9 files changed, 881 insertions(+), 125 deletions(-)
create mode 100644 tencentcloud/services/cvm/1.go
create mode 100644 tencentcloud/services/cvm/resource_tc_cvm_security_group_attachment_extension.go
create mode 100644 tencentcloud/services/cvm/resource_tc_cvm_sync_image_extension.go
create mode 100644 tencentcloud/services/cvm/resource_tc_eip_extension.go
diff --git a/tencentcloud/services/cvm/1.go b/tencentcloud/services/cvm/1.go
new file mode 100644
index 0000000000..ecdefd3af3
--- /dev/null
+++ b/tencentcloud/services/cvm/1.go
@@ -0,0 +1,503 @@
+package cvm
+
+//
+//import (
+// "context"
+// "fmt"
+// "log"
+//
+// "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
+// "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+// vpc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312"
+//
+// tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
+// "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
+//)
+//
+//func ResourceTencentCloudEip() *schema.Resource {
+// return &schema.Resource{
+// Create: resourceTencentCloudEipCreate,
+// Read: resourceTencentCloudEipRead,
+// Update: resourceTencentCloudEipUpdate,
+// Delete: resourceTencentCloudEipDelete,
+// Importer: &schema.ResourceImporter{
+// State: schema.ImportStatePassthrough,
+// },
+// Schema: map[string]*schema.Schema{
+// "anti_ddos_package_id": {
+// Type: schema.TypeString,
+// Optional: true,
+// Computed: true,
+// Description: "ID of anti DDos package, it must set when `type` is `AntiDDoSEIP`.",
+// },
+//
+// "anycast_zone": {
+// Type: schema.TypeString,
+// Optional: true,
+// ForceNew: true,
+// Description: "The zone of anycast. Valid value: `ANYCAST_ZONE_GLOBAL` and `ANYCAST_ZONE_OVERSEAS`.",
+// },
+//
+// "applicable_for_clb": {
+// Type: schema.TypeBool,
+// Optional: true,
+// Description: "Indicates whether the anycast eip can be associated to a CLB.",
+// Deprecated: "It has been deprecated from version 1.27.0.",
+// },
+//
+// "auto_renew_flag": {
+// Type: schema.TypeInt,
+// Optional: true,
+// Description: "Auto renew flag. 0 - default state (manual renew); 1 - automatic renew; 2 - explicit no automatic renew. NOTES: Only supported prepaid EIP.",
+// },
+//
+// "bandwidth_package_id": {
+// Type: schema.TypeString,
+// Optional: true,
+// Computed: true,
+// Description: "ID of bandwidth package, it will set when `internet_charge_type` is `BANDWIDTH_PACKAGE`.",
+// },
+//
+// "egress": {
+// Type: schema.TypeString,
+// Optional: true,
+// Computed: true,
+// Description: "Network egress. It defaults to `center_egress1`. If you want to try the egress feature, please [submit a ticket](https://console.cloud.tencent.com/workorder/category).",
+// },
+//
+// "internet_charge_type": {
+// Type: schema.TypeString,
+// Optional: true,
+// Computed: true,
+// Description: "The charge type of eip. Valid values: `BANDWIDTH_PACKAGE`, `BANDWIDTH_POSTPAID_BY_HOUR`, `BANDWIDTH_PREPAID_BY_MONTH` and `TRAFFIC_POSTPAID_BY_HOUR`.",
+// },
+//
+// "internet_max_bandwidth_out": {
+// Type: schema.TypeInt,
+// Optional: true,
+// Computed: true,
+// Description: "The bandwidth limit of EIP, unit is Mbps.",
+// },
+//
+// "internet_service_provider": {
+// Type: schema.TypeString,
+// Optional: true,
+// ForceNew: true,
+// Description: "Internet service provider of eip. Valid value: `BGP`, `CMCC`, `CTCC` and `CUCC`.",
+// },
+//
+// "name": {
+// Type: schema.TypeString,
+// Optional: true,
+// Computed: true,
+// Description: "The name of eip.",
+// },
+//
+// "prepaid_period": {
+// Type: schema.TypeInt,
+// Optional: true,
+// Description: "Period of instance. Default value: `1`. Valid value: `1`, `2`, `3`, `4`, `6`, `7`, `8`, `9`, `12`, `24`, `36`. NOTES: must set when `internet_charge_type` is `BANDWIDTH_PREPAID_BY_MONTH`.",
+// },
+//
+// "public_ip": {
+// Type: schema.TypeString,
+// Computed: true,
+// Description: "The elastic IP address.",
+// },
+//
+// "status": {
+// Type: schema.TypeString,
+// Computed: true,
+// Description: "The EIP current status.",
+// },
+//
+// "tags": {
+// Type: schema.TypeMap,
+// Optional: true,
+// Description: "The tags of eip.",
+// },
+//
+// "type": {
+// Type: schema.TypeString,
+// Optional: true,
+// ForceNew: true,
+// Default: "EIP",
+// Description: "The type of eip. Valid value: `EIP` and `AnycastEIP` and `HighQualityEIP` and `AntiDDoSEIP`. Default is `EIP`.",
+// },
+// },
+// }
+//}
+//
+//func resourceTencentCloudEipCreate(d *schema.ResourceData, meta interface{}) error {
+// defer tccommon.LogElapsed("resource.tencentcloud_eip.create")()
+// defer tccommon.InconsistentCheck(d, meta)()
+//
+// logId := tccommon.GetLogId(tccommon.ContextNil)
+//
+// ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
+//
+// var (
+// eipId string
+// )
+// var (
+// request = vpc.NewAllocateAddressesRequest()
+// response = vpc.NewAllocateAddressesResponse()
+// )
+//
+// if v, ok := d.GetOk("internet_service_provider"); ok {
+// request.InternetServiceProvider = helper.String(v.(string))
+// }
+//
+// if v, ok := d.GetOk("internet_charge_type"); ok {
+// request.InternetChargeType = helper.String(v.(string))
+// }
+//
+// if v, ok := d.GetOkExists("internet_max_bandwidth_out"); ok {
+// request.InternetMaxBandwidthOut = helper.IntInt64(v.(int))
+// }
+//
+// if v, ok := d.GetOk("type"); ok {
+// request.AddressType = helper.String(v.(string))
+// }
+//
+// if v, ok := d.GetOk("anycast_zone"); ok {
+// request.AnycastZone = helper.String(v.(string))
+// }
+//
+// if v, ok := d.GetOk("tags"); ok {
+// for _, item := range v.([]interface{}) {
+// tagsMap := item.(map[string]interface{})
+// tag := vpc.Tag{}
+// if v, ok := tagsMap["key"]; ok {
+// tag.Key = helper.String(v.(string))
+// }
+// if v, ok := tagsMap["value"]; ok {
+// tag.Value = helper.String(v.(string))
+// }
+// request.Tags = append(request.Tags, &tag)
+// }
+// }
+//
+// if v, ok := d.GetOk("bandwidth_package_id"); ok {
+// request.BandwidthPackageId = helper.String(v.(string))
+// }
+//
+// if v, ok := d.GetOk("name"); ok {
+// request.AddressName = helper.String(v.(string))
+// }
+//
+// if v, ok := d.GetOk("egress"); ok {
+// request.Egress = helper.String(v.(string))
+// }
+//
+// if v, ok := d.GetOk("anti_ddos_package_id"); ok {
+// request.AntiDDoSPackageId = helper.String(v.(string))
+// }
+//
+// if err := resourceTencentCloudEipCreatePostFillRequest0(ctx, request); err != nil {
+// return err
+// }
+//
+// err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
+// result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().AllocateAddressesWithContext(ctx, request)
+// if e != nil {
+// return tccommon.RetryError(e)
+// } else {
+// log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
+// }
+// response = result
+// return nil
+// })
+// if err != nil {
+// log.Printf("[CRITAL]%s create eip failed, reason:%+v", logId, err)
+// return err
+// }
+//
+// eipId = *response.Response.AddressSet[0]
+//
+// if err := resourceTencentCloudEipCreatePostHandleResponse0(ctx, response); err != nil {
+// return err
+// }
+//
+// d.SetId(eipId)
+//
+// return resourceTencentCloudEipRead(d, meta)
+//}
+//
+//func resourceTencentCloudEipRead(d *schema.ResourceData, meta interface{}) error {
+// defer tccommon.LogElapsed("resource.tencentcloud_eip.read")()
+// defer tccommon.InconsistentCheck(d, meta)()
+//
+// logId := tccommon.GetLogId(tccommon.ContextNil)
+//
+// ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
+//
+// service := VpcService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
+//
+// eipId := d.Id()
+//
+// respData, err := service.DescribeEipById(ctx, eipId)
+// if err != nil {
+// return err
+// }
+//
+// if respData == nil {
+// d.SetId("")
+// log.Printf("[WARN]%s resource `eip` [%s] not found, please check if it has been deleted.\n", logId, d.Id())
+// return nil
+// }
+// if respData.AddressId != nil {
+// _ = d.Set("address_id", respData.AddressId)
+// eipId = *respData.AddressId
+// }
+//
+// if respData.AddressName != nil {
+// _ = d.Set("name", respData.AddressName)
+// }
+//
+// if respData.AddressStatus != nil {
+// _ = d.Set("status", respData.AddressStatus)
+// }
+//
+// if respData.AddressIp != nil {
+// _ = d.Set("public_ip", respData.AddressIp)
+// }
+//
+// if respData.AddressType != nil {
+// _ = d.Set("type", respData.AddressType)
+// }
+//
+// if respData.InternetServiceProvider != nil {
+// _ = d.Set("internet_service_provider", respData.InternetServiceProvider)
+// }
+//
+// if respData.LocalBgp != nil {
+// _ = d.Set("local_bgp", respData.LocalBgp)
+// }
+//
+// if respData.Bandwidth != nil {
+// _ = d.Set("internet_max_bandwidth_out", respData.Bandwidth)
+// }
+//
+// if respData.InternetChargeType != nil {
+// _ = d.Set("internet_charge_type", respData.InternetChargeType)
+// }
+//
+// if respData.Egress != nil {
+// _ = d.Set("egress", respData.Egress)
+// }
+//
+// if respData.AntiDDoSPackageId != nil {
+// _ = d.Set("anti_ddos_package_id", respData.AntiDDoSPackageId)
+// }
+//
+// if respData.BandwidthPackageId != nil {
+// _ = d.Set("bandwidth_package_id", respData.BandwidthPackageId)
+// }
+//
+// return nil
+//}
+//
+//func resourceTencentCloudEipUpdate(d *schema.ResourceData, meta interface{}) error {
+// defer tccommon.LogElapsed("resource.tencentcloud_eip.update")()
+// defer tccommon.InconsistentCheck(d, meta)()
+//
+// logId := tccommon.GetLogId(tccommon.ContextNil)
+//
+// ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
+//
+// immutableArgs := []string{"anti_ddos_package_id", "applicable_for_clb", "auto_renew_flag", "bandwidth_package_id", "egress", "prepaid_period", "tags"}
+// for _, v := range immutableArgs {
+// if d.HasChange(v) {
+// return fmt.Errorf("argument `%s` cannot be changed", v)
+// }
+// }
+// eipId := d.Id()
+//
+// needChange := false
+// mutableArgs := []string{"name"}
+// for _, v := range mutableArgs {
+// if d.HasChange(v) {
+// needChange = true
+// break
+// }
+// }
+//
+// if needChange {
+// request := vpc.NewModifyAddressAttributeRequest()
+//
+// request.AddressId = helper.String(eipId)
+//
+// if v, ok := d.GetOk("name"); ok {
+// request.AddressName = helper.String(v.(string))
+// }
+//
+// err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
+// result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().ModifyAddressAttributeWithContext(ctx, request)
+// if e != nil {
+// return tccommon.RetryError(e)
+// } else {
+// log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
+// }
+// return nil
+// })
+// if err != nil {
+// log.Printf("[CRITAL]%s update eip failed, reason:%+v", logId, err)
+// return err
+// }
+// }
+//
+// needChange1 := false
+// mutableArgs1 := []string{"internet_charge_type", "internet_max_bandwidth_out"}
+// for _, v := range mutableArgs1 {
+// if d.HasChange(v) {
+// needChange1 = true
+// break
+// }
+// }
+//
+// if needChange1 {
+// request1 := vpc.NewModifyAddressInternetChargeTypeRequest()
+//
+// request1.AddressId = helper.String(eipId)
+//
+// if v, ok := d.GetOk("internet_charge_type"); ok {
+// request1.InternetChargeType = helper.String(v.(string))
+// }
+//
+// if v, ok := d.GetOkExists("internet_max_bandwidth_out"); ok {
+// request1.InternetMaxBandwidthOut = helper.IntUint64(v.(int))
+// }
+//
+// if err := resourceTencentCloudEipUpdatePostFillRequest1(ctx, request1); err != nil {
+// return err
+// }
+//
+// err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
+// result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().ModifyAddressInternetChargeTypeWithContext(ctx, request1)
+// if e != nil {
+// return tccommon.RetryError(e)
+// } else {
+// log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request1.GetAction(), request1.ToJsonString(), result.ToJsonString())
+// }
+// return nil
+// })
+// if err != nil {
+// log.Printf("[CRITAL]%s update eip failed, reason:%+v", logId, err)
+// return err
+// }
+// }
+//
+// needChange2 := false
+// mutableArgs2 := []string{"internet_max_bandwidth_out"}
+// for _, v := range mutableArgs2 {
+// if d.HasChange(v) {
+// needChange2 = true
+// break
+// }
+// }
+//
+// if needChange2 {
+// request2 := vpc.NewModifyAddressesBandwidthRequest()
+//
+// request2.AddressIds = []*string{helper.String(eipId)}
+//
+// if v, ok := d.GetOkExists("internet_max_bandwidth_out"); ok {
+// request2.InternetMaxBandwidthOut = helper.IntInt64(v.(int))
+// }
+//
+// err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
+// result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().ModifyAddressesBandwidthWithContext(ctx, request2)
+// if e != nil {
+// return tccommon.RetryError(e)
+// } else {
+// log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request2.GetAction(), request2.ToJsonString(), result.ToJsonString())
+// }
+// return nil
+// })
+// if err != nil {
+// log.Printf("[CRITAL]%s update eip failed, reason:%+v", logId, err)
+// return err
+// }
+// }
+//
+// needChange3 := false
+// mutableArgs3 := []string{}
+// for _, v := range mutableArgs3 {
+// if d.HasChange(v) {
+// needChange3 = true
+// break
+// }
+// }
+//
+// if needChange3 {
+// request3 := vpc.NewRenewAddressesRequest()
+//
+// request3.AddressIds = []*string{helper.String(eipId)}
+//
+// if err := resourceTencentCloudEipUpdatePostFillRequest3(ctx, request3); err != nil {
+// return err
+// }
+//
+// err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
+// result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().RenewAddressesWithContext(ctx, request3)
+// if e != nil {
+// return tccommon.RetryError(e)
+// } else {
+// log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request3.GetAction(), request3.ToJsonString(), result.ToJsonString())
+// }
+// return nil
+// })
+// if err != nil {
+// log.Printf("[CRITAL]%s update eip failed, reason:%+v", logId, err)
+// return err
+// }
+// }
+//
+// _ = eipId
+// return resourceTencentCloudEipRead(d, meta)
+//}
+//
+//func resourceTencentCloudEipDelete(d *schema.ResourceData, meta interface{}) error {
+// defer tccommon.LogElapsed("resource.tencentcloud_eip.delete")()
+// defer tccommon.InconsistentCheck(d, meta)()
+//
+// logId := tccommon.GetLogId(tccommon.ContextNil)
+// ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
+//
+// eipId := d.Id()
+//
+// var (
+// request = vpc.NewReleaseAddressesRequest()
+// response = vpc.NewReleaseAddressesResponse()
+// )
+//
+// request.AddressIds = []*string{helper.String(eipId)}
+//
+// if err := resourceTencentCloudEipDeletePostFillRequest0(ctx, request); err != nil {
+// return err
+// }
+//
+// err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
+// result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().ReleaseAddressesWithContext(ctx, request)
+// if e != nil {
+// return tccommon.RetryError(e)
+// } else {
+// log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
+// }
+// response = result
+// return nil
+// })
+// if err != nil {
+// log.Printf("[CRITAL]%s create eip failed, reason:%+v", logId, err)
+// return err
+// }
+//
+// _ = response
+// if err := resourceTencentCloudEipDeletePostHandleResponse0(ctx, response); err != nil {
+// return err
+// }
+//
+// _ = eipId
+// return nil
+//}
diff --git a/tencentcloud/services/cvm/resource_tc_cvm_renew_instance.go b/tencentcloud/services/cvm/resource_tc_cvm_renew_instance.go
index 37758c7f76..ac982d00d7 100644
--- a/tencentcloud/services/cvm/resource_tc_cvm_renew_instance.go
+++ b/tencentcloud/services/cvm/resource_tc_cvm_renew_instance.go
@@ -1,14 +1,14 @@
package cvm
import (
+ "context"
"log"
- tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
-
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
)
@@ -17,19 +17,18 @@ func ResourceTencentCloudCvmRenewInstance() *schema.Resource {
Create: resourceTencentCloudCvmRenewInstanceCreate,
Read: resourceTencentCloudCvmRenewInstanceRead,
Delete: resourceTencentCloudCvmRenewInstanceDelete,
-
Schema: map[string]*schema.Schema{
"instance_id": {
+ Type: schema.TypeString,
Required: true,
ForceNew: true,
- Type: schema.TypeString,
- Description: "Instance ID.",
+ Description: "Instance ID. To obtain the instance IDs, you can call DescribeInstances and look for InstanceId in the response.",
},
"instance_charge_prepaid": {
+ Type: schema.TypeList,
Optional: true,
ForceNew: true,
- Type: schema.TypeList,
MaxItems: 1,
Description: "Prepaid mode, that is, yearly and monthly subscription related parameter settings. Through this parameter, you can specify the renewal duration of the Subscription instance, whether to set automatic renewal, and other attributes. For yearly and monthly subscription instances, this parameter is required.",
Elem: &schema.Resource{
@@ -40,26 +39,19 @@ func ResourceTencentCloudCvmRenewInstance() *schema.Resource {
Description: "Subscription period; unit: month; valid values: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 24, 36, 48, 60. Note: This field may return null, indicating that no valid value is found.",
},
"renew_flag": {
- Type: schema.TypeString,
- Optional: true,
- Description: "Auto renewal flag. Valid values:\n" +
- "- `NOTIFY_AND_AUTO_RENEW`: notify upon expiration and renew automatically;\n" +
- "- `NOTIFY_AND_MANUAL_RENEW`: notify upon expiration but do not renew automatically;\n" +
- "- `DISABLE_NOTIFY_AND_MANUAL_RENEW`: neither notify upon expiration nor renew automatically;\n" +
- "Default value: NOTIFY_AND_MANUAL_RENEW. If this parameter is specified as NOTIFY_AND_AUTO_RENEW, the instance will be automatically renewed on a monthly basis if the account balance is sufficient. Note: This field may return null, indicating that no valid value is found.",
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "Auto renewal flag. Valid values:
NOTIFY_AND_AUTO_RENEW: notify upon expiration and renew automatically
NOTIFY_AND_MANUAL_RENEW: notify upon expiration but do not renew automatically
DISABLE_NOTIFY_AND_MANUAL_RENEW: neither notify upon expiration nor renew automatically
Default value: NOTIFY_AND_MANUAL_RENEW. If this parameter is specified as NOTIFY_AND_AUTO_RENEW, the instance will be automatically renewed on a monthly basis if the account balance is sufficient. Note: This field may return null, indicating that no valid value is found.",
},
},
},
},
"renew_portable_data_disk": {
- Optional: true,
- ForceNew: true,
- Type: schema.TypeBool,
- Description: "Whether to renew the elastic data disk. Valid values:\n" +
- "- `TRUE`: Indicates to renew the subscription instance and renew the attached elastic data disk at the same time\n" +
- "- `FALSE`: Indicates that the subscription instance will be renewed and the elastic data disk attached to it will not be renewed\n" +
- "Default value: TRUE.",
+ Type: schema.TypeBool,
+ Optional: true,
+ ForceNew: true,
+ Description: "Whether to renew the elastic data disk. Valid values:
TRUE: Indicates to renew the subscription instance and renew the attached elastic data disk at the same time
FALSE: Indicates that the subscription instance will be renewed and the elastic data disk attached to it will not be renewed
Default value: TRUE.",
},
},
}
@@ -71,39 +63,54 @@ func resourceTencentCloudCvmRenewInstanceCreate(d *schema.ResourceData, meta int
logId := tccommon.GetLogId(tccommon.ContextNil)
- request := cvm.NewRenewInstancesRequest()
- instanceId := d.Get("instance_id").(string)
- request.InstanceIds = []*string{&instanceId}
+ ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
- if dMap, ok := helper.InterfacesHeadMap(d, "instance_charge_prepaid"); ok {
+ var (
+ instanceId string
+ )
+ var (
+ request = cvm.NewRenewInstancesRequest()
+ response = cvm.NewRenewInstancesResponse()
+ )
+
+ if v, ok := d.GetOk("instance_id"); ok {
+ instanceId = v.(string)
+ }
+
+ request.InstanceIds = []*string{helper.String(instanceId)}
+
+ if instanceChargePrepaidMap, ok := helper.InterfacesHeadMap(d, "instance_charge_prepaid"); ok {
instanceChargePrepaid := cvm.InstanceChargePrepaid{}
- if v, ok := dMap["period"]; ok {
+ if v, ok := instanceChargePrepaidMap["period"]; ok {
instanceChargePrepaid.Period = helper.IntInt64(v.(int))
}
- if v, ok := dMap["renew_flag"]; ok && v.(string) != "" {
+ if v, ok := instanceChargePrepaidMap["renew_flag"]; ok {
instanceChargePrepaid.RenewFlag = helper.String(v.(string))
}
request.InstanceChargePrepaid = &instanceChargePrepaid
}
- if v, _ := d.GetOk("renew_portable_data_disk"); v != nil {
+ if v, ok := d.GetOkExists("renew_portable_data_disk"); ok {
request.RenewPortableDataDisk = helper.Bool(v.(bool))
}
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
- result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCvmClient().RenewInstances(request)
+ result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCvmClient().RenewInstancesWithContext(ctx, request)
if e != nil {
return tccommon.RetryError(e)
} else {
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
}
+ response = result
return nil
})
if err != nil {
- log.Printf("[CRITAL]%s operate cvm renewInstance failed, reason:%+v", logId, err)
+ log.Printf("[CRITAL]%s create cvm renew instance failed, reason:%+v", logId, err)
return err
}
+ _ = response
+
d.SetId(instanceId)
return resourceTencentCloudCvmRenewInstanceRead(d, meta)
diff --git a/tencentcloud/services/cvm/resource_tc_cvm_security_group_attachment.go b/tencentcloud/services/cvm/resource_tc_cvm_security_group_attachment.go
index 03029e0940..93209e0473 100644
--- a/tencentcloud/services/cvm/resource_tc_cvm_security_group_attachment.go
+++ b/tencentcloud/services/cvm/resource_tc_cvm_security_group_attachment.go
@@ -6,11 +6,12 @@ import (
"log"
"strings"
- tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
-
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
+
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
+ "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
)
func ResourceTencentCloudCvmSecurityGroupAttachment() *schema.Resource {
@@ -23,17 +24,17 @@ func ResourceTencentCloudCvmSecurityGroupAttachment() *schema.Resource {
},
Schema: map[string]*schema.Schema{
"security_group_id": {
+ Type: schema.TypeString,
Required: true,
ForceNew: true,
- Type: schema.TypeString,
- Description: "Security group id.",
+ Description: "ID of the security group to be associated, such as sg-efil73jd. Only one security group can be associated.",
},
"instance_id": {
+ Type: schema.TypeString,
Required: true,
ForceNew: true,
- Type: schema.TypeString,
- Description: "Instance id.",
+ Description: "Instance ID. To obtain the instance IDs, you can call DescribeInstances and look for InstanceId in the response.",
},
},
}
@@ -45,28 +46,46 @@ func resourceTencentCloudCvmSecurityGroupAttachmentCreate(d *schema.ResourceData
logId := tccommon.GetLogId(tccommon.ContextNil)
- request := cvm.NewAssociateSecurityGroupsRequest()
- securityGroupId := d.Get("security_group_id").(string)
- instanceId := d.Get("instance_id").(string)
- request.SecurityGroupIds = []*string{}
+ ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
+
+ var (
+ instanceId string
+ securityGroupId string
+ )
+ var (
+ request = cvm.NewAssociateSecurityGroupsRequest()
+ response = cvm.NewAssociateSecurityGroupsResponse()
+ )
+
+ if v, ok := d.GetOk("instance_id"); ok {
+ instanceId = v.(string)
+ }
+ if v, ok := d.GetOk("security_group_id"); ok {
+ securityGroupId = v.(string)
+ }
+
+ request.SecurityGroupIds = []*string{helper.String(securityGroupId)}
- request.SecurityGroupIds = []*string{&securityGroupId}
- request.InstanceIds = []*string{&instanceId}
+ request.InstanceIds = []*string{helper.String(instanceId)}
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
- result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCvmClient().AssociateSecurityGroups(request)
+ result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCvmClient().AssociateSecurityGroupsWithContext(ctx, request)
if e != nil {
return tccommon.RetryError(e)
} else {
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
}
+ response = result
return nil
})
if err != nil {
- log.Printf("[CRITAL]%s create cvm securityGroupAttachment failed, reason:%+v", logId, err)
+ log.Printf("[CRITAL]%s create cvm security group attachment failed, reason:%+v", logId, err)
return err
}
- d.SetId(instanceId + tccommon.FILED_SP + securityGroupId)
+
+ _ = response
+
+ d.SetId(strings.Join([]string{instanceId, securityGroupId}, tccommon.FILED_SP))
return resourceTencentCloudCvmSecurityGroupAttachmentRead(d, meta)
}
@@ -75,39 +94,39 @@ func resourceTencentCloudCvmSecurityGroupAttachmentRead(d *schema.ResourceData,
defer tccommon.LogElapsed("resource.tencentcloud_cvm_security_group_attachment.read")()
defer tccommon.InconsistentCheck(d, meta)()
- logId := tccommon.GetLogId(tccommon.ContextNil)
-
- ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
-
- service := CvmService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
-
- idSplit := strings.Split(d.Id(), tccommon.FILED_SP)
- if len(idSplit) != 2 {
- return fmt.Errorf("id is broken,%s", d.Id())
- }
- instanceId := idSplit[0]
- securityGroupId := idSplit[1]
-
- instanceInfo, err := service.DescribeInstanceById(ctx, instanceId)
- if err != nil {
- return err
- }
-
- if instanceInfo == nil {
- d.SetId("")
- log.Printf("[WARN]%s resource `CvmSecurityGroupAttachment` [%s] not found, please check if it has been deleted.\n", logId, d.Id())
- return nil
- }
-
- for _, sgId := range instanceInfo.SecurityGroupIds {
- if *sgId == securityGroupId {
- _ = d.Set("instance_id", instanceId)
- _ = d.Set("security_group_id", securityGroupId)
- return nil
-
- }
- }
- return fmt.Errorf("The security group get from api does not match with current instance %v", d.Id())
+ //logId := tccommon.GetLogId(tccommon.ContextNil)
+ //
+ //ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
+ //
+ //service := CvmService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
+ //
+ //idSplit := strings.Split(d.Id(), tccommon.FILED_SP)
+ //if len(idSplit) != 2 {
+ // return fmt.Errorf("id is broken,%s", d.Id())
+ //}
+ //instanceId := idSplit[0]
+ //securityGroupId := idSplit[1]
+ //
+ //_ = d.Set("instance_id", instanceId)
+ //
+ //_ = d.Set("security_group_id", securityGroupId)
+
+ //respData, err := service.DescribeCvmSecurityGroupAttachmentById(ctx, instanceId)
+ //if err != nil {
+ // return err
+ //}
+ //
+ //if respData == nil {
+ // d.SetId("")
+ // log.Printf("[WARN]%s resource `cvm_security_group_attachment` [%s] not found, please check if it has been deleted.\n", logId, d.Id())
+ // return nil
+ //}
+ //if err := resourceTencentCloudCvmSecurityGroupAttachmentReadPostHandleResponse0(ctx, respData); err != nil {
+ // return err
+ //}
+ //
+ //_ = securityGroupId
+ return nil
}
func resourceTencentCloudCvmSecurityGroupAttachmentDelete(d *schema.ResourceData, meta interface{}) error {
@@ -115,6 +134,7 @@ func resourceTencentCloudCvmSecurityGroupAttachmentDelete(d *schema.ResourceData
defer tccommon.InconsistentCheck(d, meta)()
logId := tccommon.GetLogId(tccommon.ContextNil)
+ ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
idSplit := strings.Split(d.Id(), tccommon.FILED_SP)
if len(idSplit) != 2 {
@@ -123,22 +143,30 @@ func resourceTencentCloudCvmSecurityGroupAttachmentDelete(d *schema.ResourceData
instanceId := idSplit[0]
securityGroupId := idSplit[1]
- request := cvm.NewDisassociateSecurityGroupsRequest()
- request.SecurityGroupIds = []*string{&securityGroupId}
- request.InstanceIds = []*string{&instanceId}
+ var (
+ request = cvm.NewDisassociateSecurityGroupsRequest()
+ response = cvm.NewDisassociateSecurityGroupsResponse()
+ )
+
+ request.SecurityGroupIds = []*string{helper.String(securityGroupId)}
+
+ request.InstanceIds = []*string{helper.String(instanceId)}
+
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
- result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCvmClient().DisassociateSecurityGroups(request)
+ result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCvmClient().DisassociateSecurityGroupsWithContext(ctx, request)
if e != nil {
return tccommon.RetryError(e)
} else {
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
}
+ response = result
return nil
})
if err != nil {
- log.Printf("[CRITAL]%s delete cvm securityGroupAttachment failed, reason:%+v", logId, err)
+ log.Printf("[CRITAL]%s create cvm security group attachment failed, reason:%+v", logId, err)
return err
}
+ _ = response
return nil
}
diff --git a/tencentcloud/services/cvm/resource_tc_cvm_security_group_attachment_extension.go b/tencentcloud/services/cvm/resource_tc_cvm_security_group_attachment_extension.go
new file mode 100644
index 0000000000..a2716f21c0
--- /dev/null
+++ b/tencentcloud/services/cvm/resource_tc_cvm_security_group_attachment_extension.go
@@ -0,0 +1,31 @@
+package cvm
+
+import (
+ "context"
+ "fmt"
+ cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
+ "strings"
+)
+
+func resourceTencentCloudCvmSecurityGroupAttachmentReadPostHandleResponse0(ctx context.Context, resp *cvm.Instance) error {
+ d := tccommon.ResourceDataFromContext(ctx)
+ idSplit := strings.Split(d.Id(), tccommon.FILED_SP)
+ if len(idSplit) != 2 {
+ return fmt.Errorf("id is broken,%s", d.Id())
+ }
+ instanceId := idSplit[0]
+ securityGroupId := idSplit[1]
+
+ for _, sgId := range resp.SecurityGroupIds {
+ if *sgId == securityGroupId {
+ _ = d.Set("instance_id", instanceId)
+ _ = d.Set("security_group_id", securityGroupId)
+ return nil
+ }
+ }
+
+ _ = d.Set("instance_id", nil)
+ _ = d.Set("security_group_id", nil)
+ return nil
+}
diff --git a/tencentcloud/services/cvm/resource_tc_cvm_sync_image.go b/tencentcloud/services/cvm/resource_tc_cvm_sync_image.go
index 7ae8f57767..555f5021f3 100644
--- a/tencentcloud/services/cvm/resource_tc_cvm_sync_image.go
+++ b/tencentcloud/services/cvm/resource_tc_cvm_sync_image.go
@@ -1,15 +1,14 @@
package cvm
import (
+ "context"
"log"
- "time"
-
- tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
)
@@ -20,41 +19,41 @@ func ResourceTencentCloudCvmSyncImage() *schema.Resource {
Delete: resourceTencentCloudCvmSyncImageDelete,
Schema: map[string]*schema.Schema{
- "image_id": {
+ "destination_regions": {
+ Type: schema.TypeSet,
Required: true,
ForceNew: true,
- Type: schema.TypeString,
- Description: "Image ID. The specified image must meet the following requirement: the images must be in the `NORMAL` state.",
- },
-
- "destination_regions": {
- Required: true,
- ForceNew: true,
- Type: schema.TypeSet,
+ Description: "List of destination regions for synchronization. Limits: It must be a valid region. For a custom image, the destination region cannot be the source region. For a shared image, the destination region must be the source region, which indicates to create a copy of the image as a custom image in the same region.",
Elem: &schema.Schema{
Type: schema.TypeString,
},
- Description: "List of destination regions for synchronization. Limits: It must be a valid region. For a custom image, the destination region cannot be the source region. For a shared image, the destination region must be the source region, which indicates to create a copy of the image as a custom image in the same region.",
},
"dry_run": {
+ Type: schema.TypeBool,
Optional: true,
ForceNew: true,
- Type: schema.TypeBool,
Description: "Checks whether image synchronization can be initiated.",
},
+ "image_id": {
+ Type: schema.TypeString,
+ Required: true,
+ ForceNew: true,
+ Description: "Image ID. The specified image must meet the following requirement: the images must be in the `NORMAL` state.",
+ },
+
"image_name": {
+ Type: schema.TypeString,
Optional: true,
ForceNew: true,
- Type: schema.TypeString,
Description: "Destination image name.",
},
"image_set_required": {
+ Type: schema.TypeBool,
Optional: true,
ForceNew: true,
- Type: schema.TypeBool,
Description: "Whether to return the ID of image created in the destination region.",
},
},
@@ -66,19 +65,32 @@ func resourceTencentCloudCvmSyncImageCreate(d *schema.ResourceData, meta interfa
defer tccommon.InconsistentCheck(d, meta)()
logId := tccommon.GetLogId(tccommon.ContextNil)
- request := cvm.NewSyncImagesRequest()
- imageId := d.Get("image_id").(string)
- request.ImageIds = []*string{&imageId}
+
+ ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
+
+ var (
+ imageId string
+ )
+ var (
+ request = cvm.NewSyncImagesRequest()
+ response = cvm.NewSyncImagesResponse()
+ )
+
+ if v, ok := d.GetOk("image_id"); ok {
+ imageId = v.(string)
+ }
+
+ request.ImageIds = []*string{helper.String(imageId)}
if v, ok := d.GetOk("destination_regions"); ok {
destinationRegionsSet := v.(*schema.Set).List()
for i := range destinationRegionsSet {
destinationRegions := destinationRegionsSet[i].(string)
- request.DestinationRegions = append(request.DestinationRegions, &destinationRegions)
+ request.DestinationRegions = append(request.DestinationRegions, helper.String(destinationRegions))
}
}
- if v, _ := d.GetOk("dry_run"); v != nil {
+ if v, ok := d.GetOkExists("dry_run"); ok {
request.DryRun = helper.Bool(v.(bool))
}
@@ -86,34 +98,33 @@ func resourceTencentCloudCvmSyncImageCreate(d *schema.ResourceData, meta interfa
request.ImageName = helper.String(v.(string))
}
- if v, _ := d.GetOk("image_set_required"); v != nil {
+ if v, ok := d.GetOkExists("image_set_required"); ok {
request.ImageSetRequired = helper.Bool(v.(bool))
}
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
- result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCvmClient().SyncImages(request)
+ result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCvmClient().SyncImagesWithContext(ctx, request)
if e != nil {
return tccommon.RetryError(e)
} else {
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
}
+ response = result
return nil
})
if err != nil {
- log.Printf("[CRITAL]%s operate cvm syncImages failed, reason:%+v", logId, err)
+ log.Printf("[CRITAL]%s create cvm sync image failed, reason:%+v", logId, err)
return err
}
- d.SetId(imageId)
-
- service := CvmService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
+ _ = response
- conf := tccommon.BuildStateChangeConf([]string{}, []string{"NORMAL"}, 20*tccommon.ReadRetryTimeout, time.Second, service.CvmSyncImagesStateRefreshFunc(d.Id(), []string{}))
-
- if _, e := conf.WaitForState(); e != nil {
- return e
+ if err := resourceTencentCloudCvmSyncImageCreatePostHandleResponse0(ctx, response); err != nil {
+ return err
}
+ d.SetId(imageId)
+
return resourceTencentCloudCvmSyncImageRead(d, meta)
}
diff --git a/tencentcloud/services/cvm/resource_tc_cvm_sync_image_extension.go b/tencentcloud/services/cvm/resource_tc_cvm_sync_image_extension.go
new file mode 100644
index 0000000000..ddb08d69bb
--- /dev/null
+++ b/tencentcloud/services/cvm/resource_tc_cvm_sync_image_extension.go
@@ -0,0 +1,22 @@
+package cvm
+
+import (
+ "context"
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
+ "time"
+
+ cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
+)
+
+func resourceTencentCloudCvmSyncImageCreatePostHandleResponse0(ctx context.Context, resp *cvm.SyncImagesResponse) error {
+ d := tccommon.ResourceDataFromContext(ctx)
+ meta := tccommon.ProviderMetaFromContext(ctx)
+ service := CvmService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
+ conf := tccommon.BuildStateChangeConf([]string{}, []string{"NORMAL"}, 20*tccommon.ReadRetryTimeout, time.Second, service.CvmSyncImagesStateRefreshFunc(d.Id(), []string{}))
+
+ if _, e := conf.WaitForState(); e != nil {
+ return e
+ }
+
+ return nil
+}
diff --git a/tencentcloud/services/cvm/resource_tc_eip_extension.go b/tencentcloud/services/cvm/resource_tc_eip_extension.go
new file mode 100644
index 0000000000..5b8d64781b
--- /dev/null
+++ b/tencentcloud/services/cvm/resource_tc_eip_extension.go
@@ -0,0 +1,161 @@
+package cvm
+
+import (
+ "context"
+ "fmt"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
+ vpc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312"
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
+ "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
+ svctag "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/tag"
+ svcvpc "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/vpc"
+ "log"
+)
+
+func resourceTencentCloudEipCreatePostFillRequest0(ctx context.Context, req *vpc.AllocateAddressesRequest) error {
+ d := tccommon.ResourceDataFromContext(ctx)
+ internetChargeType := *req.InternetChargeType
+ if internetChargeType == "BANDWIDTH_PREPAID_BY_MONTH" {
+ addressChargePrepaid := vpc.AddressChargePrepaid{}
+ period := d.Get("prepaid_period")
+ renewFlag := d.Get("auto_renew_flag")
+ addressChargePrepaid.Period = helper.IntInt64(period.(int))
+ addressChargePrepaid.AutoRenewFlag = helper.IntInt64(renewFlag.(int))
+ req.AddressChargePrepaid = &addressChargePrepaid
+ }
+
+ return nil
+}
+
+func resourceTencentCloudEipCreatePostHandleResponse0(ctx context.Context, resp *vpc.AllocateAddressesResponse) error {
+ d := tccommon.ResourceDataFromContext(ctx)
+ logId := tccommon.GetLogId(tccommon.ContextNil)
+ meta := tccommon.ProviderMetaFromContext(ctx)
+ client := meta.(tccommon.ProviderMeta).GetAPIV3Conn()
+ vpcService := svcvpc.NewVpcService(client)
+ tagService := svctag.NewTagService(client)
+ region := client.Region
+ eipId := d.Id()
+ if tags := helper.GetTags(d, "tags"); len(tags) > 0 {
+ resourceName := tccommon.BuildTagResourceName(svcvpc.VPC_SERVICE_TYPE, svcvpc.EIP_RESOURCE_TYPE, region, eipId)
+ if err := tagService.ModifyTags(ctx, resourceName, tags, nil); err != nil {
+ log.Printf("[CRITAL]%s set eip tags failed: %+v", logId, err)
+ return err
+ }
+ }
+
+ // wait for status
+ err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
+ eip, errRet := vpcService.DescribeEipById(ctx, eipId)
+ if errRet != nil {
+ return tccommon.RetryError(errRet)
+ }
+ if eip != nil && *eip.AddressStatus == svcvpc.EIP_STATUS_CREATING {
+ return resource.RetryableError(fmt.Errorf("eip is still creating"))
+ }
+ return nil
+ })
+ if err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func resourceTencentCloudEipUpdatePostFillRequest1(ctx context.Context, req *vpc.ModifyAddressInternetChargeTypeRequest) error {
+ d := tccommon.ResourceDataFromContext(ctx)
+ period := d.Get("prepaid_period").(int)
+ renewFlag := d.Get("auto_renew_flag").(int)
+
+ if *req.InternetChargeType != "" && *req.InternetMaxBandwidthOut != 0 {
+ if *req.InternetChargeType == "BANDWIDTH_PREPAID_BY_MONTH" {
+ addressChargePrepaid := vpc.AddressChargePrepaid{}
+ addressChargePrepaid.AutoRenewFlag = helper.IntInt64(renewFlag)
+ addressChargePrepaid.Period = helper.IntInt64(period)
+ req.AddressChargePrepaid = &addressChargePrepaid
+ }
+ }
+
+ return nil
+}
+
+func resourceTencentCloudEipUpdatePostFillRequest3(ctx context.Context, req *vpc.RenewAddressesRequest) error {
+ // TODO: implement me
+ panic("TODO: implement me")
+}
+
+func resourceTencentCloudEipDeletePostFillRequest0(ctx context.Context, req *vpc.ReleaseAddressesRequest) error {
+ d := tccommon.ResourceDataFromContext(ctx)
+ meta := tccommon.ProviderMetaFromContext(ctx)
+ client := meta.(tccommon.ProviderMeta).GetAPIV3Conn()
+ vpcService := svcvpc.NewVpcService(client)
+ err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
+ errRet := vpcService.UnattachEip(ctx, d.Id())
+ if errRet != nil {
+ return tccommon.RetryError(errRet, "DesOperation.MutexTaskRunning")
+ }
+ return nil
+ })
+ if err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func resourceTencentCloudEipDeletePostHandleResponse0(ctx context.Context, resp *vpc.ReleaseAddressesResponse) error {
+ d := tccommon.ResourceDataFromContext(ctx)
+ meta := tccommon.ProviderMetaFromContext(ctx)
+ client := meta.(tccommon.ProviderMeta).GetAPIV3Conn()
+ vpcService := svcvpc.NewVpcService(client)
+ eipId := d.Id()
+ var internetChargeType string
+ if v, ok := d.GetOk("internet_charge_type"); ok {
+ internetChargeType = v.(string)
+ }
+
+ if internetChargeType == "BANDWIDTH_PREPAID_BY_MONTH" {
+ // isolated
+ err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
+ eip, errRet := vpcService.DescribeEipById(ctx, eipId)
+ if errRet != nil {
+ return tccommon.RetryError(errRet)
+ }
+ if !*eip.IsArrears {
+ return resource.RetryableError(fmt.Errorf("eip is still isolate"))
+ }
+ return nil
+ })
+ if err != nil {
+ return err
+ }
+
+ // release
+ err = resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
+ errRet := vpcService.DeleteEip(ctx, eipId)
+ if errRet != nil {
+ return tccommon.RetryError(errRet, "DesOperation.MutexTaskRunning", "OperationDenied.MutexTaskRunning")
+ }
+ return nil
+ })
+ if err != nil {
+ return err
+ }
+ }
+
+ err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
+ eip, errRet := vpcService.DescribeEipById(ctx, eipId)
+ if errRet != nil {
+ return tccommon.RetryError(errRet)
+ }
+ if eip != nil {
+ return resource.RetryableError(fmt.Errorf("eip is still deleting"))
+ }
+ return nil
+ })
+ if err != nil {
+ return err
+ }
+
+ return nil
+}
diff --git a/website/docs/r/cvm_renew_instance.html.markdown b/website/docs/r/cvm_renew_instance.html.markdown
index f9f5107600..779cb4c1fd 100644
--- a/website/docs/r/cvm_renew_instance.html.markdown
+++ b/website/docs/r/cvm_renew_instance.html.markdown
@@ -73,21 +73,14 @@ resource "tencentcloud_cvm_renew_instance" "example" {
The following arguments are supported:
-* `instance_id` - (Required, String, ForceNew) Instance ID.
+* `instance_id` - (Required, String, ForceNew) Instance ID. To obtain the instance IDs, you can call DescribeInstances and look for InstanceId in the response.
* `instance_charge_prepaid` - (Optional, List, ForceNew) Prepaid mode, that is, yearly and monthly subscription related parameter settings. Through this parameter, you can specify the renewal duration of the Subscription instance, whether to set automatic renewal, and other attributes. For yearly and monthly subscription instances, this parameter is required.
-* `renew_portable_data_disk` - (Optional, Bool, ForceNew) Whether to renew the elastic data disk. Valid values:
-- `TRUE`: Indicates to renew the subscription instance and renew the attached elastic data disk at the same time
-- `FALSE`: Indicates that the subscription instance will be renewed and the elastic data disk attached to it will not be renewed
-Default value: TRUE.
+* `renew_portable_data_disk` - (Optional, Bool, ForceNew) Whether to renew the elastic data disk. Valid values:
TRUE: Indicates to renew the subscription instance and renew the attached elastic data disk at the same time
FALSE: Indicates that the subscription instance will be renewed and the elastic data disk attached to it will not be renewed
Default value: TRUE.
The `instance_charge_prepaid` object supports the following:
* `period` - (Required, Int) Subscription period; unit: month; valid values: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 24, 36, 48, 60. Note: This field may return null, indicating that no valid value is found.
-* `renew_flag` - (Optional, String) Auto renewal flag. Valid values:
-- `NOTIFY_AND_AUTO_RENEW`: notify upon expiration and renew automatically;
-- `NOTIFY_AND_MANUAL_RENEW`: notify upon expiration but do not renew automatically;
-- `DISABLE_NOTIFY_AND_MANUAL_RENEW`: neither notify upon expiration nor renew automatically;
-Default value: NOTIFY_AND_MANUAL_RENEW. If this parameter is specified as NOTIFY_AND_AUTO_RENEW, the instance will be automatically renewed on a monthly basis if the account balance is sufficient. Note: This field may return null, indicating that no valid value is found.
+* `renew_flag` - (Optional, String) Auto renewal flag. Valid values:
NOTIFY_AND_AUTO_RENEW: notify upon expiration and renew automatically
NOTIFY_AND_MANUAL_RENEW: notify upon expiration but do not renew automatically
DISABLE_NOTIFY_AND_MANUAL_RENEW: neither notify upon expiration nor renew automatically
Default value: NOTIFY_AND_MANUAL_RENEW. If this parameter is specified as NOTIFY_AND_AUTO_RENEW, the instance will be automatically renewed on a monthly basis if the account balance is sufficient. Note: This field may return null, indicating that no valid value is found.
## Attributes Reference
diff --git a/website/docs/r/cvm_security_group_attachment.html.markdown b/website/docs/r/cvm_security_group_attachment.html.markdown
index 1b411ac3d4..97d59c39f3 100644
--- a/website/docs/r/cvm_security_group_attachment.html.markdown
+++ b/website/docs/r/cvm_security_group_attachment.html.markdown
@@ -75,8 +75,8 @@ resource "tencentcloud_cvm_security_group_attachment" "example" {
The following arguments are supported:
-* `instance_id` - (Required, String, ForceNew) Instance id.
-* `security_group_id` - (Required, String, ForceNew) Security group id.
+* `instance_id` - (Required, String, ForceNew) Instance ID. To obtain the instance IDs, you can call DescribeInstances and look for InstanceId in the response.
+* `security_group_id` - (Required, String, ForceNew) ID of the security group to be associated, such as sg-efil73jd. Only one security group can be associated.
## Attributes Reference
From ea3b72e071eaf8575d1db17d660d48693bdfbd1c Mon Sep 17 00:00:00 2001
From: SevenEarth <391613297@qq.com>
Date: Wed, 29 May 2024 10:20:51 +0800
Subject: [PATCH 2/8] add
---
tencentcloud/services/cvm/1.go | 503 -----------------
.../services/cvm/data_source_tc_eips.go | 171 +++---
.../cvm/data_source_tc_eips_extension.go | 65 +++
.../services/cvm/data_source_tc_image.go | 157 ++----
.../cvm/data_source_tc_image_extension.go | 80 +++
.../services/cvm/data_source_tc_images.go | 311 ++++-------
.../cvm/data_source_tc_images_extension.go | 152 +++++
.../cvm/data_source_tc_instance_types.go | 200 +++----
...data_source_tc_instance_types_extension.go | 96 ++++
.../cvm/data_source_tc_instances_set.go | 344 +++++-------
.../data_source_tc_instances_set_extension.go | 111 ++++
.../services/cvm/data_source_tc_key_pairs.go | 120 ++--
.../cvm/data_source_tc_key_pairs_extension.go | 108 ++++
.../cvm/data_source_tc_placement_groups.go | 114 ++--
...ta_source_tc_placement_groups_extension.go | 48 ++
tencentcloud/services/cvm/resource_tc_eip.go | 518 +++++++++---------
.../services/cvm/resource_tc_eip_extension.go | 22 +-
.../resource_tc_eip_public_address_adjust.go | 58 +-
..._tc_eip_public_address_adjust_extension.go | 24 +
.../services/cvm/service_tencentcloud_cvm.go | 377 ++++++++++---
20 files changed, 1849 insertions(+), 1730 deletions(-)
delete mode 100644 tencentcloud/services/cvm/1.go
create mode 100644 tencentcloud/services/cvm/data_source_tc_eips_extension.go
create mode 100644 tencentcloud/services/cvm/data_source_tc_image_extension.go
create mode 100644 tencentcloud/services/cvm/data_source_tc_images_extension.go
create mode 100644 tencentcloud/services/cvm/data_source_tc_instance_types_extension.go
create mode 100644 tencentcloud/services/cvm/data_source_tc_instances_set_extension.go
create mode 100644 tencentcloud/services/cvm/data_source_tc_key_pairs_extension.go
create mode 100644 tencentcloud/services/cvm/data_source_tc_placement_groups_extension.go
create mode 100644 tencentcloud/services/cvm/resource_tc_eip_public_address_adjust_extension.go
diff --git a/tencentcloud/services/cvm/1.go b/tencentcloud/services/cvm/1.go
deleted file mode 100644
index ecdefd3af3..0000000000
--- a/tencentcloud/services/cvm/1.go
+++ /dev/null
@@ -1,503 +0,0 @@
-package cvm
-
-//
-//import (
-// "context"
-// "fmt"
-// "log"
-//
-// "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
-// "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
-// vpc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312"
-//
-// tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
-// "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
-//)
-//
-//func ResourceTencentCloudEip() *schema.Resource {
-// return &schema.Resource{
-// Create: resourceTencentCloudEipCreate,
-// Read: resourceTencentCloudEipRead,
-// Update: resourceTencentCloudEipUpdate,
-// Delete: resourceTencentCloudEipDelete,
-// Importer: &schema.ResourceImporter{
-// State: schema.ImportStatePassthrough,
-// },
-// Schema: map[string]*schema.Schema{
-// "anti_ddos_package_id": {
-// Type: schema.TypeString,
-// Optional: true,
-// Computed: true,
-// Description: "ID of anti DDos package, it must set when `type` is `AntiDDoSEIP`.",
-// },
-//
-// "anycast_zone": {
-// Type: schema.TypeString,
-// Optional: true,
-// ForceNew: true,
-// Description: "The zone of anycast. Valid value: `ANYCAST_ZONE_GLOBAL` and `ANYCAST_ZONE_OVERSEAS`.",
-// },
-//
-// "applicable_for_clb": {
-// Type: schema.TypeBool,
-// Optional: true,
-// Description: "Indicates whether the anycast eip can be associated to a CLB.",
-// Deprecated: "It has been deprecated from version 1.27.0.",
-// },
-//
-// "auto_renew_flag": {
-// Type: schema.TypeInt,
-// Optional: true,
-// Description: "Auto renew flag. 0 - default state (manual renew); 1 - automatic renew; 2 - explicit no automatic renew. NOTES: Only supported prepaid EIP.",
-// },
-//
-// "bandwidth_package_id": {
-// Type: schema.TypeString,
-// Optional: true,
-// Computed: true,
-// Description: "ID of bandwidth package, it will set when `internet_charge_type` is `BANDWIDTH_PACKAGE`.",
-// },
-//
-// "egress": {
-// Type: schema.TypeString,
-// Optional: true,
-// Computed: true,
-// Description: "Network egress. It defaults to `center_egress1`. If you want to try the egress feature, please [submit a ticket](https://console.cloud.tencent.com/workorder/category).",
-// },
-//
-// "internet_charge_type": {
-// Type: schema.TypeString,
-// Optional: true,
-// Computed: true,
-// Description: "The charge type of eip. Valid values: `BANDWIDTH_PACKAGE`, `BANDWIDTH_POSTPAID_BY_HOUR`, `BANDWIDTH_PREPAID_BY_MONTH` and `TRAFFIC_POSTPAID_BY_HOUR`.",
-// },
-//
-// "internet_max_bandwidth_out": {
-// Type: schema.TypeInt,
-// Optional: true,
-// Computed: true,
-// Description: "The bandwidth limit of EIP, unit is Mbps.",
-// },
-//
-// "internet_service_provider": {
-// Type: schema.TypeString,
-// Optional: true,
-// ForceNew: true,
-// Description: "Internet service provider of eip. Valid value: `BGP`, `CMCC`, `CTCC` and `CUCC`.",
-// },
-//
-// "name": {
-// Type: schema.TypeString,
-// Optional: true,
-// Computed: true,
-// Description: "The name of eip.",
-// },
-//
-// "prepaid_period": {
-// Type: schema.TypeInt,
-// Optional: true,
-// Description: "Period of instance. Default value: `1`. Valid value: `1`, `2`, `3`, `4`, `6`, `7`, `8`, `9`, `12`, `24`, `36`. NOTES: must set when `internet_charge_type` is `BANDWIDTH_PREPAID_BY_MONTH`.",
-// },
-//
-// "public_ip": {
-// Type: schema.TypeString,
-// Computed: true,
-// Description: "The elastic IP address.",
-// },
-//
-// "status": {
-// Type: schema.TypeString,
-// Computed: true,
-// Description: "The EIP current status.",
-// },
-//
-// "tags": {
-// Type: schema.TypeMap,
-// Optional: true,
-// Description: "The tags of eip.",
-// },
-//
-// "type": {
-// Type: schema.TypeString,
-// Optional: true,
-// ForceNew: true,
-// Default: "EIP",
-// Description: "The type of eip. Valid value: `EIP` and `AnycastEIP` and `HighQualityEIP` and `AntiDDoSEIP`. Default is `EIP`.",
-// },
-// },
-// }
-//}
-//
-//func resourceTencentCloudEipCreate(d *schema.ResourceData, meta interface{}) error {
-// defer tccommon.LogElapsed("resource.tencentcloud_eip.create")()
-// defer tccommon.InconsistentCheck(d, meta)()
-//
-// logId := tccommon.GetLogId(tccommon.ContextNil)
-//
-// ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
-//
-// var (
-// eipId string
-// )
-// var (
-// request = vpc.NewAllocateAddressesRequest()
-// response = vpc.NewAllocateAddressesResponse()
-// )
-//
-// if v, ok := d.GetOk("internet_service_provider"); ok {
-// request.InternetServiceProvider = helper.String(v.(string))
-// }
-//
-// if v, ok := d.GetOk("internet_charge_type"); ok {
-// request.InternetChargeType = helper.String(v.(string))
-// }
-//
-// if v, ok := d.GetOkExists("internet_max_bandwidth_out"); ok {
-// request.InternetMaxBandwidthOut = helper.IntInt64(v.(int))
-// }
-//
-// if v, ok := d.GetOk("type"); ok {
-// request.AddressType = helper.String(v.(string))
-// }
-//
-// if v, ok := d.GetOk("anycast_zone"); ok {
-// request.AnycastZone = helper.String(v.(string))
-// }
-//
-// if v, ok := d.GetOk("tags"); ok {
-// for _, item := range v.([]interface{}) {
-// tagsMap := item.(map[string]interface{})
-// tag := vpc.Tag{}
-// if v, ok := tagsMap["key"]; ok {
-// tag.Key = helper.String(v.(string))
-// }
-// if v, ok := tagsMap["value"]; ok {
-// tag.Value = helper.String(v.(string))
-// }
-// request.Tags = append(request.Tags, &tag)
-// }
-// }
-//
-// if v, ok := d.GetOk("bandwidth_package_id"); ok {
-// request.BandwidthPackageId = helper.String(v.(string))
-// }
-//
-// if v, ok := d.GetOk("name"); ok {
-// request.AddressName = helper.String(v.(string))
-// }
-//
-// if v, ok := d.GetOk("egress"); ok {
-// request.Egress = helper.String(v.(string))
-// }
-//
-// if v, ok := d.GetOk("anti_ddos_package_id"); ok {
-// request.AntiDDoSPackageId = helper.String(v.(string))
-// }
-//
-// if err := resourceTencentCloudEipCreatePostFillRequest0(ctx, request); err != nil {
-// return err
-// }
-//
-// err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
-// result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().AllocateAddressesWithContext(ctx, request)
-// if e != nil {
-// return tccommon.RetryError(e)
-// } else {
-// log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
-// }
-// response = result
-// return nil
-// })
-// if err != nil {
-// log.Printf("[CRITAL]%s create eip failed, reason:%+v", logId, err)
-// return err
-// }
-//
-// eipId = *response.Response.AddressSet[0]
-//
-// if err := resourceTencentCloudEipCreatePostHandleResponse0(ctx, response); err != nil {
-// return err
-// }
-//
-// d.SetId(eipId)
-//
-// return resourceTencentCloudEipRead(d, meta)
-//}
-//
-//func resourceTencentCloudEipRead(d *schema.ResourceData, meta interface{}) error {
-// defer tccommon.LogElapsed("resource.tencentcloud_eip.read")()
-// defer tccommon.InconsistentCheck(d, meta)()
-//
-// logId := tccommon.GetLogId(tccommon.ContextNil)
-//
-// ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
-//
-// service := VpcService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
-//
-// eipId := d.Id()
-//
-// respData, err := service.DescribeEipById(ctx, eipId)
-// if err != nil {
-// return err
-// }
-//
-// if respData == nil {
-// d.SetId("")
-// log.Printf("[WARN]%s resource `eip` [%s] not found, please check if it has been deleted.\n", logId, d.Id())
-// return nil
-// }
-// if respData.AddressId != nil {
-// _ = d.Set("address_id", respData.AddressId)
-// eipId = *respData.AddressId
-// }
-//
-// if respData.AddressName != nil {
-// _ = d.Set("name", respData.AddressName)
-// }
-//
-// if respData.AddressStatus != nil {
-// _ = d.Set("status", respData.AddressStatus)
-// }
-//
-// if respData.AddressIp != nil {
-// _ = d.Set("public_ip", respData.AddressIp)
-// }
-//
-// if respData.AddressType != nil {
-// _ = d.Set("type", respData.AddressType)
-// }
-//
-// if respData.InternetServiceProvider != nil {
-// _ = d.Set("internet_service_provider", respData.InternetServiceProvider)
-// }
-//
-// if respData.LocalBgp != nil {
-// _ = d.Set("local_bgp", respData.LocalBgp)
-// }
-//
-// if respData.Bandwidth != nil {
-// _ = d.Set("internet_max_bandwidth_out", respData.Bandwidth)
-// }
-//
-// if respData.InternetChargeType != nil {
-// _ = d.Set("internet_charge_type", respData.InternetChargeType)
-// }
-//
-// if respData.Egress != nil {
-// _ = d.Set("egress", respData.Egress)
-// }
-//
-// if respData.AntiDDoSPackageId != nil {
-// _ = d.Set("anti_ddos_package_id", respData.AntiDDoSPackageId)
-// }
-//
-// if respData.BandwidthPackageId != nil {
-// _ = d.Set("bandwidth_package_id", respData.BandwidthPackageId)
-// }
-//
-// return nil
-//}
-//
-//func resourceTencentCloudEipUpdate(d *schema.ResourceData, meta interface{}) error {
-// defer tccommon.LogElapsed("resource.tencentcloud_eip.update")()
-// defer tccommon.InconsistentCheck(d, meta)()
-//
-// logId := tccommon.GetLogId(tccommon.ContextNil)
-//
-// ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
-//
-// immutableArgs := []string{"anti_ddos_package_id", "applicable_for_clb", "auto_renew_flag", "bandwidth_package_id", "egress", "prepaid_period", "tags"}
-// for _, v := range immutableArgs {
-// if d.HasChange(v) {
-// return fmt.Errorf("argument `%s` cannot be changed", v)
-// }
-// }
-// eipId := d.Id()
-//
-// needChange := false
-// mutableArgs := []string{"name"}
-// for _, v := range mutableArgs {
-// if d.HasChange(v) {
-// needChange = true
-// break
-// }
-// }
-//
-// if needChange {
-// request := vpc.NewModifyAddressAttributeRequest()
-//
-// request.AddressId = helper.String(eipId)
-//
-// if v, ok := d.GetOk("name"); ok {
-// request.AddressName = helper.String(v.(string))
-// }
-//
-// err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
-// result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().ModifyAddressAttributeWithContext(ctx, request)
-// if e != nil {
-// return tccommon.RetryError(e)
-// } else {
-// log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
-// }
-// return nil
-// })
-// if err != nil {
-// log.Printf("[CRITAL]%s update eip failed, reason:%+v", logId, err)
-// return err
-// }
-// }
-//
-// needChange1 := false
-// mutableArgs1 := []string{"internet_charge_type", "internet_max_bandwidth_out"}
-// for _, v := range mutableArgs1 {
-// if d.HasChange(v) {
-// needChange1 = true
-// break
-// }
-// }
-//
-// if needChange1 {
-// request1 := vpc.NewModifyAddressInternetChargeTypeRequest()
-//
-// request1.AddressId = helper.String(eipId)
-//
-// if v, ok := d.GetOk("internet_charge_type"); ok {
-// request1.InternetChargeType = helper.String(v.(string))
-// }
-//
-// if v, ok := d.GetOkExists("internet_max_bandwidth_out"); ok {
-// request1.InternetMaxBandwidthOut = helper.IntUint64(v.(int))
-// }
-//
-// if err := resourceTencentCloudEipUpdatePostFillRequest1(ctx, request1); err != nil {
-// return err
-// }
-//
-// err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
-// result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().ModifyAddressInternetChargeTypeWithContext(ctx, request1)
-// if e != nil {
-// return tccommon.RetryError(e)
-// } else {
-// log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request1.GetAction(), request1.ToJsonString(), result.ToJsonString())
-// }
-// return nil
-// })
-// if err != nil {
-// log.Printf("[CRITAL]%s update eip failed, reason:%+v", logId, err)
-// return err
-// }
-// }
-//
-// needChange2 := false
-// mutableArgs2 := []string{"internet_max_bandwidth_out"}
-// for _, v := range mutableArgs2 {
-// if d.HasChange(v) {
-// needChange2 = true
-// break
-// }
-// }
-//
-// if needChange2 {
-// request2 := vpc.NewModifyAddressesBandwidthRequest()
-//
-// request2.AddressIds = []*string{helper.String(eipId)}
-//
-// if v, ok := d.GetOkExists("internet_max_bandwidth_out"); ok {
-// request2.InternetMaxBandwidthOut = helper.IntInt64(v.(int))
-// }
-//
-// err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
-// result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().ModifyAddressesBandwidthWithContext(ctx, request2)
-// if e != nil {
-// return tccommon.RetryError(e)
-// } else {
-// log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request2.GetAction(), request2.ToJsonString(), result.ToJsonString())
-// }
-// return nil
-// })
-// if err != nil {
-// log.Printf("[CRITAL]%s update eip failed, reason:%+v", logId, err)
-// return err
-// }
-// }
-//
-// needChange3 := false
-// mutableArgs3 := []string{}
-// for _, v := range mutableArgs3 {
-// if d.HasChange(v) {
-// needChange3 = true
-// break
-// }
-// }
-//
-// if needChange3 {
-// request3 := vpc.NewRenewAddressesRequest()
-//
-// request3.AddressIds = []*string{helper.String(eipId)}
-//
-// if err := resourceTencentCloudEipUpdatePostFillRequest3(ctx, request3); err != nil {
-// return err
-// }
-//
-// err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
-// result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().RenewAddressesWithContext(ctx, request3)
-// if e != nil {
-// return tccommon.RetryError(e)
-// } else {
-// log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request3.GetAction(), request3.ToJsonString(), result.ToJsonString())
-// }
-// return nil
-// })
-// if err != nil {
-// log.Printf("[CRITAL]%s update eip failed, reason:%+v", logId, err)
-// return err
-// }
-// }
-//
-// _ = eipId
-// return resourceTencentCloudEipRead(d, meta)
-//}
-//
-//func resourceTencentCloudEipDelete(d *schema.ResourceData, meta interface{}) error {
-// defer tccommon.LogElapsed("resource.tencentcloud_eip.delete")()
-// defer tccommon.InconsistentCheck(d, meta)()
-//
-// logId := tccommon.GetLogId(tccommon.ContextNil)
-// ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
-//
-// eipId := d.Id()
-//
-// var (
-// request = vpc.NewReleaseAddressesRequest()
-// response = vpc.NewReleaseAddressesResponse()
-// )
-//
-// request.AddressIds = []*string{helper.String(eipId)}
-//
-// if err := resourceTencentCloudEipDeletePostFillRequest0(ctx, request); err != nil {
-// return err
-// }
-//
-// err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
-// result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().ReleaseAddressesWithContext(ctx, request)
-// if e != nil {
-// return tccommon.RetryError(e)
-// } else {
-// log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
-// }
-// response = result
-// return nil
-// })
-// if err != nil {
-// log.Printf("[CRITAL]%s create eip failed, reason:%+v", logId, err)
-// return err
-// }
-//
-// _ = response
-// if err := resourceTencentCloudEipDeletePostHandleResponse0(ctx, response); err != nil {
-// return err
-// }
-//
-// _ = eipId
-// return nil
-//}
diff --git a/tencentcloud/services/cvm/data_source_tc_eips.go b/tencentcloud/services/cvm/data_source_tc_eips.go
index 58057f6c3d..80b5c0f0bc 100644
--- a/tencentcloud/services/cvm/data_source_tc_eips.go
+++ b/tencentcloud/services/cvm/data_source_tc_eips.go
@@ -2,49 +2,24 @@ package cvm
import (
"context"
- "log"
-
- tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
- svctag "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/tag"
- svcvpc "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/vpc"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
vpc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312"
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
)
func DataSourceTencentCloudEips() *schema.Resource {
return &schema.Resource{
Read: dataSourceTencentCloudEipsRead,
-
Schema: map[string]*schema.Schema{
"eip_id": {
Type: schema.TypeString,
Optional: true,
Description: "ID of the EIP to be queried.",
},
- "eip_name": {
- Type: schema.TypeString,
- Optional: true,
- Description: "Name of the EIP to be queried.",
- },
- "public_ip": {
- Type: schema.TypeString,
- Optional: true,
- Description: "The elastic ip address.",
- },
- "tags": {
- Type: schema.TypeMap,
- Optional: true,
- Description: "The tags of EIP.",
- },
- "result_output_file": {
- Type: schema.TypeString,
- Optional: true,
- Description: "Used to save results.",
- },
"eip_list": {
Type: schema.TypeList,
@@ -52,6 +27,11 @@ func DataSourceTencentCloudEips() *schema.Resource {
Description: "An information list of EIP. Each element contains the following attributes:",
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
+ "create_time": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "Creation time of the EIP.",
+ },
"eip_id": {
Type: schema.TypeString,
Computed: true,
@@ -67,30 +47,25 @@ func DataSourceTencentCloudEips() *schema.Resource {
Computed: true,
Description: "Type of the EIP.",
},
- "status": {
- Type: schema.TypeString,
- Computed: true,
- Description: "The EIP current status.",
- },
- "public_ip": {
+ "eni_id": {
Type: schema.TypeString,
Computed: true,
- Description: "The elastic ip address.",
+ Description: "The eni id to bind with the EIP.",
},
"instance_id": {
Type: schema.TypeString,
Computed: true,
Description: "The instance id to bind with the EIP.",
},
- "eni_id": {
+ "public_ip": {
Type: schema.TypeString,
Computed: true,
- Description: "The eni id to bind with the EIP.",
+ Description: "The elastic ip address.",
},
- "create_time": {
+ "status": {
Type: schema.TypeString,
Computed: true,
- Description: "Creation time of the EIP.",
+ Description: "The EIP current status.",
},
"tags": {
Type: schema.TypeMap,
@@ -100,91 +75,101 @@ func DataSourceTencentCloudEips() *schema.Resource {
},
},
},
+
+ "eip_name": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "Name of the EIP to be queried.",
+ },
+
+ "public_ip": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "The elastic ip address.",
+ },
+
+ "tags": {
+ Type: schema.TypeMap,
+ Optional: true,
+ Description: "The tags of EIP.",
+ },
+
+ "result_output_file": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "Used to save results.",
+ },
},
}
}
func dataSourceTencentCloudEipsRead(d *schema.ResourceData, meta interface{}) error {
defer tccommon.LogElapsed("data_source.tencentcloud_eips.read")()
- logId := tccommon.GetLogId(tccommon.ContextNil)
- ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
+ defer tccommon.InconsistentCheck(d, meta)()
+
+ logId := tccommon.GetLogId(nil)
+ ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
- client := meta.(tccommon.ProviderMeta).GetAPIV3Conn()
- vpcService := svcvpc.NewVpcService(client)
- tagService := svctag.NewTagService(client)
- region := client.Region
+ service := VpcService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
- filter := make(map[string][]string)
+ paramMap := make(map[string]interface{})
+ var filtersList []*vpc.Filter
+ filtersMap := map[string]*vpc.Filter{}
+ filter := vpc.Filter{}
+ name := "address-id"
+ filter.Name = &name
if v, ok := d.GetOk("eip_id"); ok {
- filter["address-id"] = []string{v.(string)}
+ filter.Values = []*string{helper.String(v.(string))}
}
+ filtersMap["Temp0"] = &filter
+ if v, ok := filtersMap["Temp0"]; ok {
+ filtersList = append(filtersList, v)
+ }
+ filter2 := vpc.Filter{}
+ name2 := "address-name"
+ filter2.Name = &name2
if v, ok := d.GetOk("eip_name"); ok {
- filter["address-name"] = []string{v.(string)}
+ filter2.Values = []*string{helper.String(v.(string))}
+ }
+ filtersMap["Temp1"] = &filter2
+ if v, ok := filtersMap["Temp1"]; ok {
+ filtersList = append(filtersList, v)
}
+ filter3 := vpc.Filter{}
+ name3 := "public-ip"
+ filter3.Name = &name3
if v, ok := d.GetOk("public_ip"); ok {
- filter["public-ip"] = []string{v.(string)}
+ filter3.Values = []*string{helper.String(v.(string))}
}
+ filtersMap["Temp2"] = &filter3
+ if v, ok := filtersMap["Temp2"]; ok {
+ filtersList = append(filtersList, v)
+ }
+ paramMap["Filters"] = filtersList
- tags := helper.GetTags(d, "tags")
-
- var eips []*vpc.Address
- var errRet error
+ var respData *vpc.DescribeAddressesResponseParams
err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
- eips, errRet = vpcService.DescribeEipByFilter(ctx, filter)
- if errRet != nil {
- return tccommon.RetryError(errRet, tccommon.InternalError)
+ result, e := service.DescribeEipsByFilter(ctx, paramMap)
+ if e != nil {
+ return tccommon.RetryError(e)
}
+ respData = result
return nil
})
if err != nil {
return err
}
- eipList := make([]map[string]interface{}, 0, len(eips))
- ids := make([]string, 0, len(eips))
-
-EIP_LOOP:
- for _, eip := range eips {
- respTags, err := tagService.DescribeResourceTags(ctx, svcvpc.VPC_SERVICE_TYPE, svcvpc.EIP_RESOURCE_TYPE, region, *eip.AddressId)
- if err != nil {
- log.Printf("[CRITAL]%s describe eip tags failed: %+v", logId, err)
- return err
- }
-
- for k, v := range tags {
- if respTags[k] != v {
- continue EIP_LOOP
- }
- }
-
- mapping := map[string]interface{}{
- "eip_id": eip.AddressId,
- "eip_name": eip.AddressName,
- "eip_type": eip.AddressType,
- "status": eip.AddressStatus,
- "public_ip": eip.AddressIp,
- "instance_id": eip.InstanceId,
- "eni_id": eip.NetworkInterfaceId,
- "create_time": eip.CreatedTime,
- "tags": respTags,
- }
-
- eipList = append(eipList, mapping)
- ids = append(ids, *eip.AddressId)
- }
-
- d.SetId(helper.DataResourceIdsHash(ids))
- err = d.Set("eip_list", eipList)
- if err != nil {
- log.Printf("[CRITAL]%s provider set eip list fail, reason:%s\n ", logId, err.Error())
+ if err := dataSourceTencentCloudEipsReadPostHandleResponse0(ctx, paramMap, respData); err != nil {
return err
}
output, ok := d.GetOk("result_output_file")
if ok && output.(string) != "" {
- if err := tccommon.WriteToFile(output.(string), eipList); err != nil {
- return err
+ if e := tccommon.WriteToFile(output.(string), dataSourceTencentCloudEipsReadOutputContent(ctx)); e != nil {
+ return e
}
}
+
return nil
}
diff --git a/tencentcloud/services/cvm/data_source_tc_eips_extension.go b/tencentcloud/services/cvm/data_source_tc_eips_extension.go
new file mode 100644
index 0000000000..b6b245a635
--- /dev/null
+++ b/tencentcloud/services/cvm/data_source_tc_eips_extension.go
@@ -0,0 +1,65 @@
+package cvm
+
+import (
+ "context"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
+ "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
+ svctag "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/tag"
+ svcvpc "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/vpc"
+ "log"
+
+ vpc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312"
+)
+
+func dataSourceTencentCloudEipsReadOutputContent(ctx context.Context) interface{} {
+ eipList := ctx.Value("eipList").(*schema.Set).List()
+ return eipList
+}
+
+func dataSourceTencentCloudEipsReadPostHandleResponse0(ctx context.Context, req map[string]interface{}, resp *vpc.DescribeAddressesResponseParams) error {
+ d := tccommon.ResourceDataFromContext(ctx)
+ meta := tccommon.ProviderMetaFromContext(ctx)
+ logId := tccommon.GetLogId(tccommon.ContextNil)
+ client := meta.(tccommon.ProviderMeta).GetAPIV3Conn()
+ tagService := svctag.NewTagService(client)
+ region := client.Region
+
+ tags := helper.GetTags(d, "tags")
+ eipList := make([]map[string]interface{}, 0, len(resp.AddressSet))
+ ids := make([]string, 0, len(resp.AddressSet))
+
+EIP_LOOP:
+ for _, eip := range resp.AddressSet {
+ respTags, err := tagService.DescribeResourceTags(ctx, svcvpc.VPC_SERVICE_TYPE, svcvpc.EIP_RESOURCE_TYPE, region, *eip.AddressId)
+ if err != nil {
+ log.Printf("[CRITAL]%s describe eip tags failed: %+v", logId, err)
+ return err
+ }
+
+ for k, v := range tags {
+ if respTags[k] != v {
+ continue EIP_LOOP
+ }
+ }
+
+ mapping := map[string]interface{}{
+ "eip_id": eip.AddressId,
+ "eip_name": eip.AddressName,
+ "eip_type": eip.AddressType,
+ "status": eip.AddressStatus,
+ "public_ip": eip.AddressIp,
+ "instance_id": eip.InstanceId,
+ "eni_id": eip.NetworkInterfaceId,
+ "create_time": eip.CreatedTime,
+ "tags": respTags,
+ }
+
+ eipList = append(eipList, mapping)
+ ids = append(ids, *eip.AddressId)
+ }
+
+ context.WithValue(ctx, "eipList", eipList)
+ d.SetId(helper.DataResourceIdsHash(ids))
+ return nil
+}
diff --git a/tencentcloud/services/cvm/data_source_tc_image.go b/tencentcloud/services/cvm/data_source_tc_image.go
index 807b6ca342..dfc2e2b4b9 100644
--- a/tencentcloud/services/cvm/data_source_tc_image.go
+++ b/tencentcloud/services/cvm/data_source_tc_image.go
@@ -2,24 +2,18 @@ package cvm
import (
"context"
- "errors"
- "fmt"
- "regexp"
- "strings"
-
- tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
)
func DataSourceTencentCloudImage() *schema.Resource {
return &schema.Resource{
Read: dataSourceTencentCloudImageRead,
-
Schema: map[string]*schema.Schema{
"filter": {
Type: schema.TypeSet,
@@ -35,137 +29,100 @@ func DataSourceTencentCloudImage() *schema.Resource {
"values": {
Type: schema.TypeList,
Required: true,
- Elem: &schema.Schema{Type: schema.TypeString},
Description: "Values of the filter.",
+ Elem: &schema.Schema{
+ Type: schema.TypeString,
+ },
},
},
},
},
- "image_name_regex": {
- Type: schema.TypeString,
- Optional: true,
- ValidateFunc: tccommon.ValidateNameRegex,
- Description: "A regex string to apply to the image list returned by TencentCloud. **NOTE**: it is not wildcard, should look like `image_name_regex = \"^CentOS\\s+6\\.8\\s+64\\w*\"`.",
- },
- "os_name": {
- Type: schema.TypeString,
- Optional: true,
- ValidateFunc: tccommon.ValidateNotEmpty,
- Description: "A string to apply with fuzzy match to the os_name attribute on the image list returned by TencentCloud. **NOTE**: when os_name is provided, highest priority is applied in this field instead of `image_name_regex`.",
- },
- "result_output_file": {
- Type: schema.TypeString,
- Optional: true,
- Description: "Used to save results.",
- },
+
"image_id": {
Type: schema.TypeString,
Computed: true,
Description: "An image id indicate the uniqueness of a certain image, which can be used for instance creation or resetting.",
},
+
"image_name": {
Type: schema.TypeString,
Computed: true,
Description: "Name of this image.",
},
+
+ "image_name_regex": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "A regex string to apply to the image list returned by TencentCloud. **NOTE**: it is not wildcard, should look like `image_name_regex = \"^CentOS\\s+6\\.8\\s+64\\w*\"`.",
+ },
+
+ "os_name": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "A string to apply with fuzzy match to the os_name attribute on the image list returned by TencentCloud. **NOTE**: when os_name is provided, highest priority is applied in this field instead of `image_name_regex`.",
+ },
+
+ "result_output_file": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "Used to save results.",
+ },
},
}
}
func dataSourceTencentCloudImageRead(d *schema.ResourceData, meta interface{}) error {
defer tccommon.LogElapsed("data_source.tencentcloud_image.read")()
-
- logId := tccommon.GetLogId(tccommon.ContextNil)
- ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
-
- cvmService := CvmService{
- client: meta.(tccommon.ProviderMeta).GetAPIV3Conn(),
- }
-
- filter := make(map[string][]string)
- filters, ok := d.GetOk("filter")
- if ok {
- for _, v := range filters.(*schema.Set).List() {
- vv := v.(map[string]interface{})
- name := vv["name"].(string)
- filter[name] = []string{}
- for _, vvv := range vv["values"].([]interface{}) {
- filter[name] = append(filter[name], vvv.(string))
+ defer tccommon.InconsistentCheck(d, meta)()
+
+ logId := tccommon.GetLogId(nil)
+ ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
+
+ service := CvmService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
+
+ paramMap := make(map[string]interface{})
+ if v, ok := d.GetOk("filters"); ok {
+ filtersSet := v.([]interface{})
+ tmpSet := make([]*cvm.Filter, 0, len(filtersSet))
+ for _, item := range filtersSet {
+ filtersMap := item.(map[string]interface{})
+ filter := cvm.Filter{}
+ if v, ok := filtersMap["name"]; ok {
+ filter.Name = helper.String(v.(string))
+ }
+ if v, ok := filtersMap["values"]; ok {
+ valuesSet := v.(*schema.Set).List()
+ for i := range valuesSet {
+ values := valuesSet[i].(string)
+ filter.Values = append(filter.Values, helper.String(values))
+ }
}
+ tmpSet = append(tmpSet, &filter)
}
+ paramMap["Filters"] = tmpSet
}
- var images []*cvm.Image
- var errRet error
+ var respData *cvm.DescribeImagesResponseParams
err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
- images, errRet = cvmService.DescribeImagesByFilter(ctx, filter, "")
- if errRet != nil {
- return tccommon.RetryError(errRet, tccommon.InternalError)
+ result, e := service.DescribeImageByFilter(ctx, paramMap)
+ if e != nil {
+ return tccommon.RetryError(e)
}
+ respData = result
return nil
})
if err != nil {
return err
}
- if len(images) == 0 {
- return errors.New("No image found")
- }
-
- var osName string
- if v, ok := d.GetOk("os_name"); ok {
- osName = v.(string)
- }
-
- var regImageName string
- var imageNameRegex *regexp.Regexp
- if v, ok := d.GetOk("image_name_regex"); ok {
- regImageName = v.(string)
- imageNameRegex, err = regexp.Compile(regImageName)
- if err != nil {
- return fmt.Errorf("image_name_regex format error,%s", err.Error())
- }
- }
-
- var resultImageId string
- images = sortImages(images)
- for _, image := range images {
- if osName != "" {
- if strings.Contains(strings.ToLower(*image.OsName), strings.ToLower(osName)) {
- resultImageId = *image.ImageId
- _ = d.Set("image_name", *image.ImageName)
- break
- }
- continue
- }
-
- if imageNameRegex != nil {
- if imageNameRegex.MatchString(*image.ImageName) {
- resultImageId = *image.ImageId
- _ = d.Set("image_name", *image.ImageName)
- break
- }
- continue
- }
-
- resultImageId = *image.ImageId
- _ = d.Set("image_name", *image.ImageName)
- break
- }
-
- if resultImageId == "" {
- return errors.New("No image found")
- }
-
- d.SetId(helper.DataResourceIdHash(resultImageId))
- if err := d.Set("image_id", resultImageId); err != nil {
+ if err := dataSourceTencentCloudImageReadPostHandleResponse0(ctx, paramMap, respData); err != nil {
return err
}
output, ok := d.GetOk("result_output_file")
if ok && output.(string) != "" {
- if err = tccommon.WriteToFile(output.(string), resultImageId); err != nil {
- return err
+ if e := tccommon.WriteToFile(output.(string), dataSourceTencentCloudImageReadOutputContent(ctx)); e != nil {
+ return e
}
}
diff --git a/tencentcloud/services/cvm/data_source_tc_image_extension.go b/tencentcloud/services/cvm/data_source_tc_image_extension.go
new file mode 100644
index 0000000000..0e56d60b96
--- /dev/null
+++ b/tencentcloud/services/cvm/data_source_tc_image_extension.go
@@ -0,0 +1,80 @@
+package cvm
+
+import (
+ "context"
+ "errors"
+ "fmt"
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
+ "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
+ "regexp"
+ "strings"
+
+ cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
+)
+
+func dataSourceTencentCloudImageReadPostHandleResponse0(ctx context.Context, req map[string]interface{}, resp *cvm.DescribeImagesResponseParams) error {
+ d := tccommon.ResourceDataFromContext(ctx)
+ images := resp.ImageSet
+ var err error
+ if len(images) == 0 {
+ return errors.New("No image found")
+ }
+
+ var osName string
+ if v, ok := d.GetOk("os_name"); ok {
+ osName = v.(string)
+ }
+
+ var regImageName string
+ var imageNameRegex *regexp.Regexp
+ if v, ok := d.GetOk("image_name_regex"); ok {
+ regImageName = v.(string)
+ imageNameRegex, err = regexp.Compile(regImageName)
+ if err != nil {
+ return fmt.Errorf("image_name_regex format error,%s", err.Error())
+ }
+ }
+
+ var resultImageId string
+ images = sortImages(images)
+ for _, image := range images {
+ if osName != "" {
+ if strings.Contains(strings.ToLower(*image.OsName), strings.ToLower(osName)) {
+ resultImageId = *image.ImageId
+ _ = d.Set("image_name", *image.ImageName)
+ break
+ }
+ continue
+ }
+
+ if imageNameRegex != nil {
+ if imageNameRegex.MatchString(*image.ImageName) {
+ resultImageId = *image.ImageId
+ _ = d.Set("image_name", *image.ImageName)
+ break
+ }
+ continue
+ }
+
+ resultImageId = *image.ImageId
+ _ = d.Set("image_name", *image.ImageName)
+ break
+ }
+
+ if resultImageId == "" {
+ return errors.New("No image found")
+ }
+
+ d.SetId(helper.DataResourceIdHash(resultImageId))
+ if err := d.Set("image_id", resultImageId); err != nil {
+ return err
+ }
+
+ context.WithValue(ctx, "resultImageId", resultImageId)
+ return nil
+}
+
+func dataSourceTencentCloudImageReadOutputContent(ctx context.Context) interface{} {
+ resultImageId := ctx.Value("resultImageId").(string)
+ return resultImageId
+}
diff --git a/tencentcloud/services/cvm/data_source_tc_images.go b/tencentcloud/services/cvm/data_source_tc_images.go
index b105b0ac25..de0085ff83 100644
--- a/tencentcloud/services/cvm/data_source_tc_images.go
+++ b/tencentcloud/services/cvm/data_source_tc_images.go
@@ -2,137 +2,106 @@ package cvm
import (
"context"
- "fmt"
- "log"
- "regexp"
- "strings"
-
- tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
-
- svccbs "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/cbs"
)
func DataSourceTencentCloudImages() *schema.Resource {
return &schema.Resource{
Read: dataSourceTencentCloudImagesRead,
-
Schema: map[string]*schema.Schema{
"image_id": {
Type: schema.TypeString,
Optional: true,
Description: "ID of the image to be queried.",
},
- "image_type": {
- Type: schema.TypeList,
- Optional: true,
- Elem: &schema.Schema{Type: schema.TypeString},
- Description: "A list of the image type to be queried. Valid values: 'PUBLIC_IMAGE', 'PRIVATE_IMAGE', 'SHARED_IMAGE', 'MARKET_IMAGE'.",
- },
+
"image_name_regex": {
Type: schema.TypeString,
Optional: true,
ConflictsWith: []string{"os_name"},
- ValidateFunc: tccommon.ValidateNameRegex,
Description: "A regex string to apply to the image list returned by TencentCloud, conflict with 'os_name'. **NOTE**: it is not wildcard, should look like `image_name_regex = \"^CentOS\\s+6\\.8\\s+64\\w*\"`.",
},
- "os_name": {
- Type: schema.TypeString,
- Optional: true,
- ConflictsWith: []string{"image_name_regex"},
- ValidateFunc: tccommon.ValidateNotEmpty,
- Description: "A string to apply with fuzzy match to the os_name attribute on the image list returned by TencentCloud, conflict with 'image_name_regex'.",
- },
- "instance_type": {
- Type: schema.TypeString,
- Optional: true,
- Description: "Instance type, such as `S1.SMALL1`.",
- },
- "result_output_file": {
- Type: schema.TypeString,
+
+ "image_type": {
+ Type: schema.TypeList,
Optional: true,
- Description: "Used to save results.",
+ Description: "A list of the image type to be queried. Valid values: 'PUBLIC_IMAGE', 'PRIVATE_IMAGE', 'SHARED_IMAGE', 'MARKET_IMAGE'.",
+ Elem: &schema.Schema{
+ Type: schema.TypeString,
+ },
},
+
"images": {
Type: schema.TypeList,
Computed: true,
Description: "An information list of image. Each element contains the following attributes:",
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
- "image_id": {
+ "architecture": {
Type: schema.TypeString,
Computed: true,
- Description: "ID of the image.",
+ Description: "Architecture of the image.",
},
- "os_name": {
+ "created_time": {
Type: schema.TypeString,
Computed: true,
- Description: "OS name of the image.",
+ Description: "Created time of the image.",
},
- "image_type": {
+ "image_creator": {
Type: schema.TypeString,
Computed: true,
- Description: "Type of the image.",
+ Description: "Image creator of the image.",
},
- "created_time": {
+ "image_description": {
Type: schema.TypeString,
Computed: true,
- Description: "Created time of the image.",
+ Description: "Description of the image.",
},
- "image_name": {
+ "image_id": {
Type: schema.TypeString,
Computed: true,
- Description: "Name of the image.",
+ Description: "ID of the image.",
},
- "image_description": {
+ "image_name": {
Type: schema.TypeString,
Computed: true,
- Description: "Description of the image.",
+ Description: "Name of the image.",
},
"image_size": {
Type: schema.TypeInt,
Computed: true,
Description: "Size of the image.",
},
- "architecture": {
+ "image_source": {
Type: schema.TypeString,
Computed: true,
- Description: "Architecture of the image.",
+ Description: "Image source of the image.",
},
"image_state": {
Type: schema.TypeString,
Computed: true,
Description: "State of the image.",
},
- "platform": {
+ "image_type": {
Type: schema.TypeString,
Computed: true,
- Description: "Platform of the image.",
+ Description: "Type of the image.",
},
- "image_creator": {
+ "os_name": {
Type: schema.TypeString,
Computed: true,
- Description: "Image creator of the image.",
+ Description: "OS name of the image.",
},
- "image_source": {
+ "platform": {
Type: schema.TypeString,
Computed: true,
- Description: "Image source of the image.",
- },
- "sync_percent": {
- Type: schema.TypeInt,
- Computed: true,
- Description: "Sync percent of the image.",
- },
- "support_cloud_init": {
- Type: schema.TypeBool,
- Computed: true,
- Description: "Whether support cloud-init.",
+ Description: "Platform of the image.",
},
"snapshots": {
Type: schema.TypeList,
@@ -140,202 +109,126 @@ func DataSourceTencentCloudImages() *schema.Resource {
Description: "List of snapshot details.",
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
- "snapshot_id": {
- Type: schema.TypeString,
+ "disk_size": {
+ Type: schema.TypeInt,
Computed: true,
- Description: "Snapshot ID.",
+ Description: "Size of the cloud disk used to create the snapshot; unit: GB.",
},
- "snapshot_name": {
+ "disk_usage": {
Type: schema.TypeString,
Computed: true,
- Description: "Snapshot name, the user-defined snapshot alias.",
+ Description: "Type of the cloud disk used to create the snapshot.",
},
- "disk_usage": {
+ "snapshot_id": {
Type: schema.TypeString,
Computed: true,
- Description: "Type of the cloud disk used to create the snapshot.",
+ Description: "Snapshot ID.",
},
- "disk_size": {
- Type: schema.TypeInt,
+ "snapshot_name": {
+ Type: schema.TypeString,
Computed: true,
- Description: "Size of the cloud disk used to create the snapshot; unit: GB.",
+ Description: "Snapshot name, the user-defined snapshot alias.",
},
},
},
},
+ "support_cloud_init": {
+ Type: schema.TypeBool,
+ Computed: true,
+ Description: "Whether support cloud-init.",
+ },
+ "sync_percent": {
+ Type: schema.TypeInt,
+ Computed: true,
+ Description: "Sync percent of the image.",
+ },
},
},
},
+
+ "instance_type": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "Instance type, such as `S1.SMALL1`.",
+ },
+
+ "os_name": {
+ Type: schema.TypeString,
+ Optional: true,
+ ConflictsWith: []string{"image_name_regex"},
+ Description: "A string to apply with fuzzy match to the os_name attribute on the image list returned by TencentCloud, conflict with 'image_name_regex'.",
+ },
+
+ "result_output_file": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "Used to save results.",
+ },
},
}
}
func dataSourceTencentCloudImagesRead(d *schema.ResourceData, meta interface{}) error {
defer tccommon.LogElapsed("data_source.tencentcloud_images.read")()
+ defer tccommon.InconsistentCheck(d, meta)()
- logId := tccommon.GetLogId(tccommon.ContextNil)
- ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
+ logId := tccommon.GetLogId(nil)
+ ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
- cvmService := CvmService{
- client: meta.(tccommon.ProviderMeta).GetAPIV3Conn(),
- }
-
- cbsService := svccbs.NewCbsService(meta.(tccommon.ProviderMeta).GetAPIV3Conn())
-
- var (
- imageId string
- imageType []string
- imageName string
- osName string
- imageNameRegex *regexp.Regexp
- err error
- )
-
- filter := make(map[string][]string)
+ service := CvmService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
+ paramMap := make(map[string]interface{})
+ var filtersList []*cvm.Filter
+ filtersMap := map[string]*cvm.Filter{}
+ filter := cvm.Filter{}
+ name := "image-id"
+ filter.Name = &name
if v, ok := d.GetOk("image_id"); ok {
- imageId = v.(string)
- if imageId != "" {
- filter["image-id"] = []string{imageId}
- }
+ filter.Values = []*string{helper.String(v.(string))}
}
-
- if v, ok := d.GetOk("image_type"); ok {
- for _, vv := range v.([]interface{}) {
- if vv.(string) != "" {
- imageType = append(imageType, vv.(string))
- }
- }
- if len(imageType) > 0 {
- filter["image-type"] = imageType
- }
+ filtersMap["Temp0"] = &filter
+ if v, ok := filtersMap["Temp0"]; ok {
+ filtersList = append(filtersList, v)
}
-
- if v, ok := d.GetOk("image_name_regex"); ok {
- imageName = v.(string)
- if imageName != "" {
- imageNameRegex, err = regexp.Compile(imageName)
- if err != nil {
- return fmt.Errorf("image_name_regex format error,%s", err.Error())
- }
- }
+ filter2 := cvm.Filter{}
+ name2 := "image_type"
+ filter2.Name = &name2
+ if v, ok := d.GetOk("image_type"); ok {
+ filter2.Values = []*string{helper.String(v.(string))}
}
-
- if v, ok := d.GetOk("os_name"); ok {
- osName = v.(string)
+ filtersMap["Temp1"] = &filter2
+ if v, ok := filtersMap["Temp1"]; ok {
+ filtersList = append(filtersList, v)
}
+ paramMap["Filters"] = filtersList
- var instanceType string
- if v, ok := d.GetOk("instance_type"); ok {
- instanceType = v.(string)
+ if err := dataSourceTencentCloudImagesReadPostFillRequest0(ctx, paramMap); err != nil {
+ return err
}
- var images []*cvm.Image
- err = resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
- var e error
- images, e = cvmService.DescribeImagesByFilter(ctx, filter, instanceType)
+ var respData *cvm.DescribeImagesResponseParams
+ err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
+ result, e := service.DescribeImagesByFilter(ctx, paramMap)
if e != nil {
- return tccommon.RetryError(e, tccommon.InternalError)
+ return tccommon.RetryError(e)
}
+ respData = result
return nil
})
if err != nil {
return err
}
- var results []*cvm.Image
- images = sortImages(images)
-
- if osName == "" && imageName == "" {
- results = images
- } else {
- for _, image := range images {
- if osName != "" {
- if strings.Contains(strings.ToLower(*image.OsName), strings.ToLower(osName)) {
- results = append(results, image)
- continue
- }
- }
- if imageNameRegex != nil {
- if imageNameRegex.MatchString(*image.ImageName) {
- results = append(results, image)
- continue
- }
- }
- }
- }
-
- imageList := make([]map[string]interface{}, 0, len(results))
- ids := make([]string, 0, len(results))
- for _, image := range results {
- snapshots, err := imagesReadSnapshotByIds(ctx, cbsService, image)
- if err != nil {
- return err
- }
-
- mapping := map[string]interface{}{
- "image_id": image.ImageId,
- "os_name": image.OsName,
- "image_type": image.ImageType,
- "created_time": image.CreatedTime,
- "image_name": image.ImageName,
- "image_description": image.ImageDescription,
- "image_size": image.ImageSize,
- "architecture": image.Architecture,
- "image_state": image.ImageState,
- "platform": image.Platform,
- "image_creator": image.ImageCreator,
- "image_source": image.ImageSource,
- "sync_percent": image.SyncPercent,
- "support_cloud_init": image.IsSupportCloudinit,
- "snapshots": snapshots,
- }
- imageList = append(imageList, mapping)
- ids = append(ids, *image.ImageId)
- }
-
- d.SetId(helper.DataResourceIdsHash(ids))
- err = d.Set("images", imageList)
- if err != nil {
- log.Printf("[CRITAL]%s provider set image list fail, reason:%s\n ", logId, err.Error())
+ if err := dataSourceTencentCloudImagesReadPostHandleResponse0(ctx, paramMap, respData); err != nil {
return err
}
output, ok := d.GetOk("result_output_file")
if ok && output.(string) != "" {
- if err := tccommon.WriteToFile(output.(string), imageList); err != nil {
- return err
+ if e := tccommon.WriteToFile(output.(string), dataSourceTencentCloudImagesReadOutputContent(ctx)); e != nil {
+ return e
}
}
return nil
}
-
-func imagesReadSnapshotByIds(ctx context.Context, cbsService svccbs.CbsService, image *cvm.Image) (snapshotResults []map[string]interface{}, errRet error) {
- if len(image.SnapshotSet) == 0 {
- return
- }
-
- snapshotByIds := make([]*string, 0, len(image.SnapshotSet))
- for _, snapshot := range image.SnapshotSet {
- snapshotByIds = append(snapshotByIds, snapshot.SnapshotId)
- }
-
- snapshots, errRet := cbsService.DescribeSnapshotByIds(ctx, snapshotByIds)
- if errRet != nil {
- return
- }
-
- snapshotResults = make([]map[string]interface{}, 0, len(snapshots))
- for _, snapshot := range snapshots {
- snapshotMap := make(map[string]interface{}, 4)
- snapshotMap["snapshot_id"] = snapshot.SnapshotId
- snapshotMap["disk_usage"] = snapshot.DiskUsage
- snapshotMap["disk_size"] = snapshot.DiskSize
- snapshotMap["snapshot_name"] = snapshot.SnapshotName
-
- snapshotResults = append(snapshotResults, snapshotMap)
- }
-
- return
-}
diff --git a/tencentcloud/services/cvm/data_source_tc_images_extension.go b/tencentcloud/services/cvm/data_source_tc_images_extension.go
new file mode 100644
index 0000000000..96d5c05471
--- /dev/null
+++ b/tencentcloud/services/cvm/data_source_tc_images_extension.go
@@ -0,0 +1,152 @@
+package cvm
+
+import (
+ "context"
+ "fmt"
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
+ "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
+ svccbs "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/cbs"
+ "log"
+ "regexp"
+ "strings"
+
+ cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
+)
+
+func dataSourceTencentCloudImagesReadOutputContent(ctx context.Context) interface{} {
+ imageList := ctx.Value("imageList").([]interface{})
+ return imageList
+}
+
+func dataSourceTencentCloudImagesReadPostHandleResponse0(ctx context.Context, req map[string]interface{}, resp *cvm.DescribeImagesResponseParams) error {
+ d := tccommon.ResourceDataFromContext(ctx)
+ images := resp.ImageSet
+ osName := ctx.Value("osName").(string)
+ imageName := ctx.Value("imageName").(string)
+ imageNameRegex := ctx.Value("imageNameRegex").(*regexp.Regexp)
+ var results []*cvm.Image
+ var err error
+ images = sortImages(images)
+ if osName == "" && imageName == "" {
+ results = images
+ } else {
+ for _, image := range images {
+ if osName != "" {
+ if strings.Contains(strings.ToLower(*image.OsName), strings.ToLower(osName)) {
+ results = append(results, image)
+ continue
+ }
+ }
+ if imageNameRegex != nil {
+ if imageNameRegex.MatchString(*image.ImageName) {
+ results = append(results, image)
+ continue
+ }
+ }
+ }
+ }
+
+ logId := tccommon.GetLogId(tccommon.ContextNil)
+ meta := tccommon.ProviderMetaFromContext(ctx)
+ cbsService := svccbs.NewCbsService(meta.(tccommon.ProviderMeta).GetAPIV3Conn())
+ imageList := make([]map[string]interface{}, 0, len(results))
+ ids := make([]string, 0, len(results))
+ for _, image := range results {
+ snapshots, err := imagesReadSnapshotByIds(ctx, cbsService, image)
+ if err != nil {
+ return err
+ }
+
+ mapping := map[string]interface{}{
+ "image_id": image.ImageId,
+ "os_name": image.OsName,
+ "image_type": image.ImageType,
+ "created_time": image.CreatedTime,
+ "image_name": image.ImageName,
+ "image_description": image.ImageDescription,
+ "image_size": image.ImageSize,
+ "architecture": image.Architecture,
+ "image_state": image.ImageState,
+ "platform": image.Platform,
+ "image_creator": image.ImageCreator,
+ "image_source": image.ImageSource,
+ "sync_percent": image.SyncPercent,
+ "support_cloud_init": image.IsSupportCloudinit,
+ "snapshots": snapshots,
+ }
+ imageList = append(imageList, mapping)
+ ids = append(ids, *image.ImageId)
+ }
+
+ d.SetId(helper.DataResourceIdsHash(ids))
+ err = d.Set("images", imageList)
+ if err != nil {
+ log.Printf("[CRITAL]%s provider set image list fail, reason:%s\n ", logId, err.Error())
+ return err
+ }
+
+ context.WithValue(ctx, "imageList", imageList)
+ return nil
+}
+
+func dataSourceTencentCloudImagesReadPostFillRequest0(ctx context.Context, req map[string]interface{}) error {
+ d := tccommon.ResourceDataFromContext(ctx)
+ var (
+ imageName string
+ osName string
+ instanceType string
+ imageNameRegex *regexp.Regexp
+ err error
+ )
+ if v, ok := d.GetOk("image_name_regex"); ok {
+ imageName = v.(string)
+ if imageName != "" {
+ imageNameRegex, err = regexp.Compile(imageName)
+ if err != nil {
+ return fmt.Errorf("image_name_regex format error,%s", err.Error())
+ }
+ }
+ }
+
+ if v, ok := d.GetOk("os_name"); ok {
+ osName = v.(string)
+ }
+
+ if v, ok := d.GetOk("instance_type"); ok {
+ instanceType = v.(string)
+ }
+
+ context.WithValue(ctx, "imageNameRegex", imageNameRegex)
+ context.WithValue(ctx, "osName", osName)
+ context.WithValue(ctx, "instanceType", instanceType)
+ return nil
+}
+
+func imagesReadSnapshotByIds(ctx context.Context, cbsService svccbs.CbsService, image *cvm.Image) (snapshotResults []map[string]interface{}, errRet error) {
+ if len(image.SnapshotSet) == 0 {
+ return
+ }
+
+ snapshotByIds := make([]*string, 0, len(image.SnapshotSet))
+ for _, snapshot := range image.SnapshotSet {
+ snapshotByIds = append(snapshotByIds, snapshot.SnapshotId)
+ }
+
+ snapshots, errRet := cbsService.DescribeSnapshotByIds(ctx, snapshotByIds)
+ if errRet != nil {
+ return
+ }
+
+ snapshotResults = make([]map[string]interface{}, 0, len(snapshots))
+ for _, snapshot := range snapshots {
+ snapshotMap := make(map[string]interface{}, 4)
+ snapshotMap["snapshot_id"] = snapshot.SnapshotId
+ snapshotMap["disk_usage"] = snapshot.DiskUsage
+ snapshotMap["disk_size"] = snapshot.DiskSize
+ snapshotMap["snapshot_name"] = snapshot.SnapshotName
+
+ snapshotResults = append(snapshotResults, snapshotMap)
+ }
+
+ return
+}
diff --git a/tencentcloud/services/cvm/data_source_tc_instance_types.go b/tencentcloud/services/cvm/data_source_tc_instance_types.go
index 5b1fe66b7e..1a9eea539f 100644
--- a/tencentcloud/services/cvm/data_source_tc_instance_types.go
+++ b/tencentcloud/services/cvm/data_source_tc_instance_types.go
@@ -2,43 +2,39 @@ package cvm
import (
"context"
- "log"
-
- tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
)
func DataSourceTencentCloudInstanceTypes() *schema.Resource {
return &schema.Resource{
Read: dataSourceTencentCloudInstanceTypesRead,
-
Schema: map[string]*schema.Schema{
+ "availability_zone": {
+ Type: schema.TypeString,
+ Optional: true,
+ ConflictsWith: []string{"filter"},
+ Description: "The available zone that the CVM instance locates at. This field is conflict with `filter`.",
+ },
+
"cpu_core_count": {
Type: schema.TypeInt,
Optional: true,
Description: "The number of CPU cores of the instance.",
},
- "gpu_core_count": {
- Type: schema.TypeInt,
- Optional: true,
- Description: "The number of GPU cores of the instance.",
- },
- "memory_size": {
- Type: schema.TypeInt,
+
+ "exclude_sold_out": {
+ Type: schema.TypeBool,
Optional: true,
- Description: "Instance memory capacity, unit in GB.",
- },
- "availability_zone": {
- Type: schema.TypeString,
- Optional: true,
- ConflictsWith: []string{"filter"},
- Description: "The available zone that the CVM instance locates at. This field is conflict with `filter`.",
+ Default: false,
+ Description: "Indicate to filter instances types that is sold out or not, default is false.",
},
+
"filter": {
Type: schema.TypeSet,
Optional: true,
@@ -55,25 +51,21 @@ func DataSourceTencentCloudInstanceTypes() *schema.Resource {
"values": {
Type: schema.TypeList,
Required: true,
- Elem: &schema.Schema{Type: schema.TypeString},
Description: "The filter values.",
+ Elem: &schema.Schema{
+ Type: schema.TypeString,
+ },
},
},
},
},
- "exclude_sold_out": {
- Type: schema.TypeBool,
- Optional: true,
- Default: false,
- Description: "Indicate to filter instances types that is sold out or not, default is false.",
- },
- "result_output_file": {
- Type: schema.TypeString,
+
+ "gpu_core_count": {
+ Type: schema.TypeInt,
Optional: true,
- Description: "Used to save results.",
+ Description: "The number of GPU cores of the instance.",
},
- // Computed values.
"instance_types": {
Type: schema.TypeList,
Computed: true,
@@ -85,35 +77,35 @@ func DataSourceTencentCloudInstanceTypes() *schema.Resource {
Computed: true,
Description: "The available zone that the CVM instance locates at.",
},
- "instance_type": {
- Type: schema.TypeString,
- Computed: true,
- Description: "Type of the instance.",
- },
"cpu_core_count": {
Type: schema.TypeInt,
Computed: true,
Description: "The number of CPU cores of the instance.",
},
+ "family": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "Type series of the instance.",
+ },
"gpu_core_count": {
Type: schema.TypeInt,
Computed: true,
Description: "The number of GPU cores of the instance.",
},
- "memory_size": {
- Type: schema.TypeInt,
+ "instance_charge_type": {
+ Type: schema.TypeString,
Computed: true,
- Description: "Instance memory capacity, unit in GB.",
+ Description: "Charge type of the instance.",
},
- "family": {
+ "instance_type": {
Type: schema.TypeString,
Computed: true,
- Description: "Type series of the instance.",
+ Description: "Type of the instance.",
},
- "instance_charge_type": {
- Type: schema.TypeString,
+ "memory_size": {
+ Type: schema.TypeInt,
Computed: true,
- Description: "Charge type of the instance.",
+ Description: "Instance memory capacity, unit in GB.",
},
"status": {
Type: schema.TypeString,
@@ -123,102 +115,80 @@ func DataSourceTencentCloudInstanceTypes() *schema.Resource {
},
},
},
+
+ "memory_size": {
+ Type: schema.TypeInt,
+ Optional: true,
+ Description: "Instance memory capacity, unit in GB.",
+ },
+
+ "result_output_file": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "Used to save results.",
+ },
},
}
}
func dataSourceTencentCloudInstanceTypesRead(d *schema.ResourceData, meta interface{}) error {
defer tccommon.LogElapsed("data_source.tencentcloud_instance_types.read")()
- logId := tccommon.GetLogId(tccommon.ContextNil)
- ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
- cvmService := CvmService{
- client: meta.(tccommon.ProviderMeta).GetAPIV3Conn(),
- }
+ defer tccommon.InconsistentCheck(d, meta)()
- isExcludeSoldOut := d.Get("exclude_sold_out").(bool)
- cpu, cpuOk := d.GetOk("cpu_core_count")
- gpu, gpuOk := d.GetOk("gpu_core_count")
- memory, memoryOk := d.GetOk("memory_size")
- var instanceSellTypes []*cvm.InstanceTypeQuotaItem
- var errRet error
- var err error
- typeList := make([]map[string]interface{}, 0)
- ids := make([]string, 0)
-
- var zone string
- var zone_in = 0
- if v, ok := d.GetOk("availability_zone"); ok {
- zone = v.(string)
- zone_in = 1
- }
- filters := d.Get("filter").(*schema.Set).List()
- filterMap := make(map[string][]string, len(filters)+zone_in)
- for _, v := range filters {
- item := v.(map[string]interface{})
- name := item["name"].(string)
- values := item["values"].([]interface{})
- filterValues := make([]string, 0, len(values))
- for _, value := range values {
- filterValues = append(filterValues, value.(string))
+ logId := tccommon.GetLogId(nil)
+ ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
+
+ service := CvmService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
+
+ paramMap := make(map[string]interface{})
+ if v, ok := d.GetOk("filters"); ok {
+ filtersSet := v.([]interface{})
+ tmpSet := make([]*cvm.Filter, 0, len(filtersSet))
+ for _, item := range filtersSet {
+ filtersMap := item.(map[string]interface{})
+ filter := cvm.Filter{}
+ if v, ok := filtersMap["name"]; ok {
+ filter.Name = helper.String(v.(string))
+ }
+ if v, ok := filtersMap["values"]; ok {
+ valuesSet := v.(*schema.Set).List()
+ for i := range valuesSet {
+ values := valuesSet[i].(string)
+ filter.Values = append(filter.Values, helper.String(values))
+ }
+ }
+ tmpSet = append(tmpSet, &filter)
}
- filterMap[name] = filterValues
+ paramMap["Filters"] = tmpSet
}
- if zone != "" {
- filterMap["zone"] = []string{zone}
+
+ if err := dataSourceTencentCloudInstanceTypesReadPostFillRequest0(ctx, paramMap); err != nil {
+ return err
}
- err = resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
- instanceSellTypes, errRet = cvmService.DescribeInstancesSellTypeByFilter(ctx, filterMap)
- if errRet != nil {
- return tccommon.RetryError(errRet, tccommon.InternalError)
+
+ var respData *cvm.DescribeZoneInstanceConfigInfosResponseParams
+ err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
+ result, e := service.DescribeInstanceTypesByFilter(ctx, paramMap)
+ if e != nil {
+ return tccommon.RetryError(e)
}
+ respData = result
return nil
})
if err != nil {
return err
}
- for _, instanceType := range instanceSellTypes {
- flag := true
- if cpuOk && int64(cpu.(int)) != *instanceType.Cpu {
- flag = false
- }
- if gpuOk && int64(gpu.(int)) != *instanceType.Gpu {
- flag = false
- }
- if memoryOk && int64(memory.(int)) != *instanceType.Memory {
- flag = false
- }
- if isExcludeSoldOut && CVM_SOLD_OUT_STATUS == *instanceType.Status {
- flag = false
- }
-
- if flag {
- mapping := map[string]interface{}{
- "availability_zone": instanceType.Zone,
- "cpu_core_count": instanceType.Cpu,
- "gpu_core_count": instanceType.Gpu,
- "memory_size": instanceType.Memory,
- "family": instanceType.InstanceFamily,
- "instance_type": instanceType.InstanceType,
- "instance_charge_type": instanceType.InstanceChargeType,
- "status": instanceType.Status,
- }
- typeList = append(typeList, mapping)
- ids = append(ids, *instanceType.InstanceType)
- }
- }
- d.SetId(helper.DataResourceIdsHash(ids))
- err = d.Set("instance_types", typeList)
- if err != nil {
- log.Printf("[CRITAL]%s provider set instance type list fail, reason:%s\n ", logId, err.Error())
+ if err := dataSourceTencentCloudInstanceTypesReadPostHandleResponse0(ctx, paramMap, respData); err != nil {
return err
}
output, ok := d.GetOk("result_output_file")
if ok && output.(string) != "" {
- if err := tccommon.WriteToFile(output.(string), typeList); err != nil {
- return err
+ if e := tccommon.WriteToFile(output.(string), dataSourceTencentCloudInstanceTypesReadOutputContent(ctx)); e != nil {
+ return e
}
}
+
return nil
}
diff --git a/tencentcloud/services/cvm/data_source_tc_instance_types_extension.go b/tencentcloud/services/cvm/data_source_tc_instance_types_extension.go
new file mode 100644
index 0000000000..0b13edc4d3
--- /dev/null
+++ b/tencentcloud/services/cvm/data_source_tc_instance_types_extension.go
@@ -0,0 +1,96 @@
+package cvm
+
+import (
+ "context"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
+ "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
+ "log"
+
+ cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
+)
+
+func dataSourceTencentCloudInstanceTypesReadPostFillRequest0(ctx context.Context, req map[string]interface{}) error {
+ d := tccommon.ResourceDataFromContext(ctx)
+ var zone string
+ var zone_in = 0
+ if v, ok := d.GetOk("availability_zone"); ok {
+ zone = v.(string)
+ zone_in = 1
+ }
+ filters := d.Get("filter").(*schema.Set).List()
+ filterMap := make(map[string][]string, len(filters)+zone_in)
+ for _, v := range filters {
+ item := v.(map[string]interface{})
+ name := item["name"].(string)
+ values := item["values"].([]interface{})
+ filterValues := make([]string, 0, len(values))
+ for _, value := range values {
+ filterValues = append(filterValues, value.(string))
+ }
+ filterMap[name] = filterValues
+ }
+ if zone != "" {
+ filterMap["zone"] = []string{zone}
+ }
+
+ return nil
+}
+
+func dataSourceTencentCloudInstanceTypesReadPostHandleResponse0(ctx context.Context, req map[string]interface{}, resp *cvm.DescribeZoneInstanceConfigInfosResponseParams) error {
+ d := tccommon.ResourceDataFromContext(ctx)
+ logId := tccommon.GetLogId(tccommon.ContextNil)
+ isExcludeSoldOut := d.Get("exclude_sold_out").(bool)
+ cpu, cpuOk := d.GetOk("cpu_core_count")
+ gpu, gpuOk := d.GetOk("gpu_core_count")
+ memory, memoryOk := d.GetOk("memory_size")
+ var err error
+ typeList := make([]map[string]interface{}, 0)
+ ids := make([]string, 0)
+
+ instanceSellTypes := resp.InstanceTypeQuotaSet
+ for _, instanceType := range instanceSellTypes {
+ flag := true
+ if cpuOk && int64(cpu.(int)) != *instanceType.Cpu {
+ flag = false
+ }
+ if gpuOk && int64(gpu.(int)) != *instanceType.Gpu {
+ flag = false
+ }
+ if memoryOk && int64(memory.(int)) != *instanceType.Memory {
+ flag = false
+ }
+ if isExcludeSoldOut && CVM_SOLD_OUT_STATUS == *instanceType.Status {
+ flag = false
+ }
+
+ if flag {
+ mapping := map[string]interface{}{
+ "availability_zone": instanceType.Zone,
+ "cpu_core_count": instanceType.Cpu,
+ "gpu_core_count": instanceType.Gpu,
+ "memory_size": instanceType.Memory,
+ "family": instanceType.InstanceFamily,
+ "instance_type": instanceType.InstanceType,
+ "instance_charge_type": instanceType.InstanceChargeType,
+ "status": instanceType.Status,
+ }
+ typeList = append(typeList, mapping)
+ ids = append(ids, *instanceType.InstanceType)
+ }
+ }
+
+ d.SetId(helper.DataResourceIdsHash(ids))
+ err = d.Set("instance_types", typeList)
+ if err != nil {
+ log.Printf("[CRITAL]%s provider set instance type list fail, reason:%s\n ", logId, err.Error())
+ return err
+ }
+ context.WithValue(ctx, "typeList", typeList)
+ return nil
+}
+
+func dataSourceTencentCloudInstanceTypesReadOutputContent(ctx context.Context) interface{} {
+ typeList := ctx.Value("typeList").([]interface{})
+ return typeList
+}
diff --git a/tencentcloud/services/cvm/data_source_tc_instances_set.go b/tencentcloud/services/cvm/data_source_tc_instances_set.go
index 4f964a74bf..9043b14095 100644
--- a/tencentcloud/services/cvm/data_source_tc_instances_set.go
+++ b/tencentcloud/services/cvm/data_source_tc_instances_set.go
@@ -2,130 +2,60 @@ package cvm
import (
"context"
- "fmt"
- "log"
-
- tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
- "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
)
func DataSourceTencentCloudInstancesSet() *schema.Resource {
return &schema.Resource{
Read: dataSourceTencentCloudInstancesSetRead,
-
Schema: map[string]*schema.Schema{
- "instance_id": {
- Type: schema.TypeString,
- Optional: true,
- Description: "ID of the instances to be queried.",
- },
- "instance_name": {
- Type: schema.TypeString,
- Optional: true,
- ValidateFunc: tccommon.ValidateStringLengthInRange(1, 30),
- Description: "Name of the instances to be queried.",
- },
"availability_zone": {
Type: schema.TypeString,
Optional: true,
Description: "The available zone that the CVM instance locates at.",
},
- "project_id": {
- Type: schema.TypeInt,
- Optional: true,
- Description: "The project CVM belongs to.",
- },
- "vpc_id": {
- Type: schema.TypeString,
- Optional: true,
- Description: "ID of the vpc to be queried.",
- },
- "subnet_id": {
- Type: schema.TypeString,
- Optional: true,
- Description: "ID of a vpc subnetwork.",
- },
- "tags": {
- Type: schema.TypeMap,
- Optional: true,
- Description: "Tags of the instance.",
- },
- "result_output_file": {
+
+ "instance_id": {
Type: schema.TypeString,
Optional: true,
- Description: "Used to save results.",
+ Description: "ID of the instances to be queried.",
},
- // computed
"instance_list": {
Type: schema.TypeList,
Computed: true,
Description: "An information list of cvm instance. Each element contains the following attributes:",
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
- "instance_id": {
- Type: schema.TypeString,
- Computed: true,
- Description: "ID of the instances.",
- },
- "instance_name": {
- Type: schema.TypeString,
- Computed: true,
- Description: "Name of the instances.",
- },
- "instance_type": {
- Type: schema.TypeString,
- Computed: true,
- Description: "Type of the instance.",
- },
- "cpu": {
- Type: schema.TypeInt,
- Computed: true,
- Description: "The number of CPU cores of the instance.",
- },
- "memory": {
- Type: schema.TypeInt,
+ "allocate_public_ip": {
+ Type: schema.TypeBool,
Computed: true,
- Description: "Instance memory capacity, unit in GB.",
+ Description: "Indicates whether public ip is assigned.",
},
"availability_zone": {
Type: schema.TypeString,
Computed: true,
Description: "The available zone that the CVM instance locates at.",
},
- "project_id": {
- Type: schema.TypeInt,
- Computed: true,
- Description: "The project CVM belongs to.",
- },
- "image_id": {
- Type: schema.TypeString,
- Computed: true,
- Description: "ID of the image.",
- },
- "instance_charge_type": {
- Type: schema.TypeString,
- Computed: true,
- Description: "The charge type of the instance.",
- },
- "system_disk_type": {
+ "cam_role_name": {
Type: schema.TypeString,
Computed: true,
- Description: "Type of the system disk.",
+ Description: "CAM role name authorized to access.",
},
- "system_disk_size": {
+ "cpu": {
Type: schema.TypeInt,
Computed: true,
- Description: "Size of the system disk.",
+ Description: "The number of CPU cores of the instance.",
},
- "system_disk_id": {
+ "create_time": {
Type: schema.TypeString,
Computed: true,
- Description: "Image ID of the system disk.",
+ Description: "Creation time of the instance.",
},
"data_disks": {
Type: schema.TypeList,
@@ -133,20 +63,20 @@ func DataSourceTencentCloudInstancesSet() *schema.Resource {
Description: "An information list of data disk. Each element contains the following attributes:",
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
- "data_disk_type": {
+ "data_disk_id": {
Type: schema.TypeString,
Computed: true,
- Description: "Type of the data disk.",
+ Description: "Image ID of the data disk.",
},
"data_disk_size": {
Type: schema.TypeInt,
Computed: true,
Description: "Size of the data disk.",
},
- "data_disk_id": {
+ "data_disk_type": {
Type: schema.TypeString,
Computed: true,
- Description: "Image ID of the data disk.",
+ Description: "Type of the data disk.",
},
"delete_with_instance": {
Type: schema.TypeBool,
@@ -156,15 +86,40 @@ func DataSourceTencentCloudInstancesSet() *schema.Resource {
},
},
},
- "vpc_id": {
+ "expired_time": {
Type: schema.TypeString,
Computed: true,
- Description: "ID of the vpc.",
+ Description: "Expired time of the instance.",
},
- "subnet_id": {
+ "image_id": {
Type: schema.TypeString,
Computed: true,
- Description: "ID of a vpc subnetwork.",
+ Description: "ID of the image.",
+ },
+ "instance_charge_type": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "The charge type of the instance.",
+ },
+ "instance_charge_type_prepaid_renew_flag": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "The way that CVM instance will be renew automatically or not when it reach the end of the prepaid tenancy.",
+ },
+ "instance_id": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "ID of the instances.",
+ },
+ "instance_name": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "Name of the instances.",
+ },
+ "instance_type": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "Type of the instance.",
},
"internet_charge_type": {
Type: schema.TypeString,
@@ -176,172 +131,149 @@ func DataSourceTencentCloudInstancesSet() *schema.Resource {
Computed: true,
Description: "Public network maximum output bandwidth of the instance.",
},
- "allocate_public_ip": {
- Type: schema.TypeBool,
+ "memory": {
+ Type: schema.TypeInt,
Computed: true,
- Description: "Indicates whether public ip is assigned.",
+ Description: "Instance memory capacity, unit in GB.",
},
- "status": {
+ "private_ip": {
Type: schema.TypeString,
Computed: true,
- Description: "Status of the instance.",
+ Description: "Private IP of the instance.",
},
- "public_ip": {
- Type: schema.TypeString,
+ "project_id": {
+ Type: schema.TypeInt,
Computed: true,
- Description: "Public IP of the instance.",
+ Description: "The project CVM belongs to.",
},
- "private_ip": {
+ "public_ip": {
Type: schema.TypeString,
Computed: true,
- Description: "Private IP of the instance.",
+ Description: "Public IP of the instance.",
},
"security_groups": {
Type: schema.TypeList,
Computed: true,
- Elem: &schema.Schema{Type: schema.TypeString},
Description: "Security groups of the instance.",
+ Elem: &schema.Schema{
+ Type: schema.TypeString,
+ },
},
- "tags": {
- Type: schema.TypeMap,
+ "status": {
+ Type: schema.TypeString,
Computed: true,
- Description: "Tags of the instance.",
+ Description: "Status of the instance.",
},
- "create_time": {
+ "subnet_id": {
Type: schema.TypeString,
Computed: true,
- Description: "Creation time of the instance.",
+ Description: "ID of a vpc subnetwork.",
},
- "expired_time": {
+ "system_disk_id": {
Type: schema.TypeString,
Computed: true,
- Description: "Expired time of the instance.",
+ Description: "Image ID of the system disk.",
},
- "instance_charge_type_prepaid_renew_flag": {
+ "system_disk_size": {
+ Type: schema.TypeInt,
+ Computed: true,
+ Description: "Size of the system disk.",
+ },
+ "system_disk_type": {
Type: schema.TypeString,
Computed: true,
- Description: "The way that CVM instance will be renew automatically or not when it reach the end of the prepaid tenancy.",
+ Description: "Type of the system disk.",
},
- "cam_role_name": {
+ "tags": {
+ Type: schema.TypeMap,
+ Computed: true,
+ Description: "Tags of the instance.",
+ },
+ "vpc_id": {
Type: schema.TypeString,
Computed: true,
- Description: "CAM role name authorized to access.",
+ Description: "ID of the vpc.",
},
},
},
},
+
+ "instance_name": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "Name of the instances to be queried.",
+ },
+
+ "project_id": {
+ Type: schema.TypeInt,
+ Optional: true,
+ Description: "The project CVM belongs to.",
+ },
+
+ "subnet_id": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "ID of a vpc subnetwork.",
+ },
+
+ "tags": {
+ Type: schema.TypeMap,
+ Optional: true,
+ Description: "Tags of the instance.",
+ },
+
+ "vpc_id": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "ID of the vpc to be queried.",
+ },
+
+ "result_output_file": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "Used to save results.",
+ },
},
}
}
func dataSourceTencentCloudInstancesSetRead(d *schema.ResourceData, meta interface{}) error {
defer tccommon.LogElapsed("data_source.tencentcloud_instances_set.read")()
- logId := tccommon.GetLogId(tccommon.ContextNil)
- ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
- cvmService := CvmService{
- client: meta.(tccommon.ProviderMeta).GetAPIV3Conn(),
- }
+ defer tccommon.InconsistentCheck(d, meta)()
- filter := make(map[string]string)
- if v, ok := d.GetOk("instance_id"); ok {
- filter["instance-id"] = v.(string)
- }
- if v, ok := d.GetOk("instance_name"); ok {
- filter["instance-name"] = v.(string)
- }
- if v, ok := d.GetOk("availability_zone"); ok {
- filter["zone"] = v.(string)
- }
- if v, ok := d.GetOkExists("project_id"); ok {
- filter["project-id"] = fmt.Sprintf("%d", v.(int))
- }
- if v, ok := d.GetOk("vpc_id"); ok {
- filter["vpc-id"] = v.(string)
- }
- if v, ok := d.GetOk("subnet_id"); ok {
- filter["subnet-id"] = v.(string)
- }
-
- if v, ok := d.GetOk("tags"); ok {
- for key, value := range v.(map[string]interface{}) {
- filter["tag:"+key] = value.(string)
- }
- }
+ logId := tccommon.GetLogId(nil)
+ ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
- var instances []*cvm.Instance
- var errRet error
+ service := CvmService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
- instances, errRet = cvmService.DescribeInstanceInParallelByFilter(ctx, filter)
-
- if errRet != nil {
- return errRet
+ paramMap := make(map[string]interface{})
+ if err := dataSourceTencentCloudInstancesSetReadPostFillRequest0(ctx, paramMap); err != nil {
+ return err
}
- instanceList := make([]map[string]interface{}, 0, len(instances))
- ids := make([]string, 0, len(instances))
- for _, instance := range instances {
- mapping := map[string]interface{}{
- "instance_id": instance.InstanceId,
- "instance_name": instance.InstanceName,
- "instance_type": instance.InstanceType,
- "cpu": instance.CPU,
- "memory": instance.Memory,
- "availability_zone": instance.Placement.Zone,
- "project_id": instance.Placement.ProjectId,
- "image_id": instance.ImageId,
- "instance_charge_type": instance.InstanceChargeType,
- "system_disk_type": instance.SystemDisk.DiskType,
- "system_disk_size": instance.SystemDisk.DiskSize,
- "system_disk_id": instance.SystemDisk.DiskId,
- "vpc_id": instance.VirtualPrivateCloud.VpcId,
- "subnet_id": instance.VirtualPrivateCloud.SubnetId,
- "internet_charge_type": instance.InternetAccessible.InternetChargeType,
- "internet_max_bandwidth_out": instance.InternetAccessible.InternetMaxBandwidthOut,
- "allocate_public_ip": instance.InternetAccessible.PublicIpAssigned,
- "status": instance.InstanceState,
- "security_groups": helper.StringsInterfaces(instance.SecurityGroupIds),
- "tags": flattenCvmTagsMapping(instance.Tags),
- "create_time": instance.CreatedTime,
- "expired_time": instance.ExpiredTime,
- "instance_charge_type_prepaid_renew_flag": instance.RenewFlag,
- "cam_role_name": instance.CamRoleName,
- }
- if len(instance.PublicIpAddresses) > 0 {
- mapping["public_ip"] = *instance.PublicIpAddresses[0]
+ var respData *cvm.DescribeInstancesResponseParams
+ err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
+ result, e := service.DescribeInstancesSetByFilter(ctx, paramMap)
+ if e != nil {
+ return tccommon.RetryError(e)
}
- if len(instance.PrivateIpAddresses) > 0 {
- mapping["private_ip"] = *instance.PrivateIpAddresses[0]
- }
- dataDisks := make([]map[string]interface{}, 0, len(instance.DataDisks))
- for _, v := range instance.DataDisks {
- dataDisk := map[string]interface{}{
- "data_disk_type": v.DiskType,
- "data_disk_size": v.DiskSize,
- "data_disk_id": v.DiskId,
- "delete_with_instance": v.DeleteWithInstance,
- }
- dataDisks = append(dataDisks, dataDisk)
- }
- mapping["data_disks"] = dataDisks
- instanceList = append(instanceList, mapping)
- ids = append(ids, *instance.InstanceId)
- }
- log.Printf("[DEBUG]%s set instance attribute finished", logId)
- d.SetId(helper.DataResourceIdsHash(ids))
- err := d.Set("instance_list", instanceList)
+ respData = result
+ return nil
+ })
if err != nil {
- log.Printf("[CRITAL]%s provider set instance list fail, reason:%s\n ", logId, err.Error())
+ return err
+ }
+
+ if err := dataSourceTencentCloudInstancesSetReadPostHandleResponse0(ctx, paramMap, respData); err != nil {
return err
}
output, ok := d.GetOk("result_output_file")
if ok && output.(string) != "" {
- if err := tccommon.WriteToFile(output.(string), instanceList); err != nil {
- return err
+ if e := tccommon.WriteToFile(output.(string), dataSourceTencentCloudInstancesSetReadOutputContent(ctx)); e != nil {
+ return e
}
}
- log.Printf("[DEBUG]%s all operate finished", logId)
return nil
-
}
diff --git a/tencentcloud/services/cvm/data_source_tc_instances_set_extension.go b/tencentcloud/services/cvm/data_source_tc_instances_set_extension.go
new file mode 100644
index 0000000000..3e8d57cb01
--- /dev/null
+++ b/tencentcloud/services/cvm/data_source_tc_instances_set_extension.go
@@ -0,0 +1,111 @@
+package cvm
+
+import (
+ "context"
+ "fmt"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
+ "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
+ "log"
+
+ cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
+)
+
+func dataSourceTencentCloudInstancesSetReadPostFillRequest0(ctx context.Context, req map[string]interface{}) error {
+ d := tccommon.ResourceDataFromContext(ctx)
+ if v, ok := d.GetOk("instance_id"); ok {
+ req["instance-id"] = v.(string)
+ }
+ if v, ok := d.GetOk("instance_name"); ok {
+ req["instance-name"] = v.(string)
+ }
+ if v, ok := d.GetOk("availability_zone"); ok {
+ req["zone"] = v.(string)
+ }
+ if v, ok := d.GetOkExists("project_id"); ok {
+ req["project-id"] = fmt.Sprintf("%d", v.(int))
+ }
+ if v, ok := d.GetOk("vpc_id"); ok {
+ req["vpc-id"] = v.(string)
+ }
+ if v, ok := d.GetOk("subnet_id"); ok {
+ req["subnet-id"] = v.(string)
+ }
+
+ if v, ok := d.GetOk("tags"); ok {
+ for key, value := range v.(map[string]interface{}) {
+ req["tag:"+key] = value.(string)
+ }
+ }
+
+ return nil
+}
+
+func dataSourceTencentCloudInstancesSetReadPostHandleResponse0(ctx context.Context, req map[string]interface{}, resp *cvm.DescribeInstancesResponseParams) error {
+ logId := tccommon.GetLogId(tccommon.ContextNil)
+ d := tccommon.ResourceDataFromContext(ctx)
+ instances := resp.InstanceSet
+ instanceList := make([]map[string]interface{}, 0, len(instances))
+ ids := make([]string, 0, len(instances))
+ for _, instance := range instances {
+ mapping := map[string]interface{}{
+ "instance_id": instance.InstanceId,
+ "instance_name": instance.InstanceName,
+ "instance_type": instance.InstanceType,
+ "cpu": instance.CPU,
+ "memory": instance.Memory,
+ "availability_zone": instance.Placement.Zone,
+ "project_id": instance.Placement.ProjectId,
+ "image_id": instance.ImageId,
+ "instance_charge_type": instance.InstanceChargeType,
+ "system_disk_type": instance.SystemDisk.DiskType,
+ "system_disk_size": instance.SystemDisk.DiskSize,
+ "system_disk_id": instance.SystemDisk.DiskId,
+ "vpc_id": instance.VirtualPrivateCloud.VpcId,
+ "subnet_id": instance.VirtualPrivateCloud.SubnetId,
+ "internet_charge_type": instance.InternetAccessible.InternetChargeType,
+ "internet_max_bandwidth_out": instance.InternetAccessible.InternetMaxBandwidthOut,
+ "allocate_public_ip": instance.InternetAccessible.PublicIpAssigned,
+ "status": instance.InstanceState,
+ "security_groups": helper.StringsInterfaces(instance.SecurityGroupIds),
+ "tags": flattenCvmTagsMapping(instance.Tags),
+ "create_time": instance.CreatedTime,
+ "expired_time": instance.ExpiredTime,
+ "instance_charge_type_prepaid_renew_flag": instance.RenewFlag,
+ "cam_role_name": instance.CamRoleName,
+ }
+ if len(instance.PublicIpAddresses) > 0 {
+ mapping["public_ip"] = *instance.PublicIpAddresses[0]
+ }
+ if len(instance.PrivateIpAddresses) > 0 {
+ mapping["private_ip"] = *instance.PrivateIpAddresses[0]
+ }
+ dataDisks := make([]map[string]interface{}, 0, len(instance.DataDisks))
+ for _, v := range instance.DataDisks {
+ dataDisk := map[string]interface{}{
+ "data_disk_type": v.DiskType,
+ "data_disk_size": v.DiskSize,
+ "data_disk_id": v.DiskId,
+ "delete_with_instance": v.DeleteWithInstance,
+ }
+ dataDisks = append(dataDisks, dataDisk)
+ }
+ mapping["data_disks"] = dataDisks
+ instanceList = append(instanceList, mapping)
+ ids = append(ids, *instance.InstanceId)
+ }
+ log.Printf("[DEBUG]%s set instance attribute finished", logId)
+ d.SetId(helper.DataResourceIdsHash(ids))
+ err := d.Set("instance_list", instanceList)
+ if err != nil {
+ log.Printf("[CRITAL]%s provider set instance list fail, reason:%s\n ", logId, err.Error())
+ return err
+ }
+ context.WithValue(ctx, "instanceList", instanceList)
+ return nil
+}
+
+func dataSourceTencentCloudInstancesSetReadOutputContent(ctx context.Context) interface{} {
+ instanceList := ctx.Value("eipList").(*schema.Set).List()
+ return instanceList
+}
diff --git a/tencentcloud/services/cvm/data_source_tc_key_pairs.go b/tencentcloud/services/cvm/data_source_tc_key_pairs.go
index 6dbbf49d5f..ea78fc304a 100644
--- a/tencentcloud/services/cvm/data_source_tc_key_pairs.go
+++ b/tencentcloud/services/cvm/data_source_tc_key_pairs.go
@@ -2,24 +2,17 @@ package cvm
import (
"context"
- "fmt"
- "log"
- "regexp"
- "strings"
-
- tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
- "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
)
func DataSourceTencentCloudKeyPairs() *schema.Resource {
return &schema.Resource{
Read: dataSourceTencentCloudKeyPairsRead,
-
Schema: map[string]*schema.Schema{
"key_id": {
Type: schema.TypeString,
@@ -27,31 +20,25 @@ func DataSourceTencentCloudKeyPairs() *schema.Resource {
ConflictsWith: []string{"key_name", "project_id"},
Description: "ID of the key pair to be queried.",
},
+
"key_name": {
Type: schema.TypeString,
Optional: true,
ConflictsWith: []string{"key_id"},
Description: "Name of the key pair to be queried. Support regular expression search, only `^` and `$` are supported.",
},
- "project_id": {
- Type: schema.TypeInt,
- Optional: true,
- ConflictsWith: []string{"key_id"},
- Description: "Project ID of the key pair to be queried.",
- },
- "result_output_file": {
- Type: schema.TypeString,
- Optional: true,
- Description: "Used to save results.",
- },
- // computed
"key_pair_list": {
Type: schema.TypeList,
Computed: true,
Description: "An information list of key pair. Each element contains the following attributes:",
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
+ "create_time": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "Creation time of the key pair.",
+ },
"key_id": {
Type: schema.TypeString,
Computed: true,
@@ -72,98 +59,59 @@ func DataSourceTencentCloudKeyPairs() *schema.Resource {
Computed: true,
Description: "public key of the key pair.",
},
- "create_time": {
- Type: schema.TypeString,
- Computed: true,
- Description: "Creation time of the key pair.",
- },
},
},
},
+
+ "project_id": {
+ Type: schema.TypeInt,
+ Optional: true,
+ ConflictsWith: []string{"key_id"},
+ Description: "Project ID of the key pair to be queried.",
+ },
+
+ "result_output_file": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "Used to save results.",
+ },
},
}
}
func dataSourceTencentCloudKeyPairsRead(d *schema.ResourceData, meta interface{}) error {
defer tccommon.LogElapsed("data_source.tencentcloud_key_pairs.read")()
- logId := tccommon.GetLogId(tccommon.ContextNil)
- ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
- cvmService := CvmService{
- client: meta.(tccommon.ProviderMeta).GetAPIV3Conn(),
- }
+ defer tccommon.InconsistentCheck(d, meta)()
- keyId := d.Get("key_id").(string)
- keyName := d.Get("key_name").(string)
- name := keyName
- if keyName != "" {
- if name[0] == '^' {
- name = name[1:]
- }
- length := len(name)
- if length > 0 && name[length-1] == '$' {
- name = name[:length-1]
- }
+ logId := tccommon.GetLogId(nil)
+ ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
- pattern := `^[a-zA-Z0-9_]+$`
- if match, _ := regexp.MatchString(pattern, name); !match {
- return fmt.Errorf("key_name only support letters, numbers, and _ : %s", keyName)
- }
- }
+ service := CvmService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
- var projectId *int
- if v, ok := d.GetOkExists("project_id"); ok {
- vv := v.(int)
- projectId = &vv
- }
-
- var keyPairs []*cvm.KeyPair
- var errRet error
+ paramMap := make(map[string]interface{})
+ var respData *cvm.DescribeKeyPairsResponseParams
err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
- keyPairs, errRet = cvmService.DescribeKeyPairByFilter(ctx, keyId, name, projectId)
- if errRet != nil {
- return tccommon.RetryError(errRet, tccommon.InternalError)
+ result, e := service.DescribeKeyPairsByFilter(ctx, paramMap)
+ if e != nil {
+ return tccommon.RetryError(e)
}
+ respData = result
return nil
})
if err != nil {
return err
}
- keyPairList := make([]map[string]interface{}, 0, len(keyPairs))
- ids := make([]string, 0, len(keyPairs))
- namePattern, _ := regexp.Compile(keyName)
- for _, keyPair := range keyPairs {
- if match := namePattern.MatchString(*keyPair.KeyName); !match {
- continue
- }
- mapping := map[string]interface{}{
- "key_id": keyPair.KeyId,
- "key_name": keyPair.KeyName,
- "project_id": keyPair.ProjectId,
- "create_time": keyPair.CreatedTime,
- }
- if keyPair.PublicKey != nil {
- publicKey := *keyPair.PublicKey
- split := strings.Split(publicKey, " ")
- publicKey = strings.Join(split[0:len(split)-1], " ")
- mapping["public_key"] = publicKey
- }
- keyPairList = append(keyPairList, mapping)
- ids = append(ids, *keyPair.KeyId)
- }
-
- d.SetId(helper.DataResourceIdsHash(ids))
- err = d.Set("key_pair_list", keyPairList)
- if err != nil {
- log.Printf("[CRITAL]%s provider set key pair list fail, reason:%s\n ", logId, err.Error())
+ if err := dataSourceTencentCloudKeyPairsReadPostHandleResponse0(ctx, paramMap, respData); err != nil {
return err
}
output, ok := d.GetOk("result_output_file")
if ok && output.(string) != "" {
- if err := tccommon.WriteToFile(output.(string), keyPairList); err != nil {
- return err
+ if e := tccommon.WriteToFile(output.(string), dataSourceTencentCloudKeyPairsReadOutputContent(ctx)); e != nil {
+ return e
}
}
+
return nil
}
diff --git a/tencentcloud/services/cvm/data_source_tc_key_pairs_extension.go b/tencentcloud/services/cvm/data_source_tc_key_pairs_extension.go
new file mode 100644
index 0000000000..fd2c53a9d9
--- /dev/null
+++ b/tencentcloud/services/cvm/data_source_tc_key_pairs_extension.go
@@ -0,0 +1,108 @@
+package cvm
+
+import (
+ "context"
+ "fmt"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
+ "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
+ "log"
+ "regexp"
+ "strings"
+
+ cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
+)
+
+func dataSourceTencentCloudKeyPairsReadPostHandleResponse0(ctx context.Context, req map[string]interface{}, resp *cvm.DescribeKeyPairsResponseParams) error {
+ d := tccommon.ResourceDataFromContext(ctx)
+ logId := tccommon.GetLogId(tccommon.ContextNil)
+ var err error
+ keyPairs := resp.KeyPairSet
+ keyPairList := make([]map[string]interface{}, 0, len(keyPairs))
+ ids := make([]string, 0, len(keyPairs))
+ keyName := ctx.Value("key_name").(string)
+ namePattern, _ := regexp.Compile(keyName)
+ for _, keyPair := range keyPairs {
+ if match := namePattern.MatchString(*keyPair.KeyName); !match {
+ continue
+ }
+ mapping := map[string]interface{}{
+ "key_id": keyPair.KeyId,
+ "key_name": keyPair.KeyName,
+ "project_id": keyPair.ProjectId,
+ "create_time": keyPair.CreatedTime,
+ }
+ if keyPair.PublicKey != nil {
+ publicKey := *keyPair.PublicKey
+ split := strings.Split(publicKey, " ")
+ publicKey = strings.Join(split[0:len(split)-1], " ")
+ mapping["public_key"] = publicKey
+ }
+ keyPairList = append(keyPairList, mapping)
+ ids = append(ids, *keyPair.KeyId)
+ }
+
+ d.SetId(helper.DataResourceIdsHash(ids))
+ err = d.Set("key_pair_list", keyPairList)
+ if err != nil {
+ log.Printf("[CRITAL]%s provider set key pair list fail, reason:%s\n ", logId, err.Error())
+ return err
+ }
+
+ context.WithValue(ctx, "keyPairList", keyPairList)
+ return nil
+}
+
+func dataSourceTencentCloudKeyPairsReadOutputContent(ctx context.Context) interface{} {
+ eipList := ctx.Value("keyPairList").(*schema.Set).List()
+ return eipList
+}
+
+func dataSourceTencentCloudKeyPairsReadPreRequest0(ctx context.Context, req *cvm.DescribeKeyPairsRequest) error {
+ d := tccommon.ResourceDataFromContext(ctx)
+ keyId := d.Get("key_id").(string)
+ keyName := d.Get("key_name").(string)
+ name := keyName
+ if keyName != "" {
+ if name[0] == '^' {
+ name = name[1:]
+ }
+ length := len(name)
+ if length > 0 && name[length-1] == '$' {
+ name = name[:length-1]
+ }
+
+ pattern := `^[a-zA-Z0-9_]+$`
+ if match, _ := regexp.MatchString(pattern, name); !match {
+ return fmt.Errorf("key_name only support letters, numbers, and _ : %s", keyName)
+ }
+ }
+
+ var projectId *int
+ if v, ok := d.GetOkExists("project_id"); ok {
+ vv := v.(int)
+ projectId = &vv
+ }
+
+ if keyId != "" {
+ req.KeyIds = []*string{&keyId}
+ }
+ req.Filters = make([]*cvm.Filter, 0)
+ if name != "" {
+ filter := &cvm.Filter{
+ Name: helper.String("key-name"),
+ Values: []*string{&name},
+ }
+ req.Filters = append(req.Filters, filter)
+ }
+ if projectId != nil {
+ filter := &cvm.Filter{
+ Name: helper.String("project-id"),
+ Values: []*string{helper.String(fmt.Sprintf("%d", *projectId))},
+ }
+ req.Filters = append(req.Filters, filter)
+ }
+
+ context.WithValue(ctx, "keyName", keyName)
+ return nil
+}
diff --git a/tencentcloud/services/cvm/data_source_tc_placement_groups.go b/tencentcloud/services/cvm/data_source_tc_placement_groups.go
index 4820d818d8..28b475446b 100644
--- a/tencentcloud/services/cvm/data_source_tc_placement_groups.go
+++ b/tencentcloud/services/cvm/data_source_tc_placement_groups.go
@@ -2,36 +2,29 @@ package cvm
import (
"context"
- "log"
-
- tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
)
func DataSourceTencentCloudPlacementGroups() *schema.Resource {
return &schema.Resource{
Read: dataSourceTencentCloudPlacementGroupsRead,
-
Schema: map[string]*schema.Schema{
- "placement_group_id": {
- Type: schema.TypeString,
- Optional: true,
- Description: "ID of the placement group to be queried.",
- },
"name": {
Type: schema.TypeString,
Optional: true,
Description: "Name of the placement group to be queried.",
},
- "result_output_file": {
+
+ "placement_group_id": {
Type: schema.TypeString,
Optional: true,
- Description: "Used to save results.",
+ Description: "ID of the placement group to be queried.",
},
"placement_group_list": {
@@ -40,107 +33,98 @@ func DataSourceTencentCloudPlacementGroups() *schema.Resource {
Description: "An information list of placement group. Each element contains the following attributes:",
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
- "placement_group_id": {
- Type: schema.TypeString,
- Computed: true,
- Description: "ID of the placement group.",
- },
- "name": {
+ "create_time": {
Type: schema.TypeString,
Computed: true,
- Description: "Name of the placement group.",
+ Description: "Creation time of the placement group.",
},
- "type": {
- Type: schema.TypeString,
+ "current_num": {
+ Type: schema.TypeInt,
Computed: true,
- Description: "Type of the placement group.",
+ Description: "Number of hosts in the placement group.",
},
"cvm_quota_total": {
Type: schema.TypeInt,
Computed: true,
Description: "Maximum number of hosts in the placement group.",
},
- "current_num": {
- Type: schema.TypeInt,
- Computed: true,
- Description: "Number of hosts in the placement group.",
- },
"instance_ids": {
Type: schema.TypeList,
Computed: true,
- Elem: &schema.Schema{Type: schema.TypeString},
Description: "Host IDs in the placement group.",
+ Elem: &schema.Schema{
+ Type: schema.TypeString,
+ },
},
- "create_time": {
+ "name": {
Type: schema.TypeString,
Computed: true,
- Description: "Creation time of the placement group.",
+ Description: "Name of the placement group.",
+ },
+ "placement_group_id": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "ID of the placement group.",
+ },
+ "type": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "Type of the placement group.",
},
},
},
},
+
+ "result_output_file": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "Used to save results.",
+ },
},
}
}
func dataSourceTencentCloudPlacementGroupsRead(d *schema.ResourceData, meta interface{}) error {
defer tccommon.LogElapsed("data_source.tencentcloud_placement_groups.read")()
- logId := tccommon.GetLogId(tccommon.ContextNil)
- ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
- cvmService := CvmService{
- client: meta.(tccommon.ProviderMeta).GetAPIV3Conn(),
- }
+ defer tccommon.InconsistentCheck(d, meta)()
+
+ logId := tccommon.GetLogId(nil)
+ ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
- var placementGroupId string
- var name string
+ service := CvmService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
+
+ paramMap := make(map[string]interface{})
if v, ok := d.GetOk("placement_group_id"); ok {
- placementGroupId = v.(string)
+ paramMap["DisasterRecoverGroupIds"] = []*string{helper.String(v.(string))}
}
+
if v, ok := d.GetOk("name"); ok {
- name = v.(string)
+ paramMap["Name"] = helper.String(v.(string))
}
- var placementGroups []*cvm.DisasterRecoverGroup
- var errRet error
+ var respData *cvm.DescribeDisasterRecoverGroupsResponseParams
err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
- placementGroups, errRet = cvmService.DescribePlacementGroupByFilter(ctx, placementGroupId, name)
- if errRet != nil {
- return tccommon.RetryError(errRet, tccommon.InternalError)
+ result, e := service.DescribePlacementGroupsByFilter(ctx, paramMap)
+ if e != nil {
+ return tccommon.RetryError(e)
}
+ respData = result
return nil
})
if err != nil {
return err
}
- placementGroupList := make([]map[string]interface{}, 0, len(placementGroups))
- ids := make([]string, 0, len(placementGroups))
- for _, placement := range placementGroups {
- mapping := map[string]interface{}{
- "placement_group_id": placement.DisasterRecoverGroupId,
- "name": placement.Name,
- "type": placement.Type,
- "cvm_quota_total": placement.CvmQuotaTotal,
- "current_num": placement.CurrentNum,
- "instance_ids": helper.StringsInterfaces(placement.InstanceIds),
- "create_time": placement.CreateTime,
- }
- placementGroupList = append(placementGroupList, mapping)
- ids = append(ids, *placement.DisasterRecoverGroupId)
- }
-
- d.SetId(helper.DataResourceIdsHash(ids))
- err = d.Set("placement_group_list", placementGroupList)
- if err != nil {
- log.Printf("[CRITAL]%s provider set placement group list fail, reason:%s\n ", logId, err.Error())
+ if err := dataSourceTencentCloudPlacementGroupsReadPostHandleResponse0(ctx, paramMap, respData); err != nil {
return err
}
output, ok := d.GetOk("result_output_file")
if ok && output.(string) != "" {
- if err := tccommon.WriteToFile(output.(string), placementGroupList); err != nil {
- return err
+ if e := tccommon.WriteToFile(output.(string), dataSourceTencentCloudPlacementGroupsReadOutputContent(ctx)); e != nil {
+ return e
}
}
+
return nil
}
diff --git a/tencentcloud/services/cvm/data_source_tc_placement_groups_extension.go b/tencentcloud/services/cvm/data_source_tc_placement_groups_extension.go
new file mode 100644
index 0000000000..5753ef24ed
--- /dev/null
+++ b/tencentcloud/services/cvm/data_source_tc_placement_groups_extension.go
@@ -0,0 +1,48 @@
+package cvm
+
+import (
+ "context"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
+ "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
+ "log"
+
+ cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
+)
+
+func dataSourceTencentCloudPlacementGroupsReadPostHandleResponse0(ctx context.Context, req map[string]interface{}, resp *cvm.DescribeDisasterRecoverGroupsResponseParams) error {
+ d := tccommon.ResourceDataFromContext(ctx)
+ logId := tccommon.GetLogId(tccommon.ContextNil)
+ placementGroups := resp.DisasterRecoverGroupSet
+ var err error
+ placementGroupList := make([]map[string]interface{}, 0, len(placementGroups))
+ ids := make([]string, 0, len(placementGroups))
+ for _, placement := range placementGroups {
+ mapping := map[string]interface{}{
+ "placement_group_id": placement.DisasterRecoverGroupId,
+ "name": placement.Name,
+ "type": placement.Type,
+ "cvm_quota_total": placement.CvmQuotaTotal,
+ "current_num": placement.CurrentNum,
+ "instance_ids": helper.StringsInterfaces(placement.InstanceIds),
+ "create_time": placement.CreateTime,
+ }
+ placementGroupList = append(placementGroupList, mapping)
+ ids = append(ids, *placement.DisasterRecoverGroupId)
+ }
+
+ d.SetId(helper.DataResourceIdsHash(ids))
+ err = d.Set("placement_group_list", placementGroupList)
+ if err != nil {
+ log.Printf("[CRITAL]%s provider set placement group list fail, reason:%s\n ", logId, err.Error())
+ return err
+ }
+
+ context.WithValue(ctx, "placementGroupList", placementGroupList)
+ return nil
+}
+
+func dataSourceTencentCloudPlacementGroupsReadOutputContent(ctx context.Context) interface{} {
+ eipList := ctx.Value("placementGroupList").(*schema.Set).List()
+ return eipList
+}
diff --git a/tencentcloud/services/cvm/resource_tc_eip.go b/tencentcloud/services/cvm/resource_tc_eip.go
index e7ba5bbee4..96e2f66b25 100644
--- a/tencentcloud/services/cvm/resource_tc_eip.go
+++ b/tencentcloud/services/cvm/resource_tc_eip.go
@@ -5,16 +5,12 @@ import (
"fmt"
"log"
- tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
- svctag "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/tag"
- svcvpc "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/vpc"
-
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
vpc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312"
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
- "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/ratelimit"
)
func ResourceTencentCloudEip() *schema.Resource {
@@ -26,57 +22,53 @@ func ResourceTencentCloudEip() *schema.Resource {
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},
-
Schema: map[string]*schema.Schema{
- "name": {
+ "anti_ddos_package_id": {
Type: schema.TypeString,
Optional: true,
Computed: true,
- Description: "The name of eip.",
- },
- "type": {
- Type: schema.TypeString,
- Optional: true,
- Default: svcvpc.EIP_TYPE_EIP,
- ForceNew: true,
- Description: "The type of eip. Valid value: `EIP` and `AnycastEIP` and `HighQualityEIP` and `AntiDDoSEIP`. Default is `EIP`.",
+ Description: "ID of anti DDos package, it must set when `type` is `AntiDDoSEIP`.",
},
+
"anycast_zone": {
Type: schema.TypeString,
Optional: true,
ForceNew: true,
Description: "The zone of anycast. Valid value: `ANYCAST_ZONE_GLOBAL` and `ANYCAST_ZONE_OVERSEAS`.",
},
+
"applicable_for_clb": {
Type: schema.TypeBool,
Optional: true,
Description: "Indicates whether the anycast eip can be associated to a CLB.",
Deprecated: "It has been deprecated from version 1.27.0.",
},
- "internet_service_provider": {
- Type: schema.TypeString,
+
+ "auto_renew_flag": {
+ Type: schema.TypeInt,
Optional: true,
- ForceNew: true,
- Description: "Internet service provider of eip. Valid value: `BGP`, `CMCC`, `CTCC` and `CUCC`.",
+ Description: "Auto renew flag. 0 - default state (manual renew); 1 - automatic renew; 2 - explicit no automatic renew. NOTES: Only supported prepaid EIP.",
},
- "internet_charge_type": {
+
+ "bandwidth_package_id": {
Type: schema.TypeString,
Optional: true,
Computed: true,
- Description: "The charge type of eip. Valid values: `BANDWIDTH_PACKAGE`, `BANDWIDTH_POSTPAID_BY_HOUR`, `BANDWIDTH_PREPAID_BY_MONTH` and `TRAFFIC_POSTPAID_BY_HOUR`.",
+ Description: "ID of bandwidth package, it will set when `internet_charge_type` is `BANDWIDTH_PACKAGE`.",
},
- "prepaid_period": {
- Type: schema.TypeInt,
- Optional: true,
- ValidateFunc: tccommon.ValidateAllowedIntValue(svcvpc.EIP_AVAILABLE_PERIOD),
- Description: "Period of instance. Default value: `1`. Valid value: `1`, `2`, `3`, `4`, `6`, `7`, `8`, `9`, `12`, `24`, `36`. NOTES: must set when `internet_charge_type` is `BANDWIDTH_PREPAID_BY_MONTH`.",
+
+ "egress": {
+ Type: schema.TypeString,
+ Optional: true,
+ Computed: true,
+ Description: "Network egress. It defaults to `center_egress1`. If you want to try the egress feature, please [submit a ticket](https://console.cloud.tencent.com/workorder/category).",
},
- "auto_renew_flag": {
- Type: schema.TypeInt,
- Optional: true,
- ValidateFunc: tccommon.ValidateAllowedIntValue([]int{0, 1, 2}),
- Description: "Auto renew flag. 0 - default state (manual renew); 1 - automatic renew; 2 - explicit no automatic renew. NOTES: Only supported prepaid EIP.",
+ "internet_charge_type": {
+ Type: schema.TypeString,
+ Optional: true,
+ Computed: true,
+ Description: "The charge type of eip. Valid values: `BANDWIDTH_PACKAGE`, `BANDWIDTH_POSTPAID_BY_HOUR`, `BANDWIDTH_PREPAID_BY_MONTH` and `TRAFFIC_POSTPAID_BY_HOUR`.",
},
"internet_max_bandwidth_out": {
@@ -85,152 +77,153 @@ func ResourceTencentCloudEip() *schema.Resource {
Computed: true,
Description: "The bandwidth limit of EIP, unit is Mbps.",
},
- "tags": {
- Type: schema.TypeMap,
- Optional: true,
- Description: "The tags of eip.",
- },
- "bandwidth_package_id": {
+
+ "internet_service_provider": {
Type: schema.TypeString,
Optional: true,
- Computed: true,
- Description: "ID of bandwidth package, it will set when `internet_charge_type` is `BANDWIDTH_PACKAGE`.",
+ ForceNew: true,
+ Description: "Internet service provider of eip. Valid value: `BGP`, `CMCC`, `CTCC` and `CUCC`.",
},
- "egress": {
+
+ "name": {
Type: schema.TypeString,
Optional: true,
Computed: true,
- Description: "Network egress. It defaults to `center_egress1`. If you want to try the egress feature, please [submit a ticket](https://console.cloud.tencent.com/workorder/category).",
+ Description: "The name of eip.",
},
- "anti_ddos_package_id": {
- Type: schema.TypeString,
+
+ "prepaid_period": {
+ Type: schema.TypeInt,
Optional: true,
- Computed: true,
- Description: "ID of anti DDos package, it must set when `type` is `AntiDDoSEIP`.",
+ Description: "Period of instance. Default value: `1`. Valid value: `1`, `2`, `3`, `4`, `6`, `7`, `8`, `9`, `12`, `24`, `36`. NOTES: must set when `internet_charge_type` is `BANDWIDTH_PREPAID_BY_MONTH`.",
},
- // computed
+
"public_ip": {
Type: schema.TypeString,
Computed: true,
Description: "The elastic IP address.",
},
+
"status": {
Type: schema.TypeString,
Computed: true,
Description: "The EIP current status.",
},
+
+ "tags": {
+ Type: schema.TypeMap,
+ Optional: true,
+ Description: "The tags of eip.",
+ },
+
+ "type": {
+ Type: schema.TypeString,
+ Optional: true,
+ ForceNew: true,
+ Default: "EIP",
+ Description: "The type of eip. Valid value: `EIP` and `AnycastEIP` and `HighQualityEIP` and `AntiDDoSEIP`. Default is `EIP`.",
+ },
},
}
}
func resourceTencentCloudEipCreate(d *schema.ResourceData, meta interface{}) error {
defer tccommon.LogElapsed("resource.tencentcloud_eip.create")()
+ defer tccommon.InconsistentCheck(d, meta)()
logId := tccommon.GetLogId(tccommon.ContextNil)
- ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
- client := meta.(tccommon.ProviderMeta).GetAPIV3Conn()
- vpcService := svcvpc.NewVpcService(client)
- tagService := svctag.NewTagService(client)
- region := client.Region
+ ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
- var internetChargeType string
+ var (
+ eipId string
+ )
+ var (
+ request = vpc.NewAllocateAddressesRequest()
+ response = vpc.NewAllocateAddressesResponse()
+ )
- request := vpc.NewAllocateAddressesRequest()
- if v, ok := d.GetOk("type"); ok {
- request.AddressType = helper.String(v.(string))
- }
- if v, ok := d.GetOk("anycast_zone"); ok {
- request.AnycastZone = helper.String(v.(string))
- }
if v, ok := d.GetOk("internet_service_provider"); ok {
request.InternetServiceProvider = helper.String(v.(string))
}
+
if v, ok := d.GetOk("internet_charge_type"); ok {
- internetChargeType = v.(string)
request.InternetChargeType = helper.String(v.(string))
}
- if v, ok := d.GetOk("internet_max_bandwidth_out"); ok {
+
+ if v, ok := d.GetOkExists("internet_max_bandwidth_out"); ok {
request.InternetMaxBandwidthOut = helper.IntInt64(v.(int))
}
- if internetChargeType == "BANDWIDTH_PREPAID_BY_MONTH" {
- addressChargePrepaid := vpc.AddressChargePrepaid{}
- period := d.Get("prepaid_period")
- renewFlag := d.Get("auto_renew_flag")
- addressChargePrepaid.Period = helper.IntInt64(period.(int))
- addressChargePrepaid.AutoRenewFlag = helper.IntInt64(renewFlag.(int))
- request.AddressChargePrepaid = &addressChargePrepaid
+ if v, ok := d.GetOk("type"); ok {
+ request.AddressType = helper.String(v.(string))
+ }
+
+ if v, ok := d.GetOk("anycast_zone"); ok {
+ request.AnycastZone = helper.String(v.(string))
}
- if v := helper.GetTags(d, "tags"); len(v) > 0 {
- for tagKey, tagValue := range v {
- tag := vpc.Tag{
- Key: helper.String(tagKey),
- Value: helper.String(tagValue),
+ if v, ok := d.GetOk("tags"); ok {
+ for _, item := range v.([]interface{}) {
+ tagsMap := item.(map[string]interface{})
+ tag := vpc.Tag{}
+ if v, ok := tagsMap["key"]; ok {
+ tag.Key = helper.String(v.(string))
+ }
+ if v, ok := tagsMap["value"]; ok {
+ tag.Value = helper.String(v.(string))
}
request.Tags = append(request.Tags, &tag)
}
}
+
if v, ok := d.GetOk("bandwidth_package_id"); ok {
request.BandwidthPackageId = helper.String(v.(string))
}
+
if v, ok := d.GetOk("name"); ok {
request.AddressName = helper.String(v.(string))
}
+
if v, ok := d.GetOk("egress"); ok {
request.Egress = helper.String(v.(string))
}
+
if v, ok := d.GetOk("anti_ddos_package_id"); ok {
request.AntiDDoSPackageId = helper.String(v.(string))
}
- eipId := ""
- err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
- ratelimit.Check(request.GetAction())
- response, err := client.UseVpcClient().AllocateAddresses(request)
- if err != nil {
- log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n",
- logId, request.GetAction(), request.ToJsonString(), err.Error())
- return tccommon.RetryError(err)
- }
- log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
- logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
+ if err := resourceTencentCloudEipCreatePostFillRequest0(ctx, request); err != nil {
+ return err
+ }
- if len(response.Response.AddressSet) < 1 {
- return resource.RetryableError(fmt.Errorf("eip id is nil"))
+ err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
+ result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().AllocateAddressesWithContext(ctx, request)
+ if e != nil {
+ return tccommon.RetryError(e)
+ } else {
+ log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
}
- eipId = *response.Response.AddressSet[0]
+ response = result
return nil
})
if err != nil {
+ log.Printf("[CRITAL]%s create eip failed, reason:%+v", logId, err)
return err
}
- d.SetId(eipId)
- if tags := helper.GetTags(d, "tags"); len(tags) > 0 {
- resourceName := tccommon.BuildTagResourceName(svcvpc.VPC_SERVICE_TYPE, svcvpc.EIP_RESOURCE_TYPE, region, eipId)
- if err := tagService.ModifyTags(ctx, resourceName, tags, nil); err != nil {
- log.Printf("[CRITAL]%s set eip tags failed: %+v", logId, err)
- return err
- }
+ if len(response.Response.AddressSet) < 1 {
+ return fmt.Errorf("resource `tencentcloud_eip` create failed.")
}
- // wait for status
- err = resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
- eip, errRet := vpcService.DescribeEipById(ctx, eipId)
- if errRet != nil {
- return tccommon.RetryError(errRet)
- }
- if eip != nil && *eip.AddressStatus == svcvpc.EIP_STATUS_CREATING {
- return resource.RetryableError(fmt.Errorf("eip is still creating"))
- }
- return nil
- })
- if err != nil {
+ eipId = *response.Response.AddressSet[0]
+
+ if err := resourceTencentCloudEipCreatePostHandleResponse0(ctx, response); err != nil {
return err
}
+ d.SetId(eipId)
+
return resourceTencentCloudEipRead(d, meta)
}
@@ -239,237 +232,246 @@ func resourceTencentCloudEipRead(d *schema.ResourceData, meta interface{}) error
defer tccommon.InconsistentCheck(d, meta)()
logId := tccommon.GetLogId(tccommon.ContextNil)
- ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
- client := meta.(tccommon.ProviderMeta).GetAPIV3Conn()
- vpcService := svcvpc.NewVpcService(client)
- tagService := svctag.NewTagService(client)
- region := client.Region
+ ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
+
+ service := VpcService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
eipId := d.Id()
- var eip *vpc.Address
- err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
- instance, errRet := vpcService.DescribeEipById(ctx, eipId)
- if errRet != nil {
- return tccommon.RetryError(errRet)
- }
- eip = instance
- return nil
- })
+
+ respData, err := service.DescribeEipById(ctx, eipId)
if err != nil {
return err
}
- if eip == nil {
+
+ if respData == nil {
d.SetId("")
+ log.Printf("[WARN]%s resource `eip` [%s] not found, please check if it has been deleted.\n", logId, d.Id())
return nil
}
+ if respData.AddressId != nil {
+ _ = d.Set("address_id", respData.AddressId)
+ eipId = *respData.AddressId
+ }
- tags, err := tagService.DescribeResourceTags(ctx, svcvpc.VPC_SERVICE_TYPE, svcvpc.EIP_RESOURCE_TYPE, region, eipId)
- if err != nil {
- log.Printf("[CRITAL]%s describe eip tags failed: %+v", logId, err)
- return err
+ if respData.AddressName != nil {
+ _ = d.Set("name", respData.AddressName)
}
- bgp, err := vpcService.DescribeVpcBandwidthPackageByEip(ctx, eipId)
- if err != nil {
- log.Printf("[CRITAL]%s describe eip tags failed: %+v", logId, err)
- return err
+ if respData.AddressStatus != nil {
+ _ = d.Set("status", respData.AddressStatus)
+ }
+
+ if respData.AddressIp != nil {
+ _ = d.Set("public_ip", respData.AddressIp)
+ }
+
+ if respData.AddressType != nil {
+ _ = d.Set("type", respData.AddressType)
+ }
+
+ if respData.InternetServiceProvider != nil {
+ _ = d.Set("internet_service_provider", respData.InternetServiceProvider)
}
- _ = d.Set("name", eip.AddressName)
- _ = d.Set("type", eip.AddressType)
- _ = d.Set("public_ip", eip.AddressIp)
- _ = d.Set("status", eip.AddressStatus)
- _ = d.Set("internet_charge_type", eip.InternetChargeType)
- _ = d.Set("tags", tags)
- if eip.Bandwidth != nil {
- _ = d.Set("internet_max_bandwidth_out", eip.Bandwidth)
+ if respData.LocalBgp != nil {
+ _ = d.Set("local_bgp", respData.LocalBgp)
}
- if eip.Egress != nil {
- _ = d.Set("egress", eip.Egress)
+ if respData.Bandwidth != nil {
+ _ = d.Set("internet_max_bandwidth_out", respData.Bandwidth)
}
- if eip.AntiDDoSPackageId != nil {
- _ = d.Set("anti_ddos_package_id", eip.AntiDDoSPackageId)
+ if respData.InternetChargeType != nil {
+ _ = d.Set("internet_charge_type", respData.InternetChargeType)
}
- if bgp != nil {
- _ = d.Set("bandwidth_package_id", bgp.BandwidthPackageId)
+ if respData.Egress != nil {
+ _ = d.Set("egress", respData.Egress)
}
+
+ if respData.AntiDDoSPackageId != nil {
+ _ = d.Set("anti_ddos_package_id", respData.AntiDDoSPackageId)
+ }
+
+ if respData.BandwidthPackageId != nil {
+ _ = d.Set("bandwidth_package_id", respData.BandwidthPackageId)
+ }
+
return nil
}
func resourceTencentCloudEipUpdate(d *schema.ResourceData, meta interface{}) error {
defer tccommon.LogElapsed("resource.tencentcloud_eip.update")()
+ defer tccommon.InconsistentCheck(d, meta)()
logId := tccommon.GetLogId(tccommon.ContextNil)
- ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
- client := meta.(tccommon.ProviderMeta).GetAPIV3Conn()
- vpcService := svcvpc.NewVpcService(client)
- tagService := svctag.NewTagService(client)
- region := client.Region
+ ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
+ immutableArgs := []string{"anti_ddos_package_id", "applicable_for_clb", "auto_renew_flag", "bandwidth_package_id", "egress", "prepaid_period", "tags"}
+ for _, v := range immutableArgs {
+ if d.HasChange(v) {
+ return fmt.Errorf("argument `%s` cannot be changed", v)
+ }
+ }
eipId := d.Id()
- d.Partial(true)
-
- unsupportedUpdateFields := []string{
- "bandwidth_package_id",
- "anti_ddos_package_id",
- "egress",
+ if err := resourceTencentCloudEipUpdateOnStart(ctx); err != nil {
+ return err
}
- for _, field := range unsupportedUpdateFields {
- if d.HasChange(field) {
- return fmt.Errorf("tencentcloud_eip update on %s is not support yet", field)
+
+ needChange := false
+ mutableArgs := []string{"name"}
+ for _, v := range mutableArgs {
+ if d.HasChange(v) {
+ needChange = true
+ break
}
}
- if d.HasChange("name") {
- name := d.Get("name").(string)
- err := vpcService.ModifyEipName(ctx, eipId, name)
+ if needChange {
+ request := vpc.NewModifyAddressAttributeRequest()
+
+ request.AddressId = helper.String(eipId)
+
+ if v, ok := d.GetOk("name"); ok {
+ request.AddressName = helper.String(v.(string))
+ }
+
+ err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
+ result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().ModifyAddressAttributeWithContext(ctx, request)
+ if e != nil {
+ return tccommon.RetryError(e)
+ } else {
+ log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
+ }
+ return nil
+ })
if err != nil {
+ log.Printf("[CRITAL]%s update eip failed, reason:%+v", logId, err)
return err
}
}
- if d.HasChange("internet_charge_type") {
- var (
- chargeType string
- bandWidthOut int
- )
+ needChange1 := false
+ mutableArgs1 := []string{"internet_charge_type", "internet_max_bandwidth_out"}
+ for _, v := range mutableArgs1 {
+ if d.HasChange(v) {
+ needChange1 = true
+ break
+ }
+ }
+
+ if needChange1 {
+ request1 := vpc.NewModifyAddressInternetChargeTypeRequest()
+
+ request1.AddressId = helper.String(eipId)
if v, ok := d.GetOk("internet_charge_type"); ok {
- chargeType = v.(string)
- }
- if v, ok := d.GetOk("internet_max_bandwidth_out"); ok {
- bandWidthOut = v.(int)
+ request1.InternetChargeType = helper.String(v.(string))
}
- period := d.Get("prepaid_period").(int)
- renewFlag := d.Get("auto_renew_flag").(int)
+ if v, ok := d.GetOkExists("internet_max_bandwidth_out"); ok {
+ request1.InternetMaxBandwidthOut = helper.IntUint64(v.(int))
+ }
- if chargeType != "" && bandWidthOut != 0 {
- err := vpcService.ModifyEipInternetChargeType(ctx, eipId, chargeType, bandWidthOut, period, renewFlag)
- if err != nil {
- return err
- }
+ if err := resourceTencentCloudEipUpdatePostFillRequest1(ctx, request1); err != nil {
+ return err
}
- }
- if d.HasChange("internet_max_bandwidth_out") {
- if v, ok := d.GetOk("internet_max_bandwidth_out"); ok {
- bandwidthOut := v.(int)
- err := vpcService.ModifyEipBandwidthOut(ctx, eipId, bandwidthOut)
- if err != nil {
- return err
+ err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
+ result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().ModifyAddressInternetChargeTypeWithContext(ctx, request1)
+ if e != nil {
+ return tccommon.RetryError(e)
+ } else {
+ log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request1.GetAction(), request1.ToJsonString(), result.ToJsonString())
}
-
+ return nil
+ })
+ if err != nil {
+ log.Printf("[CRITAL]%s update eip failed, reason:%+v", logId, err)
+ return err
}
}
- if d.HasChange("prepaid_period") || d.HasChange("auto_renew_flag") {
- period := d.Get("prepaid_period").(int)
- renewFlag := d.Get("auto_renew_flag").(int)
- err := vpcService.RenewAddress(ctx, eipId, period, renewFlag)
- if err != nil {
- return err
+ needChange2 := false
+ mutableArgs2 := []string{"internet_max_bandwidth_out"}
+ for _, v := range mutableArgs2 {
+ if d.HasChange(v) {
+ needChange2 = true
+ break
}
}
- if d.HasChange("tags") {
- oldTags, newTags := d.GetChange("tags")
- replaceTags, deleteTags := svctag.DiffTags(oldTags.(map[string]interface{}), newTags.(map[string]interface{}))
- resourceName := tccommon.BuildTagResourceName(svcvpc.VPC_SERVICE_TYPE, svcvpc.EIP_RESOURCE_TYPE, region, eipId)
+ if needChange2 {
+ request2 := vpc.NewModifyAddressesBandwidthRequest()
- if err := tagService.ModifyTags(ctx, resourceName, replaceTags, deleteTags); err != nil {
- log.Printf("[CRITAL]%s update eip tags failed: %+v", logId, err)
- return err
+ request2.AddressIds = []*string{helper.String(eipId)}
+
+ if v, ok := d.GetOkExists("internet_max_bandwidth_out"); ok {
+ request2.InternetMaxBandwidthOut = helper.IntInt64(v.(int))
}
+ err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
+ result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().ModifyAddressesBandwidthWithContext(ctx, request2)
+ if e != nil {
+ return tccommon.RetryError(e)
+ } else {
+ log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request2.GetAction(), request2.ToJsonString(), result.ToJsonString())
+ }
+ return nil
+ })
+ if err != nil {
+ log.Printf("[CRITAL]%s update eip failed, reason:%+v", logId, err)
+ return err
+ }
}
- d.Partial(false)
-
+ _ = eipId
return resourceTencentCloudEipRead(d, meta)
}
func resourceTencentCloudEipDelete(d *schema.ResourceData, meta interface{}) error {
defer tccommon.LogElapsed("resource.tencentcloud_eip.delete")()
+ defer tccommon.InconsistentCheck(d, meta)()
logId := tccommon.GetLogId(tccommon.ContextNil)
- ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
- vpcService := svcvpc.NewVpcService(meta.(tccommon.ProviderMeta).GetAPIV3Conn())
+ ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
+
eipId := d.Id()
- err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
- errRet := vpcService.UnattachEip(ctx, eipId)
- if errRet != nil {
- return tccommon.RetryError(errRet, "DesOperation.MutexTaskRunning")
- }
- return nil
- })
- if err != nil {
+
+ var (
+ request = vpc.NewReleaseAddressesRequest()
+ response = vpc.NewReleaseAddressesResponse()
+ )
+
+ request.AddressIds = []*string{helper.String(eipId)}
+
+ if err := resourceTencentCloudEipDeletePostFillRequest0(ctx, request); err != nil {
return err
}
- err = resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
- errRet := vpcService.DeleteEip(ctx, eipId)
- if errRet != nil {
- return tccommon.RetryError(errRet, "DesOperation.MutexTaskRunning", "OperationDenied.MutexTaskRunning")
+ err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
+ result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().ReleaseAddressesWithContext(ctx, request)
+ if e != nil {
+ return tccommon.RetryError(e)
+ } else {
+ log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
}
+ response = result
return nil
})
if err != nil {
+ log.Printf("[CRITAL]%s delete eip failed, reason:%+v", logId, err)
return err
}
- var internetChargeType string
- if v, ok := d.GetOk("internet_charge_type"); ok {
- internetChargeType = v.(string)
- }
-
- if internetChargeType == "BANDWIDTH_PREPAID_BY_MONTH" {
- // isolated
- err = resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
- eip, errRet := vpcService.DescribeEipById(ctx, eipId)
- if errRet != nil {
- return tccommon.RetryError(errRet)
- }
- if !*eip.IsArrears {
- return resource.RetryableError(fmt.Errorf("eip is still isolate"))
- }
- return nil
- })
- if err != nil {
- return err
- }
-
- // release
- err = resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
- errRet := vpcService.DeleteEip(ctx, eipId)
- if errRet != nil {
- return tccommon.RetryError(errRet, "DesOperation.MutexTaskRunning", "OperationDenied.MutexTaskRunning")
- }
- return nil
- })
- if err != nil {
- return err
- }
- }
-
- err = resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
- eip, errRet := vpcService.DescribeEipById(ctx, eipId)
- if errRet != nil {
- return tccommon.RetryError(errRet)
- }
- if eip != nil {
- return resource.RetryableError(fmt.Errorf("eip is still deleting"))
- }
- return nil
- })
- if err != nil {
+ _ = response
+ if err := resourceTencentCloudEipDeletePostHandleResponse0(ctx, response); err != nil {
return err
}
+
+ _ = eipId
return nil
}
diff --git a/tencentcloud/services/cvm/resource_tc_eip_extension.go b/tencentcloud/services/cvm/resource_tc_eip_extension.go
index 5b8d64781b..36edbb4e32 100644
--- a/tencentcloud/services/cvm/resource_tc_eip_extension.go
+++ b/tencentcloud/services/cvm/resource_tc_eip_extension.go
@@ -79,11 +79,6 @@ func resourceTencentCloudEipUpdatePostFillRequest1(ctx context.Context, req *vpc
return nil
}
-func resourceTencentCloudEipUpdatePostFillRequest3(ctx context.Context, req *vpc.RenewAddressesRequest) error {
- // TODO: implement me
- panic("TODO: implement me")
-}
-
func resourceTencentCloudEipDeletePostFillRequest0(ctx context.Context, req *vpc.ReleaseAddressesRequest) error {
d := tccommon.ResourceDataFromContext(ctx)
meta := tccommon.ProviderMetaFromContext(ctx)
@@ -159,3 +154,20 @@ func resourceTencentCloudEipDeletePostHandleResponse0(ctx context.Context, resp
return nil
}
+
+func resourceTencentCloudEipUpdateOnStart(ctx context.Context) error {
+ d := tccommon.ResourceDataFromContext(ctx)
+ meta := tccommon.ProviderMetaFromContext(ctx)
+ client := meta.(tccommon.ProviderMeta).GetAPIV3Conn()
+ vpcService := svcvpc.NewVpcService(client)
+ eipId := d.Id()
+ if d.HasChange("prepaid_period") || d.HasChange("auto_renew_flag") {
+ period := d.Get("prepaid_period").(int)
+ renewFlag := d.Get("auto_renew_flag").(int)
+ err := vpcService.RenewAddress(ctx, eipId, period, renewFlag)
+ if err != nil {
+ return err
+ }
+ }
+ return nil
+}
diff --git a/tencentcloud/services/cvm/resource_tc_eip_public_address_adjust.go b/tencentcloud/services/cvm/resource_tc_eip_public_address_adjust.go
index 7820d230a1..4310e762f2 100644
--- a/tencentcloud/services/cvm/resource_tc_eip_public_address_adjust.go
+++ b/tencentcloud/services/cvm/resource_tc_eip_public_address_adjust.go
@@ -1,16 +1,15 @@
package cvm
import (
+ "context"
"log"
- "time"
-
- tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
- svcvpc "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/vpc"
+ "strings"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
vpc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312"
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
)
@@ -20,69 +19,78 @@ func ResourceTencentCloudEipPublicAddressAdjust() *schema.Resource {
Read: resourceTencentCloudEipPublicAddressAdjustRead,
Delete: resourceTencentCloudEipPublicAddressAdjustDelete,
Schema: map[string]*schema.Schema{
- "instance_id": {
+ "address_id": {
+ Type: schema.TypeString,
Optional: true,
ForceNew: true,
- Type: schema.TypeString,
- Description: "A unique ID that identifies the CVM instance. The unique ID of CVM is in the form:`ins-osckfnm7`.",
+ Description: "A unique ID that identifies an EIP instance. The unique ID of EIP is in the form:`eip-erft45fu`.",
},
- "address_id": {
+
+ "instance_id": {
+ Type: schema.TypeString,
Optional: true,
ForceNew: true,
- Type: schema.TypeString,
- Description: "A unique ID that identifies an EIP instance. The unique ID of EIP is in the form:`eip-erft45fu`.",
+ Description: "A unique ID that identifies the CVM instance. The unique ID of CVM is in the form:`ins-osckfnm7`.",
},
},
}
}
func resourceTencentCloudEipPublicAddressAdjustCreate(d *schema.ResourceData, meta interface{}) error {
- defer tccommon.LogElapsed("resource.tencentcloud_vpc_public_address_adjust.create")()
+ defer tccommon.LogElapsed("resource.tencentcloud_eip_public_address_adjust.create")()
defer tccommon.InconsistentCheck(d, meta)()
+ logId := tccommon.GetLogId(tccommon.ContextNil)
+
+ ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
+
var (
- logId = tccommon.GetLogId(tccommon.ContextNil)
- service = svcvpc.NewVpcService(meta.(tccommon.ProviderMeta).GetAPIV3Conn())
- request = vpc.NewAdjustPublicAddressRequest()
instanceId string
addressId string
- taskId uint64
+ )
+ var (
+ request = vpc.NewAdjustPublicAddressRequest()
+ response = vpc.NewAdjustPublicAddressResponse()
)
if v, ok := d.GetOk("instance_id"); ok {
instanceId = v.(string)
+ }
+ if v, ok := d.GetOk("address_id"); ok {
+ addressId = v.(string)
+ }
+
+ if v, ok := d.GetOk("instance_id"); ok {
request.InstanceId = helper.String(v.(string))
}
if v, ok := d.GetOk("address_id"); ok {
- addressId = v.(string)
request.AddressId = helper.String(v.(string))
}
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
- result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().AdjustPublicAddress(request)
+ result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().AdjustPublicAddressWithContext(ctx, request)
if e != nil {
return tccommon.RetryError(e)
} else {
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
}
-
- taskId = *result.Response.TaskId
+ response = result
return nil
})
-
if err != nil {
- log.Printf("[CRITAL]%s operate vpc publicAddressAdjust failed, reason:%+v", logId, err)
+ log.Printf("[CRITAL]%s create eip public address adjust failed, reason:%+v", logId, err)
return err
}
- conf := tccommon.BuildStateChangeConf([]string{}, []string{"SUCCESS"}, 1*tccommon.ReadRetryTimeout, time.Second, service.VpcIpv6AddressStateRefreshFunc(helper.UInt64ToStr(taskId), []string{}))
+ _ = response
- if _, e := conf.WaitForState(); e != nil {
- return e
+ if err := resourceTencentCloudEipPublicAddressAdjustCreatePostHandleResponse0(ctx, response); err != nil {
+ return err
}
- d.SetId(instanceId + tccommon.FILED_SP + addressId)
+ d.SetId(strings.Join([]string{instanceId, addressId}, tccommon.FILED_SP))
+
return resourceTencentCloudEipPublicAddressAdjustRead(d, meta)
}
diff --git a/tencentcloud/services/cvm/resource_tc_eip_public_address_adjust_extension.go b/tencentcloud/services/cvm/resource_tc_eip_public_address_adjust_extension.go
new file mode 100644
index 0000000000..598f4e47b3
--- /dev/null
+++ b/tencentcloud/services/cvm/resource_tc_eip_public_address_adjust_extension.go
@@ -0,0 +1,24 @@
+package cvm
+
+import (
+ "context"
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
+ "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
+ svcvpc "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/vpc"
+ "time"
+
+ vpc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312"
+)
+
+func resourceTencentCloudEipPublicAddressAdjustCreatePostHandleResponse0(ctx context.Context, resp *vpc.AdjustPublicAddressResponse) error {
+ meta := tccommon.ProviderMetaFromContext(ctx)
+ client := meta.(tccommon.ProviderMeta).GetAPIV3Conn()
+ vpcService := svcvpc.NewVpcService(client)
+ taskId := *resp.Response.TaskId
+ conf := tccommon.BuildStateChangeConf([]string{}, []string{"SUCCESS"}, 1*tccommon.ReadRetryTimeout, time.Second, vpcService.VpcIpv6AddressStateRefreshFunc(helper.UInt64ToStr(taskId), []string{}))
+
+ if _, e := conf.WaitForState(); e != nil {
+ return e
+ }
+ return nil
+}
diff --git a/tencentcloud/services/cvm/service_tencentcloud_cvm.go b/tencentcloud/services/cvm/service_tencentcloud_cvm.go
index 071d5d8f1f..c6c9cb0bdd 100644
--- a/tencentcloud/services/cvm/service_tencentcloud_cvm.go
+++ b/tencentcloud/services/cvm/service_tencentcloud_cvm.go
@@ -3,6 +3,7 @@ package cvm
import (
"context"
"fmt"
+ vpc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312"
"log"
"sort"
"strings"
@@ -507,34 +508,38 @@ func (me *CvmService) DescribeInstanceTypes(ctx context.Context, zone string) (i
return
}
-func (me *CvmService) DescribeInstanceTypesByFilter(ctx context.Context, filters map[string][]string) (instanceTypes []*cvm.InstanceTypeConfig, errRet error) {
- logId := tccommon.GetLogId(ctx)
- request := cvm.NewDescribeInstanceTypeConfigsRequest()
- request.Filters = make([]*cvm.Filter, 0, len(filters))
- for k, v := range filters {
- values := make([]*string, 0, len(v))
- for _, value := range v {
- values = append(values, helper.String(value))
+func (me *CvmService) DescribeInstanceTypesByFilter(ctx context.Context, param map[string]interface{}) (ret *cvm.DescribeZoneInstanceConfigInfosResponseParams, errRet error) {
+ var (
+ logId = tccommon.GetLogId(ctx)
+ request = cvm.NewDescribeZoneInstanceConfigInfosRequest()
+ )
+
+ defer func() {
+ if errRet != nil {
+ log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, request.GetAction(), request.ToJsonString(), errRet.Error())
}
- filter := &cvm.Filter{
- Name: helper.String(k),
- Values: values,
+ }()
+
+ for k, v := range param {
+ if k == "Filters" {
+ request.Filters = v.([]*cvm.Filter)
}
- request.Filters = append(request.Filters, filter)
}
ratelimit.Check(request.GetAction())
- response, err := me.client.UseCvmClient().DescribeInstanceTypeConfigs(request)
+
+ response, err := me.client.UseCvmClient().DescribeZoneInstanceConfigInfos(request)
if err != nil {
- log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n",
- logId, request.GetAction(), request.ToJsonString(), err.Error())
errRet = err
return
}
- log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
- logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
+ log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
- instanceTypes = response.Response.InstanceTypeConfigSet
+ if response == nil || response.Response == nil {
+ return
+ }
+
+ ret = response.Response
return
}
@@ -1122,53 +1127,53 @@ func (me *CvmService) DescribeImageById(ctx context.Context, keyId string, isDel
return
}
-func (me *CvmService) DescribeImagesByFilter(ctx context.Context, filters map[string][]string, instanceType string) (images []*cvm.Image, errRet error) {
- logId := tccommon.GetLogId(ctx)
-
- request := cvm.NewDescribeImagesRequest()
- request.Filters = make([]*cvm.Filter, 0, len(filters))
- for k, v := range filters {
- filter := cvm.Filter{
- Name: helper.String(k),
- Values: []*string{},
- }
- for _, vv := range v {
- filter.Values = append(filter.Values, helper.String(vv))
- }
- request.Filters = append(request.Filters, &filter)
- }
- if instanceType != "" {
- request.InstanceType = helper.String(instanceType)
- }
- var offset uint64 = 0
- var pageSize uint64 = 100
- images = make([]*cvm.Image, 0)
- for {
- request.Offset = &offset
- request.Limit = &pageSize
- ratelimit.Check(request.GetAction())
- response, err := me.client.UseCvmClient().DescribeImages(request)
- if err != nil {
- log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n",
- logId, request.GetAction(), request.ToJsonString(), err.Error())
- errRet = err
- return
- }
- log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
- logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
-
- if response == nil || len(response.Response.ImageSet) < 1 {
- break
- }
- images = append(images, response.Response.ImageSet...)
- if len(response.Response.ImageSet) < int(pageSize) {
- break
- }
- offset += pageSize
- }
-
- return
-}
+//func (me *CvmService) DescribeImagesByFilter(ctx context.Context, filters map[string][]string, instanceType string) (images []*cvm.Image, errRet error) {
+// logId := tccommon.GetLogId(ctx)
+//
+// request := cvm.NewDescribeImagesRequest()
+// request.Filters = make([]*cvm.Filter, 0, len(filters))
+// for k, v := range filters {
+// filter := cvm.Filter{
+// Name: helper.String(k),
+// Values: []*string{},
+// }
+// for _, vv := range v {
+// filter.Values = append(filter.Values, helper.String(vv))
+// }
+// request.Filters = append(request.Filters, &filter)
+// }
+// if instanceType != "" {
+// request.InstanceType = helper.String(instanceType)
+// }
+// var offset uint64 = 0
+// var pageSize uint64 = 100
+// images = make([]*cvm.Image, 0)
+// for {
+// request.Offset = &offset
+// request.Limit = &pageSize
+// ratelimit.Check(request.GetAction())
+// response, err := me.client.UseCvmClient().DescribeImages(request)
+// if err != nil {
+// log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n",
+// logId, request.GetAction(), request.ToJsonString(), err.Error())
+// errRet = err
+// return
+// }
+// log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
+// logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
+//
+// if response == nil || len(response.Response.ImageSet) < 1 {
+// break
+// }
+// images = append(images, response.Response.ImageSet...)
+// if len(response.Response.ImageSet) < int(pageSize) {
+// break
+// }
+// offset += pageSize
+// }
+//
+// return
+//}
func (me *CvmService) ModifyRenewParam(ctx context.Context, instanceId string, renewFlag string) error {
logId := tccommon.GetLogId(ctx)
@@ -1776,3 +1781,245 @@ func (me *CvmService) ModifyImageSharePermission(ctx context.Context, imageId, p
}
return
}
+
+func NewVpcService(client *connectivity.TencentCloudClient) VpcService {
+ return VpcService{client: client}
+}
+
+type VpcService struct {
+ client *connectivity.TencentCloudClient
+}
+
+func (me *VpcService) DescribeEipById(ctx context.Context, eipId string) (ret *vpc.Address, errRet error) {
+ logId := tccommon.GetLogId(ctx)
+
+ request := vpc.NewDescribeAddressesRequest()
+ request.AddressIds = []*string{helper.String(eipId)}
+
+ defer func() {
+ if errRet != nil {
+ log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, request.GetAction(), request.ToJsonString(), errRet.Error())
+ }
+ }()
+
+ ratelimit.Check(request.GetAction())
+
+ response, err := me.client.UseVpcClient().DescribeAddresses(request)
+ if err != nil {
+ errRet = err
+ return
+ }
+ log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
+
+ if len(response.Response.AddressSet) < 1 {
+ return
+ }
+
+ ret = response.Response.AddressSet[0]
+ return
+}
+
+func (me *VpcService) DescribeEipsByFilter(ctx context.Context, param map[string]interface{}) (ret *vpc.DescribeAddressesResponseParams, errRet error) {
+ var (
+ logId = tccommon.GetLogId(ctx)
+ request = vpc.NewDescribeAddressesRequest()
+ )
+
+ defer func() {
+ if errRet != nil {
+ log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, request.GetAction(), request.ToJsonString(), errRet.Error())
+ }
+ }()
+
+ for k, v := range param {
+ if k == "Filters" {
+ request.Filters = v.([]*vpc.Filter)
+ }
+ }
+
+ ratelimit.Check(request.GetAction())
+
+ response, err := me.client.UseVpcClient().DescribeAddresses(request)
+ if err != nil {
+ errRet = err
+ return
+ }
+ log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
+
+ if response == nil || response.Response == nil {
+ return
+ }
+
+ ret = response.Response
+ return
+}
+
+func (me *CvmService) DescribeImageByFilter(ctx context.Context, param map[string]interface{}) (ret *cvm.DescribeImagesResponseParams, errRet error) {
+ var (
+ logId = tccommon.GetLogId(ctx)
+ request = cvm.NewDescribeImagesRequest()
+ )
+
+ defer func() {
+ if errRet != nil {
+ log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, request.GetAction(), request.ToJsonString(), errRet.Error())
+ }
+ }()
+
+ for k, v := range param {
+ if k == "Filters" {
+ request.Filters = v.([]*cvm.Filter)
+ }
+ }
+
+ ratelimit.Check(request.GetAction())
+
+ response, err := me.client.UseCvmClient().DescribeImages(request)
+ if err != nil {
+ errRet = err
+ return
+ }
+ log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
+
+ if response == nil || response.Response == nil {
+ return
+ }
+
+ ret = response.Response
+ return
+}
+
+func (me *CvmService) DescribeImagesByFilter(ctx context.Context, param map[string]interface{}) (ret *cvm.DescribeImagesResponseParams, errRet error) {
+ var (
+ logId = tccommon.GetLogId(ctx)
+ request = cvm.NewDescribeImagesRequest()
+ )
+
+ defer func() {
+ if errRet != nil {
+ log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, request.GetAction(), request.ToJsonString(), errRet.Error())
+ }
+ }()
+
+ for k, v := range param {
+ if k == "Filters" {
+ request.Filters = v.([]*cvm.Filter)
+ }
+ }
+
+ ratelimit.Check(request.GetAction())
+
+ response, err := me.client.UseCvmClient().DescribeImages(request)
+ if err != nil {
+ errRet = err
+ return
+ }
+ log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
+
+ if response == nil || response.Response == nil {
+ return
+ }
+
+ ret = response.Response
+ return
+}
+
+func (me *CvmService) DescribeInstancesSetByFilter(ctx context.Context, param map[string]interface{}) (ret *cvm.DescribeInstancesResponseParams, errRet error) {
+ var (
+ logId = tccommon.GetLogId(ctx)
+ request = cvm.NewDescribeInstancesRequest()
+ )
+
+ defer func() {
+ if errRet != nil {
+ log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, request.GetAction(), request.ToJsonString(), errRet.Error())
+ }
+ }()
+
+ ratelimit.Check(request.GetAction())
+
+ response, err := me.client.UseCvmClient().DescribeInstances(request)
+ if err != nil {
+ errRet = err
+ return
+ }
+ log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
+
+ if response == nil || response.Response == nil {
+ return
+ }
+
+ ret = response.Response
+ return
+}
+
+func (me *CvmService) DescribeKeyPairsByFilter(ctx context.Context, param map[string]interface{}) (ret *cvm.DescribeKeyPairsResponseParams, errRet error) {
+ var (
+ logId = tccommon.GetLogId(ctx)
+ request = cvm.NewDescribeKeyPairsRequest()
+ )
+
+ defer func() {
+ if errRet != nil {
+ log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, request.GetAction(), request.ToJsonString(), errRet.Error())
+ }
+ }()
+
+ ratelimit.Check(request.GetAction())
+
+ if err := dataSourceTencentCloudKeyPairsReadPreRequest0(ctx, request); err != nil {
+ return nil, err
+ }
+
+ response, err := me.client.UseCvmClient().DescribeKeyPairs(request)
+ if err != nil {
+ errRet = err
+ return
+ }
+ log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
+
+ if response == nil || response.Response == nil {
+ return
+ }
+
+ ret = response.Response
+ return
+}
+
+func (me *CvmService) DescribePlacementGroupsByFilter(ctx context.Context, param map[string]interface{}) (ret *cvm.DescribeDisasterRecoverGroupsResponseParams, errRet error) {
+ var (
+ logId = tccommon.GetLogId(ctx)
+ request = cvm.NewDescribeDisasterRecoverGroupsRequest()
+ )
+
+ defer func() {
+ if errRet != nil {
+ log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, request.GetAction(), request.ToJsonString(), errRet.Error())
+ }
+ }()
+
+ for k, v := range param {
+ if k == "DisasterRecoverGroupIds" {
+ request.DisasterRecoverGroupIds = v.([]*string)
+ }
+ if k == "Name" {
+ request.Name = v.(*string)
+ }
+ }
+
+ ratelimit.Check(request.GetAction())
+
+ response, err := me.client.UseCvmClient().DescribeDisasterRecoverGroups(request)
+ if err != nil {
+ errRet = err
+ return
+ }
+ log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
+
+ if response == nil || response.Response == nil {
+ return
+ }
+
+ ret = response.Response
+ return
+}
From d5d5295a8efccd80515bd2a86b57442196063165 Mon Sep 17 00:00:00 2001
From: SevenEarth <391613297@qq.com>
Date: Tue, 4 Jun 2024 11:18:16 +0800
Subject: [PATCH 3/8] add
---
.../services/cvm/data_source_tc_eips.go | 171 ++++++++++--------
tencentcloud/services/cvm/resource_tc_eip.go | 8 +-
.../services/cvm/resource_tc_eip_extension.go | 30 +++
3 files changed, 125 insertions(+), 84 deletions(-)
diff --git a/tencentcloud/services/cvm/data_source_tc_eips.go b/tencentcloud/services/cvm/data_source_tc_eips.go
index 80b5c0f0bc..58057f6c3d 100644
--- a/tencentcloud/services/cvm/data_source_tc_eips.go
+++ b/tencentcloud/services/cvm/data_source_tc_eips.go
@@ -2,24 +2,49 @@ package cvm
import (
"context"
+ "log"
+
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
+ svctag "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/tag"
+ svcvpc "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/vpc"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
vpc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312"
- tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
)
func DataSourceTencentCloudEips() *schema.Resource {
return &schema.Resource{
Read: dataSourceTencentCloudEipsRead,
+
Schema: map[string]*schema.Schema{
"eip_id": {
Type: schema.TypeString,
Optional: true,
Description: "ID of the EIP to be queried.",
},
+ "eip_name": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "Name of the EIP to be queried.",
+ },
+ "public_ip": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "The elastic ip address.",
+ },
+ "tags": {
+ Type: schema.TypeMap,
+ Optional: true,
+ Description: "The tags of EIP.",
+ },
+ "result_output_file": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "Used to save results.",
+ },
"eip_list": {
Type: schema.TypeList,
@@ -27,11 +52,6 @@ func DataSourceTencentCloudEips() *schema.Resource {
Description: "An information list of EIP. Each element contains the following attributes:",
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
- "create_time": {
- Type: schema.TypeString,
- Computed: true,
- Description: "Creation time of the EIP.",
- },
"eip_id": {
Type: schema.TypeString,
Computed: true,
@@ -47,25 +67,30 @@ func DataSourceTencentCloudEips() *schema.Resource {
Computed: true,
Description: "Type of the EIP.",
},
- "eni_id": {
+ "status": {
Type: schema.TypeString,
Computed: true,
- Description: "The eni id to bind with the EIP.",
+ Description: "The EIP current status.",
+ },
+ "public_ip": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "The elastic ip address.",
},
"instance_id": {
Type: schema.TypeString,
Computed: true,
Description: "The instance id to bind with the EIP.",
},
- "public_ip": {
+ "eni_id": {
Type: schema.TypeString,
Computed: true,
- Description: "The elastic ip address.",
+ Description: "The eni id to bind with the EIP.",
},
- "status": {
+ "create_time": {
Type: schema.TypeString,
Computed: true,
- Description: "The EIP current status.",
+ Description: "Creation time of the EIP.",
},
"tags": {
Type: schema.TypeMap,
@@ -75,101 +100,91 @@ func DataSourceTencentCloudEips() *schema.Resource {
},
},
},
-
- "eip_name": {
- Type: schema.TypeString,
- Optional: true,
- Description: "Name of the EIP to be queried.",
- },
-
- "public_ip": {
- Type: schema.TypeString,
- Optional: true,
- Description: "The elastic ip address.",
- },
-
- "tags": {
- Type: schema.TypeMap,
- Optional: true,
- Description: "The tags of EIP.",
- },
-
- "result_output_file": {
- Type: schema.TypeString,
- Optional: true,
- Description: "Used to save results.",
- },
},
}
}
func dataSourceTencentCloudEipsRead(d *schema.ResourceData, meta interface{}) error {
defer tccommon.LogElapsed("data_source.tencentcloud_eips.read")()
- defer tccommon.InconsistentCheck(d, meta)()
-
- logId := tccommon.GetLogId(nil)
- ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
+ logId := tccommon.GetLogId(tccommon.ContextNil)
+ ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
- service := VpcService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
+ client := meta.(tccommon.ProviderMeta).GetAPIV3Conn()
+ vpcService := svcvpc.NewVpcService(client)
+ tagService := svctag.NewTagService(client)
+ region := client.Region
- paramMap := make(map[string]interface{})
- var filtersList []*vpc.Filter
- filtersMap := map[string]*vpc.Filter{}
- filter := vpc.Filter{}
- name := "address-id"
- filter.Name = &name
+ filter := make(map[string][]string)
if v, ok := d.GetOk("eip_id"); ok {
- filter.Values = []*string{helper.String(v.(string))}
+ filter["address-id"] = []string{v.(string)}
}
- filtersMap["Temp0"] = &filter
- if v, ok := filtersMap["Temp0"]; ok {
- filtersList = append(filtersList, v)
- }
- filter2 := vpc.Filter{}
- name2 := "address-name"
- filter2.Name = &name2
if v, ok := d.GetOk("eip_name"); ok {
- filter2.Values = []*string{helper.String(v.(string))}
- }
- filtersMap["Temp1"] = &filter2
- if v, ok := filtersMap["Temp1"]; ok {
- filtersList = append(filtersList, v)
+ filter["address-name"] = []string{v.(string)}
}
- filter3 := vpc.Filter{}
- name3 := "public-ip"
- filter3.Name = &name3
if v, ok := d.GetOk("public_ip"); ok {
- filter3.Values = []*string{helper.String(v.(string))}
- }
- filtersMap["Temp2"] = &filter3
- if v, ok := filtersMap["Temp2"]; ok {
- filtersList = append(filtersList, v)
+ filter["public-ip"] = []string{v.(string)}
}
- paramMap["Filters"] = filtersList
- var respData *vpc.DescribeAddressesResponseParams
+ tags := helper.GetTags(d, "tags")
+
+ var eips []*vpc.Address
+ var errRet error
err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
- result, e := service.DescribeEipsByFilter(ctx, paramMap)
- if e != nil {
- return tccommon.RetryError(e)
+ eips, errRet = vpcService.DescribeEipByFilter(ctx, filter)
+ if errRet != nil {
+ return tccommon.RetryError(errRet, tccommon.InternalError)
}
- respData = result
return nil
})
if err != nil {
return err
}
- if err := dataSourceTencentCloudEipsReadPostHandleResponse0(ctx, paramMap, respData); err != nil {
+ eipList := make([]map[string]interface{}, 0, len(eips))
+ ids := make([]string, 0, len(eips))
+
+EIP_LOOP:
+ for _, eip := range eips {
+ respTags, err := tagService.DescribeResourceTags(ctx, svcvpc.VPC_SERVICE_TYPE, svcvpc.EIP_RESOURCE_TYPE, region, *eip.AddressId)
+ if err != nil {
+ log.Printf("[CRITAL]%s describe eip tags failed: %+v", logId, err)
+ return err
+ }
+
+ for k, v := range tags {
+ if respTags[k] != v {
+ continue EIP_LOOP
+ }
+ }
+
+ mapping := map[string]interface{}{
+ "eip_id": eip.AddressId,
+ "eip_name": eip.AddressName,
+ "eip_type": eip.AddressType,
+ "status": eip.AddressStatus,
+ "public_ip": eip.AddressIp,
+ "instance_id": eip.InstanceId,
+ "eni_id": eip.NetworkInterfaceId,
+ "create_time": eip.CreatedTime,
+ "tags": respTags,
+ }
+
+ eipList = append(eipList, mapping)
+ ids = append(ids, *eip.AddressId)
+ }
+
+ d.SetId(helper.DataResourceIdsHash(ids))
+ err = d.Set("eip_list", eipList)
+ if err != nil {
+ log.Printf("[CRITAL]%s provider set eip list fail, reason:%s\n ", logId, err.Error())
return err
}
output, ok := d.GetOk("result_output_file")
if ok && output.(string) != "" {
- if e := tccommon.WriteToFile(output.(string), dataSourceTencentCloudEipsReadOutputContent(ctx)); e != nil {
- return e
+ if err := tccommon.WriteToFile(output.(string), eipList); err != nil {
+ return err
}
}
-
return nil
}
diff --git a/tencentcloud/services/cvm/resource_tc_eip.go b/tencentcloud/services/cvm/resource_tc_eip.go
index 96e2f66b25..73972ee2c0 100644
--- a/tencentcloud/services/cvm/resource_tc_eip.go
+++ b/tencentcloud/services/cvm/resource_tc_eip.go
@@ -274,10 +274,6 @@ func resourceTencentCloudEipRead(d *schema.ResourceData, meta interface{}) error
_ = d.Set("internet_service_provider", respData.InternetServiceProvider)
}
- if respData.LocalBgp != nil {
- _ = d.Set("local_bgp", respData.LocalBgp)
- }
-
if respData.Bandwidth != nil {
_ = d.Set("internet_max_bandwidth_out", respData.Bandwidth)
}
@@ -294,8 +290,8 @@ func resourceTencentCloudEipRead(d *schema.ResourceData, meta interface{}) error
_ = d.Set("anti_ddos_package_id", respData.AntiDDoSPackageId)
}
- if respData.BandwidthPackageId != nil {
- _ = d.Set("bandwidth_package_id", respData.BandwidthPackageId)
+ if err := resourceTencentCloudEipReadPostHandleResponse0(ctx, respData); err != nil {
+ return err
}
return nil
diff --git a/tencentcloud/services/cvm/resource_tc_eip_extension.go b/tencentcloud/services/cvm/resource_tc_eip_extension.go
index 36edbb4e32..4ee52c453f 100644
--- a/tencentcloud/services/cvm/resource_tc_eip_extension.go
+++ b/tencentcloud/services/cvm/resource_tc_eip_extension.go
@@ -62,6 +62,36 @@ func resourceTencentCloudEipCreatePostHandleResponse0(ctx context.Context, resp
return nil
}
+func resourceTencentCloudEipReadPostHandleResponse0(ctx context.Context, resp *vpc.Address) error {
+ d := tccommon.ResourceDataFromContext(ctx)
+ logId := tccommon.GetLogId(tccommon.ContextNil)
+ meta := tccommon.ProviderMetaFromContext(ctx)
+ client := meta.(tccommon.ProviderMeta).GetAPIV3Conn()
+ vpcService := svcvpc.NewVpcService(client)
+ tagService := svctag.NewTagService(client)
+ region := client.Region
+ eipId := d.Id()
+
+ tags, err := tagService.DescribeResourceTags(ctx, svcvpc.VPC_SERVICE_TYPE, svcvpc.EIP_RESOURCE_TYPE, region, eipId)
+ if err != nil {
+ log.Printf("[CRITAL]%s describe eip tags failed: %+v", logId, err)
+ return err
+ }
+
+ bgp, err := vpcService.DescribeVpcBandwidthPackageByEip(ctx, eipId)
+ if err != nil {
+ log.Printf("[CRITAL]%s describe eip tags failed: %+v", logId, err)
+ return err
+ }
+
+ _ = d.Set("tags", tags)
+ if bgp != nil {
+ _ = d.Set("bandwidth_package_id", bgp.BandwidthPackageId)
+ }
+
+ return nil
+}
+
func resourceTencentCloudEipUpdatePostFillRequest1(ctx context.Context, req *vpc.ModifyAddressInternetChargeTypeRequest) error {
d := tccommon.ResourceDataFromContext(ctx)
period := d.Get("prepaid_period").(int)
From 679a84f3779428a5540e79fdc1ad138168f4778c Mon Sep 17 00:00:00 2001
From: SevenEarth <391613297@qq.com>
Date: Tue, 4 Jun 2024 18:09:44 +0800
Subject: [PATCH 4/8] add
---
.../services/cvm/data_source_tc_eips.go | 171 ++++----
.../cvm/data_source_tc_eips_extension.go | 3 +-
.../services/cvm/data_source_tc_image.go | 4 +-
.../cvm/data_source_tc_image_extension.go | 6 +-
.../services/cvm/data_source_tc_images.go | 16 +-
.../cvm/data_source_tc_images_extension.go | 69 ++-
.../cvm/data_source_tc_images_test.txt | 1 +
.../services/cvm/data_source_tc_instances.go | 401 +++++++++---------
.../cvm/data_source_tc_instances_extension.go | 102 +++++
.../cvm/data_source_tc_instances_set.go | 69 ++-
.../data_source_tc_instances_set_extension.go | 27 +-
.../services/cvm/data_source_tc_key_pairs.go | 4 +-
.../cvm/data_source_tc_key_pairs_extension.go | 12 +-
.../cvm/data_source_tc_placement_groups.go | 4 +-
...ta_source_tc_placement_groups_extension.go | 7 +-
tencentcloud/services/cvm/resource_tc_eip.go | 25 --
.../services/cvm/resource_tc_eip_extension.go | 18 +-
.../services/cvm/service_tencentcloud_cvm.go | 231 +++++++---
18 files changed, 710 insertions(+), 460 deletions(-)
create mode 100644 tencentcloud/services/cvm/data_source_tc_images_test.txt
create mode 100644 tencentcloud/services/cvm/data_source_tc_instances_extension.go
diff --git a/tencentcloud/services/cvm/data_source_tc_eips.go b/tencentcloud/services/cvm/data_source_tc_eips.go
index 58057f6c3d..5879d45ed7 100644
--- a/tencentcloud/services/cvm/data_source_tc_eips.go
+++ b/tencentcloud/services/cvm/data_source_tc_eips.go
@@ -2,49 +2,24 @@ package cvm
import (
"context"
- "log"
-
- tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
- svctag "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/tag"
- svcvpc "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/vpc"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
vpc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312"
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
)
func DataSourceTencentCloudEips() *schema.Resource {
return &schema.Resource{
Read: dataSourceTencentCloudEipsRead,
-
Schema: map[string]*schema.Schema{
"eip_id": {
Type: schema.TypeString,
Optional: true,
Description: "ID of the EIP to be queried.",
},
- "eip_name": {
- Type: schema.TypeString,
- Optional: true,
- Description: "Name of the EIP to be queried.",
- },
- "public_ip": {
- Type: schema.TypeString,
- Optional: true,
- Description: "The elastic ip address.",
- },
- "tags": {
- Type: schema.TypeMap,
- Optional: true,
- Description: "The tags of EIP.",
- },
- "result_output_file": {
- Type: schema.TypeString,
- Optional: true,
- Description: "Used to save results.",
- },
"eip_list": {
Type: schema.TypeList,
@@ -52,6 +27,11 @@ func DataSourceTencentCloudEips() *schema.Resource {
Description: "An information list of EIP. Each element contains the following attributes:",
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
+ "create_time": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "Creation time of the EIP.",
+ },
"eip_id": {
Type: schema.TypeString,
Computed: true,
@@ -67,30 +47,25 @@ func DataSourceTencentCloudEips() *schema.Resource {
Computed: true,
Description: "Type of the EIP.",
},
- "status": {
- Type: schema.TypeString,
- Computed: true,
- Description: "The EIP current status.",
- },
- "public_ip": {
+ "eni_id": {
Type: schema.TypeString,
Computed: true,
- Description: "The elastic ip address.",
+ Description: "The eni id to bind with the EIP.",
},
"instance_id": {
Type: schema.TypeString,
Computed: true,
Description: "The instance id to bind with the EIP.",
},
- "eni_id": {
+ "public_ip": {
Type: schema.TypeString,
Computed: true,
- Description: "The eni id to bind with the EIP.",
+ Description: "The elastic ip address.",
},
- "create_time": {
+ "status": {
Type: schema.TypeString,
Computed: true,
- Description: "Creation time of the EIP.",
+ Description: "The EIP current status.",
},
"tags": {
Type: schema.TypeMap,
@@ -100,91 +75,101 @@ func DataSourceTencentCloudEips() *schema.Resource {
},
},
},
+
+ "eip_name": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "Name of the EIP to be queried.",
+ },
+
+ "public_ip": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "The elastic ip address.",
+ },
+
+ "tags": {
+ Type: schema.TypeMap,
+ Optional: true,
+ Description: "The tags of EIP.",
+ },
+
+ "result_output_file": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "Used to save results.",
+ },
},
}
}
func dataSourceTencentCloudEipsRead(d *schema.ResourceData, meta interface{}) error {
defer tccommon.LogElapsed("data_source.tencentcloud_eips.read")()
- logId := tccommon.GetLogId(tccommon.ContextNil)
- ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
+ defer tccommon.InconsistentCheck(d, meta)()
+
+ logId := tccommon.GetLogId(nil)
+ ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
- client := meta.(tccommon.ProviderMeta).GetAPIV3Conn()
- vpcService := svcvpc.NewVpcService(client)
- tagService := svctag.NewTagService(client)
- region := client.Region
+ service := VpcService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
- filter := make(map[string][]string)
+ paramMap := make(map[string]interface{})
+ var filtersList []*vpc.Filter
+ filtersMap := map[string]*vpc.Filter{}
+ filter := vpc.Filter{}
+ name := "address-id"
+ filter.Name = &name
if v, ok := d.GetOk("eip_id"); ok {
- filter["address-id"] = []string{v.(string)}
+ filter.Values = []*string{helper.String(v.(string))}
}
+ filtersMap["Temp0"] = &filter
+ if v, ok := filtersMap["Temp0"]; ok && len(v.Values) > 0 {
+ filtersList = append(filtersList, v)
+ }
+ filter2 := vpc.Filter{}
+ name2 := "address-name"
+ filter2.Name = &name2
if v, ok := d.GetOk("eip_name"); ok {
- filter["address-name"] = []string{v.(string)}
+ filter2.Values = []*string{helper.String(v.(string))}
+ }
+ filtersMap["Temp1"] = &filter2
+ if v, ok := filtersMap["Temp1"]; ok && len(v.Values) > 0 {
+ filtersList = append(filtersList, v)
}
+ filter3 := vpc.Filter{}
+ name3 := "public-ip"
+ filter3.Name = &name3
if v, ok := d.GetOk("public_ip"); ok {
- filter["public-ip"] = []string{v.(string)}
+ filter3.Values = []*string{helper.String(v.(string))}
}
+ filtersMap["Temp2"] = &filter3
+ if v, ok := filtersMap["Temp2"]; ok && len(v.Values) > 0 {
+ filtersList = append(filtersList, v)
+ }
+ paramMap["Filters"] = filtersList
- tags := helper.GetTags(d, "tags")
-
- var eips []*vpc.Address
- var errRet error
+ var respData *vpc.DescribeAddressesResponseParams
err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
- eips, errRet = vpcService.DescribeEipByFilter(ctx, filter)
- if errRet != nil {
- return tccommon.RetryError(errRet, tccommon.InternalError)
+ result, e := service.DescribeEipsByFilter(ctx, paramMap)
+ if e != nil {
+ return tccommon.RetryError(e)
}
+ respData = result
return nil
})
if err != nil {
return err
}
- eipList := make([]map[string]interface{}, 0, len(eips))
- ids := make([]string, 0, len(eips))
-
-EIP_LOOP:
- for _, eip := range eips {
- respTags, err := tagService.DescribeResourceTags(ctx, svcvpc.VPC_SERVICE_TYPE, svcvpc.EIP_RESOURCE_TYPE, region, *eip.AddressId)
- if err != nil {
- log.Printf("[CRITAL]%s describe eip tags failed: %+v", logId, err)
- return err
- }
-
- for k, v := range tags {
- if respTags[k] != v {
- continue EIP_LOOP
- }
- }
-
- mapping := map[string]interface{}{
- "eip_id": eip.AddressId,
- "eip_name": eip.AddressName,
- "eip_type": eip.AddressType,
- "status": eip.AddressStatus,
- "public_ip": eip.AddressIp,
- "instance_id": eip.InstanceId,
- "eni_id": eip.NetworkInterfaceId,
- "create_time": eip.CreatedTime,
- "tags": respTags,
- }
-
- eipList = append(eipList, mapping)
- ids = append(ids, *eip.AddressId)
- }
-
- d.SetId(helper.DataResourceIdsHash(ids))
- err = d.Set("eip_list", eipList)
- if err != nil {
- log.Printf("[CRITAL]%s provider set eip list fail, reason:%s\n ", logId, err.Error())
+ if err := dataSourceTencentCloudEipsReadPostHandleResponse0(ctx, paramMap, respData); err != nil {
return err
}
output, ok := d.GetOk("result_output_file")
if ok && output.(string) != "" {
- if err := tccommon.WriteToFile(output.(string), eipList); err != nil {
- return err
+ if e := tccommon.WriteToFile(output.(string), dataSourceTencentCloudEipsReadOutputContent(ctx)); e != nil {
+ return e
}
}
+
return nil
}
diff --git a/tencentcloud/services/cvm/data_source_tc_eips_extension.go b/tencentcloud/services/cvm/data_source_tc_eips_extension.go
index b6b245a635..bfcd6ad35d 100644
--- a/tencentcloud/services/cvm/data_source_tc_eips_extension.go
+++ b/tencentcloud/services/cvm/data_source_tc_eips_extension.go
@@ -2,7 +2,6 @@ package cvm
import (
"context"
- "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
svctag "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/tag"
@@ -13,7 +12,7 @@ import (
)
func dataSourceTencentCloudEipsReadOutputContent(ctx context.Context) interface{} {
- eipList := ctx.Value("eipList").(*schema.Set).List()
+ eipList := ctx.Value("eipList")
return eipList
}
diff --git a/tencentcloud/services/cvm/data_source_tc_image.go b/tencentcloud/services/cvm/data_source_tc_image.go
index dfc2e2b4b9..00527b2729 100644
--- a/tencentcloud/services/cvm/data_source_tc_image.go
+++ b/tencentcloud/services/cvm/data_source_tc_image.go
@@ -102,7 +102,7 @@ func dataSourceTencentCloudImageRead(d *schema.ResourceData, meta interface{}) e
paramMap["Filters"] = tmpSet
}
- var respData *cvm.DescribeImagesResponseParams
+ var respData []*cvm.Image
err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
result, e := service.DescribeImageByFilter(ctx, paramMap)
if e != nil {
@@ -115,7 +115,7 @@ func dataSourceTencentCloudImageRead(d *schema.ResourceData, meta interface{}) e
return err
}
- if err := dataSourceTencentCloudImageReadPostHandleResponse0(ctx, paramMap, respData); err != nil {
+ if err := dataSourceTencentCloudImageReadPostHandleResponse0(ctx, paramMap, &respData); err != nil {
return err
}
diff --git a/tencentcloud/services/cvm/data_source_tc_image_extension.go b/tencentcloud/services/cvm/data_source_tc_image_extension.go
index 0e56d60b96..ab977a4dce 100644
--- a/tencentcloud/services/cvm/data_source_tc_image_extension.go
+++ b/tencentcloud/services/cvm/data_source_tc_image_extension.go
@@ -12,9 +12,9 @@ import (
cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
)
-func dataSourceTencentCloudImageReadPostHandleResponse0(ctx context.Context, req map[string]interface{}, resp *cvm.DescribeImagesResponseParams) error {
+func dataSourceTencentCloudImageReadPostHandleResponse0(ctx context.Context, req map[string]interface{}, resp *[]*cvm.Image) error {
d := tccommon.ResourceDataFromContext(ctx)
- images := resp.ImageSet
+ images := *resp
var err error
if len(images) == 0 {
return errors.New("No image found")
@@ -75,6 +75,6 @@ func dataSourceTencentCloudImageReadPostHandleResponse0(ctx context.Context, req
}
func dataSourceTencentCloudImageReadOutputContent(ctx context.Context) interface{} {
- resultImageId := ctx.Value("resultImageId").(string)
+ resultImageId := ctx.Value("resultImageId")
return resultImageId
}
diff --git a/tencentcloud/services/cvm/data_source_tc_images.go b/tencentcloud/services/cvm/data_source_tc_images.go
index de0085ff83..f966348370 100644
--- a/tencentcloud/services/cvm/data_source_tc_images.go
+++ b/tencentcloud/services/cvm/data_source_tc_images.go
@@ -187,17 +187,7 @@ func dataSourceTencentCloudImagesRead(d *schema.ResourceData, meta interface{})
filter.Values = []*string{helper.String(v.(string))}
}
filtersMap["Temp0"] = &filter
- if v, ok := filtersMap["Temp0"]; ok {
- filtersList = append(filtersList, v)
- }
- filter2 := cvm.Filter{}
- name2 := "image_type"
- filter2.Name = &name2
- if v, ok := d.GetOk("image_type"); ok {
- filter2.Values = []*string{helper.String(v.(string))}
- }
- filtersMap["Temp1"] = &filter2
- if v, ok := filtersMap["Temp1"]; ok {
+ if v, ok := filtersMap["Temp0"]; ok && len(v.Values) > 0 {
filtersList = append(filtersList, v)
}
paramMap["Filters"] = filtersList
@@ -206,7 +196,7 @@ func dataSourceTencentCloudImagesRead(d *schema.ResourceData, meta interface{})
return err
}
- var respData *cvm.DescribeImagesResponseParams
+ var respData []*cvm.Image
err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
result, e := service.DescribeImagesByFilter(ctx, paramMap)
if e != nil {
@@ -219,7 +209,7 @@ func dataSourceTencentCloudImagesRead(d *schema.ResourceData, meta interface{})
return err
}
- if err := dataSourceTencentCloudImagesReadPostHandleResponse0(ctx, paramMap, respData); err != nil {
+ if err := dataSourceTencentCloudImagesReadPostHandleResponse0(ctx, paramMap, &respData); err != nil {
return err
}
diff --git a/tencentcloud/services/cvm/data_source_tc_images_extension.go b/tencentcloud/services/cvm/data_source_tc_images_extension.go
index 96d5c05471..07e65b27bf 100644
--- a/tencentcloud/services/cvm/data_source_tc_images_extension.go
+++ b/tencentcloud/services/cvm/data_source_tc_images_extension.go
@@ -14,18 +14,44 @@ import (
)
func dataSourceTencentCloudImagesReadOutputContent(ctx context.Context) interface{} {
- imageList := ctx.Value("imageList").([]interface{})
+ imageList := ctx.Value("imageList")
return imageList
}
-func dataSourceTencentCloudImagesReadPostHandleResponse0(ctx context.Context, req map[string]interface{}, resp *cvm.DescribeImagesResponseParams) error {
+func dataSourceTencentCloudImagesReadPreRequest0(ctx context.Context, req *cvm.DescribeImagesRequest) error {
d := tccommon.ResourceDataFromContext(ctx)
- images := resp.ImageSet
- osName := ctx.Value("osName").(string)
- imageName := ctx.Value("imageName").(string)
- imageNameRegex := ctx.Value("imageNameRegex").(*regexp.Regexp)
+ if v, ok := d.GetOk("instance_type"); ok {
+ req.InstanceType = helper.String(v.(string))
+ }
+
+ return nil
+}
+
+func dataSourceTencentCloudImagesReadPostHandleResponse0(ctx context.Context, req map[string]interface{}, resp *[]*cvm.Image) error {
+ d := tccommon.ResourceDataFromContext(ctx)
+ images := *resp
+ var (
+ imageName string
+ osName string
+ imageNameRegex *regexp.Regexp
+ err error
+ )
+
+ if v, ok := d.GetOk("os_name"); ok {
+ osName = v.(string)
+ }
+
+ if v, ok := d.GetOk("image_name_regex"); ok {
+ imageName = v.(string)
+ if imageName != "" {
+ imageNameRegex, err = regexp.Compile(imageName)
+ if err != nil {
+ return fmt.Errorf("image_name_regex format error,%s", err.Error())
+ }
+ }
+ }
+
var results []*cvm.Image
- var err error
images = sortImages(images)
if osName == "" && imageName == "" {
results = images
@@ -92,33 +118,32 @@ func dataSourceTencentCloudImagesReadPostHandleResponse0(ctx context.Context, re
func dataSourceTencentCloudImagesReadPostFillRequest0(ctx context.Context, req map[string]interface{}) error {
d := tccommon.ResourceDataFromContext(ctx)
var (
- imageName string
- osName string
- instanceType string
- imageNameRegex *regexp.Regexp
- err error
+ imageName string
+ imageType []string
+ err error
)
+
if v, ok := d.GetOk("image_name_regex"); ok {
imageName = v.(string)
if imageName != "" {
- imageNameRegex, err = regexp.Compile(imageName)
+ _, err = regexp.Compile(imageName)
if err != nil {
return fmt.Errorf("image_name_regex format error,%s", err.Error())
}
}
}
- if v, ok := d.GetOk("os_name"); ok {
- osName = v.(string)
- }
-
- if v, ok := d.GetOk("instance_type"); ok {
- instanceType = v.(string)
+ if v, ok := d.GetOk("image_type"); ok {
+ for _, vv := range v.([]interface{}) {
+ if vv.(string) != "" {
+ imageType = append(imageType, vv.(string))
+ }
+ }
+ if len(imageType) > 0 {
+ req["image-type"] = imageType
+ }
}
- context.WithValue(ctx, "imageNameRegex", imageNameRegex)
- context.WithValue(ctx, "osName", osName)
- context.WithValue(ctx, "instanceType", instanceType)
return nil
}
diff --git a/tencentcloud/services/cvm/data_source_tc_images_test.txt b/tencentcloud/services/cvm/data_source_tc_images_test.txt
new file mode 100644
index 0000000000..ec747fa47d
--- /dev/null
+++ b/tencentcloud/services/cvm/data_source_tc_images_test.txt
@@ -0,0 +1 @@
+null
\ No newline at end of file
diff --git a/tencentcloud/services/cvm/data_source_tc_instances.go b/tencentcloud/services/cvm/data_source_tc_instances.go
index fb0a158882..f852e76029 100644
--- a/tencentcloud/services/cvm/data_source_tc_instances.go
+++ b/tencentcloud/services/cvm/data_source_tc_instances.go
@@ -2,146 +2,66 @@ package cvm
import (
"context"
- "fmt"
- "log"
-
- tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
)
func DataSourceTencentCloudInstances() *schema.Resource {
return &schema.Resource{
Read: dataSourceTencentCloudInstancesRead,
-
Schema: map[string]*schema.Schema{
- "instance_id": {
- Type: schema.TypeString,
- Optional: true,
- Description: "ID of the instances to be queried.",
- },
- "instance_name": {
- Type: schema.TypeString,
- Optional: true,
- ValidateFunc: tccommon.ValidateStringLengthInRange(1, 30),
- Description: "Name of the instances to be queried.",
- },
"availability_zone": {
Type: schema.TypeString,
Optional: true,
Description: "The available zone that the CVM instance locates at.",
},
- "project_id": {
- Type: schema.TypeInt,
- Optional: true,
- Description: "The project CVM belongs to.",
- },
- "vpc_id": {
- Type: schema.TypeString,
- Optional: true,
- Description: "ID of the vpc to be queried.",
- },
- "subnet_id": {
- Type: schema.TypeString,
- Optional: true,
- Description: "ID of a vpc subnetwork.",
- },
- "instance_set_ids": {
- Type: schema.TypeList,
- Optional: true,
- MaxItems: 100,
- ConflictsWith: []string{"instance_id", "instance_name", "availability_zone", "project_id", "vpc_id", "subnet_id", "tags"},
- Elem: &schema.Schema{
- Type: schema.TypeString,
- },
- Description: "Instance set ids, max length is 100, conflict with other field.",
- },
- "tags": {
- Type: schema.TypeMap,
- Optional: true,
- Description: "Tags of the instance.",
- },
- "result_output_file": {
+
+ "instance_id": {
Type: schema.TypeString,
Optional: true,
- Description: "Used to save results.",
+ Description: "ID of the instances to be queried.",
},
- // computed
"instance_list": {
Type: schema.TypeList,
Computed: true,
Description: "An information list of cvm instance. Each element contains the following attributes:",
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
- "instance_id": {
- Type: schema.TypeString,
+ "allocate_public_ip": {
+ Type: schema.TypeBool,
Computed: true,
- Description: "ID of the instances.",
+ Description: "Indicates whether public ip is assigned.",
},
- "instance_name": {
+ "availability_zone": {
Type: schema.TypeString,
Computed: true,
- Description: "Name of the instances.",
+ Description: "The available zone that the CVM instance locates at.",
},
- "instance_type": {
+ "cam_role_name": {
Type: schema.TypeString,
Computed: true,
- Description: "Type of the instance.",
+ Description: "CAM role name authorized to access.",
},
"cpu": {
Type: schema.TypeInt,
Computed: true,
Description: "The number of CPU cores of the instance.",
},
- "memory": {
- Type: schema.TypeInt,
- Computed: true,
- Description: "Instance memory capacity, unit in GB.",
- },
"os_name": {
Type: schema.TypeString,
Computed: true,
Description: "Instance os name.",
},
- "availability_zone": {
- Type: schema.TypeString,
- Computed: true,
- Description: "The available zone that the CVM instance locates at.",
- },
- "project_id": {
- Type: schema.TypeInt,
- Computed: true,
- Description: "The project CVM belongs to.",
- },
- "image_id": {
- Type: schema.TypeString,
- Computed: true,
- Description: "ID of the image.",
- },
- "instance_charge_type": {
- Type: schema.TypeString,
- Computed: true,
- Description: "The charge type of the instance.",
- },
- "system_disk_type": {
- Type: schema.TypeString,
- Computed: true,
- Description: "Type of the system disk.",
- },
- "system_disk_size": {
- Type: schema.TypeInt,
- Computed: true,
- Description: "Size of the system disk.",
- },
- "system_disk_id": {
+ "create_time": {
Type: schema.TypeString,
Computed: true,
- Description: "Image ID of the system disk.",
+ Description: "Creation time of the instance.",
},
"data_disks": {
Type: schema.TypeList,
@@ -149,20 +69,20 @@ func DataSourceTencentCloudInstances() *schema.Resource {
Description: "An information list of data disk. Each element contains the following attributes:",
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
- "data_disk_type": {
+ "data_disk_id": {
Type: schema.TypeString,
Computed: true,
- Description: "Type of the data disk.",
+ Description: "Image ID of the data disk.",
},
"data_disk_size": {
Type: schema.TypeInt,
Computed: true,
Description: "Size of the data disk.",
},
- "data_disk_id": {
+ "data_disk_type": {
Type: schema.TypeString,
Computed: true,
- Description: "Image ID of the data disk.",
+ Description: "Type of the data disk.",
},
"delete_with_instance": {
Type: schema.TypeBool,
@@ -172,15 +92,40 @@ func DataSourceTencentCloudInstances() *schema.Resource {
},
},
},
- "vpc_id": {
+ "expired_time": {
Type: schema.TypeString,
Computed: true,
- Description: "ID of the vpc.",
+ Description: "Expired time of the instance.",
},
- "subnet_id": {
+ "image_id": {
Type: schema.TypeString,
Computed: true,
- Description: "ID of a vpc subnetwork.",
+ Description: "ID of the image.",
+ },
+ "instance_charge_type": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "The charge type of the instance.",
+ },
+ "instance_charge_type_prepaid_renew_flag": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "The way that CVM instance will be renew automatically or not when it reach the end of the prepaid tenancy.",
+ },
+ "instance_id": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "ID of the instances.",
+ },
+ "instance_name": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "Name of the instances.",
+ },
+ "instance_type": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "Type of the instance.",
},
"internet_charge_type": {
Type: schema.TypeString,
@@ -192,180 +137,224 @@ func DataSourceTencentCloudInstances() *schema.Resource {
Computed: true,
Description: "Public network maximum output bandwidth of the instance.",
},
- "allocate_public_ip": {
- Type: schema.TypeBool,
+ "memory": {
+ Type: schema.TypeInt,
Computed: true,
- Description: "Indicates whether public ip is assigned.",
+ Description: "Instance memory capacity, unit in GB.",
},
- "status": {
+ "private_ip": {
Type: schema.TypeString,
Computed: true,
- Description: "Status of the instance.",
+ Description: "Private IP of the instance.",
},
- "public_ip": {
- Type: schema.TypeString,
+ "project_id": {
+ Type: schema.TypeInt,
Computed: true,
- Description: "Public IP of the instance.",
+ Description: "The project CVM belongs to.",
},
- "private_ip": {
+ "public_ip": {
Type: schema.TypeString,
Computed: true,
- Description: "Private IP of the instance.",
+ Description: "Public IP of the instance.",
},
"security_groups": {
Type: schema.TypeList,
Computed: true,
- Elem: &schema.Schema{Type: schema.TypeString},
Description: "Security groups of the instance.",
+ Elem: &schema.Schema{
+ Type: schema.TypeString,
+ },
},
- "tags": {
- Type: schema.TypeMap,
+ "status": {
+ Type: schema.TypeString,
Computed: true,
- Description: "Tags of the instance.",
+ Description: "Status of the instance.",
},
- "create_time": {
+ "subnet_id": {
Type: schema.TypeString,
Computed: true,
- Description: "Creation time of the instance.",
+ Description: "ID of a vpc subnetwork.",
},
- "expired_time": {
+ "system_disk_id": {
Type: schema.TypeString,
Computed: true,
- Description: "Expired time of the instance.",
+ Description: "Image ID of the system disk.",
},
- "instance_charge_type_prepaid_renew_flag": {
+ "system_disk_size": {
+ Type: schema.TypeInt,
+ Computed: true,
+ Description: "Size of the system disk.",
+ },
+ "system_disk_type": {
Type: schema.TypeString,
Computed: true,
- Description: "The way that CVM instance will be renew automatically or not when it reach the end of the prepaid tenancy.",
+ Description: "Type of the system disk.",
},
- "cam_role_name": {
+ "tags": {
+ Type: schema.TypeMap,
+ Computed: true,
+ Description: "Tags of the instance.",
+ },
+ "vpc_id": {
Type: schema.TypeString,
Computed: true,
- Description: "CAM role name authorized to access.",
+ Description: "ID of the vpc.",
},
},
},
},
+
+ "instance_name": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "Name of the instances to be queried.",
+ },
+
+ "instance_set_ids": {
+ Type: schema.TypeList,
+ Optional: true,
+ MaxItems: 100,
+ ConflictsWith: []string{"instance_id", "instance_name", "availability_zone", "project_id", "vpc_id", "subnet_id", "tags"},
+ Description: "Instance set ids, max length is 100, conflict with other field.",
+ Elem: &schema.Schema{
+ Type: schema.TypeString,
+ },
+ },
+
+ "project_id": {
+ Type: schema.TypeInt,
+ Optional: true,
+ Description: "The project CVM belongs to.",
+ },
+
+ "subnet_id": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "ID of a vpc subnetwork.",
+ },
+
+ "tags": {
+ Type: schema.TypeMap,
+ Optional: true,
+ Description: "Tags of the instance.",
+ },
+
+ "vpc_id": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "ID of the vpc to be queried.",
+ },
+
+ "result_output_file": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "Used to save results.",
+ },
},
}
}
func dataSourceTencentCloudInstancesRead(d *schema.ResourceData, meta interface{}) error {
defer tccommon.LogElapsed("data_source.tencentcloud_instances.read")()
- logId := tccommon.GetLogId(tccommon.ContextNil)
- ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
- cvmService := CvmService{
- client: meta.(tccommon.ProviderMeta).GetAPIV3Conn(),
- }
+ defer tccommon.InconsistentCheck(d, meta)()
- var instanceSetIds []*string
+ logId := tccommon.GetLogId(nil)
+ ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
- filter := make(map[string]string)
+ service := CvmService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
+
+ paramMap := make(map[string]interface{})
+ var filtersList []*cvm.Filter
+ filtersMap := map[string]*cvm.Filter{}
+ filter := cvm.Filter{}
+ name := "instance-id"
+ filter.Name = &name
if v, ok := d.GetOk("instance_id"); ok {
- filter["instance-id"] = v.(string)
+ filter.Values = []*string{helper.String(v.(string))}
+ }
+ filtersMap["Temp0"] = &filter
+ if v, ok := filtersMap["Temp0"]; ok && len(v.Values) > 0 {
+ filtersList = append(filtersList, v)
}
+ filter2 := cvm.Filter{}
+ name2 := "instance-name"
+ filter2.Name = &name2
if v, ok := d.GetOk("instance_name"); ok {
- filter["instance-name"] = v.(string)
+ filter2.Values = []*string{helper.String(v.(string))}
}
+ filtersMap["Temp1"] = &filter2
+ if v, ok := filtersMap["Temp1"]; ok && len(v.Values) > 0 {
+ filtersList = append(filtersList, v)
+ }
+ filter3 := cvm.Filter{}
+ name3 := "zone"
+ filter3.Name = &name3
if v, ok := d.GetOk("availability_zone"); ok {
- filter["zone"] = v.(string)
+ filter3.Values = []*string{helper.String(v.(string))}
+ }
+ filtersMap["Temp2"] = &filter3
+ if v, ok := filtersMap["Temp2"]; ok && len(v.Values) > 0 {
+ filtersList = append(filtersList, v)
}
- if v, ok := d.GetOkExists("project_id"); ok {
- filter["project-id"] = fmt.Sprintf("%d", v.(int))
+ filter4 := cvm.Filter{}
+ name4 := "project-id"
+ filter4.Name = &name4
+ if v, ok := d.GetOk("project_id"); ok {
+ filter4.Values = []*string{helper.String(v.(string))}
}
+ filtersMap["Temp3"] = &filter4
+ if v, ok := filtersMap["Temp3"]; ok && len(v.Values) > 0 {
+ filtersList = append(filtersList, v)
+ }
+ filter5 := cvm.Filter{}
+ name5 := "vpc-id"
+ filter5.Name = &name5
if v, ok := d.GetOk("vpc_id"); ok {
- filter["vpc-id"] = v.(string)
+ filter5.Values = []*string{helper.String(v.(string))}
+ }
+ filtersMap["Temp4"] = &filter5
+ if v, ok := filtersMap["Temp4"]; ok && len(v.Values) > 0 {
+ filtersList = append(filtersList, v)
}
+ filter6 := cvm.Filter{}
+ name6 := "subnet-id"
+ filter6.Name = &name6
if v, ok := d.GetOk("subnet_id"); ok {
- filter["subnet-id"] = v.(string)
+ filter6.Values = []*string{helper.String(v.(string))}
}
- if v, ok := d.GetOk("instance_set_ids"); ok {
- instanceSetIds = helper.InterfacesStringsPoint(v.([]interface{}))
+ filtersMap["Temp5"] = &filter6
+ if v, ok := filtersMap["Temp5"]; ok && len(v.Values) > 0 {
+ filtersList = append(filtersList, v)
}
+ paramMap["Filters"] = filtersList
- if v, ok := d.GetOk("tags"); ok {
- for key, value := range v.(map[string]interface{}) {
- filter["tag:"+key] = value.(string)
- }
+ if err := dataSourceTencentCloudInstancesReadPostFillRequest0(ctx, paramMap); err != nil {
+ return err
}
- var instances []*cvm.Instance
- var errRet error
+ var respData []*cvm.Instance
err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
- instances, errRet = cvmService.DescribeInstanceByFilter(ctx, instanceSetIds, filter)
- if errRet != nil {
- return tccommon.RetryError(errRet, tccommon.InternalError)
+ result, e := service.DescribeInstancesByFilter(ctx, paramMap)
+ if e != nil {
+ return tccommon.RetryError(e)
}
+ respData = result
return nil
})
if err != nil {
return err
}
- instanceList := make([]map[string]interface{}, 0, len(instances))
- ids := make([]string, 0, len(instances))
- for _, instance := range instances {
- mapping := map[string]interface{}{
- "instance_id": instance.InstanceId,
- "instance_name": instance.InstanceName,
- "instance_type": instance.InstanceType,
- "cpu": instance.CPU,
- "memory": instance.Memory,
- "os_name": instance.OsName,
- "availability_zone": instance.Placement.Zone,
- "project_id": instance.Placement.ProjectId,
- "image_id": instance.ImageId,
- "instance_charge_type": instance.InstanceChargeType,
- "system_disk_type": instance.SystemDisk.DiskType,
- "system_disk_size": instance.SystemDisk.DiskSize,
- "system_disk_id": instance.SystemDisk.DiskId,
- "vpc_id": instance.VirtualPrivateCloud.VpcId,
- "subnet_id": instance.VirtualPrivateCloud.SubnetId,
- "internet_charge_type": instance.InternetAccessible.InternetChargeType,
- "internet_max_bandwidth_out": instance.InternetAccessible.InternetMaxBandwidthOut,
- "allocate_public_ip": instance.InternetAccessible.PublicIpAssigned,
- "status": instance.InstanceState,
- "security_groups": helper.StringsInterfaces(instance.SecurityGroupIds),
- "tags": flattenCvmTagsMapping(instance.Tags),
- "create_time": instance.CreatedTime,
- "expired_time": instance.ExpiredTime,
- "instance_charge_type_prepaid_renew_flag": instance.RenewFlag,
- "cam_role_name": instance.CamRoleName,
- }
- if len(instance.PublicIpAddresses) > 0 {
- mapping["public_ip"] = *instance.PublicIpAddresses[0]
- }
- if len(instance.PrivateIpAddresses) > 0 {
- mapping["private_ip"] = *instance.PrivateIpAddresses[0]
- }
- dataDisks := make([]map[string]interface{}, 0, len(instance.DataDisks))
- for _, v := range instance.DataDisks {
- dataDisk := map[string]interface{}{
- "data_disk_type": v.DiskType,
- "data_disk_size": v.DiskSize,
- "data_disk_id": v.DiskId,
- "delete_with_instance": v.DeleteWithInstance,
- }
- dataDisks = append(dataDisks, dataDisk)
- }
- mapping["data_disks"] = dataDisks
- instanceList = append(instanceList, mapping)
- ids = append(ids, *instance.InstanceId)
- }
-
- d.SetId(helper.DataResourceIdsHash(ids))
- err = d.Set("instance_list", instanceList)
- if err != nil {
- log.Printf("[CRITAL]%s provider set instance list fail, reason:%s\n ", logId, err.Error())
+ if err := dataSourceTencentCloudInstancesReadPostHandleResponse0(ctx, paramMap, &respData); err != nil {
return err
}
output, ok := d.GetOk("result_output_file")
if ok && output.(string) != "" {
- if err := tccommon.WriteToFile(output.(string), instanceList); err != nil {
- return err
+ if e := tccommon.WriteToFile(output.(string), dataSourceTencentCloudInstancesReadOutputContent(ctx)); e != nil {
+ return e
}
}
- return nil
+ return nil
}
diff --git a/tencentcloud/services/cvm/data_source_tc_instances_extension.go b/tencentcloud/services/cvm/data_source_tc_instances_extension.go
new file mode 100644
index 0000000000..0dedc513e8
--- /dev/null
+++ b/tencentcloud/services/cvm/data_source_tc_instances_extension.go
@@ -0,0 +1,102 @@
+package cvm
+
+import (
+ "context"
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
+ "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
+ "log"
+
+ cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
+)
+
+func dataSourceTencentCloudInstancesReadPostFillRequest0(ctx context.Context, req map[string]interface{}) error {
+ d := tccommon.ResourceDataFromContext(ctx)
+ if v, ok := d.GetOk("tags"); ok {
+ for key, value := range v.(map[string]interface{}) {
+ req["tag:"+key] = value.(string)
+ }
+ }
+
+ return nil
+}
+
+func dataSourceTencentCloudInstancesReadPreRequest0(ctx context.Context, req *cvm.DescribeInstancesRequest) error {
+ d := tccommon.ResourceDataFromContext(ctx)
+ if v, ok := d.GetOk("instance_set_ids"); ok {
+ req.InstanceIds = helper.InterfacesStringsPoint(v.([]interface{}))
+ }
+
+ return nil
+}
+
+func dataSourceTencentCloudInstancesReadPostHandleResponse0(ctx context.Context, req map[string]interface{}, resp *[]*cvm.Instance) error {
+ d := tccommon.ResourceDataFromContext(ctx)
+ logId := tccommon.GetLogId(tccommon.ContextNil)
+ var err error
+ instances := *resp
+ instanceList := make([]map[string]interface{}, 0, len(instances))
+ ids := make([]string, 0, len(instances))
+ for _, instance := range instances {
+ mapping := map[string]interface{}{
+ "instance_id": instance.InstanceId,
+ "instance_name": instance.InstanceName,
+ "instance_type": instance.InstanceType,
+ "cpu": instance.CPU,
+ "memory": instance.Memory,
+ "os_name": instance.OsName,
+ "availability_zone": instance.Placement.Zone,
+ "project_id": instance.Placement.ProjectId,
+ "image_id": instance.ImageId,
+ "instance_charge_type": instance.InstanceChargeType,
+ "system_disk_type": instance.SystemDisk.DiskType,
+ "system_disk_size": instance.SystemDisk.DiskSize,
+ "system_disk_id": instance.SystemDisk.DiskId,
+ "vpc_id": instance.VirtualPrivateCloud.VpcId,
+ "subnet_id": instance.VirtualPrivateCloud.SubnetId,
+ "internet_charge_type": instance.InternetAccessible.InternetChargeType,
+ "internet_max_bandwidth_out": instance.InternetAccessible.InternetMaxBandwidthOut,
+ "allocate_public_ip": instance.InternetAccessible.PublicIpAssigned,
+ "status": instance.InstanceState,
+ "security_groups": helper.StringsInterfaces(instance.SecurityGroupIds),
+ "tags": flattenCvmTagsMapping(instance.Tags),
+ "create_time": instance.CreatedTime,
+ "expired_time": instance.ExpiredTime,
+ "instance_charge_type_prepaid_renew_flag": instance.RenewFlag,
+ "cam_role_name": instance.CamRoleName,
+ }
+ if len(instance.PublicIpAddresses) > 0 {
+ mapping["public_ip"] = *instance.PublicIpAddresses[0]
+ }
+ if len(instance.PrivateIpAddresses) > 0 {
+ mapping["private_ip"] = *instance.PrivateIpAddresses[0]
+ }
+ dataDisks := make([]map[string]interface{}, 0, len(instance.DataDisks))
+ for _, v := range instance.DataDisks {
+ dataDisk := map[string]interface{}{
+ "data_disk_type": v.DiskType,
+ "data_disk_size": v.DiskSize,
+ "data_disk_id": v.DiskId,
+ "delete_with_instance": v.DeleteWithInstance,
+ }
+ dataDisks = append(dataDisks, dataDisk)
+ }
+ mapping["data_disks"] = dataDisks
+ instanceList = append(instanceList, mapping)
+ ids = append(ids, *instance.InstanceId)
+ }
+
+ d.SetId(helper.DataResourceIdsHash(ids))
+ err = d.Set("instance_list", instanceList)
+ if err != nil {
+ log.Printf("[CRITAL]%s provider set instance list fail, reason:%s\n ", logId, err.Error())
+ return err
+ }
+
+ context.WithValue(ctx, "instanceList", instanceList)
+ return nil
+}
+
+func dataSourceTencentCloudInstancesReadOutputContent(ctx context.Context) interface{} {
+ instanceList := ctx.Value("instanceList")
+ return instanceList
+}
diff --git a/tencentcloud/services/cvm/data_source_tc_instances_set.go b/tencentcloud/services/cvm/data_source_tc_instances_set.go
index 9043b14095..32f4a1ad54 100644
--- a/tencentcloud/services/cvm/data_source_tc_instances_set.go
+++ b/tencentcloud/services/cvm/data_source_tc_instances_set.go
@@ -8,6 +8,7 @@ import (
cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
+ "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
)
func DataSourceTencentCloudInstancesSet() *schema.Resource {
@@ -247,11 +248,75 @@ func dataSourceTencentCloudInstancesSetRead(d *schema.ResourceData, meta interfa
service := CvmService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
paramMap := make(map[string]interface{})
+ var filtersList []*cvm.Filter
+ filtersMap := map[string]*cvm.Filter{}
+ filter := cvm.Filter{}
+ name := "instance-id"
+ filter.Name = &name
+ if v, ok := d.GetOk("instance_id"); ok {
+ filter.Values = []*string{helper.String(v.(string))}
+ }
+ filtersMap["Temp0"] = &filter
+ if v, ok := filtersMap["Temp0"]; ok && len(v.Values) > 0 {
+ filtersList = append(filtersList, v)
+ }
+ filter2 := cvm.Filter{}
+ name2 := "instance-name"
+ filter2.Name = &name2
+ if v, ok := d.GetOk("instance_name"); ok {
+ filter2.Values = []*string{helper.String(v.(string))}
+ }
+ filtersMap["Temp1"] = &filter2
+ if v, ok := filtersMap["Temp1"]; ok && len(v.Values) > 0 {
+ filtersList = append(filtersList, v)
+ }
+ filter3 := cvm.Filter{}
+ name3 := "zone"
+ filter3.Name = &name3
+ if v, ok := d.GetOk("availability_zone"); ok {
+ filter3.Values = []*string{helper.String(v.(string))}
+ }
+ filtersMap["Temp2"] = &filter3
+ if v, ok := filtersMap["Temp2"]; ok && len(v.Values) > 0 {
+ filtersList = append(filtersList, v)
+ }
+ filter4 := cvm.Filter{}
+ name4 := "project-id"
+ filter4.Name = &name4
+ if v, ok := d.GetOk("project_id"); ok {
+ filter4.Values = []*string{helper.String(v.(string))}
+ }
+ filtersMap["Temp3"] = &filter4
+ if v, ok := filtersMap["Temp3"]; ok && len(v.Values) > 0 {
+ filtersList = append(filtersList, v)
+ }
+ filter5 := cvm.Filter{}
+ name5 := "vpc-id"
+ filter5.Name = &name5
+ if v, ok := d.GetOk("vpc_id"); ok {
+ filter5.Values = []*string{helper.String(v.(string))}
+ }
+ filtersMap["Temp4"] = &filter5
+ if v, ok := filtersMap["Temp4"]; ok && len(v.Values) > 0 {
+ filtersList = append(filtersList, v)
+ }
+ filter6 := cvm.Filter{}
+ name6 := "subnet-id"
+ filter6.Name = &name6
+ if v, ok := d.GetOk("subnet_id"); ok {
+ filter6.Values = []*string{helper.String(v.(string))}
+ }
+ filtersMap["Temp5"] = &filter6
+ if v, ok := filtersMap["Temp5"]; ok && len(v.Values) > 0 {
+ filtersList = append(filtersList, v)
+ }
+ paramMap["Filters"] = filtersList
+
if err := dataSourceTencentCloudInstancesSetReadPostFillRequest0(ctx, paramMap); err != nil {
return err
}
- var respData *cvm.DescribeInstancesResponseParams
+ var respData []*cvm.Instance
err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
result, e := service.DescribeInstancesSetByFilter(ctx, paramMap)
if e != nil {
@@ -264,7 +329,7 @@ func dataSourceTencentCloudInstancesSetRead(d *schema.ResourceData, meta interfa
return err
}
- if err := dataSourceTencentCloudInstancesSetReadPostHandleResponse0(ctx, paramMap, respData); err != nil {
+ if err := dataSourceTencentCloudInstancesSetReadPostHandleResponse0(ctx, paramMap, &respData); err != nil {
return err
}
diff --git a/tencentcloud/services/cvm/data_source_tc_instances_set_extension.go b/tencentcloud/services/cvm/data_source_tc_instances_set_extension.go
index 3e8d57cb01..f2c9ede62b 100644
--- a/tencentcloud/services/cvm/data_source_tc_instances_set_extension.go
+++ b/tencentcloud/services/cvm/data_source_tc_instances_set_extension.go
@@ -2,8 +2,6 @@ package cvm
import (
"context"
- "fmt"
- "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
"log"
@@ -13,25 +11,6 @@ import (
func dataSourceTencentCloudInstancesSetReadPostFillRequest0(ctx context.Context, req map[string]interface{}) error {
d := tccommon.ResourceDataFromContext(ctx)
- if v, ok := d.GetOk("instance_id"); ok {
- req["instance-id"] = v.(string)
- }
- if v, ok := d.GetOk("instance_name"); ok {
- req["instance-name"] = v.(string)
- }
- if v, ok := d.GetOk("availability_zone"); ok {
- req["zone"] = v.(string)
- }
- if v, ok := d.GetOkExists("project_id"); ok {
- req["project-id"] = fmt.Sprintf("%d", v.(int))
- }
- if v, ok := d.GetOk("vpc_id"); ok {
- req["vpc-id"] = v.(string)
- }
- if v, ok := d.GetOk("subnet_id"); ok {
- req["subnet-id"] = v.(string)
- }
-
if v, ok := d.GetOk("tags"); ok {
for key, value := range v.(map[string]interface{}) {
req["tag:"+key] = value.(string)
@@ -41,10 +20,10 @@ func dataSourceTencentCloudInstancesSetReadPostFillRequest0(ctx context.Context,
return nil
}
-func dataSourceTencentCloudInstancesSetReadPostHandleResponse0(ctx context.Context, req map[string]interface{}, resp *cvm.DescribeInstancesResponseParams) error {
+func dataSourceTencentCloudInstancesSetReadPostHandleResponse0(ctx context.Context, req map[string]interface{}, resp *[]*cvm.Instance) error {
logId := tccommon.GetLogId(tccommon.ContextNil)
d := tccommon.ResourceDataFromContext(ctx)
- instances := resp.InstanceSet
+ instances := *resp
instanceList := make([]map[string]interface{}, 0, len(instances))
ids := make([]string, 0, len(instances))
for _, instance := range instances {
@@ -106,6 +85,6 @@ func dataSourceTencentCloudInstancesSetReadPostHandleResponse0(ctx context.Conte
}
func dataSourceTencentCloudInstancesSetReadOutputContent(ctx context.Context) interface{} {
- instanceList := ctx.Value("eipList").(*schema.Set).List()
+ instanceList := ctx.Value("instanceList")
return instanceList
}
diff --git a/tencentcloud/services/cvm/data_source_tc_key_pairs.go b/tencentcloud/services/cvm/data_source_tc_key_pairs.go
index ea78fc304a..e541d2a6d6 100644
--- a/tencentcloud/services/cvm/data_source_tc_key_pairs.go
+++ b/tencentcloud/services/cvm/data_source_tc_key_pairs.go
@@ -89,7 +89,7 @@ func dataSourceTencentCloudKeyPairsRead(d *schema.ResourceData, meta interface{}
service := CvmService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
paramMap := make(map[string]interface{})
- var respData *cvm.DescribeKeyPairsResponseParams
+ var respData []*cvm.KeyPair
err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
result, e := service.DescribeKeyPairsByFilter(ctx, paramMap)
if e != nil {
@@ -102,7 +102,7 @@ func dataSourceTencentCloudKeyPairsRead(d *schema.ResourceData, meta interface{}
return err
}
- if err := dataSourceTencentCloudKeyPairsReadPostHandleResponse0(ctx, paramMap, respData); err != nil {
+ if err := dataSourceTencentCloudKeyPairsReadPostHandleResponse0(ctx, paramMap, &respData); err != nil {
return err
}
diff --git a/tencentcloud/services/cvm/data_source_tc_key_pairs_extension.go b/tencentcloud/services/cvm/data_source_tc_key_pairs_extension.go
index fd2c53a9d9..63413a9aa1 100644
--- a/tencentcloud/services/cvm/data_source_tc_key_pairs_extension.go
+++ b/tencentcloud/services/cvm/data_source_tc_key_pairs_extension.go
@@ -3,7 +3,6 @@ package cvm
import (
"context"
"fmt"
- "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
"log"
@@ -13,14 +12,14 @@ import (
cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
)
-func dataSourceTencentCloudKeyPairsReadPostHandleResponse0(ctx context.Context, req map[string]interface{}, resp *cvm.DescribeKeyPairsResponseParams) error {
+func dataSourceTencentCloudKeyPairsReadPostHandleResponse0(ctx context.Context, req map[string]interface{}, resp *[]*cvm.KeyPair) error {
d := tccommon.ResourceDataFromContext(ctx)
logId := tccommon.GetLogId(tccommon.ContextNil)
var err error
- keyPairs := resp.KeyPairSet
+ keyPairs := *resp
keyPairList := make([]map[string]interface{}, 0, len(keyPairs))
ids := make([]string, 0, len(keyPairs))
- keyName := ctx.Value("key_name").(string)
+ keyName := d.Get("key_name").(string)
namePattern, _ := regexp.Compile(keyName)
for _, keyPair := range keyPairs {
if match := namePattern.MatchString(*keyPair.KeyName); !match {
@@ -54,7 +53,7 @@ func dataSourceTencentCloudKeyPairsReadPostHandleResponse0(ctx context.Context,
}
func dataSourceTencentCloudKeyPairsReadOutputContent(ctx context.Context) interface{} {
- eipList := ctx.Value("keyPairList").(*schema.Set).List()
+ eipList := ctx.Value("keyPairList")
return eipList
}
@@ -87,6 +86,7 @@ func dataSourceTencentCloudKeyPairsReadPreRequest0(ctx context.Context, req *cvm
if keyId != "" {
req.KeyIds = []*string{&keyId}
}
+
req.Filters = make([]*cvm.Filter, 0)
if name != "" {
filter := &cvm.Filter{
@@ -95,6 +95,7 @@ func dataSourceTencentCloudKeyPairsReadPreRequest0(ctx context.Context, req *cvm
}
req.Filters = append(req.Filters, filter)
}
+
if projectId != nil {
filter := &cvm.Filter{
Name: helper.String("project-id"),
@@ -103,6 +104,5 @@ func dataSourceTencentCloudKeyPairsReadPreRequest0(ctx context.Context, req *cvm
req.Filters = append(req.Filters, filter)
}
- context.WithValue(ctx, "keyName", keyName)
return nil
}
diff --git a/tencentcloud/services/cvm/data_source_tc_placement_groups.go b/tencentcloud/services/cvm/data_source_tc_placement_groups.go
index 28b475446b..b798881eba 100644
--- a/tencentcloud/services/cvm/data_source_tc_placement_groups.go
+++ b/tencentcloud/services/cvm/data_source_tc_placement_groups.go
@@ -102,7 +102,7 @@ func dataSourceTencentCloudPlacementGroupsRead(d *schema.ResourceData, meta inte
paramMap["Name"] = helper.String(v.(string))
}
- var respData *cvm.DescribeDisasterRecoverGroupsResponseParams
+ var respData []*cvm.DisasterRecoverGroup
err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
result, e := service.DescribePlacementGroupsByFilter(ctx, paramMap)
if e != nil {
@@ -115,7 +115,7 @@ func dataSourceTencentCloudPlacementGroupsRead(d *schema.ResourceData, meta inte
return err
}
- if err := dataSourceTencentCloudPlacementGroupsReadPostHandleResponse0(ctx, paramMap, respData); err != nil {
+ if err := dataSourceTencentCloudPlacementGroupsReadPostHandleResponse0(ctx, paramMap, &respData); err != nil {
return err
}
diff --git a/tencentcloud/services/cvm/data_source_tc_placement_groups_extension.go b/tencentcloud/services/cvm/data_source_tc_placement_groups_extension.go
index 5753ef24ed..89d1faf5b6 100644
--- a/tencentcloud/services/cvm/data_source_tc_placement_groups_extension.go
+++ b/tencentcloud/services/cvm/data_source_tc_placement_groups_extension.go
@@ -2,7 +2,6 @@ package cvm
import (
"context"
- "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
"log"
@@ -10,10 +9,10 @@ import (
cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
)
-func dataSourceTencentCloudPlacementGroupsReadPostHandleResponse0(ctx context.Context, req map[string]interface{}, resp *cvm.DescribeDisasterRecoverGroupsResponseParams) error {
+func dataSourceTencentCloudPlacementGroupsReadPostHandleResponse0(ctx context.Context, req map[string]interface{}, resp *[]*cvm.DisasterRecoverGroup) error {
d := tccommon.ResourceDataFromContext(ctx)
logId := tccommon.GetLogId(tccommon.ContextNil)
- placementGroups := resp.DisasterRecoverGroupSet
+ placementGroups := *resp
var err error
placementGroupList := make([]map[string]interface{}, 0, len(placementGroups))
ids := make([]string, 0, len(placementGroups))
@@ -43,6 +42,6 @@ func dataSourceTencentCloudPlacementGroupsReadPostHandleResponse0(ctx context.Co
}
func dataSourceTencentCloudPlacementGroupsReadOutputContent(ctx context.Context) interface{} {
- eipList := ctx.Value("placementGroupList").(*schema.Set).List()
+ eipList := ctx.Value("placementGroupList")
return eipList
}
diff --git a/tencentcloud/services/cvm/resource_tc_eip.go b/tencentcloud/services/cvm/resource_tc_eip.go
index 73972ee2c0..fb32d1c9c2 100644
--- a/tencentcloud/services/cvm/resource_tc_eip.go
+++ b/tencentcloud/services/cvm/resource_tc_eip.go
@@ -163,20 +163,6 @@ func resourceTencentCloudEipCreate(d *schema.ResourceData, meta interface{}) err
request.AnycastZone = helper.String(v.(string))
}
- if v, ok := d.GetOk("tags"); ok {
- for _, item := range v.([]interface{}) {
- tagsMap := item.(map[string]interface{})
- tag := vpc.Tag{}
- if v, ok := tagsMap["key"]; ok {
- tag.Key = helper.String(v.(string))
- }
- if v, ok := tagsMap["value"]; ok {
- tag.Value = helper.String(v.(string))
- }
- request.Tags = append(request.Tags, &tag)
- }
- }
-
if v, ok := d.GetOk("bandwidth_package_id"); ok {
request.BandwidthPackageId = helper.String(v.(string))
}
@@ -249,11 +235,6 @@ func resourceTencentCloudEipRead(d *schema.ResourceData, meta interface{}) error
log.Printf("[WARN]%s resource `eip` [%s] not found, please check if it has been deleted.\n", logId, d.Id())
return nil
}
- if respData.AddressId != nil {
- _ = d.Set("address_id", respData.AddressId)
- eipId = *respData.AddressId
- }
-
if respData.AddressName != nil {
_ = d.Set("name", respData.AddressName)
}
@@ -270,10 +251,6 @@ func resourceTencentCloudEipRead(d *schema.ResourceData, meta interface{}) error
_ = d.Set("type", respData.AddressType)
}
- if respData.InternetServiceProvider != nil {
- _ = d.Set("internet_service_provider", respData.InternetServiceProvider)
- }
-
if respData.Bandwidth != nil {
_ = d.Set("internet_max_bandwidth_out", respData.Bandwidth)
}
@@ -424,7 +401,6 @@ func resourceTencentCloudEipUpdate(d *schema.ResourceData, meta interface{}) err
}
}
- _ = eipId
return resourceTencentCloudEipRead(d, meta)
}
@@ -468,6 +444,5 @@ func resourceTencentCloudEipDelete(d *schema.ResourceData, meta interface{}) err
return err
}
- _ = eipId
return nil
}
diff --git a/tencentcloud/services/cvm/resource_tc_eip_extension.go b/tencentcloud/services/cvm/resource_tc_eip_extension.go
index 4ee52c453f..632403a47d 100644
--- a/tencentcloud/services/cvm/resource_tc_eip_extension.go
+++ b/tencentcloud/services/cvm/resource_tc_eip_extension.go
@@ -14,7 +14,21 @@ import (
func resourceTencentCloudEipCreatePostFillRequest0(ctx context.Context, req *vpc.AllocateAddressesRequest) error {
d := tccommon.ResourceDataFromContext(ctx)
- internetChargeType := *req.InternetChargeType
+ if v := helper.GetTags(d, "tags"); len(v) > 0 {
+ for tagKey, tagValue := range v {
+ tag := vpc.Tag{
+ Key: helper.String(tagKey),
+ Value: helper.String(tagValue),
+ }
+ req.Tags = append(req.Tags, &tag)
+ }
+ }
+
+ var internetChargeType string
+ if v, ok := d.GetOk("internet_charge_type"); ok {
+ internetChargeType = v.(string)
+ }
+
if internetChargeType == "BANDWIDTH_PREPAID_BY_MONTH" {
addressChargePrepaid := vpc.AddressChargePrepaid{}
period := d.Get("prepaid_period")
@@ -35,7 +49,7 @@ func resourceTencentCloudEipCreatePostHandleResponse0(ctx context.Context, resp
vpcService := svcvpc.NewVpcService(client)
tagService := svctag.NewTagService(client)
region := client.Region
- eipId := d.Id()
+ eipId := *resp.Response.AddressSet[0]
if tags := helper.GetTags(d, "tags"); len(tags) > 0 {
resourceName := tccommon.BuildTagResourceName(svcvpc.VPC_SERVICE_TYPE, svcvpc.EIP_RESOURCE_TYPE, region, eipId)
if err := tagService.ModifyTags(ctx, resourceName, tags, nil); err != nil {
diff --git a/tencentcloud/services/cvm/service_tencentcloud_cvm.go b/tencentcloud/services/cvm/service_tencentcloud_cvm.go
index c6c9cb0bdd..88e3ea2581 100644
--- a/tencentcloud/services/cvm/service_tencentcloud_cvm.go
+++ b/tencentcloud/services/cvm/service_tencentcloud_cvm.go
@@ -1854,7 +1854,7 @@ func (me *VpcService) DescribeEipsByFilter(ctx context.Context, param map[string
return
}
-func (me *CvmService) DescribeImageByFilter(ctx context.Context, param map[string]interface{}) (ret *cvm.DescribeImagesResponseParams, errRet error) {
+func (me *CvmService) DescribeImageByFilter(ctx context.Context, param map[string]interface{}) (ret []*cvm.Image, errRet error) {
var (
logId = tccommon.GetLogId(ctx)
request = cvm.NewDescribeImagesRequest()
@@ -1874,22 +1874,35 @@ func (me *CvmService) DescribeImageByFilter(ctx context.Context, param map[strin
ratelimit.Check(request.GetAction())
- response, err := me.client.UseCvmClient().DescribeImages(request)
- if err != nil {
- errRet = err
- return
- }
- log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
+ var (
+ offset uint64 = 0
+ limit uint64 = 100
+ )
+ for {
+ request.Offset = &offset
+ request.Limit = &limit
+ response, err := me.client.UseCvmClient().DescribeImages(request)
+ if err != nil {
+ errRet = err
+ return
+ }
+ log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
- if response == nil || response.Response == nil {
- return
+ if response == nil || len(response.Response.ImageSet) < 1 {
+ break
+ }
+ ret = append(ret, response.Response.ImageSet...)
+ if len(response.Response.ImageSet) < int(limit) {
+ break
+ }
+
+ offset += limit
}
- ret = response.Response
return
}
-func (me *CvmService) DescribeImagesByFilter(ctx context.Context, param map[string]interface{}) (ret *cvm.DescribeImagesResponseParams, errRet error) {
+func (me *CvmService) DescribeImagesByFilter(ctx context.Context, param map[string]interface{}) (ret []*cvm.Image, errRet error) {
var (
logId = tccommon.GetLogId(ctx)
request = cvm.NewDescribeImagesRequest()
@@ -1909,22 +1922,39 @@ func (me *CvmService) DescribeImagesByFilter(ctx context.Context, param map[stri
ratelimit.Check(request.GetAction())
- response, err := me.client.UseCvmClient().DescribeImages(request)
- if err != nil {
- errRet = err
- return
- }
- log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
+ var (
+ offset uint64 = 0
+ limit uint64 = 100
+ )
+ for {
+ request.Offset = &offset
+ request.Limit = &limit
+ if err := dataSourceTencentCloudImagesReadPreRequest0(ctx, request); err != nil {
+ return nil, err
+ }
- if response == nil || response.Response == nil {
- return
+ response, err := me.client.UseCvmClient().DescribeImages(request)
+ if err != nil {
+ errRet = err
+ return
+ }
+ log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
+
+ if response == nil || len(response.Response.ImageSet) < 1 {
+ break
+ }
+ ret = append(ret, response.Response.ImageSet...)
+ if len(response.Response.ImageSet) < int(limit) {
+ break
+ }
+
+ offset += limit
}
- ret = response.Response
return
}
-func (me *CvmService) DescribeInstancesSetByFilter(ctx context.Context, param map[string]interface{}) (ret *cvm.DescribeInstancesResponseParams, errRet error) {
+func (me *CvmService) DescribeInstancesSetByFilter(ctx context.Context, param map[string]interface{}) (ret []*cvm.Instance, errRet error) {
var (
logId = tccommon.GetLogId(ctx)
request = cvm.NewDescribeInstancesRequest()
@@ -1936,24 +1966,43 @@ func (me *CvmService) DescribeInstancesSetByFilter(ctx context.Context, param ma
}
}()
+ for k, v := range param {
+ if k == "Filters" {
+ request.Filters = v.([]*cvm.Filter)
+ }
+ }
+
ratelimit.Check(request.GetAction())
- response, err := me.client.UseCvmClient().DescribeInstances(request)
- if err != nil {
- errRet = err
- return
- }
- log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
+ var (
+ offset int64 = 0
+ limit int64 = 100
+ )
+ for {
+ request.Offset = &offset
+ request.Limit = &limit
+ response, err := me.client.UseCvmClient().DescribeInstances(request)
+ if err != nil {
+ errRet = err
+ return
+ }
+ log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
- if response == nil || response.Response == nil {
- return
+ if response == nil || len(response.Response.InstanceSet) < 1 {
+ break
+ }
+ ret = append(ret, response.Response.InstanceSet...)
+ if len(response.Response.InstanceSet) < int(limit) {
+ break
+ }
+
+ offset += limit
}
- ret = response.Response
return
}
-func (me *CvmService) DescribeKeyPairsByFilter(ctx context.Context, param map[string]interface{}) (ret *cvm.DescribeKeyPairsResponseParams, errRet error) {
+func (me *CvmService) DescribeKeyPairsByFilter(ctx context.Context, param map[string]interface{}) (ret []*cvm.KeyPair, errRet error) {
var (
logId = tccommon.GetLogId(ctx)
request = cvm.NewDescribeKeyPairsRequest()
@@ -1967,26 +2016,39 @@ func (me *CvmService) DescribeKeyPairsByFilter(ctx context.Context, param map[st
ratelimit.Check(request.GetAction())
- if err := dataSourceTencentCloudKeyPairsReadPreRequest0(ctx, request); err != nil {
- return nil, err
- }
+ var (
+ offset int64 = 0
+ limit int64 = 100
+ )
+ for {
+ request.Offset = &offset
+ request.Limit = &limit
+ if err := dataSourceTencentCloudKeyPairsReadPreRequest0(ctx, request); err != nil {
+ return nil, err
+ }
- response, err := me.client.UseCvmClient().DescribeKeyPairs(request)
- if err != nil {
- errRet = err
- return
- }
- log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
+ response, err := me.client.UseCvmClient().DescribeKeyPairs(request)
+ if err != nil {
+ errRet = err
+ return
+ }
+ log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
- if response == nil || response.Response == nil {
- return
+ if response == nil || len(response.Response.KeyPairSet) < 1 {
+ break
+ }
+ ret = append(ret, response.Response.KeyPairSet...)
+ if len(response.Response.KeyPairSet) < int(limit) {
+ break
+ }
+
+ offset += limit
}
- ret = response.Response
return
}
-func (me *CvmService) DescribePlacementGroupsByFilter(ctx context.Context, param map[string]interface{}) (ret *cvm.DescribeDisasterRecoverGroupsResponseParams, errRet error) {
+func (me *CvmService) DescribePlacementGroupsByFilter(ctx context.Context, param map[string]interface{}) (ret []*cvm.DisasterRecoverGroup, errRet error) {
var (
logId = tccommon.GetLogId(ctx)
request = cvm.NewDescribeDisasterRecoverGroupsRequest()
@@ -2009,17 +2071,82 @@ func (me *CvmService) DescribePlacementGroupsByFilter(ctx context.Context, param
ratelimit.Check(request.GetAction())
- response, err := me.client.UseCvmClient().DescribeDisasterRecoverGroups(request)
- if err != nil {
- errRet = err
- return
+ var (
+ offset int64 = 0
+ limit int64 = 100
+ )
+ for {
+ request.Offset = &offset
+ request.Limit = &limit
+ response, err := me.client.UseCvmClient().DescribeDisasterRecoverGroups(request)
+ if err != nil {
+ errRet = err
+ return
+ }
+ log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
+
+ if response == nil || len(response.Response.DisasterRecoverGroupSet) < 1 {
+ break
+ }
+ ret = append(ret, response.Response.DisasterRecoverGroupSet...)
+ if len(response.Response.DisasterRecoverGroupSet) < int(limit) {
+ break
+ }
+
+ offset += limit
}
- log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
- if response == nil || response.Response == nil {
- return
+ return
+}
+
+func (me *CvmService) DescribeInstancesByFilter(ctx context.Context, param map[string]interface{}) (ret []*cvm.Instance, errRet error) {
+ var (
+ logId = tccommon.GetLogId(ctx)
+ request = cvm.NewDescribeInstancesRequest()
+ )
+
+ defer func() {
+ if errRet != nil {
+ log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, request.GetAction(), request.ToJsonString(), errRet.Error())
+ }
+ }()
+
+ for k, v := range param {
+ if k == "Filters" {
+ request.Filters = v.([]*cvm.Filter)
+ }
+ }
+
+ ratelimit.Check(request.GetAction())
+
+ var (
+ offset int64 = 0
+ limit int64 = 100
+ )
+ for {
+ request.Offset = &offset
+ request.Limit = &limit
+ if err := dataSourceTencentCloudInstancesReadPreRequest0(ctx, request); err != nil {
+ return nil, err
+ }
+
+ response, err := me.client.UseCvmClient().DescribeInstances(request)
+ if err != nil {
+ errRet = err
+ return
+ }
+ log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
+
+ if response == nil || len(response.Response.InstanceSet) < 1 {
+ break
+ }
+ ret = append(ret, response.Response.InstanceSet...)
+ if len(response.Response.InstanceSet) < int(limit) {
+ break
+ }
+
+ offset += limit
}
- ret = response.Response
return
}
From fd00d50bf0fbe93d2d8070de8421c217e2f25733 Mon Sep 17 00:00:00 2001
From: SevenEarth <391613297@qq.com>
Date: Tue, 4 Jun 2024 18:10:07 +0800
Subject: [PATCH 5/8] add
---
tencentcloud/services/cvm/data_source_tc_images_test.txt | 1 -
1 file changed, 1 deletion(-)
delete mode 100644 tencentcloud/services/cvm/data_source_tc_images_test.txt
diff --git a/tencentcloud/services/cvm/data_source_tc_images_test.txt b/tencentcloud/services/cvm/data_source_tc_images_test.txt
deleted file mode 100644
index ec747fa47d..0000000000
--- a/tencentcloud/services/cvm/data_source_tc_images_test.txt
+++ /dev/null
@@ -1 +0,0 @@
-null
\ No newline at end of file
From 5259ba904f350887900982e025c0d62e6d71e6b4 Mon Sep 17 00:00:00 2001
From: SevenEarth <391613297@qq.com>
Date: Wed, 5 Jun 2024 15:50:48 +0800
Subject: [PATCH 6/8] add
---
.../cvm/resource_tc_cvm_renew_instance.go | 4 +-
...source_tc_cvm_security_group_attachment.go | 67 ++--
...cvm_security_group_attachment_extension.go | 13 +-
.../cvm/resource_tc_cvm_sync_image.go | 1 -
.../cvm/resource_tc_eip_address_transform.go | 40 +--
...urce_tc_eip_address_transform_extension.go | 25 ++
.../cvm/resource_tc_eip_association.go | 298 +++---------------
.../resource_tc_eip_association_extension.go | 201 ++++++++++++
.../resource_tc_eip_normal_address_return.go | 41 ++-
..._tc_eip_normal_address_return_extension.go | 46 +++
.../services/cvm/service_tencentcloud_cvm.go | 58 ++++
11 files changed, 474 insertions(+), 320 deletions(-)
create mode 100644 tencentcloud/services/cvm/resource_tc_eip_address_transform_extension.go
create mode 100644 tencentcloud/services/cvm/resource_tc_eip_association_extension.go
create mode 100644 tencentcloud/services/cvm/resource_tc_eip_normal_address_return_extension.go
diff --git a/tencentcloud/services/cvm/resource_tc_cvm_renew_instance.go b/tencentcloud/services/cvm/resource_tc_cvm_renew_instance.go
index ac982d00d7..af5a98818b 100644
--- a/tencentcloud/services/cvm/resource_tc_cvm_renew_instance.go
+++ b/tencentcloud/services/cvm/resource_tc_cvm_renew_instance.go
@@ -41,7 +41,7 @@ func ResourceTencentCloudCvmRenewInstance() *schema.Resource {
"renew_flag": {
Type: schema.TypeString,
Optional: true,
- Description: "Auto renewal flag. Valid values:
NOTIFY_AND_AUTO_RENEW: notify upon expiration and renew automatically
NOTIFY_AND_MANUAL_RENEW: notify upon expiration but do not renew automatically
DISABLE_NOTIFY_AND_MANUAL_RENEW: neither notify upon expiration nor renew automatically
Default value: NOTIFY_AND_MANUAL_RENEW. If this parameter is specified as NOTIFY_AND_AUTO_RENEW, the instance will be automatically renewed on a monthly basis if the account balance is sufficient. Note: This field may return null, indicating that no valid value is found.",
+ Description: "Auto renewal flag. Valid values:
NOTIFY_AND_AUTO_RENEW:notify upon expiration and renew automatically
NOTIFY_AND_MANUAL_RENEW:notify upon expiration but do not renew automatically
DISABLE_NOTIFY_AND_MANUAL_RENEW:neither notify upon expiration nor renew automatically
Default value: NOTIFY_AND_MANUAL_RENEW。If this parameter is specified as NOTIFY_AND_AUTO_RENEW, the instance will be automatically renewed on a monthly basis if the account balance is sufficient. Note: This field may return null, indicating that no valid value is found.",
},
},
},
@@ -51,7 +51,7 @@ func ResourceTencentCloudCvmRenewInstance() *schema.Resource {
Type: schema.TypeBool,
Optional: true,
ForceNew: true,
- Description: "Whether to renew the elastic data disk. Valid values:
TRUE: Indicates to renew the subscription instance and renew the attached elastic data disk at the same time
FALSE: Indicates that the subscription instance will be renewed and the elastic data disk attached to it will not be renewed
Default value: TRUE.",
+ Description: "Whether to renew the elastic data disk. Valid values:
TRUE:Indicates to renew the subscription instance and renew the attached elastic data disk at the same time
FALSE:Indicates that the subscription instance will be renewed and the elastic data disk attached to it will not be renewed
Default value:TRUE.",
},
},
}
diff --git a/tencentcloud/services/cvm/resource_tc_cvm_security_group_attachment.go b/tencentcloud/services/cvm/resource_tc_cvm_security_group_attachment.go
index 93209e0473..e15871d3f4 100644
--- a/tencentcloud/services/cvm/resource_tc_cvm_security_group_attachment.go
+++ b/tencentcloud/services/cvm/resource_tc_cvm_security_group_attachment.go
@@ -94,38 +94,38 @@ func resourceTencentCloudCvmSecurityGroupAttachmentRead(d *schema.ResourceData,
defer tccommon.LogElapsed("resource.tencentcloud_cvm_security_group_attachment.read")()
defer tccommon.InconsistentCheck(d, meta)()
- //logId := tccommon.GetLogId(tccommon.ContextNil)
- //
- //ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
- //
- //service := CvmService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
- //
- //idSplit := strings.Split(d.Id(), tccommon.FILED_SP)
- //if len(idSplit) != 2 {
- // return fmt.Errorf("id is broken,%s", d.Id())
- //}
- //instanceId := idSplit[0]
- //securityGroupId := idSplit[1]
- //
- //_ = d.Set("instance_id", instanceId)
- //
- //_ = d.Set("security_group_id", securityGroupId)
-
- //respData, err := service.DescribeCvmSecurityGroupAttachmentById(ctx, instanceId)
- //if err != nil {
- // return err
- //}
- //
- //if respData == nil {
- // d.SetId("")
- // log.Printf("[WARN]%s resource `cvm_security_group_attachment` [%s] not found, please check if it has been deleted.\n", logId, d.Id())
- // return nil
- //}
- //if err := resourceTencentCloudCvmSecurityGroupAttachmentReadPostHandleResponse0(ctx, respData); err != nil {
- // return err
- //}
- //
- //_ = securityGroupId
+ logId := tccommon.GetLogId(tccommon.ContextNil)
+
+ ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
+
+ service := CvmService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
+
+ idSplit := strings.Split(d.Id(), tccommon.FILED_SP)
+ if len(idSplit) != 2 {
+ return fmt.Errorf("id is broken,%s", d.Id())
+ }
+ instanceId := idSplit[0]
+ securityGroupId := idSplit[1]
+
+ _ = d.Set("instance_id", instanceId)
+
+ _ = d.Set("security_group_id", securityGroupId)
+
+ respData, err := service.DescribeCvmSecurityGroupAttachmentById(ctx, instanceId)
+ if err != nil {
+ return err
+ }
+
+ if respData == nil {
+ d.SetId("")
+ log.Printf("[WARN]%s resource `cvm_security_group_attachment` [%s] not found, please check if it has been deleted.\n", logId, d.Id())
+ return nil
+ }
+ if err := resourceTencentCloudCvmSecurityGroupAttachmentReadPostHandleResponse0(ctx, respData); err != nil {
+ return err
+ }
+
+ _ = securityGroupId
return nil
}
@@ -163,10 +163,11 @@ func resourceTencentCloudCvmSecurityGroupAttachmentDelete(d *schema.ResourceData
return nil
})
if err != nil {
- log.Printf("[CRITAL]%s create cvm security group attachment failed, reason:%+v", logId, err)
+ log.Printf("[CRITAL]%s delete cvm security group attachment failed, reason:%+v", logId, err)
return err
}
_ = response
+ _ = securityGroupId
return nil
}
diff --git a/tencentcloud/services/cvm/resource_tc_cvm_security_group_attachment_extension.go b/tencentcloud/services/cvm/resource_tc_cvm_security_group_attachment_extension.go
index a2716f21c0..cb68f0c651 100644
--- a/tencentcloud/services/cvm/resource_tc_cvm_security_group_attachment_extension.go
+++ b/tencentcloud/services/cvm/resource_tc_cvm_security_group_attachment_extension.go
@@ -5,11 +5,19 @@ import (
"fmt"
cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
+ "log"
"strings"
)
-func resourceTencentCloudCvmSecurityGroupAttachmentReadPostHandleResponse0(ctx context.Context, resp *cvm.Instance) error {
+func resourceTencentCloudCvmSecurityGroupAttachmentReadPostHandleResponse0(ctx context.Context, resp *cvm.DescribeInstancesResponseParams) error {
d := tccommon.ResourceDataFromContext(ctx)
+ logId := tccommon.GetLogId(tccommon.ContextNil)
+ if len(resp.InstanceSet) < 1 {
+ d.SetId("")
+ log.Printf("[WARN]%s resource `CvmSecurityGroupAttachment` [%s] not found, please check if it has been deleted.\n", logId, d.Id())
+ return nil
+ }
+
idSplit := strings.Split(d.Id(), tccommon.FILED_SP)
if len(idSplit) != 2 {
return fmt.Errorf("id is broken,%s", d.Id())
@@ -17,7 +25,8 @@ func resourceTencentCloudCvmSecurityGroupAttachmentReadPostHandleResponse0(ctx c
instanceId := idSplit[0]
securityGroupId := idSplit[1]
- for _, sgId := range resp.SecurityGroupIds {
+ instanceInfo := resp.InstanceSet[0]
+ for _, sgId := range instanceInfo.SecurityGroupIds {
if *sgId == securityGroupId {
_ = d.Set("instance_id", instanceId)
_ = d.Set("security_group_id", securityGroupId)
diff --git a/tencentcloud/services/cvm/resource_tc_cvm_sync_image.go b/tencentcloud/services/cvm/resource_tc_cvm_sync_image.go
index 555f5021f3..0947e7fed2 100644
--- a/tencentcloud/services/cvm/resource_tc_cvm_sync_image.go
+++ b/tencentcloud/services/cvm/resource_tc_cvm_sync_image.go
@@ -17,7 +17,6 @@ func ResourceTencentCloudCvmSyncImage() *schema.Resource {
Create: resourceTencentCloudCvmSyncImageCreate,
Read: resourceTencentCloudCvmSyncImageRead,
Delete: resourceTencentCloudCvmSyncImageDelete,
-
Schema: map[string]*schema.Schema{
"destination_regions": {
Type: schema.TypeSet,
diff --git a/tencentcloud/services/cvm/resource_tc_eip_address_transform.go b/tencentcloud/services/cvm/resource_tc_eip_address_transform.go
index a8f93a98d9..441febeb8f 100644
--- a/tencentcloud/services/cvm/resource_tc_eip_address_transform.go
+++ b/tencentcloud/services/cvm/resource_tc_eip_address_transform.go
@@ -1,16 +1,14 @@
package cvm
import (
+ "context"
"log"
- "time"
-
- tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
- svcvpc "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/vpc"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
- eip "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312"
+ vpc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312"
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
)
@@ -19,12 +17,11 @@ func ResourceTencentCloudEipAddressTransform() *schema.Resource {
Create: resourceTencentCloudEipAddressTransformCreate,
Read: resourceTencentCloudEipAddressTransformRead,
Delete: resourceTencentCloudEipAddressTransformDelete,
-
Schema: map[string]*schema.Schema{
"instance_id": {
+ Type: schema.TypeString,
Required: true,
ForceNew: true,
- Type: schema.TypeString,
Description: "the instance ID of a normal public network IP to be operated. eg:ins-23mk45jn.",
},
},
@@ -37,18 +34,26 @@ func resourceTencentCloudEipAddressTransformCreate(d *schema.ResourceData, meta
logId := tccommon.GetLogId(tccommon.ContextNil)
+ ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
+
var (
- request = eip.NewTransformAddressRequest()
- response = eip.NewTransformAddressResponse()
instanceId string
)
+ var (
+ request = vpc.NewTransformAddressRequest()
+ response = vpc.NewTransformAddressResponse()
+ )
+
if v, ok := d.GetOk("instance_id"); ok {
instanceId = v.(string)
+ }
+
+ if v, ok := d.GetOk("instance_id"); ok {
request.InstanceId = helper.String(v.(string))
}
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
- result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().TransformAddress(request)
+ result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().TransformAddressWithContext(ctx, request)
if e != nil {
return tccommon.RetryError(e)
} else {
@@ -58,21 +63,18 @@ func resourceTencentCloudEipAddressTransformCreate(d *schema.ResourceData, meta
return nil
})
if err != nil {
- log.Printf("[CRITAL]%s operate eip addressTransform failed, reason:%+v", logId, err)
+ log.Printf("[CRITAL]%s create eip address transform failed, reason:%+v", logId, err)
return err
}
- taskId := *response.Response.TaskId
- d.SetId(instanceId)
-
- service := svcvpc.NewVpcService(meta.(tccommon.ProviderMeta).GetAPIV3Conn())
+ _ = response
- conf := tccommon.BuildStateChangeConf([]string{}, []string{"SUCCESS"}, 1*tccommon.ReadRetryTimeout, time.Second, service.VpcIpv6AddressStateRefreshFunc(helper.UInt64ToStr(taskId), []string{}))
-
- if _, e := conf.WaitForState(); e != nil {
- return e
+ if err := resourceTencentCloudEipAddressTransformCreatePostHandleResponse0(ctx, response); err != nil {
+ return err
}
+ d.SetId(instanceId)
+
return resourceTencentCloudEipAddressTransformRead(d, meta)
}
diff --git a/tencentcloud/services/cvm/resource_tc_eip_address_transform_extension.go b/tencentcloud/services/cvm/resource_tc_eip_address_transform_extension.go
new file mode 100644
index 0000000000..5b104d63bf
--- /dev/null
+++ b/tencentcloud/services/cvm/resource_tc_eip_address_transform_extension.go
@@ -0,0 +1,25 @@
+package cvm
+
+import (
+ "context"
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
+ "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
+ svcvpc "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/vpc"
+ "time"
+
+ vpc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312"
+)
+
+func resourceTencentCloudEipAddressTransformCreatePostHandleResponse0(ctx context.Context, resp *vpc.TransformAddressResponse) error {
+ meta := tccommon.ProviderMetaFromContext(ctx)
+ service := svcvpc.NewVpcService(meta.(tccommon.ProviderMeta).GetAPIV3Conn())
+
+ taskId := *resp.Response.TaskId
+ conf := tccommon.BuildStateChangeConf([]string{}, []string{"SUCCESS"}, 1*tccommon.ReadRetryTimeout, time.Second, service.VpcIpv6AddressStateRefreshFunc(helper.UInt64ToStr(taskId), []string{}))
+
+ if _, e := conf.WaitForState(); e != nil {
+ return e
+ }
+
+ return nil
+}
diff --git a/tencentcloud/services/cvm/resource_tc_eip_association.go b/tencentcloud/services/cvm/resource_tc_eip_association.go
index 0cee54ffbf..bf36748dac 100644
--- a/tencentcloud/services/cvm/resource_tc_eip_association.go
+++ b/tencentcloud/services/cvm/resource_tc_eip_association.go
@@ -2,18 +2,10 @@ package cvm
import (
"context"
- "fmt"
"log"
- "strings"
- tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
- svcvpc "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/vpc"
-
- "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
- vpc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312"
-
- "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/ratelimit"
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
)
func ResourceTencentCloudEipAssociation() *schema.Resource {
@@ -26,45 +18,37 @@ func ResourceTencentCloudEipAssociation() *schema.Resource {
},
Schema: map[string]*schema.Schema{
"eip_id": {
- Type: schema.TypeString,
- Required: true,
- ForceNew: true,
- ValidateFunc: tccommon.ValidateStringLengthInRange(1, 25),
- Description: "The ID of EIP.",
+ Type: schema.TypeString,
+ Required: true,
+ ForceNew: true,
+ Description: "The ID of EIP.",
},
+
"instance_id": {
- Type: schema.TypeString,
- ForceNew: true,
- Optional: true,
- Computed: true,
- ConflictsWith: []string{
- "network_interface_id",
- "private_ip",
- },
- ValidateFunc: tccommon.ValidateStringLengthInRange(1, 25),
- Description: "The CVM or CLB instance id going to bind with the EIP. This field is conflict with `network_interface_id` and `private_ip fields`.",
+ Type: schema.TypeString,
+ Optional: true,
+ Computed: true,
+ ForceNew: true,
+ ConflictsWith: []string{"network_interface_id", "private_ip"},
+ Description: "The CVM or CLB instance id going to bind with the EIP. This field is conflict with `network_interface_id` and `private_ip fields`.",
},
+
"network_interface_id": {
- Type: schema.TypeString,
- ForceNew: true,
- Optional: true,
- Computed: true,
- ValidateFunc: tccommon.ValidateStringLengthInRange(1, 25),
- ConflictsWith: []string{
- "instance_id",
- },
- Description: "Indicates the network interface id like `eni-xxxxxx`. This field is conflict with `instance_id`.",
+ Type: schema.TypeString,
+ Optional: true,
+ Computed: true,
+ ForceNew: true,
+ ConflictsWith: []string{"instance_id"},
+ Description: "Indicates the network interface id like `eni-xxxxxx`. This field is conflict with `instance_id`.",
},
+
"private_ip": {
- Type: schema.TypeString,
- ForceNew: true,
- Optional: true,
- Computed: true,
- ValidateFunc: tccommon.ValidateStringLengthInRange(7, 25),
- ConflictsWith: []string{
- "instance_id",
- },
- Description: "Indicates an IP belongs to the `network_interface_id`. This field is conflict with `instance_id`.",
+ Type: schema.TypeString,
+ Optional: true,
+ Computed: true,
+ ForceNew: true,
+ ConflictsWith: []string{"instance_id"},
+ Description: "Indicates an IP belongs to the `network_interface_id`. This field is conflict with `instance_id`.",
},
},
}
@@ -72,243 +56,63 @@ func ResourceTencentCloudEipAssociation() *schema.Resource {
func resourceTencentCloudEipAssociationCreate(d *schema.ResourceData, meta interface{}) error {
defer tccommon.LogElapsed("resource.tencentcloud_eip_association.create")()
+ defer tccommon.InconsistentCheck(d, meta)()
- var (
- logId = tccommon.GetLogId(tccommon.ContextNil)
- ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
- vpcService = svcvpc.NewVpcService(meta.(tccommon.ProviderMeta).GetAPIV3Conn())
- eip *vpc.Address
- errRet error
- )
-
- eipId := d.Get("eip_id").(string)
- err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
- eip, errRet = vpcService.DescribeEipById(ctx, eipId)
- if errRet != nil {
- return tccommon.RetryError(errRet, tccommon.InternalError)
- }
+ logId := tccommon.GetLogId(tccommon.ContextNil)
- if eip == nil {
- return resource.NonRetryableError(fmt.Errorf("eip is not found"))
- }
+ ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
- return nil
- })
+ var (
+ eipId string
+ )
+ d.SetId(eipId)
- if err != nil {
+ if err := resourceTencentCloudEipAssociationCreateOnExit(ctx); err != nil {
return err
}
- if *eip.AddressStatus != svcvpc.EIP_STATUS_UNBIND {
- return fmt.Errorf("eip status is illegal %s", *eip.AddressStatus)
- }
-
- if v, ok := d.GetOk("instance_id"); ok {
- instanceId := v.(string)
- err = resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
- e := vpcService.AttachEip(ctx, eipId, instanceId)
- if e != nil {
- return tccommon.RetryError(e)
- }
-
- return nil
- })
-
- if err != nil {
- return err
- }
-
- associationId := fmt.Sprintf("%v::%v", eipId, instanceId)
- err = resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
- eip, errRet = vpcService.DescribeEipById(ctx, eipId)
- if errRet != nil {
- return tccommon.RetryError(errRet)
- }
-
- if eip == nil {
- return resource.NonRetryableError(fmt.Errorf("eip is not found"))
- }
-
- if *eip.AddressStatus == svcvpc.EIP_STATUS_BIND {
- return nil
- }
-
- return resource.RetryableError(fmt.Errorf("wait for binding success: %s", *eip.AddressStatus))
- })
-
- if err != nil {
- return err
- }
-
- d.SetId(associationId)
- return resourceTencentCloudEipAssociationRead(d, meta)
- }
-
- needRequest := false
- request := vpc.NewAssociateAddressRequest()
- request.AddressId = &eipId
- var networkId string
- var privateIp string
- if v, ok := d.GetOk("network_interface_id"); ok {
- needRequest = true
- networkId = v.(string)
- request.NetworkInterfaceId = &networkId
- }
-
- if v, ok := d.GetOk("private_ip"); ok {
- needRequest = true
- privateIp = v.(string)
- request.PrivateIpAddress = &privateIp
- }
-
- if needRequest {
- err = resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
- ratelimit.Check(request.GetAction())
- response, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().AssociateAddress(request)
- if e != nil {
- log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n",
- logId, request.GetAction(), request.ToJsonString(), e.Error())
- return tccommon.RetryError(e)
- }
-
- log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
- logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
- return nil
- })
-
- if err != nil {
- return err
- }
-
- id := fmt.Sprintf("%v::%v::%v", eipId, networkId, privateIp)
-
- err = resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
- eip, errRet = vpcService.DescribeEipById(ctx, eipId)
- if errRet != nil {
- return tccommon.RetryError(errRet)
- }
-
- if eip == nil {
- return resource.NonRetryableError(fmt.Errorf("eip is not found"))
- }
-
- if *eip.AddressStatus == svcvpc.EIP_STATUS_BIND_ENI || *eip.AddressStatus == svcvpc.EIP_STATUS_BIND {
- return nil
- }
-
- return resource.RetryableError(fmt.Errorf("wait for binding success: %s", *eip.AddressStatus))
- })
-
- if err != nil {
- return err
- }
-
- d.SetId(id)
- return resourceTencentCloudEipAssociationRead(d, meta)
- }
-
- return nil
+ _ = ctx
+ return resourceTencentCloudEipAssociationRead(d, meta)
}
func resourceTencentCloudEipAssociationRead(d *schema.ResourceData, meta interface{}) error {
defer tccommon.LogElapsed("resource.tencentcloud_eip_association.read")()
defer tccommon.InconsistentCheck(d, meta)()
- var (
- logId = tccommon.GetLogId(tccommon.ContextNil)
- ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
- vpcService = svcvpc.NewVpcService(meta.(tccommon.ProviderMeta).GetAPIV3Conn())
- id = d.Id()
- )
+ logId := tccommon.GetLogId(tccommon.ContextNil)
- association, err := ParseEipAssociationId(id)
- if err != nil {
- return err
- }
+ ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
- err = resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
- eip, errRet := vpcService.DescribeEipById(ctx, association.EipId)
- if errRet != nil {
- return tccommon.RetryError(errRet)
- }
+ service := VpcService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
- if eip == nil {
- d.SetId("")
- }
+ eipId := d.Id()
- return nil
- })
+ _ = d.Set("eip_id", eipId)
+ respData, err := service.DescribeEipAssociationById(ctx, eipId)
if err != nil {
return err
}
- _ = d.Set("eip_id", association.EipId)
- // associate with instance
- if len(association.InstanceId) > 0 {
- _ = d.Set("instance_id", association.InstanceId)
+ if respData == nil {
+ d.SetId("")
+ log.Printf("[WARN]%s resource `eip_association` [%s] not found, please check if it has been deleted.\n", logId, d.Id())
return nil
}
- _ = d.Set("network_interface_id", association.NetworkInterfaceId)
- _ = d.Set("private_ip", association.PrivateIp)
return nil
}
func resourceTencentCloudEipAssociationDelete(d *schema.ResourceData, meta interface{}) error {
defer tccommon.LogElapsed("resource.tencentcloud_eip_association.delete")()
+ defer tccommon.InconsistentCheck(d, meta)()
- var (
- logId = tccommon.GetLogId(tccommon.ContextNil)
- ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
- vpcService = svcvpc.NewVpcService(meta.(tccommon.ProviderMeta).GetAPIV3Conn())
- id = d.Id()
- )
-
- association, err := ParseEipAssociationId(id)
- if err != nil {
- return err
- }
-
- err = resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
- e := vpcService.UnattachEip(ctx, association.EipId)
- if e != nil {
- return tccommon.RetryError(e, "DesOperation.MutexTaskRunning")
- }
+ logId := tccommon.GetLogId(tccommon.ContextNil)
+ ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
- return nil
- })
-
- if err != nil {
- return err
- }
+ eipId := d.Id()
+ _ = eipId
+ _ = ctx
return nil
}
-
-type EipAssociationId struct {
- EipId string
- InstanceId string
- NetworkInterfaceId string
- PrivateIp string
-}
-
-func ParseEipAssociationId(associationId string) (association EipAssociationId, errRet error) {
- ids := strings.Split(associationId, "::")
- if len(ids) < 2 || len(ids) > 3 {
- errRet = fmt.Errorf("Invalid eip association ID: %v", associationId)
- return
- }
- association.EipId = ids[0]
-
- // associate with instance
- if len(ids) == 2 {
- association.InstanceId = ids[1]
- return
- }
-
- // associate with network interface
- association.NetworkInterfaceId = ids[1]
- association.PrivateIp = ids[2]
- return
-}
diff --git a/tencentcloud/services/cvm/resource_tc_eip_association_extension.go b/tencentcloud/services/cvm/resource_tc_eip_association_extension.go
new file mode 100644
index 0000000000..30b30aca27
--- /dev/null
+++ b/tencentcloud/services/cvm/resource_tc_eip_association_extension.go
@@ -0,0 +1,201 @@
+package cvm
+
+import (
+ "context"
+ "fmt"
+ vpc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312"
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
+ "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/ratelimit"
+ svcvpc "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/vpc"
+ "log"
+ "strings"
+
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
+)
+
+type EipAssociationId struct {
+ EipId string
+ InstanceId string
+ NetworkInterfaceId string
+ PrivateIp string
+}
+
+func resourceTencentCloudEipAssociationCreateOnExit(ctx context.Context) error {
+ var (
+ logId = tccommon.GetLogId(tccommon.ContextNil)
+ meta = tccommon.ProviderMetaFromContext(ctx)
+ vpcService = svcvpc.NewVpcService(meta.(tccommon.ProviderMeta).GetAPIV3Conn())
+ d = tccommon.ResourceDataFromContext(ctx)
+ eip *vpc.Address
+ errRet error
+ )
+
+ eipId := d.Get("eip_id").(string)
+ err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
+ eip, errRet = vpcService.DescribeEipById(ctx, eipId)
+ if errRet != nil {
+ return tccommon.RetryError(errRet, tccommon.InternalError)
+ }
+
+ if eip == nil {
+ return resource.NonRetryableError(fmt.Errorf("eip is not found"))
+ }
+
+ return nil
+ })
+
+ if err != nil {
+ return err
+ }
+
+ if *eip.AddressStatus != svcvpc.EIP_STATUS_UNBIND {
+ return fmt.Errorf("eip status is illegal %s", *eip.AddressStatus)
+ }
+
+ if v, ok := d.GetOk("instance_id"); ok {
+ instanceId := v.(string)
+ err = resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
+ e := vpcService.AttachEip(ctx, eipId, instanceId)
+ if e != nil {
+ return tccommon.RetryError(e)
+ }
+
+ return nil
+ })
+
+ if err != nil {
+ return err
+ }
+
+ associationId := fmt.Sprintf("%v::%v", eipId, instanceId)
+ err = resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
+ eip, errRet = vpcService.DescribeEipById(ctx, eipId)
+ if errRet != nil {
+ return tccommon.RetryError(errRet)
+ }
+
+ if eip == nil {
+ return resource.NonRetryableError(fmt.Errorf("eip is not found"))
+ }
+
+ if *eip.AddressStatus == svcvpc.EIP_STATUS_BIND {
+ return nil
+ }
+
+ return resource.RetryableError(fmt.Errorf("wait for binding success: %s", *eip.AddressStatus))
+ })
+
+ if err != nil {
+ return err
+ }
+
+ d.SetId(associationId)
+ return resourceTencentCloudEipAssociationRead(d, meta)
+ }
+
+ needRequest := false
+ request := vpc.NewAssociateAddressRequest()
+ request.AddressId = &eipId
+ var networkId string
+ var privateIp string
+ if v, ok := d.GetOk("network_interface_id"); ok {
+ needRequest = true
+ networkId = v.(string)
+ request.NetworkInterfaceId = &networkId
+ }
+
+ if v, ok := d.GetOk("private_ip"); ok {
+ needRequest = true
+ privateIp = v.(string)
+ request.PrivateIpAddress = &privateIp
+ }
+
+ if needRequest {
+ err = resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
+ ratelimit.Check(request.GetAction())
+ response, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().AssociateAddress(request)
+ if e != nil {
+ log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n",
+ logId, request.GetAction(), request.ToJsonString(), e.Error())
+ return tccommon.RetryError(e)
+ }
+
+ log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
+ logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
+ return nil
+ })
+
+ if err != nil {
+ return err
+ }
+
+ id := fmt.Sprintf("%v::%v::%v", eipId, networkId, privateIp)
+
+ err = resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
+ eip, errRet = vpcService.DescribeEipById(ctx, eipId)
+ if errRet != nil {
+ return tccommon.RetryError(errRet)
+ }
+
+ if eip == nil {
+ return resource.NonRetryableError(fmt.Errorf("eip is not found"))
+ }
+
+ if *eip.AddressStatus == svcvpc.EIP_STATUS_BIND_ENI || *eip.AddressStatus == svcvpc.EIP_STATUS_BIND {
+ return nil
+ }
+
+ return resource.RetryableError(fmt.Errorf("wait for binding success: %s", *eip.AddressStatus))
+ })
+
+ if err != nil {
+ return err
+ }
+
+ d.SetId(id)
+ return resourceTencentCloudEipAssociationRead(d, meta)
+ }
+
+ return nil
+}
+
+func resourceTencentCloudEipAssociationReadPreRequest0(ctx context.Context, req *vpc.DescribeAddressesRequest) error {
+ d := tccommon.ResourceDataFromContext(ctx)
+ id := d.Id()
+ association, err := ParseEipAssociationId(id)
+ if err != nil {
+ return err
+ }
+
+ _ = d.Set("eip_id", association.EipId)
+ if len(association.InstanceId) > 0 {
+ _ = d.Set("instance_id", association.InstanceId)
+ return nil
+ }
+
+ _ = d.Set("network_interface_id", association.NetworkInterfaceId)
+ _ = d.Set("private_ip", association.PrivateIp)
+
+ req.AddressIds = []*string{&association.EipId}
+ return nil
+}
+
+func ParseEipAssociationId(associationId string) (association EipAssociationId, errRet error) {
+ ids := strings.Split(associationId, "::")
+ if len(ids) < 2 || len(ids) > 3 {
+ errRet = fmt.Errorf("Invalid eip association ID: %v", associationId)
+ return
+ }
+ association.EipId = ids[0]
+
+ // associate with instance
+ if len(ids) == 2 {
+ association.InstanceId = ids[1]
+ return
+ }
+
+ // associate with network interface
+ association.NetworkInterfaceId = ids[1]
+ association.PrivateIp = ids[2]
+ return
+}
diff --git a/tencentcloud/services/cvm/resource_tc_eip_normal_address_return.go b/tencentcloud/services/cvm/resource_tc_eip_normal_address_return.go
index 1800e802f1..d65cfd7f31 100644
--- a/tencentcloud/services/cvm/resource_tc_eip_normal_address_return.go
+++ b/tencentcloud/services/cvm/resource_tc_eip_normal_address_return.go
@@ -1,13 +1,14 @@
package cvm
import (
+ "context"
"log"
- tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
-
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
vpc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312"
+
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
)
func ResourceTencentCloudEipNormalAddressReturn() *schema.Resource {
@@ -17,13 +18,13 @@ func ResourceTencentCloudEipNormalAddressReturn() *schema.Resource {
Delete: resourceTencentCloudEipNormalAddressReturnDelete,
Schema: map[string]*schema.Schema{
"address_ips": {
- Optional: true,
- ForceNew: true,
- Type: schema.TypeSet,
+ Type: schema.TypeSet,
+ Optional: true,
+ ForceNew: true,
+ Description: "The IP address of the EIP, example: 101.35.139.183.",
Elem: &schema.Schema{
Type: schema.TypeString,
},
- Description: "The IP address of the EIP, example: 101.35.139.183.",
},
},
}
@@ -35,35 +36,43 @@ func resourceTencentCloudEipNormalAddressReturnCreate(d *schema.ResourceData, me
logId := tccommon.GetLogId(tccommon.ContextNil)
+ ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
+
var (
- request = vpc.NewReturnNormalAddressesRequest()
addressIps string
)
- if v, ok := d.GetOk("address_ips"); ok {
- addressIpsSet := v.(*schema.Set).List()
- for i := range addressIpsSet {
- addressIp := addressIpsSet[i].(string)
- request.AddressIps = append(request.AddressIps, &addressIp)
- addressIps = addressIp + tccommon.FILED_SP
- }
+ var (
+ request = vpc.NewReturnNormalAddressesRequest()
+ response = vpc.NewReturnNormalAddressesResponse()
+ )
+
+ if err := resourceTencentCloudEipNormalAddressReturnCreatePostFillRequest0(ctx, request); err != nil {
+ return err
}
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
- result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().ReturnNormalAddresses(request)
+ result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().ReturnNormalAddressesWithContext(ctx, request)
if e != nil {
return tccommon.RetryError(e)
} else {
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
}
+ response = result
return nil
})
if err != nil {
- log.Printf("[CRITAL]%s operate vpc normalAddressReturn failed, reason:%+v", logId, err)
+ log.Printf("[CRITAL]%s create eip normal address return failed, reason:%+v", logId, err)
return err
}
+ _ = response
+
d.SetId(addressIps)
+ if err := resourceTencentCloudEipNormalAddressReturnCreateOnExit(ctx); err != nil {
+ return err
+ }
+
return resourceTencentCloudEipNormalAddressReturnRead(d, meta)
}
diff --git a/tencentcloud/services/cvm/resource_tc_eip_normal_address_return_extension.go b/tencentcloud/services/cvm/resource_tc_eip_normal_address_return_extension.go
new file mode 100644
index 0000000000..2020d64fc9
--- /dev/null
+++ b/tencentcloud/services/cvm/resource_tc_eip_normal_address_return_extension.go
@@ -0,0 +1,46 @@
+package cvm
+
+import (
+ "context"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
+
+ vpc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312"
+)
+
+func resourceTencentCloudEipNormalAddressReturnCreatePostFillRequest0(ctx context.Context, req *vpc.ReturnNormalAddressesRequest) error {
+ d := tccommon.ResourceDataFromContext(ctx)
+ var (
+ addressIps string
+ )
+
+ if v, ok := d.GetOk("address_ips"); ok {
+ addressIpsSet := v.(*schema.Set).List()
+ for i := range addressIpsSet {
+ addressIp := addressIpsSet[i].(string)
+ req.AddressIps = append(req.AddressIps, &addressIp)
+ addressIps = addressIp + tccommon.FILED_SP
+ }
+ }
+
+ _ = addressIps
+ return nil
+}
+
+func resourceTencentCloudEipNormalAddressReturnCreateOnExit(ctx context.Context) error {
+ d := tccommon.ResourceDataFromContext(ctx)
+ var (
+ addressIps string
+ )
+
+ if v, ok := d.GetOk("address_ips"); ok {
+ addressIpsSet := v.(*schema.Set).List()
+ for i := range addressIpsSet {
+ addressIp := addressIpsSet[i].(string)
+ addressIps = addressIp + tccommon.FILED_SP
+ }
+ }
+
+ d.SetId(addressIps)
+ return nil
+}
diff --git a/tencentcloud/services/cvm/service_tencentcloud_cvm.go b/tencentcloud/services/cvm/service_tencentcloud_cvm.go
index 88e3ea2581..77146c1db7 100644
--- a/tencentcloud/services/cvm/service_tencentcloud_cvm.go
+++ b/tencentcloud/services/cvm/service_tencentcloud_cvm.go
@@ -2150,3 +2150,61 @@ func (me *CvmService) DescribeInstancesByFilter(ctx context.Context, param map[s
return
}
+
+func (me *CvmService) DescribeCvmSecurityGroupAttachmentById(ctx context.Context, instanceId string) (ret *cvm.DescribeInstancesResponseParams, errRet error) {
+ logId := tccommon.GetLogId(ctx)
+
+ request := cvm.NewDescribeInstancesRequest()
+ request.InstanceIds = []*string{helper.String(instanceId)}
+
+ defer func() {
+ if errRet != nil {
+ log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, request.GetAction(), request.ToJsonString(), errRet.Error())
+ }
+ }()
+
+ ratelimit.Check(request.GetAction())
+
+ response, err := me.client.UseCvmClient().DescribeInstances(request)
+ if err != nil {
+ errRet = err
+ return
+ }
+ log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
+
+ ret = response.Response
+ return
+}
+
+func (me *VpcService) DescribeEipAssociationById(ctx context.Context, eipId string) (ret *vpc.Address, errRet error) {
+ logId := tccommon.GetLogId(ctx)
+
+ request := vpc.NewDescribeAddressesRequest()
+ request.AddressIds = []*string{helper.String(eipId)}
+
+ defer func() {
+ if errRet != nil {
+ log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, request.GetAction(), request.ToJsonString(), errRet.Error())
+ }
+ }()
+
+ ratelimit.Check(request.GetAction())
+
+ if err := resourceTencentCloudEipAssociationReadPreRequest0(ctx, request); err != nil {
+ return nil, err
+ }
+
+ response, err := me.client.UseVpcClient().DescribeAddresses(request)
+ if err != nil {
+ errRet = err
+ return
+ }
+ log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
+
+ if len(response.Response.AddressSet) < 1 {
+ return
+ }
+
+ ret = response.Response.AddressSet[0]
+ return
+}
From 86ff6addde74cf17d65541d287f45b82e6a0d1b7 Mon Sep 17 00:00:00 2001
From: SevenEarth <391613297@qq.com>
Date: Wed, 12 Jun 2024 14:48:02 +0800
Subject: [PATCH 7/8] add
---
.../cvm/resource_tc_eip_association.go | 5 ++++
.../resource_tc_eip_association_extension.go | 26 +++++++++++++++++++
2 files changed, 31 insertions(+)
diff --git a/tencentcloud/services/cvm/resource_tc_eip_association.go b/tencentcloud/services/cvm/resource_tc_eip_association.go
index bf36748dac..713cb480ab 100644
--- a/tencentcloud/services/cvm/resource_tc_eip_association.go
+++ b/tencentcloud/services/cvm/resource_tc_eip_association.go
@@ -5,6 +5,7 @@ import (
"log"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+
tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
)
@@ -112,6 +113,10 @@ func resourceTencentCloudEipAssociationDelete(d *schema.ResourceData, meta inter
eipId := d.Id()
+ if err := resourceTencentCloudEipAssociationDeleteOnExit(ctx); err != nil {
+ return err
+ }
+
_ = eipId
_ = ctx
return nil
diff --git a/tencentcloud/services/cvm/resource_tc_eip_association_extension.go b/tencentcloud/services/cvm/resource_tc_eip_association_extension.go
index 30b30aca27..8bae4626c0 100644
--- a/tencentcloud/services/cvm/resource_tc_eip_association_extension.go
+++ b/tencentcloud/services/cvm/resource_tc_eip_association_extension.go
@@ -180,6 +180,32 @@ func resourceTencentCloudEipAssociationReadPreRequest0(ctx context.Context, req
return nil
}
+func resourceTencentCloudEipAssociationDeleteOnExit(ctx context.Context) error {
+ d := tccommon.ResourceDataFromContext(ctx)
+ id := d.Id()
+ meta := tccommon.ProviderMetaFromContext(ctx)
+ vpcService := svcvpc.NewVpcService(meta.(tccommon.ProviderMeta).GetAPIV3Conn())
+ association, err := ParseEipAssociationId(id)
+ if err != nil {
+ return err
+ }
+
+ err = resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
+ e := vpcService.UnattachEip(ctx, association.EipId)
+ if e != nil {
+ return tccommon.RetryError(e, "DesOperation.MutexTaskRunning")
+ }
+
+ return nil
+ })
+
+ if err != nil {
+ return err
+ }
+
+ return nil
+}
+
func ParseEipAssociationId(associationId string) (association EipAssociationId, errRet error) {
ids := strings.Split(associationId, "::")
if len(ids) < 2 || len(ids) > 3 {
From b453387034a2ab91206039e1cf9058d26d3bf58a Mon Sep 17 00:00:00 2001
From: SevenEarth <391613297@qq.com>
Date: Wed, 12 Jun 2024 15:08:53 +0800
Subject: [PATCH 8/8] add
---
tencentcloud/services/cvm/data_source_tc_eips_extension.go | 3 ++-
.../services/cvm/data_source_tc_image_extension.go | 5 +++--
.../services/cvm/data_source_tc_images_extension.go | 7 ++++---
.../cvm/data_source_tc_instance_types_extension.go | 3 ++-
.../services/cvm/data_source_tc_instances_extension.go | 3 ++-
.../services/cvm/data_source_tc_instances_set_extension.go | 3 ++-
.../services/cvm/data_source_tc_key_pairs_extension.go | 5 +++--
.../cvm/data_source_tc_placement_groups_extension.go | 3 ++-
.../services/cvm/resource_tc_cvm_renew_instance.go | 4 ++--
.../resource_tc_cvm_security_group_attachment_extension.go | 5 +++--
.../services/cvm/resource_tc_cvm_sync_image_extension.go | 3 ++-
.../cvm/resource_tc_eip_address_transform_extension.go | 3 ++-
.../services/cvm/resource_tc_eip_association_extension.go | 5 +++--
tencentcloud/services/cvm/resource_tc_eip_extension.go | 3 ++-
.../cvm/resource_tc_eip_normal_address_return_extension.go | 1 +
.../cvm/resource_tc_eip_public_address_adjust_extension.go | 3 ++-
tencentcloud/services/cvm/service_tencentcloud_cvm.go | 3 ++-
17 files changed, 39 insertions(+), 23 deletions(-)
diff --git a/tencentcloud/services/cvm/data_source_tc_eips_extension.go b/tencentcloud/services/cvm/data_source_tc_eips_extension.go
index bfcd6ad35d..522e73c259 100644
--- a/tencentcloud/services/cvm/data_source_tc_eips_extension.go
+++ b/tencentcloud/services/cvm/data_source_tc_eips_extension.go
@@ -2,11 +2,12 @@ package cvm
import (
"context"
+ "log"
+
tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
svctag "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/tag"
svcvpc "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/vpc"
- "log"
vpc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312"
)
diff --git a/tencentcloud/services/cvm/data_source_tc_image_extension.go b/tencentcloud/services/cvm/data_source_tc_image_extension.go
index ab977a4dce..97eca70db8 100644
--- a/tencentcloud/services/cvm/data_source_tc_image_extension.go
+++ b/tencentcloud/services/cvm/data_source_tc_image_extension.go
@@ -4,11 +4,12 @@ import (
"context"
"errors"
"fmt"
- tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
- "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
"regexp"
"strings"
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
+ "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
+
cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
)
diff --git a/tencentcloud/services/cvm/data_source_tc_images_extension.go b/tencentcloud/services/cvm/data_source_tc_images_extension.go
index 07e65b27bf..34c4db07c9 100644
--- a/tencentcloud/services/cvm/data_source_tc_images_extension.go
+++ b/tencentcloud/services/cvm/data_source_tc_images_extension.go
@@ -3,13 +3,14 @@ package cvm
import (
"context"
"fmt"
- tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
- "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
- svccbs "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/cbs"
"log"
"regexp"
"strings"
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
+ "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
+ svccbs "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/cbs"
+
cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
)
diff --git a/tencentcloud/services/cvm/data_source_tc_instance_types_extension.go b/tencentcloud/services/cvm/data_source_tc_instance_types_extension.go
index 0b13edc4d3..79c109f98c 100644
--- a/tencentcloud/services/cvm/data_source_tc_instance_types_extension.go
+++ b/tencentcloud/services/cvm/data_source_tc_instance_types_extension.go
@@ -2,10 +2,11 @@ package cvm
import (
"context"
+ "log"
+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
- "log"
cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
)
diff --git a/tencentcloud/services/cvm/data_source_tc_instances_extension.go b/tencentcloud/services/cvm/data_source_tc_instances_extension.go
index 0dedc513e8..a2cf6be7b3 100644
--- a/tencentcloud/services/cvm/data_source_tc_instances_extension.go
+++ b/tencentcloud/services/cvm/data_source_tc_instances_extension.go
@@ -2,9 +2,10 @@ package cvm
import (
"context"
+ "log"
+
tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
- "log"
cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
)
diff --git a/tencentcloud/services/cvm/data_source_tc_instances_set_extension.go b/tencentcloud/services/cvm/data_source_tc_instances_set_extension.go
index f2c9ede62b..e99cf86092 100644
--- a/tencentcloud/services/cvm/data_source_tc_instances_set_extension.go
+++ b/tencentcloud/services/cvm/data_source_tc_instances_set_extension.go
@@ -2,9 +2,10 @@ package cvm
import (
"context"
+ "log"
+
tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
- "log"
cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
)
diff --git a/tencentcloud/services/cvm/data_source_tc_key_pairs_extension.go b/tencentcloud/services/cvm/data_source_tc_key_pairs_extension.go
index 63413a9aa1..5c7e95ebf9 100644
--- a/tencentcloud/services/cvm/data_source_tc_key_pairs_extension.go
+++ b/tencentcloud/services/cvm/data_source_tc_key_pairs_extension.go
@@ -3,12 +3,13 @@ package cvm
import (
"context"
"fmt"
- tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
- "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
"log"
"regexp"
"strings"
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
+ "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
+
cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
)
diff --git a/tencentcloud/services/cvm/data_source_tc_placement_groups_extension.go b/tencentcloud/services/cvm/data_source_tc_placement_groups_extension.go
index 89d1faf5b6..63d2f7b420 100644
--- a/tencentcloud/services/cvm/data_source_tc_placement_groups_extension.go
+++ b/tencentcloud/services/cvm/data_source_tc_placement_groups_extension.go
@@ -2,9 +2,10 @@ package cvm
import (
"context"
+ "log"
+
tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
- "log"
cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
)
diff --git a/tencentcloud/services/cvm/resource_tc_cvm_renew_instance.go b/tencentcloud/services/cvm/resource_tc_cvm_renew_instance.go
index af5a98818b..ac982d00d7 100644
--- a/tencentcloud/services/cvm/resource_tc_cvm_renew_instance.go
+++ b/tencentcloud/services/cvm/resource_tc_cvm_renew_instance.go
@@ -41,7 +41,7 @@ func ResourceTencentCloudCvmRenewInstance() *schema.Resource {
"renew_flag": {
Type: schema.TypeString,
Optional: true,
- Description: "Auto renewal flag. Valid values:
NOTIFY_AND_AUTO_RENEW:notify upon expiration and renew automatically
NOTIFY_AND_MANUAL_RENEW:notify upon expiration but do not renew automatically
DISABLE_NOTIFY_AND_MANUAL_RENEW:neither notify upon expiration nor renew automatically
Default value: NOTIFY_AND_MANUAL_RENEW。If this parameter is specified as NOTIFY_AND_AUTO_RENEW, the instance will be automatically renewed on a monthly basis if the account balance is sufficient. Note: This field may return null, indicating that no valid value is found.",
+ Description: "Auto renewal flag. Valid values:
NOTIFY_AND_AUTO_RENEW: notify upon expiration and renew automatically
NOTIFY_AND_MANUAL_RENEW: notify upon expiration but do not renew automatically
DISABLE_NOTIFY_AND_MANUAL_RENEW: neither notify upon expiration nor renew automatically
Default value: NOTIFY_AND_MANUAL_RENEW. If this parameter is specified as NOTIFY_AND_AUTO_RENEW, the instance will be automatically renewed on a monthly basis if the account balance is sufficient. Note: This field may return null, indicating that no valid value is found.",
},
},
},
@@ -51,7 +51,7 @@ func ResourceTencentCloudCvmRenewInstance() *schema.Resource {
Type: schema.TypeBool,
Optional: true,
ForceNew: true,
- Description: "Whether to renew the elastic data disk. Valid values:
TRUE:Indicates to renew the subscription instance and renew the attached elastic data disk at the same time
FALSE:Indicates that the subscription instance will be renewed and the elastic data disk attached to it will not be renewed
Default value:TRUE.",
+ Description: "Whether to renew the elastic data disk. Valid values:
TRUE: Indicates to renew the subscription instance and renew the attached elastic data disk at the same time
FALSE: Indicates that the subscription instance will be renewed and the elastic data disk attached to it will not be renewed
Default value: TRUE.",
},
},
}
diff --git a/tencentcloud/services/cvm/resource_tc_cvm_security_group_attachment_extension.go b/tencentcloud/services/cvm/resource_tc_cvm_security_group_attachment_extension.go
index cb68f0c651..0b94ae9897 100644
--- a/tencentcloud/services/cvm/resource_tc_cvm_security_group_attachment_extension.go
+++ b/tencentcloud/services/cvm/resource_tc_cvm_security_group_attachment_extension.go
@@ -3,10 +3,11 @@ package cvm
import (
"context"
"fmt"
- cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
- tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
"log"
"strings"
+
+ cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
)
func resourceTencentCloudCvmSecurityGroupAttachmentReadPostHandleResponse0(ctx context.Context, resp *cvm.DescribeInstancesResponseParams) error {
diff --git a/tencentcloud/services/cvm/resource_tc_cvm_sync_image_extension.go b/tencentcloud/services/cvm/resource_tc_cvm_sync_image_extension.go
index ddb08d69bb..cf3acb7892 100644
--- a/tencentcloud/services/cvm/resource_tc_cvm_sync_image_extension.go
+++ b/tencentcloud/services/cvm/resource_tc_cvm_sync_image_extension.go
@@ -2,9 +2,10 @@ package cvm
import (
"context"
- tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
"time"
+ tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
+
cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
)
diff --git a/tencentcloud/services/cvm/resource_tc_eip_address_transform_extension.go b/tencentcloud/services/cvm/resource_tc_eip_address_transform_extension.go
index 5b104d63bf..9b69530b61 100644
--- a/tencentcloud/services/cvm/resource_tc_eip_address_transform_extension.go
+++ b/tencentcloud/services/cvm/resource_tc_eip_address_transform_extension.go
@@ -2,10 +2,11 @@ package cvm
import (
"context"
+ "time"
+
tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
svcvpc "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/vpc"
- "time"
vpc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312"
)
diff --git a/tencentcloud/services/cvm/resource_tc_eip_association_extension.go b/tencentcloud/services/cvm/resource_tc_eip_association_extension.go
index 8bae4626c0..1229c298f0 100644
--- a/tencentcloud/services/cvm/resource_tc_eip_association_extension.go
+++ b/tencentcloud/services/cvm/resource_tc_eip_association_extension.go
@@ -3,12 +3,13 @@ package cvm
import (
"context"
"fmt"
+ "log"
+ "strings"
+
vpc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312"
tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/ratelimit"
svcvpc "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/vpc"
- "log"
- "strings"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
)
diff --git a/tencentcloud/services/cvm/resource_tc_eip_extension.go b/tencentcloud/services/cvm/resource_tc_eip_extension.go
index 632403a47d..b5dc5a0158 100644
--- a/tencentcloud/services/cvm/resource_tc_eip_extension.go
+++ b/tencentcloud/services/cvm/resource_tc_eip_extension.go
@@ -3,13 +3,14 @@ package cvm
import (
"context"
"fmt"
+ "log"
+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
vpc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312"
tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
svctag "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/tag"
svcvpc "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/vpc"
- "log"
)
func resourceTencentCloudEipCreatePostFillRequest0(ctx context.Context, req *vpc.AllocateAddressesRequest) error {
diff --git a/tencentcloud/services/cvm/resource_tc_eip_normal_address_return_extension.go b/tencentcloud/services/cvm/resource_tc_eip_normal_address_return_extension.go
index 2020d64fc9..1a14e010c7 100644
--- a/tencentcloud/services/cvm/resource_tc_eip_normal_address_return_extension.go
+++ b/tencentcloud/services/cvm/resource_tc_eip_normal_address_return_extension.go
@@ -2,6 +2,7 @@ package cvm
import (
"context"
+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
diff --git a/tencentcloud/services/cvm/resource_tc_eip_public_address_adjust_extension.go b/tencentcloud/services/cvm/resource_tc_eip_public_address_adjust_extension.go
index 598f4e47b3..01d32135cd 100644
--- a/tencentcloud/services/cvm/resource_tc_eip_public_address_adjust_extension.go
+++ b/tencentcloud/services/cvm/resource_tc_eip_public_address_adjust_extension.go
@@ -2,10 +2,11 @@ package cvm
import (
"context"
+ "time"
+
tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
svcvpc "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/vpc"
- "time"
vpc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312"
)
diff --git a/tencentcloud/services/cvm/service_tencentcloud_cvm.go b/tencentcloud/services/cvm/service_tencentcloud_cvm.go
index 77146c1db7..5186a6189c 100644
--- a/tencentcloud/services/cvm/service_tencentcloud_cvm.go
+++ b/tencentcloud/services/cvm/service_tencentcloud_cvm.go
@@ -3,13 +3,14 @@ package cvm
import (
"context"
"fmt"
- vpc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312"
"log"
"sort"
"strings"
"sync"
"time"
+ vpc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312"
+
tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"