Add aliyun sts token support

This commit is contained in:
xianlubird 2018-08-30 14:29:39 +08:00 committed by xianlu
parent eab3f50802
commit e488e2bb0f
5 changed files with 293 additions and 123 deletions

View File

@ -49,6 +49,7 @@ Note that all flags can be replaced with environment variables; for instance,
The following tutorials are provided:
* [Alibaba Cloud](docs/tutorials/alibabacloud.md)
* [AWS (Route53)](docs/tutorials/aws.md)
* [AWS (Service Discovery)](docs/tutorials/aws-sd.md)
* [Azure](docs/tutorials/azure.md)

View File

@ -28,6 +28,11 @@ This tutorial describes how to setup ExternalDNS for usage within a Kubernetes c
"Resource": "*",
"Effect": "Allow"
},
{
"Action": "alidns:DescribeDomains",
"Resource": "*",
"Effect": "Allow"
},
{
"Action": "pvtz:AddZoneRecord",
"Resource": "*",

View File

@ -40,6 +40,7 @@ var (
GoogleProject: "",
DomainFilter: []string{""},
ZoneIDFilter: []string{""},
AlibabaCloudConfigFile: "/etc/kubernetes/alibaba-cloud.json",
AWSZoneType: "",
AWSAssumeRole: "",
AWSMaxChangeCount: 4000,
@ -86,6 +87,7 @@ var (
GoogleProject: "project",
DomainFilter: []string{"example.org", "company.com"},
ZoneIDFilter: []string{"/hostedzone/ZTST1", "/hostedzone/ZTST2"},
AlibabaCloudConfigFile: "/etc/kubernetes/alibaba-cloud.json",
AWSZoneType: "private",
AWSAssumeRole: "some-other-role",
AWSMaxChangeCount: 100,

View File

@ -33,6 +33,8 @@ import (
"github.com/aliyun/alibaba-cloud-sdk-go/services/pvtz"
"github.com/denverdino/aliyungo/metadata"
"strings"
"sync"
"time"
)
const (
@ -44,15 +46,15 @@ const (
// AlibabaCloudDNSAPI is a minimal implementation of DNS API that we actually use, used primarily for unit testing.
// See https://help.aliyun.com/document_detail/29739.html for descriptions of all of its methods.
type AlibabaCloudDNSAPI interface {
AddDomainRecord(request *alidns.AddDomainRecordRequest) (response *alidns.AddDomainRecordResponse, err error)
DeleteDomainRecord(request *alidns.DeleteDomainRecordRequest) (response *alidns.DeleteDomainRecordResponse, err error)
UpdateDomainRecord(request *alidns.UpdateDomainRecordRequest) (response *alidns.UpdateDomainRecordResponse, err error)
DescribeDomainRecords(request *alidns.DescribeDomainRecordsRequest) (response *alidns.DescribeDomainRecordsResponse, err error)
DescribeDomains(request *alidns.DescribeDomainsRequest) (response *alidns.DescribeDomainsResponse, err error)
}
// AlibabaCloudDNSAPI is a minimal implementation of Private Zone API that we actually use, used primarily for unit testing.
// AlibabaCloudPrivateZoneAPI is a minimal implementation of Private Zone API that we actually use, used primarily for unit testing.
// See https://help.aliyun.com/document_detail/66234.html for descriptions of all of its methods.
type AlibabaCloudPrivateZoneAPI interface {
AddZoneRecord(request *pvtz.AddZoneRecordRequest) (response *pvtz.AddZoneRecordResponse, err error)
@ -64,7 +66,6 @@ type AlibabaCloudPrivateZoneAPI interface {
}
// AlibabaCloudProvider implements the DNS provider for Alibaba Cloud.
type AlibabaCloudProvider struct {
domainFilter DomainFilter
zoneIDFilter ZoneIDFilter // Private Zone only
@ -77,14 +78,18 @@ type AlibabaCloudProvider struct {
dnsClient AlibabaCloudDNSAPI
pvtzClient AlibabaCloudPrivateZoneAPI
privateZone bool
clientLock sync.RWMutex
nextExpire time.Time
}
type alibabaCloudConfig struct {
RegionID string `json:"regionId" yaml:"regionId"`
AccessKeyID string `json:"accessKeyId" yaml:"accessKeyId"`
AccessKeySecret string `json:"accessKeySecret" yaml:"accessKeySecret"`
VPCID string `json:"vpcId" yaml:"vpcId"`
RoleName string `json:"-" yaml:"-"` // For ECS RAM role only
RegionID string `json:"regionId" yaml:"regionId"`
AccessKeyID string `json:"accessKeyId" yaml:"accessKeyId"`
AccessKeySecret string `json:"accessKeySecret" yaml:"accessKeySecret"`
VPCID string `json:"vpcId" yaml:"vpcId"`
RoleName string `json:"-" yaml:"-"` // For ECS RAM role only
StsToken string `json:"-" yaml:"-"`
ExpireTime time.Time `json:"-" yaml:"-"`
}
// NewAlibabaCloudProvider creates a new Alibaba Cloud provider.
@ -102,24 +107,11 @@ func NewAlibabaCloudProvider(configFile string, domainFilter DomainFilter, zoneI
return nil, fmt.Errorf("Failed to parse Alibaba Cloud config file '%s': %v", configFile, err)
}
} else {
// Load config from Metadata Service
m := metadata.NewMetaData(nil)
roleName := ""
var err error
if roleName, err = m.RoleName(); err != nil {
return nil, fmt.Errorf("Failed to get role name from Metadata Service: %v", err)
var tmpError error
cfg, tmpError = getCloudConfigFromStsToken()
if tmpError != nil {
return nil, fmt.Errorf("Failed to getCloudConfigFromStsToken: %v", tmpError)
}
vpcID, err := m.VpcID()
if err != nil {
return nil, fmt.Errorf("Failed to get VPC ID from Metadata Service: %v", err)
}
regionID, err := m.Region()
if err != nil {
return nil, fmt.Errorf("Failed to get Region ID from Metadata Service: %v", err)
}
cfg.RegionID = regionID
cfg.RoleName = roleName
cfg.VPCID = vpcID
}
// Public DNS service
@ -133,9 +125,11 @@ func NewAlibabaCloudProvider(configFile string, domainFilter DomainFilter, zoneI
cfg.AccessKeySecret,
)
} else {
dnsClient, err = alidns.NewClientWithEcsRamRole(
dnsClient, err = alidns.NewClientWithStsToken(
cfg.RegionID,
cfg.RoleName,
cfg.AccessKeyID,
cfg.AccessKeySecret,
cfg.StsToken,
)
}
@ -152,9 +146,11 @@ func NewAlibabaCloudProvider(configFile string, domainFilter DomainFilter, zoneI
cfg.AccessKeySecret,
)
} else {
pvtzClient, err = pvtz.NewClientWithEcsRamRole(
"cn-hangzhou", // The Private Zone location is fixed
cfg.RoleName,
pvtzClient, err = pvtz.NewClientWithStsToken(
cfg.RegionID,
cfg.AccessKeyID,
cfg.AccessKeySecret,
cfg.StsToken,
)
}
@ -165,11 +161,120 @@ func NewAlibabaCloudProvider(configFile string, domainFilter DomainFilter, zoneI
dryRun: dryRun,
dnsClient: dnsClient,
pvtzClient: pvtzClient,
privateZone: (zoneType == "private"),
privateZone: zoneType == "private",
}
if cfg.RoleName != "" {
provider.setNextExpire(cfg.ExpireTime)
go provider.refreshStsToken(1 * time.Second)
}
return provider, nil
}
func getCloudConfigFromStsToken() (alibabaCloudConfig, error) {
cfg := alibabaCloudConfig{}
// Load config from Metadata Service
m := metadata.NewMetaData(nil)
roleName := ""
var err error
if roleName, err = m.RoleName(); err != nil {
return cfg, fmt.Errorf("Failed to get role name from Metadata Service: %v", err)
}
vpcID, err := m.VpcID()
if err != nil {
return cfg, fmt.Errorf("Failed to get VPC ID from Metadata Service: %v", err)
}
regionID, err := m.Region()
if err != nil {
return cfg, fmt.Errorf("Failed to get Region ID from Metadata Service: %v", err)
}
role, err := m.RamRoleToken(roleName)
if err != nil {
return cfg, fmt.Errorf("Failed to get STS Token from Metadata Service: %v", err)
}
cfg.RegionID = regionID
cfg.RoleName = roleName
cfg.VPCID = vpcID
cfg.AccessKeyID = role.AccessKeyId
cfg.AccessKeySecret = role.AccessKeySecret
cfg.StsToken = role.SecurityToken
cfg.ExpireTime = role.Expiration
return cfg, nil
}
func (p *AlibabaCloudProvider) getDNSClient() AlibabaCloudDNSAPI {
p.clientLock.RLock()
defer p.clientLock.RUnlock()
return p.dnsClient
}
func (p *AlibabaCloudProvider) getPvtzClient() AlibabaCloudPrivateZoneAPI {
p.clientLock.RLock()
defer p.clientLock.RUnlock()
return p.pvtzClient
}
func (p *AlibabaCloudProvider) setNextExpire(expireTime time.Time) {
p.clientLock.Lock()
defer p.clientLock.Unlock()
p.nextExpire = expireTime
}
func (p *AlibabaCloudProvider) refreshStsToken(sleepTime time.Duration) {
for {
time.Sleep(sleepTime)
now := time.Now()
utcLocation, err := time.LoadLocation("")
if err != nil {
log.Errorf("Get utc time error %v", err)
continue
}
nowTime := now.In(utcLocation)
p.clientLock.RLock()
sleepTime = p.nextExpire.Sub(nowTime)
p.clientLock.RUnlock()
log.Infof("Distance expiration time %v", sleepTime)
if sleepTime < time.Duration(10*time.Minute) {
sleepTime = time.Duration(time.Second * 1)
} else {
sleepTime = time.Duration(9 * time.Minute)
log.Info("Next fetch sts sleep interval : ", sleepTime.String())
continue
}
cfg, err := getCloudConfigFromStsToken()
if err != nil {
log.Errorf("Failed to getCloudConfigFromStsToken: %v", err)
continue
}
dnsClient, err := alidns.NewClientWithStsToken(
cfg.RegionID,
cfg.AccessKeyID,
cfg.AccessKeySecret,
cfg.StsToken,
)
if err != nil {
log.Errorf("Failed to new client with sts token %v", err)
continue
}
pvtzClient, err := pvtz.NewClientWithStsToken(
cfg.RegionID,
cfg.AccessKeyID,
cfg.AccessKeySecret,
cfg.StsToken,
)
if err != nil {
log.Errorf("Failed to new client with sts token %v", err)
continue
}
log.Infof("Refresh client from sts token, next expire time %v", cfg.ExpireTime)
p.clientLock.Lock()
p.dnsClient = dnsClient
p.pvtzClient = pvtzClient
p.nextExpire = cfg.ExpireTime
p.clientLock.Unlock()
}
}
// Records gets the current records.
//
// Returns the current records or an error if the operation failed.
@ -193,17 +298,15 @@ func (p *AlibabaCloudProvider) ApplyChanges(changes *plan.Changes) error {
if p.privateZone {
return p.applyChangesForPrivateZone(changes)
} else {
return p.applyChangesForDNS(changes)
}
return p.applyChangesForDNS(changes)
}
func (p *AlibabaCloudProvider) getDNSName(rr, domain string) string {
if rr == nullHostAlibabaCloud {
return domain
} else {
return rr + "." + domain
}
return rr + "." + domain
}
// recordsForDNS gets the current records.
@ -242,18 +345,15 @@ func getNextPageNumber(pageNumber, pageSize, totalCount int) int {
if pageNumber*pageSize >= totalCount {
return 0
} else {
return pageNumber + 1
}
return pageNumber + 1
}
func (p *AlibabaCloudProvider) getRecordKey(record alidns.Record) string {
if record.RR == nullHostAlibabaCloud {
return record.Type + ":" + record.DomainName
} else {
return record.Type + ":" + record.RR + "." + record.DomainName
}
return record.Type + ":" + record.RR + "." + record.DomainName
}
func (p *AlibabaCloudProvider) getRecordKeyByEndpoint(endpoint *endpoint.Endpoint) string {
@ -277,53 +377,104 @@ func (p *AlibabaCloudProvider) groupRecords(records []alidns.Record) (endpointMa
}
func (p *AlibabaCloudProvider) records() ([]alidns.Record, error) {
log.Debug("Retrieving Alibaba Cloud DNS Domain Records")
log.Infof("Retrieving Alibaba Cloud DNS Domain Records")
var results []alidns.Record
for _, domainName := range p.domainFilter.filters {
request := alidns.CreateDescribeDomainRecordsRequest()
request.DomainName = domainName
request.PageSize = requests.NewInteger(defaultAlibabaCloudPageSize)
request.PageNumber = "1"
for {
response, err := p.dnsClient.DescribeDomainRecords(request)
if len(p.domainFilter.filters) == 1 && p.domainFilter.filters[0] == "" {
domainNames, tmpErr := p.getDomainList()
if tmpErr != nil {
log.Errorf("AlibabaCloudProvider getDomainList error %v", tmpErr)
return results, tmpErr
}
for _, tmpDomainName := range domainNames {
tmpResults, err := p.getDomainRecords(tmpDomainName)
if err != nil {
log.Errorf("Failed to describe domain records for Alibaba Cloud DNS: %v", err)
return nil, err
log.Errorf("AlibabaCloudProvider getDomainRecords %s error %v", tmpDomainName, err)
continue
}
for _, record := range response.DomainRecords.Record {
domainName := record.DomainName
recordType := record.Type
if !p.domainFilter.Match(domainName) {
continue
}
if !supportedRecordType(recordType) {
continue
}
//TODO filter Locked record
results = append(results, record)
}
nextPage := getNextPageNumber(response.PageNumber, defaultAlibabaCloudPageSize, response.TotalCount)
if nextPage == 0 {
break
} else {
request.PageNumber = requests.NewInteger(nextPage)
results = append(results, tmpResults...)
}
} else {
for _, domainName := range p.domainFilter.filters {
tmpResults, err := p.getDomainRecords(domainName)
if err != nil {
log.Errorf("getDomainRecords %s error %v", domainName, err)
continue
}
results = append(results, tmpResults...)
}
}
log.Infof("Found %d Alibaba Cloud DNS record(s).", len(results))
return results, nil
}
func (p *AlibabaCloudProvider) getDomainList() ([]string, error) {
var domainNames []string
request := alidns.CreateDescribeDomainsRequest()
request.PageSize = requests.NewInteger(defaultAlibabaCloudPageSize)
request.PageNumber = "1"
for {
resp, err := p.dnsClient.DescribeDomains(request)
if err != nil {
log.Errorf("Failed to describe domains for Alibaba Cloud DNS: %v", err)
return nil, err
}
for _, tmpDomain := range resp.Domains.Domain {
domainNames = append(domainNames, tmpDomain.DomainName)
}
nextPage := getNextPageNumber(resp.PageNumber, defaultAlibabaCloudPageSize, resp.TotalCount)
if nextPage == 0 {
break
} else {
request.PageNumber = requests.NewInteger(nextPage)
}
}
return domainNames, nil
}
func (p *AlibabaCloudProvider) getDomainRecords(domainName string) ([]alidns.Record, error) {
var results []alidns.Record
request := alidns.CreateDescribeDomainRecordsRequest()
request.DomainName = domainName
request.PageSize = requests.NewInteger(defaultAlibabaCloudPageSize)
request.PageNumber = "1"
for {
response, err := p.getDNSClient().DescribeDomainRecords(request)
if err != nil {
log.Errorf("Failed to describe domain records for Alibaba Cloud DNS: %v", err)
return nil, err
}
for _, record := range response.DomainRecords.Record {
domainName := record.DomainName
recordType := record.Type
if !p.domainFilter.Match(domainName) {
continue
}
if !supportedRecordType(recordType) {
continue
}
//TODO filter Locked record
results = append(results, record)
}
nextPage := getNextPageNumber(response.PageNumber, defaultAlibabaCloudPageSize, response.TotalCount)
if nextPage == 0 {
break
} else {
request.PageNumber = requests.NewInteger(nextPage)
}
}
return results, nil
}
func (p *AlibabaCloudProvider) applyChangesForDNS(changes *plan.Changes) error {
log.Debugf("ApplyChanges to Alibaba Cloud DNS: %++v", *changes)
log.Infof("ApplyChanges to Alibaba Cloud DNS: %++v", *changes)
records, err := p.records()
if err != nil {
@ -373,7 +524,7 @@ func (p *AlibabaCloudProvider) createRecord(endpoint *endpoint.Endpoint, target
return nil
}
response, err := p.dnsClient.AddDomainRecord(request)
response, err := p.getDNSClient().AddDomainRecord(request)
if err == nil {
log.Infof("Create %s record named '%s' to '%s' with ttl %d for Alibaba Cloud DNS: Record ID=%s", endpoint.RecordType, endpoint.DNSName, target, ttl, response.RecordId)
} else {
@ -399,11 +550,11 @@ func (p *AlibabaCloudProvider) deleteRecord(recordID string) error {
request := alidns.CreateDeleteDomainRecordRequest()
request.RecordId = recordID
response, err := p.dnsClient.DeleteDomainRecord(request)
response, err := p.getDNSClient().DeleteDomainRecord(request)
if err == nil {
log.Infof("Delete record id '%s' in Alibaba Cloud DNS", response.RecordId)
log.Infof("Delete record id %s in Alibaba Cloud DNS", response.RecordId)
} else {
log.Errorf("Failed to delete record '%s' in Alibaba Cloud DNS: %v", err)
log.Errorf("Failed to delete record '%s' in Alibaba Cloud DNS: %v", response.RecordId, err)
}
return err
}
@ -418,7 +569,7 @@ func (p *AlibabaCloudProvider) updateRecord(record alidns.Record, endpoint *endp
if ttl != 0 {
request.TTL = requests.NewInteger(ttl)
}
response, err := p.dnsClient.UpdateDomainRecord(request)
response, err := p.getDNSClient().UpdateDomainRecord(request)
if err == nil {
log.Infof("Update record id '%s' in Alibaba Cloud DNS", response.RecordId)
} else {
@ -551,7 +702,7 @@ func (p *AlibabaCloudProvider) splitDNSName(endpoint *endpoint.Endpoint) (rr str
func (p *AlibabaCloudProvider) matchVPC(zoneID string) bool {
request := pvtz.CreateDescribeZoneInfoRequest()
request.ZoneId = zoneID
response, err := p.pvtzClient.DescribeZoneInfo(request)
response, err := p.getPvtzClient().DescribeZoneInfo(request)
if err != nil {
log.Errorf("Failed to describe zone info %s in Alibaba Cloud DNS: %v", zoneID, err)
return false
@ -575,7 +726,7 @@ func (p *AlibabaCloudProvider) privateZones() ([]pvtz.Zone, error) {
request.PageNumber = "1"
for {
response, err := p.pvtzClient.DescribeZones(request)
response, err := p.getPvtzClient().DescribeZones(request)
if err != nil {
log.Errorf("Failed to describe zones in Alibaba Cloud DNS: %v", err)
return nil, err
@ -610,7 +761,7 @@ type alibabaPrivateZone struct {
}
func (p *AlibabaCloudProvider) getPrivateZones() (map[string]*alibabaPrivateZone, error) {
log.Debug("Retrieving Alibaba Cloud Private Zone records")
log.Infof("Retrieving Alibaba Cloud Private Zone records")
result := make(map[string]*alibabaPrivateZone)
recordsCount := 0
@ -630,7 +781,7 @@ func (p *AlibabaCloudProvider) getPrivateZones() (map[string]*alibabaPrivateZone
var records []pvtz.Record
for {
response, err := p.pvtzClient.DescribeZoneRecords(request)
response, err := p.getPvtzClient().DescribeZoneRecords(request)
if err != nil {
log.Errorf("Failed to describe zone record '%s' in Alibaba Cloud DNS: %v", zone.ZoneId, err)
@ -663,7 +814,7 @@ func (p *AlibabaCloudProvider) getPrivateZones() (map[string]*alibabaPrivateZone
recordsCount += len(records)
result[zone.ZoneName] = &privateZone
}
log.Debugf("Found %d Alibaba Cloud Private Zone record(s).", recordsCount)
log.Infof("Found %d Alibaba Cloud Private Zone record(s).", recordsCount)
return result, nil
}
@ -744,7 +895,7 @@ func (p *AlibabaCloudProvider) createPrivateZoneRecord(zones map[string]*alibaba
return nil
}
response, err := p.pvtzClient.AddZoneRecord(request)
response, err := p.getPvtzClient().AddZoneRecord(request)
if err == nil {
log.Infof("Create %s record named '%s' to '%s' with ttl %d for Alibaba Cloud Private Zone: Record ID=%d", endpoint.RecordType, endpoint.DNSName, target, ttl, response.RecordId)
} else {
@ -771,11 +922,11 @@ func (p *AlibabaCloudProvider) deletePrivateZoneRecord(recordID int) error {
request := pvtz.CreateDeleteZoneRecordRequest()
request.RecordId = requests.NewInteger(recordID)
response, err := p.pvtzClient.DeleteZoneRecord(request)
response, err := p.getPvtzClient().DeleteZoneRecord(request)
if err == nil {
log.Infof("Delete record id '%d' in Alibaba Cloud Private Zone", response.RecordId)
} else {
log.Errorf("Failed to delete record '%s' in Alibaba Cloud Private Zone: %v", err)
log.Errorf("Failed to delete record %d in Alibaba Cloud Private Zone: %v", response.RecordId, err)
}
return err
}
@ -818,7 +969,7 @@ func (p *AlibabaCloudProvider) deletePrivateZoneRecords(zones map[string]*alibab
//
// Returns nil if the operation was successful or an error if the operation failed.
func (p *AlibabaCloudProvider) applyChangesForPrivateZone(changes *plan.Changes) error {
log.Debugf("ApplyChanges to Alibaba Cloud Private Zone: %++v", *changes)
log.Infof("ApplyChanges to Alibaba Cloud Private Zone: %++v", *changes)
zones, err := p.getPrivateZones()
if err != nil {
@ -845,7 +996,7 @@ func (p *AlibabaCloudProvider) updatePrivateZoneRecord(record pvtz.Record, endpo
if ttl != 0 {
request.Ttl = requests.NewInteger(ttl)
}
response, err := p.pvtzClient.UpdateZoneRecord(request)
response, err := p.getPvtzClient().UpdateZoneRecord(request)
if err == nil {
log.Infof("Update record id '%d' in Alibaba Cloud Private Zone", response.RecordId)
} else {

View File

@ -25,14 +25,14 @@ import (
"github.com/kubernetes-incubator/external-dns/plan"
)
type mockAlibabaCloudDNSAPI struct {
type MockAlibabaCloudDNSAPI struct {
records []alidns.Record
}
func NewMockAlibabaCloudDNSAPI() *mockAlibabaCloudDNSAPI {
api := mockAlibabaCloudDNSAPI{}
func NewMockAlibabaCloudDNSAPI() *MockAlibabaCloudDNSAPI {
api := MockAlibabaCloudDNSAPI{}
api.records = []alidns.Record{
alidns.Record{
{
RecordId: "1",
DomainName: "container-service.top",
Type: "A",
@ -40,7 +40,7 @@ func NewMockAlibabaCloudDNSAPI() *mockAlibabaCloudDNSAPI {
RR: "abc",
Value: "1.2.3.4",
},
alidns.Record{
{
RecordId: "2",
DomainName: "container-service.top",
Type: "TXT",
@ -52,7 +52,7 @@ func NewMockAlibabaCloudDNSAPI() *mockAlibabaCloudDNSAPI {
return &api
}
func (m *mockAlibabaCloudDNSAPI) AddDomainRecord(request *alidns.AddDomainRecordRequest) (response *alidns.AddDomainRecordResponse, err error) {
func (m *MockAlibabaCloudDNSAPI) AddDomainRecord(request *alidns.AddDomainRecordRequest) (response *alidns.AddDomainRecordResponse, err error) {
ttl, _ := request.TTL.GetValue()
m.records = append(m.records, alidns.Record{
RecordId: "3",
@ -66,7 +66,7 @@ func (m *mockAlibabaCloudDNSAPI) AddDomainRecord(request *alidns.AddDomainRecord
return response, nil
}
func (m *mockAlibabaCloudDNSAPI) DeleteDomainRecord(request *alidns.DeleteDomainRecordRequest) (response *alidns.DeleteDomainRecordResponse, err error) {
func (m *MockAlibabaCloudDNSAPI) DeleteDomainRecord(request *alidns.DeleteDomainRecordRequest) (response *alidns.DeleteDomainRecordResponse, err error) {
var result []alidns.Record
for _, record := range m.records {
if record.RecordId != request.RecordId {
@ -79,9 +79,9 @@ func (m *mockAlibabaCloudDNSAPI) DeleteDomainRecord(request *alidns.DeleteDomain
return response, nil
}
func (m *mockAlibabaCloudDNSAPI) UpdateDomainRecord(request *alidns.UpdateDomainRecordRequest) (response *alidns.UpdateDomainRecordResponse, err error) {
func (m *MockAlibabaCloudDNSAPI) UpdateDomainRecord(request *alidns.UpdateDomainRecordRequest) (response *alidns.UpdateDomainRecordResponse, err error) {
ttl, _ := request.TTL.GetValue()
for i, _ := range m.records {
for i := range m.records {
if m.records[i].RecordId == request.RecordId {
m.records[i].TTL = ttl
}
@ -91,7 +91,18 @@ func (m *mockAlibabaCloudDNSAPI) UpdateDomainRecord(request *alidns.UpdateDomain
return response, nil
}
func (m *mockAlibabaCloudDNSAPI) DescribeDomainRecords(request *alidns.DescribeDomainRecordsRequest) (response *alidns.DescribeDomainRecordsResponse, err error) {
func (m *MockAlibabaCloudDNSAPI) DescribeDomains(request *alidns.DescribeDomainsRequest) (response *alidns.DescribeDomainsResponse, err error) {
var result alidns.Domains
for _, record := range m.records {
domain := alidns.Domain{}
domain.DomainName = record.DomainName
}
response = alidns.CreateDescribeDomainsResponse()
response.Domains = result
return response, nil
}
func (m *MockAlibabaCloudDNSAPI) DescribeDomainRecords(request *alidns.DescribeDomainRecordsRequest) (response *alidns.DescribeDomainRecordsResponse, err error) {
var result []alidns.Record
for _, record := range m.records {
if record.DomainName == request.DomainName {
@ -103,26 +114,26 @@ func (m *mockAlibabaCloudDNSAPI) DescribeDomainRecords(request *alidns.DescribeD
return response, nil
}
type mockAlibabaCloudPrivateZoneAPI struct {
type MockAlibabaCloudPrivateZoneAPI struct {
zone pvtz.Zone
records []pvtz.Record
}
func NewMockAlibabaCloudPrivateZoneAPI() *mockAlibabaCloudPrivateZoneAPI {
api := mockAlibabaCloudPrivateZoneAPI{}
func NewMockAlibabaCloudPrivateZoneAPI() *MockAlibabaCloudPrivateZoneAPI {
api := MockAlibabaCloudPrivateZoneAPI{}
api.zone = pvtz.Zone{
ZoneId: "test-zone",
ZoneName: "container-service.top",
}
api.records = []pvtz.Record{
pvtz.Record{
{
RecordId: 1,
Type: "A",
Ttl: 300,
Rr: "abc",
Value: "1.2.3.4",
},
pvtz.Record{
{
RecordId: 2,
Type: "TXT",
Ttl: 300,
@ -133,7 +144,7 @@ func NewMockAlibabaCloudPrivateZoneAPI() *mockAlibabaCloudPrivateZoneAPI {
return &api
}
func (m *mockAlibabaCloudPrivateZoneAPI) AddZoneRecord(request *pvtz.AddZoneRecordRequest) (response *pvtz.AddZoneRecordResponse, err error) {
func (m *MockAlibabaCloudPrivateZoneAPI) AddZoneRecord(request *pvtz.AddZoneRecordRequest) (response *pvtz.AddZoneRecordResponse, err error) {
ttl, _ := request.Ttl.GetValue()
m.records = append(m.records, pvtz.Record{
RecordId: 3,
@ -146,12 +157,12 @@ func (m *mockAlibabaCloudPrivateZoneAPI) AddZoneRecord(request *pvtz.AddZoneReco
return response, nil
}
func (m *mockAlibabaCloudPrivateZoneAPI) DeleteZoneRecord(request *pvtz.DeleteZoneRecordRequest) (response *pvtz.DeleteZoneRecordResponse, err error) {
recordId, _ := request.RecordId.GetValue()
func (m *MockAlibabaCloudPrivateZoneAPI) DeleteZoneRecord(request *pvtz.DeleteZoneRecordRequest) (response *pvtz.DeleteZoneRecordResponse, err error) {
recordID, _ := request.RecordId.GetValue()
var result []pvtz.Record
for _, record := range m.records {
if record.RecordId != recordId {
if record.RecordId != recordID {
result = append(result, record)
}
}
@ -159,11 +170,11 @@ func (m *mockAlibabaCloudPrivateZoneAPI) DeleteZoneRecord(request *pvtz.DeleteZo
return response, nil
}
func (m *mockAlibabaCloudPrivateZoneAPI) UpdateZoneRecord(request *pvtz.UpdateZoneRecordRequest) (response *pvtz.UpdateZoneRecordResponse, err error) {
recordId, _ := request.RecordId.GetValue()
func (m *MockAlibabaCloudPrivateZoneAPI) UpdateZoneRecord(request *pvtz.UpdateZoneRecordRequest) (response *pvtz.UpdateZoneRecordResponse, err error) {
recordID, _ := request.RecordId.GetValue()
ttl, _ := request.Ttl.GetValue()
for i, _ := range m.records {
if m.records[i].RecordId == recordId {
for i := range m.records {
if m.records[i].RecordId == recordID {
m.records[i].Ttl = ttl
}
}
@ -171,19 +182,19 @@ func (m *mockAlibabaCloudPrivateZoneAPI) UpdateZoneRecord(request *pvtz.UpdateZo
return response, nil
}
func (m *mockAlibabaCloudPrivateZoneAPI) DescribeZoneRecords(request *pvtz.DescribeZoneRecordsRequest) (response *pvtz.DescribeZoneRecordsResponse, err error) {
func (m *MockAlibabaCloudPrivateZoneAPI) DescribeZoneRecords(request *pvtz.DescribeZoneRecordsRequest) (response *pvtz.DescribeZoneRecordsResponse, err error) {
response = pvtz.CreateDescribeZoneRecordsResponse()
response.Records.Record = append(response.Records.Record, m.records...)
return response, nil
}
func (m *mockAlibabaCloudPrivateZoneAPI) DescribeZones(request *pvtz.DescribeZonesRequest) (response *pvtz.DescribeZonesResponse, err error) {
func (m *MockAlibabaCloudPrivateZoneAPI) DescribeZones(request *pvtz.DescribeZonesRequest) (response *pvtz.DescribeZonesResponse, err error) {
response = pvtz.CreateDescribeZonesResponse()
response.Zones.Zone = append(response.Zones.Zone, m.zone)
return response, nil
}
func (m *mockAlibabaCloudPrivateZoneAPI) DescribeZoneInfo(request *pvtz.DescribeZoneInfoRequest) (response *pvtz.DescribeZoneInfoResponse, err error) {
func (m *MockAlibabaCloudPrivateZoneAPI) DescribeZoneInfo(request *pvtz.DescribeZoneInfoRequest) (response *pvtz.DescribeZoneInfoResponse, err error) {
response = pvtz.CreateDescribeZoneInfoResponse()
response.ZoneId = m.zone.ZoneId
response.ZoneName = m.zone.ZoneName
@ -216,7 +227,7 @@ func newTestAlibabaCloudProvider(private bool) *AlibabaCloudProvider {
vpcID: cfg.VPCID,
dryRun: false,
dnsClient: NewMockAlibabaCloudDNSAPI(),
pvtzClient: &mockAlibabaCloudPrivateZoneAPI{},
pvtzClient: &MockAlibabaCloudPrivateZoneAPI{},
privateZone: false,
}
}
@ -240,7 +251,7 @@ func TestAlibabaCloudProvider_ApplyChanges(t *testing.T) {
p := newTestAlibabaCloudProvider(false)
changes := plan.Changes{
Create: []*endpoint.Endpoint{
&endpoint.Endpoint{
{
DNSName: "xyz.container-service.top",
RecordType: "A",
RecordTTL: 300,
@ -248,7 +259,7 @@ func TestAlibabaCloudProvider_ApplyChanges(t *testing.T) {
},
},
UpdateNew: []*endpoint.Endpoint{
&endpoint.Endpoint{
{
DNSName: "abc.container-service.top",
RecordType: "A",
RecordTTL: 500,
@ -256,7 +267,7 @@ func TestAlibabaCloudProvider_ApplyChanges(t *testing.T) {
},
},
Delete: []*endpoint.Endpoint{
&endpoint.Endpoint{
{
DNSName: "abc.container-service.top",
RecordType: "TXT",
RecordTTL: 300,
@ -297,7 +308,7 @@ func TestAlibabaCloudProvider_ApplyChanges_PrivateZone(t *testing.T) {
p := newTestAlibabaCloudProvider(true)
changes := plan.Changes{
Create: []*endpoint.Endpoint{
&endpoint.Endpoint{
{
DNSName: "xyz.container-service.top",
RecordType: "A",
RecordTTL: 300,
@ -305,7 +316,7 @@ func TestAlibabaCloudProvider_ApplyChanges_PrivateZone(t *testing.T) {
},
},
UpdateNew: []*endpoint.Endpoint{
&endpoint.Endpoint{
{
DNSName: "abc.container-service.top",
RecordType: "A",
RecordTTL: 500,
@ -313,7 +324,7 @@ func TestAlibabaCloudProvider_ApplyChanges_PrivateZone(t *testing.T) {
},
},
Delete: []*endpoint.Endpoint{
&endpoint.Endpoint{
{
DNSName: "abc.container-service.top",
RecordType: "TXT",
RecordTTL: 300,