Skip to content

Commit 8ce04fb

Browse files
authored
Merge pull request #86 from loganhz/master
Support Aliyun DNS
2 parents c2e9dee + 4a0f35d commit 8ce04fb

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+4026
-0
lines changed

Diff for: main.go

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"github.com/rancher/external-dns/config"
1111
"github.com/rancher/external-dns/metadata"
1212
"github.com/rancher/external-dns/providers"
13+
_ "github.com/rancher/external-dns/providers/alidns"
1314
_ "github.com/rancher/external-dns/providers/cloudflare"
1415
_ "github.com/rancher/external-dns/providers/digitalocean"
1516
_ "github.com/rancher/external-dns/providers/dnsimple"

Diff for: providers/alidns/alidns.go

+173
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
package alidns
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"strings"
7+
8+
"github.com/Sirupsen/logrus"
9+
api "github.com/denverdino/aliyungo/dns"
10+
"github.com/rancher/external-dns/providers"
11+
"github.com/rancher/external-dns/utils"
12+
)
13+
14+
type AlidnsProvider struct {
15+
client *api.Client
16+
rootDomainName string
17+
}
18+
19+
func init() {
20+
providers.RegisterProvider("alidns", &AlidnsProvider{})
21+
}
22+
23+
func (a *AlidnsProvider) Init(rootDomainName string) error {
24+
accessKey := os.Getenv("ALICLOUD_ACCESS_KEY_ID")
25+
if len(accessKey) == 0 {
26+
return fmt.Errorf("ALICLOUD_ACCESS_KEY_ID is not set")
27+
}
28+
29+
secretKey := os.Getenv("ALICLOUD_ACCESS_KEY_SECRET")
30+
if len(secretKey) == 0 {
31+
return fmt.Errorf("ALICLOUD_ACCESS_KEY_SECRET is not set")
32+
}
33+
34+
a.client = api.NewClient(accessKey, secretKey)
35+
a.rootDomainName = utils.UnFqdn(rootDomainName)
36+
37+
if _, err := a.client.DescribeDomainInfo(&api.DescribeDomainInfoArgs{
38+
DomainName: a.rootDomainName,
39+
}); err != nil {
40+
return fmt.Errorf("Failed to describe root domain name for '%s': %v", a.rootDomainName, err)
41+
}
42+
43+
logrus.Infof("Configured %s with zone '%s'", a.GetName(), a.rootDomainName)
44+
return nil
45+
}
46+
47+
func (a *AlidnsProvider) GetName() string {
48+
return "AliDNS"
49+
}
50+
51+
func (a *AlidnsProvider) HealthCheck() error {
52+
_, err := a.client.DescribeDomainInfo(&api.DescribeDomainInfoArgs{
53+
DomainName: a.rootDomainName,
54+
})
55+
return err
56+
}
57+
58+
func (a *AlidnsProvider) AddRecord(record utils.DnsRecord) error {
59+
for _, rec := range record.Records {
60+
r := a.prepareRecord(record, rec)
61+
if _, err := a.client.AddDomainRecord(r); err != nil {
62+
return fmt.Errorf("Alibaba Cloud API call has failed: %v", err)
63+
}
64+
}
65+
66+
return nil
67+
}
68+
69+
func (a *AlidnsProvider) UpdateRecord(record utils.DnsRecord) error {
70+
if err := a.RemoveRecord(record); err != nil {
71+
return err
72+
}
73+
74+
return a.AddRecord(record)
75+
}
76+
77+
func (a *AlidnsProvider) RemoveRecord(record utils.DnsRecord) error {
78+
records, err := a.findRecords(record)
79+
if err != nil {
80+
return err
81+
}
82+
83+
for _, rec := range records {
84+
if _, err := a.client.DeleteDomainRecord(&api.DeleteDomainRecordArgs{
85+
RecordId: rec.RecordId,
86+
}); err != nil {
87+
return fmt.Errorf("Alibaba Cloud API call has failed: %v", err)
88+
}
89+
}
90+
91+
return nil
92+
}
93+
94+
func (a *AlidnsProvider) GetRecords() ([]utils.DnsRecord, error) {
95+
var records []utils.DnsRecord
96+
result, err := a.client.DescribeDomainRecords(&api.DescribeDomainRecordsArgs{
97+
DomainName: a.rootDomainName,
98+
})
99+
if err != nil {
100+
return records, fmt.Errorf("Alibaba Cloud API call has failed: %v", err)
101+
}
102+
103+
recordMap := map[string]map[string][]string{}
104+
recordTTLs := map[string]map[string]int{}
105+
106+
for _, rec := range result.DomainRecords.Record {
107+
var fqdn string
108+
if rec.RR == "" {
109+
fqdn = a.rootDomainName + "."
110+
} else {
111+
fqdn = fmt.Sprintf("%s.%s.", rec.RR, a.rootDomainName)
112+
}
113+
114+
recordTTLs[fqdn] = map[string]int{}
115+
recordTTLs[fqdn][rec.Type] = int(rec.TTL)
116+
recordSet, exists := recordMap[fqdn]
117+
if exists {
118+
recordSlice, sliceExists := recordSet[rec.Type]
119+
if sliceExists {
120+
recordSlice = append(recordSlice, rec.Value)
121+
recordSet[rec.Type] = recordSlice
122+
} else {
123+
recordSet[rec.Type] = []string{rec.Value}
124+
}
125+
} else {
126+
recordMap[fqdn] = map[string][]string{}
127+
recordMap[fqdn][rec.Type] = []string{rec.Value}
128+
}
129+
}
130+
131+
for fqdn, recordSet := range recordMap {
132+
for recordType, recordSlice := range recordSet {
133+
ttl := recordTTLs[fqdn][recordType]
134+
record := utils.DnsRecord{Fqdn: fqdn, Records: recordSlice, Type: recordType, TTL: ttl}
135+
records = append(records, record)
136+
}
137+
}
138+
139+
return records, nil
140+
}
141+
142+
func (a *AlidnsProvider) parseName(record utils.DnsRecord) string {
143+
return strings.TrimSuffix(record.Fqdn, fmt.Sprintf(".%s.", a.rootDomainName))
144+
}
145+
146+
func (a *AlidnsProvider) prepareRecord(record utils.DnsRecord, rec string) *api.AddDomainRecordArgs {
147+
return &api.AddDomainRecordArgs{
148+
DomainName: a.rootDomainName,
149+
RR: a.parseName(record),
150+
Type: record.Type,
151+
Value: rec,
152+
TTL: int32(record.TTL),
153+
}
154+
}
155+
156+
func (a *AlidnsProvider) findRecords(record utils.DnsRecord) ([]api.RecordType, error) {
157+
var records []api.RecordType
158+
result, err := a.client.DescribeDomainRecords(&api.DescribeDomainRecordsArgs{
159+
DomainName: a.rootDomainName,
160+
})
161+
if err != nil {
162+
return records, fmt.Errorf("Alibaba Cloud API call has failed: %v", err)
163+
}
164+
165+
name := a.parseName(record)
166+
for _, rec := range result.DomainRecords.Record {
167+
if rec.RR == name && rec.Type == record.Type {
168+
records = append(records, rec)
169+
}
170+
}
171+
172+
return records, nil
173+
}

Diff for: vendor.conf

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ github.com/cognetoapps/go-pointdns 0.1.0
77
github.com/crackcomm/cloudflare dc35819
88
github.com/dghubble/sling 5765fe1
99
github.com/digitalocean/godo 758b5be
10+
github.com/denverdino/aliyungo 26fc5b6
1011
github.com/go-ini/ini v1.21.1
1112
github.com/google/go-querystring/query 9235644
1213
github.com/gorilla/context 1c83b3e

Diff for: vendor/github.com/denverdino/aliyungo/.gitignore

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: vendor/github.com/denverdino/aliyungo/.travis.yml

+12
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: vendor/github.com/denverdino/aliyungo/LICENSE.txt

+191
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)