Skip to content

Commit e119086

Browse files
committed
add tcr vpc dns
1 parent a888f21 commit e119086

7 files changed

+300
-0
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
11
## 1.54.1 (Unreleased)
2+
3+
ENHANCEMENTS:
4+
5+
* Resource `tencentcloud_tcr_vpc_attachment` add `enable_public_domain_dns`, `enable_vpc_domain_dns` to set whether to enable dns.
6+
* Data Source `tencentcloud_tcr_vpc_attachments` add `enable_public_domain_dns`, `enable_vpc_domain_dns`.
7+
28
## 1.54.0 (March 22, 2021)
39

410
FEATURES:

tencentcloud/data_source_tc_tcr_vpc_attachments.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,16 @@ func dataSourceTencentCloudTCRVPCAttachments() *schema.Resource {
7272
Computed: true,
7373
Description: "IP address of this VPC access.",
7474
},
75+
"enable_public_domain_dns": {
76+
Type: schema.TypeBool,
77+
Computed: true,
78+
Description: "Whether to enable public domain dns.",
79+
},
80+
"enable_vpc_domain_dns": {
81+
Type: schema.TypeBool,
82+
Computed: true,
83+
Description: "Whether to enable vpc domain dns.",
84+
},
7585
},
7686
},
7787
},
@@ -120,6 +130,19 @@ func dataSourceTencentCloudTCRVPCAttachmentsRead(d *schema.ResourceData, meta in
120130
"status": vpcAccess.Status,
121131
"access_ip": vpcAccess.AccessIp,
122132
}
133+
if *vpcAccess.AccessIp != "" {
134+
publicDomainDnsStatus, err := GetDnsStatus(ctx, tcrService, instanceId, *vpcAccess.VpcId, *vpcAccess.AccessIp, true)
135+
if err != nil {
136+
return err
137+
}
138+
mapping["enable_public_domain_dns"] = *publicDomainDnsStatus.Status == TCR_VPC_DNS_STATUS_ENABLED
139+
140+
vpcDomainDnsStatus, err := GetDnsStatus(ctx, tcrService, instanceId, *vpcAccess.VpcId, *vpcAccess.AccessIp, false)
141+
if err != nil {
142+
return err
143+
}
144+
mapping["enable_vpc_domain_dns"] = *vpcDomainDnsStatus.Status == TCR_VPC_DNS_STATUS_ENABLED
145+
}
123146

124147
vpcAccessList = append(vpcAccessList, mapping)
125148
ids = append(ids, instanceId+FILED_SP+*vpcAccess.VpcId+FILED_SP+*vpcAccess.SubnetId)

tencentcloud/extension_tcr.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package tencentcloud
2+
3+
const (
4+
TCR_VPC_DNS_STATUS_ENABLED = "ENABLED"
5+
TCR_VPC_DNS_STATUS_DISABLED = "DISABLED"
6+
)

tencentcloud/resource_tc_tcr_vpc_attachment.go

Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,14 @@ import (
2828

2929
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
3030
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
31+
tcr "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tcr/v20190924"
3132
)
3233

3334
func resourceTencentCloudTcrVpcAttachment() *schema.Resource {
3435
return &schema.Resource{
3536
Create: resourceTencentCloudTcrVpcAttachmentCreate,
3637
Read: resourceTencentCloudTcrVpcAttachmentRead,
38+
Update: resourceTencentCloudTcrVpcAttachmentUpdate,
3739
Delete: resourceTencentCLoudTcrVpcAttachmentDelete,
3840
Importer: &schema.ResourceImporter{
3941
State: schema.ImportStatePassthrough,
@@ -58,6 +60,18 @@ func resourceTencentCloudTcrVpcAttachment() *schema.Resource {
5860
ForceNew: true,
5961
Description: "ID of subnet.",
6062
},
63+
"enable_public_domain_dns": {
64+
Type: schema.TypeBool,
65+
Optional: true,
66+
Default: false,
67+
Description: "Whether to enable public domain dns. Default value is `false`.",
68+
},
69+
"enable_vpc_domain_dns": {
70+
Type: schema.TypeBool,
71+
Optional: true,
72+
Default: false,
73+
Description: "Whether to enable vpc domain dns. Default value is `false`.",
74+
},
6175
//computed
6276
"status": {
6377
Type: schema.TypeString,
@@ -120,6 +134,19 @@ func resourceTencentCloudTcrVpcAttachmentCreate(d *schema.ResourceData, meta int
120134
return outErr
121135
}
122136

137+
if enablePublicDomainDns := d.Get("enable_public_domain_dns").(bool); enablePublicDomainDns {
138+
err := EnableTcrVpcDns(ctx, tcrService, instanceId, vpcId, subnetId, true)
139+
if err != nil {
140+
return err
141+
}
142+
}
143+
144+
if enableVpcDomainDns := d.Get("enable_vpc_domain_dns").(bool); enableVpcDomainDns {
145+
err := EnableTcrVpcDns(ctx, tcrService, instanceId, vpcId, subnetId, false)
146+
if err != nil {
147+
return err
148+
}
149+
}
123150
return resourceTencentCloudTcrVpcAttachmentRead(d, meta)
124151
}
125152

@@ -165,9 +192,72 @@ func resourceTencentCloudTcrVpcAttachmentRead(d *schema.ResourceData, meta inter
165192
_ = d.Set("vpc_id", vpcId)
166193
_ = d.Set("subnet_id", subnetId)
167194

195+
if *vpcAccess.AccessIp != "" {
196+
publicDomainDnsStatus, err := GetDnsStatus(ctx, tcrService, instanceId, vpcId, *vpcAccess.AccessIp, true)
197+
if err != nil {
198+
return err
199+
}
200+
_ = d.Set("enable_public_domain_dns", *publicDomainDnsStatus.Status == TCR_VPC_DNS_STATUS_ENABLED)
201+
202+
vpcDomainDnsStatus, err := GetDnsStatus(ctx, tcrService, instanceId, vpcId, *vpcAccess.AccessIp, false)
203+
if err != nil {
204+
return err
205+
}
206+
_ = d.Set("enable_vpc_domain_dns", *vpcDomainDnsStatus.Status == TCR_VPC_DNS_STATUS_ENABLED)
207+
}
208+
168209
return nil
169210
}
170211

212+
func resourceTencentCloudTcrVpcAttachmentUpdate(d *schema.ResourceData, meta interface{}) error {
213+
defer logElapsed("resource.tencentcloud_tcr_vpc_attachment.update")()
214+
215+
logId := getLogId(contextNil)
216+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
217+
218+
tcrService := TCRService{client: meta.(*TencentCloudClient).apiV3Conn}
219+
220+
var (
221+
instanceId = d.Get("instance_id").(string)
222+
vpcId = d.Get("vpc_id").(string)
223+
subnetId = d.Get("subnet_id").(string)
224+
)
225+
226+
d.Partial(true)
227+
if d.HasChange("enable_public_domain_dns") {
228+
if isEnabled := d.Get("enable_public_domain_dns").(bool); isEnabled {
229+
err := EnableTcrVpcDns(ctx, tcrService, instanceId, vpcId, subnetId, true)
230+
if err != nil {
231+
return err
232+
}
233+
} else {
234+
err := DisableTcrVpcDns(ctx, tcrService, instanceId, vpcId, subnetId, true)
235+
if err != nil {
236+
return err
237+
}
238+
}
239+
d.SetPartial("enable_public_domain_dns")
240+
}
241+
242+
if d.HasChange("enable_vpc_domain_dns") {
243+
if isEnabled := d.Get("enable_vpc_domain_dns").(bool); isEnabled {
244+
err := EnableTcrVpcDns(ctx, tcrService, instanceId, vpcId, subnetId, false)
245+
if err != nil {
246+
return err
247+
}
248+
} else {
249+
err := DisableTcrVpcDns(ctx, tcrService, instanceId, vpcId, subnetId, false)
250+
if err != nil {
251+
return err
252+
}
253+
}
254+
d.SetPartial("enable_vpc_domain_dns")
255+
}
256+
d.Partial(false)
257+
258+
return resourceTencentCloudTcrVpcAttachmentRead(d, meta)
259+
}
260+
171261
func resourceTencentCLoudTcrVpcAttachmentDelete(d *schema.ResourceData, meta interface{}) error {
172262
defer logElapsed("resource.tencentcloud_tcr_vpc_attachment.delete")()
173263

@@ -222,3 +312,88 @@ func resourceTencentCLoudTcrVpcAttachmentDelete(d *schema.ResourceData, meta int
222312

223313
return nil
224314
}
315+
316+
func EnableTcrVpcDns(ctx context.Context, tcrService TCRService, instanceId string, vpcId string, subnetId string, usePublicDomain bool) error {
317+
var vpcAccess *tcr.AccessVpc
318+
outErr := resource.Retry(readRetryTimeout, func() *resource.RetryError {
319+
result, has, inErr := tcrService.DescribeTCRVPCAttachmentById(ctx, instanceId, vpcId, subnetId)
320+
if inErr != nil {
321+
return retryError(inErr)
322+
}
323+
if !has {
324+
inErr = fmt.Errorf("%s create tcr vpcAccess %s fail, vpcAccess is not exists from SDK DescribeTcrVpcAttachmentById", instanceId, vpcId)
325+
return resource.RetryableError(inErr)
326+
}
327+
328+
if *result.AccessIp == "" {
329+
inErr = fmt.Errorf("%s get tcr accessIp fail, accessIp is not exists from SDK DescribeTcrVpcAttachmentById", vpcId)
330+
return resource.RetryableError(inErr)
331+
}
332+
vpcAccess = result
333+
return nil
334+
})
335+
if outErr != nil {
336+
return outErr
337+
}
338+
339+
outErr = resource.Retry(writeRetryTimeout, func() *resource.RetryError {
340+
inErr := tcrService.CreateTcrVpcDns(ctx, instanceId, vpcId, *vpcAccess.AccessIp, usePublicDomain)
341+
if inErr != nil {
342+
return retryError(inErr)
343+
}
344+
return nil
345+
})
346+
347+
return outErr
348+
}
349+
350+
func DisableTcrVpcDns(ctx context.Context, tcrService TCRService, instanceId string, vpcId string, subnetId string, usePublicDomain bool) error {
351+
var vpcAccess *tcr.AccessVpc
352+
outErr := resource.Retry(readRetryTimeout, func() *resource.RetryError {
353+
result, has, inErr := tcrService.DescribeTCRVPCAttachmentById(ctx, instanceId, vpcId, subnetId)
354+
if inErr != nil {
355+
return retryError(inErr)
356+
}
357+
if !has {
358+
inErr = fmt.Errorf("%s create tcr vpcAccess %s fail, vpcAccess is not exists from SDK DescribeTcrVpcAttachmentById", instanceId, vpcId)
359+
return resource.RetryableError(inErr)
360+
}
361+
362+
if *result.AccessIp == "" {
363+
inErr = fmt.Errorf("%s get tcr accessIp fail, accessIp is not exists from SDK DescribeTcrVpcAttachmentById", vpcId)
364+
return resource.RetryableError(inErr)
365+
}
366+
vpcAccess = result
367+
return nil
368+
})
369+
if outErr != nil {
370+
return outErr
371+
}
372+
373+
outErr = resource.Retry(writeRetryTimeout, func() *resource.RetryError {
374+
inErr := tcrService.DeleteTcrVpcDns(ctx, instanceId, vpcId, *vpcAccess.AccessIp, usePublicDomain)
375+
if inErr != nil {
376+
return retryError(inErr)
377+
}
378+
return nil
379+
})
380+
381+
return outErr
382+
}
383+
384+
func GetDnsStatus(ctx context.Context, tcrService TCRService, instanceId string, vpcId string, accessIp string, usePublicDomain bool) (status *tcr.VpcPrivateDomainStatus, err error) {
385+
err = resource.Retry(readRetryTimeout, func() *resource.RetryError {
386+
result, has, inErr := tcrService.DescribeTcrVpcDnsById(ctx, instanceId, vpcId, accessIp, usePublicDomain)
387+
if inErr != nil {
388+
return retryError(inErr)
389+
}
390+
if !has {
391+
inErr = fmt.Errorf("%s get tcr vpc dns status fail, vpc dns is not exists from SDK DescribeTcrVpcDnsById", instanceId)
392+
return resource.RetryableError(inErr)
393+
}
394+
status = result
395+
return nil
396+
})
397+
398+
return
399+
}

tencentcloud/service_tencentcloud_tcr.go

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -687,3 +687,89 @@ func (me *TCRService) DescribeTCRVPCAttachmentById(ctx context.Context, instance
687687
has = true
688688
return
689689
}
690+
691+
func (me *TCRService) CreateTcrVpcDns(ctx context.Context, instanceId string, vpcId string, accessIp string, usePublicDomain bool) (errRet error) {
692+
logId := getLogId(ctx)
693+
request := tcr.NewCreateInternalEndpointDnsRequest()
694+
defer func() {
695+
if errRet != nil {
696+
log.Printf("[CRITAL]%s api[%s] fail,reason[%s]", logId, request.GetAction(), errRet.Error())
697+
}
698+
}()
699+
request.InstanceId = &instanceId
700+
request.VpcId = &vpcId
701+
request.EniLBIp = &accessIp
702+
request.UsePublicDomain = &usePublicDomain
703+
704+
ratelimit.Check(request.GetAction())
705+
response, err := me.client.UseTCRClient().CreateInternalEndpointDns(request)
706+
if err != nil {
707+
errRet = err
708+
return
709+
}
710+
if response == nil || response.Response == nil {
711+
errRet = fmt.Errorf("TencentCloud SDK return nil response, %s", request.GetAction())
712+
}
713+
return
714+
}
715+
716+
func (me *TCRService) DeleteTcrVpcDns(ctx context.Context, instanceId string, vpcId string, accessIp string, usePublicDomain bool) (errRet error) {
717+
logId := getLogId(ctx)
718+
request := tcr.NewDeleteInternalEndpointDnsRequest()
719+
defer func() {
720+
if errRet != nil {
721+
log.Printf("[CRITAL]%s api[%s] fail,reason[%s]", logId, request.GetAction(), errRet.Error())
722+
}
723+
}()
724+
request.InstanceId = &instanceId
725+
request.VpcId = &vpcId
726+
request.EniLBIp = &accessIp
727+
request.UsePublicDomain = &usePublicDomain
728+
729+
ratelimit.Check(request.GetAction())
730+
response, err := me.client.UseTCRClient().DeleteInternalEndpointDns(request)
731+
if err != nil {
732+
errRet = err
733+
return
734+
}
735+
if response == nil || response.Response == nil {
736+
errRet = fmt.Errorf("TencentCloud SDK return nil response, %s", request.GetAction())
737+
}
738+
return
739+
}
740+
741+
func (me *TCRService) DescribeTcrVpcDnsById(ctx context.Context, instanceId string, vpcId string, accessIp string, usePublicDomain bool) (vpcPrivateDomainStatus *tcr.VpcPrivateDomainStatus, has bool, errRet error) {
742+
logId := getLogId(ctx)
743+
request := tcr.NewDescribeInternalEndpointDnsStatusRequest()
744+
defer func() {
745+
if errRet != nil {
746+
log.Printf("[CRITAL]%s api[%s] fail,reason[%s]", logId, request.GetAction(), errRet.Error())
747+
}
748+
}()
749+
request.VpcSet = append(request.VpcSet, &tcr.VpcAndDomainInfo{
750+
InstanceId: &instanceId,
751+
VpcId: &vpcId,
752+
EniLBIp: &accessIp,
753+
UsePublicDomain: &usePublicDomain,
754+
})
755+
756+
ratelimit.Check(request.GetAction())
757+
response, err := me.client.UseTCRClient().DescribeInternalEndpointDnsStatus(request)
758+
if err != nil {
759+
errRet = err
760+
return
761+
}
762+
if response == nil || response.Response == nil {
763+
errRet = fmt.Errorf("TencentCloud SDK return nil response, %s", request.GetAction())
764+
}
765+
if len(response.Response.VpcSet) == 0 {
766+
return nil, has, nil
767+
} else if len(response.Response.VpcSet) > 1 {
768+
errRet = fmt.Errorf("TencentCloud SDK return more than 1 vpcPrivateDomainStatus, %s %s %s %t", instanceId, vpcId, accessIp, usePublicDomain)
769+
return
770+
}
771+
772+
vpcPrivateDomainStatus = response.Response.VpcSet[0]
773+
has = true
774+
return
775+
}

website/docs/d/tcr_vpc_attachments.html.markdown

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ In addition to all arguments above, the following attributes are exported:
3434

3535
* `vpc_attachment_list` - Information list of the dedicated TCR namespaces.
3636
* `access_ip` - IP address of this VPC access.
37+
* `enable_public_domain_dns` - Whether to enable public domain dns.
38+
* `enable_vpc_domain_dns` - Whether to enable vpc domain dns.
3739
* `status` - Status of this VPC access.
3840
* `subnet_id` - ID of subnet.
3941
* `vpc_id` - ID of VPC.

website/docs/r/tcr_vpc_attachment.html.markdown

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ The following arguments are supported:
2828
* `instance_id` - (Required, ForceNew) ID of the TCR instance.
2929
* `subnet_id` - (Required, ForceNew) ID of subnet.
3030
* `vpc_id` - (Required, ForceNew) ID of VPC.
31+
* `enable_public_domain_dns` - (Optional) Whether to enable public domain dns. Default value is `false`.
32+
* `enable_vpc_domain_dns` - (Optional) Whether to enable vpc domain dns. Default value is `false`.
3133

3234
## Attributes Reference
3335

0 commit comments

Comments
 (0)