func TestDeploymentNotFoundError(t *testing.T) { name := "foo" ns := "default" deployment := &extensions.Deployment{ ObjectMeta: api.ObjectMeta{ Name: name, Namespace: ns, }, Spec: extensions.DeploymentSpec{ Replicas: 0, Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"k1": "v1"}}, }, Status: extensions.DeploymentStatus{ Replicas: 0, }, } template := deploymentutil.GetNewReplicaSetTemplateInternal(deployment) fake := fake.NewSimpleClientset( deployment, &extensions.ReplicaSetList{Items: []extensions.ReplicaSet{ { ObjectMeta: api.ObjectMeta{ Name: name, Namespace: ns, }, Spec: extensions.ReplicaSetSpec{ Template: template, }, }, }, }, ) fake.AddReactor("get", "replicasets", func(action testcore.Action) (handled bool, ret runtime.Object, err error) { return true, nil, ScaleError{ActualError: errors.NewNotFound(api.Resource("replicaset"), "doesn't-matter")} }) reaper := DeploymentReaper{fake.Extensions(), fake.Extensions(), time.Millisecond, time.Millisecond} if err := reaper.Stop(ns, name, 0, nil); err != nil { t.Fatalf("unexpected error: %#v", err) } }
func TestInstall_canary(t *testing.T) { fake := fake.NewSimpleClientset() fake.AddReactor("create", "deployments", func(action testcore.Action) (bool, runtime.Object, error) { obj := action.(testcore.CreateAction).GetObject().(*extensions.Deployment) i := obj.Spec.Template.Spec.Containers[0].Image if i != "gcr.io/kubernetes-helm/tiller:canary" { t.Errorf("expected canary image, got '%s'", i) } return true, obj, nil }) err := Install(fake.Extensions(), api.NamespaceDefault, "", true, false) if err != nil { t.Errorf("unexpected error: %#+v", err) } }
func TestDeploymentScale(t *testing.T) { fake := fake.NewSimpleClientset(deployment()) scaler := DeploymentScaler{fake.Extensions()} preconditions := ScalePrecondition{-1, ""} count := uint(3) name := "foo" scaler.Scale("default", name, count, &preconditions, nil, nil) actions := fake.Actions() if len(actions) != 2 { t.Errorf("unexpected actions: %v, expected 2 actions (get, update)", actions) } if action, ok := actions[0].(testcore.GetAction); !ok || action.GetResource().GroupResource() != extensions.Resource("deployments") || action.GetName() != name { t.Errorf("unexpected action: %v, expected get-replicationController %s", actions[0], name) } if action, ok := actions[1].(testcore.UpdateAction); !ok || action.GetResource().GroupResource() != extensions.Resource("deployments") || action.GetObject().(*extensions.Deployment).Spec.Replicas != int32(count) { t.Errorf("unexpected action %v, expected update-deployment with replicas = %d", actions[1], count) } }
func TestInstall(t *testing.T) { image := "gcr.io/kubernetes-helm/tiller:v2.0.0" fake := fake.NewSimpleClientset() fake.AddReactor("create", "deployments", func(action testcore.Action) (bool, runtime.Object, error) { obj := action.(testcore.CreateAction).GetObject().(*extensions.Deployment) l := obj.GetLabels() if reflect.DeepEqual(l, map[string]string{"app": "helm"}) { t.Errorf("expected labels = '', got '%s'", l) } i := obj.Spec.Template.Spec.Containers[0].Image if i != image { t.Errorf("expected image = '%s', got '%s'", image, i) } return true, obj, nil }) err := Install(fake.Extensions(), api.NamespaceDefault, image, false, false) if err != nil { t.Errorf("unexpected error: %#+v", err) } }
func TestDeploymentScaleFailsPreconditions(t *testing.T) { fake := fake.NewSimpleClientset(&extensions.Deployment{ ObjectMeta: metav1.ObjectMeta{ Namespace: api.NamespaceDefault, Name: "foo", }, Spec: extensions.DeploymentSpec{ Replicas: 10, }, }) scaler := DeploymentScaler{fake.Extensions()} preconditions := ScalePrecondition{2, ""} count := uint(3) name := "foo" scaler.Scale("default", name, count, &preconditions, nil, nil) actions := fake.Actions() if len(actions) != 1 { t.Errorf("unexpected actions: %v, expected 1 actions (get)", actions) } if action, ok := actions[0].(testcore.GetAction); !ok || action.GetResource().GroupResource() != extensions.Resource("deployments") || action.GetName() != name { t.Errorf("unexpected action: %v, expected get-deployment %s", actions[0], name) } }
func TestDeploymentStop(t *testing.T) { name := "foo" ns := "default" deployment := extensions.Deployment{ ObjectMeta: api.ObjectMeta{ Name: name, Namespace: ns, }, Spec: extensions.DeploymentSpec{ Replicas: 0, Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"k1": "v1"}}, }, Status: extensions.DeploymentStatus{ Replicas: 0, }, } template := deploymentutil.GetNewReplicaSetTemplateInternal(&deployment) tests := []struct { Name string Objs []runtime.Object StopError error ExpectedActions []string }{ { Name: "SimpleDeployment", Objs: []runtime.Object{ &extensions.Deployment{ // GET ObjectMeta: api.ObjectMeta{ Name: name, Namespace: ns, }, Spec: extensions.DeploymentSpec{ Replicas: 0, Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"k1": "v1"}}, }, Status: extensions.DeploymentStatus{ Replicas: 0, }, }, }, StopError: nil, ExpectedActions: []string{"get:deployments", "update:deployments", "get:deployments", "list:replicasets", "delete:deployments"}, }, { Name: "Deployment with single replicaset", Objs: []runtime.Object{ &deployment, // GET &extensions.ReplicaSetList{ // LIST Items: []extensions.ReplicaSet{ { ObjectMeta: api.ObjectMeta{ Name: name, Namespace: ns, Labels: map[string]string{"k1": "v1"}, }, Spec: extensions.ReplicaSetSpec{ Template: template, }, }, }, }, }, StopError: nil, ExpectedActions: []string{"get:deployments", "update:deployments", "get:deployments", "list:replicasets", "get:replicasets", "get:replicasets", "update:replicasets", "get:replicasets", "get:replicasets", "delete:replicasets", "delete:deployments"}, }, } for _, test := range tests { fake := fake.NewSimpleClientset(test.Objs...) reaper := DeploymentReaper{fake.Extensions(), fake.Extensions(), time.Millisecond, time.Millisecond} err := reaper.Stop(ns, name, 0, nil) if !reflect.DeepEqual(err, test.StopError) { t.Errorf("%s unexpected error: %v", test.Name, err) continue } actions := fake.Actions() if len(actions) != len(test.ExpectedActions) { t.Errorf("%s unexpected actions: %v, expected %d actions got %d", test.Name, actions, len(test.ExpectedActions), len(actions)) continue } for i, expAction := range test.ExpectedActions { action := strings.Split(expAction, ":") if actions[i].GetVerb() != action[0] { t.Errorf("%s unexpected verb: %+v, expected %s", test.Name, actions[i], expAction) } if actions[i].GetResource().Resource != action[1] { t.Errorf("%s unexpected resource: %+v, expected %s", test.Name, actions[i], expAction) } if len(action) == 3 && actions[i].GetSubresource() != action[2] { t.Errorf("%s unexpected subresource: %+v, expected %s", test.Name, actions[i], expAction) } } } }
func TestReplicaSetStop(t *testing.T) { name := "foo" ns := "default" tests := []struct { Name string Objs []runtime.Object StopError error ExpectedActions []string }{ { Name: "OnlyOneRS", Objs: []runtime.Object{ &extensions.ReplicaSetList{ // LIST Items: []extensions.ReplicaSet{ { ObjectMeta: api.ObjectMeta{ Name: name, Namespace: ns, }, Spec: extensions.ReplicaSetSpec{ Replicas: 0, Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"k1": "v1"}}, }, }, }, }, }, StopError: nil, ExpectedActions: []string{"get", "get", "update", "get", "get", "delete"}, }, { Name: "NoOverlapping", Objs: []runtime.Object{ &extensions.ReplicaSetList{ // LIST Items: []extensions.ReplicaSet{ { ObjectMeta: api.ObjectMeta{ Name: "baz", Namespace: ns, }, Spec: extensions.ReplicaSetSpec{ Replicas: 0, Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"k3": "v3"}}, }, }, { ObjectMeta: api.ObjectMeta{ Name: name, Namespace: ns, }, Spec: extensions.ReplicaSetSpec{ Replicas: 0, Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"k1": "v1"}}, }, }, }, }, }, StopError: nil, ExpectedActions: []string{"get", "get", "update", "get", "get", "delete"}, }, // TODO: Implement tests for overlapping replica sets, similar to replication controllers, // when the overlapping checks are implemented for replica sets. } for _, test := range tests { fake := fake.NewSimpleClientset(test.Objs...) reaper := ReplicaSetReaper{fake.Extensions(), time.Millisecond, time.Millisecond} err := reaper.Stop(ns, name, 0, nil) if !reflect.DeepEqual(err, test.StopError) { t.Errorf("%s unexpected error: %v", test.Name, err) continue } actions := fake.Actions() if len(actions) != len(test.ExpectedActions) { t.Errorf("%s unexpected actions: %v, expected %d actions got %d", test.Name, actions, len(test.ExpectedActions), len(actions)) continue } for i, verb := range test.ExpectedActions { if actions[i].GetResource().GroupResource() != extensions.Resource("replicasets") { t.Errorf("%s unexpected action: %+v, expected %s-replicaSet", test.Name, actions[i], verb) } if actions[i].GetVerb() != verb { t.Errorf("%s unexpected action: %+v, expected %s-replicaSet", test.Name, actions[i], verb) } } } }