@@ -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
3334func 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+
171261func 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+ }
0 commit comments