github.com/galamsiva2020/kubernetes-heapster-monitoring@v0.0.0-20210823134957-3c1baa7c1e70/metrics/heapster_test.go (about) 1 // Copyright 2016 Google Inc. All Rights Reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package main 16 17 import ( 18 "crypto/tls" 19 "encoding/json" 20 "fmt" 21 "io/ioutil" 22 "net/http" 23 "testing" 24 "time" 25 26 "github.com/golang/glog" 27 "github.com/stretchr/testify/assert" 28 29 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 30 v1listers "k8s.io/client-go/listers/core/v1" 31 "k8s.io/heapster/metrics/cmd/heapster-apiserver/app" 32 "k8s.io/heapster/metrics/options" 33 metricsink "k8s.io/heapster/metrics/sinks/metric" 34 metrics "k8s.io/metrics/pkg/apis/metrics/v1alpha1" 35 ) 36 37 var metricsGroupVersion = metrics.SchemeGroupVersion 38 39 var metricsGroupVersionForDiscovery = metav1.GroupVersionForDiscovery{ 40 GroupVersion: metricsGroupVersion.String(), 41 Version: metricsGroupVersion.Version, 42 } 43 44 var emptyMetricSink = &metricsink.MetricSink{} 45 var emptyNodeLister = v1listers.NewNodeLister(nil) 46 var emptyPodLister = v1listers.NewPodLister(nil) 47 48 var testSecurePort = 6443 49 50 func TestRunSecureServer(t *testing.T) { 51 serverIP := fmt.Sprintf("https://localhost:%d", testSecurePort) 52 53 go func() { 54 opt := getServerOptions() 55 opt.SecureServing.BindPort = testSecurePort 56 opt.SecureServing.ServerCert.CertDirectory = "/tmp" 57 opt.DisableAuthForTesting = true 58 59 server, err := app.NewHeapsterApiServer(opt, emptyMetricSink, emptyNodeLister, emptyPodLister) 60 if err != nil { 61 t.Fatalf("Could not create the API server: %v", err) 62 } 63 if err := server.RunServer(); err != nil { 64 t.Fatalf("Error in bringing up the server: %v", err) 65 } 66 }() 67 if err := waitForApiserverUp(serverIP); err != nil { 68 t.Fatalf("%v", err) 69 } 70 testSwaggerSpec(t, serverIP) 71 testAPIGroupList(t, serverIP) 72 testAPIGroup(t, serverIP) 73 testAPIResourceList(t, serverIP) 74 } 75 76 func getServerOptions() *options.HeapsterRunOptions { 77 opt := options.NewHeapsterRunOptions() 78 return opt 79 } 80 81 func waitForApiserverUp(serverIP string) error { 82 for start := time.Now(); time.Since(start) < time.Minute; time.Sleep(5 * time.Second) { 83 glog.Errorf("Waiting for : %#v", serverIP) 84 tr := &http.Transport{ 85 TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, 86 } 87 client := &http.Client{Transport: tr} 88 _, err := client.Get(serverIP) 89 if err == nil { 90 return nil 91 } 92 } 93 return fmt.Errorf("waiting for apiserver timed out") 94 } 95 96 func readResponse(serverURL string) ([]byte, error) { 97 tr := &http.Transport{ 98 TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, 99 } 100 client := &http.Client{Transport: tr} 101 response, err := client.Get(serverURL) 102 if err != nil { 103 glog.Errorf("http get err code : %#v", err) 104 return nil, fmt.Errorf("Error in fetching %s: %v", serverURL, err) 105 } 106 defer response.Body.Close() 107 glog.Errorf("http get response code : %#v", response.StatusCode) 108 if response.StatusCode != http.StatusOK { 109 return nil, fmt.Errorf("unexpected status: %d for URL: %s, expected status: %d", response.StatusCode, serverURL, http.StatusOK) 110 } 111 contents, err := ioutil.ReadAll(response.Body) 112 if err != nil { 113 return nil, fmt.Errorf("Error reading response from %s: %v", serverURL, err) 114 } 115 return contents, nil 116 } 117 118 func testSwaggerSpec(t *testing.T, serverIP string) { 119 serverURL := serverIP + "/swaggerapi" 120 _, err := readResponse(serverURL) 121 if err != nil { 122 t.Fatalf("%v", err) 123 } 124 } 125 126 func testAPIGroupList(t *testing.T, serverIP string) { 127 serverURL := serverIP + "/apis" 128 contents, err := readResponse(serverURL) 129 if err != nil { 130 t.Fatalf("%v", err) 131 } 132 var apiGroupList metav1.APIGroupList 133 err = json.Unmarshal(contents, &apiGroupList) 134 if err != nil { 135 t.Fatalf("Error in unmarshalling response from server %s: %v", serverURL, err) 136 } 137 assert.Equal(t, 1, len(apiGroupList.Groups)) 138 assert.Equal(t, metricsGroupVersion.Group, apiGroupList.Groups[0].Name) 139 assert.Equal(t, 1, len(apiGroupList.Groups[0].Versions)) 140 assert.Equal(t, metricsGroupVersionForDiscovery, apiGroupList.Groups[0].Versions[0]) 141 assert.Equal(t, metricsGroupVersionForDiscovery, apiGroupList.Groups[0].PreferredVersion) 142 } 143 144 func testAPIGroup(t *testing.T, serverIP string) { 145 serverURL := serverIP + "/apis/metrics.k8s.io" 146 contents, err := readResponse(serverURL) 147 if err != nil { 148 t.Fatalf("%v", err) 149 } 150 var apiGroup metav1.APIGroup 151 err = json.Unmarshal(contents, &apiGroup) 152 if err != nil { 153 t.Fatalf("Error in unmarshalling response from server %s: %v", serverURL, err) 154 } 155 assert.Equal(t, "v1", apiGroup.APIVersion) 156 assert.Equal(t, apiGroup.Name, metricsGroupVersion.Group) 157 assert.Equal(t, metricsGroupVersion.String(), apiGroup.Versions[0].GroupVersion) 158 assert.Equal(t, metricsGroupVersion.Version, apiGroup.Versions[0].Version) 159 assert.Equal(t, apiGroup.PreferredVersion, apiGroup.Versions[0]) 160 assert.Equal(t, 1, len(apiGroup.Versions)) 161 } 162 163 func testAPIResourceList(t *testing.T, serverIP string) { 164 serverURL := serverIP + "/apis/metrics.k8s.io/v1alpha1" 165 contents, err := readResponse(serverURL) 166 if err != nil { 167 t.Fatalf("%v", err) 168 } 169 var apiResourceList metav1.APIResourceList 170 err = json.Unmarshal(contents, &apiResourceList) 171 if err != nil { 172 t.Fatalf("Error in unmarshalling response from server %s: %v", serverURL, err) 173 } 174 assert.Equal(t, "v1", apiResourceList.APIVersion) 175 assert.Equal(t, metricsGroupVersion.String(), apiResourceList.GroupVersion) 176 assert.Equal(t, 2, len(apiResourceList.APIResources)) 177 assert.Equal(t, "nodes", apiResourceList.APIResources[0].Name) 178 assert.False(t, apiResourceList.APIResources[0].Namespaced) 179 assert.Equal(t, "NodeMetrics", apiResourceList.APIResources[0].Kind) 180 assert.Equal(t, "pods", apiResourceList.APIResources[1].Name) 181 assert.True(t, apiResourceList.APIResources[1].Namespaced) 182 assert.Equal(t, "PodMetrics", apiResourceList.APIResources[1].Kind) 183 }