diff --git a/.changelog/3300.txt b/.changelog/3300.txt new file mode 100644 index 0000000000..4e1dfd0b5d --- /dev/null +++ b/.changelog/3300.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +resource/tencentcloud_eni_ipv6_address: update code and doc +``` \ No newline at end of file diff --git a/tencentcloud/services/vpc/resource_tc_eni_ipv6_address.go b/tencentcloud/services/vpc/resource_tc_eni_ipv6_address.go index 08429373d8..7ca692e0cb 100644 --- a/tencentcloud/services/vpc/resource_tc_eni_ipv6_address.go +++ b/tencentcloud/services/vpc/resource_tc_eni_ipv6_address.go @@ -100,17 +100,18 @@ func resourceTencentCloudEniIpv6AddressCreate(d *schema.ResourceData, meta inter defer tccommon.LogElapsed("resource.tencentcloud_eni_ipv6_address.create")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + vpcService = VpcService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} request = vpc.NewAssignIpv6AddressesRequest() response = vpc.NewAssignIpv6AddressesResponse() networkInterfaceId string ) if v, ok := d.GetOk("network_interface_id"); ok { - networkInterfaceId = v.(string) request.NetworkInterfaceId = helper.String(v.(string)) + networkInterfaceId = v.(string) } if v, ok := d.GetOk("ipv6_addresses"); ok { @@ -120,21 +121,27 @@ func resourceTencentCloudEniIpv6AddressCreate(d *schema.ResourceData, meta inter if v, ok := dMap["address"]; ok { ipv6Address.Address = helper.String(v.(string)) } + if v, ok := dMap["primary"]; ok { ipv6Address.Primary = helper.Bool(v.(bool)) } + if v, ok := dMap["address_id"]; ok { ipv6Address.AddressId = helper.String(v.(string)) } + if v, ok := dMap["description"]; ok { ipv6Address.Description = helper.String(v.(string)) } + if v, ok := dMap["is_wan_ip_blocked"]; ok { ipv6Address.IsWanIpBlocked = helper.Bool(v.(bool)) } + if v, ok := dMap["state"]; ok { ipv6Address.State = helper.String(v.(string)) } + request.Ipv6Addresses = append(request.Ipv6Addresses, &ipv6Address) } } @@ -150,23 +157,36 @@ func resourceTencentCloudEniIpv6AddressCreate(d *schema.ResourceData, meta inter } else { log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) } + + if result == nil || result.Response == nil { + return resource.NonRetryableError(fmt.Errorf("Create vpc ipv6EniAddress failed, Response is nil.")) + } + response = result return nil }) + if err != nil { log.Printf("[CRITAL]%s create vpc ipv6EniAddress failed, reason:%+v", logId, err) return err } - addressSet := response.Response.Ipv6AddressSet - if len(addressSet) < 1 { + if response.Response.Ipv6AddressSet == nil || len(response.Response.Ipv6AddressSet) < 1 { return fmt.Errorf("assign ipv6 addresses failed.") } - time.Sleep(5 * time.Second) - d.SetId(networkInterfaceId) + // wait + if response.Response.RequestId != nil { + err = vpcService.DescribeVpcTaskResult(ctx, response.Response.RequestId) + if err != nil { + return err + } + } else { + time.Sleep(15 * time.Second) + } + return resourceTencentCloudEniIpv6AddressRead(d, meta) } @@ -174,16 +194,14 @@ func resourceTencentCloudEniIpv6AddressRead(d *schema.ResourceData, meta interfa defer tccommon.LogElapsed("resource.tencentcloud_eni_ipv6_address.read")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) - - service := VpcService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} - - networkInterfaceId := d.Id() + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + service = VpcService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + networkInterfaceId = d.Id() + ) enis, err := service.DescribeEniById(ctx, []string{networkInterfaceId}) - if err != nil { return err } @@ -195,7 +213,6 @@ func resourceTencentCloudEniIpv6AddressRead(d *schema.ResourceData, meta interfa } eni := enis[0] - ipv6s := make([]map[string]interface{}, 0, len(eni.Ipv6AddressSet)) for _, ipv6 := range eni.Ipv6AddressSet { ipv6s = append(ipv6s, map[string]interface{}{ @@ -219,14 +236,14 @@ func resourceTencentCloudEniIpv6AddressDelete(d *schema.ResourceData, meta inter defer tccommon.LogElapsed("resource.tencentcloud_eni_ipv6_address.delete")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) - - service := VpcService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} - networkInterfaceId := d.Id() + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + service = VpcService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + networkInterfaceId = d.Id() + ) enis, err := service.DescribeEniById(ctx, []string{networkInterfaceId}) - if err != nil { return err } diff --git a/tencentcloud/services/vpc/resource_tc_eni_ipv6_address.md b/tencentcloud/services/vpc/resource_tc_eni_ipv6_address.md index 1e0d38021e..acf0267223 100644 --- a/tencentcloud/services/vpc/resource_tc_eni_ipv6_address.md +++ b/tencentcloud/services/vpc/resource_tc_eni_ipv6_address.md @@ -1,31 +1,21 @@ -Provides a resource to create a vpc eni_ipv6_address +Provides a resource to create a vpc eni ipv6 address Example Usage ```hcl -data "tencentcloud_availability_zones" "zones" {} - resource "tencentcloud_vpc" "vpc" { name = "vpc-example" cidr_block = "10.0.0.0/16" } resource "tencentcloud_subnet" "subnet" { - availability_zone = data.tencentcloud_availability_zones.zones.zones.0.name + availability_zone = "ap-guangzhou-6" name = "subnet-example" vpc_id = tencentcloud_vpc.vpc.id cidr_block = "10.0.0.0/16" is_multicast = false } -resource "tencentcloud_eni" "eni" { - name = "eni-example" - vpc_id = tencentcloud_vpc.vpc.id - subnet_id = tencentcloud_subnet.subnet.id - description = "eni desc." - ipv4_count = 1 -} - resource "tencentcloud_vpc_ipv6_cidr_block" "example" { vpc_id = tencentcloud_vpc.vpc.id } @@ -34,20 +24,33 @@ resource "tencentcloud_vpc_ipv6_subnet_cidr_block" "example" { vpc_id = tencentcloud_vpc.vpc.id ipv6_subnet_cidr_blocks { subnet_id = tencentcloud_subnet.subnet.id - ipv6_cidr_block = "2402:4e00:1018:6700::/64" + ipv6_cidr_block = "2402:4e00:1015:7500::/64" } } -resource "tencentcloud_eni_ipv6_address" "ipv6_eni_address" { - network_interface_id = tencentcloud_eni.eni.id +resource "tencentcloud_eni" "example" { + name = "tf-example" + vpc_id = tencentcloud_vpc.vpc.id + subnet_id = tencentcloud_subnet.subnet.id + description = "eni description." + ipv4_count = 1 + + depends_on = [ + tencentcloud_vpc_ipv6_cidr_block.example, + tencentcloud_vpc_ipv6_subnet_cidr_block.example + ] +} + +resource "tencentcloud_eni_ipv6_address" "example" { + network_interface_id = tencentcloud_eni.example.id ipv6_address_count = 1 } ``` Import -vpc eni_ipv6_address can be imported using the id, e.g. +vpc eni ipv6 address can be imported using the id, e.g. ``` -terraform import tencentcloud_eni_ipv6_address.ipv6_eni_address eni_id +terraform import tencentcloud_eni_ipv6_address.example eni-fxrx5d1d ``` \ No newline at end of file diff --git a/tencentcloud/services/vpc/service_tencentcloud_vpc.go b/tencentcloud/services/vpc/service_tencentcloud_vpc.go index 0008096b1b..f01d8ffcc2 100644 --- a/tencentcloud/services/vpc/service_tencentcloud_vpc.go +++ b/tencentcloud/services/vpc/service_tencentcloud_vpc.go @@ -12,6 +12,7 @@ import ( "strconv" "strings" "sync" + "time" tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common" @@ -5830,6 +5831,7 @@ func (me *VpcService) DescribeVpcEndPointServiceById(ctx context.Context, endPoi logId := tccommon.GetLogId(ctx) request := vpc.NewDescribeVpcEndPointServiceRequest() + response := vpc.NewDescribeVpcEndPointServiceResponse() request.EndPointServiceIds = []*string{&endPointServiceId} defer func() { @@ -5841,23 +5843,40 @@ func (me *VpcService) DescribeVpcEndPointServiceById(ctx context.Context, endPoi ratelimit.Check(request.GetAction()) var ( - offset uint64 = 0 - limit uint64 = 20 + offset uint64 = 0 + limit uint64 = 20 + instances = make([]*vpc.EndPointService, 0) ) - instances := make([]*vpc.EndPointService, 0) + for { request.Offset = &offset request.Limit = &limit - response, err := me.client.UseVpcClient().DescribeVpcEndPointService(request) + + err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { + result, e := me.client.UseVpcClient().DescribeVpcEndPointService(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()) + } + + if result == nil || result.Response == nil { + return resource.RetryableError(fmt.Errorf("Describe vpc endPointService failed, Response is nil.")) + } + + response = result + return nil + }) + 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.EndPointServiceSet) < 1 { break } + instances = append(instances, response.Response.EndPointServiceSet...) if len(response.Response.EndPointServiceSet) < int(limit) { break @@ -5869,6 +5888,7 @@ func (me *VpcService) DescribeVpcEndPointServiceById(ctx context.Context, endPoi if len(instances) < 1 { return } + endPointService = instances[0] return } @@ -5885,14 +5905,22 @@ func (me *VpcService) DeleteVpcEndPointServiceById(ctx context.Context, endPoint } }() - ratelimit.Check(request.GetAction()) + err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { + ratelimit.Check(request.GetAction()) + result, e := me.client.UseVpcClient().DeleteVpcEndPointService(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 + }) - response, err := me.client.UseVpcClient().DeleteVpcEndPointService(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()) return } @@ -7000,6 +7028,7 @@ func (me *VpcService) DeleteEniIpv6AddressById(ctx context.Context, networkInter logId := tccommon.GetLogId(ctx) request := vpc.NewUnassignIpv6AddressesRequest() + response := vpc.NewUnassignIpv6AddressesResponse() request.NetworkInterfaceId = &networkInterfaceId for _, ipv6Address := range ipv6Addresses { @@ -7014,14 +7043,37 @@ func (me *VpcService) DeleteEniIpv6AddressById(ctx context.Context, networkInter } }() - ratelimit.Check(request.GetAction()) + err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + ratelimit.Check(request.GetAction()) + result, e := me.client.UseVpcClient().UnassignIpv6Addresses(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()) + } + + if result == nil || result.Response == nil { + return resource.NonRetryableError(fmt.Errorf("Delete vpc ipv6EniAddress failed, Response is nil.")) + } + + response = result + return nil + }) - response, err := me.client.UseVpcClient().UnassignIpv6Addresses(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()) + + // wait + if response.Response.RequestId != nil { + err = me.DescribeVpcTaskResult(ctx, response.Response.RequestId) + if err != nil { + return err + } + } else { + time.Sleep(15 * time.Second) + } return } diff --git a/website/docs/r/eni_ipv6_address.html.markdown b/website/docs/r/eni_ipv6_address.html.markdown index b83e7b8bdc..a67583d6e9 100644 --- a/website/docs/r/eni_ipv6_address.html.markdown +++ b/website/docs/r/eni_ipv6_address.html.markdown @@ -4,39 +4,29 @@ layout: "tencentcloud" page_title: "TencentCloud: tencentcloud_eni_ipv6_address" sidebar_current: "docs-tencentcloud-resource-eni_ipv6_address" description: |- - Provides a resource to create a vpc eni_ipv6_address + Provides a resource to create a vpc eni ipv6 address --- # tencentcloud_eni_ipv6_address -Provides a resource to create a vpc eni_ipv6_address +Provides a resource to create a vpc eni ipv6 address ## Example Usage ```hcl -data "tencentcloud_availability_zones" "zones" {} - resource "tencentcloud_vpc" "vpc" { name = "vpc-example" cidr_block = "10.0.0.0/16" } resource "tencentcloud_subnet" "subnet" { - availability_zone = data.tencentcloud_availability_zones.zones.zones.0.name + availability_zone = "ap-guangzhou-6" name = "subnet-example" vpc_id = tencentcloud_vpc.vpc.id cidr_block = "10.0.0.0/16" is_multicast = false } -resource "tencentcloud_eni" "eni" { - name = "eni-example" - vpc_id = tencentcloud_vpc.vpc.id - subnet_id = tencentcloud_subnet.subnet.id - description = "eni desc." - ipv4_count = 1 -} - resource "tencentcloud_vpc_ipv6_cidr_block" "example" { vpc_id = tencentcloud_vpc.vpc.id } @@ -45,12 +35,25 @@ resource "tencentcloud_vpc_ipv6_subnet_cidr_block" "example" { vpc_id = tencentcloud_vpc.vpc.id ipv6_subnet_cidr_blocks { subnet_id = tencentcloud_subnet.subnet.id - ipv6_cidr_block = "2402:4e00:1018:6700::/64" + ipv6_cidr_block = "2402:4e00:1015:7500::/64" } } -resource "tencentcloud_eni_ipv6_address" "ipv6_eni_address" { - network_interface_id = tencentcloud_eni.eni.id +resource "tencentcloud_eni" "example" { + name = "tf-example" + vpc_id = tencentcloud_vpc.vpc.id + subnet_id = tencentcloud_subnet.subnet.id + description = "eni description." + ipv4_count = 1 + + depends_on = [ + tencentcloud_vpc_ipv6_cidr_block.example, + tencentcloud_vpc_ipv6_subnet_cidr_block.example + ] +} + +resource "tencentcloud_eni_ipv6_address" "example" { + network_interface_id = tencentcloud_eni.example.id ipv6_address_count = 1 } ``` @@ -82,9 +85,9 @@ In addition to all arguments above, the following attributes are exported: ## Import -vpc eni_ipv6_address can be imported using the id, e.g. +vpc eni ipv6 address can be imported using the id, e.g. ``` -terraform import tencentcloud_eni_ipv6_address.ipv6_eni_address eni_id +terraform import tencentcloud_eni_ipv6_address.example eni-fxrx5d1d ```