github.com/fabianvf/ocp-release-operator-sdk@v0.0.0-20190426141702-57620ee2f090/pkg/ansible/proxy/proxy_test.go (about) 1 // Copyright 2018 The Operator-SDK Authors 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 // +build !openshiftci 16 17 package proxy 18 19 import ( 20 "context" 21 "encoding/json" 22 "io/ioutil" 23 "net/http" 24 "testing" 25 26 "github.com/operator-framework/operator-sdk/internal/util/fileutil" 27 "github.com/operator-framework/operator-sdk/pkg/ansible/proxy/controllermap" 28 29 kcorev1 "k8s.io/api/core/v1" 30 kmetav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 31 "k8s.io/apimachinery/pkg/runtime" 32 "k8s.io/client-go/rest" 33 "sigs.k8s.io/controller-runtime/pkg/client" 34 "sigs.k8s.io/controller-runtime/pkg/client/config" 35 "sigs.k8s.io/controller-runtime/pkg/manager" 36 ) 37 38 func TestHandler(t *testing.T) { 39 if testing.Short() { 40 t.Skip("skipping ansible proxy testing in short mode") 41 } 42 mgr, err := manager.New(config.GetConfigOrDie(), manager.Options{Namespace: "default"}) 43 if err != nil { 44 t.Fatalf("Failed to instantiate manager: %v", err) 45 } 46 done := make(chan error) 47 cMap := controllermap.NewControllerMap() 48 err = Run(done, Options{ 49 Address: "localhost", 50 Port: 8888, 51 KubeConfig: mgr.GetConfig(), 52 Cache: nil, 53 RESTMapper: mgr.GetRESTMapper(), 54 ControllerMap: cMap, 55 WatchedNamespaces: []string{"default"}, 56 }) 57 if err != nil { 58 t.Fatalf("Error starting proxy: %v", err) 59 } 60 61 po := createPod("test", "default", mgr.GetConfig()) 62 63 resp, err := http.Get("http://localhost:8888/api/v1/namespaces/default/pods/test") 64 if err != nil { 65 t.Fatalf("Error getting pod from proxy: %v", err) 66 } 67 defer func() { 68 if err := resp.Body.Close(); err != nil && !fileutil.IsClosedError(err) { 69 t.Errorf("Failed to close response body: (%v)", err) 70 } 71 }() 72 body, err := ioutil.ReadAll(resp.Body) 73 if err != nil { 74 t.Fatalf("Error reading response body: %v", err) 75 } 76 // Should only be one string from 'X-Cache' header (explicitly set to HIT in proxy) 77 if resp.Header["X-Cache"] == nil { 78 t.Fatalf("Object was not retrieved from cache") 79 if resp.Header["X-Cache"][0] != "HIT" { 80 t.Fatalf("Cache response header found but got [%v], expected [HIT]", resp.Header["X-Cache"][0]) 81 } 82 } 83 data := kcorev1.Pod{} 84 err = json.Unmarshal(body, &data) 85 if data.Name != "test" { 86 t.Fatalf("Got unexpected pod name: %#v", data.Name) 87 } 88 deletePod(po, mgr.GetConfig()) 89 } 90 91 func createPod(name, namespace string, cfg *rest.Config) runtime.Object { 92 three := int64(3) 93 pod := &kcorev1.Pod{ 94 ObjectMeta: kmetav1.ObjectMeta{ 95 Name: name, 96 Namespace: namespace, 97 Labels: map[string]string{ 98 "test-label": name, 99 }, 100 }, 101 Spec: kcorev1.PodSpec{ 102 Containers: []kcorev1.Container{{Name: "nginx", Image: "nginx"}}, 103 RestartPolicy: "Always", 104 ActiveDeadlineSeconds: &three, 105 }, 106 } 107 cl, err := client.New(cfg, client.Options{}) 108 err = cl.Create(context.Background(), pod) 109 if err != nil { 110 return nil 111 } 112 return pod 113 } 114 115 func deletePod(pod runtime.Object, cfg *rest.Config) { 116 cl, err := client.New(cfg, client.Options{}) 117 err = cl.Delete(context.Background(), pod) 118 if err != nil { 119 return 120 } 121 }