func TestServiceStorageValidatesUpdate(t *testing.T) { registry := registrytest.NewServiceRegistry() registry.CreateService(api.Service{ JSONBase: api.JSONBase{ID: "foo"}, Selector: map[string]string{"bar": "baz"}, }) storage := NewRegistryStorage(registry, nil, nil) failureCases := map[string]api.Service{ "empty ID": { JSONBase: api.JSONBase{ID: ""}, Selector: map[string]string{"bar": "baz"}, }, "empty selector": { JSONBase: api.JSONBase{ID: "foo"}, Selector: map[string]string{}, }, } for _, failureCase := range failureCases { c, err := storage.Update(&failureCase) if c != nil { t.Errorf("Expected nil channel") } if err == nil { t.Errorf("Expected to get an error") } } }
func TestEndpointsRegistryList(t *testing.T) { registry := registrytest.NewServiceRegistry() storage := NewREST(registry) registry.EndpointsList = api.EndpointsList{ JSONBase: api.JSONBase{ResourceVersion: 1}, Items: []api.Endpoints{ {JSONBase: api.JSONBase{ID: "foo"}}, {JSONBase: api.JSONBase{ID: "bar"}}, }, } s, _ := storage.List(labels.Everything(), labels.Everything()) sl := s.(*api.EndpointsList) if len(sl.Items) != 2 { t.Fatalf("Expected 2 endpoints, but got %v", len(sl.Items)) } if e, a := "foo", sl.Items[0].ID; e != a { t.Errorf("Expected %v, but got %v", e, a) } if e, a := "bar", sl.Items[1].ID; e != a { t.Errorf("Expected %v, but got %v", e, a) } if sl.ResourceVersion != 1 { t.Errorf("Unexpected resource version: %#v", sl) } }
func TestEndpointsRegistryList(t *testing.T) { registry := registrytest.NewServiceRegistry() storage := NewREST(registry) registry.EndpointsList = api.EndpointsList{ ListMeta: api.ListMeta{ResourceVersion: "1"}, Items: []api.Endpoints{ {ObjectMeta: api.ObjectMeta{Name: "foo"}}, {ObjectMeta: api.ObjectMeta{Name: "bar"}}, }, } ctx := api.NewContext() s, _ := storage.List(ctx, labels.Everything(), labels.Everything()) sl := s.(*api.EndpointsList) if len(sl.Items) != 2 { t.Fatalf("Expected 2 endpoints, but got %v", len(sl.Items)) } if e, a := "foo", sl.Items[0].Name; e != a { t.Errorf("Expected %v, but got %v", e, a) } if e, a := "bar", sl.Items[1].Name; e != a { t.Errorf("Expected %v, but got %v", e, a) } if sl.ResourceVersion != "1" { t.Errorf("Unexpected resource version: %#v", sl) } }
func TestServiceRegistryExternalService(t *testing.T) { ctx := api.NewDefaultContext() registry := registrytest.NewServiceRegistry() fakeCloud := &cloud.FakeCloud{} machines := []string{"foo", "bar", "baz"} storage := NewREST(registry, fakeCloud, registrytest.NewMinionRegistry(machines, api.NodeResources{}), makeIPNet(t)) svc := &api.Service{ ObjectMeta: api.ObjectMeta{Name: "foo"}, Spec: api.ServiceSpec{ Port: 6502, Selector: map[string]string{"bar": "baz"}, CreateExternalLoadBalancer: true, }, } c, _ := storage.Create(ctx, svc) <-c if len(fakeCloud.Calls) != 2 || fakeCloud.Calls[0] != "get-zone" || fakeCloud.Calls[1] != "create" { t.Errorf("Unexpected call(s): %#v", fakeCloud.Calls) } srv, err := registry.GetService(ctx, svc.Name) if err != nil { t.Errorf("Unexpected error: %v", err) } if srv == nil { t.Errorf("Failed to find service: %s", svc.Name) } }
func TestServiceStorageValidatesCreate(t *testing.T) { registry := registrytest.NewServiceRegistry() storage := NewREST(registry, nil, nil) failureCases := map[string]api.Service{ "empty ID": { Port: 6502, JSONBase: api.JSONBase{ID: ""}, Selector: map[string]string{"bar": "baz"}, }, "empty selector": { JSONBase: api.JSONBase{ID: "foo"}, Selector: map[string]string{}, }, } for _, failureCase := range failureCases { c, err := storage.Create(&failureCase) if c != nil { t.Errorf("Expected nil channel") } if !errors.IsInvalid(err) { t.Errorf("Expected to get an invalid resource error, got %v", err) } } }
func TestServiceRegistryList(t *testing.T) { registry := registrytest.NewServiceRegistry() fakeCloud := &cloud.FakeCloud{} machines := []string{"foo", "bar", "baz"} storage := NewREST(registry, fakeCloud, minion.NewRegistry(machines)) registry.CreateService(&api.Service{ JSONBase: api.JSONBase{ID: "foo"}, Selector: map[string]string{"bar": "baz"}, }) registry.CreateService(&api.Service{ JSONBase: api.JSONBase{ID: "foo2"}, Selector: map[string]string{"bar2": "baz2"}, }) registry.List.ResourceVersion = 1 s, _ := storage.List(labels.Everything()) sl := s.(*api.ServiceList) if len(fakeCloud.Calls) != 0 { t.Errorf("Unexpected call(s): %#v", fakeCloud.Calls) } if len(sl.Items) != 2 { t.Fatalf("Expected 2 services, but got %v", len(sl.Items)) } if e, a := "foo", sl.Items[0].ID; e != a { t.Errorf("Expected %v, but got %v", e, a) } if e, a := "foo2", sl.Items[1].ID; e != a { t.Errorf("Expected %v, but got %v", e, a) } if sl.ResourceVersion != 1 { t.Errorf("Unexpected resource version: %#v", sl) } }
func TestServiceRegistryCreate(t *testing.T) { registry := registrytest.NewServiceRegistry() fakeCloud := &cloud.FakeCloud{} machines := []string{"foo", "bar", "baz"} storage := NewREST(registry, fakeCloud, minion.NewRegistry(machines)) svc := &api.Service{ Port: 6502, JSONBase: api.JSONBase{ID: "foo"}, Selector: map[string]string{"bar": "baz"}, } c, _ := storage.Create(svc) created_svc := <-c created_service := created_svc.(*api.Service) if created_service.ID != "foo" { t.Errorf("Expected foo, but got %v", created_service.ID) } if created_service.CreationTimestamp.IsZero() { t.Errorf("Expected timestamp to be set, got %:v", created_service.CreationTimestamp) } if len(fakeCloud.Calls) != 0 { t.Errorf("Unexpected call(s): %#v", fakeCloud.Calls) } srv, err := registry.GetService(svc.ID) if err != nil { t.Errorf("unexpected error: %v", err) } if srv == nil { t.Errorf("Failed to find service: %s", svc.ID) } }
func TestServiceRegistryResourceLocation(t *testing.T) { ctx := api.NewDefaultContext() registry := registrytest.NewServiceRegistry() registry.Endpoints = api.Endpoints{Endpoints: []string{"foo:80"}} fakeCloud := &cloud.FakeCloud{} machines := []string{"foo", "bar", "baz"} storage := NewREST(registry, fakeCloud, registrytest.NewMinionRegistry(machines, api.NodeResources{}), makeIPNet(t)) registry.CreateService(ctx, &api.Service{ ObjectMeta: api.ObjectMeta{Name: "foo"}, Spec: api.ServiceSpec{ Selector: map[string]string{"bar": "baz"}, }, }) redirector := apiserver.Redirector(storage) location, err := redirector.ResourceLocation(ctx, "foo") if err != nil { t.Errorf("Unexpected error: %v", err) } if e, a := "foo:80", location; e != a { t.Errorf("Expected %v, but got %v", e, a) } if e, a := "foo", registry.GottenID; e != a { t.Errorf("Expected %v, but got %v", e, a) } // Test error path registry.Err = fmt.Errorf("fake error") if _, err = redirector.ResourceLocation(ctx, "foo"); err == nil { t.Errorf("unexpected nil error") } }
func TestServiceRegistryResourceLocation(t *testing.T) { registry := registrytest.NewServiceRegistry() registry.Endpoints = api.Endpoints{Endpoints: []string{"foo:80"}} fakeCloud := &cloud.FakeCloud{} machines := []string{"foo", "bar", "baz"} storage := NewREST(registry, fakeCloud, minion.NewRegistry(machines)) registry.CreateService(&api.Service{ JSONBase: api.JSONBase{ID: "foo"}, Selector: map[string]string{"bar": "baz"}, }) redirector := apiserver.Redirector(storage) location, err := redirector.ResourceLocation("foo") if err != nil { t.Errorf("Unexpected error: %v", err) } if e, a := "http://foo:80", location; e != a { t.Errorf("Expected %v, but got %v", e, a) } if e, a := "foo", registry.GottenID; e != a { t.Errorf("Expected %v, but got %v", e, a) } // Test error path registry.Err = fmt.Errorf("fake error") if _, err = redirector.ResourceLocation("foo"); err == nil { t.Errorf("unexpected nil error") } }
func TestServiceRegistryUpdate(t *testing.T) { ctx := api.NewDefaultContext() registry := registrytest.NewServiceRegistry() registry.CreateService(ctx, &api.Service{ ObjectMeta: api.ObjectMeta{Name: "foo"}, Spec: api.ServiceSpec{ Port: 6502, Selector: map[string]string{"bar": "baz1"}, }, }) storage := NewREST(registry, nil, nil, makeIPNet(t)) c, err := storage.Update(ctx, &api.Service{ ObjectMeta: api.ObjectMeta{Name: "foo"}, Spec: api.ServiceSpec{ Port: 6502, Selector: map[string]string{"bar": "baz2"}, }, }) if c == nil { t.Errorf("Expected non-nil channel") } if err != nil { t.Errorf("Expected no error") } updated_svc := <-c updated_service := updated_svc.Object.(*api.Service) if updated_service.Name != "foo" { t.Errorf("Expected foo, but got %v", updated_service.Name) } if e, a := "foo", registry.UpdatedID; e != a { t.Errorf("Expected %v, but got %v", e, a) } }
func TestServiceRegistryExternalServiceError(t *testing.T) { registry := registrytest.NewServiceRegistry() fakeCloud := &cloud.FakeCloud{ Err: fmt.Errorf("test error"), } machines := []string{"foo", "bar", "baz"} storage := NewREST(registry, fakeCloud, registrytest.NewMinionRegistry(machines, api.NodeResources{}), makeIPNet(t)) svc := &api.Service{ ObjectMeta: api.ObjectMeta{Name: "foo"}, Spec: api.ServiceSpec{ Port: 6502, Selector: map[string]string{"bar": "baz"}, CreateExternalLoadBalancer: true, }, } ctx := api.NewDefaultContext() c, _ := storage.Create(ctx, svc) <-c if len(fakeCloud.Calls) != 1 || fakeCloud.Calls[0] != "get-zone" { t.Errorf("Unexpected call(s): %#v", fakeCloud.Calls) } if registry.Service != nil { t.Errorf("Expected registry.CreateService to not get called, but it got %#v", registry.Service) } }
func TestRepairEmpty(t *testing.T) { _, cidr, _ := net.ParseCIDR("192.168.1.0/24") previous := ipallocator.NewCIDRRange(cidr) previous.Allocate(net.ParseIP("192.168.1.10")) var dst api.RangeAllocation err := previous.Snapshot(&dst) if err != nil { t.Fatal(err) } registry := registrytest.NewServiceRegistry() ipregistry := &mockRangeRegistry{ item: &api.RangeAllocation{ ObjectMeta: api.ObjectMeta{ ResourceVersion: "1", }, Range: dst.Range, Data: dst.Data, }, } r := NewRepair(0, registry, cidr, ipregistry) if err := r.RunOnce(); err != nil { t.Fatal(err) } after := ipallocator.NewCIDRRange(cidr) if err := after.Restore(cidr, ipregistry.updated.Data); err != nil { t.Fatal(err) } if after.Has(net.ParseIP("192.168.1.10")) { t.Errorf("unexpected ipallocator state: %#v", after) } }
func validateObject(obj runtime.Object) (errors []error) { ctx := api.NewDefaultContext() switch t := obj.(type) { case *api.ReplicationController: errors = validation.ValidateManifest(&t.DesiredState.PodTemplate.DesiredState.Manifest) case *api.ReplicationControllerList: for i := range t.Items { errors = append(errors, validateObject(&t.Items[i])...) } case *api.Service: api.ValidNamespace(ctx, &t.ObjectMeta) errors = validation.ValidateService(t, registrytest.NewServiceRegistry(), api.NewDefaultContext()) case *api.ServiceList: for i := range t.Items { errors = append(errors, validateObject(&t.Items[i])...) } case *api.Pod: api.ValidNamespace(ctx, &t.ObjectMeta) errors = validation.ValidateManifest(&t.DesiredState.Manifest) case *api.PodList: for i := range t.Items { errors = append(errors, validateObject(&t.Items[i])...) } default: return []error{fmt.Errorf("no validation defined for %#v", obj)} } return errors }
func TestServiceRegistryIPExternalLoadBalancer(t *testing.T) { registry := registrytest.NewServiceRegistry() fakeCloud := &cloud.FakeCloud{} machines := []string{"foo", "bar", "baz"} rest := NewREST(registry, fakeCloud, registrytest.NewMinionRegistry(machines, api.NodeResources{}), makeIPNet(t)) svc := &api.Service{ ObjectMeta: api.ObjectMeta{Name: "foo"}, Spec: api.ServiceSpec{ Selector: map[string]string{"bar": "baz"}, Port: 6502, CreateExternalLoadBalancer: true, }, } ctx := api.NewDefaultContext() c, _ := rest.Create(ctx, svc) created_svc := <-c created_service := created_svc.Object.(*api.Service) if created_service.Spec.Port != 6502 { t.Errorf("Expected port 6502, but got %v", created_service.Spec.Port) } if created_service.Spec.PortalIP != "1.2.3.1" { t.Errorf("Unexpected PortalIP: %s", created_service.Spec.PortalIP) } if created_service.Spec.ProxyPort != 6502 { t.Errorf("Unexpected ProxyPort: %d", created_service.Spec.ProxyPort) } }
func TestServiceRegistryUpdate(t *testing.T) { registry := registrytest.NewServiceRegistry() registry.CreateService(&api.Service{ Port: 6502, JSONBase: api.JSONBase{ID: "foo"}, Selector: map[string]string{"bar": "baz1"}, }) storage := NewREST(registry, nil, nil) c, err := storage.Update(&api.Service{ Port: 6502, JSONBase: api.JSONBase{ID: "foo"}, Selector: map[string]string{"bar": "baz2"}, }) if c == nil { t.Errorf("Expected non-nil channel") } if err != nil { t.Errorf("Expected no error") } updated_svc := <-c updated_service := updated_svc.(*api.Service) if updated_service.ID != "foo" { t.Errorf("Expected foo, but got %v", updated_service.ID) } if e, a := "foo", registry.UpdatedID; e != a { t.Errorf("Expected %v, but got %v", e, a) } }
func TestServiceStorageValidatesCreate(t *testing.T) { registry := registrytest.NewServiceRegistry() storage := NewREST(registry, nil, nil, makeIPNet(t)) failureCases := map[string]api.Service{ "empty ID": { ObjectMeta: api.ObjectMeta{Name: ""}, Spec: api.ServiceSpec{ Port: 6502, Selector: map[string]string{"bar": "baz"}, }, }, "empty selector": { ObjectMeta: api.ObjectMeta{Name: "foo"}, Spec: api.ServiceSpec{ Selector: map[string]string{"bar": "baz"}, }, }, } ctx := api.NewDefaultContext() for _, failureCase := range failureCases { c, err := storage.Create(ctx, &failureCase) if c != nil { t.Errorf("Expected nil channel") } if !errors.IsInvalid(err) { t.Errorf("Expected to get an invalid resource error, got %v", err) } } }
func TestRepairWithExisting(t *testing.T) { _, cidr, _ := net.ParseCIDR("192.168.1.0/24") previous := ipallocator.NewCIDRRange(cidr) var dst api.RangeAllocation err := previous.Snapshot(&dst) if err != nil { t.Fatal(err) } registry := registrytest.NewServiceRegistry() registry.List = api.ServiceList{ Items: []api.Service{ { Spec: api.ServiceSpec{ClusterIP: "192.168.1.1"}, }, { Spec: api.ServiceSpec{ClusterIP: "192.168.1.100"}, }, { // outside CIDR, will be dropped Spec: api.ServiceSpec{ClusterIP: "192.168.0.1"}, }, { // empty, ignored Spec: api.ServiceSpec{ClusterIP: ""}, }, { // duplicate, dropped Spec: api.ServiceSpec{ClusterIP: "192.168.1.1"}, }, { // headless Spec: api.ServiceSpec{ClusterIP: "None"}, }, }, } ipregistry := &mockRangeRegistry{ item: &api.RangeAllocation{ ObjectMeta: api.ObjectMeta{ ResourceVersion: "1", }, Range: dst.Range, Data: dst.Data, }, } r := NewRepair(0, registry, cidr, ipregistry) if err := r.RunOnce(); err != nil { t.Fatal(err) } after := ipallocator.NewCIDRRange(cidr) if err := after.Restore(cidr, ipregistry.updated.Data); err != nil { t.Fatal(err) } if !after.Has(net.ParseIP("192.168.1.1")) || !after.Has(net.ParseIP("192.168.1.100")) { t.Errorf("unexpected ipallocator state: %#v", after) } if after.Free() != 252 { t.Errorf("unexpected ipallocator state: %#v", after) } }
func TestServiceRegistryIPAllocation(t *testing.T) { registry := registrytest.NewServiceRegistry() fakeCloud := &cloud.FakeCloud{} machines := []string{"foo", "bar", "baz"} rest := NewREST(registry, fakeCloud, registrytest.NewMinionRegistry(machines, api.NodeResources{}), makeIPNet(t)) rest.portalMgr.randomAttempts = 0 svc1 := &api.Service{ ObjectMeta: api.ObjectMeta{Name: "foo"}, Spec: api.ServiceSpec{ Selector: map[string]string{"bar": "baz"}, Port: 6502, }, } ctx := api.NewDefaultContext() c1, _ := rest.Create(ctx, svc1) created_svc1 := <-c1 created_service_1 := created_svc1.Object.(*api.Service) if created_service_1.Name != "foo" { t.Errorf("Expected foo, but got %v", created_service_1.Name) } if created_service_1.Spec.PortalIP != "1.2.3.1" { t.Errorf("Unexpected PortalIP: %s", created_service_1.Spec.PortalIP) } svc2 := &api.Service{ ObjectMeta: api.ObjectMeta{Name: "bar"}, Spec: api.ServiceSpec{ Selector: map[string]string{"bar": "baz"}, Port: 6502, }} ctx = api.NewDefaultContext() c2, _ := rest.Create(ctx, svc2) created_svc2 := <-c2 created_service_2 := created_svc2.Object.(*api.Service) if created_service_2.Name != "bar" { t.Errorf("Expected bar, but got %v", created_service_2.Name) } if created_service_2.Spec.PortalIP != "1.2.3.2" { // new IP t.Errorf("Unexpected PortalIP: %s", created_service_2.Spec.PortalIP) } svc3 := &api.Service{ ObjectMeta: api.ObjectMeta{Name: "quux"}, Spec: api.ServiceSpec{ Selector: map[string]string{"bar": "baz"}, PortalIP: "1.2.3.93", Port: 6502, }, } ctx = api.NewDefaultContext() c3, _ := rest.Create(ctx, svc3) created_svc3 := <-c3 created_service_3 := created_svc3.Object.(*api.Service) if created_service_3.Spec.PortalIP != "1.2.3.93" { // specific IP t.Errorf("Unexpected PortalIP: %s", created_service_3.Spec.PortalIP) } }
func TestServiceRegistryIPReloadFromStorage(t *testing.T) { registry := registrytest.NewServiceRegistry() machines := []string{"foo", "bar", "baz"} nodeRegistry := registrytest.NewMinionRegistry(machines, api.NodeResources{}) endpoints := ®istrytest.EndpointRegistry{} rest1 := NewStorage(registry, nodeRegistry, endpoints, makeIPNet(t), "kubernetes") rest1.portalMgr.randomAttempts = 0 svc := &api.Service{ ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: api.NamespaceDefault}, Spec: api.ServiceSpec{ Selector: map[string]string{"bar": "baz"}, SessionAffinity: api.AffinityTypeNone, Ports: []api.ServicePort{{ Port: 6502, Protocol: api.ProtocolTCP, }}, }, } ctx := api.NewDefaultContext() rest1.Create(ctx, svc) svc = &api.Service{ ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: api.NamespaceDefault}, Spec: api.ServiceSpec{ Selector: map[string]string{"bar": "baz"}, SessionAffinity: api.AffinityTypeNone, Ports: []api.ServicePort{{ Port: 6502, Protocol: api.ProtocolTCP, }}, }, } rest1.Create(ctx, svc) // This will reload from storage, finding the previous 2 nodeRegistry = registrytest.NewMinionRegistry(machines, api.NodeResources{}) rest2 := NewStorage(registry, nodeRegistry, endpoints, makeIPNet(t), "kubernetes") rest2.portalMgr.randomAttempts = 0 svc = &api.Service{ ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: api.NamespaceDefault}, Spec: api.ServiceSpec{ Selector: map[string]string{"bar": "baz"}, SessionAffinity: api.AffinityTypeNone, Ports: []api.ServicePort{{ Port: 6502, Protocol: api.ProtocolTCP, }}, }, } created_svc, _ := rest2.Create(ctx, svc) created_service := created_svc.(*api.Service) if created_service.Spec.PortalIP != "1.2.3.3" { t.Errorf("Unexpected PortalIP: %s", created_service.Spec.PortalIP) } }
func TestEndpointsRegistryDelete(t *testing.T) { registry := registrytest.NewServiceRegistry() storage := NewREST(registry) _, err := storage.Delete(api.NewContext(), "n/a") if err == nil { t.Error("unexpected non-error") } else if !errors.IsBadRequest(err) { t.Errorf("unexpected error: %v", err) } }
func NewTestREST(t *testing.T, endpoints *api.EndpointsList) (*REST, *registrytest.ServiceRegistry) { registry := registrytest.NewServiceRegistry() machines := []string{"foo", "bar", "baz"} endpointRegistry := ®istrytest.EndpointRegistry{ Endpoints: endpoints, } nodeRegistry := registrytest.NewMinionRegistry(machines, api.NodeResources{}) storage := NewStorage(registry, nodeRegistry, endpointRegistry, makeIPNet(t), "kubernetes") return storage, registry }
func TestServiceRegistryIPUpdate(t *testing.T) { registry := registrytest.NewServiceRegistry() fakeCloud := &cloud.FakeCloud{} machines := []string{"foo", "bar", "baz"} rest := NewREST(registry, fakeCloud, registrytest.NewMinionRegistry(machines, api.NodeResources{}), makeIPNet(t)) rest.portalMgr.randomAttempts = 0 svc := &api.Service{ ObjectMeta: api.ObjectMeta{Name: "foo"}, Spec: api.ServiceSpec{ Selector: map[string]string{"bar": "baz"}, Port: 6502, }, } ctx := api.NewDefaultContext() c, _ := rest.Create(ctx, svc) created_svc := <-c created_service := created_svc.Object.(*api.Service) if created_service.Spec.Port != 6502 { t.Errorf("Expected port 6502, but got %v", created_service.Spec.Port) } if created_service.Spec.PortalIP != "1.2.3.1" { t.Errorf("Unexpected PortalIP: %s", created_service.Spec.PortalIP) } if created_service.Spec.ProxyPort != 0 { t.Errorf("Unexpected ProxyPort: %d", created_service.Spec.ProxyPort) } update := new(api.Service) *update = *created_service update.Spec.Port = 6503 update.Spec.ProxyPort = 309 // should be ignored c, _ = rest.Update(ctx, update) updated_svc := <-c updated_service := updated_svc.Object.(*api.Service) if updated_service.Spec.Port != 6503 { t.Errorf("Expected port 6503, but got %v", updated_service.Spec.Port) } if updated_service.Spec.ProxyPort != 0 { // unchanged, despite trying t.Errorf("Unexpected ProxyPort: %d", updated_service.Spec.ProxyPort) } *update = *created_service update.Spec.Port = 6503 update.Spec.PortalIP = "1.2.3.76" // error c, _ = rest.Update(ctx, update) result := <-c st := result.Object.(*api.Status) if st.Reason != api.StatusReasonInvalid { t.Errorf("Expected to get an invalid error, got %v", st) } }
func NewTestREST(t *testing.T, endpoints *api.EndpointsList) (*REST, *registrytest.ServiceRegistry) { registry := registrytest.NewServiceRegistry() machines := []string{"foo", "bar", "baz"} endpointRegistry := ®istrytest.EndpointRegistry{ Endpoints: endpoints, } nodeRegistry := registrytest.NewMinionRegistry(machines, api.NodeResources{}) r := ipallocator.NewCIDRRange(makeIPNet(t)) portRange := util.PortRange{Base: 30000, Size: 1000} portAllocator := portallocator.NewPortAllocator(portRange) storage := NewStorage(registry, nodeRegistry, endpointRegistry, r, portAllocator, "kubernetes") return storage, registry }
func TestServiceRegistryIPReallocation(t *testing.T) { registry := registrytest.NewServiceRegistry() fakeCloud := &cloud.FakeCloud{} machines := []string{"foo", "bar", "baz"} rest := NewREST(registry, fakeCloud, registrytest.NewMinionRegistry(machines, api.NodeResources{}), makeIPNet(t), "kubernetes") rest.portalMgr.randomAttempts = 0 svc1 := &api.Service{ ObjectMeta: api.ObjectMeta{Name: "foo"}, Spec: api.ServiceSpec{ Selector: map[string]string{"bar": "baz"}, Port: 6502, Protocol: api.ProtocolTCP, SessionAffinity: api.AffinityTypeNone, }, } ctx := api.NewDefaultContext() created_svc1, _ := rest.Create(ctx, svc1) created_service_1 := created_svc1.(*api.Service) if created_service_1.Name != "foo" { t.Errorf("Expected foo, but got %v", created_service_1.Name) } if created_service_1.Spec.PortalIP != "1.2.3.1" { t.Errorf("Unexpected PortalIP: %s", created_service_1.Spec.PortalIP) } rest.Delete(ctx, created_service_1.Name) svc2 := &api.Service{ ObjectMeta: api.ObjectMeta{Name: "bar"}, Spec: api.ServiceSpec{ Selector: map[string]string{"bar": "baz"}, Port: 6502, Protocol: api.ProtocolTCP, SessionAffinity: api.AffinityTypeNone, }, } ctx = api.NewDefaultContext() created_svc2, _ := rest.Create(ctx, svc2) created_service_2 := created_svc2.(*api.Service) if created_service_2.Name != "bar" { t.Errorf("Expected bar, but got %v", created_service_2.Name) } if created_service_2.Spec.PortalIP != "1.2.3.1" { // same IP as before t.Errorf("Unexpected PortalIP: %s", created_service_2.Spec.PortalIP) } }
func TestServiceRegistryGet(t *testing.T) { registry := registrytest.NewServiceRegistry() fakeCloud := &cloud.FakeCloud{} machines := []string{"foo", "bar", "baz"} storage := NewREST(registry, fakeCloud, minion.NewRegistry(machines)) registry.CreateService(&api.Service{ JSONBase: api.JSONBase{ID: "foo"}, Selector: map[string]string{"bar": "baz"}, }) storage.Get("foo") if len(fakeCloud.Calls) != 0 { t.Errorf("Unexpected call(s): %#v", fakeCloud.Calls) } if e, a := "foo", registry.GottenID; e != a { t.Errorf("Expected %v, but got %v", e, a) } }
func TestServiceRegistryIPReloadFromStorage(t *testing.T) { registry := registrytest.NewServiceRegistry() fakeCloud := &cloud.FakeCloud{} machines := []string{"foo", "bar", "baz"} rest1 := NewREST(registry, fakeCloud, registrytest.NewMinionRegistry(machines, api.NodeResources{}), makeIPNet(t)) rest1.portalMgr.randomAttempts = 0 svc := &api.Service{ ObjectMeta: api.ObjectMeta{Name: "foo"}, Spec: api.ServiceSpec{ Selector: map[string]string{"bar": "baz"}, Port: 6502, }, } ctx := api.NewDefaultContext() c, _ := rest1.Create(ctx, svc) <-c svc = &api.Service{ ObjectMeta: api.ObjectMeta{Name: "foo"}, Spec: api.ServiceSpec{ Selector: map[string]string{"bar": "baz"}, Port: 6502, }, } c, _ = rest1.Create(ctx, svc) <-c // This will reload from storage, finding the previous 2 rest2 := NewREST(registry, fakeCloud, registrytest.NewMinionRegistry(machines, api.NodeResources{}), makeIPNet(t)) rest2.portalMgr.randomAttempts = 0 svc = &api.Service{ ObjectMeta: api.ObjectMeta{Name: "foo"}, Spec: api.ServiceSpec{ Selector: map[string]string{"bar": "baz"}, Port: 6502, }, } c, _ = rest2.Create(ctx, svc) created_svc := <-c created_service := created_svc.Object.(*api.Service) if created_service.Spec.PortalIP != "1.2.3.3" { t.Errorf("Unexpected PortalIP: %s", created_service.Spec.PortalIP) } }
func TestServiceRegistryIPReallocation(t *testing.T) { registry := registrytest.NewServiceRegistry() fakeCloud := &cloud.FakeCloud{} machines := []string{"foo", "bar", "baz"} rest := NewREST(registry, fakeCloud, registrytest.NewMinionRegistry(machines, api.NodeResources{}), makeIPNet(t)) svc1 := &api.Service{ ObjectMeta: api.ObjectMeta{Name: "foo"}, Spec: api.ServiceSpec{ Selector: map[string]string{"bar": "baz"}, Port: 6502, }, } ctx := api.NewDefaultContext() c1, _ := rest.Create(ctx, svc1) created_svc1 := <-c1 created_service_1 := created_svc1.Object.(*api.Service) if created_service_1.Name != "foo" { t.Errorf("Expected foo, but got %v", created_service_1.Name) } if created_service_1.Spec.PortalIP != "1.2.3.1" { t.Errorf("Unexpected PortalIP: %s", created_service_1.Spec.PortalIP) } c, _ := rest.Delete(ctx, created_service_1.Name) <-c svc2 := &api.Service{ ObjectMeta: api.ObjectMeta{Name: "bar"}, Spec: api.ServiceSpec{ Selector: map[string]string{"bar": "baz"}, Port: 6502, }, } ctx = api.NewDefaultContext() c2, _ := rest.Create(ctx, svc2) created_svc2 := <-c2 created_service_2 := created_svc2.Object.(*api.Service) if created_service_2.Name != "bar" { t.Errorf("Expected bar, but got %v", created_service_2.Name) } if created_service_2.Spec.PortalIP != "1.2.3.1" { // same IP as before t.Errorf("Unexpected PortalIP: %s", created_service_2.Spec.PortalIP) } }
func TestServiceRegistryIPUpdate(t *testing.T) { registry := registrytest.NewServiceRegistry() fakeCloud := &cloud.FakeCloud{} machines := []string{"foo", "bar", "baz"} rest := NewREST(registry, fakeCloud, registrytest.NewMinionRegistry(machines, api.NodeResources{}), makeIPNet(t), "kubernetes") rest.portalMgr.randomAttempts = 0 svc := &api.Service{ ObjectMeta: api.ObjectMeta{Name: "foo"}, Spec: api.ServiceSpec{ Selector: map[string]string{"bar": "baz"}, Port: 6502, Protocol: api.ProtocolTCP, SessionAffinity: api.AffinityTypeNone, }, } ctx := api.NewDefaultContext() created_svc, _ := rest.Create(ctx, svc) created_service := created_svc.(*api.Service) if created_service.Spec.Port != 6502 { t.Errorf("Expected port 6502, but got %v", created_service.Spec.Port) } if created_service.Spec.PortalIP != "1.2.3.1" { t.Errorf("Unexpected PortalIP: %s", created_service.Spec.PortalIP) } update := new(api.Service) *update = *created_service update.Spec.Port = 6503 updated_svc, _, _ := rest.Update(ctx, update) updated_service := updated_svc.(*api.Service) if updated_service.Spec.Port != 6503 { t.Errorf("Expected port 6503, but got %v", updated_service.Spec.Port) } *update = *created_service update.Spec.Port = 6503 update.Spec.PortalIP = "1.2.3.76" // error _, _, err := rest.Update(ctx, update) if err == nil || !errors.IsInvalid(err) { t.Error("Unexpected error type: %v", err) } }
func TestServiceRegistryCreate(t *testing.T) { registry := registrytest.NewServiceRegistry() fakeCloud := &cloud.FakeCloud{} machines := []string{"foo", "bar", "baz"} storage := NewREST(registry, fakeCloud, registrytest.NewMinionRegistry(machines, api.NodeResources{}), makeIPNet(t)) storage.portalMgr.randomAttempts = 0 svc := &api.Service{ ObjectMeta: api.ObjectMeta{Name: "foo"}, Spec: api.ServiceSpec{ Port: 6502, Selector: map[string]string{"bar": "baz"}, }, } ctx := api.NewDefaultContext() c, _ := storage.Create(ctx, svc) created_svc := <-c created_service := created_svc.Object.(*api.Service) if !api.HasObjectMetaSystemFieldValues(&created_service.ObjectMeta) { t.Errorf("storage did not populate object meta field values") } if created_service.Name != "foo" { t.Errorf("Expected foo, but got %v", created_service.Name) } if created_service.CreationTimestamp.IsZero() { t.Errorf("Expected timestamp to be set, got: %v", created_service.CreationTimestamp) } if created_service.Spec.PortalIP != "1.2.3.1" { t.Errorf("Unexpected PortalIP: %s", created_service.Spec.PortalIP) } if created_service.Spec.ProxyPort != 0 { t.Errorf("Unexpected ProxyPort: %d", created_service.Spec.ProxyPort) } if len(fakeCloud.Calls) != 0 { t.Errorf("Unexpected call(s): %#v", fakeCloud.Calls) } srv, err := registry.GetService(ctx, svc.Name) if err != nil { t.Errorf("unexpected error: %v", err) } if srv == nil { t.Errorf("Failed to find service: %s", svc.Name) } }
func TestServiceRegistryDelete(t *testing.T) { registry := registrytest.NewServiceRegistry() fakeCloud := &cloud.FakeCloud{} machines := []string{"foo", "bar", "baz"} storage := NewRegistryStorage(registry, fakeCloud, minion.NewRegistry(machines)) svc := api.Service{ JSONBase: api.JSONBase{ID: "foo"}, Selector: map[string]string{"bar": "baz"}, } registry.CreateService(svc) c, _ := storage.Delete(svc.ID) <-c if len(fakeCloud.Calls) != 0 { t.Errorf("Unexpected call(s): %#v", fakeCloud.Calls) } if e, a := "foo", registry.DeletedID; e != a { t.Errorf("Expected %v, but got %v", e, a) } }