| 
									
										
										
										
											2018-02-08 10:11:04 -06:00
										 |  |  | package kubernetes | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2021-06-14 10:39:40 -04:00
										 |  |  | 	"net" | 
					
						
							| 
									
										
										
										
											2018-02-08 10:11:04 -06:00
										 |  |  | 	"strings" | 
					
						
							|  |  |  | 	"testing" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-13 11:02:00 -04:00
										 |  |  | 	"github.com/coredns/coredns/plugin/transfer" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-08 10:11:04 -06:00
										 |  |  | 	"github.com/miekg/dns" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-13 11:02:00 -04:00
										 |  |  | func TestKubernetesTransferNonAuthZone(t *testing.T) { | 
					
						
							|  |  |  | 	k := New([]string{"cluster.local."}) | 
					
						
							|  |  |  | 	k.APIConn = &APIConnServeTest{} | 
					
						
							|  |  |  | 	k.Namespaces = map[string]struct{}{"testns": {}, "kube-system": {}} | 
					
						
							|  |  |  | 	k.localIPs = []net.IP{net.ParseIP("10.0.0.10")} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	dnsmsg := &dns.Msg{} | 
					
						
							|  |  |  | 	dnsmsg.SetAxfr("example.com") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	_, err := k.Transfer("example.com", 0) | 
					
						
							|  |  |  | 	if err != transfer.ErrNotAuthoritative { | 
					
						
							|  |  |  | 		t.Error(err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-24 11:30:39 -07:00
										 |  |  | func TestKubernetesAXFR(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2018-02-08 10:11:04 -06:00
										 |  |  | 	k := New([]string{"cluster.local."}) | 
					
						
							|  |  |  | 	k.APIConn = &APIConnServeTest{} | 
					
						
							| 
									
										
										
										
											2021-06-14 10:39:40 -04:00
										 |  |  | 	k.Namespaces = map[string]struct{}{"testns": {}, "kube-system": {}} | 
					
						
							|  |  |  | 	k.localIPs = []net.IP{net.ParseIP("10.0.0.10")} | 
					
						
							| 
									
										
										
										
											2018-02-08 10:11:04 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	dnsmsg := &dns.Msg{} | 
					
						
							|  |  |  | 	dnsmsg.SetAxfr(k.Zones[0]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-24 11:30:39 -07:00
										 |  |  | 	ch, err := k.Transfer(k.Zones[0], 0) | 
					
						
							| 
									
										
										
										
											2018-02-08 10:11:04 -06:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Error(err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-09-24 11:30:39 -07:00
										 |  |  | 	validateAXFR(t, ch) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2018-02-08 10:11:04 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-24 11:30:39 -07:00
										 |  |  | func TestKubernetesIXFRFallback(t *testing.T) { | 
					
						
							|  |  |  | 	k := New([]string{"cluster.local."}) | 
					
						
							|  |  |  | 	k.APIConn = &APIConnServeTest{} | 
					
						
							| 
									
										
										
										
											2021-06-14 10:39:40 -04:00
										 |  |  | 	k.Namespaces = map[string]struct{}{"testns": {}, "kube-system": {}} | 
					
						
							|  |  |  | 	k.localIPs = []net.IP{net.ParseIP("10.0.0.10")} | 
					
						
							| 
									
										
										
										
											2020-07-08 09:00:26 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-24 11:30:39 -07:00
										 |  |  | 	dnsmsg := &dns.Msg{} | 
					
						
							|  |  |  | 	dnsmsg.SetAxfr(k.Zones[0]) | 
					
						
							| 
									
										
										
										
											2020-07-08 09:00:26 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-24 11:30:39 -07:00
										 |  |  | 	ch, err := k.Transfer(k.Zones[0], 1) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Error(err) | 
					
						
							| 
									
										
										
										
											2020-07-08 09:00:26 -07:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-09-24 11:30:39 -07:00
										 |  |  | 	validateAXFR(t, ch) | 
					
						
							| 
									
										
										
										
											2018-02-08 10:11:04 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-24 11:30:39 -07:00
										 |  |  | func TestKubernetesIXFRCurrent(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2018-11-13 18:25:30 -05:00
										 |  |  | 	k := New([]string{"cluster.local."}) | 
					
						
							|  |  |  | 	k.APIConn = &APIConnServeTest{} | 
					
						
							| 
									
										
										
										
											2021-06-14 10:39:40 -04:00
										 |  |  | 	k.Namespaces = map[string]struct{}{"testns": {}, "kube-system": {}} | 
					
						
							|  |  |  | 	k.localIPs = []net.IP{net.ParseIP("10.0.0.10")} | 
					
						
							| 
									
										
										
										
											2018-11-13 18:25:30 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	dnsmsg := &dns.Msg{} | 
					
						
							|  |  |  | 	dnsmsg.SetAxfr(k.Zones[0]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-24 11:30:39 -07:00
										 |  |  | 	ch, err := k.Transfer(k.Zones[0], 3) | 
					
						
							| 
									
										
										
										
											2018-11-13 18:25:30 -05:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Error(err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-24 11:30:39 -07:00
										 |  |  | 	var gotRRs []dns.RR | 
					
						
							|  |  |  | 	for rrs := range ch { | 
					
						
							|  |  |  | 		gotRRs = append(gotRRs, rrs...) | 
					
						
							| 
									
										
										
										
											2018-11-13 18:25:30 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-24 11:30:39 -07:00
										 |  |  | 	// ensure only one record is returned | 
					
						
							|  |  |  | 	if len(gotRRs) > 1 { | 
					
						
							|  |  |  | 		t.Errorf("Expected only one answer, got %d", len(gotRRs)) | 
					
						
							| 
									
										
										
										
											2018-11-13 18:25:30 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-24 11:30:39 -07:00
										 |  |  | 	// Ensure first record is a SOA | 
					
						
							|  |  |  | 	if gotRRs[0].Header().Rrtype != dns.TypeSOA { | 
					
						
							|  |  |  | 		t.Error("Invalid transfer response, does not start with SOA record") | 
					
						
							| 
									
										
										
										
											2018-02-08 10:11:04 -06:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2019-03-26 11:26:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-24 11:30:39 -07:00
										 |  |  | func validateAXFR(t *testing.T, ch <-chan []dns.RR) { | 
					
						
							|  |  |  | 	xfr := []dns.RR{} | 
					
						
							|  |  |  | 	for rrs := range ch { | 
					
						
							|  |  |  | 		xfr = append(xfr, rrs...) | 
					
						
							| 
									
										
										
										
											2019-03-26 11:26:19 -04:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-09-24 11:30:39 -07:00
										 |  |  | 	if xfr[0].Header().Rrtype != dns.TypeSOA { | 
					
						
							|  |  |  | 		t.Error("Invalid transfer response, does not start with SOA record") | 
					
						
							| 
									
										
										
										
											2019-03-26 11:26:19 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-24 11:30:39 -07:00
										 |  |  | 	zp := dns.NewZoneParser(strings.NewReader(expectedZone), "", "") | 
					
						
							|  |  |  | 	i := 0 | 
					
						
							|  |  |  | 	for rr, ok := zp.Next(); ok; rr, ok = zp.Next() { | 
					
						
							|  |  |  | 		if !dns.IsDuplicate(rr, xfr[i]) { | 
					
						
							|  |  |  | 			t.Fatalf("Record %d, expected\n%v\n, got\n%v", i, rr, xfr[i]) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		i++ | 
					
						
							| 
									
										
										
										
											2019-03-26 11:26:19 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-24 11:30:39 -07:00
										 |  |  | 	if err := zp.Err(); err != nil { | 
					
						
							|  |  |  | 		t.Fatal(err) | 
					
						
							| 
									
										
										
										
											2019-03-26 11:26:19 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2020-09-24 11:30:39 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | const expectedZone = ` | 
					
						
							|  |  |  | cluster.local.	5	IN	SOA	ns.dns.cluster.local. hostmaster.cluster.local. 3 7200 1800 86400 5 | 
					
						
							| 
									
										
										
										
											2021-06-14 10:39:40 -04:00
										 |  |  | cluster.local.	5	IN	NS	ns.dns.cluster.local. | 
					
						
							|  |  |  | ns.dns.cluster.local.	5	IN	A	10.0.0.10 | 
					
						
							| 
									
										
										
										
											2020-09-24 11:30:39 -07:00
										 |  |  | external.testns.svc.cluster.local.	5	IN	CNAME	ext.interwebs.test. | 
					
						
							|  |  |  | external-to-service.testns.svc.cluster.local.	5	IN	CNAME	svc1.testns.svc.cluster.local. | 
					
						
							|  |  |  | hdls1.testns.svc.cluster.local.	5	IN	A	172.0.0.2 | 
					
						
							|  |  |  | 172-0-0-2.hdls1.testns.svc.cluster.local.	5	IN	A	172.0.0.2 | 
					
						
							|  |  |  | _http._tcp.hdls1.testns.svc.cluster.local.	5	IN	SRV	0 16 80 172-0-0-2.hdls1.testns.svc.cluster.local. | 
					
						
							|  |  |  | hdls1.testns.svc.cluster.local.	5	IN	A	172.0.0.3 | 
					
						
							|  |  |  | 172-0-0-3.hdls1.testns.svc.cluster.local.	5	IN	A	172.0.0.3 | 
					
						
							|  |  |  | _http._tcp.hdls1.testns.svc.cluster.local.	5	IN	SRV	0 16 80 172-0-0-3.hdls1.testns.svc.cluster.local. | 
					
						
							|  |  |  | hdls1.testns.svc.cluster.local.	5	IN	A	172.0.0.4 | 
					
						
							|  |  |  | dup-name.hdls1.testns.svc.cluster.local.	5	IN	A	172.0.0.4 | 
					
						
							|  |  |  | _http._tcp.hdls1.testns.svc.cluster.local.	5	IN	SRV	0 16 80 dup-name.hdls1.testns.svc.cluster.local. | 
					
						
							|  |  |  | hdls1.testns.svc.cluster.local.	5	IN	A	172.0.0.5 | 
					
						
							|  |  |  | dup-name.hdls1.testns.svc.cluster.local.	5	IN	A	172.0.0.5 | 
					
						
							|  |  |  | _http._tcp.hdls1.testns.svc.cluster.local.	5	IN	SRV	0 16 80 dup-name.hdls1.testns.svc.cluster.local. | 
					
						
							|  |  |  | hdls1.testns.svc.cluster.local.	5	IN	AAAA	5678:abcd::1 | 
					
						
							|  |  |  | 5678-abcd--1.hdls1.testns.svc.cluster.local.	5	IN	AAAA	5678:abcd::1 | 
					
						
							|  |  |  | _http._tcp.hdls1.testns.svc.cluster.local.	5	IN	SRV	0 16 80 5678-abcd--1.hdls1.testns.svc.cluster.local. | 
					
						
							|  |  |  | hdls1.testns.svc.cluster.local.	5	IN	AAAA	5678:abcd::2 | 
					
						
							|  |  |  | 5678-abcd--2.hdls1.testns.svc.cluster.local.	5	IN	AAAA	5678:abcd::2 | 
					
						
							|  |  |  | _http._tcp.hdls1.testns.svc.cluster.local.	5	IN	SRV	0 16 80 5678-abcd--2.hdls1.testns.svc.cluster.local. | 
					
						
							|  |  |  | hdlsprtls.testns.svc.cluster.local.	5	IN	A	172.0.0.20 | 
					
						
							|  |  |  | 172-0-0-20.hdlsprtls.testns.svc.cluster.local.	5	IN	A	172.0.0.20 | 
					
						
							| 
									
										
										
										
											2021-06-14 10:39:40 -04:00
										 |  |  | kubedns.kube-system.svc.cluster.local.	5	IN	A	10.0.0.10 | 
					
						
							|  |  |  | kubedns.kube-system.svc.cluster.local.	5	IN	SRV	0 100 53 kubedns.kube-system.svc.cluster.local. | 
					
						
							|  |  |  | _dns._udp.kubedns.kube-system.svc.cluster.local.	5	IN	SRV	0 100 53 kubedns.kube-system.svc.cluster.local. | 
					
						
							| 
									
										
										
										
											2020-12-21 05:30:24 -05:00
										 |  |  | svc-dual-stack.testns.svc.cluster.local.	5	IN	A	10.0.0.3 | 
					
						
							|  |  |  | svc-dual-stack.testns.svc.cluster.local.	5	IN	AAAA	10::3 | 
					
						
							|  |  |  | svc-dual-stack.testns.svc.cluster.local.	5	IN	SRV	0 100 80 svc-dual-stack.testns.svc.cluster.local. | 
					
						
							|  |  |  | _http._tcp.svc-dual-stack.testns.svc.cluster.local.	5	IN	SRV	0 100 80 svc-dual-stack.testns.svc.cluster.local. | 
					
						
							| 
									
										
										
										
											2020-09-24 11:30:39 -07:00
										 |  |  | svc1.testns.svc.cluster.local.	5	IN	A	10.0.0.1 | 
					
						
							|  |  |  | svc1.testns.svc.cluster.local.	5	IN	SRV	0 100 80 svc1.testns.svc.cluster.local. | 
					
						
							|  |  |  | _http._tcp.svc1.testns.svc.cluster.local.	5	IN	SRV	0 100 80 svc1.testns.svc.cluster.local. | 
					
						
							|  |  |  | svc6.testns.svc.cluster.local.	5	IN	AAAA	1234:abcd::1 | 
					
						
							|  |  |  | svc6.testns.svc.cluster.local.	5	IN	SRV	0 100 80 svc6.testns.svc.cluster.local. | 
					
						
							|  |  |  | _http._tcp.svc6.testns.svc.cluster.local.	5	IN	SRV	0 100 80 svc6.testns.svc.cluster.local. | 
					
						
							|  |  |  | svcempty.testns.svc.cluster.local.	5	IN	A	10.0.0.1 | 
					
						
							|  |  |  | svcempty.testns.svc.cluster.local.	5	IN	SRV	0 100 80 svcempty.testns.svc.cluster.local. | 
					
						
							|  |  |  | _http._tcp.svcempty.testns.svc.cluster.local.	5	IN	SRV	0 100 80 svcempty.testns.svc.cluster.local. | 
					
						
							|  |  |  | cluster.local.	5	IN	SOA	ns.dns.cluster.local. hostmaster.cluster.local. 3 7200 1800 86400 5 | 
					
						
							|  |  |  | ` |