Skip to content

Commit f3fcf0d

Browse files
tongyimingmikatong
andauthored
fix(vpc): [123456789]havip support check_associate (#3508)
* havip support check_associate * add changelog * update --------- Co-authored-by: mikatong <mikatong@tencent.com>
1 parent 1db8272 commit f3fcf0d

File tree

15 files changed

+1722
-435
lines changed

15 files changed

+1722
-435
lines changed

.changelog/3508.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
```release-note:enhancement
2+
resource/tencentcloud_ha_vip: support `check_associate`
3+
```
4+
5+
```release-note:new-resource
6+
tencentcloud_ha_vip_instance_attachment
7+
```

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ require (
4646
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.1107
4747
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cloudaudit v1.0.1033
4848
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cls v1.0.1148
49-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.14
49+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.22
5050
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1206
5151
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp v1.0.762
5252
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.1161
@@ -96,7 +96,7 @@ require (
9696
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tse v1.0.857
9797
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tsf v1.0.674
9898
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vod v1.0.860
99-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc v1.0.1154
99+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc v1.1.14
100100
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.1170
101101
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wedata v1.0.792
102102
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wss v1.0.199

go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -959,6 +959,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.13 h1:xQc87
959959
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.13/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
960960
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.14 h1:+I+n8wDpnG95yLnV3rtT4MUs8gdwgbpuZEVKQhSxqxs=
961961
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.14/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
962+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.22 h1:1unTmvNXynDN0mOZSWh9tL5Wp9Rb5paMGwFvua+HHoI=
963+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.22/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
962964
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/controlcenter v1.0.993 h1:WlPgXldQCxt7qi5Xrc6j6zTrsXWzN5BcOGs7Irq7fwQ=
963965
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/controlcenter v1.0.993/go.mod h1:Z9U8zNtyuyKhjS0698wqsrG/kLx1TQ5CEixXBwVe7xY=
964966
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/csip v1.0.860 h1:F3esKBIT3HW9+7Gt8cVgf8X06VdGIczpgLBUECzSEzU=
@@ -1094,6 +1096,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vod v1.0.860 h1:vW2NgAH
10941096
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vod v1.0.860/go.mod h1:uCkDh/AW/tb8JGq5b2kqLjqZuhCFR+6oTsq1SrrvT44=
10951097
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc v1.0.1154 h1:PpVmHKrNt9fqIuH2wVKRPAquTM9quK2LduDAoVH39gE=
10961098
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc v1.0.1154/go.mod h1:DKh7HURi/7PY/UMjeuLcAxh1jEDdfYu9ptw12hDTw04=
1099+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc v1.1.14 h1:RsontLM/fwcRJex/HlNj3/BGwh6HWuUjcgxeRnuL9KY=
1100+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc v1.1.14/go.mod h1:qvuXI7MmzMaUBhGaQhGdZU7QLp3hKS53a3otvIz4CYg=
10971101
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.1170 h1:kcQCWuI9zOkZgL5CK66HNAJmSWCSJxRrDxXT+j02CeE=
10981102
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.1170/go.mod h1:vTukVfThbBIc4lOf4eq/q51eEk78oZUJd2lAoJBOJwI=
10991103
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wedata v1.0.792 h1:NLgKNOIHWa38AmW7dyfI9Jlcp2Kr9VRD94f48pPNmxM=

tencentcloud/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2340,6 +2340,7 @@ func Provider() *schema.Provider {
23402340
"tencentcloud_elastic_public_ipv6": vpc.ResourceTencentCloudElasticPublicIpv6(),
23412341
"tencentcloud_classic_elastic_public_ipv6": vpc.ResourceTencentCloudClassicElasticPublicIpv6(),
23422342
"tencentcloud_elastic_public_ipv6_attachment": vpc.ResourceTencentCloudElasticPublicIpv6Attachment(),
2343+
"tencentcloud_ha_vip_instance_attachment": vpc.ResourceTencentCloudHaVipInstanceAttachment(),
23432344
"tencentcloud_csip_risk_center": csip.ResourceTencentCloudCsipRiskCenter(),
23442345
"tencentcloud_organization_org_share_unit_member": tco.ResourceTencentCloudOrganizationOrgShareUnitMember(),
23452346
"tencentcloud_organization_org_share_unit": tco.ResourceTencentCloudOrganizationOrgShareUnit(),

tencentcloud/services/vpc/resource_tc_ha_vip.go

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,13 @@ func ResourceTencentCloudHaVip() *schema.Resource {
4444
ForceNew: true,
4545
Description: "Subnet ID.",
4646
},
47+
"check_associate": {
48+
Type: schema.TypeBool,
49+
Optional: true,
50+
Computed: true,
51+
ForceNew: true,
52+
Description: "Whether to enable verification of the submachine or network card range during HAVIP drift. Not enabled by default.",
53+
},
4754
"vip": {
4855
Type: schema.TypeString,
4956
Optional: true,
@@ -94,6 +101,9 @@ func resourceTencentCloudHaVipCreate(d *schema.ResourceData, meta interface{}) e
94101
if v, ok := d.GetOk("vip"); ok {
95102
request.Vip = helper.String(v.(string))
96103
}
104+
if v, ok := d.GetOkExists("check_associate"); ok {
105+
request.CheckAssociate = helper.Bool(v.(bool))
106+
}
97107
var response *vpc.CreateHaVipResponse
98108
err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
99109
result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().CreateHaVip(request)
@@ -146,16 +156,20 @@ func resourceTencentCloudHaVipRead(d *schema.ResourceData, meta interface{}) err
146156
}
147157

148158
haVip := response.Response.HaVipSet[0]
149-
150-
_ = d.Set("name", *haVip.HaVipName)
151-
_ = d.Set("create_time", *haVip.CreatedTime)
152-
_ = d.Set("vip", *haVip.Vip)
153-
_ = d.Set("vpc_id", *haVip.VpcId)
154-
_ = d.Set("subnet_id", *haVip.SubnetId)
155-
_ = d.Set("address_ip", *haVip.AddressIp)
156-
_ = d.Set("state", *haVip.State)
157-
_ = d.Set("network_interface_id", *haVip.NetworkInterfaceId)
158-
_ = d.Set("instance_id", *haVip.InstanceId)
159+
if haVip != nil {
160+
_ = d.Set("name", haVip.HaVipName)
161+
_ = d.Set("create_time", haVip.CreatedTime)
162+
_ = d.Set("vip", haVip.Vip)
163+
_ = d.Set("vpc_id", haVip.VpcId)
164+
_ = d.Set("subnet_id", haVip.SubnetId)
165+
_ = d.Set("address_ip", haVip.AddressIp)
166+
_ = d.Set("state", haVip.State)
167+
_ = d.Set("network_interface_id", haVip.NetworkInterfaceId)
168+
_ = d.Set("instance_id", haVip.InstanceId)
169+
if haVip.CheckAssociate != nil {
170+
_ = d.Set("check_associate", *haVip.CheckAssociate)
171+
}
172+
}
159173

160174
return nil
161175
}
Lines changed: 193 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,193 @@
1+
package vpc
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"log"
7+
"strings"
8+
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
10+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
11+
vpc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312"
12+
13+
tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
14+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
15+
)
16+
17+
func ResourceTencentCloudHaVipInstanceAttachment() *schema.Resource {
18+
return &schema.Resource{
19+
Create: resourceTencentCloudHaVipInstanceAttachmentCreate,
20+
Read: resourceTencentCloudHaVipInstanceAttachmentRead,
21+
Delete: resourceTencentCloudHaVipInstanceAttachmentDelete,
22+
Importer: &schema.ResourceImporter{
23+
State: schema.ImportStatePassthrough,
24+
},
25+
Schema: map[string]*schema.Schema{
26+
"instance_id": {
27+
Type: schema.TypeString,
28+
Required: true,
29+
ForceNew: true,
30+
Description: "The unique ID of the slave machine or network card to which HaVip is bound.",
31+
},
32+
"ha_vip_id": {
33+
Type: schema.TypeString,
34+
Optional: true,
35+
ForceNew: true,
36+
Description: "Unique ID of the HaVip instance.",
37+
},
38+
"instance_type": {
39+
Type: schema.TypeString,
40+
Optional: true,
41+
ForceNew: true,
42+
Description: "The type of HaVip binding. Values:CVM, ENI.",
43+
},
44+
},
45+
}
46+
}
47+
48+
func resourceTencentCloudHaVipInstanceAttachmentCreate(d *schema.ResourceData, meta interface{}) error {
49+
defer tccommon.LogElapsed("resource.tencentcloud_ha_vip_instance_attachment.create")()
50+
defer tccommon.InconsistentCheck(d, meta)()
51+
52+
logId := tccommon.GetLogId(tccommon.ContextNil)
53+
54+
ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
55+
56+
var (
57+
instanceId string
58+
haVipId string
59+
instanceType string
60+
)
61+
var (
62+
request = vpc.NewAssociateHaVipInstanceRequest()
63+
response = vpc.NewAssociateHaVipInstanceResponse()
64+
)
65+
66+
instanceId = d.Get("instance_id").(string)
67+
haVipId = d.Get("ha_vip_id").(string)
68+
instanceType = d.Get("instance_type").(string)
69+
70+
request.HaVipAssociationSet = []*vpc.HaVipAssociation{
71+
{
72+
HaVipId: helper.String(haVipId),
73+
InstanceType: helper.String(instanceType),
74+
InstanceId: helper.String(instanceId),
75+
},
76+
}
77+
78+
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
79+
result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().AssociateHaVipInstanceWithContext(ctx, request)
80+
if e != nil {
81+
return tccommon.RetryError(e)
82+
} else {
83+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
84+
}
85+
response = result
86+
return nil
87+
})
88+
if err != nil {
89+
log.Printf("[CRITAL]%s create ha vip instance attachment failed, reason:%+v", logId, err)
90+
return err
91+
}
92+
93+
_ = response
94+
95+
d.SetId(strings.Join([]string{haVipId, instanceId}, tccommon.FILED_SP))
96+
97+
return resourceTencentCloudHaVipInstanceAttachmentRead(d, meta)
98+
}
99+
100+
func resourceTencentCloudHaVipInstanceAttachmentRead(d *schema.ResourceData, meta interface{}) error {
101+
defer tccommon.LogElapsed("resource.tencentcloud_ha_vip_instance_attachment.read")()
102+
defer tccommon.InconsistentCheck(d, meta)()
103+
104+
logId := tccommon.GetLogId(tccommon.ContextNil)
105+
106+
ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
107+
108+
service := VpcService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
109+
110+
idSplit := strings.Split(d.Id(), tccommon.FILED_SP)
111+
if len(idSplit) != 2 {
112+
return fmt.Errorf("id is broken,%s", d.Id())
113+
}
114+
haVipId := idSplit[0]
115+
instanceId := idSplit[1]
116+
117+
var haVips []*vpc.HaVip
118+
filters := map[string]string{
119+
"havip-id": haVipId,
120+
"havip-association.instance-id": instanceId,
121+
}
122+
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
123+
result, e := service.DescribeHaVipByFilter(ctx, filters)
124+
if e != nil {
125+
return tccommon.RetryError(e)
126+
}
127+
haVips = result
128+
return nil
129+
})
130+
if err != nil {
131+
return err
132+
}
133+
134+
if len(haVips) == 0 || len(haVips[0].HaVipAssociationSet) == 0 {
135+
d.SetId("")
136+
log.Printf("[WARN]%s resource `ha_vip_instance_attachment` [%s] not found, please check if it has been deleted.\n", logId, d.Id())
137+
return nil
138+
}
139+
140+
_ = d.Set("ha_vip_id", haVips[0].HaVipAssociationSet[0].HaVipId)
141+
_ = d.Set("instance_type", haVips[0].HaVipAssociationSet[0].InstanceType)
142+
_ = d.Set("instance_id", haVips[0].HaVipAssociationSet[0].InstanceId)
143+
144+
_ = instanceId
145+
_ = haVipId
146+
return nil
147+
}
148+
149+
func resourceTencentCloudHaVipInstanceAttachmentDelete(d *schema.ResourceData, meta interface{}) error {
150+
defer tccommon.LogElapsed("resource.tencentcloud_ha_vip_instance_attachment.delete")()
151+
defer tccommon.InconsistentCheck(d, meta)()
152+
153+
logId := tccommon.GetLogId(tccommon.ContextNil)
154+
ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
155+
156+
idSplit := strings.Split(d.Id(), tccommon.FILED_SP)
157+
if len(idSplit) != 2 {
158+
return fmt.Errorf("id is broken,%s", d.Id())
159+
}
160+
haVipId := idSplit[0]
161+
instanceId := idSplit[1]
162+
163+
var (
164+
request = vpc.NewDisassociateHaVipInstanceRequest()
165+
response = vpc.NewDisassociateHaVipInstanceResponse()
166+
)
167+
168+
request.HaVipAssociationSet = []*vpc.HaVipAssociation{
169+
{
170+
HaVipId: helper.String(haVipId),
171+
InstanceId: helper.String(instanceId),
172+
},
173+
}
174+
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
175+
result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().DisassociateHaVipInstanceWithContext(ctx, request)
176+
if e != nil {
177+
return tccommon.RetryError(e)
178+
} else {
179+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
180+
}
181+
response = result
182+
return nil
183+
})
184+
if err != nil {
185+
log.Printf("[CRITAL]%s delete ha vip instance attachment failed, reason:%+v", logId, err)
186+
return err
187+
}
188+
189+
_ = response
190+
_ = instanceId
191+
_ = haVipId
192+
return nil
193+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
Provides a resource to create a vpc ha_vip_instance_attachment
2+
3+
Example Usage
4+
5+
```hcl
6+
resource "tencentcloud_ha_vip_instance_attachment" "ha_vip_instance_attachment" {
7+
instance_id = "eni-xxxxxx"
8+
ha_vip_id = "havip-xxxxxx"
9+
instance_type = "ENI"
10+
}
11+
```
12+
13+
Import
14+
15+
vpc ha_vip_instance_attachment can be imported using the id(${haVipId}#${instanceType}#${instanceId}), e.g.
16+
17+
```
18+
terraform import tencentcloud_ha_vip_instance_attachment.ha_vip_instance_attachment ha_vip_instance_attachment_id
19+
```
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package vpc_test
2+
3+
import (
4+
"testing"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
7+
8+
tcacctest "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/acctest"
9+
)
10+
11+
func TestAccTencentCloudHaVipInstanceAttachmentResource_basic(t *testing.T) {
12+
t.Parallel()
13+
resource.Test(t, resource.TestCase{
14+
PreCheck: func() {
15+
tcacctest.AccPreCheck(t)
16+
},
17+
Providers: tcacctest.AccProviders,
18+
Steps: []resource.TestStep{{
19+
Config: testAccHaVipInstanceAttachmentEni,
20+
Check: resource.ComposeTestCheckFunc(
21+
resource.TestCheckResourceAttrSet("tencentcloud_ha_vip_instance_attachment.ha_vip_instance_attachment", "id"),
22+
resource.TestCheckResourceAttr("tencentcloud_ha_vip_instance_attachment.ha_vip_instance_attachment", "instance_id", "eni-mdsbxqeb"),
23+
resource.TestCheckResourceAttrSet("tencentcloud_ha_vip_instance_attachment.ha_vip_instance_attachment", "ha_vip_id"),
24+
resource.TestCheckResourceAttr("tencentcloud_ha_vip_instance_attachment.ha_vip_instance_attachment", "instance_type", "ENI"),
25+
),
26+
}, {
27+
ResourceName: "tencentcloud_ha_vip_instance_attachment.ha_vip_instance_attachment",
28+
ImportState: true,
29+
ImportStateVerify: true,
30+
}},
31+
})
32+
}
33+
34+
const testAccHaVipInstanceAttachmentEni = `
35+
36+
resource "tencentcloud_ha_vip" "foo" {
37+
name = "terraform_test"
38+
vpc_id = "vpc-axrsmmrv"
39+
subnet_id = "subnet-kxaxknmg"
40+
vip = "172.16.144.10"
41+
check_associate = true
42+
}
43+
resource "tencentcloud_ha_vip_instance_attachment" "ha_vip_instance_attachment" {
44+
instance_id = "eni-mdsbxqeb"
45+
ha_vip_id = tencentcloud_ha_vip.foo.id
46+
instance_type = "ENI"
47+
}
48+
`

0 commit comments

Comments
 (0)