Skip to content

Commit db85dd5

Browse files
authored
Merge pull request #2 from ysicing/master
fix #1 update sdk version
2 parents 4845cab + f762075 commit db85dd5

File tree

5 files changed

+124
-133
lines changed

5 files changed

+124
-133
lines changed

client.go

+89-88
Original file line numberDiff line numberDiff line change
@@ -2,125 +2,126 @@ package tencentcloud
22

33
import (
44
"context"
5-
"encoding/json"
65
"strconv"
76
"strings"
7+
"sync"
88
"time"
99

1010
"github.com/libdns/libdns"
1111

12-
tc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common"
13-
th "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/http"
12+
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common"
1413
tp "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile"
14+
dnspod "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod/v20210323"
1515
)
1616

17-
func (p *Provider) describeRecordList(ctx context.Context, zone string) ([]libdns.Record, error) {
18-
19-
list := []libdns.Record{}
20-
21-
payload := map[string]any{
22-
"Domain": strings.Trim(zone, "."),
23-
}
17+
// getClient gets the client for Tencent Cloud DNS
18+
func (p *Provider) getClient() (*dnspod.Client, error) {
19+
client := sync.OnceValues(func() (*dnspod.Client, error) {
20+
credential := common.NewCredential(
21+
p.SecretId,
22+
p.SecretKey,
23+
)
24+
cpf := tp.NewClientProfile()
25+
cpf.HttpProfile.Endpoint = "dnspod.tencentcloudapi.com"
26+
client, err := dnspod.NewClient(credential, "", cpf)
27+
if err != nil {
28+
return nil, err
29+
}
30+
return client, nil
31+
})
32+
return client()
33+
}
2434

25-
resp, err := p.doRequest("DescribeRecordList", payload)
35+
// describeRecordList describes the records for a zone
36+
func (p *Provider) describeRecordList(ctx context.Context, zone string) ([]libdns.Record, error) {
37+
client, err := p.getClient()
2638
if err != nil {
27-
return list, err
28-
}
29-
30-
data := DescribeRecordListResponse{}
31-
if err = json.Unmarshal(resp, &data); err != nil {
32-
return list, err
39+
return nil, err
3340
}
34-
35-
for _, record := range data.Response.RecordList {
36-
list = append(list, libdns.Record{
37-
ID: strconv.Itoa(record.RecordId),
38-
Type: record.Type,
39-
Name: record.Name,
40-
Value: record.Value,
41-
TTL: time.Duration(record.TTL) * time.Second,
42-
})
41+
list := []libdns.Record{}
42+
request := dnspod.NewDescribeRecordListRequest()
43+
request.Domain = common.StringPtr(strings.Trim(zone, "."))
44+
request.Offset = common.Uint64Ptr(0)
45+
request.Limit = common.Uint64Ptr(3000)
46+
47+
totalCount := uint64(100)
48+
for *request.Offset < totalCount {
49+
response, err := client.DescribeRecordList(request)
50+
if err != nil {
51+
return nil, err
52+
}
53+
if response.Response.RecordList != nil && len(response.Response.RecordList) > 0 {
54+
for _, record := range response.Response.RecordList {
55+
list = append(list, libdns.Record{
56+
ID: strconv.Itoa(int(*record.RecordId)),
57+
Type: *record.Type,
58+
Name: *record.Name,
59+
Value: *record.Value,
60+
TTL: time.Duration(*record.TTL) * time.Second,
61+
})
62+
}
63+
}
64+
totalCount = *response.Response.RecordCountInfo.TotalCount
65+
request.Offset = common.Uint64Ptr(*request.Offset + uint64(len(response.Response.RecordList)))
4366
}
44-
4567
return list, err
46-
4768
}
4869

70+
// createRecord creates a record for a zone
4971
func (p *Provider) createRecord(ctx context.Context, zone string, record libdns.Record) (string, error) {
50-
51-
payload := map[string]any{
52-
"Domain": strings.Trim(zone, "."),
53-
"SubDomain": record.Name,
54-
"RecordType": record.Type,
55-
"RecordLine": "默认",
56-
"Value": record.Value,
57-
}
58-
59-
resp, err := p.doRequest("CreateRecord", payload)
72+
client, err := p.getClient()
6073
if err != nil {
6174
return "", err
6275
}
63-
64-
data := CreateRecordResponse{}
65-
if err = json.Unmarshal(resp, &data); err != nil {
76+
request := dnspod.NewCreateRecordRequest()
77+
request.Domain = common.StringPtr(strings.Trim(zone, "."))
78+
request.SubDomain = common.StringPtr(record.Name)
79+
request.RecordType = common.StringPtr(record.Type)
80+
request.RecordLine = common.StringPtr("默认")
81+
request.Value = common.StringPtr(record.Value)
82+
response, err := client.CreateRecord(request)
83+
if err != nil {
6684
return "", err
6785
}
68-
69-
return strconv.Itoa(data.Response.RecordId), nil
70-
86+
return strconv.Itoa(int(*response.Response.RecordId)), nil
7187
}
7288

89+
// modifyRecord modifies a record for a zone
7390
func (p *Provider) modifyRecord(ctx context.Context, zone string, record libdns.Record) error {
74-
91+
client, err := p.getClient()
92+
if err != nil {
93+
return err
94+
}
7595
recordId, _ := strconv.Atoi(record.ID)
76-
77-
payload := map[string]any{
78-
"Domain": strings.Trim(zone, "."),
79-
"SubDomain": record.Name,
80-
"RecordType": record.Type,
81-
"RecordLine": "默认",
82-
"Value": record.Value,
83-
"RecordId": recordId,
96+
request := dnspod.NewModifyRecordRequest()
97+
request.Domain = common.StringPtr(strings.Trim(zone, "."))
98+
request.SubDomain = common.StringPtr(record.Name)
99+
request.RecordType = common.StringPtr(record.Type)
100+
request.RecordLine = common.StringPtr("默认")
101+
request.Value = common.StringPtr(record.Value)
102+
request.RecordId = common.Uint64Ptr(uint64(recordId))
103+
104+
_, err = client.ModifyRecord(request)
105+
if err != nil {
106+
return err
84107
}
85-
86-
_, err := p.doRequest("ModifyRecord", payload)
87-
88-
return err
89-
108+
return nil
90109
}
91110

111+
// deleteRecord deletes a record for a zone
92112
func (p *Provider) deleteRecord(ctx context.Context, zone string, record libdns.Record) error {
93-
94-
recordId, _ := strconv.Atoi(record.ID)
95-
96-
payload := map[string]any{
97-
"Domain": strings.Trim(zone, "."),
98-
"RecordId": recordId,
113+
client, err := p.getClient()
114+
if err != nil {
115+
return err
99116
}
117+
recordId, _ := strconv.Atoi(record.ID)
118+
request := dnspod.NewDeleteRecordRequest()
119+
request.Domain = common.StringPtr(strings.Trim(zone, "."))
120+
request.RecordId = common.Uint64Ptr(uint64(recordId))
100121

101-
_, err := p.doRequest("DeleteRecord", payload)
102-
103-
return err
104-
105-
}
106-
107-
func (p *Provider) doRequest(action string, payload any) ([]byte, error) {
108-
109-
cpf := tp.NewClientProfile()
110-
cpf.HttpProfile.RootDomain = "tencentcloudapi.com"
111-
112-
cred := tc.NewCredential(p.SecretId, p.SecretKey)
113-
client := tc.NewCommonClient(cred, "", cpf)
114-
115-
request := th.NewCommonRequest("dnspod", "2021-03-23", action)
116-
request.SetActionParameters(payload)
117-
118-
response := th.NewCommonResponse()
119-
120-
if err := client.Send(request, response); err != nil {
121-
return nil, err
122+
_, err = client.DeleteRecord(request)
123+
if err != nil {
124+
return err
122125
}
123-
124-
return response.GetBody(), nil
125-
126+
return nil
126127
}

go.mod

+6-2
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,9 @@ module github.com/libdns/tencentcloud
22

33
go 1.18
44

5-
require github.com/libdns/libdns v0.2.1
6-
require github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.597
5+
require github.com/libdns/libdns v0.2.2
6+
7+
require (
8+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1033
9+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.1033
10+
)

go.sum

+6-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
github.com/libdns/libdns v0.2.1 h1:Wu59T7wSHRgtA0cfxC+n1c/e+O3upJGWytknkmFEDis=
2-
github.com/libdns/libdns v0.2.1/go.mod h1:yQCXzk1lEZmmCPa857bnk4TsOiqYasqpyOEeSObbb40=
3-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.597 h1:C0GHdLTfikLVoEzfhgPfrZ7LwlG0xiCmk6iwNKE+xs0=
4-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.597/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
1+
github.com/libdns/libdns v0.2.2 h1:O6ws7bAfRPaBsgAYt8MDe2HcNBGC29hkZ9MX2eUSX3s=
2+
github.com/libdns/libdns v0.2.2/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfsZqLWQ=
3+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1033 h1:g263/dapUpOAZJa1Y9x07WgfOl7Yy+FM5Mrf4WyttS8=
4+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1033/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
5+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.1033 h1:bRCo+X6i/6B+5Q/G4+rexcMRxpSq+9XS/8+Usn6OcOA=
6+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.1033/go.mod h1:ta9FOsQP/SvQAhDD6IhVhYWyY+eboPEbPWq7zpiNwZA=

model.go

-25
This file was deleted.

provider.go

+23-14
Original file line numberDiff line numberDiff line change
@@ -6,48 +6,57 @@ import (
66
"github.com/libdns/libdns"
77
)
88

9-
func (p *Provider) GetRecords(ctx context.Context, zone string) ([]libdns.Record, error) {
9+
// Provider is a libdns provider for Tencent Cloud DNS
10+
type Provider struct {
11+
// SecretId is the secret ID for Tencent Cloud DNS
12+
SecretId string
13+
// SecretKey is the secret key for Tencent Cloud DNS
14+
SecretKey string
15+
}
1016

17+
// GetRecords gets the records for a zone
18+
func (p *Provider) GetRecords(ctx context.Context, zone string) ([]libdns.Record, error) {
1119
return p.describeRecordList(ctx, zone)
12-
1320
}
1421

22+
// AppendRecords appends records to a zone
1523
func (p *Provider) AppendRecords(ctx context.Context, zone string, records []libdns.Record) ([]libdns.Record, error) {
16-
1724
for k, record := range records {
1825
if id, err := p.createRecord(ctx, zone, record); err != nil {
1926
return records, err
2027
} else {
2128
records[k].ID = id
2229
}
2330
}
24-
2531
return records, nil
26-
2732
}
2833

34+
// SetRecords sets the records for a zone
2935
func (p *Provider) SetRecords(ctx context.Context, zone string, records []libdns.Record) ([]libdns.Record, error) {
30-
31-
for _, record := range records {
32-
if err := p.modifyRecord(ctx, zone, record); err != nil {
33-
return nil, err
36+
for i, record := range records {
37+
if record.ID == "" {
38+
newRecord, err := p.AppendRecords(ctx, zone, []libdns.Record{record})
39+
if err != nil {
40+
return nil, err
41+
}
42+
records[i].ID = newRecord[0].ID
43+
} else {
44+
if err := p.modifyRecord(ctx, zone, record); err != nil {
45+
return nil, err
46+
}
3447
}
3548
}
36-
3749
return records, nil
38-
3950
}
4051

52+
// DeleteRecords deletes the records for a zone
4153
func (p *Provider) DeleteRecords(ctx context.Context, zone string, records []libdns.Record) ([]libdns.Record, error) {
42-
4354
for _, record := range records {
4455
if err := p.deleteRecord(ctx, zone, record); err != nil {
4556
return nil, err
4657
}
4758
}
48-
4959
return records, nil
50-
5160
}
5261

5362
// Interface guards

0 commit comments

Comments
 (0)