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  }