From 94be109a174d7deb5ab447a26d205dfc4f35690d Mon Sep 17 00:00:00 2001 From: hellertang Date: Wed, 18 May 2022 17:31:39 +0800 Subject: [PATCH] fix private dns bug --- .../resource_tc_private_dns_record.go | 80 ++++++++++++++++++- .../resource_tc_private_dns_record_test.go | 4 +- tencentcloud/resource_tc_private_dns_zone.go | 71 ++++++++++++++-- .../resource_tc_private_dns_zone_test.go | 3 + website/docs/r/private_dns_zone.html.markdown | 8 +- 5 files changed, 150 insertions(+), 16 deletions(-) diff --git a/tencentcloud/resource_tc_private_dns_record.go b/tencentcloud/resource_tc_private_dns_record.go index b62f016ef9..55598b0e20 100644 --- a/tencentcloud/resource_tc_private_dns_record.go +++ b/tencentcloud/resource_tc_private_dns_record.go @@ -268,12 +268,54 @@ func resourceTencentCloudDPrivateDnsRecordDelete(d *schema.ResourceData, meta in zoneId := idSplit[0] recordId := idSplit[1] - request := privatedns.NewDeletePrivateZoneRecordRequest() + // unbind + request := privatedns.NewDescribePrivateZoneRequest() request.ZoneId = helper.String(zoneId) - request.RecordId = helper.String(recordId) - err := resource.Retry(writeRetryTimeout, func() *resource.RetryError { - _, e := meta.(*TencentCloudClient).apiV3Conn.UsePrivateDnsClient().DeletePrivateZoneRecord(request) + var response *privatedns.DescribePrivateZoneResponse + + err := resource.Retry(readRetryTimeout, func() *resource.RetryError { + result, e := meta.(*TencentCloudClient).apiV3Conn.UsePrivateDnsClient().DescribePrivateZone(request) + if e != nil { + return retryError(e) + } + + response = result + return nil + }) + if err != nil { + log.Printf("[CRITAL]%s read private dns failed, reason:%s\n", logId, err.Error()) + return err + } + + info := response.Response.PrivateZone + oldVpcSet := info.VpcSet + oldAccVpcSet := info.AccountVpcSet + + unBindRequest := privatedns.NewModifyPrivateZoneVpcRequest() + unBindRequest.ZoneId = helper.String(zoneId) + unBindRequest.VpcSet = []*privatedns.VpcInfo{} + unBindRequest.AccountVpcSet = []*privatedns.AccountVpcInfo{} + + err = resource.Retry(readRetryTimeout, func() *resource.RetryError { + _, e := meta.(*TencentCloudClient).apiV3Conn.UsePrivateDnsClient().ModifyPrivateZoneVpc(unBindRequest) + if e != nil { + return retryError(e) + } + return nil + }) + if err != nil { + log.Printf("[CRITAL]%s unbind privateDns zone vpc failed, reason:%s\n", logId, err.Error()) + return err + } + + // delete + recordRequest := privatedns.NewDeletePrivateZoneRecordRequest() + recordRequest.ZoneId = helper.String(zoneId) + recordRequest.RecordId = helper.String(recordId) + + err = resource.Retry(writeRetryTimeout, func() *resource.RetryError { + _, e := meta.(*TencentCloudClient).apiV3Conn.UsePrivateDnsClient().DeletePrivateZoneRecord(recordRequest) if e != nil { return retryError(e) } @@ -283,5 +325,35 @@ func resourceTencentCloudDPrivateDnsRecordDelete(d *schema.ResourceData, meta in log.Printf("[CRITAL]%s delete privateDns record failed, reason:%s\n", logId, err.Error()) return err } + + // rebind + unBindRequest = privatedns.NewModifyPrivateZoneVpcRequest() + unBindRequest.ZoneId = helper.String(zoneId) + unBindRequest.VpcSet = oldVpcSet + + accountVpcSet := make([]*privatedns.AccountVpcInfo, 0, len(oldAccVpcSet)) + for _, item := range oldAccVpcSet { + info := privatedns.AccountVpcInfo{ + Uin: item.Uin, + UniqVpcId: item.UniqVpcId, + Region: item.Region, + } + accountVpcSet = append(accountVpcSet, &info) + } + + unBindRequest.AccountVpcSet = accountVpcSet + + err = resource.Retry(readRetryTimeout, func() *resource.RetryError { + _, e := meta.(*TencentCloudClient).apiV3Conn.UsePrivateDnsClient().ModifyPrivateZoneVpc(unBindRequest) + if e != nil { + return retryError(e) + } + return nil + }) + if err != nil { + log.Printf("[CRITAL]%s rebind privateDns zone vpc failed, reason:%s\n", logId, err.Error()) + return err + } + return nil } diff --git a/tencentcloud/resource_tc_private_dns_record_test.go b/tencentcloud/resource_tc_private_dns_record_test.go index d459354dd6..fc242ad13c 100644 --- a/tencentcloud/resource_tc_private_dns_record_test.go +++ b/tencentcloud/resource_tc_private_dns_record_test.go @@ -33,6 +33,9 @@ resource "tencentcloud_private_dns_zone" "zone" { dns_forward_status = "DISABLED" domain = "domain.com" remark = "test_record" + tags = { + "created-by" : "terraform", + } } resource "tencentcloud_private_dns_record" "record" { @@ -44,5 +47,4 @@ resource "tencentcloud_private_dns_record" "record" { weight = 1 zone_id = tencentcloud_private_dns_zone.zone.id } - ` diff --git a/tencentcloud/resource_tc_private_dns_zone.go b/tencentcloud/resource_tc_private_dns_zone.go index 2fedc01f59..83d8f3e19f 100644 --- a/tencentcloud/resource_tc_private_dns_zone.go +++ b/tencentcloud/resource_tc_private_dns_zone.go @@ -6,9 +6,8 @@ Example Usage ```hcl resource "tencentcloud_private_dns_zone" "foo" { domain = "domain.com" - tag_set { - tag_key = "created_by" - tag_value = "tag" + tags { + "created_by" : "terraform" } vpc_set { region = "ap-guangzhou" @@ -36,6 +35,8 @@ $ terraform import tencentcloud_private_dns_zone.foo zone_id package tencentcloud import ( + "context" + "fmt" "log" "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper" @@ -62,9 +63,12 @@ func resourceTencentCloudPrivateDnsZone() *schema.Resource { Description: "Domain name, which must be in the format of standard TLD.", }, "tag_set": { - Type: schema.TypeList, - Optional: true, - Description: "Tags the private domain when it is created.", + Type: schema.TypeList, + Optional: true, + Computed: true, + Description: "Tags the private domain when it is created.", + Deprecated: "It has been deprecated from version 1.72.4. Use `tags` instead.", + ConflictsWith: []string{"tags"}, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "tag_key": { @@ -80,6 +84,12 @@ func resourceTencentCloudPrivateDnsZone() *schema.Resource { }, }, }, + "tags": { + Type: schema.TypeMap, + Optional: true, + Description: "Tags of the private dns zone.", + ConflictsWith: []string{"tag_set"}, + }, "vpc_set": { Type: schema.TypeList, Optional: true, @@ -147,6 +157,7 @@ func resourceTencentCloudDPrivateDnsZoneCreate(d *schema.ResourceData, meta inte defer logElapsed("resource.tencentcloud_private_dns_zone.create")() logId := getLogId(contextNil) + ctx := context.WithValue(context.TODO(), logIdKey, logId) request := privatedns.NewCreatePrivateZoneRequest() @@ -213,7 +224,20 @@ func resourceTencentCloudDPrivateDnsZoneCreate(d *schema.ResourceData, meta inte var response *privatedns.CreatePrivateZoneResponse response = result - d.SetId(*response.Response.ZoneId) + + id := *response.Response.ZoneId + d.SetId(id) + + client := meta.(*TencentCloudClient).apiV3Conn + tagService := TagService{client: client} + region := client.Region + + if tags := helper.GetTags(d, "tags"); len(tags) > 0 { + resourceName := BuildTagResourceName("privatedns", "zone", region, id) + if err := tagService.ModifyTags(ctx, resourceName, tags, nil); err != nil { + return err + } + } return resourceTencentCloudDPrivateDnsZoneRead(d, meta) } @@ -223,6 +247,7 @@ func resourceTencentCloudDPrivateDnsZoneRead(d *schema.ResourceData, meta interf defer inconsistentCheck(d, meta)() logId := getLogId(contextNil) + ctx := context.WithValue(context.TODO(), logIdKey, logId) id := d.Id() @@ -259,6 +284,16 @@ func resourceTencentCloudDPrivateDnsZoneRead(d *schema.ResourceData, meta interf } _ = d.Set("tag_set", tagSets) + client := meta.(*TencentCloudClient).apiV3Conn + tagService := TagService{client: client} + region := client.Region + + tags, err := tagService.DescribeResourceTags(ctx, "privatedns", "zone", region, id) + if err != nil { + return err + } + _ = d.Set("tags", tags) + vpcSet := make([]map[string]interface{}, 0, len(info.VpcSet)) for _, item := range info.VpcSet { vpcSet = append(vpcSet, map[string]interface{}{ @@ -286,6 +321,7 @@ func resourceTencentCloudDPrivateDnsZoneUpdate(d *schema.ResourceData, meta inte defer logElapsed("resource.tencentcloud_private_dns_zone.update")() logId := getLogId(contextNil) + ctx := context.WithValue(context.TODO(), logIdKey, logId) id := d.Id() if d.HasChange("remark") || d.HasChange("dns_forward_status") { @@ -354,6 +390,27 @@ func resourceTencentCloudDPrivateDnsZoneUpdate(d *schema.ResourceData, meta inte return err } } + + if d.HasChange("tag_set") { + return fmt.Errorf("tag_set do not support change, please use tags instead.") + } + + client := meta.(*TencentCloudClient).apiV3Conn + tagService := TagService{client: client} + region := client.Region + + if d.HasChange("tags") { + oldTags, newTags := d.GetChange("tags") + replaceTags, deleteTags := diffTags(oldTags.(map[string]interface{}), newTags.(map[string]interface{})) + + resourceName := BuildTagResourceName("privatedns", "zone", region, id) + if err := tagService.ModifyTags(ctx, resourceName, replaceTags, deleteTags); err != nil { + return err + } + + d.SetPartial("tags") + } + return resourceTencentCloudDPrivateDnsZoneRead(d, meta) } diff --git a/tencentcloud/resource_tc_private_dns_zone_test.go b/tencentcloud/resource_tc_private_dns_zone_test.go index 303ba6373f..fc8471fe2f 100644 --- a/tencentcloud/resource_tc_private_dns_zone_test.go +++ b/tencentcloud/resource_tc_private_dns_zone_test.go @@ -41,5 +41,8 @@ resource "tencentcloud_private_dns_zone" "zone" { region = "ap-guangzhou" uniq_vpc_id = var.vpc_id } + tags = { + "created-by" : "terraform", + } } ` diff --git a/website/docs/r/private_dns_zone.html.markdown b/website/docs/r/private_dns_zone.html.markdown index 57882228c8..cdaee875b9 100644 --- a/website/docs/r/private_dns_zone.html.markdown +++ b/website/docs/r/private_dns_zone.html.markdown @@ -16,9 +16,8 @@ Provide a resource to create a Private Dns Zone. ```hcl resource "tencentcloud_private_dns_zone" "foo" { domain = "domain.com" - tag_set { - tag_key = "created_by" - tag_value = "tag" + tags { + "created_by" : "terraform" } vpc_set { region = "ap-guangzhou" @@ -43,7 +42,8 @@ The following arguments are supported: * `account_vpc_set` - (Optional) List of authorized accounts' VPCs to associate with the private domain. * `dns_forward_status` - (Optional) Whether to enable subdomain recursive DNS. Valid values: ENABLED, DISABLED. Default value: DISABLED. * `remark` - (Optional) Remarks. -* `tag_set` - (Optional) Tags the private domain when it is created. +* `tag_set` - (Optional, **Deprecated**) It has been deprecated from version 1.72.4. Use `tags` instead. Tags the private domain when it is created. +* `tags` - (Optional) Tags of the private dns zone. * `vpc_set` - (Optional) Associates the private domain to a VPC when it is created. The `account_vpc_set` object supports the following: