@@ -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,75 @@ func resourceTencentCLoudTcrVpcAttachmentDelete(d *schema.ResourceData, meta int
222
312
223
313
return nil
224
314
}
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