plugin/k8s_external: fix external nsAddrs when CoreDNS Service has no External IPs (#4891)

fix external nsAddrs; add tests;

Signed-off-by: Chris O'Haver <cohaver@infoblox.com>
This commit is contained in:
Chris O'Haver 2022-03-07 12:18:23 -05:00 committed by GitHub
parent 7263808fe1
commit 3fe9d41a21
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 58 additions and 21 deletions

View file

@ -17,6 +17,7 @@ func (k *Kubernetes) nsAddrs(external bool, zone string) []dns.RR {
var ( var (
svcNames []string svcNames []string
svcIPs []net.IP svcIPs []net.IP
foundEndpoint bool
) )
// Find the CoreDNS Endpoints // Find the CoreDNS Endpoints
@ -25,6 +26,7 @@ func (k *Kubernetes) nsAddrs(external bool, zone string) []dns.RR {
// Collect IPs for all Services of the Endpoints // Collect IPs for all Services of the Endpoints
for _, endpoint := range endpoints { for _, endpoint := range endpoints {
foundEndpoint = true
svcs := k.APIConn.SvcIndex(endpoint.Index) svcs := k.APIConn.SvcIndex(endpoint.Index)
for _, svc := range svcs { for _, svc := range svcs {
if external { if external {
@ -54,8 +56,8 @@ func (k *Kubernetes) nsAddrs(external bool, zone string) []dns.RR {
} }
} }
// If no local IPs matched any endpoints, use the localIPs directly // If no CoreDNS endpoints were found, use the localIPs directly
if len(svcIPs) == 0 { if !foundEndpoint {
svcIPs = make([]net.IP, len(k.localIPs)) svcIPs = make([]net.IP, len(k.localIPs))
svcNames = make([]string, len(k.localIPs)) svcNames = make([]string, len(k.localIPs))
for i, localIP := range k.localIPs { for i, localIP := range k.localIPs {

View file

@ -35,8 +35,7 @@ func (a APIConnTest) SvcIndex(s string) []*object.Service {
return nil return nil
} }
func (APIConnTest) ServiceList() []*object.Service { var svcs = []*object.Service{
svcs := []*object.Service{
{ {
Name: "dns-service", Name: "dns-service",
Namespace: "kube-system", Namespace: "kube-system",
@ -52,7 +51,9 @@ func (APIConnTest) ServiceList() []*object.Service {
Namespace: "kube-system", Namespace: "kube-system",
ClusterIPs: []string{"10::111"}, ClusterIPs: []string{"10::111"},
}, },
} }
func (APIConnTest) ServiceList() []*object.Service {
return svcs return svcs
} }
@ -136,3 +137,37 @@ func TestNsAddrs(t *testing.T) {
t.Errorf("Expected AAAA Header Name to be %q, got %q", expected, cdr.Header().Name) t.Errorf("Expected AAAA Header Name to be %q, got %q", expected, cdr.Header().Name)
} }
} }
func TestNsAddrsExternal(t *testing.T) {
k := New([]string{"example.com."})
k.APIConn = &APIConnTest{}
k.localIPs = []net.IP{net.ParseIP("10.244.0.20")}
// initially no services have an external IP ...
cdrs := k.nsAddrs(true, k.Zones[0])
if len(cdrs) != 0 {
t.Fatalf("Expected 0 results, got %v", len(cdrs))
}
// Add an external IP to one of the services ...
svcs[0].ExternalIPs = []string{"1.2.3.4"}
cdrs = k.nsAddrs(true, k.Zones[0])
if len(cdrs) != 1 {
t.Fatalf("Expected 1 results, got %v", len(cdrs))
}
cdr := cdrs[0]
expected := "1.2.3.4"
if cdr.(*dns.A).A.String() != expected {
t.Errorf("Expected A address to be %q, got %q", expected, cdr.(*dns.A).A.String())
}
expected = "dns-service.kube-system.example.com."
if cdr.Header().Name != expected {
t.Errorf("Expected record name to be %q, got %q", expected, cdr.Header().Name)
}
}