Merge pull request #79 from janeczku/fqdn-fixes

Fixes Cattle FQDN updates with custom name templates
This commit is contained in:
Denise
2017-06-12 13:42:55 -07:00
committed by GitHub
6 changed files with 63 additions and 49 deletions
+5 -5
View File
@@ -25,13 +25,13 @@ func NewCattleClient(cattleUrl string, accessKey string, secretKey string) (*Cat
}, nil
}
func (c *CattleClient) UpdateServiceDomainName(serviceDnsRecord utils.ServiceDnsRecord) error {
func (c *CattleClient) UpdateServiceDomainName(metadataRecord utils.MetadataDnsRecord) error {
event := &rancher.ExternalDnsEvent{
EventType: "dns.update",
ExternalId: serviceDnsRecord.Fqdn,
ServiceName: serviceDnsRecord.ServiceName,
StackName: serviceDnsRecord.StackName,
Fqdn: serviceDnsRecord.Fqdn,
ExternalId: metadataRecord.DnsRecord.Fqdn,
ServiceName: metadataRecord.ServiceName,
StackName: metadataRecord.StackName,
Fqdn: utils.UnFqdn(metadataRecord.DnsRecord.Fqdn),
}
_, err := c.rancherClient.ExternalDnsEvent.Create(event)
return err
+18 -16
View File
@@ -9,8 +9,8 @@ import (
"github.com/rancher/external-dns/utils"
)
func UpdateProviderDnsRecords(metadataRecs map[string]utils.DnsRecord) ([]utils.DnsRecord, error) {
var updated []utils.DnsRecord
func UpdateProviderDnsRecords(metadataRecs map[string]utils.MetadataDnsRecord) ([]utils.MetadataDnsRecord, error) {
var updated []utils.MetadataDnsRecord
ourRecords, allRecords, err := getProviderDnsRecords()
if err != nil {
return nil, fmt.Errorf("Provider error reading dns entries: %v", err)
@@ -26,8 +26,8 @@ func UpdateProviderDnsRecords(metadataRecs map[string]utils.DnsRecord) ([]utils.
return updated, nil
}
func addMissingRecords(metadataRecs map[string]utils.DnsRecord, providerRecs map[string]utils.DnsRecord) []utils.DnsRecord {
var toAdd []utils.DnsRecord
func addMissingRecords(metadataRecs map[string]utils.MetadataDnsRecord, providerRecs map[string]utils.DnsRecord) []utils.MetadataDnsRecord {
var toAdd []utils.MetadataDnsRecord
for key := range metadataRecs {
if _, ok := providerRecs[key]; !ok {
toAdd = append(toAdd, metadataRecs[key])
@@ -38,28 +38,29 @@ func addMissingRecords(metadataRecs map[string]utils.DnsRecord, providerRecs map
} else {
logrus.Debugf("DNS records to add: %v", toAdd)
}
return updateRecords(toAdd, &Add)
}
func updateRecords(toChange []utils.DnsRecord, op *Op) []utils.DnsRecord {
var changed []utils.DnsRecord
func updateRecords(toChange []utils.MetadataDnsRecord, op *Op) []utils.MetadataDnsRecord {
var changed []utils.MetadataDnsRecord
for _, value := range toChange {
switch *op {
case Add:
logrus.Infof("Adding dns record: %v", value)
if err := provider.AddRecord(value); err != nil {
if err := provider.AddRecord(value.DnsRecord); err != nil {
logrus.Errorf("Failed to add DNS record to provider %v: %v", value, err)
} else {
changed = append(changed, value)
}
case Remove:
logrus.Infof("Removing dns record: %v", value)
if err := provider.RemoveRecord(value); err != nil {
if err := provider.RemoveRecord(value.DnsRecord); err != nil {
logrus.Errorf("Failed to remove DNS record from provider %v: %v", value, err)
}
case Update:
logrus.Infof("Updating dns record: %v", value)
if err := provider.UpdateRecord(value); err != nil {
if err := provider.UpdateRecord(value.DnsRecord); err != nil {
logrus.Errorf("Failed to update DNS record to provider %v: %v", value, err)
} else {
changed = append(changed, value)
@@ -69,12 +70,12 @@ func updateRecords(toChange []utils.DnsRecord, op *Op) []utils.DnsRecord {
return changed
}
func updateExistingRecords(metadataRecs map[string]utils.DnsRecord, providerRecs map[string]utils.DnsRecord) []utils.DnsRecord {
var toUpdate []utils.DnsRecord
func updateExistingRecords(metadataRecs map[string]utils.MetadataDnsRecord, providerRecs map[string]utils.DnsRecord) []utils.MetadataDnsRecord {
var toUpdate []utils.MetadataDnsRecord
for key := range metadataRecs {
if _, ok := providerRecs[key]; ok {
metadataR := make(map[string]struct{}, len(metadataRecs[key].Records))
for _, s := range metadataRecs[key].Records {
metadataR := make(map[string]struct{}, len(metadataRecs[key].DnsRecord.Records))
for _, s := range metadataRecs[key].DnsRecord.Records {
metadataR[s] = struct{}{}
}
@@ -112,11 +113,11 @@ func updateExistingRecords(metadataRecs map[string]utils.DnsRecord, providerRecs
return updateRecords(toUpdate, &Update)
}
func removeExtraRecords(metadataRecs map[string]utils.DnsRecord, providerRecs map[string]utils.DnsRecord) []utils.DnsRecord {
var toRemove []utils.DnsRecord
func removeExtraRecords(metadataRecs map[string]utils.MetadataDnsRecord, providerRecs map[string]utils.DnsRecord) []utils.MetadataDnsRecord {
var toRemove []utils.MetadataDnsRecord
for key := range providerRecs {
if _, ok := metadataRecs[key]; !ok {
toRemove = append(toRemove, providerRecs[key])
toRemove = append(toRemove, utils.MetadataDnsRecord{"", "", providerRecs[key]})
}
}
@@ -125,6 +126,7 @@ func removeExtraRecords(metadataRecs map[string]utils.DnsRecord, providerRecs ma
} else {
logrus.Debugf("DNS records to remove: %v", toRemove)
}
return updateRecords(toRemove, &Remove)
}
+9 -5
View File
@@ -49,7 +49,7 @@ var (
m *metadata.MetadataClient
c *CattleClient
metadataRecsCached = make(map[string]utils.DnsRecord)
metadataRecsCached = make(map[string]utils.MetadataDnsRecord)
)
func setEnv() {
@@ -138,16 +138,20 @@ func main() {
// querying the provider records.
if updateForced || !reflect.DeepEqual(metadataRecs, metadataRecsCached) {
// update the provider
updated, err := UpdateProviderDnsRecords(metadataRecs)
updatedRecords, err := UpdateProviderDnsRecords(metadataRecs)
if err != nil {
logrus.Errorf("Failed to update provider with new DNS records: %v", err)
goto sleep
}
// update the service FQDN in Cattle
for _, toUpdate := range updated {
serviceDnsRecord := utils.ConvertToServiceDnsRecord(toUpdate)
c.UpdateServiceDomainName(serviceDnsRecord)
for _, mRec := range updatedRecords {
if mRec.ServiceName != "" && mRec.StackName != "" {
logrus.Debugf("Updating cattle service FQDN for %s/%s", mRec.ServiceName, mRec.StackName)
if err := c.UpdateServiceDomainName(mRec); err != nil {
logrus.Errorf("Failed to update cattle service FQDN: %v", err)
}
}
}
metadataRecsCached = metadataRecs
+16 -8
View File
@@ -60,8 +60,8 @@ func (m *MetadataClient) GetVersion() (string, error) {
return m.MetadataClient.GetVersion()
}
func (m *MetadataClient) GetMetadataDnsRecords() (map[string]utils.DnsRecord, error) {
dnsEntries := make(map[string]utils.DnsRecord)
func (m *MetadataClient) GetMetadataDnsRecords() (map[string]utils.MetadataDnsRecord, error) {
dnsEntries := make(map[string]utils.MetadataDnsRecord)
err := m.getContainersDnsRecords(dnsEntries)
if err != nil {
return dnsEntries, err
@@ -69,7 +69,7 @@ func (m *MetadataClient) GetMetadataDnsRecords() (map[string]utils.DnsRecord, er
return dnsEntries, nil
}
func (m *MetadataClient) getContainersDnsRecords(dnsEntries map[string]utils.DnsRecord) error {
func (m *MetadataClient) getContainersDnsRecords(dnsEntries map[string]utils.MetadataDnsRecord) error {
services, err := m.MetadataClient.GetServices()
if err != nil {
return err
@@ -153,7 +153,7 @@ func (m *MetadataClient) getContainersDnsRecords(dnsEntries map[string]utils.Dns
fqdn := utils.FqdnFromTemplate(nameTemplate, container.ServiceName, container.StackName,
m.EnvironmentName, config.RootDomainName)
addToDnsEntries(fqdn, externalIP, dnsEntries)
addToDnsEntries(fqdn, externalIP, container.ServiceName, container.StackName, dnsEntries)
ourFqdns[fqdn] = struct{}{}
}
}
@@ -161,18 +161,22 @@ func (m *MetadataClient) getContainersDnsRecords(dnsEntries map[string]utils.Dns
if len(ourFqdns) > 0 {
stateFqdn := utils.StateFqdn(m.EnvironmentUUID, config.RootDomainName)
stateRec := utils.StateRecord(stateFqdn, config.TTL, ourFqdns)
dnsEntries[stateFqdn] = stateRec
dnsEntries[stateFqdn] = utils.MetadataDnsRecord{
ServiceName: "",
StackName: "",
DnsRecord: stateRec,
}
}
return nil
}
func addToDnsEntries(fqdn, ip string, dnsEntries map[string]utils.DnsRecord) {
func addToDnsEntries(fqdn, ip, service, stack string, dnsEntries map[string]utils.MetadataDnsRecord) {
var records []string
if _, ok := dnsEntries[fqdn]; !ok {
records = []string{ip}
} else {
records = dnsEntries[fqdn].Records
records = dnsEntries[fqdn].DnsRecord.Records
// skip if the records already have that IP
for _, val := range records {
if val == ip {
@@ -182,7 +186,11 @@ func addToDnsEntries(fqdn, ip string, dnsEntries map[string]utils.DnsRecord) {
records = append(records, ip)
}
dnsEntries[fqdn] = utils.DnsRecord{fqdn, records, "A", config.TTL}
dnsEntries[fqdn] = utils.MetadataDnsRecord{
ServiceName: service,
StackName: stack,
DnsRecord: utils.DnsRecord{fqdn, records, "A", config.TTL},
}
}
func containerStateOK(container metadata.Container) bool {
+5 -3
View File
@@ -1,6 +1,8 @@
FROM alpine:3.4
MAINTAINER Rancher Labs, Inc.
RUN apk add --no-cache ca-certificates openssl bash
FROM alpine:3.5
LABEL maintainer "Rancher Labs, Inc."
RUN apk upgrade --no-cache && \
apk add --no-cache ca-certificates openssl bash
ENV SSL_SCRIPT_COMMIT 08278ace626ada71384fc949bd637f4c15b03b53
RUN wget -O /usr/bin/update-rancher-ssl https://raw.githubusercontent.com/rancher/rancher/${SSL_SCRIPT_COMMIT}/server/bin/update-rancher-ssl && \
+10 -12
View File
@@ -15,6 +15,16 @@ const (
stateRecordFqdnTemplate = "external-dns-%s.%s"
)
// MetadataDnsRecord is a wrapper around a DnsRecord
// that holds information about the service and stack
// the record belongs to
type MetadataDnsRecord struct {
ServiceName string
StackName string
DnsRecord DnsRecord
}
// DnsRecord represents a provider DNS record
type DnsRecord struct {
Fqdn string
Records []string
@@ -22,18 +32,6 @@ type DnsRecord struct {
TTL int
}
type ServiceDnsRecord struct {
Fqdn string
ServiceName string
StackName string
}
func ConvertToServiceDnsRecord(dnsRecord DnsRecord) ServiceDnsRecord {
splitted := strings.Split(dnsRecord.Fqdn, ".")
serviceRecord := ServiceDnsRecord{dnsRecord.Fqdn, splitted[0], splitted[1]}
return serviceRecord
}
// Fqdn ensures that the name is a fqdn adding a trailing dot if necessary.
func Fqdn(name string) string {
n := len(name)