From e6067ca7c1a0dc69e0420a3c30ae1a7c76a65945 Mon Sep 17 00:00:00 2001 From: janeczku Date: Wed, 3 May 2017 01:32:37 +0200 Subject: [PATCH 1/2] Fixes Cattle FQDN update with custom name templates --- cattle.go | 10 +++++----- external-dns.go | 34 ++++++++++++++++++---------------- main.go | 14 +++++++++----- metadata/metadata.go | 24 ++++++++++++++++-------- utils/utils.go | 22 ++++++++++------------ 5 files changed, 58 insertions(+), 46 deletions(-) diff --git a/cattle.go b/cattle.go index 7607cc5..6968b35 100644 --- a/cattle.go +++ b/cattle.go @@ -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 diff --git a/external-dns.go b/external-dns.go index 57dc59b..7d478ab 100644 --- a/external-dns.go +++ b/external-dns.go @@ -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) } diff --git a/main.go b/main.go index 7efc660..e34a936 100644 --- a/main.go +++ b/main.go @@ -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 diff --git a/metadata/metadata.go b/metadata/metadata.go index 7dadb7d..296eb34 100644 --- a/metadata/metadata.go +++ b/metadata/metadata.go @@ -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 { diff --git a/utils/utils.go b/utils/utils.go index af9ea76..9e52c04 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -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) From f8fa579015c6dbbb47ba4d719d201451ba8c90ac Mon Sep 17 00:00:00 2001 From: janeczku Date: Sat, 13 May 2017 16:34:17 +0200 Subject: [PATCH 2/2] Upgrade base image to alpine:3.5 --- package/Dockerfile | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/package/Dockerfile b/package/Dockerfile index b794110..bfa14d8 100644 --- a/package/Dockerfile +++ b/package/Dockerfile @@ -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 && \