func TestEtcdCreatePodWithContainersError(t *testing.T) { fakeClient := util.MakeFakeEtcdClient(t) fakeClient.Data["/registry/hosts/machine/pods/foo"] = util.EtcdResponseWithError{ R: &etcd.Response{ Node: nil, }, E: &etcd.EtcdError{ErrorCode: 100}, } fakeClient.Data["/registry/hosts/machine/kubelet"] = util.EtcdResponseWithError{ R: &etcd.Response{ Node: nil, }, E: &etcd.EtcdError{ErrorCode: 200}, } registry := MakeTestEtcdRegistry(fakeClient, []string{"machine"}) err := registry.CreatePod("machine", api.Pod{ JSONBase: api.JSONBase{ ID: "foo", }, }) if err == nil { t.Error("Unexpected non-error") } _, err = fakeClient.Get("/registry/hosts/machine/pods/foo", false, false) if err == nil { t.Error("Unexpected non-error") } if err != nil && err.(*etcd.EtcdError).ErrorCode != 100 { t.Errorf("Unexpected error: %#v", err) } }
func TestEtcdDeletePodMultipleContainers(t *testing.T) { fakeClient := util.MakeFakeEtcdClient(t) key := "/registry/hosts/machine/pods/foo" fakeClient.Set(key, util.MakeJSONString(api.Pod{JSONBase: api.JSONBase{ID: "foo"}}), 0) fakeClient.Set("/registry/hosts/machine/kubelet", util.MakeJSONString([]api.ContainerManifest{ {Id: "foo"}, {Id: "bar"}, }), 0) registry := MakeTestEtcdRegistry(fakeClient, []string{"machine"}) err := registry.DeletePod("foo") expectNoError(t, err) if len(fakeClient.DeletedKeys) != 1 { t.Errorf("Expected 1 delete, found %#v", fakeClient.DeletedKeys) } if fakeClient.DeletedKeys[0] != key { t.Errorf("Unexpected key: %s, expected %s", fakeClient.DeletedKeys[0], key) } response, _ := fakeClient.Get("/registry/hosts/machine/kubelet", false, false) var manifests []api.ContainerManifest json.Unmarshal([]byte(response.Node.Value), &manifests) if len(manifests) != 1 { t.Errorf("Unexpected manifest set: %#v, expected empty", manifests) } if manifests[0].Id != "bar" { t.Errorf("Deleted wrong manifest: %#v", manifests) } }
func TestEventWriting(t *testing.T) { fakeEtcd := util.MakeFakeEtcdClient(t) kubelet := &Kubelet{ Client: fakeEtcd, } expectedEvent := api.Event{ Event: "test", Container: &api.Container{ Name: "foo", }, } err := kubelet.LogEvent(&expectedEvent) expectNoError(t, err) if fakeEtcd.Ix != 1 { t.Errorf("Unexpected number of children added: %d, expected 1", fakeEtcd.Ix) } response, err := fakeEtcd.Get("/events/foo/1", false, false) expectNoError(t, err) var event api.Event err = json.Unmarshal([]byte(response.Node.Value), &event) expectNoError(t, err) if event.Event != expectedEvent.Event || event.Container.Name != expectedEvent.Container.Name { t.Errorf("Event's don't match. Expected: %#v Saw: %#v", expectedEvent, event) } }
func TestEtcdListServices(t *testing.T) { fakeClient := util.MakeFakeEtcdClient(t) key := "/registry/services/specs" fakeClient.Data[key] = util.EtcdResponseWithError{ R: &etcd.Response{ Node: &etcd.Node{ Nodes: []*etcd.Node{ { Value: util.MakeJSONString(api.Service{JSONBase: api.JSONBase{ID: "foo"}}), }, { Value: util.MakeJSONString(api.Service{JSONBase: api.JSONBase{ID: "bar"}}), }, }, }, }, E: nil, } registry := MakeTestEtcdRegistry(fakeClient, []string{"machine"}) services, err := registry.ListServices() expectNoError(t, err) if len(services.Items) != 2 || services.Items[0].ID != "foo" || services.Items[1].ID != "bar" { t.Errorf("Unexpected pod list: %#v", services) } }
func TestEtcdListPods(t *testing.T) { fakeClient := util.MakeFakeEtcdClient(t) key := "/registry/hosts/machine/pods" fakeClient.Data[key] = util.EtcdResponseWithError{ R: &etcd.Response{ Node: &etcd.Node{ Nodes: []*etcd.Node{ { Value: util.MakeJSONString(api.Pod{JSONBase: api.JSONBase{ID: "foo"}}), }, { Value: util.MakeJSONString(api.Pod{JSONBase: api.JSONBase{ID: "bar"}}), }, }, }, }, E: nil, } registry := MakeTestEtcdRegistry(fakeClient, []string{"machine"}) pods, err := registry.ListPods(labels.Everything()) expectNoError(t, err) if len(pods) != 2 || pods[0].ID != "foo" || pods[1].ID != "bar" { t.Errorf("Unexpected pod list: %#v", pods) } if pods[0].CurrentState.Host != "machine" || pods[1].CurrentState.Host != "machine" { t.Errorf("Failed to populate host name.") } }
func TestEtcdListControllers(t *testing.T) { fakeClient := util.MakeFakeEtcdClient(t) key := "/registry/controllers" fakeClient.Data[key] = util.EtcdResponseWithError{ R: &etcd.Response{ Node: &etcd.Node{ Nodes: []*etcd.Node{ { Value: util.MakeJSONString(api.ReplicationController{JSONBase: api.JSONBase{ID: "foo"}}), }, { Value: util.MakeJSONString(api.ReplicationController{JSONBase: api.JSONBase{ID: "bar"}}), }, }, }, }, E: nil, } registry := MakeTestEtcdRegistry(fakeClient, []string{"machine"}) controllers, err := registry.ListControllers() expectNoError(t, err) if len(controllers) != 2 || controllers[0].ID != "foo" || controllers[1].ID != "bar" { t.Errorf("Unexpected controller list: %#v", controllers) } }
func TestEtcdGetService(t *testing.T) { fakeClient := util.MakeFakeEtcdClient(t) fakeClient.Set("/registry/services/specs/foo", util.MakeJSONString(api.Service{JSONBase: api.JSONBase{ID: "foo"}}), 0) registry := MakeTestEtcdRegistry(fakeClient, []string{"machine"}) service, err := registry.GetService("foo") expectNoError(t, err) if service.ID != "foo" { t.Errorf("Unexpected pod: %#v", service) } }
func TestEtcdGetController(t *testing.T) { fakeClient := util.MakeFakeEtcdClient(t) fakeClient.Set("/registry/controllers/foo", util.MakeJSONString(api.ReplicationController{JSONBase: api.JSONBase{ID: "foo"}}), 0) registry := MakeTestEtcdRegistry(fakeClient, []string{"machine"}) ctrl, err := registry.GetController("foo") expectNoError(t, err) if ctrl.ID != "foo" { t.Errorf("Unexpected controller: %#v", ctrl) } }
func TestEtcdGetPod(t *testing.T) { fakeClient := util.MakeFakeEtcdClient(t) fakeClient.Set("/registry/hosts/machine/pods/foo", util.MakeJSONString(api.Pod{JSONBase: api.JSONBase{ID: "foo"}}), 0) registry := MakeTestEtcdRegistry(fakeClient, []string{"machine"}) pod, err := registry.GetPod("foo") expectNoError(t, err) if pod.ID != "foo" { t.Errorf("Unexpected pod: %#v", pod) } }
func TestEtcdDeleteController(t *testing.T) { fakeClient := util.MakeFakeEtcdClient(t) registry := MakeTestEtcdRegistry(fakeClient, []string{"machine"}) err := registry.DeleteController("foo") expectNoError(t, err) if len(fakeClient.DeletedKeys) != 1 { t.Errorf("Expected 1 delete, found %#v", fakeClient.DeletedKeys) } key := "/registry/controllers/foo" if fakeClient.DeletedKeys[0] != key { t.Errorf("Unexpected key: %s, expected %s", fakeClient.DeletedKeys[0], key) } }
func TestWatchControllers(t *testing.T) { defer beginTimeout(20 * time.Second).done() fakeEtcd := util.MakeFakeEtcdClient(t) manager := MakeReplicationManager(fakeEtcd, nil) var testControllerSpec api.ReplicationController receivedCount := 0 manager.syncHandler = func(controllerSpec api.ReplicationController) error { if !reflect.DeepEqual(controllerSpec, testControllerSpec) { t.Errorf("Expected %#v, but got %#v", testControllerSpec, controllerSpec) } receivedCount++ return nil } go manager.watchControllers() time.Sleep(10 * time.Millisecond) // Test normal case testControllerSpec.ID = "foo" fakeEtcd.WatchResponse <- &etcd.Response{ Action: "set", Node: &etcd.Node{ Value: util.MakeJSONString(testControllerSpec), }, } time.Sleep(10 * time.Millisecond) if receivedCount != 1 { t.Errorf("Expected 1 call but got %v", receivedCount) } // Test error case fakeEtcd.WatchInjectError <- fmt.Errorf("Injected error") time.Sleep(10 * time.Millisecond) // Did everything shut down? if _, open := <-fakeEtcd.WatchResponse; open { t.Errorf("An injected error did not cause a graceful shutdown") } // Test purposeful shutdown go manager.watchControllers() time.Sleep(10 * time.Millisecond) fakeEtcd.WatchStop <- true time.Sleep(10 * time.Millisecond) // Did everything shut down? if _, open := <-fakeEtcd.WatchResponse; open { t.Errorf("A stop did not cause a graceful shutdown") } }
func TestEtcdListServicesNotFound(t *testing.T) { fakeClient := util.MakeFakeEtcdClient(t) key := "/registry/services/specs" fakeClient.Data[key] = util.EtcdResponseWithError{ R: &etcd.Response{}, E: &etcd.EtcdError{ErrorCode: 100}, } registry := MakeTestEtcdRegistry(fakeClient, []string{"machine"}) services, err := registry.ListServices() expectNoError(t, err) if len(services.Items) != 0 { t.Errorf("Unexpected controller list: %#v", services) } }
func TestEtcdListPodsNotFound(t *testing.T) { fakeClient := util.MakeFakeEtcdClient(t) key := "/registry/hosts/machine/pods" fakeClient.Data[key] = util.EtcdResponseWithError{ R: &etcd.Response{}, E: &etcd.EtcdError{ErrorCode: 100}, } registry := MakeTestEtcdRegistry(fakeClient, []string{"machine"}) pods, err := registry.ListPods(labels.Everything()) expectNoError(t, err) if len(pods) != 0 { t.Errorf("Unexpected pod list: %#v", pods) } }
func TestEtcdGetServiceNotFound(t *testing.T) { fakeClient := util.MakeFakeEtcdClient(t) fakeClient.Data["/registry/services/specs/foo"] = util.EtcdResponseWithError{ R: &etcd.Response{ Node: nil, }, E: &etcd.EtcdError{ ErrorCode: 100, }, } registry := MakeTestEtcdRegistry(fakeClient, []string{"machine"}) _, err := registry.GetService("foo") if err == nil { t.Errorf("Unexpected non-error.") } }
func TestEtcdUpdateController(t *testing.T) { fakeClient := util.MakeFakeEtcdClient(t) fakeClient.Set("/registry/controllers/foo", util.MakeJSONString(api.ReplicationController{JSONBase: api.JSONBase{ID: "foo"}}), 0) registry := MakeTestEtcdRegistry(fakeClient, []string{"machine"}) err := registry.UpdateController(api.ReplicationController{ JSONBase: api.JSONBase{ID: "foo"}, DesiredState: api.ReplicationControllerState{ Replicas: 2, }, }) expectNoError(t, err) ctrl, err := registry.GetController("foo") if ctrl.DesiredState.Replicas != 2 { t.Errorf("Unexpected controller: %#v", ctrl) } }
func TestEventWritingError(t *testing.T) { fakeEtcd := util.MakeFakeEtcdClient(t) kubelet := &Kubelet{ Client: fakeEtcd, } fakeEtcd.Err = fmt.Errorf("test error") err := kubelet.LogEvent(&api.Event{ Event: "test", Container: &api.Container{ Name: "foo", }, }) if err == nil { t.Errorf("Unexpected non-error") } }
func TestEtcdCreatePodWithContainersNotFound(t *testing.T) { fakeClient := util.MakeFakeEtcdClient(t) fakeClient.Data["/registry/hosts/machine/pods/foo"] = util.EtcdResponseWithError{ R: &etcd.Response{ Node: nil, }, E: &etcd.EtcdError{ErrorCode: 100}, } fakeClient.Data["/registry/hosts/machine/kubelet"] = util.EtcdResponseWithError{ R: &etcd.Response{ Node: nil, }, E: &etcd.EtcdError{ErrorCode: 100}, } registry := MakeTestEtcdRegistry(fakeClient, []string{"machine"}) err := registry.CreatePod("machine", api.Pod{ JSONBase: api.JSONBase{ ID: "foo", }, DesiredState: api.PodState{ Manifest: api.ContainerManifest{ Id: "foo", Containers: []api.Container{ { Name: "foo", }, }, }, }, }) expectNoError(t, err) resp, err := fakeClient.Get("/registry/hosts/machine/pods/foo", false, false) expectNoError(t, err) var pod api.Pod err = json.Unmarshal([]byte(resp.Node.Value), &pod) expectNoError(t, err) if pod.ID != "foo" { t.Errorf("Unexpected pod: %#v %s", pod, resp.Node.Value) } var manifests []api.ContainerManifest resp, err = fakeClient.Get("/registry/hosts/machine/kubelet", false, false) expectNoError(t, err) err = json.Unmarshal([]byte(resp.Node.Value), &manifests) if len(manifests) != 1 || manifests[0].Id != "foo" { t.Errorf("Unexpected manifest list: %#v", manifests) } }
func TestEtcdUpdateEndpoints(t *testing.T) { fakeClient := util.MakeFakeEtcdClient(t) registry := MakeTestEtcdRegistry(fakeClient, []string{"machine"}) endpoints := api.Endpoints{ Name: "foo", Endpoints: []string{"baz", "bar"}, } err := registry.UpdateEndpoints(endpoints) expectNoError(t, err) response, err := fakeClient.Get("/registry/services/endpoints/foo", false, false) expectNoError(t, err) var endpointsOut api.Endpoints err = json.Unmarshal([]byte(response.Node.Value), &endpointsOut) if !reflect.DeepEqual(endpoints, endpointsOut) { t.Errorf("Unexpected endpoints: %#v, expected %#v", endpointsOut, endpoints) } }
func TestEtcdDeleteService(t *testing.T) { fakeClient := util.MakeFakeEtcdClient(t) registry := MakeTestEtcdRegistry(fakeClient, []string{"machine"}) err := registry.DeleteService("foo") expectNoError(t, err) if len(fakeClient.DeletedKeys) != 2 { t.Errorf("Expected 2 delete, found %#v", fakeClient.DeletedKeys) } key := "/registry/services/specs/foo" if fakeClient.DeletedKeys[0] != key { t.Errorf("Unexpected key: %s, expected %s", fakeClient.DeletedKeys[0], key) } key = "/registry/services/endpoints/foo" if fakeClient.DeletedKeys[1] != key { t.Errorf("Unexpected key: %s, expected %s", fakeClient.DeletedKeys[1], key) } }
func TestEtcdCreateController(t *testing.T) { fakeClient := util.MakeFakeEtcdClient(t) registry := MakeTestEtcdRegistry(fakeClient, []string{"machine"}) err := registry.CreateController(api.ReplicationController{ JSONBase: api.JSONBase{ ID: "foo", }, }) expectNoError(t, err) resp, err := fakeClient.Get("/registry/controllers/foo", false, false) expectNoError(t, err) var ctrl api.ReplicationController err = json.Unmarshal([]byte(resp.Node.Value), &ctrl) expectNoError(t, err) if ctrl.ID != "foo" { t.Errorf("Unexpected pod: %#v %s", ctrl, resp.Node.Value) } }
func TestEtcdGetControllerNotFound(t *testing.T) { fakeClient := util.MakeFakeEtcdClient(t) fakeClient.Data["/registry/controllers/foo"] = util.EtcdResponseWithError{ R: &etcd.Response{ Node: nil, }, E: &etcd.EtcdError{ ErrorCode: 100, }, } registry := MakeTestEtcdRegistry(fakeClient, []string{"machine"}) ctrl, err := registry.GetController("foo") if ctrl != nil { t.Errorf("Unexpected non-nil controller: %#v", ctrl) } if err == nil { t.Error("Unexpected non-error.") } }
func TestEtcdCreatePodAlreadyExisting(t *testing.T) { fakeClient := util.MakeFakeEtcdClient(t) fakeClient.Data["/registry/hosts/machine/pods/foo"] = util.EtcdResponseWithError{ R: &etcd.Response{ Node: &etcd.Node{ Value: util.MakeJSONString(api.Pod{JSONBase: api.JSONBase{ID: "foo"}}), }, }, E: nil, } registry := MakeTestEtcdRegistry(fakeClient, []string{"machine"}) err := registry.CreatePod("machine", api.Pod{ JSONBase: api.JSONBase{ ID: "foo", }, }) if err == nil { t.Error("Unexpected non-error") } }
func TestEtcdUpdateService(t *testing.T) { fakeClient := util.MakeFakeEtcdClient(t) fakeClient.Set("/registry/services/specs/foo", util.MakeJSONString(api.Service{JSONBase: api.JSONBase{ID: "foo"}}), 0) registry := MakeTestEtcdRegistry(fakeClient, []string{"machine"}) testService := api.Service{ JSONBase: api.JSONBase{ID: "foo"}, Labels: map[string]string{ "baz": "bar", }, Selector: map[string]string{ "baz": "bar", }, } err := registry.UpdateService(testService) expectNoError(t, err) svc, err := registry.GetService("foo") expectNoError(t, err) if !reflect.DeepEqual(*svc, testService) { t.Errorf("Unexpected service: got %#v, wanted %#v", svc, testService) } }
func TestGetKubeletStateFromEtcdNoData(t *testing.T) { fakeClient := util.MakeFakeEtcdClient(t) kubelet := Kubelet{ EtcdClient: fakeClient, } channel := make(chan manifestUpdate) reader := startReading(channel) fakeClient.Data["/registry/hosts/machine/kubelet"] = util.EtcdResponseWithError{ R: &etcd.Response{}, E: nil, } err := kubelet.getKubeletStateFromEtcd("/registry/hosts/machine", channel) if err == nil { t.Error("Unexpected no err.") } close(channel) list := reader.GetList() if len(list) != 0 { t.Errorf("Unexpected list: %#v", list) } }
func TestGetKubeletStateFromEtcdNotFound(t *testing.T) { fakeClient := util.MakeFakeEtcdClient(t) kubelet := Kubelet{ Client: fakeClient, } channel := make(chan []api.ContainerManifest) reader := startReading(channel) fakeClient.Data["/registry/hosts/machine/kubelet"] = util.EtcdResponseWithError{ R: &etcd.Response{}, E: &etcd.EtcdError{ ErrorCode: 100, }, } err := kubelet.getKubeletStateFromEtcd("/registry/hosts/machine", channel) expectNoError(t, err) close(channel) list := reader.GetList() if len(list) != 0 { t.Errorf("Unexpected list: %#v", list) } }
func TestEtcdDeletePod(t *testing.T) { fakeClient := util.MakeFakeEtcdClient(t) key := "/registry/hosts/machine/pods/foo" fakeClient.Set(key, util.MakeJSONString(api.Pod{JSONBase: api.JSONBase{ID: "foo"}}), 0) fakeClient.Set("/registry/hosts/machine/kubelet", util.MakeJSONString([]api.ContainerManifest{ { Id: "foo", }, }), 0) registry := MakeTestEtcdRegistry(fakeClient, []string{"machine"}) err := registry.DeletePod("foo") expectNoError(t, err) if len(fakeClient.DeletedKeys) != 1 { t.Errorf("Expected 1 delete, found %#v", fakeClient.DeletedKeys) } else if fakeClient.DeletedKeys[0] != key { t.Errorf("Unexpected key: %s, expected %s", fakeClient.DeletedKeys[0], key) } response, _ := fakeClient.Get("/registry/hosts/machine/kubelet", false, false) if response.Node.Value != "[]" { t.Errorf("Unexpected container set: %s, expected empty", response.Node.Value) } }
func TestEtcdCreateService(t *testing.T) { fakeClient := util.MakeFakeEtcdClient(t) fakeClient.Data["/registry/services/specs/foo"] = util.EtcdResponseWithError{ R: &etcd.Response{ Node: nil, }, E: &etcd.EtcdError{ErrorCode: 100}, } registry := MakeTestEtcdRegistry(fakeClient, []string{"machine"}) err := registry.CreateService(api.Service{ JSONBase: api.JSONBase{ID: "foo"}, }) expectNoError(t, err) resp, err := fakeClient.Get("/registry/services/specs/foo", false, false) expectNoError(t, err) var service api.Service err = json.Unmarshal([]byte(resp.Node.Value), &service) expectNoError(t, err) if service.ID != "foo" { t.Errorf("Unexpected service: %#v %s", service, resp.Node.Value) } }
func TestGetKubeletStateFromEtcd(t *testing.T) { fakeClient := util.MakeFakeEtcdClient(t) kubelet := Kubelet{ EtcdClient: fakeClient, } channel := make(chan manifestUpdate) reader := startReading(channel) fakeClient.Data["/registry/hosts/machine/kubelet"] = util.EtcdResponseWithError{ R: &etcd.Response{ Node: &etcd.Node{ Value: util.MakeJSONString([]api.Container{}), }, }, E: nil, } err := kubelet.getKubeletStateFromEtcd("/registry/hosts/machine", channel) expectNoError(t, err) close(channel) list := reader.GetList() if len(list) != 1 { t.Errorf("Unexpected list: %#v", list) } }
func TestSyncronize(t *testing.T) { controllerSpec1 := api.ReplicationController{ DesiredState: api.ReplicationControllerState{ Replicas: 4, PodTemplate: api.PodTemplate{ DesiredState: api.PodState{ Manifest: api.ContainerManifest{ Containers: []api.Container{ { Image: "foo/bar", }, }, }, }, Labels: map[string]string{ "name": "foo", "type": "production", }, }, }, } controllerSpec2 := api.ReplicationController{ DesiredState: api.ReplicationControllerState{ Replicas: 3, PodTemplate: api.PodTemplate{ DesiredState: api.PodState{ Manifest: api.ContainerManifest{ Containers: []api.Container{ { Image: "bar/baz", }, }, }, }, Labels: map[string]string{ "name": "bar", "type": "production", }, }, }, } fakeEtcd := util.MakeFakeEtcdClient(t) fakeEtcd.Data["/registry/controllers"] = util.EtcdResponseWithError{ R: &etcd.Response{ Node: &etcd.Node{ Nodes: []*etcd.Node{ { Value: util.MakeJSONString(controllerSpec1), }, { Value: util.MakeJSONString(controllerSpec2), }, }, }, }, } fakeHandler := util.FakeHandler{ StatusCode: 200, ResponseBody: "{}", T: t, } testServer := httptest.NewTLSServer(&fakeHandler) client := client.New(testServer.URL, nil) manager := MakeReplicationManager(fakeEtcd, client) fakePodControl := FakePodControl{} manager.podControl = &fakePodControl manager.synchronize() validateSyncReplication(t, &fakePodControl, 7, 0) }