Skip to content

Commit beabd2e

Browse files
authored
feat(dnspod): add resource dnspod record group (#2249)
* feat(dnspod): add resource dnspod record group * feat(dnspod): record group * docs(dnspod): record group docs * ci: golangci-lint * feat(dnspod): delete domain_id * ci: golangci-lint fast * ci: golangci-lint fast * ci: golangci-lint fast * docs(dnspod): add changelog * docs(dnspod): add changelog
1 parent bad7409 commit beabd2e

File tree

8 files changed

+388
-3
lines changed

8 files changed

+388
-3
lines changed

.changelog/2249.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:new-resource
2+
tencentcloud_dnspod_record_group
3+
```

.github/workflows/golangci-lint.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,13 @@ jobs:
3131
- uses: actions/setup-go@v3
3232
with:
3333
go-version-file: .go-version
34-
cache: true
34+
cache: false
3535

3636
# Runs a set of commands using the runners shell
3737
- name: golangci-lint
3838
uses: golangci/golangci-lint-action@v3
3939
with:
4040
version: v1.45.2
4141
working-directory: ./tencentcloud
42-
args: --new-from-rev=master -v
43-
#args: --enable-all --max-same-issues=0 --max-issues-per-linter=0 --new-from-rev=master -v
42+
args: --new-from-rev=origin/master -v
43+
#args: --enable-all --max-same-issues=0 --max-issues-per-linter=0 --new-from-rev=origin/master -v

tencentcloud/provider.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1232,6 +1232,7 @@ DNSPOD
12321232
Resource
12331233
tencentcloud_dnspod_domain_instance
12341234
tencentcloud_dnspod_record
1235+
tencentcloud_dnspod_record_group
12351236
Data Source
12361237
tencentcloud_dnspod_records
12371238
tencentcloud_dnspod_domain_list
@@ -3289,6 +3290,7 @@ func Provider() *schema.Provider {
32893290
"tencentcloud_cdh_instance": resourceTencentCloudCdhInstance(),
32903291
"tencentcloud_dnspod_domain_instance": resourceTencentCloudDnspodDomainInstance(),
32913292
"tencentcloud_dnspod_record": resourceTencentCloudDnspodRecord(),
3293+
"tencentcloud_dnspod_record_group": resourceTencentCloudDnspodRecordGroup(),
32923294
"tencentcloud_private_dns_zone": resourceTencentCloudPrivateDnsZone(),
32933295
"tencentcloud_private_dns_record": resourceTencentCloudPrivateDnsRecord(),
32943296
"tencentcloud_private_dns_zone_vpc_attachment": resourceTencentCloudPrivateDnsZoneVpcAttachment(),
Lines changed: 220 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,220 @@
1+
/*
2+
Provides a resource to create a dnspod record_group
3+
4+
Example Usage
5+
6+
```hcl
7+
resource "tencentcloud_dnspod_record_group" "record_group" {
8+
domain = "dnspod.cn"
9+
group_name = "group_demo"
10+
}
11+
```
12+
13+
Import
14+
15+
dnspod record_group can be imported using the domain#groupId, e.g.
16+
17+
```
18+
terraform import tencentcloud_dnspod_record_group.record_group domain#groupId
19+
```
20+
*/
21+
package tencentcloud
22+
23+
import (
24+
"context"
25+
"fmt"
26+
"log"
27+
"strings"
28+
29+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
30+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
31+
dnspod "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod/v20210323"
32+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
33+
)
34+
35+
func resourceTencentCloudDnspodRecordGroup() *schema.Resource {
36+
return &schema.Resource{
37+
Create: resourceTencentCloudDnspodRecordGroupCreate,
38+
Read: resourceTencentCloudDnspodRecordGroupRead,
39+
Update: resourceTencentCloudDnspodRecordGroupUpdate,
40+
Delete: resourceTencentCloudDnspodRecordGroupDelete,
41+
Importer: &schema.ResourceImporter{
42+
State: schema.ImportStatePassthrough,
43+
},
44+
Schema: map[string]*schema.Schema{
45+
"domain": {
46+
Required: true,
47+
Type: schema.TypeString,
48+
Description: "Domain.",
49+
},
50+
51+
"group_name": {
52+
Required: true,
53+
Type: schema.TypeString,
54+
Description: "Record Group Name.",
55+
},
56+
57+
"group_id": {
58+
Computed: true,
59+
Type: schema.TypeInt,
60+
Description: "Group ID.",
61+
},
62+
},
63+
}
64+
}
65+
66+
func resourceTencentCloudDnspodRecordGroupCreate(d *schema.ResourceData, meta interface{}) error {
67+
defer logElapsed("resource.tencentcloud_dnspod_record_group.create")()
68+
defer inconsistentCheck(d, meta)()
69+
70+
logId := getLogId(contextNil)
71+
72+
var (
73+
request = dnspod.NewCreateRecordGroupRequest()
74+
response = dnspod.NewCreateRecordGroupResponse()
75+
groupId uint64
76+
domain string
77+
)
78+
if v, ok := d.GetOk("domain"); ok {
79+
request.Domain = helper.String(v.(string))
80+
domain = v.(string)
81+
}
82+
83+
if v, ok := d.GetOk("group_name"); ok {
84+
request.GroupName = helper.String(v.(string))
85+
}
86+
87+
// if v, ok := d.GetOkExists("domain_id"); ok {
88+
// request.DomainId = helper.IntUint64(v.(int))
89+
// }
90+
91+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
92+
result, e := meta.(*TencentCloudClient).apiV3Conn.UseDnsPodClient().CreateRecordGroup(request)
93+
if e != nil {
94+
return retryError(e)
95+
} else {
96+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
97+
}
98+
response = result
99+
return nil
100+
})
101+
if err != nil {
102+
log.Printf("[CRITAL]%s create dnspod record_group failed, reason:%+v", logId, err)
103+
return err
104+
}
105+
106+
groupId = *response.Response.GroupId
107+
d.SetId(strings.Join([]string{domain, helper.UInt64ToStr(groupId)}, FILED_SP))
108+
109+
return resourceTencentCloudDnspodRecordGroupRead(d, meta)
110+
}
111+
112+
func resourceTencentCloudDnspodRecordGroupRead(d *schema.ResourceData, meta interface{}) error {
113+
defer logElapsed("resource.tencentcloud_dnspod_record_group.read")()
114+
defer inconsistentCheck(d, meta)()
115+
116+
logId := getLogId(contextNil)
117+
118+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
119+
120+
service := DnspodService{client: meta.(*TencentCloudClient).apiV3Conn}
121+
122+
idSplit := strings.Split(d.Id(), FILED_SP)
123+
if len(idSplit) != 2 {
124+
return fmt.Errorf("tencentcloud_dnspod_record_group id is broken, id is %s", d.Id())
125+
}
126+
domain := idSplit[0]
127+
groupId := helper.StrToUInt64(idSplit[1])
128+
129+
recordGroup, err := service.DescribeDnspodRecordGroupById(ctx, domain, groupId)
130+
if err != nil {
131+
return err
132+
}
133+
134+
if recordGroup == nil {
135+
d.SetId("")
136+
log.Printf("[WARN]%s resource `DnspodRecordGroup` [%s] not found, please check if it has been deleted.\n", logId, d.Id())
137+
return nil
138+
}
139+
140+
_ = d.Set("domain", domain)
141+
142+
if recordGroup.GroupName != nil {
143+
_ = d.Set("group_name", recordGroup.GroupName)
144+
}
145+
146+
if recordGroup.GroupId != nil {
147+
_ = d.Set("group_id", recordGroup.GroupId)
148+
}
149+
150+
// if recordGroup.GroupType != nil {
151+
// _ = d.Set("group_type", recordGroup.GroupType)
152+
// }
153+
154+
return nil
155+
}
156+
157+
func resourceTencentCloudDnspodRecordGroupUpdate(d *schema.ResourceData, meta interface{}) error {
158+
defer logElapsed("resource.tencentcloud_dnspod_record_group.update")()
159+
defer inconsistentCheck(d, meta)()
160+
161+
logId := getLogId(contextNil)
162+
163+
request := dnspod.NewModifyRecordGroupRequest()
164+
idSplit := strings.Split(d.Id(), FILED_SP)
165+
if len(idSplit) != 2 {
166+
return fmt.Errorf("tencentcloud_dnspod_record_group id is broken, id is %s", d.Id())
167+
}
168+
request.Domain = helper.String(idSplit[0])
169+
request.GroupId = helper.StrToUint64Point(idSplit[1])
170+
171+
immutableArgs := []string{"domain"}
172+
173+
for _, v := range immutableArgs {
174+
if d.HasChange(v) {
175+
return fmt.Errorf("argument `%s` cannot be changed", v)
176+
}
177+
}
178+
179+
if v, ok := d.GetOk("group_name"); ok {
180+
request.GroupName = helper.String(v.(string))
181+
}
182+
183+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
184+
result, e := meta.(*TencentCloudClient).apiV3Conn.UseDnsPodClient().ModifyRecordGroup(request)
185+
if e != nil {
186+
return retryError(e)
187+
} else {
188+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
189+
}
190+
return nil
191+
})
192+
if err != nil {
193+
log.Printf("[CRITAL]%s update dnspod record_group failed, reason:%+v", logId, err)
194+
return err
195+
}
196+
197+
return resourceTencentCloudDnspodRecordGroupRead(d, meta)
198+
}
199+
200+
func resourceTencentCloudDnspodRecordGroupDelete(d *schema.ResourceData, meta interface{}) error {
201+
defer logElapsed("resource.tencentcloud_dnspod_record_group.delete")()
202+
defer inconsistentCheck(d, meta)()
203+
204+
logId := getLogId(contextNil)
205+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
206+
207+
service := DnspodService{client: meta.(*TencentCloudClient).apiV3Conn}
208+
idSplit := strings.Split(d.Id(), FILED_SP)
209+
if len(idSplit) != 2 {
210+
return fmt.Errorf("tencentcloud_dnspod_record_group id is broken, id is %s", d.Id())
211+
}
212+
domain := idSplit[0]
213+
groupId := helper.StrToUInt64(idSplit[1])
214+
215+
if err := service.DeleteDnspodRecordGroupById(ctx, domain, groupId); err != nil {
216+
return err
217+
}
218+
219+
return nil
220+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package tencentcloud
2+
3+
import (
4+
"testing"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
7+
)
8+
9+
func TestAccTencentCloudDnspodRecordGroupResource_basic(t *testing.T) {
10+
t.Parallel()
11+
resource.Test(t, resource.TestCase{
12+
PreCheck: func() { testAccPreCheckCommon(t, ACCOUNT_TYPE_PREPAY) },
13+
Providers: testAccProviders,
14+
Steps: []resource.TestStep{
15+
{
16+
Config: testAccDnspodRecordGroup,
17+
Check: resource.ComposeTestCheckFunc(
18+
resource.TestCheckResourceAttr("tencentcloud_dnspod_record_group.record_group", "domain", "iac-tf.cloud"),
19+
resource.TestCheckResourceAttr("tencentcloud_dnspod_record_group.record_group", "group_name", "group_demo"),
20+
),
21+
},
22+
{
23+
Config: testAccDnspodRecordGroupUp,
24+
Check: resource.ComposeTestCheckFunc(
25+
resource.TestCheckResourceAttr("tencentcloud_dnspod_record_group.record_group", "domain", "iac-tf.cloud"),
26+
resource.TestCheckResourceAttr("tencentcloud_dnspod_record_group.record_group", "group_name", "group_demo2"),
27+
),
28+
},
29+
{
30+
ResourceName: "tencentcloud_dnspod_record_group.record_group",
31+
ImportState: true,
32+
ImportStateVerify: true,
33+
},
34+
},
35+
})
36+
}
37+
38+
const testAccDnspodRecordGroup = `
39+
40+
resource "tencentcloud_dnspod_record_group" "record_group" {
41+
domain = "iac-tf.cloud"
42+
group_name = "group_demo"
43+
}
44+
45+
`
46+
47+
const testAccDnspodRecordGroupUp = `
48+
49+
resource "tencentcloud_dnspod_record_group" "record_group" {
50+
domain = "iac-tf.cloud"
51+
group_name = "group_demo2"
52+
}
53+
54+
`

tencentcloud/service_tencentcloud_dnspod.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -581,3 +581,61 @@ func (me *DnspodService) DescribeDnspodRecordTypeByFilter(ctx context.Context, p
581581

582582
return
583583
}
584+
func (me *DnspodService) DescribeDnspodRecordGroupById(ctx context.Context, domain string, groupId uint64) (recordGroup *dnspod.RecordGroupInfo, errRet error) {
585+
logId := getLogId(ctx)
586+
587+
request := dnspod.NewDescribeRecordGroupListRequest()
588+
request.Domain = &domain
589+
590+
defer func() {
591+
if errRet != nil {
592+
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, request.GetAction(), request.ToJsonString(), errRet.Error())
593+
}
594+
}()
595+
596+
ratelimit.Check(request.GetAction())
597+
598+
response, err := me.client.UseDnsPodClient().DescribeRecordGroupList(request)
599+
if err != nil {
600+
errRet = err
601+
return
602+
}
603+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
604+
605+
if len(response.Response.GroupList) < 1 {
606+
return
607+
}
608+
609+
for _, item := range response.Response.GroupList {
610+
if *item.GroupId == groupId {
611+
recordGroup = item
612+
return
613+
}
614+
}
615+
return
616+
}
617+
618+
func (me *DnspodService) DeleteDnspodRecordGroupById(ctx context.Context, domain string, groupId uint64) (errRet error) {
619+
logId := getLogId(ctx)
620+
621+
request := dnspod.NewDeleteRecordGroupRequest()
622+
request.Domain = &domain
623+
request.GroupId = &groupId
624+
625+
defer func() {
626+
if errRet != nil {
627+
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, request.GetAction(), request.ToJsonString(), errRet.Error())
628+
}
629+
}()
630+
631+
ratelimit.Check(request.GetAction())
632+
633+
response, err := me.client.UseDnsPodClient().DeleteRecordGroup(request)
634+
if err != nil {
635+
errRet = err
636+
return
637+
}
638+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
639+
640+
return
641+
}

0 commit comments

Comments
 (0)