@@ -28,12 +28,14 @@ import (
28
28
29
29
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
30
30
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
31
+ tcr "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tcr/v20190924"
31
32
)
32
33
33
34
func resourceTencentCloudTcrVpcAttachment () * schema.Resource {
34
35
return & schema.Resource {
35
36
Create : resourceTencentCloudTcrVpcAttachmentCreate ,
36
37
Read : resourceTencentCloudTcrVpcAttachmentRead ,
38
+ Update : resourceTencentCloudTcrVpcAttachmentUpdate ,
37
39
Delete : resourceTencentCLoudTcrVpcAttachmentDelete ,
38
40
Importer : & schema.ResourceImporter {
39
41
State : schema .ImportStatePassthrough ,
@@ -58,6 +60,18 @@ func resourceTencentCloudTcrVpcAttachment() *schema.Resource {
58
60
ForceNew : true ,
59
61
Description : "ID of subnet." ,
60
62
},
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
+ },
61
75
//computed
62
76
"status" : {
63
77
Type : schema .TypeString ,
@@ -120,6 +134,19 @@ func resourceTencentCloudTcrVpcAttachmentCreate(d *schema.ResourceData, meta int
120
134
return outErr
121
135
}
122
136
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
+ }
123
150
return resourceTencentCloudTcrVpcAttachmentRead (d , meta )
124
151
}
125
152
@@ -165,9 +192,72 @@ func resourceTencentCloudTcrVpcAttachmentRead(d *schema.ResourceData, meta inter
165
192
_ = d .Set ("vpc_id" , vpcId )
166
193
_ = d .Set ("subnet_id" , subnetId )
167
194
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
+
168
209
return nil
169
210
}
170
211
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
+
171
261
func resourceTencentCLoudTcrVpcAttachmentDelete (d * schema.ResourceData , meta interface {}) error {
172
262
defer logElapsed ("resource.tencentcloud_tcr_vpc_attachment.delete" )()
173
263
@@ -222,3 +312,88 @@ func resourceTencentCLoudTcrVpcAttachmentDelete(d *schema.ResourceData, meta int
222
312
223
313
return nil
224
314
}
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