| 
									
										
										
										
											2019-06-09 00:10:57 -07:00
										 |  |  | package kubernetes | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"context" | 
					
						
							| 
									
										
										
										
											2025-05-19 07:58:16 +02:00
										 |  |  | 	"strings" | 
					
						
							| 
									
										
										
										
											2019-06-09 00:10:57 -07:00
										 |  |  | 	"testing" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/coredns/coredns/plugin/metadata" | 
					
						
							|  |  |  | 	"github.com/coredns/coredns/plugin/test" | 
					
						
							|  |  |  | 	"github.com/coredns/coredns/request" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/miekg/dns" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var metadataCases = []struct { | 
					
						
							|  |  |  | 	Qname    string | 
					
						
							|  |  |  | 	Qtype    uint16 | 
					
						
							|  |  |  | 	RemoteIP string | 
					
						
							|  |  |  | 	Md       map[string]string | 
					
						
							|  |  |  | }{ | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		Qname: "foo.bar.notapod.cluster.local.", Qtype: dns.TypeA, | 
					
						
							|  |  |  | 		Md: map[string]string{ | 
					
						
							|  |  |  | 			"kubernetes/parse-error": "invalid query name", | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		Qname: "10-240-0-1.podns.pod.cluster.local.", Qtype: dns.TypeA, | 
					
						
							|  |  |  | 		Md: map[string]string{ | 
					
						
							| 
									
										
										
										
											2020-05-05 14:34:24 -04:00
										 |  |  | 			"kubernetes/endpoint":  "", | 
					
						
							|  |  |  | 			"kubernetes/kind":      "pod", | 
					
						
							|  |  |  | 			"kubernetes/namespace": "podns", | 
					
						
							| 
									
										
										
										
											2022-02-09 09:25:10 -05:00
										 |  |  | 			"kubernetes/port-name": "", | 
					
						
							|  |  |  | 			"kubernetes/protocol":  "", | 
					
						
							| 
									
										
										
										
											2020-05-05 14:34:24 -04:00
										 |  |  | 			"kubernetes/service":   "10-240-0-1", | 
					
						
							| 
									
										
										
										
											2019-06-09 00:10:57 -07:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		Qname: "s.ns.svc.cluster.local.", Qtype: dns.TypeA, | 
					
						
							|  |  |  | 		Md: map[string]string{ | 
					
						
							| 
									
										
										
										
											2020-05-05 14:34:24 -04:00
										 |  |  | 			"kubernetes/endpoint":  "", | 
					
						
							|  |  |  | 			"kubernetes/kind":      "svc", | 
					
						
							|  |  |  | 			"kubernetes/namespace": "ns", | 
					
						
							| 
									
										
										
										
											2022-02-09 09:25:10 -05:00
										 |  |  | 			"kubernetes/port-name": "", | 
					
						
							|  |  |  | 			"kubernetes/protocol":  "", | 
					
						
							| 
									
										
										
										
											2020-05-05 14:34:24 -04:00
										 |  |  | 			"kubernetes/service":   "s", | 
					
						
							| 
									
										
										
										
											2019-06-09 00:10:57 -07:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		Qname: "s.ns.svc.cluster.local.", Qtype: dns.TypeA, | 
					
						
							|  |  |  | 		RemoteIP: "10.10.10.10", | 
					
						
							|  |  |  | 		Md: map[string]string{ | 
					
						
							|  |  |  | 			"kubernetes/endpoint":  "", | 
					
						
							|  |  |  | 			"kubernetes/kind":      "svc", | 
					
						
							|  |  |  | 			"kubernetes/namespace": "ns", | 
					
						
							| 
									
										
										
										
											2022-02-09 09:25:10 -05:00
										 |  |  | 			"kubernetes/port-name": "", | 
					
						
							|  |  |  | 			"kubernetes/protocol":  "", | 
					
						
							| 
									
										
										
										
											2019-06-09 00:10:57 -07:00
										 |  |  | 			"kubernetes/service":   "s", | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		Qname: "_http._tcp.s.ns.svc.cluster.local.", Qtype: dns.TypeSRV, | 
					
						
							|  |  |  | 		RemoteIP: "10.10.10.10", | 
					
						
							|  |  |  | 		Md: map[string]string{ | 
					
						
							|  |  |  | 			"kubernetes/endpoint":  "", | 
					
						
							|  |  |  | 			"kubernetes/kind":      "svc", | 
					
						
							|  |  |  | 			"kubernetes/namespace": "ns", | 
					
						
							|  |  |  | 			"kubernetes/port-name": "http", | 
					
						
							|  |  |  | 			"kubernetes/protocol":  "tcp", | 
					
						
							|  |  |  | 			"kubernetes/service":   "s", | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		Qname: "ep.s.ns.svc.cluster.local.", Qtype: dns.TypeA, | 
					
						
							|  |  |  | 		RemoteIP: "10.10.10.10", | 
					
						
							|  |  |  | 		Md: map[string]string{ | 
					
						
							|  |  |  | 			"kubernetes/endpoint":  "ep", | 
					
						
							|  |  |  | 			"kubernetes/kind":      "svc", | 
					
						
							|  |  |  | 			"kubernetes/namespace": "ns", | 
					
						
							| 
									
										
										
										
											2022-02-09 09:25:10 -05:00
										 |  |  | 			"kubernetes/port-name": "", | 
					
						
							|  |  |  | 			"kubernetes/protocol":  "", | 
					
						
							| 
									
										
										
										
											2019-06-09 00:10:57 -07:00
										 |  |  | 			"kubernetes/service":   "s", | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2025-05-19 07:58:16 +02:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		Qname: "ep.c1.s.ns.svc.clusterset.local.", Qtype: dns.TypeA, | 
					
						
							|  |  |  | 		RemoteIP: "10.10.10.10", | 
					
						
							|  |  |  | 		Md: map[string]string{ | 
					
						
							|  |  |  | 			"kubernetes/cluster":   "c1", | 
					
						
							|  |  |  | 			"kubernetes/endpoint":  "ep", | 
					
						
							|  |  |  | 			"kubernetes/kind":      "svc", | 
					
						
							|  |  |  | 			"kubernetes/namespace": "ns", | 
					
						
							|  |  |  | 			"kubernetes/port-name": "", | 
					
						
							|  |  |  | 			"kubernetes/protocol":  "", | 
					
						
							|  |  |  | 			"kubernetes/service":   "s", | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2020-05-05 14:34:24 -04:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		Qname: "example.com.", Qtype: dns.TypeA, | 
					
						
							|  |  |  | 		RemoteIP: "10.10.10.10", | 
					
						
							|  |  |  | 		Md:       map[string]string{}, | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2019-06-09 00:10:57 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func mapsDiffer(a, b map[string]string) bool { | 
					
						
							|  |  |  | 	if len(a) != len(b) { | 
					
						
							|  |  |  | 		return true | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for k, va := range a { | 
					
						
							|  |  |  | 		vb, ok := b[k] | 
					
						
							|  |  |  | 		if !ok || va != vb { | 
					
						
							|  |  |  | 			return true | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return false | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestMetadata(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2025-05-19 07:58:16 +02:00
										 |  |  | 	k := New([]string{"cluster.local.", "clusterset.local."}) | 
					
						
							|  |  |  | 	k.opts.multiclusterZones = []string{"clusterset.local."} | 
					
						
							| 
									
										
										
										
											2019-06-09 00:10:57 -07:00
										 |  |  | 	k.APIConn = &APIConnServeTest{} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for i, tc := range metadataCases { | 
					
						
							|  |  |  | 		ctx := metadata.ContextWithMetadata(context.Background()) | 
					
						
							| 
									
										
										
										
											2025-05-19 07:58:16 +02:00
										 |  |  | 		zone := "." | 
					
						
							|  |  |  | 		if strings.Contains(tc.Qname, "clusterset.local") { | 
					
						
							|  |  |  | 			zone = "clusterset.local." | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2019-06-09 00:10:57 -07:00
										 |  |  | 		state := request.Request{ | 
					
						
							|  |  |  | 			Req:  &dns.Msg{Question: []dns.Question{{Name: tc.Qname, Qtype: tc.Qtype}}}, | 
					
						
							| 
									
										
										
										
											2025-05-19 07:58:16 +02:00
										 |  |  | 			Zone: zone, | 
					
						
							| 
									
										
										
										
											2019-06-09 00:10:57 -07:00
										 |  |  | 			W:    &test.ResponseWriter{RemoteIP: tc.RemoteIP}, | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		k.Metadata(ctx, state) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		md := make(map[string]string) | 
					
						
							|  |  |  | 		for _, l := range metadata.Labels(ctx) { | 
					
						
							|  |  |  | 			md[l] = metadata.ValueFunc(ctx, l)() | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if mapsDiffer(tc.Md, md) { | 
					
						
							| 
									
										
										
										
											2019-06-09 23:35:07 -07:00
										 |  |  | 			t.Errorf("Case %d expected metadata %v and got %v", i, tc.Md, md) | 
					
						
							| 
									
										
										
										
											2019-06-09 00:10:57 -07:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2020-05-04 04:17:26 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | func TestMetadataPodsVerified(t *testing.T) { | 
					
						
							|  |  |  | 	k := New([]string{"cluster.local."}) | 
					
						
							|  |  |  | 	k.podMode = podModeVerified | 
					
						
							|  |  |  | 	k.APIConn = &APIConnServeTest{} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ctx := metadata.ContextWithMetadata(context.Background()) | 
					
						
							|  |  |  | 	state := request.Request{ | 
					
						
							| 
									
										
										
										
											2020-05-05 14:34:24 -04:00
										 |  |  | 		Req:  &dns.Msg{Question: []dns.Question{{Name: "example.com.", Qtype: dns.TypeA}}}, | 
					
						
							| 
									
										
										
										
											2020-05-04 04:17:26 -04:00
										 |  |  | 		Zone: ".", | 
					
						
							|  |  |  | 		W:    &test.ResponseWriter{}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	k.Metadata(ctx, state) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	expect := map[string]string{ | 
					
						
							| 
									
										
										
										
											2024-03-07 14:34:09 -05:00
										 |  |  | 		"kubernetes/client-namespace":                    "podns", | 
					
						
							|  |  |  | 		"kubernetes/client-pod-name":                     "foo", | 
					
						
							|  |  |  | 		"kubernetes/client-label/app.kubernetes.io/name": "foo", | 
					
						
							|  |  |  | 		"kubernetes/client-label/bar":                    "baz", | 
					
						
							| 
									
										
										
										
											2020-05-04 04:17:26 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	md := make(map[string]string) | 
					
						
							|  |  |  | 	for _, l := range metadata.Labels(ctx) { | 
					
						
							|  |  |  | 		md[l] = metadata.ValueFunc(ctx, l)() | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if mapsDiffer(expect, md) { | 
					
						
							|  |  |  | 		t.Errorf("Expected metadata %v and got %v", expect, md) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } |