From bcb4972d4ca7b5ad5a04d8313b2da01fe5ee2149 Mon Sep 17 00:00:00 2001 From: Nils Juenemann Date: Tue, 4 Jul 2017 18:37:52 +0200 Subject: [PATCH] Support for multiple hostnames in hostname annotation (#256) * service source: support for multiple hostnames per annotation * go fmt * Make parseHostnameAnnontations inline * Update CHANGELOG.md * Update Changelog --- CHANGELOG.md | 3 ++- source/service.go | 24 +++++++++++++++--------- source/service_test.go | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e0e07ce1a0..4f04558f56 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ + - The `external-dns.alpha.kubernetes.io/hostname` annotation accepts now a comma separated list of hostnames and a trailing period is not required anymore. - The flag `--domain-filter` can be repeated multiple times like `--domain-filter=example.com --domain-filter=company.org.`. - A trailing period is not required anymore for `--domain-filter` when AWS (or any other) provider is used. - + ## v0.3.0 - 2017-05-08 Features: diff --git a/source/service.go b/source/service.go index 629d62f71e..6bf77c19d2 100644 --- a/source/service.go +++ b/source/service.go @@ -140,19 +140,25 @@ func endpointsFromService(svc *v1.Service) []*endpoint.Endpoint { var endpoints []*endpoint.Endpoint // Get the desired hostname of the service from the annotation. - hostname, exists := svc.Annotations[hostnameAnnotationKey] + hostnameAnnotation, exists := svc.Annotations[hostnameAnnotationKey] if !exists { return nil } - // Create a corresponding endpoint for each configured external entrypoint. - for _, lb := range svc.Status.LoadBalancer.Ingress { - if lb.IP != "" { - //TODO(ideahitme): consider retrieving record type from resource annotation instead of empty - endpoints = append(endpoints, endpoint.NewEndpoint(hostname, lb.IP, "")) - } - if lb.Hostname != "" { - endpoints = append(endpoints, endpoint.NewEndpoint(hostname, lb.Hostname, "")) + // splits the hostname annotation and removes the trailing periods + hostnameList := strings.Split(strings.Replace(hostnameAnnotation, " ", "", -1), ",") + + for _, hostname := range hostnameList { + hostname = strings.TrimSuffix(hostname, ".") + // Create a corresponding endpoint for each configured external entrypoint. + for _, lb := range svc.Status.LoadBalancer.Ingress { + if lb.IP != "" { + //TODO(ideahitme): consider retrieving record type from resource annotation instead of empty + endpoints = append(endpoints, endpoint.NewEndpoint(hostname, lb.IP, "")) + } + if lb.Hostname != "" { + endpoints = append(endpoints, endpoint.NewEndpoint(hostname, lb.Hostname, "")) + } } } diff --git a/source/service_test.go b/source/service_test.go index a26f64394a..1e21bd7821 100644 --- a/source/service_test.go +++ b/source/service_test.go @@ -125,6 +125,42 @@ func testServiceSourceEndpoints(t *testing.T) { }, false, }, + { + "annotated services with multiple hostnames return an endpoint with target IP", + "", + "testing", + "foo", + "", + "", + map[string]string{}, + map[string]string{ + hostnameAnnotationKey: "foo.example.org., bar.example.org.", + }, + []string{"1.2.3.4"}, + []*endpoint.Endpoint{ + {DNSName: "foo.example.org", Target: "1.2.3.4"}, + {DNSName: "bar.example.org", Target: "1.2.3.4"}, + }, + false, + }, + { + "annotated services with multiple hostnames and without trailing period return an endpoint with target IP", + "", + "testing", + "foo", + "", + "", + map[string]string{}, + map[string]string{ + hostnameAnnotationKey: "foo.example.org, bar.example.org", + }, + []string{"1.2.3.4"}, + []*endpoint.Endpoint{ + {DNSName: "foo.example.org", Target: "1.2.3.4"}, + {DNSName: "bar.example.org", Target: "1.2.3.4"}, + }, + false, + }, { "annotated services return an endpoint with target hostname", "",