Skip to content

fix(vpc): [138577325] tencentcloud_eni_ipv6_address update code and doc #3300

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Apr 11, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .changelog/3300.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:enhancement
resource/tencentcloud_eni_ipv6_address: update code and doc
```
61 changes: 39 additions & 22 deletions tencentcloud/services/vpc/resource_tc_eni_ipv6_address.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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)
}
}
Expand All @@ -150,40 +157,51 @@ 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)
}

func resourceTencentCloudEniIpv6AddressRead(d *schema.ResourceData, meta interface{}) error {
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
}
Expand All @@ -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{}{
Expand All @@ -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
}
Expand Down
37 changes: 20 additions & 17 deletions tencentcloud/services/vpc/resource_tc_eni_ipv6_address.md
Original file line number Diff line number Diff line change
@@ -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
}
Expand All @@ -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
```
74 changes: 63 additions & 11 deletions tencentcloud/services/vpc/service_tencentcloud_vpc.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
"strconv"
"strings"
"sync"
"time"

tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"

Expand Down Expand Up @@ -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() {
Expand All @@ -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
Expand All @@ -5869,6 +5888,7 @@ func (me *VpcService) DescribeVpcEndPointServiceById(ctx context.Context, endPoi
if len(instances) < 1 {
return
}

endPointService = instances[0]
return
}
Expand All @@ -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
}
Expand Down Expand Up @@ -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 {
Expand All @@ -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
}
Expand Down
Loading
Loading