func TestBind(t *testing.T) { table := []struct { binding *api.Binding }{ {binding: &api.Binding{ ObjectMeta: api.ObjectMeta{ Namespace: api.NamespaceDefault, Name: "foo", }, Target: api.ObjectReference{ Name: "foohost.kubernetes.mydomain.com", }, }}, } for _, item := range table { handler := util.FakeHandler{ StatusCode: 200, ResponseBody: "", T: t, } server := httptest.NewServer(&handler) defer server.Close() client := client.NewOrDie(&client.Config{Host: server.URL, Version: testapi.Version()}) b := binder{client} if err := b.Bind(item.binding); err != nil { t.Errorf("Unexpected error: %v", err) continue } expectedBody := runtime.EncodeOrDie(testapi.Codec(), item.binding) handler.ValidateRequest(t, testapi.ResourcePath("bindings", api.NamespaceDefault, ""), "POST", &expectedBody) } }
func TestDoRequestAcceptedSuccess(t *testing.T) { status := api.Status{Status: api.StatusSuccess} expectedBody, _ := api.Encode(status) fakeHandler := util.FakeHandler{ StatusCode: 202, ResponseBody: string(expectedBody), T: t, } testServer := httptest.NewTLSServer(&fakeHandler) request, _ := http.NewRequest("GET", testServer.URL+"/foo/bar", nil) auth := AuthInfo{User: "******", Password: "******"} c := New(testServer.URL, &auth) body, err := c.doRequest(request) if request.Header["Authorization"] == nil { t.Errorf("Request is missing authorization header: %#v", *request) } if err != nil { t.Errorf("Unexpected error %#v", err) } statusOut, err := api.Decode(body) if err != nil { t.Errorf("Unexpected error %#v", err) } if !reflect.DeepEqual(&status, statusOut) { t.Errorf("Unexpected mis-match. Expected %#v. Saw %#v", status, statusOut) } fakeHandler.ValidateRequest(t, "/foo/bar", "GET", nil) }
func TestCreatePod(t *testing.T) { requestPod := api.Pod{ CurrentState: api.PodState{ Status: "Foobar", }, Labels: map[string]string{ "foo": "bar", "name": "baz", }, } body, _ := json.Marshal(requestPod) fakeHandler := util.FakeHandler{ StatusCode: 200, ResponseBody: string(body), } testServer := httptest.NewTLSServer(&fakeHandler) client := Client{ Host: testServer.URL, } receivedPod, err := client.CreatePod(requestPod) fakeHandler.ValidateRequest(t, makeUrl("/pods"), "POST", nil) if err != nil { t.Errorf("Unexpected error: %#v", err) } if !reflect.DeepEqual(requestPod, receivedPod) { t.Errorf("Received pod: %#v\n doesn't match expected pod: %#v", receivedPod, requestPod) } testServer.Close() }
func TestDoRequestAccepted(t *testing.T) { status := &api.Status{Status: api.StatusWorking} expectedBody, _ := latest.Codec.Encode(status) fakeHandler := util.FakeHandler{ StatusCode: 202, ResponseBody: string(expectedBody), T: t, } testServer := httptest.NewServer(&fakeHandler) defer testServer.Close() c, err := RESTClientFor(&Config{Host: testServer.URL, Username: "******", Version: testapi.Version()}) if err != nil { t.Fatalf("unexpected error: %v", err) } body, err := c.Get().Path("test").Do().Raw() if err == nil { t.Fatalf("Unexpected non-error") } if fakeHandler.RequestReceived.Header["Authorization"] == nil { t.Errorf("Request is missing authorization header: %#v", fakeHandler.RequestReceived) } se, ok := err.(APIStatus) if !ok { t.Fatalf("Unexpected kind of error: %#v", err) } if !reflect.DeepEqual(se.Status(), *status) { t.Errorf("Unexpected status: %#v %#v", se.Status(), status) } if body != nil { t.Errorf("Expected nil body, but saw: '%s'", string(body)) } fakeHandler.ValidateRequest(t, "/"+testapi.Version()+"/test", "GET", nil) }
func TestBind(t *testing.T) { table := []struct { binding *api.Binding }{ {binding: &api.Binding{PodID: "foo", Host: "foohost.kubernetes.mydomain.com"}}, } for _, item := range table { handler := util.FakeHandler{ StatusCode: 200, ResponseBody: "", T: t, } server := httptest.NewServer(&handler) client := client.NewOrDie(server.URL, nil) b := binder{client} if err := b.Bind(item.binding); err != nil { t.Errorf("Unexpected error: %v", err) continue } expectedBody := api.EncodeOrDie(item.binding) handler.ValidateRequest(t, "/api/v1beta1/bindings", "POST", &expectedBody) } }
func TestPollMinions(t *testing.T) { table := []struct { minions []api.Minion }{ { minions: []api.Minion{ {JSONBase: api.JSONBase{ID: "foo"}}, {JSONBase: api.JSONBase{ID: "bar"}}, }, }, } for _, item := range table { ml := &api.MinionList{Items: item.minions} handler := util.FakeHandler{ StatusCode: 200, ResponseBody: api.EncodeOrDie(ml), T: t, } server := httptest.NewServer(&handler) cf := ConfigFactory{client.New(server.URL, nil)} ce, err := cf.pollMinions() if err != nil { t.Errorf("Unexpected error: %v", err) continue } handler.ValidateRequest(t, "/api/v1beta1/minions", "GET", nil) if e, a := len(item.minions), ce.Len(); e != a { t.Errorf("Expected %v, got %v", e, a) } } }
func TestDoRequestNewWayObj(t *testing.T) { reqObj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} reqBodyExpected, _ := v1beta2.Codec.Encode(reqObj) expectedObj := &api.Service{Spec: api.ServiceSpec{Port: 12345}} expectedBody, _ := v1beta2.Codec.Encode(expectedObj) fakeHandler := util.FakeHandler{ StatusCode: 200, ResponseBody: string(expectedBody), T: t, } testServer := httptest.NewServer(&fakeHandler) c := NewOrDie(&Config{Host: testServer.URL, Version: "v1beta2", Username: "******", Password: "******"}) obj, err := c.Verb("POST"). Path("foo/bar"). Path("baz"). SelectorParam("labels", labels.Set{"name": "foo"}.AsSelector()). Timeout(time.Second). Body(reqObj). Do().Get() if err != nil { t.Errorf("Unexpected error: %v %#v", err, err) return } if obj == nil { t.Error("nil obj") } else if !reflect.DeepEqual(obj, expectedObj) { t.Errorf("Expected: %#v, got %#v", expectedObj, obj) } tmpStr := string(reqBodyExpected) fakeHandler.ValidateRequest(t, "/api/v1beta2/foo/bar/baz?labels=name%3Dfoo", "POST", &tmpStr) if fakeHandler.RequestReceived.Header["Authorization"] == nil { t.Errorf("Request is missing authorization header: %#v", *fakeHandler.RequestReceived) } }
func TestDefaultErrorFunc(t *testing.T) { testPod := &api.Pod{JSONBase: api.JSONBase{ID: "foo"}} handler := util.FakeHandler{ StatusCode: 200, ResponseBody: api.EncodeOrDie(testPod), T: t, } mux := http.NewServeMux() // FakeHandler musn't be sent requests other than the one you want to test. mux.Handle("/api/v1beta1/pods/foo", &handler) server := httptest.NewServer(mux) factory := ConfigFactory{client.NewOrDie(server.URL, nil)} queue := cache.NewFIFO() errFunc := factory.makeDefaultErrorFunc(queue) errFunc(testPod, nil) for { // This is a terrible way to do this but I plan on replacing this // whole error handling system in the future. The test will time // out if something doesn't work. time.Sleep(10 * time.Millisecond) got, exists := queue.Get("foo") if !exists { continue } handler.ValidateRequest(t, "/api/v1beta1/pods/foo", "GET", nil) if e, a := testPod, got; !reflect.DeepEqual(e, a) { t.Errorf("Expected %v, got %v", e, a) } break } }
func TestUpdatePod(t *testing.T) { requestPod := api.Pod{ JSONBase: api.JSONBase{ID: "foo"}, CurrentState: api.PodState{ Status: "Foobar", }, Labels: map[string]string{ "foo": "bar", "name": "baz", }, } body, _ := json.Marshal(requestPod) fakeHandler := util.FakeHandler{ StatusCode: 200, ResponseBody: string(body), } testServer := httptest.NewTLSServer(&fakeHandler) client := Client{ Host: testServer.URL, } receivedPod, err := client.UpdatePod(requestPod) fakeHandler.ValidateRequest(t, makeUrl("/pods/foo"), "PUT", nil) if err != nil { t.Errorf("Unexpected error: %#v", err) } expectEqual(t, requestPod, receivedPod) testServer.Close() }
func TestListPods(t *testing.T) { expectedPodList := api.PodList{ Items: []api.Pod{ { CurrentState: api.PodState{ Status: "Foobar", }, Labels: map[string]string{ "foo": "bar", "name": "baz", }, }, }, } body, _ := json.Marshal(expectedPodList) fakeHandler := util.FakeHandler{ StatusCode: 200, ResponseBody: string(body), } testServer := httptest.NewTLSServer(&fakeHandler) client := Client{ Host: testServer.URL, } receivedPodList, err := client.ListPods(nil) fakeHandler.ValidateRequest(t, makeUrl("/pods"), "GET", nil) if err != nil { t.Errorf("Unexpected error in listing pods: %#v", err) } if !reflect.DeepEqual(expectedPodList, receivedPodList) { t.Errorf("Unexpected pod list: %#v\nvs.\n%#v", receivedPodList, expectedPodList) } testServer.Close() }
func TestDoRequestNewWay(t *testing.T) { reqBody := "request body" expectedObj := &api.Service{Port: 12345} expectedBody, _ := runtime.Encode(expectedObj) fakeHandler := util.FakeHandler{ StatusCode: 200, ResponseBody: string(expectedBody), T: t, } testServer := httptest.NewServer(&fakeHandler) auth := AuthInfo{User: "******", Password: "******"} c := NewOrDie(testServer.URL, &auth) obj, err := c.Verb("POST"). Path("foo/bar"). Path("baz"). ParseSelectorParam("labels", "name=foo"). Timeout(time.Second). Body([]byte(reqBody)). Do().Get() if err != nil { t.Errorf("Unexpected error: %v %#v", err, err) return } if obj == nil { t.Error("nil obj") } else if !reflect.DeepEqual(obj, expectedObj) { t.Errorf("Expected: %#v, got %#v", expectedObj, obj) } fakeHandler.ValidateRequest(t, "/api/v1beta1/foo/bar/baz?labels=name%3Dfoo", "POST", &reqBody) if fakeHandler.RequestReceived.Header["Authorization"] == nil { t.Errorf("Request is missing authorization header: %#v", *fakeHandler.RequestReceived) } }
func TestDoRequestAccepted(t *testing.T) { status := api.Status{Status: api.StatusWorking} expectedBody, _ := api.Encode(status) fakeHandler := util.FakeHandler{ StatusCode: 202, ResponseBody: string(expectedBody), T: t, } testServer := httptest.NewTLSServer(&fakeHandler) request, _ := http.NewRequest("GET", testServer.URL+"/foo/bar", nil) auth := AuthInfo{User: "******", Password: "******"} c := New(testServer.URL, &auth) body, err := c.doRequest(request) if request.Header["Authorization"] == nil { t.Errorf("Request is missing authorization header: %#v", *request) } if err == nil { t.Error("Unexpected non-error") return } se, ok := err.(*StatusErr) if !ok { t.Errorf("Unexpected kind of error: %#v", err) return } if !reflect.DeepEqual(se.Status, status) { t.Errorf("Unexpected status: %#v", se.Status) } if body != nil { t.Errorf("Expected nil body, but saw: '%s'", body) } fakeHandler.ValidateRequest(t, "/foo/bar", "GET", nil) }
func TestCreateController(t *testing.T) { expectedController := api.ReplicationController{ JSONBase: api.JSONBase{ ID: "foo", }, DesiredState: api.ReplicationControllerState{ Replicas: 2, }, Labels: map[string]string{ "foo": "bar", "name": "baz", }, } body, _ := json.Marshal(expectedController) fakeHandler := util.FakeHandler{ StatusCode: 200, ResponseBody: string(body), } testServer := httptest.NewTLSServer(&fakeHandler) client := Client{ Host: testServer.URL, } receivedController, err := client.CreateReplicationController(api.ReplicationController{ JSONBase: api.JSONBase{ ID: "foo", }, }) expectNoError(t, err) if !reflect.DeepEqual(expectedController, receivedController) { t.Errorf("Unexpected controller, expected: %#v, received %#v", expectedController, receivedController) } fakeHandler.ValidateRequest(t, makeUrl("/replicationControllers"), "POST", nil) testServer.Close() }
func TestDoRequestNewWay(t *testing.T) { reqBody := "request body" expectedObj := &api.Service{Spec: api.ServiceSpec{Port: 12345}} expectedBody, _ := v1beta2.Codec.Encode(expectedObj) fakeHandler := util.FakeHandler{ StatusCode: 200, ResponseBody: string(expectedBody), T: t, } testServer := httptest.NewServer(&fakeHandler) defer testServer.Close() c := NewOrDie(&Config{Host: testServer.URL, Version: "v1beta2", Username: "******", Password: "******"}) obj, err := c.Verb("POST"). Prefix("foo", "bar"). Suffix("baz"). ParseSelectorParam("labels", "name=foo"). Timeout(time.Second). Body([]byte(reqBody)). Do().Get() if err != nil { t.Errorf("Unexpected error: %v %#v", err, err) return } if obj == nil { t.Error("nil obj") } else if !api.Semantic.DeepDerivative(expectedObj, obj) { t.Errorf("Expected: %#v, got %#v", expectedObj, obj) } fakeHandler.ValidateRequest(t, "/api/v1beta2/foo/bar/baz?labels=name%3Dfoo&timeout=1s", "POST", &reqBody) if fakeHandler.RequestReceived.Header["Authorization"] == nil { t.Errorf("Request is missing authorization header: %#v", *fakeHandler.RequestReceived) } }
func TestDoRequestCreated(t *testing.T) { status := &api.Status{Status: api.StatusSuccess} expectedBody, _ := latest.Codec.Encode(status) fakeHandler := util.FakeHandler{ StatusCode: 201, ResponseBody: string(expectedBody), T: t, } testServer := httptest.NewServer(&fakeHandler) defer testServer.Close() c, err := RESTClientFor(&Config{Host: testServer.URL, Username: "******", Password: "******", Version: testapi.Version()}) if err != nil { t.Fatalf("unexpected error: %v", err) } created := false body, err := c.Get().Path("test").Do().WasCreated(&created).Raw() if err != nil { t.Errorf("Unexpected error %#v", err) } if !created { t.Errorf("Expected object to be created") } statusOut, err := latest.Codec.Decode(body) if err != nil { t.Errorf("Unexpected error %#v", err) } if !reflect.DeepEqual(status, statusOut) { t.Errorf("Unexpected mis-match. Expected %#v. Saw %#v", status, statusOut) } fakeHandler.ValidateRequest(t, "/"+testapi.Version()+"/test", "GET", nil) }
func TestDoRequestAcceptedSuccess(t *testing.T) { status := &api.Status{Status: api.StatusSuccess} expectedBody, _ := latest.Codec.Encode(status) fakeHandler := util.FakeHandler{ StatusCode: 202, ResponseBody: string(expectedBody), T: t, } testServer := httptest.NewServer(&fakeHandler) defer testServer.Close() c, err := RESTClientFor(&Config{Host: testServer.URL, Username: "******", Password: "******", Version: testapi.Version()}) if err != nil { t.Fatalf("unexpected error: %v", err) } body, err := c.Get().Path("test").Do().Raw() if err != nil { t.Fatalf("unexpected error: %v", err) } if fakeHandler.RequestReceived.Header["Authorization"] == nil { t.Errorf("Request is missing authorization header: %#v", fakeHandler.RequestReceived) } statusOut, err := latest.Codec.Decode(body) if err != nil { t.Errorf("Unexpected error %#v", err) } if !reflect.DeepEqual(status, statusOut) { t.Errorf("Unexpected mis-match. Expected %#v. Saw %#v", status, statusOut) } fakeHandler.ValidateRequest(t, "/"+testapi.Version()+"/test", "GET", nil) }
func TestControllerUpdateReplicas(t *testing.T) { // This is a happy server just to record the PUT request we expect for status.Replicas fakeHandler := util.FakeHandler{ StatusCode: 200, ResponseBody: "", } testServer := httptest.NewServer(&fakeHandler) defer testServer.Close() client := client.NewOrDie(&client.Config{Host: testServer.URL, Version: testapi.Version()}) manager := NewReplicationManager(client, BurstReplicas) // Insufficient number of pods in the system, and Status.Replicas is wrong; // Status.Replica should update to match number of pods in system, 1 new pod should be created. rc := newReplicationController(5) manager.controllerStore.Store.Add(rc) rc.Status = api.ReplicationControllerStatus{Replicas: 2} newPodList(manager.podStore.Store, 4, api.PodRunning, rc) response := runtime.EncodeOrDie(testapi.Codec(), rc) fakeHandler.ResponseBody = response fakePodControl := FakePodControl{} manager.podControl = &fakePodControl manager.syncReplicationController(getKey(rc, t)) // Status.Replicas should go up from 2->4 even though we created 5-4=1 pod rc.Status = api.ReplicationControllerStatus{Replicas: 4} decRc := runtime.EncodeOrDie(testapi.Codec(), rc) fakeHandler.ValidateRequest(t, testapi.ResourcePath(replicationControllerResourceName(), rc.Namespace, rc.Name), "PUT", &decRc) validateSyncReplication(t, &fakePodControl, 1, 0) }
func TestListWatchesCanWatch(t *testing.T) { table := []struct { rv string location string lw ListWatch }{ // Minion { location: buildLocation(buildResourcePath("watch", api.NamespaceAll, "minions"), buildQueryValues(api.NamespaceAll, url.Values{"resourceVersion": []string{""}})), rv: "", lw: ListWatch{ FieldSelector: parseSelectorOrDie(""), Resource: "minions", }, }, { location: buildLocation(buildResourcePath("watch", api.NamespaceAll, "minions"), buildQueryValues(api.NamespaceAll, url.Values{"resourceVersion": []string{"42"}})), rv: "42", lw: ListWatch{ FieldSelector: parseSelectorOrDie(""), Resource: "minions", }, }, // pod with "assigned" field selector. { location: buildLocation(buildResourcePath("watch", api.NamespaceAll, "pods"), buildQueryValues(api.NamespaceAll, url.Values{"fields": []string{"DesiredState.Host="}, "resourceVersion": []string{"0"}})), rv: "0", lw: ListWatch{ FieldSelector: labels.Set{"DesiredState.Host": ""}.AsSelector(), Resource: "pods", }, }, // pod with namespace foo and assigned field selector { location: buildLocation(buildResourcePath("watch", "foo", "pods"), buildQueryValues("foo", url.Values{"fields": []string{"DesiredState.Host="}, "resourceVersion": []string{"0"}})), rv: "0", lw: ListWatch{ FieldSelector: labels.Set{"DesiredState.Host": ""}.AsSelector(), Resource: "pods", Namespace: "foo", }, }, } for _, item := range table { handler := util.FakeHandler{ StatusCode: 500, ResponseBody: "", T: t, } server := httptest.NewServer(&handler) defer server.Close() item.lw.Client = client.NewOrDie(&client.Config{Host: server.URL, Version: testapi.Version()}) // This test merely tests that the correct request is made. item.lw.Watch(item.rv) handler.ValidateRequest(t, item.location, "GET", nil) } }
func TestCreateWatches(t *testing.T) { factory := ConfigFactory{nil} table := []struct { rv string location string factory func() *listWatch }{ // Minion watch { rv: "", location: "/api/" + testapi.Version() + "/watch/minions?fields=&resourceVersion=", factory: factory.createMinionLW, }, { rv: "0", location: "/api/" + testapi.Version() + "/watch/minions?fields=&resourceVersion=0", factory: factory.createMinionLW, }, { rv: "42", location: "/api/" + testapi.Version() + "/watch/minions?fields=&resourceVersion=42", factory: factory.createMinionLW, }, // Assigned pod watches { rv: "", location: "/api/" + testapi.Version() + "/watch/pods?fields=DesiredState.Host!%3D&resourceVersion=", factory: factory.createAssignedPodLW, }, { rv: "42", location: "/api/" + testapi.Version() + "/watch/pods?fields=DesiredState.Host!%3D&resourceVersion=42", factory: factory.createAssignedPodLW, }, // Unassigned pod watches { rv: "", location: "/api/" + testapi.Version() + "/watch/pods?fields=DesiredState.Host%3D&resourceVersion=", factory: factory.createUnassignedPodLW, }, { rv: "42", location: "/api/" + testapi.Version() + "/watch/pods?fields=DesiredState.Host%3D&resourceVersion=42", factory: factory.createUnassignedPodLW, }, } for _, item := range table { handler := util.FakeHandler{ StatusCode: 500, ResponseBody: "", T: t, } server := httptest.NewServer(&handler) defer server.Close() factory.Client = client.NewOrDie(&client.Config{Host: server.URL, Version: testapi.Version()}) // This test merely tests that the correct request is made. item.factory().Watch(item.rv) handler.ValidateRequest(t, item.location, "GET", nil) } }
func TestCreateReplica(t *testing.T) { ns := api.NamespaceDefault body := runtime.EncodeOrDie(testapi.Codec(), &api.Pod{}) fakeHandler := util.FakeHandler{ StatusCode: 200, ResponseBody: string(body), } testServer := httptest.NewServer(&fakeHandler) defer testServer.Close() client := client.NewOrDie(&client.Config{Host: testServer.URL, Version: testapi.Version()}) podControl := RealPodControl{ kubeClient: client, } controllerSpec := api.ReplicationController{ ObjectMeta: api.ObjectMeta{ Name: "test", }, DesiredState: api.ReplicationControllerState{ PodTemplate: api.PodTemplate{ DesiredState: api.PodState{ Manifest: api.ContainerManifest{ Containers: []api.Container{ { Image: "foo/bar", }, }, }, }, Labels: map[string]string{ "name": "foo", "type": "production", "replicationController": "test", }, }, }, } podControl.createReplica(ns, controllerSpec) expectedPod := api.Pod{ ObjectMeta: api.ObjectMeta{ Labels: controllerSpec.DesiredState.PodTemplate.Labels, }, DesiredState: controllerSpec.DesiredState.PodTemplate.DesiredState, } fakeHandler.ValidateRequest(t, makeURL("/pods?namespace=default"), "POST", nil) actualPod, err := client.Codec.Decode([]byte(fakeHandler.RequestBody)) if err != nil { t.Errorf("Unexpected error: %#v", err) } if !reflect.DeepEqual(&expectedPod, actualPod) { t.Logf("Body: %s", fakeHandler.RequestBody) t.Errorf("Unexpected mismatch. Expected\n %#v,\n Got:\n %#v", &expectedPod, actualPod) } }
func TestDoRequestNewWayFile(t *testing.T) { reqObj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} reqBodyExpected, err := testapi.Codec().Encode(reqObj) if err != nil { t.Errorf("unexpected error: %v", err) } file, err := ioutil.TempFile("", "foo") if err != nil { t.Errorf("unexpected error: %v", err) } _, err = file.Write(reqBodyExpected) if err != nil { t.Errorf("unexpected error: %v", err) } expectedObj := &api.Service{Spec: api.ServiceSpec{Ports: []api.ServicePort{{ Protocol: "TCP", Port: 12345, TargetPort: util.NewIntOrStringFromInt(12345), }}}} expectedBody, _ := testapi.Codec().Encode(expectedObj) fakeHandler := util.FakeHandler{ StatusCode: 200, ResponseBody: string(expectedBody), T: t, } testServer := httptest.NewServer(&fakeHandler) c := NewOrDie(&Config{Host: testServer.URL, Version: testapi.Version(), Username: "******", Password: "******"}) wasCreated := true obj, err := c.Verb("POST"). Prefix("foo/bar", "baz"). Timeout(time.Second). Body(file.Name()). Do().WasCreated(&wasCreated).Get() if err != nil { t.Errorf("Unexpected error: %v %#v", err, err) return } if obj == nil { t.Error("nil obj") } else if !api.Semantic.DeepDerivative(expectedObj, obj) { t.Errorf("Expected: %#v, got %#v", expectedObj, obj) } if wasCreated { t.Errorf("expected object was not created") } tmpStr := string(reqBodyExpected) requestURL := testapi.ResourcePathWithPrefix("foo/bar/baz", "", "", "") requestURL += "?timeout=1s" fakeHandler.ValidateRequest(t, requestURL, "POST", &tmpStr) if fakeHandler.RequestReceived.Header["Authorization"] == nil { t.Errorf("Request is missing authorization header: %#v", *fakeHandler.RequestReceived) } }
func TestCreateReplica(t *testing.T) { body, _ := runtime.DefaultCodec.Encode(&api.Pod{}) fakeHandler := util.FakeHandler{ StatusCode: 200, ResponseBody: string(body), } testServer := httptest.NewTLSServer(&fakeHandler) client := client.NewOrDie(testServer.URL, nil) podControl := RealPodControl{ kubeClient: client, } controllerSpec := api.ReplicationController{ JSONBase: api.JSONBase{ Kind: "ReplicationController", }, DesiredState: api.ReplicationControllerState{ PodTemplate: api.PodTemplate{ DesiredState: api.PodState{ Manifest: api.ContainerManifest{ Containers: []api.Container{ { Image: "foo/bar", }, }, }, }, Labels: map[string]string{ "name": "foo", "type": "production", }, }, }, } podControl.createReplica(controllerSpec) expectedPod := api.Pod{ JSONBase: api.JSONBase{ Kind: "Pod", APIVersion: "v1beta1", }, Labels: controllerSpec.DesiredState.PodTemplate.Labels, DesiredState: controllerSpec.DesiredState.PodTemplate.DesiredState, } fakeHandler.ValidateRequest(t, makeURL("/pods"), "POST", nil) actualPod := api.Pod{} if err := json.Unmarshal([]byte(fakeHandler.RequestBody), &actualPod); err != nil { t.Errorf("Unexpected error: %#v", err) } if !reflect.DeepEqual(expectedPod, actualPod) { t.Logf("Body: %s", fakeHandler.RequestBody) t.Errorf("Unexpected mismatch. Expected\n %#v,\n Got:\n %#v", expectedPod, actualPod) } }
func TestCreateWatches(t *testing.T) { factory := ConfigFactory{nil} table := []struct { rv uint64 location string watchFactory func(rv uint64) (watch.Interface, error) }{ // Minion watch { rv: 0, location: "/api/v1beta1/watch/minions?resourceVersion=0", watchFactory: factory.createMinionWatch, }, { rv: 42, location: "/api/v1beta1/watch/minions?resourceVersion=42", watchFactory: factory.createMinionWatch, }, // Assigned pod watches { rv: 0, location: "/api/v1beta1/watch/pods?fields=DesiredState.Host!%3D&resourceVersion=0", watchFactory: factory.createAssignedPodWatch, }, { rv: 42, location: "/api/v1beta1/watch/pods?fields=DesiredState.Host!%3D&resourceVersion=42", watchFactory: factory.createAssignedPodWatch, }, // Unassigned pod watches { rv: 0, location: "/api/v1beta1/watch/pods?fields=DesiredState.Host%3D&resourceVersion=0", watchFactory: factory.createUnassignedPodWatch, }, { rv: 42, location: "/api/v1beta1/watch/pods?fields=DesiredState.Host%3D&resourceVersion=42", watchFactory: factory.createUnassignedPodWatch, }, } for _, item := range table { handler := util.FakeHandler{ StatusCode: 500, ResponseBody: "", T: t, } server := httptest.NewServer(&handler) factory.Client = client.NewOrDie(server.URL, nil) // This test merely tests that the correct request is made. item.watchFactory(item.rv) handler.ValidateRequest(t, item.location, "GET", nil) } }
func TestDoRequestNewWayFile(t *testing.T) { reqObj := &api.Pod{JSONBase: api.JSONBase{ID: "foo"}} reqBodyExpected, err := api.Encode(reqObj) if err != nil { t.Errorf("unexpected error: %v", err) } file, err := ioutil.TempFile("", "foo") if err != nil { t.Errorf("unexpected error: %v", err) } _, err = file.Write(reqBodyExpected) if err != nil { t.Errorf("unexpected error: %v", err) } expectedObj := &api.Service{Port: 12345} expectedBody, _ := api.Encode(expectedObj) fakeHandler := util.FakeHandler{ StatusCode: 200, ResponseBody: string(expectedBody), T: t, } testServer := httptest.NewServer(&fakeHandler) auth := AuthInfo{User: "******", Password: "******"} s := New(testServer.URL, &auth) obj, err := s.Verb("POST"). Path("foo/bar"). Path("baz"). ParseSelector("name=foo"). Timeout(time.Second). Body(file.Name()). Do().Get() if err != nil { t.Errorf("Unexpected error: %v %#v", err, err) return } if obj == nil { t.Error("nil obj") } else if !reflect.DeepEqual(obj, expectedObj) { t.Errorf("Expected: %#v, got %#v", expectedObj, obj) } tmpStr := string(reqBodyExpected) fakeHandler.ValidateRequest(t, "/api/v1beta1/foo/bar/baz", "POST", &tmpStr) if fakeHandler.RequestReceived.URL.RawQuery != "labels=name%3Dfoo" { t.Errorf("Unexpected query: %v", fakeHandler.RequestReceived.URL.RawQuery) } if fakeHandler.RequestReceived.Header["Authorization"] == nil { t.Errorf("Request is missing authorization header: %#v", *fakeHandler.RequestReceived) } }
func TestDoRequestNewWayFile(t *testing.T) { reqObj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} reqBodyExpected, err := v1beta1.Codec.Encode(reqObj) if err != nil { t.Errorf("unexpected error: %v", err) } file, err := ioutil.TempFile("", "foo") if err != nil { t.Errorf("unexpected error: %v", err) } _, err = file.Write(reqBodyExpected) if err != nil { t.Errorf("unexpected error: %v", err) } expectedObj := &api.Service{Spec: api.ServiceSpec{Port: 12345}} expectedBody, _ := v1beta1.Codec.Encode(expectedObj) fakeHandler := util.FakeHandler{ StatusCode: 200, ResponseBody: string(expectedBody), T: t, } testServer := httptest.NewServer(&fakeHandler) c := NewOrDie(&Config{Host: testServer.URL, Version: "v1beta1", Username: "******", Password: "******"}) wasCreated := true obj, err := c.Verb("POST"). Prefix("foo/bar", "baz"). ParseSelectorParam("labels", "name=foo"). Timeout(time.Second). Body(file.Name()). Do().WasCreated(&wasCreated).Get() if err != nil { t.Errorf("Unexpected error: %v %#v", err, err) return } if obj == nil { t.Error("nil obj") } else if !api.Semantic.DeepDerivative(expectedObj, obj) { t.Errorf("Expected: %#v, got %#v", expectedObj, obj) } if wasCreated { t.Errorf("expected object was not created") } tmpStr := string(reqBodyExpected) fakeHandler.ValidateRequest(t, "/api/v1beta1/foo/bar/baz?labels=name%3Dfoo&timeout=1s", "POST", &tmpStr) if fakeHandler.RequestReceived.Header["Authorization"] == nil { t.Errorf("Request is missing authorization header: %#v", *fakeHandler.RequestReceived) } }
func TestControllerUpdateReplicas(t *testing.T) { // Insufficient number of pods in the system, and Status.Replicas is wrong; // Status.Replica should update to match number of pods in system, 1 new pod should be created. rc := newReplicationController(5) rc.Status = api.ReplicationControllerStatus{Replicas: 2} activePods := 4 body, _ := latest.Codec.Encode(newPodList(activePods)) fakePodHandler := util.FakeHandler{ StatusCode: 200, ResponseBody: string(body), T: t, } fakeControllerHandler := util.FakeHandler{ StatusCode: 200, ResponseBody: runtime.EncodeOrDie(latest.Codec, &api.ReplicationControllerList{ Items: []api.ReplicationController{rc}, }), T: t, } fakeUpdateHandler := util.FakeHandler{ StatusCode: 200, ResponseBody: runtime.EncodeOrDie(testapi.Codec(), &rc), T: t, } mux := http.NewServeMux() mux.Handle("/api/"+testapi.Version()+"/pods/", &fakePodHandler) mux.Handle("/api/"+testapi.Version()+"/replicationControllers/", &fakeControllerHandler) mux.Handle(fmt.Sprintf("/api/"+testapi.Version()+"/replicationControllers/%s", rc.Name), &fakeUpdateHandler) mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) { w.WriteHeader(http.StatusNotFound) t.Errorf("Unexpected request for %v", req.RequestURI) }) testServer := httptest.NewServer(mux) defer testServer.Close() client := client.NewOrDie(&client.Config{Host: testServer.URL, Version: testapi.Version()}) manager := NewReplicationManager(client) fakePodControl := FakePodControl{} manager.podControl = &fakePodControl manager.synchronize() // Status.Replicas should go up from 2->4 even though we created 5-4=1 pod rc.Status = api.ReplicationControllerStatus{Replicas: 4} decRc := runtime.EncodeOrDie(testapi.Codec(), &rc) fakeUpdateHandler.ValidateRequest(t, fmt.Sprintf("/api/"+testapi.Version()+"/replicationControllers/%s?namespace=%s", rc.Name, rc.Namespace), "PUT", &decRc) validateSyncReplication(t, &fakePodControl, 1, 0) }
func TestListWatchesCanWatch(t *testing.T) { table := []struct { rv string location string lw ListWatch }{ // Minion { location: "/api/" + testapi.Version() + "/watch/minions?resourceVersion=", rv: "", lw: ListWatch{ FieldSelector: parseSelectorOrDie(""), Resource: "minions", }, }, { location: "/api/" + testapi.Version() + "/watch/minions?resourceVersion=42", rv: "42", lw: ListWatch{ FieldSelector: parseSelectorOrDie(""), Resource: "minions", }, }, // pod with "assigned" field selector. { location: "/api/" + testapi.Version() + "/watch/pods?fields=DesiredState.Host%3D&resourceVersion=0", rv: "0", lw: ListWatch{ FieldSelector: labels.Set{"DesiredState.Host": ""}.AsSelector(), Resource: "pods", }, }, } for _, item := range table { handler := util.FakeHandler{ StatusCode: 500, ResponseBody: "", T: t, } server := httptest.NewServer(&handler) defer server.Close() item.lw.Client = client.NewOrDie(&client.Config{Host: server.URL, Version: testapi.Version()}) // This test merely tests that the correct request is made. item.lw.Watch(item.rv) handler.ValidateRequest(t, item.location, "GET", nil) } }
func TestListWatchesCanList(t *testing.T) { fieldSelectorQueryParamName := api.FieldSelectorQueryParam(testapi.Version()) table := []struct { location string resource string namespace string fieldSelector fields.Selector }{ // Minion { location: testapi.ResourcePath("minions", api.NamespaceAll, ""), resource: "minions", namespace: api.NamespaceAll, fieldSelector: parseSelectorOrDie(""), }, // pod with "assigned" field selector. { location: buildLocation( testapi.ResourcePath("pods", api.NamespaceAll, ""), buildQueryValues(url.Values{fieldSelectorQueryParamName: []string{"spec.host="}})), resource: "pods", namespace: api.NamespaceAll, fieldSelector: fields.Set{"spec.host": ""}.AsSelector(), }, // pod in namespace "foo" { location: buildLocation( testapi.ResourcePath("pods", "foo", ""), buildQueryValues(url.Values{fieldSelectorQueryParamName: []string{"spec.host="}})), resource: "pods", namespace: "foo", fieldSelector: fields.Set{"spec.host": ""}.AsSelector(), }, } for _, item := range table { handler := util.FakeHandler{ StatusCode: 500, ResponseBody: "", T: t, } server := httptest.NewServer(&handler) defer server.Close() client := client.NewOrDie(&client.Config{Host: server.URL, Version: testapi.Version()}) lw := NewListWatchFromClient(client, item.resource, item.namespace, item.fieldSelector) // This test merely tests that the correct request is made. lw.List() handler.ValidateRequest(t, item.location, "GET", nil) } }
func TestDeleteController(t *testing.T) { fakeHandler := util.FakeHandler{ StatusCode: 200, ResponseBody: `{"success": true}`, } testServer := httptest.NewTLSServer(&fakeHandler) client := Client{ Host: testServer.URL, } err := client.DeleteReplicationController("foo") fakeHandler.ValidateRequest(t, makeUrl("/replicationControllers/foo"), "DELETE", nil) if err != nil { t.Errorf("Unexpected error: %#v", err) } testServer.Close() }
func TestDefaultErrorFunc(t *testing.T) { testPod := &api.Pod{ ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: "bar"}, Spec: api.PodSpec{ RestartPolicy: api.RestartPolicyAlways, DNSPolicy: api.DNSClusterFirst, }, } handler := util.FakeHandler{ StatusCode: 200, ResponseBody: runtime.EncodeOrDie(latest.Codec, testPod), T: t, } mux := http.NewServeMux() // FakeHandler musn't be sent requests other than the one you want to test. mux.Handle(testapi.ResourcePath("pods", "bar", "foo"), &handler) server := httptest.NewServer(mux) defer server.Close() factory := NewConfigFactory(client.NewOrDie(&client.Config{Host: server.URL, Version: testapi.Version()})) queue := cache.NewFIFO(cache.MetaNamespaceKeyFunc) podBackoff := podBackoff{ perPodBackoff: map[string]*backoffEntry{}, clock: &fakeClock{}, defaultDuration: 1 * time.Millisecond, maxDuration: 1 * time.Second, } errFunc := factory.makeDefaultErrorFunc(&podBackoff, queue) errFunc(testPod, nil) for { // This is a terrible way to do this but I plan on replacing this // whole error handling system in the future. The test will time // out if something doesn't work. time.Sleep(10 * time.Millisecond) got, exists, _ := queue.Get(testPod) if !exists { continue } handler.ValidateRequest(t, testapi.ResourcePath("pods", "bar", "foo"), "GET", nil) if e, a := testPod, got; !reflect.DeepEqual(e, a) { t.Errorf("Expected %v, got %v", e, a) } break } }