func TestRolling_deployInitial(t *testing.T) { initialStrategyInvoked := false strategy := &RollingDeploymentStrategy{ decoder: kapi.Codecs.UniversalDecoder(), rcClient: ktestclient.NewSimpleFake(), eventClient: ktestclient.NewSimpleFake(), initialStrategy: &testStrategy{ deployFn: func(from *kapi.ReplicationController, to *kapi.ReplicationController, desiredReplicas int, updateAcceptor strat.UpdateAcceptor) error { initialStrategyInvoked = true return nil }, }, rollingUpdate: func(config *kubectl.RollingUpdaterConfig) error { t.Fatalf("unexpected call to rollingUpdate") return nil }, getUpdateAcceptor: getUpdateAcceptor, apiRetryPeriod: 1 * time.Millisecond, apiRetryTimeout: 10 * time.Millisecond, } config := deploytest.OkDeploymentConfig(1) config.Spec.Strategy = deploytest.OkRollingStrategy() deployment, _ := deployutil.MakeDeployment(config, kapi.Codecs.LegacyCodec(registered.GroupOrDie(kapi.GroupName).GroupVersions[0])) strategy.out, strategy.errOut = &bytes.Buffer{}, &bytes.Buffer{} err := strategy.Deploy(nil, deployment, 2) if err != nil { t.Fatalf("unexpected error: %v", err) } if !initialStrategyInvoked { t.Fatalf("expected initial strategy to be invoked") } }
func TestGetServiceDetail(t *testing.T) { cases := []struct { service *api.Service namespace, name string expectedActions []string expected *ServiceDetail }{ { service: &api.Service{}, namespace: "test-namespace-1", name: "test-name", expectedActions: []string{"get", "list"}, expected: &ServiceDetail{ TypeMeta: common.TypeMeta{Kind: common.ResourceKindService}, PodList: pod.PodList{Pods: []pod.Pod{}}, }, }, { service: &api.Service{ObjectMeta: api.ObjectMeta{ Name: "test-service", Namespace: "test-namespace", }}, namespace: "test-namespace-2", name: "test-name", expectedActions: []string{"get", "list"}, expected: &ServiceDetail{ ObjectMeta: common.ObjectMeta{ Name: "test-service", Namespace: "test-namespace", }, TypeMeta: common.TypeMeta{Kind: common.ResourceKindService}, InternalEndpoint: common.Endpoint{Host: "test-service.test-namespace"}, PodList: pod.PodList{Pods: []pod.Pod{}}, }, }, } for _, c := range cases { fakeClient := testclient.NewSimpleFake(c.service) fakeHeapsterClient := FakeHeapsterClient{client: testclient.NewSimpleFake()} actual, _ := GetServiceDetail(fakeClient, fakeHeapsterClient, c.namespace, c.name) actions := fakeClient.Actions() if len(actions) != len(c.expectedActions) { t.Errorf("Unexpected actions: %v, expected %d actions got %d", actions, len(c.expectedActions), len(actions)) continue } for i, verb := range c.expectedActions { if actions[i].GetVerb() != verb { t.Errorf("Unexpected action: %+v, expected %s", actions[i], verb) } } if !reflect.DeepEqual(actual, c.expected) { t.Errorf("GetServiceDetail(client, %#v, %#v) == \ngot %#v, \nexpected %#v", c.namespace, c.name, actual, c.expected) } } }
func TestGetReplicaSetDetail(t *testing.T) { eventList := &api.EventList{} podList := &api.PodList{} cases := []struct { namespace, name string expectedActions []string replicaSet *extensions.ReplicaSet expected *ReplicaSetDetail }{ { "test-namespace", "test-name", []string{"get", "list", "list", "get", "list", "list"}, &extensions.ReplicaSet{ ObjectMeta: api.ObjectMeta{Name: "test-replicaset"}, Spec: extensions.ReplicaSetSpec{ Selector: &unversioned.LabelSelector{ MatchLabels: map[string]string{}, }}, }, &ReplicaSetDetail{ ObjectMeta: common.ObjectMeta{Name: "test-replicaset"}, TypeMeta: common.TypeMeta{Kind: common.ResourceKindReplicaSet}, PodInfo: common.PodInfo{Warnings: []common.Event{}}, PodList: pod.PodList{Pods: []pod.Pod{}}, EventList: common.EventList{Events: []common.Event{}}, }, }, } for _, c := range cases { fakeClient := testclient.NewSimpleFake(c.replicaSet, podList, eventList, c.replicaSet, podList, eventList) fakeHeapsterClient := FakeHeapsterClient{client: testclient.NewSimpleFake()} actual, _ := GetReplicaSetDetail(fakeClient, fakeHeapsterClient, c.namespace, c.name) actions := fakeClient.Actions() if len(actions) != len(c.expectedActions) { t.Errorf("Unexpected actions: %v, expected %d actions got %d", actions, len(c.expectedActions), len(actions)) continue } for i, verb := range c.expectedActions { if actions[i].GetVerb() != verb { t.Errorf("Unexpected action: %+v, expected %s", actions[i], verb) } } if !reflect.DeepEqual(actual, c.expected) { t.Errorf("GetEvents(client,heapsterClient,%#v, %#v) == \ngot: %#v, \nexpected %#v", c.namespace, c.name, actual, c.expected) } } }
// TestRolling_deployInitialHooks can go away once the rolling strategy // supports initial deployments. func TestRolling_deployInitialHooks(t *testing.T) { var hookError error strategy := &RollingDeploymentStrategy{ decoder: kapi.Codecs.UniversalDecoder(), rcClient: ktestclient.NewSimpleFake(), eventClient: ktestclient.NewSimpleFake(), initialStrategy: &testStrategy{ deployFn: func(from *kapi.ReplicationController, to *kapi.ReplicationController, desiredReplicas int, updateAcceptor strat.UpdateAcceptor) error { return nil }, }, rollingUpdate: func(config *kubectl.RollingUpdaterConfig) error { return nil }, hookExecutor: &hookExecutorImpl{ executeFunc: func(hook *deployapi.LifecycleHook, deployment *kapi.ReplicationController, suffix, label string) error { return hookError }, }, getUpdateAcceptor: getUpdateAcceptor, apiRetryPeriod: 1 * time.Millisecond, apiRetryTimeout: 10 * time.Millisecond, } cases := []struct { params *deployapi.RollingDeploymentStrategyParams hookShouldFail bool deploymentShouldFail bool }{ {rollingParams(deployapi.LifecycleHookFailurePolicyAbort, ""), true, true}, {rollingParams(deployapi.LifecycleHookFailurePolicyAbort, ""), false, false}, {rollingParams("", deployapi.LifecycleHookFailurePolicyAbort), true, true}, {rollingParams("", deployapi.LifecycleHookFailurePolicyAbort), false, false}, } for i, tc := range cases { config := deploytest.OkDeploymentConfig(2) config.Spec.Strategy.RollingParams = tc.params deployment, _ := deployutil.MakeDeployment(config, kapi.Codecs.LegacyCodec(registered.GroupOrDie(kapi.GroupName).GroupVersions[0])) hookError = nil if tc.hookShouldFail { hookError = fmt.Errorf("hook failure") } strategy.out, strategy.errOut = &bytes.Buffer{}, &bytes.Buffer{} err := strategy.Deploy(nil, deployment, 2) if err != nil && tc.deploymentShouldFail { t.Logf("got expected error: %v", err) } if err == nil && tc.deploymentShouldFail { t.Errorf("%d: expected an error for case: %v", i, tc) } if err != nil && !tc.deploymentShouldFail { t.Errorf("%d: unexpected error for case: %v: %v", i, tc, err) } } }
func TestPlugin(t *testing.T) { var ( testPodUID = types.UID("test_pod_uid") testVolumeName = "test_volume_name" testNamespace = "test_secret_namespace" testName = "test_secret_name" volumeSpec = volumeSpec(testVolumeName, testName) secret = secret(testNamespace, testName) client = testclient.NewSimpleFake(&secret) pluginMgr = volume.VolumePluginMgr{} rootDir, host = newTestHost(t, client) ) pluginMgr.InitPlugins(ProbeVolumePlugins(), host) plugin, err := pluginMgr.FindPluginByName(secretPluginName) if err != nil { t.Errorf("Can't find the plugin by name") } pod := &api.Pod{ObjectMeta: api.ObjectMeta{UID: testPodUID}} builder, err := plugin.NewBuilder(volume.NewSpecFromVolume(volumeSpec), pod, volume.VolumeOptions{}) if err != nil { t.Errorf("Failed to make a new Builder: %v", err) } if builder == nil { t.Errorf("Got a nil Builder") } volumePath := builder.GetPath() if !strings.HasSuffix(volumePath, fmt.Sprintf("pods/test_pod_uid/volumes/kubernetes.io~secret/test_volume_name")) { t.Errorf("Got unexpected path: %s", volumePath) } err = builder.SetUp() if err != nil { t.Errorf("Failed to setup volume: %v", err) } if _, err := os.Stat(volumePath); err != nil { if os.IsNotExist(err) { t.Errorf("SetUp() failed, volume path not created: %s", volumePath) } else { t.Errorf("SetUp() failed: %v", err) } } // secret volume should create its own empty wrapper path podWrapperMetadataDir := fmt.Sprintf("%v/pods/test_pod_uid/plugins/kubernetes.io~empty-dir/wrapped_test_volume_name", rootDir) if _, err := os.Stat(podWrapperMetadataDir); err != nil { if os.IsNotExist(err) { t.Errorf("SetUp() failed, empty-dir wrapper path is not created: %s", podWrapperMetadataDir) } else { t.Errorf("SetUp() failed: %v", err) } } doTestSecretDataInVolume(volumePath, secret, t) doTestCleanAndTeardown(plugin, testPodUID, testVolumeName, volumePath, t) }
func TestPodWithUID(t *testing.T) { client := testclient.NewSimpleFake() enforcer := NewUidEnforcer(client) testPod := validPod("test", 2) userInfo := &user.DefaultInfo{ Name: "test", UID: "50", Groups: nil, } err := enforcer.Admit(admission.NewAttributesRecord(&testPod, "Pod", "test", "testPod", "pods", "", admission.Update, userInfo)) if err != nil { t.Errorf("%+v", err) } for _, v := range testPod.Spec.Containers { if v.SecurityContext != nil { if *v.SecurityContext.RunAsUser != 50 { t.Errorf("WTF!") } } else { t.Errorf("Uh, no SecurityContext!") } } }
func TestDeploymentPruneNamespaced(t *testing.T) { kFake := ktestclient.NewSimpleFake() osFake := testclient.NewSimpleFake() opts := &PruneDeploymentsOptions{ Namespace: "foo", OSClient: osFake, KClient: kFake, Out: ioutil.Discard, } if err := opts.Run(); err != nil { t.Errorf("Unexpected error: %v", err) } if len(osFake.Actions()) == 0 || len(kFake.Actions()) == 0 { t.Errorf("Missing get deployments actions") } for _, a := range osFake.Actions() { if a.GetNamespace() != "foo" { t.Errorf("Unexpected namespace while pruning %s: %s", a.GetResource(), a.GetNamespace()) } } for _, a := range kFake.Actions() { if a.GetNamespace() != "foo" { t.Errorf("Unexpected namespace while pruning %s: %s", a.GetResource(), a.GetNamespace()) } } }
func TestIncrementUsagePods(t *testing.T) { namespace := "default" client := testclient.NewSimpleFake(&api.PodList{ Items: []api.Pod{ { ObjectMeta: api.ObjectMeta{Name: "123", Namespace: namespace}, Spec: api.PodSpec{ Volumes: []api.Volume{{Name: "vol"}}, Containers: []api.Container{{Name: "ctr", Image: "image", Resources: getResourceRequirements("100m", "1Gi")}}, }, }, }, }) status := &api.ResourceQuotaStatus{ Hard: api.ResourceList{}, Used: api.ResourceList{}, } r := api.ResourcePods status.Hard[r] = resource.MustParse("2") status.Used[r] = resource.MustParse("1") dirty, err := IncrementUsage(admission.NewAttributesRecord(&api.Pod{}, "Pod", namespace, "name", "pods", "", admission.Create, nil), status, client) if err != nil { t.Errorf("Unexpected error: %v", err) } if !dirty { t.Errorf("Expected the status to get incremented, therefore should have been dirty") } quantity := status.Used[r] if quantity.Value() != int64(2) { t.Errorf("Expected new item count to be 2, but was %s", quantity.String()) } }
func TestIncrementUsageReplicationControllers(t *testing.T) { namespace := "default" client := testclient.NewSimpleFake(&api.ReplicationControllerList{ Items: []api.ReplicationController{ { ObjectMeta: api.ObjectMeta{Name: "123", Namespace: namespace}, }, }, }) status := &api.ResourceQuotaStatus{ Hard: api.ResourceList{}, Used: api.ResourceList{}, } r := api.ResourceReplicationControllers status.Hard[r] = resource.MustParse("2") status.Used[r] = resource.MustParse("1") dirty, err := IncrementUsage(admission.NewAttributesRecord(&api.ReplicationController{}, "ReplicationController", namespace, "name", "replicationcontrollers", "", admission.Create, nil), status, client) if err != nil { t.Errorf("Unexpected error: %v", err) } if !dirty { t.Errorf("Expected the status to get incremented, therefore should have been dirty") } quantity := status.Used[r] if quantity.Value() != int64(2) { t.Errorf("Expected new item count to be 2, but was %s", quantity.String()) } }
func TestExceedUsagePods(t *testing.T) { namespace := "default" client := testclient.NewSimpleFake(&api.PodList{ Items: []api.Pod{ { ObjectMeta: api.ObjectMeta{Name: "123", Namespace: namespace}, Spec: api.PodSpec{ Volumes: []api.Volume{{Name: "vol"}}, Containers: []api.Container{{Name: "ctr", Image: "image", Resources: getResourceRequirements("100m", "1Gi")}}, }, }, }, }) status := &api.ResourceQuotaStatus{ Hard: api.ResourceList{}, Used: api.ResourceList{}, } r := api.ResourcePods status.Hard[r] = resource.MustParse("1") status.Used[r] = resource.MustParse("1") _, err := IncrementUsage(admission.NewAttributesRecord(&api.Pod{}, "Pod", namespace, "name", "pods", "", admission.Create, nil), status, client) if err == nil { t.Errorf("Expected error because this would exceed your quota") } }
func TestUnboundedMemory(t *testing.T) { namespace := "default" client := testclient.NewSimpleFake(&api.PodList{ Items: []api.Pod{ { ObjectMeta: api.ObjectMeta{Name: "123", Namespace: namespace}, Spec: api.PodSpec{ Volumes: []api.Volume{{Name: "vol"}}, Containers: []api.Container{{Name: "ctr", Image: "image", Resources: getResourceRequirements("100m", "1Gi")}}, }, }, }, }) status := &api.ResourceQuotaStatus{ Hard: api.ResourceList{}, Used: api.ResourceList{}, } r := api.ResourceMemory status.Hard[r] = resource.MustParse("10Gi") status.Used[r] = resource.MustParse("1Gi") newPod := &api.Pod{ ObjectMeta: api.ObjectMeta{Name: "123", Namespace: namespace}, Spec: api.PodSpec{ Volumes: []api.Volume{{Name: "vol"}}, Containers: []api.Container{{Name: "ctr", Image: "image", Resources: getResourceRequirements("250m", "0")}}, }} _, err := IncrementUsage(admission.NewAttributesRecord(newPod, "Pod", namespace, "name", "pods", "", admission.Create, nil), status, client) if err == nil { t.Errorf("Expected memory unbounded usage error") } }
func (r *testRegistry) Repository(ctx context.Context, ref reference.Named) (distribution.Repository, error) { repo, err := r.Namespace.Repository(ctx, ref) if err != nil { return nil, err } kFakeClient := ktestclient.NewSimpleFake() parts := strings.SplitN(ref.Name(), "/", 3) if len(parts) != 2 { return nil, fmt.Errorf("failed to parse repository name %q", ref.Name()) } return &repository{ Repository: repo, ctx: ctx, quotaClient: kFakeClient, limitClient: kFakeClient, registryOSClient: r.osClient, registryAddr: "localhost:5000", namespace: parts[0], name: parts[1], blobrepositorycachettl: r.blobrepositorycachettl, cachedLayers: cachedLayers, pullthrough: r.pullthrough, }, nil }
func TestListProjects(t *testing.T) { namespaceList := kapi.NamespaceList{ Items: []kapi.Namespace{ { ObjectMeta: kapi.ObjectMeta{Name: "foo"}, }, }, } mockClient := testclient.NewSimpleFake(&namespaceList) storage := REST{ client: mockClient.Namespaces(), lister: &mockLister{&namespaceList}, } user := &user.DefaultInfo{ Name: "test-user", UID: "test-uid", Groups: []string{"test-groups"}, } ctx := kapi.WithUser(kapi.NewContext(), user) response, err := storage.List(ctx, labels.Everything(), fields.Everything()) if err != nil { t.Errorf("%#v should be nil.", err) } projects := response.(*api.ProjectList) if len(projects.Items) != 1 { t.Errorf("%#v projects.Items should have len 1.", projects.Items) } responseProject := projects.Items[0] if e, r := responseProject.Name, "foo"; e != r { t.Errorf("%#v != %#v.", e, r) } }
func TestDoNotDeleteMirrorPods(t *testing.T) { staticPod := getTestPod() staticPod.Annotations = map[string]string{kubetypes.ConfigSourceAnnotationKey: "file"} mirrorPod := getTestPod() mirrorPod.UID = "mirror-12345678" mirrorPod.Annotations = map[string]string{ kubetypes.ConfigSourceAnnotationKey: "api", kubetypes.ConfigMirrorAnnotationKey: "mirror", } // Set the deletion timestamp. mirrorPod.DeletionTimestamp = new(unversioned.Time) client := testclient.NewSimpleFake(mirrorPod) m := newTestManager(client) m.podManager.AddPod(staticPod) m.podManager.AddPod(mirrorPod) // Verify setup. assert.True(t, kubepod.IsStaticPod(staticPod), "SetUp error: staticPod") assert.True(t, kubepod.IsMirrorPod(mirrorPod), "SetUp error: mirrorPod") assert.Equal(t, m.podManager.TranslatePodUID(mirrorPod.UID), staticPod.UID) status := getRandomPodStatus() now := unversioned.Now() status.StartTime = &now m.SetPodStatus(staticPod, status) m.testSyncBatch() // Expect not to see an delete action. verifyActions(t, m.kubeClient, []testclient.Action{ testclient.GetActionImpl{ActionImpl: testclient.ActionImpl{Verb: "get", Resource: "pods"}}, testclient.UpdateActionImpl{ActionImpl: testclient.ActionImpl{Verb: "update", Resource: "pods", Subresource: "status"}}, }) }
// mockREST mocks a DeploymentLog REST func mockREST(version, desired int, endStatus api.DeploymentStatus) *REST { // Fake deploymentConfig config := deploytest.OkDeploymentConfig(version) fakeDn := testclient.NewSimpleFake(config) fakeDn.PrependReactor("get", "deploymentconfigs", func(action ktestclient.Action) (handled bool, ret runtime.Object, err error) { return true, config, nil }) // Fake deployments fakeDeployments := makeDeploymentList(version) fakeRn := ktestclient.NewSimpleFake(fakeDeployments) fakeRn.PrependReactor("get", "replicationcontrollers", func(action ktestclient.Action) (handled bool, ret runtime.Object, err error) { return true, &fakeDeployments.Items[desired-1], nil }) // Fake watcher for deployments fakeWatch := watch.NewFake() fakeRn.PrependWatchReactor("replicationcontrollers", ktestclient.DefaultWatchReactor(fakeWatch, nil)) // Everything is fake connectionInfo := &kclient.HTTPKubeletClient{Config: &kclient.KubeletConfig{EnableHttps: true, Port: 12345}, Client: &http.Client{}} obj := &fakeDeployments.Items[desired-1] obj.Annotations[api.DeploymentStatusAnnotation] = string(endStatus) go fakeWatch.Add(obj) return &REST{ ConfigGetter: fakeDn, DeploymentGetter: fakeRn, PodGetter: &deployerPodGetter{}, ConnectionInfo: connectionInfo, Timeout: defaultTimeout, } }
func TestGetFirstPod(t *testing.T) { tests := []struct { name string pods []api.Pod expected string err bool }{ { name: "with a ready pod", pods: []api.Pod{mockTillerPod()}, expected: "orca", }, { name: "without a ready pod", pods: []api.Pod{mockTillerPodPending()}, err: true, }, { name: "without a pod", pods: []api.Pod{}, err: true, }, } for _, tt := range tests { client := testclient.NewSimpleFake(&api.PodList{Items: tt.pods}) name, err := getTillerPodName(client, api.NamespaceDefault) if (err != nil) != tt.err { t.Errorf("%q. expected error: %v, got %v", tt.name, tt.err, err) } if name != tt.expected { t.Errorf("%q. expected %q, got %q", tt.name, tt.expected, name) } } }
func TestSyncResourceQuotaNoChange(t *testing.T) { quota := api.ResourceQuota{ Spec: api.ResourceQuotaSpec{ Hard: api.ResourceList{ api.ResourceCPU: resource.MustParse("4"), }, }, Status: api.ResourceQuotaStatus{ Hard: api.ResourceList{ api.ResourceCPU: resource.MustParse("4"), }, Used: api.ResourceList{ api.ResourceCPU: resource.MustParse("0"), }, }, } kubeClient := testclient.NewSimpleFake(&api.PodList{}, "a) ResourceQuotaController := NewResourceQuotaController(kubeClient, controller.StaticResyncPeriodFunc(time.Second)) err := ResourceQuotaController.syncResourceQuota(quota) if err != nil { t.Fatalf("Unexpected error %v", err) } actions := kubeClient.Actions() if len(actions) != 1 && !actions[0].Matches("list", "pods") { t.Errorf("SyncResourceQuota made an unexpected client action when state was not dirty: %v", kubeClient.Actions) } }
func controllerSetup(startingObjects []runtime.Object, stopChannel chan struct{}, t *testing.T) ( /*caName*/ string, *ktestclient.Fake, *watch.FakeWatcher, *ServiceServingCertController) { certDir, err := ioutil.TempDir("", "serving-cert-unit-") if err != nil { t.Fatalf("unexpected error: %v", err) } caInfo := admin.DefaultServiceSignerCAInfo(certDir) caOptions := admin.CreateSignerCertOptions{ CertFile: caInfo.CertFile, KeyFile: caInfo.KeyFile, Name: admin.DefaultServiceServingCertSignerName(), Output: ioutil.Discard, } ca, err := caOptions.CreateSignerCert() if err != nil { t.Fatalf("unexpected error: %v", err) } kubeclient := ktestclient.NewSimpleFake(startingObjects...) fakeWatch := watch.NewFake() kubeclient.PrependReactor("create", "*", func(action ktestclient.Action) (handled bool, ret runtime.Object, err error) { return true, action.(ktestclient.CreateAction).GetObject(), nil }) kubeclient.PrependReactor("update", "*", func(action ktestclient.Action) (handled bool, ret runtime.Object, err error) { return true, action.(ktestclient.UpdateAction).GetObject(), nil }) kubeclient.PrependWatchReactor("*", ktestclient.DefaultWatchReactor(fakeWatch, nil)) controller := NewServiceServingCertController(kubeclient, kubeclient, ca, "cluster.local", 10*time.Minute) return caOptions.Name, kubeclient, fakeWatch, controller }
func TestDeployWithResourceRequirements(t *testing.T) { cpuRequirement := resource.Quantity{} memoryRequirement := resource.Quantity{} spec := &AppDeploymentSpec{ Namespace: "foo-namespace", Name: "foo-name", CpuRequirement: &cpuRequirement, MemoryRequirement: &memoryRequirement, } expectedResources := api.ResourceRequirements{ Requests: map[api.ResourceName]resource.Quantity{ api.ResourceMemory: memoryRequirement, api.ResourceCPU: cpuRequirement, }, } testClient := testclient.NewSimpleFake() DeployApp(spec, testClient) createAction := testClient.Actions()[0].(testclient.CreateActionImpl) rc := createAction.GetObject().(*api.ReplicationController) container := rc.Spec.Template.Spec.Containers[0] if !reflect.DeepEqual(container.Resources, expectedResources) { t.Errorf("Expected resource requirements to be %#v but got %#v", expectedResources, container.Resources) } }
func TestDeployAppContainerCommands(t *testing.T) { command := "foo-command" commandArgs := "foo-command-args" spec := &AppDeploymentSpec{ Namespace: "foo-namespace", Name: "foo-name", ContainerCommand: &command, ContainerCommandArgs: &commandArgs, } testClient := testclient.NewSimpleFake() DeployApp(spec, testClient) createAction := testClient.Actions()[0].(testclient.CreateActionImpl) rc := createAction.GetObject().(*api.ReplicationController) container := rc.Spec.Template.Spec.Containers[0] if container.Command[0] != command { t.Errorf("Expected command to be %#v but got %#v", command, container.Command) } if container.Args[0] != commandArgs { t.Errorf("Expected command args to be %#v but got %#v", commandArgs, container.Args) } }
func TestRecreate_deploymentPreHookFail(t *testing.T) { config := deploytest.OkDeploymentConfig(1) config.Spec.Strategy = recreateParams(30, deployapi.LifecycleHookFailurePolicyAbort, "", "") deployment, _ := deployutil.MakeDeployment(config, kapi.Codecs.LegacyCodec(registered.GroupOrDie(kapi.GroupName).GroupVersions[0])) scaler := &cmdtest.FakeScaler{} strategy := &RecreateDeploymentStrategy{ out: &bytes.Buffer{}, errOut: &bytes.Buffer{}, decoder: kapi.Codecs.UniversalDecoder(), retryTimeout: 1 * time.Second, retryPeriod: 1 * time.Millisecond, getUpdateAcceptor: getUpdateAcceptor, eventClient: ktestclient.NewSimpleFake(), rcClient: &fakeControllerClient{deployment: deployment}, hookExecutor: &hookExecutorImpl{ executeFunc: func(hook *deployapi.LifecycleHook, deployment *kapi.ReplicationController, suffix, label string) error { return fmt.Errorf("hook execution failure") }, }, scaler: scaler, } err := strategy.Deploy(nil, deployment, 2) if err == nil { t.Fatalf("expected a deploy error") } if len(scaler.Events) > 0 { t.Fatalf("unexpected scaling events: %v", scaler.Events) } }
func TestServiceResolverCacheEmpty(t *testing.T) { fakeClient := testclient.NewSimpleFake(&api.Service{ ObjectMeta: api.ObjectMeta{ Name: "foo", }, Spec: api.ServiceSpec{ Ports: []api.ServicePort{{Port: 80}}, }, }) cache := NewServiceResolverCache(fakeClient.Services("default").Get) if v, ok := cache.resolve("FOO_SERVICE_HOST"); v != "" || !ok { t.Errorf("unexpected cache item") } if len(fakeClient.Actions()) != 1 { t.Errorf("unexpected client actions: %#v", fakeClient.Actions()) } cache.resolve("FOO_SERVICE_HOST") if len(fakeClient.Actions()) != 1 { t.Errorf("unexpected cache miss: %#v", fakeClient.Actions()) } cache.resolve("FOO_SERVICE_PORT") if len(fakeClient.Actions()) != 1 { t.Errorf("unexpected cache miss: %#v", fakeClient.Actions()) } }
func TestRecreate_deploymentPostHookSuccess(t *testing.T) { config := deploytest.OkDeploymentConfig(1) config.Spec.Strategy = recreateParams(30, "", "", deployapi.LifecycleHookFailurePolicyAbort) deployment, _ := deployutil.MakeDeployment(config, kapi.Codecs.LegacyCodec(registered.GroupOrDie(kapi.GroupName).GroupVersions[0])) scaler := &cmdtest.FakeScaler{} hookExecuted := false strategy := &RecreateDeploymentStrategy{ out: &bytes.Buffer{}, errOut: &bytes.Buffer{}, decoder: kapi.Codecs.UniversalDecoder(), retryTimeout: 1 * time.Second, retryPeriod: 1 * time.Millisecond, rcClient: &fakeControllerClient{deployment: deployment}, eventClient: ktestclient.NewSimpleFake(), getUpdateAcceptor: getUpdateAcceptor, hookExecutor: &hookExecutorImpl{ executeFunc: func(hook *deployapi.LifecycleHook, deployment *kapi.ReplicationController, suffix, label string) error { hookExecuted = true return nil }, }, scaler: scaler, } err := strategy.Deploy(nil, deployment, 2) if err != nil { t.Fatalf("unexpected deploy error: %#v", err) } if !hookExecuted { t.Fatalf("expected hook execution") } }
func TestRecreate_initialDeployment(t *testing.T) { var deployment *kapi.ReplicationController scaler := &cmdtest.FakeScaler{} strategy := &RecreateDeploymentStrategy{ out: &bytes.Buffer{}, errOut: &bytes.Buffer{}, decoder: kapi.Codecs.UniversalDecoder(), retryTimeout: 1 * time.Second, retryPeriod: 1 * time.Millisecond, getUpdateAcceptor: getUpdateAcceptor, scaler: scaler, eventClient: ktestclient.NewSimpleFake(), } config := deploytest.OkDeploymentConfig(1) config.Spec.Strategy = recreateParams(30, "", "", "") deployment, _ = deployutil.MakeDeployment(config, kapi.Codecs.LegacyCodec(registered.GroupOrDie(kapi.GroupName).GroupVersions[0])) strategy.rcClient = &fakeControllerClient{deployment: deployment} err := strategy.Deploy(nil, deployment, 3) if err != nil { t.Fatalf("unexpected deploy error: %#v", err) } if e, a := 1, len(scaler.Events); e != a { t.Fatalf("expected %d scale calls, got %d", e, a) } if e, a := uint(3), scaler.Events[0].Size; e != a { t.Errorf("expected scale up to %d, got %d", e, a) } }
func TestRolling_deployInitial(t *testing.T) { initialStrategyInvoked := false strategy := &RollingDeploymentStrategy{ codec: api.Codec, client: ktestclient.NewSimpleFake(), initialStrategy: &testStrategy{ deployFn: func(from *kapi.ReplicationController, to *kapi.ReplicationController, desiredReplicas int, updateAcceptor strat.UpdateAcceptor) error { initialStrategyInvoked = true return nil }, }, rollingUpdate: func(config *kubectl.RollingUpdaterConfig) error { t.Fatalf("unexpected call to rollingUpdate") return nil }, getUpdateAcceptor: getUpdateAcceptor, apiRetryPeriod: 1 * time.Millisecond, apiRetryTimeout: 10 * time.Millisecond, } config := deploytest.OkDeploymentConfig(1) config.Template.Strategy = deploytest.OkRollingStrategy() deployment, _ := deployutil.MakeDeployment(config, kapi.Codec) err := strategy.Deploy(nil, deployment, 2) if err != nil { t.Fatalf("unexpected error: %v", err) } if !initialStrategyInvoked { t.Fatalf("expected initial strategy to be invoked") } }
func TestReplicationControllerStop(t *testing.T) { name := "foo" ns := "default" fake := testclient.NewSimpleFake(&api.ReplicationController{ ObjectMeta: api.ObjectMeta{ Name: name, Namespace: ns, }, Spec: api.ReplicationControllerSpec{ Replicas: 0, }, }) reaper := ReplicationControllerReaper{fake, time.Millisecond, time.Millisecond} s, err := reaper.Stop(ns, name, 0, nil) if err != nil { t.Errorf("unexpected error: %v", err) } expected := "foo stopped" if s != expected { t.Errorf("expected %s, got %s", expected, s) } actions := fake.Actions() if len(actions) != 7 { t.Errorf("unexpected actions: %v, expected 6 actions (get, list, get, update, get, get, delete)", fake.Actions) } for i, verb := range []string{"get", "list", "get", "update", "get", "get", "delete"} { if actions[i].GetResource() != "replicationcontrollers" { t.Errorf("unexpected action: %+v, expected %s-replicationController", actions[i], verb) continue } if actions[i].GetVerb() != verb { t.Errorf("unexpected action: %+v, expected %s-replicationController", actions[i], verb) } } }
func TestName(t *testing.T) { var ( testPodUID = types.UID("test_pod_uid") testVolumeName = "test_name" testNamespace = "test_metadata_namespace" testName = "test_metadata_name" ) volumeSpec := &api.Volume{ Name: testVolumeName, VolumeSource: api.VolumeSource{ DownwardAPI: &api.DownwardAPIVolumeSource{ Items: []api.DownwardAPIVolumeFile{ {Path: "name_file_name", FieldRef: api.ObjectFieldSelector{ FieldPath: "metadata.name"}}}}, }, } fake := testclient.NewSimpleFake(&api.Pod{ ObjectMeta: api.ObjectMeta{ Name: testName, Namespace: testNamespace, }, }) pluginMgr := volume.VolumePluginMgr{} pluginMgr.InitPlugins(ProbeVolumePlugins(), newTestHost(t, fake)) plugin, err := pluginMgr.FindPluginByName(downwardAPIPluginName) if err != nil { t.Errorf("Can't find the plugin by name") } pod := &api.Pod{ObjectMeta: api.ObjectMeta{UID: testPodUID, Name: testName}} builder, err := plugin.NewBuilder(volume.NewSpecFromVolume(volumeSpec), pod, volume.VolumeOptions{}, &mount.FakeMounter{}) if err != nil { t.Errorf("Failed to make a new Builder: %v", err) } if builder == nil { t.Errorf("Got a nil Builder") } volumePath := builder.GetPath() err = builder.SetUp() if err != nil { t.Errorf("Failed to setup volume: %v", err) } var data []byte data, err = ioutil.ReadFile(path.Join(volumePath, "name_file_name")) if err != nil { t.Errorf(err.Error()) } if string(data) != testName { t.Errorf("Found `%s` expected %s", string(data), testName) } CleanEverything(plugin, testVolumeName, volumePath, testPodUID, t) }
func TestLimitRangerIgnoresSubresource(t *testing.T) { client := testclient.NewSimpleFake() indexer := cache.NewIndexer(cache.MetaNamespaceKeyFunc, cache.Indexers{"namespace": cache.MetaNamespaceIndexFunc}) handler := &limitRanger{ Handler: admission.NewHandler(admission.Create, admission.Update), client: client, limitFunc: Limit, indexer: indexer, } limitRange := validLimitRangeNoDefaults() testPod := validPod("testPod", 1, api.ResourceRequirements{}) indexer.Add(&limitRange) err := handler.Admit(admission.NewAttributesRecord(&testPod, api.Kind("Pod"), limitRange.Namespace, "testPod", api.Resource("pods"), "", admission.Update, nil)) if err == nil { t.Errorf("Expected an error since the pod did not specify resource limits in its update call") } err = handler.Admit(admission.NewAttributesRecord(&testPod, api.Kind("Pod"), limitRange.Namespace, "testPod", api.Resource("pods"), "status", admission.Update, nil)) if err != nil { t.Errorf("Should have ignored calls to any subresource of pod %v", err) } }
func TestGetDaemonSetEvents(t *testing.T) { cases := []struct { namespace, name string eventList *api.EventList podList *api.PodList daemonSet *extensions.DaemonSet expectedActions []string expected *common.EventList }{ { "test-namespace", "test-name", &api.EventList{Items: []api.Event{ {Message: "test-message", ObjectMeta: api.ObjectMeta{Namespace: "test-namespace"}}, }}, &api.PodList{Items: []api.Pod{{ObjectMeta: api.ObjectMeta{Name: "test-pod"}}}}, &extensions.DaemonSet{ ObjectMeta: api.ObjectMeta{Name: "test-daemonset"}, Spec: extensions.DaemonSetSpec{ Selector: &unversioned.LabelSelector{ MatchLabels: map[string]string{}, }}}, []string{"list", "get", "list", "list"}, &common.EventList{ ListMeta: common.ListMeta{TotalItems: 1}, Events: []common.Event{{ TypeMeta: common.TypeMeta{Kind: common.ResourceKindEvent}, ObjectMeta: common.ObjectMeta{Namespace: "test-namespace"}, Message: "test-message", Type: api.EventTypeNormal, }}}, }, } for _, c := range cases { fakeClient := testclient.NewSimpleFake(c.eventList, c.daemonSet, c.podList, &api.EventList{}) actual, _ := GetDaemonSetEvents(fakeClient, dataselect.NoDataSelect, c.namespace, c.name) actions := fakeClient.Actions() if len(actions) != len(c.expectedActions) { t.Errorf("Unexpected actions: %v, expected %d actions got %d", actions, len(c.expectedActions), len(actions)) continue } for i, verb := range c.expectedActions { if actions[i].GetVerb() != verb { t.Errorf("Unexpected action: %+v, expected %s", actions[i], verb) } } if !reflect.DeepEqual(actual, c.expected) { t.Errorf("GetDaemonSetEvents(client,%#v, %#v) == \ngot: %#v, \nexpected %#v", c.namespace, c.name, actual, c.expected) } } }
func TestStaticPodStatus(t *testing.T) { staticPod := *testPod staticPod.Annotations = map[string]string{kubetypes.ConfigSourceAnnotationKey: "file"} mirrorPod := *testPod mirrorPod.UID = "mirror-12345678" mirrorPod.Annotations = map[string]string{ kubetypes.ConfigSourceAnnotationKey: "api", kubetypes.ConfigMirrorAnnotationKey: "mirror", } client := testclient.NewSimpleFake(&mirrorPod) m := newTestManager(client) m.podManager.AddPod(&staticPod) m.podManager.AddPod(&mirrorPod) // Verify setup. assert.True(t, kubepod.IsStaticPod(&staticPod), "SetUp error: staticPod") assert.True(t, kubepod.IsMirrorPod(&mirrorPod), "SetUp error: mirrorPod") assert.Equal(t, m.podManager.TranslatePodUID(mirrorPod.UID), staticPod.UID) status := getRandomPodStatus() now := unversioned.Now() status.StartTime = &now m.SetPodStatus(&staticPod, status) retrievedStatus := expectPodStatus(t, m, &staticPod) assert.True(t, isStatusEqual(&status, &retrievedStatus), "Expected: %+v, Got: %+v", status, retrievedStatus) retrievedStatus, _ = m.GetPodStatus(mirrorPod.UID) assert.True(t, isStatusEqual(&status, &retrievedStatus), "Expected: %+v, Got: %+v", status, retrievedStatus) // Should translate mirrorPod / staticPod UID. m.testSyncBatch() verifyActions(t, m.kubeClient, []testclient.Action{ testclient.GetActionImpl{ActionImpl: testclient.ActionImpl{Verb: "get", Resource: "pods"}}, testclient.UpdateActionImpl{ActionImpl: testclient.ActionImpl{Verb: "update", Resource: "pods", Subresource: "status"}}, }) updateAction := client.Actions()[1].(testclient.UpdateActionImpl) updatedPod := updateAction.Object.(*api.Pod) assert.Equal(t, mirrorPod.UID, updatedPod.UID, "Expected mirrorPod (%q), but got %q", mirrorPod.UID, updatedPod.UID) assert.True(t, isStatusEqual(&status, &updatedPod.Status), "Expected: %+v, Got: %+v", status, updatedPod.Status) client.ClearActions() // No changes. m.testSyncBatch() verifyActions(t, m.kubeClient, []testclient.Action{}) // Mirror pod identity changes. m.podManager.DeletePod(&mirrorPod) mirrorPod.UID = "new-mirror-pod" mirrorPod.Status = api.PodStatus{} m.podManager.AddPod(&mirrorPod) // Expect update to new mirrorPod. m.testSyncBatch() verifyActions(t, m.kubeClient, []testclient.Action{ testclient.GetActionImpl{ActionImpl: testclient.ActionImpl{Verb: "get", Resource: "pods"}}, testclient.UpdateActionImpl{ActionImpl: testclient.ActionImpl{Verb: "update", Resource: "pods", Subresource: "status"}}, }) updateAction = client.Actions()[1].(testclient.UpdateActionImpl) updatedPod = updateAction.Object.(*api.Pod) assert.Equal(t, mirrorPod.UID, updatedPod.UID, "Expected mirrorPod (%q), but got %q", mirrorPod.UID, updatedPod.UID) assert.True(t, isStatusEqual(&status, &updatedPod.Status), "Expected: %+v, Got: %+v", status, updatedPod.Status) }