mirror of
https://github.com/vxcontrol/external-dns.git
synced 2026-07-19 18:23:33 -04:00
Merge pull request #79 from janeczku/fqdn-fixes
Fixes Cattle FQDN updates with custom name templates
This commit is contained in:
@@ -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
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user