Skip to content

Commit 694f893

Browse files
committed
add
1 parent 6909f3a commit 694f893

File tree

4 files changed

+120
-88
lines changed

4 files changed

+120
-88
lines changed

tencentcloud/services/vpc/resource_tc_eni_attachment.go

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,16 @@ func ResourceTencentCloudEniAttachment() *schema.Resource {
3939

4040
func resourceTencentCloudEniAttachmentCreate(d *schema.ResourceData, m interface{}) error {
4141
defer tccommon.LogElapsed("resource.tencentcloud_eni_attachment.create")()
42-
logId := tccommon.GetLogId(tccommon.ContextNil)
43-
ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
42+
43+
var (
44+
logId = tccommon.GetLogId(tccommon.ContextNil)
45+
ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
46+
service = VpcService{client: m.(tccommon.ProviderMeta).GetAPIV3Conn()}
47+
)
4448

4549
eniId := d.Get("eni_id").(string)
4650
cvmId := d.Get("instance_id").(string)
4751

48-
service := VpcService{client: m.(tccommon.ProviderMeta).GetAPIV3Conn()}
49-
5052
if err := service.AttachEniToCvm(ctx, eniId, cvmId); err != nil {
5153
return err
5254
}
@@ -60,8 +62,11 @@ func resourceTencentCloudEniAttachmentRead(d *schema.ResourceData, m interface{}
6062
defer tccommon.LogElapsed("resource.tencentcloud_eni_attachment.read")()
6163
defer tccommon.InconsistentCheck(d, m)()
6264

63-
logId := tccommon.GetLogId(tccommon.ContextNil)
64-
ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
65+
var (
66+
logId = tccommon.GetLogId(tccommon.ContextNil)
67+
ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
68+
service = VpcService{client: m.(tccommon.ProviderMeta).GetAPIV3Conn()}
69+
)
6570

6671
id := d.Id()
6772
split := strings.Split(id, "+")
@@ -72,9 +77,6 @@ func resourceTencentCloudEniAttachmentRead(d *schema.ResourceData, m interface{}
7277
}
7378

7479
eniId := split[0]
75-
76-
service := VpcService{client: m.(tccommon.ProviderMeta).GetAPIV3Conn()}
77-
7880
enis, err := service.DescribeEniById(ctx, []string{eniId})
7981
if err != nil {
8082
return err
@@ -86,7 +88,6 @@ func resourceTencentCloudEniAttachmentRead(d *schema.ResourceData, m interface{}
8688
}
8789

8890
eni := enis[0]
89-
9091
if eni.Attachment == nil {
9192
d.SetId("")
9293
return nil
@@ -100,8 +101,12 @@ func resourceTencentCloudEniAttachmentRead(d *schema.ResourceData, m interface{}
100101

101102
func resourceTencentCloudEniAttachmentDelete(d *schema.ResourceData, m interface{}) error {
102103
defer tccommon.LogElapsed("resource.tencentcloud_eni_attachment.delete")()
103-
logId := tccommon.GetLogId(tccommon.ContextNil)
104-
ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
104+
105+
var (
106+
logId = tccommon.GetLogId(tccommon.ContextNil)
107+
ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
108+
service = VpcService{client: m.(tccommon.ProviderMeta).GetAPIV3Conn()}
109+
)
105110

106111
id := d.Id()
107112
split := strings.Split(id, "+")
@@ -112,8 +117,5 @@ func resourceTencentCloudEniAttachmentDelete(d *schema.ResourceData, m interface
112117
}
113118

114119
eniId, cvmId := split[0], split[1]
115-
116-
service := VpcService{client: m.(tccommon.ProviderMeta).GetAPIV3Conn()}
117-
118120
return service.DetachEniFromCvm(ctx, eniId, cvmId)
119121
}

tencentcloud/services/vpc/resource_tc_eni_attachment.md

Lines changed: 33 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -3,33 +3,12 @@ Provides a resource to detailed information of attached backend server to an ENI
33
Example Usage
44

55
```hcl
6-
resource "tencentcloud_vpc" "foo" {
7-
name = "ci-test-eni-vpc"
8-
cidr_block = "10.0.0.0/16"
9-
}
10-
11-
resource "tencentcloud_subnet" "foo" {
12-
availability_zone = "ap-guangzhou-3"
13-
name = "ci-test-eni-subnet"
14-
vpc_id = tencentcloud_vpc.foo.id
15-
cidr_block = "10.0.0.0/16"
16-
is_multicast = false
17-
}
18-
19-
resource "tencentcloud_eni" "foo" {
20-
name = "ci-test-eni"
21-
vpc_id = tencentcloud_vpc.foo.id
22-
subnet_id = tencentcloud_subnet.foo.id
23-
description = "eni desc"
24-
ipv4_count = 1
25-
}
26-
27-
data "tencentcloud_images" "my_favorite_image" {
6+
data "tencentcloud_images" "images" {
287
image_type = ["PUBLIC_IMAGE"]
298
os_name = "centos"
309
}
3110
32-
data "tencentcloud_instance_types" "my_favorite_instance_types" {
11+
data "tencentcloud_instance_types" "instance_types" {
3312
filter {
3413
name = "instance-family"
3514
values = ["S3"]
@@ -39,24 +18,44 @@ data "tencentcloud_instance_types" "my_favorite_instance_types" {
3918
memory_size = 1
4019
}
4120
42-
data "tencentcloud_availability_zones" "my_favorite_zones" {
21+
data "tencentcloud_availability_zones" "zones" {}
22+
23+
resource "tencentcloud_vpc" "vpc" {
24+
name = "ci-test-eni-vpc"
25+
cidr_block = "10.0.0.0/16"
26+
}
27+
28+
resource "tencentcloud_subnet" "subnet" {
29+
availability_zone = "ap-guangzhou-3"
30+
name = "ci-test-eni-subnet"
31+
vpc_id = tencentcloud_vpc.vpc.id
32+
cidr_block = "10.0.0.0/16"
33+
is_multicast = false
34+
}
35+
36+
resource "tencentcloud_eni" "eni" {
37+
name = "ci-test-eni"
38+
vpc_id = tencentcloud_vpc.vpc.id
39+
subnet_id = tencentcloud_subnet.subnet.id
40+
description = "eni desc"
41+
ipv4_count = 1
4342
}
4443
45-
resource "tencentcloud_instance" "foo" {
44+
resource "tencentcloud_instance" "example" {
4645
instance_name = "ci-test-eni-attach"
47-
availability_zone = data.tencentcloud_availability_zones.my_favorite_zones.zones.0.name
48-
image_id = data.tencentcloud_images.my_favorite_image.images.0.image_id
49-
instance_type = data.tencentcloud_instance_types.my_favorite_instance_types.instance_types.0.instance_type
46+
availability_zone = data.tencentcloud_availability_zones.zones.zones.0.name
47+
image_id = data.tencentcloud_images.images.images.0.image_id
48+
instance_type = data.tencentcloud_instance_types.instance_types.instance_types.0.instance_type
5049
system_disk_type = "CLOUD_PREMIUM"
5150
disable_security_service = true
5251
disable_monitor_service = true
53-
vpc_id = tencentcloud_vpc.foo.id
54-
subnet_id = tencentcloud_subnet.foo.id
52+
vpc_id = tencentcloud_vpc.vpc.id
53+
subnet_id = tencentcloud_subnet.subnet.id
5554
}
5655
57-
resource "tencentcloud_eni_attachment" "foo" {
58-
eni_id = tencentcloud_eni.foo.id
59-
instance_id = tencentcloud_instance.foo.id
56+
resource "tencentcloud_eni_attachment" "example" {
57+
eni_id = tencentcloud_eni.eni.id
58+
instance_id = tencentcloud_instance.example.id
6059
}
6160
```
6261

@@ -65,5 +64,5 @@ Import
6564
ENI attachment can be imported using the id, e.g.
6665

6766
```
68-
$ terraform import tencentcloud_eni_attachment.foo eni-gtlvkjvz+ins-0h3a5new
67+
terraform import tencentcloud_eni_attachment.example eni-gtlvkjvz+ins-0h3a5new
6968
```

tencentcloud/services/vpc/service_tencentcloud_vpc.go

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3042,6 +3042,10 @@ func (me *VpcService) describeEnis(
30423042
return tccommon.RetryError(err)
30433043
}
30443044

3045+
if response == nil && response.Response == nil && response.Response.NetworkInterfaceSet == nil {
3046+
return resource.NonRetryableError(fmt.Errorf("Read eni list failed, Response is nil."))
3047+
}
3048+
30453049
eniSet := response.Response.NetworkInterfaceSet
30463050
count = len(eniSet)
30473051
enis = append(enis, eniSet...)
@@ -3295,24 +3299,36 @@ func (me *VpcService) AttachEniToCvm(ctx context.Context, eniId, cvmId string) e
32953299
client := me.client.UseVpcClient()
32963300

32973301
attachRequest := vpc.NewAttachNetworkInterfaceRequest()
3302+
attachResponse := vpc.NewAttachNetworkInterfaceResponse()
32983303
attachRequest.NetworkInterfaceId = &eniId
32993304
attachRequest.InstanceId = &cvmId
33003305

33013306
if err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
33023307
ratelimit.Check(attachRequest.GetAction())
3303-
3304-
if _, err := client.AttachNetworkInterface(attachRequest); err != nil {
3308+
result, err := client.AttachNetworkInterface(attachRequest)
3309+
if err != nil {
33053310
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%v]",
33063311
logId, attachRequest.GetAction(), attachRequest.ToJsonString(), err)
33073312
return tccommon.RetryError(err)
33083313
}
33093314

3315+
if result == nil || result.Response == nil || result.Response.RequestId == nil {
3316+
return resource.NonRetryableError(fmt.Errorf("Attach eni to instance failed, Response is nil."))
3317+
}
3318+
3319+
attachResponse = result
33103320
return nil
33113321
}); err != nil {
33123322
log.Printf("[CRITAL]%s attach eni to instance failed, reason: %v", logId, err)
33133323
return err
33143324
}
33153325

3326+
// wait
3327+
err := me.DescribeVpcTaskResult(ctx, attachResponse.Response.RequestId)
3328+
if err != nil {
3329+
return err
3330+
}
3331+
33163332
describeRequest := vpc.NewDescribeNetworkInterfacesRequest()
33173333
describeRequest.NetworkInterfaceIds = []*string{&eniId}
33183334

@@ -3390,13 +3406,14 @@ func (me *VpcService) DetachEniFromCvm(ctx context.Context, eniId, cvmId string)
33903406
client := me.client.UseVpcClient()
33913407

33923408
request := vpc.NewDetachNetworkInterfaceRequest()
3409+
response := vpc.NewDetachNetworkInterfaceResponse()
33933410
request.NetworkInterfaceId = &eniId
33943411
request.InstanceId = &cvmId
33953412

33963413
if err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
33973414
ratelimit.Check(request.GetAction())
3398-
3399-
if _, err := client.DetachNetworkInterface(request); err != nil {
3415+
result, err := client.DetachNetworkInterface(request)
3416+
if err != nil {
34003417
if sdkError, ok := err.(*sdkErrors.TencentCloudSDKError); ok {
34013418
switch sdkError.Code {
34023419
case "UnsupportedOperation.InvalidState":
@@ -3413,12 +3430,23 @@ func (me *VpcService) DetachEniFromCvm(ctx context.Context, eniId, cvmId string)
34133430
return tccommon.RetryError(err)
34143431
}
34153432

3433+
if result == nil || result.Response == nil || result.Response.RequestId == nil {
3434+
return resource.NonRetryableError(fmt.Errorf("Detach eni from instance failed, Response is nil."))
3435+
}
3436+
3437+
response = result
34163438
return nil
34173439
}); err != nil {
34183440
log.Printf("[CRITAL]%s detach eni from instance failed, reason: %v", logId, err)
34193441
return err
34203442
}
34213443

3444+
// wait
3445+
err := me.DescribeVpcTaskResult(ctx, response.Response.RequestId)
3446+
if err != nil {
3447+
return err
3448+
}
3449+
34223450
if err := waitEniDetach(ctx, eniId, client); err != nil {
34233451
log.Printf("[CRITAL]%s detach eni from instance failed, reason: %v", logId, err)
34243452
return err
@@ -5001,29 +5029,33 @@ func (me *VpcService) DescribeVpnGatewayRoutes(ctx context.Context, vpnGatewayId
50015029
}
50025030

50035031
func (me *VpcService) DescribeVpcTaskResult(ctx context.Context, taskId *string) (err error) {
5004-
50055032
logId := tccommon.GetLogId(ctx)
50065033
request := vpc.NewDescribeVpcTaskResultRequest()
50075034
defer func() {
50085035
if err != nil {
50095036
log.Printf("[CRITAL]%s api[%s] fail,reason[%s]", logId, request.GetAction(), err.Error())
50105037
}
50115038
}()
5039+
50125040
request.TaskId = taskId
50135041
err = resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
50145042
ratelimit.Check(request.GetAction())
50155043
response, err := me.client.UseVpcClient().DescribeVpcTaskResult(request)
50165044
if err != nil {
50175045
return tccommon.RetryError(err)
50185046
}
5047+
50195048
if response.Response.Status != nil && *response.Response.Status == VPN_TASK_STATUS_RUNNING {
50205049
return resource.RetryableError(errors.New("VPN task is running"))
50215050
}
5051+
50225052
return nil
50235053
})
5054+
50245055
if err != nil {
50255056
return err
50265057
}
5058+
50275059
return
50285060
}
50295061

0 commit comments

Comments
 (0)