func (c *FakeEgressNetworkPolicy) Update(inObj *sdnapi.EgressNetworkPolicy) (*sdnapi.EgressNetworkPolicy, error) { obj, err := c.Fake.Invokes(ktestclient.NewUpdateAction("egressnetworkpolicies", c.Namespace, inObj), inObj) if obj == nil { return nil, err } return obj.(*sdnapi.EgressNetworkPolicy), err }
func (c *FakeBackingServiceInstances) Update(inObj *backingserviceinstanceapi.BackingServiceInstance) (*backingserviceinstanceapi.BackingServiceInstance, error) { obj, err := c.Fake.Invokes(ktestclient.NewUpdateAction("backingserviceinstances", c.Namespace, inObj), inObj) if obj == nil { return nil, err } return obj.(*backingserviceinstanceapi.BackingServiceInstance), err }
func (c *FakeRoleBindings) Update(inObj *authorizationapi.RoleBinding) (*authorizationapi.RoleBinding, error) { obj, err := c.Fake.Invokes(ktestclient.NewUpdateAction("rolebindings", c.Namespace, inObj), inObj) if obj == nil { return nil, err } return obj.(*authorizationapi.RoleBinding), err }
func (c *FakeDeploymentConfigs) Update(inObj *deployapi.DeploymentConfig) (*deployapi.DeploymentConfig, error) { obj, err := c.Fake.Invokes(ktestclient.NewUpdateAction("deploymentconfigs", c.Namespace, inObj), inObj) if obj == nil { return nil, err } return obj.(*deployapi.DeploymentConfig), err }
func (c *FakeBuildConfigs) Update(inObj *buildapi.BuildConfig) (*buildapi.BuildConfig, error) { obj, err := c.Fake.Invokes(ktestclient.NewUpdateAction("buildconfigs", c.Namespace, inObj), inObj) if obj == nil { return nil, err } return obj.(*buildapi.BuildConfig), err }
func (c *FakeRoutes) Update(inObj *routeapi.Route) (*routeapi.Route, error) { obj, err := c.Fake.Invokes(ktestclient.NewUpdateAction("routes", c.Namespace, inObj), inObj) if obj == nil { return nil, err } return obj.(*routeapi.Route), err }
func (c *FakeBuilds) UpdateDetails(inObj *buildapi.Build) (*buildapi.Build, error) { obj, err := c.Fake.Invokes(ktestclient.NewUpdateAction("builds/details", c.Namespace, inObj), inObj) if obj == nil { return nil, err } return obj.(*buildapi.Build), err }
func (c *FakeDeploymentConfigs) UpdateScale(inObj *extensions.Scale) (*extensions.Scale, error) { obj, err := c.Fake.Invokes(ktestclient.NewUpdateAction("deploymentconfigs/scale", c.Namespace, inObj), inObj) if obj == nil { return nil, err } return obj.(*extensions.Scale), err }
func (c *FakeImageStreamTags) Update(inObj *imageapi.ImageStreamTag) (*imageapi.ImageStreamTag, error) { obj, err := c.Fake.Invokes(ktestclient.NewUpdateAction("imagestreamtags", c.Namespace, inObj), inObj) if obj == nil { return nil, err } return obj.(*imageapi.ImageStreamTag), err }
func (c *FakeDeploymentConfigs) Instantiate(inObj *deployapi.DeploymentRequest) (*deployapi.DeploymentConfig, error) { deployment := &deployapi.DeploymentConfig{ObjectMeta: kapi.ObjectMeta{Name: inObj.Name}} obj, err := c.Fake.Invokes(ktestclient.NewUpdateAction("deploymentconfigs/instantiate", c.Namespace, deployment), deployment) if obj == nil { return nil, err } return obj.(*deployapi.DeploymentConfig), err }
func (c *FakeRoutes) UpdateStatus(inObj *routeapi.Route) (*routeapi.Route, error) { action := ktestclient.NewUpdateAction("routes", c.Namespace, inObj) action.Subresource = "status" obj, err := c.Fake.Invokes(action, inObj) if obj == nil { return nil, err } return obj.(*routeapi.Route), err }
func (f *fixture) expectUpdateRCAction(rc *api.ReplicationController) { f.actions = append(f.actions, testclient.NewUpdateAction("replicationcontrollers", rc.Namespace, rc)) f.objects.Items = append(f.objects.Items, rc) }
func (f *fixture) expectUpdateDeploymentAction(d *exp.Deployment) { f.actions = append(f.actions, testclient.NewUpdateAction("deployments", d.Namespace, d)) f.objects.Items = append(f.objects.Items, d) }
func TestScale(t *testing.T) { tests := []struct { testName string namespace string name string count uint preconditions *kubectl.ScalePrecondition retry, waitForReplicas *kubectl.RetryParams oc *testclient.Fake kc *ktestclient.Fake expected []ktestclient.Action kexpected []ktestclient.Action expectedErr error }{ { testName: "simple scale", namespace: "default", name: "foo", count: uint(3), oc: testclient.NewSimpleFake(deploytest.OkDeploymentConfig(1)), kc: ktestclient.NewSimpleFake(mkDeploymentList(1)), expected: []ktestclient.Action{ ktestclient.NewGetAction("deploymentconfigs", "default", "foo"), }, kexpected: []ktestclient.Action{ ktestclient.NewGetAction("replicationcontrollers", "default", "config-1"), ktestclient.NewUpdateAction("replicationcontrollers", "default", nil), }, expectedErr: nil, }, { testName: "wait for replicas", namespace: "default", name: "foo", count: uint(3), waitForReplicas: &kubectl.RetryParams{Interval: time.Millisecond, Timeout: time.Millisecond}, oc: testclient.NewSimpleFake(deploytest.OkDeploymentConfig(1)), kc: ktestclient.NewSimpleFake(mkDeploymentList(1)), expected: []ktestclient.Action{ ktestclient.NewGetAction("deploymentconfigs", "default", "foo"), }, kexpected: []ktestclient.Action{ ktestclient.NewGetAction("replicationcontrollers", "default", "config-1"), ktestclient.NewUpdateAction("replicationcontrollers", "default", nil), ktestclient.NewGetAction("replicationcontrollers", "default", "config-1"), ktestclient.NewGetAction("replicationcontrollers", "", "config-1"), }, expectedErr: nil, }, { testName: "no deployment - dc scale", namespace: "default", name: "foo", count: uint(3), oc: testclient.NewSimpleFake(deploytest.OkDeploymentConfig(1)), kc: ktestclient.NewSimpleFake(), expected: []ktestclient.Action{ ktestclient.NewGetAction("deploymentconfigs", "default", "foo"), ktestclient.NewGetAction("deploymentconfigs", "default", "foo"), ktestclient.NewUpdateAction("deploymentconfigs", "default", nil), }, kexpected: []ktestclient.Action{ ktestclient.NewGetAction("replicationcontrollers", "default", "config-1"), }, expectedErr: nil, }, } for _, test := range tests { scaler := NewDeploymentConfigScaler(test.oc, test.kc) got := scaler.Scale(test.namespace, test.name, test.count, test.preconditions, test.retry, test.waitForReplicas) if got != test.expectedErr { t.Errorf("%s: error mismatch: expected %v, got %v", test.testName, test.expectedErr, got) } if len(test.oc.Actions()) != len(test.expected) { t.Fatalf("%s: unexpected OpenShift actions amount: %d, expected %d", test.testName, len(test.oc.Actions()), len(test.expected)) } for j, actualAction := range test.oc.Actions() { e, a := test.expected[j], actualAction if e.GetVerb() != a.GetVerb() || e.GetNamespace() != a.GetNamespace() || e.GetResource() != a.GetResource() || e.GetSubresource() != a.GetSubresource() { t.Errorf("%s: unexpected OpenShift action[%d]: %s, expected %s", test.testName, j, a, e) } } if len(test.kc.Actions()) != len(test.kexpected) { t.Fatalf("%s: unexpected Kubernetes actions amount: %d, expected %d", test.testName, len(test.kc.Actions()), len(test.kexpected)) } for j, actualAction := range test.kc.Actions() { e, a := test.kexpected[j], actualAction if e.GetVerb() != a.GetVerb() || e.GetNamespace() != a.GetNamespace() || e.GetResource() != a.GetResource() || e.GetSubresource() != a.GetSubresource() { t.Errorf("%s: unexpected Kubernetes action[%d]: %s, expected %s", test.testName, j, a, e) } } } }
func (c *fakeRc) Update(controller *api.ReplicationController) (*api.ReplicationController, error) { c.Fake.Invokes(testclient.NewUpdateAction("replicationcontrollers", controller.Namespace, controller), nil) return controller, nil }
func TestStop(t *testing.T) { notFound := func() runtime.Object { return &(kerrors.NewNotFound(buildapi.Resource("BuildConfig"), configName).(*kerrors.StatusError).ErrStatus) } tests := map[string]struct { oc *testclient.Fake expected []ktestclient.Action err bool }{ "simple stop": { oc: newBuildListFake(makeBuildConfig(0, false)), expected: []ktestclient.Action{ ktestclient.NewGetAction("buildconfigs", "default", configName), ktestclient.NewUpdateAction("buildconfigs", "default", makeBuildConfig(0, true)), ktestclient.NewListAction("builds", "default", kapi.ListOptions{LabelSelector: buildutil.BuildConfigSelector(configName)}), ktestclient.NewListAction("builds", "default", kapi.ListOptions{LabelSelector: buildutil.BuildConfigSelectorDeprecated(configName)}), ktestclient.NewDeleteAction("buildconfigs", "default", configName), }, err: false, }, "multiple builds": { oc: newBuildListFake(makeBuildConfig(4, false), makeBuildList(4)), expected: []ktestclient.Action{ ktestclient.NewGetAction("buildconfigs", "default", configName), ktestclient.NewUpdateAction("buildconfigs", "default", makeBuildConfig(4, true)), ktestclient.NewListAction("builds", "default", kapi.ListOptions{LabelSelector: buildutil.BuildConfigSelector(configName)}), ktestclient.NewDeleteAction("builds", "default", "build-1"), ktestclient.NewDeleteAction("builds", "default", "build-3"), ktestclient.NewListAction("builds", "default", kapi.ListOptions{LabelSelector: buildutil.BuildConfigSelectorDeprecated(configName)}), ktestclient.NewDeleteAction("builds", "default", "build-2"), ktestclient.NewDeleteAction("builds", "default", "build-4"), ktestclient.NewDeleteAction("buildconfigs", "default", configName), }, err: false, }, "no config, some builds": { oc: newBuildListFake(makeBuildList(2)), expected: []ktestclient.Action{ ktestclient.NewGetAction("buildconfigs", "default", configName), ktestclient.NewListAction("builds", "default", kapi.ListOptions{LabelSelector: buildutil.BuildConfigSelector(configName)}), ktestclient.NewDeleteAction("builds", "default", "build-1"), ktestclient.NewListAction("builds", "default", kapi.ListOptions{LabelSelector: buildutil.BuildConfigSelectorDeprecated(configName)}), ktestclient.NewDeleteAction("builds", "default", "build-2"), }, err: false, }, "no config, no builds": { oc: testclient.NewSimpleFake(notFound()), expected: []ktestclient.Action{ ktestclient.NewGetAction("buildconfigs", "default", configName), ktestclient.NewListAction("builds", "default", kapi.ListOptions{LabelSelector: buildutil.BuildConfigSelector(configName)}), ktestclient.NewListAction("builds", "default", kapi.ListOptions{LabelSelector: buildutil.BuildConfigSelectorDeprecated(configName)}), }, err: true, }, "config, no builds": { oc: testclient.NewSimpleFake(makeBuildConfig(0, false)), expected: []ktestclient.Action{ ktestclient.NewGetAction("buildconfigs", "default", configName), ktestclient.NewUpdateAction("buildconfigs", "default", makeBuildConfig(0, true)), ktestclient.NewListAction("builds", "default", kapi.ListOptions{LabelSelector: buildutil.BuildConfigSelector(configName)}), ktestclient.NewListAction("builds", "default", kapi.ListOptions{LabelSelector: buildutil.BuildConfigSelectorDeprecated(configName)}), ktestclient.NewDeleteAction("buildconfigs", "default", configName), }, err: false, }, } for testName, test := range tests { reaper := &BuildConfigReaper{oc: test.oc, pollInterval: time.Millisecond, timeout: time.Millisecond} err := reaper.Stop("default", configName, 1*time.Second, nil) if !test.err && err != nil { t.Errorf("%s: unexpected error: %v", testName, err) } if test.err && err == nil { t.Errorf("%s: expected an error", testName) } if len(test.oc.Actions()) != len(test.expected) { t.Fatalf("%s: unexpected actions: %v, expected %v", testName, test.oc.Actions(), test.expected) } for j, actualAction := range test.oc.Actions() { if !actionsAreEqual(actualAction, test.expected[j]) { t.Errorf("%s: unexpected action: %v, expected %v", testName, actualAction, test.expected[j]) } } } }
func TestDockercfgDeletion(t *testing.T) { testcases := map[string]struct { ClientObjects []runtime.Object DeletedSecret *api.Secret ExpectedActions []testclient.Action }{ "deleted dockercfg secret without serviceaccount": { DeletedSecret: createdDockercfgSecret(), ExpectedActions: []testclient.Action{ testclient.NewGetAction("serviceaccounts", "default", "default"), testclient.NewDeleteAction("secrets", "default", "token-secret-1"), }, }, "deleted dockercfg secret with serviceaccount with reference": { ClientObjects: []runtime.Object{serviceAccount(addTokenSecretReference(tokenSecretReferences()), imagePullSecretReferences()), createdDockercfgSecret()}, DeletedSecret: createdDockercfgSecret(), ExpectedActions: []testclient.Action{ testclient.NewGetAction("serviceaccounts", "default", "default"), testclient.NewUpdateAction("serviceaccounts", "default", serviceAccount(tokenSecretReferences(), emptyImagePullSecretReferences())), testclient.NewDeleteAction("secrets", "default", "token-secret-1"), }, }, "deleted dockercfg secret with serviceaccount without reference": { ClientObjects: []runtime.Object{serviceAccount(addTokenSecretReference(tokenSecretReferences()), imagePullSecretReferences()), createdDockercfgSecret()}, DeletedSecret: createdDockercfgSecret(), ExpectedActions: []testclient.Action{ testclient.NewGetAction("serviceaccounts", "default", "default"), testclient.NewUpdateAction("serviceaccounts", "default", serviceAccount(tokenSecretReferences(), emptyImagePullSecretReferences())), testclient.NewDeleteAction("secrets", "default", "token-secret-1"), }, }, } for k, tc := range testcases { // Re-seed to reset name generation rand.Seed(1) client := testclient.NewSimpleFake(tc.ClientObjects...) controller := NewDockercfgDeletedController(client, DockercfgDeletedControllerOptions{}) if tc.DeletedSecret != nil { controller.secretDeleted(tc.DeletedSecret) } for i, action := range client.Actions() { if len(tc.ExpectedActions) < i+1 { t.Errorf("%s: %d unexpected actions: %+v", k, len(client.Actions())-len(tc.ExpectedActions), client.Actions()[i:]) break } expectedAction := tc.ExpectedActions[i] if !reflect.DeepEqual(expectedAction, action) { t.Errorf("%s: Expected %v, got %v", k, expectedAction, action) continue } } if len(tc.ExpectedActions) > len(client.Actions()) { t.Errorf("%s: %d additional expected actions:%+v", k, len(tc.ExpectedActions)-len(client.Actions()), tc.ExpectedActions[len(client.Actions()):]) } } }
func TestStop(t *testing.T) { notfound := func() runtime.Object { return &(kerrors.NewNotFound("DeploymentConfig", "config").(*kerrors.StatusError).ErrStatus) } tests := []struct { testName string namespace string name string oc *testclient.Fake kc *ktestclient.Fake expected []ktestclient.Action kexpected []ktestclient.Action output string err bool }{ { testName: "simple stop", namespace: "default", name: "config", oc: testclient.NewSimpleFake(deploytest.OkDeploymentConfig(1)), kc: ktestclient.NewSimpleFake(mkdeploymentlist(1)), expected: []ktestclient.Action{ ktestclient.NewDeleteAction("deploymentconfigs", "default", "config"), }, kexpected: []ktestclient.Action{ ktestclient.NewListAction("replicationcontrollers", "default", nil, nil), ktestclient.NewGetAction("replicationcontrollers", "", "config-1"), ktestclient.NewListAction("replicationcontrollers", "", nil, nil), ktestclient.NewGetAction("replicationcontrollers", "", "config-1"), ktestclient.NewUpdateAction("replicationcontrollers", "", nil), ktestclient.NewGetAction("replicationcontrollers", "", "config-1"), ktestclient.NewGetAction("replicationcontrollers", "", "config-1"), ktestclient.NewDeleteAction("replicationcontrollers", "", "config-1"), }, output: "config stopped", err: false, }, { testName: "stop multiple controllers", namespace: "default", name: "config", oc: testclient.NewSimpleFake(deploytest.OkDeploymentConfig(5)), kc: ktestclient.NewSimpleFake(mkdeploymentlist(1, 2, 3, 4, 5)), expected: []ktestclient.Action{ ktestclient.NewDeleteAction("deploymentconfigs", "default", "config"), }, kexpected: []ktestclient.Action{ ktestclient.NewListAction("replicationcontrollers", "default", nil, nil), ktestclient.NewGetAction("replicationcontrollers", "", "config-1"), ktestclient.NewListAction("replicationcontrollers", "", nil, nil), ktestclient.NewGetAction("replicationcontrollers", "", "config-1"), ktestclient.NewUpdateAction("replicationcontrollers", "", nil), ktestclient.NewGetAction("replicationcontrollers", "", "config-1"), ktestclient.NewGetAction("replicationcontrollers", "", "config-4"), ktestclient.NewDeleteAction("replicationcontrollers", "", "config-1"), ktestclient.NewGetAction("replicationcontrollers", "", "config-2"), ktestclient.NewListAction("replicationcontrollers", "", nil, nil), ktestclient.NewGetAction("replicationcontrollers", "", "config-2"), ktestclient.NewUpdateAction("replicationcontrollers", "", nil), ktestclient.NewGetAction("replicationcontrollers", "", "config-2"), ktestclient.NewGetAction("replicationcontrollers", "", "config-5"), ktestclient.NewDeleteAction("replicationcontrollers", "", "config-2"), ktestclient.NewGetAction("replicationcontrollers", "", "config-3"), ktestclient.NewListAction("replicationcontrollers", "", nil, nil), ktestclient.NewGetAction("replicationcontrollers", "", "config-3"), ktestclient.NewUpdateAction("replicationcontrollers", "", nil), ktestclient.NewGetAction("replicationcontrollers", "", "config-3"), ktestclient.NewGetAction("replicationcontrollers", "", "config-5"), ktestclient.NewDeleteAction("replicationcontrollers", "", "config-3"), ktestclient.NewGetAction("replicationcontrollers", "", "config-4"), ktestclient.NewListAction("replicationcontrollers", "", nil, nil), ktestclient.NewGetAction("replicationcontrollers", "", "config-4"), ktestclient.NewUpdateAction("replicationcontrollers", "", nil), ktestclient.NewGetAction("replicationcontrollers", "", "config-4"), ktestclient.NewGetAction("replicationcontrollers", "", "config-5"), ktestclient.NewDeleteAction("replicationcontrollers", "", "config-4"), ktestclient.NewGetAction("replicationcontrollers", "", "config-5"), ktestclient.NewListAction("replicationcontrollers", "", nil, nil), ktestclient.NewGetAction("replicationcontrollers", "", "config-5"), ktestclient.NewUpdateAction("replicationcontrollers", "", nil), ktestclient.NewGetAction("replicationcontrollers", "", "config-5"), ktestclient.NewGetAction("replicationcontrollers", "", "config-5"), ktestclient.NewDeleteAction("replicationcontrollers", "", "config-5"), }, output: "config stopped", err: false, }, { testName: "no config, some deployments", namespace: "default", name: "config", oc: testclient.NewSimpleFake(notfound()), kc: ktestclient.NewSimpleFake(mkdeploymentlist(1)), expected: []ktestclient.Action{ ktestclient.NewDeleteAction("deploymentconfigs", "default", "config"), }, kexpected: []ktestclient.Action{ ktestclient.NewListAction("replicationcontrollers", "default", nil, nil), ktestclient.NewGetAction("replicationcontrollers", "", "config-1"), ktestclient.NewListAction("replicationcontrollers", "", nil, nil), ktestclient.NewGetAction("replicationcontrollers", "", "config-1"), ktestclient.NewUpdateAction("replicationcontrollers", "", nil), ktestclient.NewGetAction("replicationcontrollers", "", "config-1"), ktestclient.NewGetAction("replicationcontrollers", "", "config-1"), ktestclient.NewDeleteAction("replicationcontrollers", "", "config-1"), }, output: "config stopped", err: false, }, { testName: "no config, no deployments", namespace: "default", name: "config", oc: testclient.NewSimpleFake(notfound()), kc: ktestclient.NewSimpleFake(&kapi.ReplicationControllerList{}), expected: []ktestclient.Action{ ktestclient.NewDeleteAction("deploymentconfigs", "default", "config"), }, kexpected: []ktestclient.Action{ ktestclient.NewListAction("replicationcontrollers", "default", nil, nil), }, output: "", err: true, }, { testName: "config, no deployments", namespace: "default", name: "config", oc: testclient.NewSimpleFake(deploytest.OkDeploymentConfig(5)), kc: ktestclient.NewSimpleFake(&kapi.ReplicationControllerList{}), expected: []ktestclient.Action{ ktestclient.NewDeleteAction("deploymentconfigs", "default", "config"), }, kexpected: []ktestclient.Action{ ktestclient.NewListAction("replicationcontrollers", "default", nil, nil), }, output: "config stopped", err: false, }, } for _, test := range tests { reaper := &DeploymentConfigReaper{oc: test.oc, kc: test.kc, pollInterval: time.Millisecond, timeout: time.Millisecond} out, err := reaper.Stop(test.namespace, test.name, 1*time.Second, nil) if !test.err && err != nil { t.Errorf("%s: unexpected error: %v", test.testName, err) } if test.err && err == nil { t.Errorf("%s: expected an error", test.testName) } if len(test.oc.Actions()) != len(test.expected) { t.Fatalf("%s: unexpected actions: %v, expected %v", test.testName, test.oc.Actions, test.expected) } for j, actualAction := range test.oc.Actions() { if !reflect.DeepEqual(actualAction, test.expected[j]) { t.Errorf("%s: unexpected action: %s, expected %s", test.testName, actualAction, test.expected[j]) } } if len(test.kc.Actions()) != len(test.kexpected) { t.Fatalf("%s: unexpected actions: %v, expected %v", test.testName, test.kc.Actions(), test.kexpected) } for j, actualAction := range test.kc.Actions() { e, a := test.kexpected[j], actualAction if e.GetVerb() != a.GetVerb() || e.GetNamespace() != a.GetNamespace() || e.GetResource() != a.GetResource() || e.GetSubresource() != a.GetSubresource() { t.Errorf("%s: unexpected action[%d]: %s, expected %s", test.testName, j, a, e) } switch a.(type) { case ktestclient.GetAction, ktestclient.DeleteAction: if !reflect.DeepEqual(e, a) { t.Errorf("%s: unexpected action[%d]: %s, expected %s", test.testName, j, a, e) } } } if out != test.output { t.Errorf("%s: unexpected output %q, expected %q", test.testName, out, test.output) } } }
func TestStop(t *testing.T) { notfound := func() runtime.Object { return &(kerrors.NewNotFound(kapi.Resource("DeploymentConfig"), "config").ErrStatus) } pause := func(d *deployapi.DeploymentConfig) *deployapi.DeploymentConfig { d.Spec.Paused = true return d } fakeDC := map[string]*deployapi.DeploymentConfig{ "simple-stop": deploytest.OkDeploymentConfig(1), "legacy-simple-stop": deploytest.OkDeploymentConfig(1), "multi-stop": deploytest.OkDeploymentConfig(5), "legacy-multi-stop": deploytest.OkDeploymentConfig(5), "no-deployments": deploytest.OkDeploymentConfig(5), "legacy-no-deployments": deploytest.OkDeploymentConfig(5), } tests := []struct { testName string namespace string name string oc *testclient.Fake kc *ktestclient.Fake expected []ktestclient.Action kexpected []ktestclient.Action err bool }{ { testName: "simple stop", namespace: "default", name: "config", oc: testclient.NewSimpleFake(fakeDC["simple-stop"]), kc: ktestclient.NewSimpleFake(mkdeploymentlist(1)), expected: []ktestclient.Action{ ktestclient.NewGetAction("deploymentconfigs", "default", "config"), ktestclient.NewUpdateAction("deploymentconfigs", "default", pause(fakeDC["simple-stop"])), ktestclient.NewGetAction("deploymentconfigs", "default", "config"), ktestclient.NewDeleteAction("deploymentconfigs", "default", "config"), }, kexpected: []ktestclient.Action{ ktestclient.NewListAction("replicationcontrollers", "default", kapi.ListOptions{}), ktestclient.NewGetAction("replicationcontrollers", "", "config-1"), ktestclient.NewListAction("replicationcontrollers", "", kapi.ListOptions{}), ktestclient.NewGetAction("replicationcontrollers", "", "config-1"), ktestclient.NewUpdateAction("replicationcontrollers", "", nil), ktestclient.NewGetAction("replicationcontrollers", "", "config-1"), ktestclient.NewGetAction("replicationcontrollers", "", "config-1"), ktestclient.NewDeleteAction("replicationcontrollers", "", "config-1"), }, err: false, }, { testName: "legacy simple stop", namespace: "default", name: "config", oc: testclient.NewSimpleFake(fakeDC["legacy-simple-stop"]), kc: ktestclient.NewSimpleFake(mkdeploymentlist(1)), expected: []ktestclient.Action{ ktestclient.NewGetAction("deploymentconfigs", "default", "config"), ktestclient.NewUpdateAction("deploymentconfigs", "default", nil), ktestclient.NewGetAction("deploymentconfigs", "default", "config"), ktestclient.NewDeleteAction("deploymentconfigs", "default", "config"), }, kexpected: []ktestclient.Action{ ktestclient.NewListAction("replicationcontrollers", "default", kapi.ListOptions{}), ktestclient.NewGetAction("replicationcontrollers", "", "config-1"), ktestclient.NewListAction("replicationcontrollers", "", kapi.ListOptions{}), ktestclient.NewGetAction("replicationcontrollers", "", "config-1"), ktestclient.NewUpdateAction("replicationcontrollers", "", nil), ktestclient.NewGetAction("replicationcontrollers", "", "config-1"), ktestclient.NewGetAction("replicationcontrollers", "", "config-1"), ktestclient.NewDeleteAction("replicationcontrollers", "", "config-1"), }, err: false, }, { testName: "stop multiple controllers", namespace: "default", name: "config", oc: testclient.NewSimpleFake(fakeDC["multi-stop"]), kc: ktestclient.NewSimpleFake(mkdeploymentlist(1, 2, 3, 4, 5)), expected: []ktestclient.Action{ ktestclient.NewGetAction("deploymentconfigs", "default", "config"), ktestclient.NewUpdateAction("deploymentconfigs", "default", pause(fakeDC["multi-stop"])), ktestclient.NewGetAction("deploymentconfigs", "default", "config"), ktestclient.NewDeleteAction("deploymentconfigs", "default", "config"), }, kexpected: []ktestclient.Action{ ktestclient.NewListAction("replicationcontrollers", "default", kapi.ListOptions{}), ktestclient.NewGetAction("replicationcontrollers", "", "config-1"), ktestclient.NewListAction("replicationcontrollers", "", kapi.ListOptions{}), ktestclient.NewGetAction("replicationcontrollers", "", "config-1"), ktestclient.NewUpdateAction("replicationcontrollers", "", nil), ktestclient.NewGetAction("replicationcontrollers", "", "config-1"), ktestclient.NewGetAction("replicationcontrollers", "", "config-4"), ktestclient.NewDeleteAction("replicationcontrollers", "", "config-1"), ktestclient.NewGetAction("replicationcontrollers", "", "config-2"), ktestclient.NewListAction("replicationcontrollers", "", kapi.ListOptions{}), ktestclient.NewGetAction("replicationcontrollers", "", "config-2"), ktestclient.NewUpdateAction("replicationcontrollers", "", nil), ktestclient.NewGetAction("replicationcontrollers", "", "config-2"), ktestclient.NewGetAction("replicationcontrollers", "", "config-5"), ktestclient.NewDeleteAction("replicationcontrollers", "", "config-2"), ktestclient.NewGetAction("replicationcontrollers", "", "config-3"), ktestclient.NewListAction("replicationcontrollers", "", kapi.ListOptions{}), ktestclient.NewGetAction("replicationcontrollers", "", "config-3"), ktestclient.NewUpdateAction("replicationcontrollers", "", nil), ktestclient.NewGetAction("replicationcontrollers", "", "config-3"), ktestclient.NewGetAction("replicationcontrollers", "", "config-5"), ktestclient.NewDeleteAction("replicationcontrollers", "", "config-3"), ktestclient.NewGetAction("replicationcontrollers", "", "config-4"), ktestclient.NewListAction("replicationcontrollers", "", kapi.ListOptions{}), ktestclient.NewGetAction("replicationcontrollers", "", "config-4"), ktestclient.NewUpdateAction("replicationcontrollers", "", nil), ktestclient.NewGetAction("replicationcontrollers", "", "config-4"), ktestclient.NewGetAction("replicationcontrollers", "", "config-5"), ktestclient.NewDeleteAction("replicationcontrollers", "", "config-4"), ktestclient.NewGetAction("replicationcontrollers", "", "config-5"), ktestclient.NewListAction("replicationcontrollers", "", kapi.ListOptions{}), ktestclient.NewGetAction("replicationcontrollers", "", "config-5"), ktestclient.NewUpdateAction("replicationcontrollers", "", nil), ktestclient.NewGetAction("replicationcontrollers", "", "config-5"), ktestclient.NewGetAction("replicationcontrollers", "", "config-5"), ktestclient.NewDeleteAction("replicationcontrollers", "", "config-5"), }, err: false, }, { testName: "legacy stop multiple controllers", namespace: "default", name: "config", oc: testclient.NewSimpleFake(fakeDC["legacy-multi-stop"]), kc: ktestclient.NewSimpleFake(mkdeploymentlist(1, 2, 3, 4, 5)), expected: []ktestclient.Action{ ktestclient.NewGetAction("deploymentconfigs", "default", "config"), ktestclient.NewUpdateAction("deploymentconfigs", "default", nil), ktestclient.NewGetAction("deploymentconfigs", "default", "config"), ktestclient.NewDeleteAction("deploymentconfigs", "default", "config"), }, kexpected: []ktestclient.Action{ ktestclient.NewListAction("replicationcontrollers", "default", kapi.ListOptions{}), ktestclient.NewGetAction("replicationcontrollers", "", "config-1"), ktestclient.NewListAction("replicationcontrollers", "", kapi.ListOptions{}), ktestclient.NewGetAction("replicationcontrollers", "", "config-1"), ktestclient.NewUpdateAction("replicationcontrollers", "", nil), ktestclient.NewGetAction("replicationcontrollers", "", "config-1"), ktestclient.NewGetAction("replicationcontrollers", "", "config-4"), ktestclient.NewDeleteAction("replicationcontrollers", "", "config-1"), ktestclient.NewGetAction("replicationcontrollers", "", "config-2"), ktestclient.NewListAction("replicationcontrollers", "", kapi.ListOptions{}), ktestclient.NewGetAction("replicationcontrollers", "", "config-2"), ktestclient.NewUpdateAction("replicationcontrollers", "", nil), ktestclient.NewGetAction("replicationcontrollers", "", "config-2"), ktestclient.NewGetAction("replicationcontrollers", "", "config-5"), ktestclient.NewDeleteAction("replicationcontrollers", "", "config-2"), ktestclient.NewGetAction("replicationcontrollers", "", "config-3"), ktestclient.NewListAction("replicationcontrollers", "", kapi.ListOptions{}), ktestclient.NewGetAction("replicationcontrollers", "", "config-3"), ktestclient.NewUpdateAction("replicationcontrollers", "", nil), ktestclient.NewGetAction("replicationcontrollers", "", "config-3"), ktestclient.NewGetAction("replicationcontrollers", "", "config-5"), ktestclient.NewDeleteAction("replicationcontrollers", "", "config-3"), ktestclient.NewGetAction("replicationcontrollers", "", "config-4"), ktestclient.NewListAction("replicationcontrollers", "", kapi.ListOptions{}), ktestclient.NewGetAction("replicationcontrollers", "", "config-4"), ktestclient.NewUpdateAction("replicationcontrollers", "", nil), ktestclient.NewGetAction("replicationcontrollers", "", "config-4"), ktestclient.NewGetAction("replicationcontrollers", "", "config-5"), ktestclient.NewDeleteAction("replicationcontrollers", "", "config-4"), ktestclient.NewGetAction("replicationcontrollers", "", "config-5"), ktestclient.NewListAction("replicationcontrollers", "", kapi.ListOptions{}), ktestclient.NewGetAction("replicationcontrollers", "", "config-5"), ktestclient.NewUpdateAction("replicationcontrollers", "", nil), ktestclient.NewGetAction("replicationcontrollers", "", "config-5"), ktestclient.NewGetAction("replicationcontrollers", "", "config-5"), ktestclient.NewDeleteAction("replicationcontrollers", "", "config-5"), }, err: false, }, { testName: "no config, some deployments", namespace: "default", name: "config", oc: testclient.NewSimpleFake(notfound()), kc: ktestclient.NewSimpleFake(mkdeploymentlist(1)), expected: []ktestclient.Action{ ktestclient.NewGetAction("deploymentconfigs", "default", "config"), }, kexpected: []ktestclient.Action{ ktestclient.NewListAction("replicationcontrollers", "default", kapi.ListOptions{}), ktestclient.NewGetAction("replicationcontrollers", "", "config-1"), ktestclient.NewListAction("replicationcontrollers", "", kapi.ListOptions{}), ktestclient.NewGetAction("replicationcontrollers", "", "config-1"), ktestclient.NewUpdateAction("replicationcontrollers", "", nil), ktestclient.NewGetAction("replicationcontrollers", "", "config-1"), ktestclient.NewGetAction("replicationcontrollers", "", "config-1"), ktestclient.NewDeleteAction("replicationcontrollers", "", "config-1"), }, err: false, }, { testName: "no config, no deployments", namespace: "default", name: "config", oc: testclient.NewSimpleFake(notfound()), kc: ktestclient.NewSimpleFake(&kapi.ReplicationControllerList{}), expected: []ktestclient.Action{ ktestclient.NewGetAction("deploymentconfigs", "default", "config"), }, kexpected: []ktestclient.Action{ ktestclient.NewListAction("replicationcontrollers", "default", kapi.ListOptions{}), }, err: true, }, { testName: "config, no deployments", namespace: "default", name: "config", oc: testclient.NewSimpleFake(fakeDC["no-deployments"]), kc: ktestclient.NewSimpleFake(&kapi.ReplicationControllerList{}), expected: []ktestclient.Action{ ktestclient.NewGetAction("deploymentconfigs", "default", "config"), ktestclient.NewUpdateAction("deploymentconfigs", "default", pause(fakeDC["no-deployments"])), ktestclient.NewGetAction("deploymentconfigs", "default", "config"), ktestclient.NewDeleteAction("deploymentconfigs", "default", "config"), }, kexpected: []ktestclient.Action{ ktestclient.NewListAction("replicationcontrollers", "default", kapi.ListOptions{}), }, err: false, }, { testName: "legacy config, no deployments", namespace: "default", name: "config", oc: testclient.NewSimpleFake(fakeDC["legacy-no-deployments"]), kc: ktestclient.NewSimpleFake(&kapi.ReplicationControllerList{}), expected: []ktestclient.Action{ ktestclient.NewGetAction("deploymentconfigs", "default", "config"), ktestclient.NewUpdateAction("deploymentconfigs", "default", nil), ktestclient.NewGetAction("deploymentconfigs", "default", "config"), ktestclient.NewDeleteAction("deploymentconfigs", "default", "config"), }, kexpected: []ktestclient.Action{ ktestclient.NewListAction("replicationcontrollers", "default", kapi.ListOptions{}), }, err: false, }, } for _, test := range tests { reaper := &DeploymentConfigReaper{oc: test.oc, kc: test.kc, pollInterval: time.Millisecond, timeout: time.Millisecond} err := reaper.Stop(test.namespace, test.name, 1*time.Second, nil) if !test.err && err != nil { t.Errorf("%s: unexpected error: %v", test.testName, err) } if test.err && err == nil { t.Errorf("%s: expected an error", test.testName) } if len(test.oc.Actions()) != len(test.expected) { t.Fatalf("%s: unexpected actions: %v, expected %v", test.testName, test.oc.Actions(), test.expected) } for j, actualAction := range test.oc.Actions() { e, a := test.expected[j], actualAction switch a.(type) { case ktestclient.UpdateAction: if e.GetVerb() != a.GetVerb() || e.GetNamespace() != a.GetNamespace() || e.GetResource() != a.GetResource() || e.GetSubresource() != a.GetSubresource() { t.Errorf("%s: unexpected action[%d]: %s, expected %s", test.testName, j, a, e) } default: if !reflect.DeepEqual(actualAction, test.expected[j]) { t.Errorf("%s: unexpected action: got:\n%#+v\nexpected:\n%#+v", test.testName, actualAction, test.expected[j]) } } } if len(test.kc.Actions()) != len(test.kexpected) { t.Fatalf("%s: unexpected actions: %v, expected %v", test.testName, test.kc.Actions(), test.kexpected) } for j, actualAction := range test.kc.Actions() { e, a := test.kexpected[j], actualAction if e.GetVerb() != a.GetVerb() || e.GetNamespace() != a.GetNamespace() || e.GetResource() != a.GetResource() || e.GetSubresource() != a.GetSubresource() { t.Errorf("%s: unexpected action[%d]: %s, expected %s", test.testName, j, a, e) } switch a.(type) { case ktestclient.GetAction, ktestclient.DeleteAction: if !reflect.DeepEqual(e, a) { t.Errorf("%s: unexpected action[%d]: %s, expected %s", test.testName, j, a, e) } } } } }
func TestStop(t *testing.T) { notFound := func() runtime.Object { return &(kerrors.NewNotFound(buildapi.Resource("BuildConfig"), configName).ErrStatus) } tests := map[string]struct { targetBC string oc *testclient.Fake expected []ktestclient.Action err bool }{ "simple stop": { targetBC: configName, oc: newBuildListFake(makeBuildConfig(configName, 0, false)), expected: []ktestclient.Action{ ktestclient.NewGetAction("buildconfigs", "default", configName), // Since there are no builds associated with this build config, do not expect an update ktestclient.NewListAction("builds", "default", kapi.ListOptions{LabelSelector: buildutil.BuildConfigSelector(configName)}), ktestclient.NewListAction("builds", "default", kapi.ListOptions{LabelSelector: buildutil.BuildConfigSelectorDeprecated(configName)}), ktestclient.NewDeleteAction("buildconfigs", "default", configName), }, err: false, }, "multiple builds": { targetBC: configName, oc: newBuildListFake(makeBuildConfig(configName, 4, false), makeBuildList(configName, 4)), expected: []ktestclient.Action{ ktestclient.NewGetAction("buildconfigs", "default", configName), ktestclient.NewListAction("builds", "default", kapi.ListOptions{LabelSelector: buildutil.BuildConfigSelector(configName)}), ktestclient.NewListAction("builds", "default", kapi.ListOptions{LabelSelector: buildutil.BuildConfigSelectorDeprecated(configName)}), ktestclient.NewGetAction("buildconfigs", "default", configName), // Second GET to enable conflict retry logic ktestclient.NewUpdateAction("buildconfigs", "default", makeBuildConfig(configName, 4, true)), // Because this bc has builds, it is paused ktestclient.NewDeleteAction("builds", "default", "build-1"), ktestclient.NewDeleteAction("builds", "default", "build-2"), ktestclient.NewDeleteAction("builds", "default", "build-3"), ktestclient.NewDeleteAction("builds", "default", "build-4"), ktestclient.NewDeleteAction("buildconfigs", "default", configName), }, err: false, }, "long name builds": { targetBC: longConfigNameA, oc: newBuildListFake(makeBuildConfig(longConfigNameA, 4, false), makeBuildList(longConfigNameA, 4), makeBuildList(longConfigNameB, 4)), expected: []ktestclient.Action{ ktestclient.NewGetAction("buildconfigs", "default", longConfigNameA), ktestclient.NewListAction("builds", "default", kapi.ListOptions{LabelSelector: buildutil.BuildConfigSelector(longConfigNameA)}), ktestclient.NewListAction("builds", "default", kapi.ListOptions{LabelSelector: buildutil.BuildConfigSelectorDeprecated(longConfigNameA)}), ktestclient.NewGetAction("buildconfigs", "default", longConfigNameA), // Second GET to enable conflict retry logic ktestclient.NewUpdateAction("buildconfigs", "default", makeBuildConfig(longConfigNameA, 4, true)), // Because this bc has builds, it is paused ktestclient.NewDeleteAction("builds", "default", "build-1"), ktestclient.NewDeleteAction("builds", "default", "build-2"), ktestclient.NewDeleteAction("builds", "default", "build-3"), ktestclient.NewDeleteAction("builds", "default", "build-4"), ktestclient.NewDeleteAction("buildconfigs", "default", longConfigNameA), }, err: false, }, "no config, no or some builds": { targetBC: configName, oc: testclient.NewSimpleFake(notFound(), makeBuildList(configName, 2)), expected: []ktestclient.Action{ ktestclient.NewGetAction("buildconfigs", "default", configName), }, err: true, }, "config, no builds": { targetBC: configName, oc: testclient.NewSimpleFake(makeBuildConfig(configName, 0, false)), expected: []ktestclient.Action{ ktestclient.NewGetAction("buildconfigs", "default", configName), ktestclient.NewListAction("builds", "default", kapi.ListOptions{LabelSelector: buildutil.BuildConfigSelector(configName)}), ktestclient.NewListAction("builds", "default", kapi.ListOptions{LabelSelector: buildutil.BuildConfigSelectorDeprecated(configName)}), ktestclient.NewDeleteAction("buildconfigs", "default", configName), }, err: false, }, } for testName, test := range tests { reaper := &BuildConfigReaper{oc: test.oc, pollInterval: time.Millisecond, timeout: time.Millisecond} err := reaper.Stop("default", test.targetBC, 1*time.Second, nil) if !test.err && err != nil { t.Errorf("%s: unexpected error: %v", testName, err) } if test.err && err == nil { t.Errorf("%s: expected an error", testName) } if len(test.oc.Actions()) != len(test.expected) { t.Fatalf("%s: unexpected actions: %v, expected %v", testName, test.oc.Actions(), test.expected) } for j, actualAction := range test.oc.Actions() { if !actionsAreEqual(actualAction, test.expected[j]) { t.Errorf("%s: unexpected action: %v, expected %v", testName, actualAction, test.expected[j]) } } } }
func (c *FakeBackingServiceInstances) UpdateBinding(name string, bro *backingserviceinstanceapi.BindingRequestOptions) (err error) { _, err = c.Fake.Invokes(ktestclient.NewUpdateAction("backingserviceinstances/binding", c.Namespace, bro), bro) return }
func TestTokenCreation(t *testing.T) { testcases := map[string]struct { ClientObjects []runtime.Object SecretsSyncPending bool ServiceAccountsSyncPending bool ExistingServiceAccount *api.ServiceAccount ExistingSecrets []*api.Secret AddedServiceAccount *api.ServiceAccount UpdatedServiceAccount *api.ServiceAccount DeletedServiceAccount *api.ServiceAccount AddedSecret *api.Secret UpdatedSecret *api.Secret DeletedSecret *api.Secret ExpectedActions []testclient.Action }{ "new serviceaccount with no secrets": { ClientObjects: []runtime.Object{serviceAccount(emptySecretReferences()), createdTokenSecret()}, AddedServiceAccount: serviceAccount(emptySecretReferences()), ExpectedActions: []testclient.Action{ testclient.NewGetAction("serviceaccounts", api.NamespaceDefault, "default"), testclient.NewCreateAction("secrets", api.NamespaceDefault, createdTokenSecret()), testclient.NewUpdateAction("serviceaccounts", api.NamespaceDefault, serviceAccount(addTokenSecretReference(emptySecretReferences()))), }, }, "new serviceaccount with no secrets with unsynced secret store": { ClientObjects: []runtime.Object{serviceAccount(emptySecretReferences()), createdTokenSecret()}, SecretsSyncPending: true, AddedServiceAccount: serviceAccount(emptySecretReferences()), ExpectedActions: []testclient.Action{ testclient.NewGetAction("serviceaccounts", api.NamespaceDefault, "default"), testclient.NewCreateAction("secrets", api.NamespaceDefault, createdTokenSecret()), testclient.NewUpdateAction("serviceaccounts", api.NamespaceDefault, serviceAccount(addTokenSecretReference(emptySecretReferences()))), }, }, "new serviceaccount with missing secrets": { ClientObjects: []runtime.Object{serviceAccount(missingSecretReferences()), createdTokenSecret()}, AddedServiceAccount: serviceAccount(missingSecretReferences()), ExpectedActions: []testclient.Action{ testclient.NewGetAction("serviceaccounts", api.NamespaceDefault, "default"), testclient.NewCreateAction("secrets", api.NamespaceDefault, createdTokenSecret()), testclient.NewUpdateAction("serviceaccounts", api.NamespaceDefault, serviceAccount(addTokenSecretReference(missingSecretReferences()))), }, }, "new serviceaccount with missing secrets with unsynced secret store": { ClientObjects: []runtime.Object{serviceAccount(missingSecretReferences()), createdTokenSecret()}, SecretsSyncPending: true, AddedServiceAccount: serviceAccount(missingSecretReferences()), ExpectedActions: []testclient.Action{}, }, "new serviceaccount with non-token secrets": { ClientObjects: []runtime.Object{serviceAccount(regularSecretReferences()), createdTokenSecret(), opaqueSecret()}, AddedServiceAccount: serviceAccount(regularSecretReferences()), ExpectedActions: []testclient.Action{ testclient.NewGetAction("serviceaccounts", api.NamespaceDefault, "default"), testclient.NewCreateAction("secrets", api.NamespaceDefault, createdTokenSecret()), testclient.NewUpdateAction("serviceaccounts", api.NamespaceDefault, serviceAccount(addTokenSecretReference(regularSecretReferences()))), }, }, "new serviceaccount with token secrets": { ClientObjects: []runtime.Object{serviceAccount(tokenSecretReferences()), serviceAccountTokenSecret()}, ExistingSecrets: []*api.Secret{serviceAccountTokenSecret()}, AddedServiceAccount: serviceAccount(tokenSecretReferences()), ExpectedActions: []testclient.Action{}, }, "new serviceaccount with no secrets with resource conflict": { ClientObjects: []runtime.Object{updatedServiceAccount(emptySecretReferences()), createdTokenSecret()}, AddedServiceAccount: serviceAccount(emptySecretReferences()), ExpectedActions: []testclient.Action{ testclient.NewGetAction("serviceaccounts", api.NamespaceDefault, "default"), }, }, "updated serviceaccount with no secrets": { ClientObjects: []runtime.Object{serviceAccount(emptySecretReferences()), createdTokenSecret()}, UpdatedServiceAccount: serviceAccount(emptySecretReferences()), ExpectedActions: []testclient.Action{ testclient.NewGetAction("serviceaccounts", api.NamespaceDefault, "default"), testclient.NewCreateAction("secrets", api.NamespaceDefault, createdTokenSecret()), testclient.NewUpdateAction("serviceaccounts", api.NamespaceDefault, serviceAccount(addTokenSecretReference(emptySecretReferences()))), }, }, "updated serviceaccount with no secrets with unsynced secret store": { ClientObjects: []runtime.Object{serviceAccount(emptySecretReferences()), createdTokenSecret()}, SecretsSyncPending: true, UpdatedServiceAccount: serviceAccount(emptySecretReferences()), ExpectedActions: []testclient.Action{ testclient.NewGetAction("serviceaccounts", api.NamespaceDefault, "default"), testclient.NewCreateAction("secrets", api.NamespaceDefault, createdTokenSecret()), testclient.NewUpdateAction("serviceaccounts", api.NamespaceDefault, serviceAccount(addTokenSecretReference(emptySecretReferences()))), }, }, "updated serviceaccount with missing secrets": { ClientObjects: []runtime.Object{serviceAccount(missingSecretReferences()), createdTokenSecret()}, UpdatedServiceAccount: serviceAccount(missingSecretReferences()), ExpectedActions: []testclient.Action{ testclient.NewGetAction("serviceaccounts", api.NamespaceDefault, "default"), testclient.NewCreateAction("secrets", api.NamespaceDefault, createdTokenSecret()), testclient.NewUpdateAction("serviceaccounts", api.NamespaceDefault, serviceAccount(addTokenSecretReference(missingSecretReferences()))), }, }, "updated serviceaccount with missing secrets with unsynced secret store": { ClientObjects: []runtime.Object{serviceAccount(missingSecretReferences()), createdTokenSecret()}, SecretsSyncPending: true, UpdatedServiceAccount: serviceAccount(missingSecretReferences()), ExpectedActions: []testclient.Action{}, }, "updated serviceaccount with non-token secrets": { ClientObjects: []runtime.Object{serviceAccount(regularSecretReferences()), createdTokenSecret(), opaqueSecret()}, UpdatedServiceAccount: serviceAccount(regularSecretReferences()), ExpectedActions: []testclient.Action{ testclient.NewGetAction("serviceaccounts", api.NamespaceDefault, "default"), testclient.NewCreateAction("secrets", api.NamespaceDefault, createdTokenSecret()), testclient.NewUpdateAction("serviceaccounts", api.NamespaceDefault, serviceAccount(addTokenSecretReference(regularSecretReferences()))), }, }, "updated serviceaccount with token secrets": { ExistingSecrets: []*api.Secret{serviceAccountTokenSecret()}, UpdatedServiceAccount: serviceAccount(tokenSecretReferences()), ExpectedActions: []testclient.Action{}, }, "updated serviceaccount with no secrets with resource conflict": { ClientObjects: []runtime.Object{updatedServiceAccount(emptySecretReferences()), createdTokenSecret()}, UpdatedServiceAccount: serviceAccount(emptySecretReferences()), ExpectedActions: []testclient.Action{ testclient.NewGetAction("serviceaccounts", api.NamespaceDefault, "default"), }, }, "deleted serviceaccount with no secrets": { DeletedServiceAccount: serviceAccount(emptySecretReferences()), ExpectedActions: []testclient.Action{}, }, "deleted serviceaccount with missing secrets": { DeletedServiceAccount: serviceAccount(missingSecretReferences()), ExpectedActions: []testclient.Action{}, }, "deleted serviceaccount with non-token secrets": { ClientObjects: []runtime.Object{opaqueSecret()}, DeletedServiceAccount: serviceAccount(regularSecretReferences()), ExpectedActions: []testclient.Action{}, }, "deleted serviceaccount with token secrets": { ClientObjects: []runtime.Object{serviceAccountTokenSecret()}, ExistingSecrets: []*api.Secret{serviceAccountTokenSecret()}, DeletedServiceAccount: serviceAccount(tokenSecretReferences()), ExpectedActions: []testclient.Action{ testclient.NewDeleteAction("secrets", api.NamespaceDefault, "token-secret-1"), }, }, "added secret without serviceaccount": { ClientObjects: []runtime.Object{serviceAccountTokenSecret()}, AddedSecret: serviceAccountTokenSecret(), ExpectedActions: []testclient.Action{ testclient.NewGetAction("serviceaccounts", api.NamespaceDefault, "default"), testclient.NewDeleteAction("secrets", api.NamespaceDefault, "token-secret-1"), }, }, "added secret with serviceaccount": { ExistingServiceAccount: serviceAccount(tokenSecretReferences()), AddedSecret: serviceAccountTokenSecret(), ExpectedActions: []testclient.Action{}, }, "added token secret without token data": { ClientObjects: []runtime.Object{serviceAccountTokenSecretWithoutTokenData()}, ExistingServiceAccount: serviceAccount(tokenSecretReferences()), AddedSecret: serviceAccountTokenSecretWithoutTokenData(), ExpectedActions: []testclient.Action{ testclient.NewUpdateAction("secrets", api.NamespaceDefault, serviceAccountTokenSecret()), }, }, "added token secret without ca data": { ClientObjects: []runtime.Object{serviceAccountTokenSecretWithoutCAData()}, ExistingServiceAccount: serviceAccount(tokenSecretReferences()), AddedSecret: serviceAccountTokenSecretWithoutCAData(), ExpectedActions: []testclient.Action{ testclient.NewUpdateAction("secrets", api.NamespaceDefault, serviceAccountTokenSecret()), }, }, "added token secret with mismatched ca data": { ClientObjects: []runtime.Object{serviceAccountTokenSecretWithCAData([]byte("mismatched"))}, ExistingServiceAccount: serviceAccount(tokenSecretReferences()), AddedSecret: serviceAccountTokenSecretWithCAData([]byte("mismatched")), ExpectedActions: []testclient.Action{ testclient.NewUpdateAction("secrets", api.NamespaceDefault, serviceAccountTokenSecret()), }, }, "updated secret without serviceaccount": { ClientObjects: []runtime.Object{serviceAccountTokenSecret()}, UpdatedSecret: serviceAccountTokenSecret(), ExpectedActions: []testclient.Action{ testclient.NewGetAction("serviceaccounts", api.NamespaceDefault, "default"), testclient.NewDeleteAction("secrets", api.NamespaceDefault, "token-secret-1"), }, }, "updated secret with serviceaccount": { ExistingServiceAccount: serviceAccount(tokenSecretReferences()), UpdatedSecret: serviceAccountTokenSecret(), ExpectedActions: []testclient.Action{}, }, "updated token secret without token data": { ClientObjects: []runtime.Object{serviceAccountTokenSecretWithoutTokenData()}, ExistingServiceAccount: serviceAccount(tokenSecretReferences()), UpdatedSecret: serviceAccountTokenSecretWithoutTokenData(), ExpectedActions: []testclient.Action{ testclient.NewUpdateAction("secrets", api.NamespaceDefault, serviceAccountTokenSecret()), }, }, "updated token secret without ca data": { ClientObjects: []runtime.Object{serviceAccountTokenSecretWithoutCAData()}, ExistingServiceAccount: serviceAccount(tokenSecretReferences()), UpdatedSecret: serviceAccountTokenSecretWithoutCAData(), ExpectedActions: []testclient.Action{ testclient.NewUpdateAction("secrets", api.NamespaceDefault, serviceAccountTokenSecret()), }, }, "updated token secret with mismatched ca data": { ClientObjects: []runtime.Object{serviceAccountTokenSecretWithCAData([]byte("mismatched"))}, ExistingServiceAccount: serviceAccount(tokenSecretReferences()), UpdatedSecret: serviceAccountTokenSecretWithCAData([]byte("mismatched")), ExpectedActions: []testclient.Action{ testclient.NewUpdateAction("secrets", api.NamespaceDefault, serviceAccountTokenSecret()), }, }, "deleted secret without serviceaccount": { DeletedSecret: serviceAccountTokenSecret(), ExpectedActions: []testclient.Action{}, }, "deleted secret with serviceaccount with reference": { ClientObjects: []runtime.Object{serviceAccount(tokenSecretReferences())}, ExistingServiceAccount: serviceAccount(tokenSecretReferences()), DeletedSecret: serviceAccountTokenSecret(), ExpectedActions: []testclient.Action{ testclient.NewGetAction("serviceaccounts", api.NamespaceDefault, "default"), testclient.NewUpdateAction("serviceaccounts", api.NamespaceDefault, serviceAccount(emptySecretReferences())), }, }, "deleted secret with serviceaccount without reference": { ExistingServiceAccount: serviceAccount(emptySecretReferences()), DeletedSecret: serviceAccountTokenSecret(), ExpectedActions: []testclient.Action{}, }, } for k, tc := range testcases { // Re-seed to reset name generation utilrand.Seed(1) generator := &testGenerator{Token: "ABC"} client := testclient.NewSimpleFake(tc.ClientObjects...) controller := NewTokensController(client, TokensControllerOptions{TokenGenerator: generator, RootCA: []byte("CA Data")}) // Tell the token controller whether its stores have been synced controller.serviceAccountsSynced = func() bool { return !tc.ServiceAccountsSyncPending } controller.secretsSynced = func() bool { return !tc.SecretsSyncPending } if tc.ExistingServiceAccount != nil { controller.serviceAccounts.Add(tc.ExistingServiceAccount) } for _, s := range tc.ExistingSecrets { controller.secrets.Add(s) } if tc.AddedServiceAccount != nil { controller.serviceAccountAdded(tc.AddedServiceAccount) } if tc.UpdatedServiceAccount != nil { controller.serviceAccountUpdated(nil, tc.UpdatedServiceAccount) } if tc.DeletedServiceAccount != nil { controller.serviceAccountDeleted(tc.DeletedServiceAccount) } if tc.AddedSecret != nil { controller.secretAdded(tc.AddedSecret) } if tc.UpdatedSecret != nil { controller.secretUpdated(nil, tc.UpdatedSecret) } if tc.DeletedSecret != nil { controller.secretDeleted(tc.DeletedSecret) } actions := client.Actions() for i, action := range actions { if len(tc.ExpectedActions) < i+1 { t.Errorf("%s: %d unexpected actions: %+v", k, len(actions)-len(tc.ExpectedActions), actions[i:]) break } expectedAction := tc.ExpectedActions[i] if !reflect.DeepEqual(expectedAction, action) { t.Errorf("%s: Expected\n\t%#v\ngot\n\t%#v", k, expectedAction, action) continue } } if len(tc.ExpectedActions) > len(actions) { t.Errorf("%s: %d additional expected actions:%+v", k, len(tc.ExpectedActions)-len(actions), tc.ExpectedActions[len(actions):]) } } }