@@ -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,75 @@ func resourceTencentCLoudTcrVpcAttachmentDelete(d *schema.ResourceData, meta int
222312
223313 return nil
224314}
315+
316+ func WaitForAccessIpExists (ctx context.Context , tcrService TCRService , instanceId string , vpcId string , subnetId string ) (accessIp string , errRet error ) {
317+ errRet = resource .Retry (readRetryTimeout , func () * resource.RetryError {
318+ result , has , inErr := tcrService .DescribeTCRVPCAttachmentById (ctx , instanceId , vpcId , subnetId )
319+ if inErr != nil {
320+ return retryError (inErr )
321+ }
322+ if ! has {
323+ inErr = fmt .Errorf ("%s create tcr vpcAccess %s fail, vpcAccess is not exists from SDK DescribeTcrVpcAttachmentById" , instanceId , vpcId )
324+ return resource .RetryableError (inErr )
325+ }
326+
327+ if * result .AccessIp == "" {
328+ inErr = fmt .Errorf ("%s get tcr accessIp fail, accessIp is not exists from SDK DescribeTcrVpcAttachmentById" , vpcId )
329+ return resource .RetryableError (inErr )
330+ }
331+ accessIp = * result .AccessIp
332+ return nil
333+ })
334+ return
335+ }
336+
337+ func EnableTcrVpcDns (ctx context.Context , tcrService TCRService , instanceId string , vpcId string , subnetId string , usePublicDomain bool ) error {
338+ accessIp , err := WaitForAccessIpExists (ctx , tcrService , instanceId , vpcId , subnetId )
339+ if err != nil {
340+ return err
341+ }
342+
343+ outErr := resource .Retry (writeRetryTimeout , func () * resource.RetryError {
344+ inErr := tcrService .CreateTcrVpcDns (ctx , instanceId , vpcId , accessIp , usePublicDomain )
345+ if inErr != nil {
346+ return retryError (inErr )
347+ }
348+ return nil
349+ })
350+
351+ return outErr
352+ }
353+
354+ func DisableTcrVpcDns (ctx context.Context , tcrService TCRService , instanceId string , vpcId string , subnetId string , usePublicDomain bool ) error {
355+ accessIp , err := WaitForAccessIpExists (ctx , tcrService , instanceId , vpcId , subnetId )
356+ if err != nil {
357+ return err
358+ }
359+
360+ outErr := resource .Retry (writeRetryTimeout , func () * resource.RetryError {
361+ inErr := tcrService .DeleteTcrVpcDns (ctx , instanceId , vpcId , accessIp , usePublicDomain )
362+ if inErr != nil {
363+ return retryError (inErr )
364+ }
365+ return nil
366+ })
367+
368+ return outErr
369+ }
370+
371+ func GetDnsStatus (ctx context.Context , tcrService TCRService , instanceId string , vpcId string , accessIp string , usePublicDomain bool ) (status * tcr.VpcPrivateDomainStatus , err error ) {
372+ err = resource .Retry (readRetryTimeout , func () * resource.RetryError {
373+ result , has , inErr := tcrService .DescribeTcrVpcDnsById (ctx , instanceId , vpcId , accessIp , usePublicDomain )
374+ if inErr != nil {
375+ return retryError (inErr )
376+ }
377+ if ! has {
378+ inErr = fmt .Errorf ("%s get tcr vpc dns status fail, vpc dns is not exists from SDK DescribeTcrVpcDnsById" , instanceId )
379+ return resource .RetryableError (inErr )
380+ }
381+ status = result
382+ return nil
383+ })
384+
385+ return
386+ }
0 commit comments