| 
									
										
										
										
											2017-06-14 09:38:00 -04:00
										 |  |  | package kubernetes
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import (
 | 
					
						
							|  |  |  | 	"net"
 | 
					
						
							|  |  |  | 	"strings"
 | 
					
						
							|  |  |  | 	"testing"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/coredns/coredns/middleware/etcd/msg"
 | 
					
						
							|  |  |  | 	"github.com/miekg/dns"
 | 
					
						
							|  |  |  | 	"k8s.io/client-go/1.5/pkg/api"
 | 
					
						
							|  |  |  | )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func testStripFederation(t *testing.T, k Kubernetes, input []string, expectedFed string, expectedSegs string) {
 | 
					
						
							|  |  |  | 	fed, segs := k.stripFederation(input)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if expectedSegs != strings.Join(segs, ".") {
 | 
					
						
							|  |  |  | 		t.Errorf("For '%v', expected segs result '%v'. Instead got result '%v'.", strings.Join(input, "."), expectedSegs, strings.Join(segs, "."))
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 	if expectedFed != fed {
 | 
					
						
							|  |  |  | 		t.Errorf("For '%v', expected fed result '%v'. Instead got result '%v'.", strings.Join(input, "."), expectedFed, fed)
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestStripFederation(t *testing.T) {
 | 
					
						
							|  |  |  | 	k := Kubernetes{Zones: []string{"inter.webs.test"}}
 | 
					
						
							|  |  |  | 	k.Federations = []Federation{{name: "fed", zone: "era.tion.com"}}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	testStripFederation(t, k, []string{"service", "ns", "fed", "svc"}, "fed", "service.ns.svc")
 | 
					
						
							|  |  |  | 	testStripFederation(t, k, []string{"service", "ns", "foo", "svc"}, "", "service.ns.foo.svc")
 | 
					
						
							|  |  |  | 	testStripFederation(t, k, []string{"foo", "bar"}, "", "foo.bar")
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type apiConnFedTest struct{}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (apiConnFedTest) Run()                          { return }
 | 
					
						
							|  |  |  | func (apiConnFedTest) Stop() error                   { return nil }
 | 
					
						
							|  |  |  | func (apiConnFedTest) ServiceList() []*api.Service   { return []*api.Service{} }
 | 
					
						
							|  |  |  | func (apiConnFedTest) PodIndex(string) []interface{} { return nil }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (apiConnFedTest) EndpointsList() api.EndpointsList {
 | 
					
						
							|  |  |  | 	n := "test.node.foo.bar"
 | 
					
						
							|  |  |  | 	return api.EndpointsList{
 | 
					
						
							|  |  |  | 		Items: []api.Endpoints{
 | 
					
						
							|  |  |  | 			{
 | 
					
						
							|  |  |  | 				Subsets: []api.EndpointSubset{
 | 
					
						
							|  |  |  | 					{
 | 
					
						
							|  |  |  | 						Addresses: []api.EndpointAddress{
 | 
					
						
							|  |  |  | 							{
 | 
					
						
							|  |  |  | 								IP:       "10.9.8.7",
 | 
					
						
							|  |  |  | 								NodeName: &n,
 | 
					
						
							|  |  |  | 							},
 | 
					
						
							|  |  |  | 						},
 | 
					
						
							|  |  |  | 					},
 | 
					
						
							|  |  |  | 				},
 | 
					
						
							|  |  |  | 			},
 | 
					
						
							|  |  |  | 		},
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (apiConnFedTest) GetNodeByName(name string) (api.Node, error) {
 | 
					
						
							|  |  |  | 	if name != "test.node.foo.bar" {
 | 
					
						
							|  |  |  | 		return api.Node{}, nil
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 	return api.Node{
 | 
					
						
							|  |  |  | 		ObjectMeta: api.ObjectMeta{
 | 
					
						
							|  |  |  | 			Name: "test.node.foo.bar",
 | 
					
						
							|  |  |  | 			Labels: map[string]string{
 | 
					
						
							| 
									
										
										
										
											2017-06-14 09:37:10 -07:00
										 |  |  | 				labelRegion:           "fd-r",
 | 
					
						
							|  |  |  | 				labelAvailabilityZone: "fd-az",
 | 
					
						
							| 
									
										
										
										
											2017-06-14 09:38:00 -04:00
										 |  |  | 			},
 | 
					
						
							|  |  |  | 		},
 | 
					
						
							|  |  |  | 	}, nil
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func testFederationCNAMERecord(t *testing.T, k Kubernetes, input recordRequest, expected msg.Service) {
 | 
					
						
							|  |  |  | 	svc := k.federationCNAMERecord(input)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if expected.Host != svc.Host {
 | 
					
						
							|  |  |  | 		t.Errorf("For '%v', expected Host result '%v'. Instead got result '%v'.", input, expected.Host, svc.Host)
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 	if expected.Key != svc.Key {
 | 
					
						
							|  |  |  | 		t.Errorf("For '%v', expected Key result '%v'. Instead got result '%v'.", input, expected.Key, svc.Key)
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestFederationCNAMERecord(t *testing.T) {
 | 
					
						
							|  |  |  | 	k := Kubernetes{Zones: []string{"inter.webs"}}
 | 
					
						
							|  |  |  | 	k.Federations = []Federation{{name: "fed", zone: "era.tion.com"}}
 | 
					
						
							|  |  |  | 	k.APIConn = apiConnFedTest{}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var r recordRequest
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	r, _ = k.parseRequest("s1.ns.fed.svc.inter.webs", dns.TypeA)
 | 
					
						
							|  |  |  | 	localPodIP = net.ParseIP("10.9.8.7")
 | 
					
						
							|  |  |  | 	testFederationCNAMERecord(t, k, r, msg.Service{Key: "/coredns/webs/inter/svc/fed/ns/s1", Host: "s1.ns.fed.svc.fd-az.fd-r.era.tion.com"})
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	r, _ = k.parseRequest("ep1.s1.ns.fed.svc.inter.webs", dns.TypeA)
 | 
					
						
							|  |  |  | 	testFederationCNAMERecord(t, k, r, msg.Service{Key: "/coredns/webs/inter/svc/fed/ns/s1/ep1", Host: "ep1.s1.ns.fed.svc.fd-az.fd-r.era.tion.com"})
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	r, _ = k.parseRequest("ep1.s1.ns.foo.svc.inter.webs", dns.TypeA)
 | 
					
						
							|  |  |  | 	testFederationCNAMERecord(t, k, r, msg.Service{Key: "", Host: ""})
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }
 |