always add client metadata (#3874)

Signed-off-by: Chris O'Haver <cohaver@infoblox.com>
This commit is contained in:
Chris O'Haver 2020-05-05 14:34:24 -04:00 committed by GitHub
parent 9f9509b6c0
commit 7c7772b735
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 32 additions and 32 deletions

View file

@ -10,7 +10,21 @@ import (
// Metadata implements the metadata.Provider interface. // Metadata implements the metadata.Provider interface.
func (k *Kubernetes) Metadata(ctx context.Context, state request.Request) context.Context { func (k *Kubernetes) Metadata(ctx context.Context, state request.Request) context.Context {
pod := k.podWithIP(state.IP())
if pod != nil {
metadata.SetValueFunc(ctx, "kubernetes/client-namespace", func() string {
return pod.Namespace
})
metadata.SetValueFunc(ctx, "kubernetes/client-pod-name", func() string {
return pod.Name
})
}
zone := plugin.Zones(k.Zones).Matches(state.Name()) zone := plugin.Zones(k.Zones).Matches(state.Name())
if zone == "" {
return ctx
}
// possible optimization: cache r so it doesn't need to be calculated again in ServeDNS // possible optimization: cache r so it doesn't need to be calculated again in ServeDNS
r, err := parseRequest(state.Name(), zone) r, err := parseRequest(state.Name(), zone)
if err != nil { if err != nil {
@ -44,18 +58,5 @@ func (k *Kubernetes) Metadata(ctx context.Context, state request.Request) contex
return r.podOrSvc return r.podOrSvc
}) })
pod := k.podWithIP(state.IP())
if pod == nil {
return ctx
}
metadata.SetValueFunc(ctx, "kubernetes/client-namespace", func() string {
return pod.Namespace
})
metadata.SetValueFunc(ctx, "kubernetes/client-pod-name", func() string {
return pod.Name
})
return ctx return ctx
} }

View file

@ -26,23 +26,23 @@ var metadataCases = []struct {
{ {
Qname: "10-240-0-1.podns.pod.cluster.local.", Qtype: dns.TypeA, Qname: "10-240-0-1.podns.pod.cluster.local.", Qtype: dns.TypeA,
Md: map[string]string{ Md: map[string]string{
"kubernetes/endpoint": "", "kubernetes/endpoint": "",
"kubernetes/kind": "pod", "kubernetes/kind": "pod",
"kubernetes/namespace": "podns", "kubernetes/namespace": "podns",
"kubernetes/port-name": "*", "kubernetes/port-name": "*",
"kubernetes/protocol": "*", "kubernetes/protocol": "*",
"kubernetes/service": "10-240-0-1", "kubernetes/service": "10-240-0-1",
}, },
}, },
{ {
Qname: "s.ns.svc.cluster.local.", Qtype: dns.TypeA, Qname: "s.ns.svc.cluster.local.", Qtype: dns.TypeA,
Md: map[string]string{ Md: map[string]string{
"kubernetes/endpoint": "", "kubernetes/endpoint": "",
"kubernetes/kind": "svc", "kubernetes/kind": "svc",
"kubernetes/namespace": "ns", "kubernetes/namespace": "ns",
"kubernetes/port-name": "*", "kubernetes/port-name": "*",
"kubernetes/protocol": "*", "kubernetes/protocol": "*",
"kubernetes/service": "s", "kubernetes/service": "s",
}, },
}, },
{ {
@ -81,6 +81,11 @@ var metadataCases = []struct {
"kubernetes/service": "s", "kubernetes/service": "s",
}, },
}, },
{
Qname: "example.com.", Qtype: dns.TypeA,
RemoteIP: "10.10.10.10",
Md: map[string]string{},
},
} }
func mapsDiffer(a, b map[string]string) bool { func mapsDiffer(a, b map[string]string) bool {
@ -128,7 +133,7 @@ func TestMetadataPodsVerified(t *testing.T) {
ctx := metadata.ContextWithMetadata(context.Background()) ctx := metadata.ContextWithMetadata(context.Background())
state := request.Request{ state := request.Request{
Req: &dns.Msg{Question: []dns.Question{{Name: "s.ns.svc.cluster.local.", Qtype: dns.TypeA}}}, Req: &dns.Msg{Question: []dns.Question{{Name: "example.com.", Qtype: dns.TypeA}}},
Zone: ".", Zone: ".",
W: &test.ResponseWriter{}, W: &test.ResponseWriter{},
} }
@ -136,12 +141,6 @@ func TestMetadataPodsVerified(t *testing.T) {
k.Metadata(ctx, state) k.Metadata(ctx, state)
expect := map[string]string{ expect := map[string]string{
"kubernetes/endpoint": "",
"kubernetes/kind": "svc",
"kubernetes/namespace": "ns",
"kubernetes/port-name": "*",
"kubernetes/protocol": "*",
"kubernetes/service": "s",
"kubernetes/client-namespace": "podns", "kubernetes/client-namespace": "podns",
"kubernetes/client-pod-name": "foo", "kubernetes/client-pod-name": "foo",
} }