github.com/google/cloudprober@v0.11.3/rds/kubernetes/endpoints_test.go (about) 1 package kubernetes 2 3 import ( 4 "io/ioutil" 5 "reflect" 6 "testing" 7 8 "github.com/google/cloudprober/rds/server/filter" 9 ) 10 11 func TestParseEndpoints(t *testing.T) { 12 epListFile := "./testdata/endpoints.json" 13 data, err := ioutil.ReadFile(epListFile) 14 15 if err != nil { 16 t.Fatalf("error reading test data file: %s", epListFile) 17 } 18 _, epByKey, err := parseEndpointsJSON(data) 19 if err != nil { 20 t.Fatalf("error reading test data file: %s", epListFile) 21 } 22 23 testKeys := []resourceKey{ 24 {"default", "cloudprober"}, 25 {"default", "cloudprober-test"}, 26 {"system", "kubernetes"}, 27 } 28 for _, key := range testKeys { 29 if epByKey[key] == nil { 30 t.Errorf("didn't get endpoints for %+v", key) 31 } 32 } 33 34 for _, key := range testKeys[:1] { 35 epi := epByKey[key] 36 if epi.Metadata.Labels["app"] != "cloudprober" { 37 t.Errorf("cloudprober endpoints app label: got=%s, want=cloudprober", epi.Metadata.Labels["app"]) 38 } 39 40 if len(epi.Subsets) != 1 { 41 t.Errorf("cloudprober endpoints subsets count: got=%d, want=1", len(epi.Subsets)) 42 } 43 44 eps := epi.Subsets[0] 45 var ips, pods, nodes []string 46 for _, addr := range eps.Addresses { 47 ips = append(ips, addr.IP) 48 nodes = append(nodes, addr.NodeName) 49 if addr.TargetRef.Kind != "Pod" { 50 t.Errorf("Unexpected target ref kind for addr (%s): %s", addr.IP, addr.TargetRef.Kind) 51 } 52 pods = append(pods, addr.TargetRef.Name) 53 } 54 55 expectedIPs := []string{"10.28.0.3", "10.28.2.3", "10.28.2.6"} 56 if !reflect.DeepEqual(ips, expectedIPs) { 57 t.Errorf("cloudprober endpoints addresses: got=%v, want=%v", ips, expectedIPs) 58 } 59 60 expectedNodes := []string{"gke-cluster-1-default-pool-abd8ad35-ccr7", "gke-cluster-1-default-pool-abd8ad35-mzh9", "gke-cluster-1-default-pool-abd8ad35-mzh9"} 61 if !reflect.DeepEqual(nodes, expectedNodes) { 62 t.Errorf("cloudprober endpoints nodes: got=%v, want=%v", nodes, expectedNodes) 63 } 64 65 expectedPods := []string{"cloudprober-test-577cf7bbcc-c7l5p", "cloudprober-test-577cf7bbcc-qnrvg", "cloudprober-54778d95f5-vms2d"} 66 if !reflect.DeepEqual(pods, expectedPods) { 67 t.Errorf("cloudprober endpoints pods: got=%v, want=%v", pods, expectedPods) 68 } 69 70 if len(eps.Ports) != 1 { 71 t.Errorf("cloudprober endpoints len(eps.Ports)=%d, want=1", len(eps.Ports)) 72 } 73 74 if eps.Ports[0].Port != 9313 { 75 t.Errorf("cloudprober endpoints eps.Ports[0].Port=%d, want=9313", eps.Ports[0].Port) 76 } 77 } 78 } 79 80 // TestEndpointsToResources tests endpoints to RDS resources conversion. 81 func TestEndpointsToResources(t *testing.T) { 82 epName := "cloudprober" 83 appLabel := "lCloudprober" 84 ips := []string{"10.0.0.1", "10.0.0.2"} 85 86 epi := &epInfo{ 87 Metadata: kMetadata{ 88 Name: epName, 89 Labels: map[string]string{"app": appLabel}, 90 }, 91 Subsets: make([]epSubset, 1), 92 } 93 94 epi.Subsets[0] = epSubset{ 95 Addresses: []struct { 96 IP string 97 NodeName string 98 TargetRef struct { 99 Kind string 100 Name string 101 } 102 }{ 103 { 104 IP: ips[0], 105 NodeName: "n1", 106 TargetRef: struct { 107 Kind, Name string 108 }{ 109 Kind: "Pod", 110 Name: "test-pod", 111 }, 112 }, 113 { 114 IP: ips[1], 115 NodeName: "n2", 116 }, 117 }, 118 Ports: []struct { 119 Name string 120 Port int 121 }{ 122 {Port: 9313}, 123 {Name: "rds", Port: 9314}, 124 {Name: "not-rds", Port: 9315}, // should be excluded 125 }, 126 } 127 128 portFilter, err := filter.NewRegexFilter("^(rds|9313)$") 129 if err != nil { 130 t.Fatal(err) 131 } 132 resources := epi.resources(portFilter, nil) 133 134 // We'll get 4 resources = 2 ports x 2 IPs 135 if len(resources) != 4 { 136 t.Errorf("cloudprober resources len(resources)=%d, want=4", len(resources)) 137 } 138 139 var names, resIPs []string 140 var labels []map[string]string 141 var ports []int32 142 143 for _, res := range resources { 144 t.Logf("name=%s, IP=%s", res.GetName(), res.GetIp()) 145 names = append(names, res.GetName()) 146 labels = append(labels, res.GetLabels()) 147 resIPs = append(resIPs, res.GetIp()) 148 ports = append(ports, res.GetPort()) 149 } 150 151 expectedNames := []string{"cloudprober_10.0.0.1_9313", "cloudprober_10.0.0.2_9313", "cloudprober_10.0.0.1_rds", "cloudprober_10.0.0.2_rds"} 152 if !reflect.DeepEqual(names, expectedNames) { 153 t.Errorf("Cloudprober endpoints resource names=%v, want=%v", names, expectedNames) 154 } 155 156 expectedLabels := []map[string]string{ 157 {"app": "lCloudprober", "node": "n1", "pod": "test-pod"}, 158 {"app": "lCloudprober", "node": "n2"}, 159 {"app": "lCloudprober", "node": "n1", "pod": "test-pod"}, 160 {"app": "lCloudprober", "node": "n2"}, 161 } 162 if !reflect.DeepEqual(labels, expectedLabels) { 163 t.Errorf("Cloudprober endpoints resource labels=%v, want=%v", labels, expectedLabels) 164 } 165 166 expectedIPs := []string{"10.0.0.1", "10.0.0.2", "10.0.0.1", "10.0.0.2"} 167 if !reflect.DeepEqual(resIPs, expectedIPs) { 168 t.Errorf("Cloudprober endpoints resource IPs=%v, want=%v", resIPs, expectedIPs) 169 } 170 171 expectedPorts := []int32{9313, 9313, 9314, 9314} 172 if !reflect.DeepEqual(ports, expectedPorts) { 173 t.Errorf("Cloudprober endpoints resource Ports=%v, want=%v", ports, expectedPorts) 174 } 175 }