Skip to content

Commit f6b9393

Browse files
authored
fix private dns bug (#1051)
1 parent 0d10984 commit f6b9393

File tree

5 files changed

+150
-16
lines changed

5 files changed

+150
-16
lines changed

tencentcloud/resource_tc_private_dns_record.go

Lines changed: 76 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -268,12 +268,54 @@ func resourceTencentCloudDPrivateDnsRecordDelete(d *schema.ResourceData, meta in
268268
zoneId := idSplit[0]
269269
recordId := idSplit[1]
270270

271-
request := privatedns.NewDeletePrivateZoneRecordRequest()
271+
// unbind
272+
request := privatedns.NewDescribePrivateZoneRequest()
272273
request.ZoneId = helper.String(zoneId)
273-
request.RecordId = helper.String(recordId)
274274

275-
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
276-
_, e := meta.(*TencentCloudClient).apiV3Conn.UsePrivateDnsClient().DeletePrivateZoneRecord(request)
275+
var response *privatedns.DescribePrivateZoneResponse
276+
277+
err := resource.Retry(readRetryTimeout, func() *resource.RetryError {
278+
result, e := meta.(*TencentCloudClient).apiV3Conn.UsePrivateDnsClient().DescribePrivateZone(request)
279+
if e != nil {
280+
return retryError(e)
281+
}
282+
283+
response = result
284+
return nil
285+
})
286+
if err != nil {
287+
log.Printf("[CRITAL]%s read private dns failed, reason:%s\n", logId, err.Error())
288+
return err
289+
}
290+
291+
info := response.Response.PrivateZone
292+
oldVpcSet := info.VpcSet
293+
oldAccVpcSet := info.AccountVpcSet
294+
295+
unBindRequest := privatedns.NewModifyPrivateZoneVpcRequest()
296+
unBindRequest.ZoneId = helper.String(zoneId)
297+
unBindRequest.VpcSet = []*privatedns.VpcInfo{}
298+
unBindRequest.AccountVpcSet = []*privatedns.AccountVpcInfo{}
299+
300+
err = resource.Retry(readRetryTimeout, func() *resource.RetryError {
301+
_, e := meta.(*TencentCloudClient).apiV3Conn.UsePrivateDnsClient().ModifyPrivateZoneVpc(unBindRequest)
302+
if e != nil {
303+
return retryError(e)
304+
}
305+
return nil
306+
})
307+
if err != nil {
308+
log.Printf("[CRITAL]%s unbind privateDns zone vpc failed, reason:%s\n", logId, err.Error())
309+
return err
310+
}
311+
312+
// delete
313+
recordRequest := privatedns.NewDeletePrivateZoneRecordRequest()
314+
recordRequest.ZoneId = helper.String(zoneId)
315+
recordRequest.RecordId = helper.String(recordId)
316+
317+
err = resource.Retry(writeRetryTimeout, func() *resource.RetryError {
318+
_, e := meta.(*TencentCloudClient).apiV3Conn.UsePrivateDnsClient().DeletePrivateZoneRecord(recordRequest)
277319
if e != nil {
278320
return retryError(e)
279321
}
@@ -283,5 +325,35 @@ func resourceTencentCloudDPrivateDnsRecordDelete(d *schema.ResourceData, meta in
283325
log.Printf("[CRITAL]%s delete privateDns record failed, reason:%s\n", logId, err.Error())
284326
return err
285327
}
328+
329+
// rebind
330+
unBindRequest = privatedns.NewModifyPrivateZoneVpcRequest()
331+
unBindRequest.ZoneId = helper.String(zoneId)
332+
unBindRequest.VpcSet = oldVpcSet
333+
334+
accountVpcSet := make([]*privatedns.AccountVpcInfo, 0, len(oldAccVpcSet))
335+
for _, item := range oldAccVpcSet {
336+
info := privatedns.AccountVpcInfo{
337+
Uin: item.Uin,
338+
UniqVpcId: item.UniqVpcId,
339+
Region: item.Region,
340+
}
341+
accountVpcSet = append(accountVpcSet, &info)
342+
}
343+
344+
unBindRequest.AccountVpcSet = accountVpcSet
345+
346+
err = resource.Retry(readRetryTimeout, func() *resource.RetryError {
347+
_, e := meta.(*TencentCloudClient).apiV3Conn.UsePrivateDnsClient().ModifyPrivateZoneVpc(unBindRequest)
348+
if e != nil {
349+
return retryError(e)
350+
}
351+
return nil
352+
})
353+
if err != nil {
354+
log.Printf("[CRITAL]%s rebind privateDns zone vpc failed, reason:%s\n", logId, err.Error())
355+
return err
356+
}
357+
286358
return nil
287359
}

tencentcloud/resource_tc_private_dns_record_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ resource "tencentcloud_private_dns_zone" "zone" {
3333
dns_forward_status = "DISABLED"
3434
domain = "domain.com"
3535
remark = "test_record"
36+
tags = {
37+
"created-by" : "terraform",
38+
}
3639
}
3740
3841
resource "tencentcloud_private_dns_record" "record" {
@@ -44,5 +47,4 @@ resource "tencentcloud_private_dns_record" "record" {
4447
weight = 1
4548
zone_id = tencentcloud_private_dns_zone.zone.id
4649
}
47-
4850
`

tencentcloud/resource_tc_private_dns_zone.go

Lines changed: 64 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,8 @@ Example Usage
66
```hcl
77
resource "tencentcloud_private_dns_zone" "foo" {
88
domain = "domain.com"
9-
tag_set {
10-
tag_key = "created_by"
11-
tag_value = "tag"
9+
tags {
10+
"created_by" : "terraform"
1211
}
1312
vpc_set {
1413
region = "ap-guangzhou"
@@ -36,6 +35,8 @@ $ terraform import tencentcloud_private_dns_zone.foo zone_id
3635
package tencentcloud
3736

3837
import (
38+
"context"
39+
"fmt"
3940
"log"
4041

4142
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
@@ -62,9 +63,12 @@ func resourceTencentCloudPrivateDnsZone() *schema.Resource {
6263
Description: "Domain name, which must be in the format of standard TLD.",
6364
},
6465
"tag_set": {
65-
Type: schema.TypeList,
66-
Optional: true,
67-
Description: "Tags the private domain when it is created.",
66+
Type: schema.TypeList,
67+
Optional: true,
68+
Computed: true,
69+
Description: "Tags the private domain when it is created.",
70+
Deprecated: "It has been deprecated from version 1.72.4. Use `tags` instead.",
71+
ConflictsWith: []string{"tags"},
6872
Elem: &schema.Resource{
6973
Schema: map[string]*schema.Schema{
7074
"tag_key": {
@@ -80,6 +84,12 @@ func resourceTencentCloudPrivateDnsZone() *schema.Resource {
8084
},
8185
},
8286
},
87+
"tags": {
88+
Type: schema.TypeMap,
89+
Optional: true,
90+
Description: "Tags of the private dns zone.",
91+
ConflictsWith: []string{"tag_set"},
92+
},
8393
"vpc_set": {
8494
Type: schema.TypeList,
8595
Optional: true,
@@ -147,6 +157,7 @@ func resourceTencentCloudDPrivateDnsZoneCreate(d *schema.ResourceData, meta inte
147157
defer logElapsed("resource.tencentcloud_private_dns_zone.create")()
148158

149159
logId := getLogId(contextNil)
160+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
150161

151162
request := privatedns.NewCreatePrivateZoneRequest()
152163

@@ -213,7 +224,20 @@ func resourceTencentCloudDPrivateDnsZoneCreate(d *schema.ResourceData, meta inte
213224

214225
var response *privatedns.CreatePrivateZoneResponse
215226
response = result
216-
d.SetId(*response.Response.ZoneId)
227+
228+
id := *response.Response.ZoneId
229+
d.SetId(id)
230+
231+
client := meta.(*TencentCloudClient).apiV3Conn
232+
tagService := TagService{client: client}
233+
region := client.Region
234+
235+
if tags := helper.GetTags(d, "tags"); len(tags) > 0 {
236+
resourceName := BuildTagResourceName("privatedns", "zone", region, id)
237+
if err := tagService.ModifyTags(ctx, resourceName, tags, nil); err != nil {
238+
return err
239+
}
240+
}
217241

218242
return resourceTencentCloudDPrivateDnsZoneRead(d, meta)
219243
}
@@ -223,6 +247,7 @@ func resourceTencentCloudDPrivateDnsZoneRead(d *schema.ResourceData, meta interf
223247
defer inconsistentCheck(d, meta)()
224248

225249
logId := getLogId(contextNil)
250+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
226251

227252
id := d.Id()
228253

@@ -259,6 +284,16 @@ func resourceTencentCloudDPrivateDnsZoneRead(d *schema.ResourceData, meta interf
259284
}
260285
_ = d.Set("tag_set", tagSets)
261286

287+
client := meta.(*TencentCloudClient).apiV3Conn
288+
tagService := TagService{client: client}
289+
region := client.Region
290+
291+
tags, err := tagService.DescribeResourceTags(ctx, "privatedns", "zone", region, id)
292+
if err != nil {
293+
return err
294+
}
295+
_ = d.Set("tags", tags)
296+
262297
vpcSet := make([]map[string]interface{}, 0, len(info.VpcSet))
263298
for _, item := range info.VpcSet {
264299
vpcSet = append(vpcSet, map[string]interface{}{
@@ -286,6 +321,7 @@ func resourceTencentCloudDPrivateDnsZoneUpdate(d *schema.ResourceData, meta inte
286321
defer logElapsed("resource.tencentcloud_private_dns_zone.update")()
287322

288323
logId := getLogId(contextNil)
324+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
289325
id := d.Id()
290326

291327
if d.HasChange("remark") || d.HasChange("dns_forward_status") {
@@ -354,6 +390,27 @@ func resourceTencentCloudDPrivateDnsZoneUpdate(d *schema.ResourceData, meta inte
354390
return err
355391
}
356392
}
393+
394+
if d.HasChange("tag_set") {
395+
return fmt.Errorf("tag_set do not support change, please use tags instead.")
396+
}
397+
398+
client := meta.(*TencentCloudClient).apiV3Conn
399+
tagService := TagService{client: client}
400+
region := client.Region
401+
402+
if d.HasChange("tags") {
403+
oldTags, newTags := d.GetChange("tags")
404+
replaceTags, deleteTags := diffTags(oldTags.(map[string]interface{}), newTags.(map[string]interface{}))
405+
406+
resourceName := BuildTagResourceName("privatedns", "zone", region, id)
407+
if err := tagService.ModifyTags(ctx, resourceName, replaceTags, deleteTags); err != nil {
408+
return err
409+
}
410+
411+
d.SetPartial("tags")
412+
}
413+
357414
return resourceTencentCloudDPrivateDnsZoneRead(d, meta)
358415
}
359416

tencentcloud/resource_tc_private_dns_zone_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,5 +41,8 @@ resource "tencentcloud_private_dns_zone" "zone" {
4141
region = "ap-guangzhou"
4242
uniq_vpc_id = var.vpc_id
4343
}
44+
tags = {
45+
"created-by" : "terraform",
46+
}
4447
}
4548
`

website/docs/r/private_dns_zone.html.markdown

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,8 @@ Provide a resource to create a Private Dns Zone.
1616
```hcl
1717
resource "tencentcloud_private_dns_zone" "foo" {
1818
domain = "domain.com"
19-
tag_set {
20-
tag_key = "created_by"
21-
tag_value = "tag"
19+
tags {
20+
"created_by" : "terraform"
2221
}
2322
vpc_set {
2423
region = "ap-guangzhou"
@@ -43,7 +42,8 @@ The following arguments are supported:
4342
* `account_vpc_set` - (Optional) List of authorized accounts' VPCs to associate with the private domain.
4443
* `dns_forward_status` - (Optional) Whether to enable subdomain recursive DNS. Valid values: ENABLED, DISABLED. Default value: DISABLED.
4544
* `remark` - (Optional) Remarks.
46-
* `tag_set` - (Optional) Tags the private domain when it is created.
45+
* `tag_set` - (Optional, **Deprecated**) It has been deprecated from version 1.72.4. Use `tags` instead. Tags the private domain when it is created.
46+
* `tags` - (Optional) Tags of the private dns zone.
4747
* `vpc_set` - (Optional) Associates the private domain to a VPC when it is created.
4848

4949
The `account_vpc_set` object supports the following:

0 commit comments

Comments
 (0)