// TestHasObjectMetaSystemFieldValues validates that true is returned if and only if all fields are populated func TestHasObjectMetaSystemFieldValues(t *testing.T) { ctx := api.NewDefaultContext() resource := api.ObjectMeta{} if api.HasObjectMetaSystemFieldValues(&resource) { t.Errorf("the resource does not have all fields yet populated, but incorrectly reports it does") } api.FillObjectMetaSystemFields(ctx, &resource) if !api.HasObjectMetaSystemFieldValues(&resource) { t.Errorf("the resource does have all fields populated, but incorrectly reports it does not") } }
func TestCreatePod(t *testing.T) { podRegistry := registrytest.NewPodRegistry(nil) podRegistry.Pod = &api.Pod{ ObjectMeta: api.ObjectMeta{Name: "foo"}, Status: api.PodStatus{ Host: "machine", }, } storage := REST{ registry: podRegistry, podCache: &fakeCache{statusToReturn: &api.PodStatus{}}, } pod := &api.Pod{} pod.Name = "foo" ctx := api.NewDefaultContext() channel, err := storage.Create(ctx, pod) if err != nil { t.Errorf("unexpected error: %v", err) } select { case <-channel: // Do nothing, this is expected. case <-time.After(time.Millisecond * 100): t.Error("Unexpected timeout on async channel") } if !api.HasObjectMetaSystemFieldValues(&podRegistry.Pod.ObjectMeta) { t.Errorf("Expected ObjectMeta field values were populated") } }
func (t *Tester) TestCreateHasMetadata(valid runtime.Object) { objectMeta, err := api.ObjectMetaFor(valid) if err != nil { t.Fatalf("object does not have ObjectMeta: %v\n%#v", err, valid) } objectMeta.Name = "test" objectMeta.Namespace = api.NamespaceDefault context := api.NewDefaultContext() if t.clusterScope { objectMeta.Namespace = api.NamespaceNone context = api.NewContext() } obj, err := t.storage.(rest.Creater).Create(context, valid) if err != nil { t.Fatalf("Unexpected error: %v", err) } if obj == nil { t.Fatalf("Unexpected object from result: %#v", obj) } if !api.HasObjectMetaSystemFieldValues(objectMeta) { t.Errorf("storage did not populate object meta field values") } }
func TestMinionRegistryREST(t *testing.T) { ms := NewREST(registrytest.NewMinionRegistry([]string{"foo", "bar"}, api.NodeResources{})) ctx := api.NewContext() if obj, err := ms.Get(ctx, "foo"); err != nil || obj.(*api.Node).Name != "foo" { t.Errorf("missing expected object") } if obj, err := ms.Get(ctx, "bar"); err != nil || obj.(*api.Node).Name != "bar" { t.Errorf("missing expected object") } if _, err := ms.Get(ctx, "baz"); !errors.IsNotFound(err) { t.Errorf("has unexpected error: %v", err) } obj, err := ms.Create(ctx, &api.Node{ObjectMeta: api.ObjectMeta{Name: "baz"}}) if err != nil { t.Fatalf("insert failed: %v", err) } if !api.HasObjectMetaSystemFieldValues(&obj.(*api.Node).ObjectMeta) { t.Errorf("storage did not populate object meta field values") } if m, ok := obj.(*api.Node); !ok || m.Name != "baz" { t.Errorf("insert return value was weird: %#v", obj) } if obj, err := ms.Get(ctx, "baz"); err != nil || obj.(*api.Node).Name != "baz" { t.Errorf("insert didn't actually insert") } obj, err = ms.Delete(ctx, "bar") if err != nil { t.Fatalf("delete failed") } if s, ok := obj.(*api.Status); !ok || s.Status != api.StatusSuccess { t.Errorf("delete return value was weird: %#v", obj) } if _, err := ms.Get(ctx, "bar"); !errors.IsNotFound(err) { t.Errorf("delete didn't actually delete: %v", err) } _, err = ms.Delete(ctx, "bar") if err != ErrDoesNotExist { t.Fatalf("delete returned wrong error") } list, err := ms.List(ctx, labels.Everything(), fields.Everything()) if err != nil { t.Errorf("got error calling List") } expect := []api.Node{ { ObjectMeta: api.ObjectMeta{Name: "foo"}, }, { ObjectMeta: api.ObjectMeta{Name: "baz"}, }, } nodeList := list.(*api.NodeList) if len(expect) != len(nodeList.Items) || !contains(nodeList, "foo") || !contains(nodeList, "baz") { t.Errorf("Unexpected list value: %#v", list) } }
func hasCreated(t *testing.T, pod *api.Pod) func(runtime.Object) bool { return func(obj runtime.Object) bool { actualPod := obj.(*api.Pod) if !api.Semantic.DeepDerivative(pod.Status, actualPod.Status) { t.Errorf("not a deep derivative %#v", actualPod) return false } return api.HasObjectMetaSystemFieldValues(&actualPod.ObjectMeta) } }
func TestCreateController(t *testing.T) { mockRegistry := registrytest.ControllerRegistry{} mockPodRegistry := registrytest.PodRegistry{ Pods: &api.PodList{ Items: []api.Pod{ { ObjectMeta: api.ObjectMeta{ Name: "foo", Labels: map[string]string{"a": "b"}, }, }, }, }, } storage := REST{ registry: &mockRegistry, podLister: &mockPodRegistry, pollPeriod: time.Millisecond * 1, } controller := &api.ReplicationController{ ObjectMeta: api.ObjectMeta{Name: "test"}, Spec: api.ReplicationControllerSpec{ Replicas: 2, Selector: map[string]string{"a": "b"}, Template: &validPodTemplate.Spec, }, } ctx := api.NewDefaultContext() channel, err := storage.Create(ctx, controller) if err != nil { t.Fatalf("Unexpected error: %v", err) } if err != nil { t.Errorf("unexpected error: %v", err) } if !api.HasObjectMetaSystemFieldValues(&controller.ObjectMeta) { t.Errorf("storage did not populate object meta field values") } select { case <-channel: // expected case case <-time.After(time.Millisecond * 100): t.Error("Unexpected timeout from async channel") } }
func TestRESTCreate(t *testing.T) { table := []struct { ctx api.Context secret *api.Secret valid bool }{ { ctx: api.NewDefaultContext(), secret: testSecret("foo"), valid: true, }, { ctx: api.NewContext(), secret: testSecret("bar"), valid: false, }, { ctx: api.WithNamespace(api.NewContext(), "nondefault"), secret: testSecret("bazzzz"), valid: false, }, } for _, item := range table { _, storage := NewTestREST() c, err := storage.Create(item.ctx, item.secret) if !item.valid { if err == nil { ctxNS := api.NamespaceValue(item.ctx) t.Errorf("%v: Unexpected non-error: (%v, %v)", item.secret.Name, ctxNS, item.secret.Namespace) } continue } if err != nil { t.Errorf("%v: Unexpected error: %v", item.secret.Name, err) continue } if !api.HasObjectMetaSystemFieldValues(&item.secret.ObjectMeta) { t.Errorf("storage did not populate object meta field values") } if e, a := item.secret, c; !reflect.DeepEqual(e, a) { t.Errorf("diff: %s", util.ObjectDiff(e, a)) } // Ensure we implement the interface _ = rest.Watcher(storage) } }
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 TestServiceRegistryCreate(t *testing.T) { storage, registry := NewTestREST(t, nil) svc := &api.Service{ ObjectMeta: api.ObjectMeta{Name: "foo"}, Spec: api.ServiceSpec{ Selector: map[string]string{"bar": "baz"}, SessionAffinity: api.ServiceAffinityNone, Type: api.ServiceTypeClusterIP, Ports: []api.ServicePort{{ Port: 6502, Protocol: api.ProtocolTCP, TargetPort: util.NewIntOrStringFromInt(6502), }}, }, } ctx := api.NewDefaultContext() created_svc, err := storage.Create(ctx, svc) if err != nil { t.Fatalf("Unexpected error: %v", err) } created_service := created_svc.(*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 !makeIPNet(t).Contains(net.ParseIP(created_service.Spec.ClusterIP)) { t.Errorf("Unexpected ClusterIP: %s", created_service.Spec.ClusterIP) } 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) } }
// TODO: remove, this is covered by RESTTest.TestCreate func TestCreatePod(t *testing.T) { _, helper := newHelper(t) storage := NewStorage(helper, nil).Pod pod := validNewPod() obj, err := storage.Create(api.NewDefaultContext(), pod) if err != nil { t.Fatalf("unexpected error: %v", err) } if obj == nil { t.Fatalf("unexpected object: %#v", obj) } actual := &api.Pod{} if err := helper.ExtractObj("/registry/pods/default/foo", actual, false); err != nil { t.Fatalf("unexpected extraction error: %v", err) } if !api.HasObjectMetaSystemFieldValues(&actual.ObjectMeta) { t.Errorf("Expected ObjectMeta field values were populated: %#v", actual) } }
func TestServiceRegistryCreate(t *testing.T) { storage, registry := NewTestREST(t, nil) storage.portalMgr.randomAttempts = 0 svc := &api.Service{ ObjectMeta: api.ObjectMeta{Name: "foo"}, Spec: api.ServiceSpec{ Selector: map[string]string{"bar": "baz"}, SessionAffinity: api.AffinityTypeNone, Ports: []api.ServicePort{{ Port: 6502, Protocol: api.ProtocolTCP, }}, }, } ctx := api.NewDefaultContext() created_svc, err := storage.Create(ctx, svc) if err != nil { t.Fatalf("Unexpected error: %v", err) } created_service := created_svc.(*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) } 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 (t *Tester) TestCreateHasMetadata(valid runtime.Object) { objectMeta, err := api.ObjectMetaFor(valid) if err != nil { t.Fatalf("object does not have ObjectMeta: %v\n%#v", err, valid) } objectMeta.Name = "" objectMeta.GenerateName = "test-" objectMeta.Namespace = t.TestNamespace() obj, err := t.storage.(rest.Creater).Create(t.TestContext(), valid) if err != nil { t.Fatalf("Unexpected error: %v", err) } if obj == nil { t.Fatalf("Unexpected object from result: %#v", obj) } if !api.HasObjectMetaSystemFieldValues(objectMeta) { t.Errorf("storage did not populate object meta field values") } }
// TODO: remove, this is sufficiently covered by other tests func TestCreateController(t *testing.T) { mockRegistry := registrytest.ControllerRegistry{} mockPodRegistry := registrytest.PodRegistry{ Pods: &api.PodList{ Items: []api.Pod{ { ObjectMeta: api.ObjectMeta{ Name: "foo", Labels: map[string]string{"a": "b"}, }, }, }, }, } storage := REST{ registry: &mockRegistry, podLister: &mockPodRegistry, strategy: Strategy, } controller := &api.ReplicationController{ ObjectMeta: api.ObjectMeta{Name: "test"}, Spec: api.ReplicationControllerSpec{ Replicas: 2, Selector: map[string]string{"a": "b"}, Template: &validPodTemplate.Spec, }, } ctx := api.NewDefaultContext() obj, err := storage.Create(ctx, controller) if err != nil { t.Fatalf("Unexpected error: %v", err) } if obj == nil { t.Errorf("unexpected object") } if !api.HasObjectMetaSystemFieldValues(&controller.ObjectMeta) { t.Errorf("storage did not populate object meta field values") } }
// TODO: remove, this is covered by RESTTest.TestCreate func TestCreatePod(t *testing.T) { _, etcdStorage := newEtcdStorage(t) storage := NewStorage(etcdStorage, nil).Pod ctx := api.NewDefaultContext() key, _ := storage.Etcd.KeyFunc(ctx, "foo") pod := validNewPod() obj, err := storage.Create(api.NewDefaultContext(), pod) if err != nil { t.Fatalf("unexpected error: %v", err) } if obj == nil { t.Fatalf("unexpected object: %#v", obj) } actual := &api.Pod{} if err := etcdStorage.Get(key, actual, false); err != nil { t.Fatalf("unexpected extraction error: %v", err) } if !api.HasObjectMetaSystemFieldValues(&actual.ObjectMeta) { t.Errorf("Expected ObjectMeta field values were populated: %#v", actual) } }
// TODO: remove, this is covered by RESTTest.TestCreate func TestCreatePod(t *testing.T) { _, helper := newHelper(t) storage, _, _ := NewREST(helper) cache := &fakeCache{statusToReturn: &api.PodStatus{}} storage = storage.WithPodStatus(cache) pod := validNewPod() obj, err := storage.Create(api.NewDefaultContext(), pod) if err != nil { t.Fatalf("unexpected error: %v", err) } if obj == nil { t.Fatalf("unexpected object: %#v", obj) } actual := &api.Pod{} if err := helper.ExtractObj("/registry/pods/default/foo", actual, false); err != nil { t.Fatalf("unexpected extraction error: %v", err) } if !api.HasObjectMetaSystemFieldValues(&actual.ObjectMeta) { t.Errorf("Expected ObjectMeta field values were populated: %#v", actual) } }