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 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, action := range []string{"get", "list", "get", "update", "get", "get", "delete"} { if actions[i].Action != action+"-replicationController" { t.Errorf("unexpected action: %+v, expected %s-replicationController", actions[i], action) } } }
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, "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, "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 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 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, "pods", "", admission.Create, nil), status, client) if err == nil { t.Errorf("Expected error because this would exceed your quota") } }
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{ Metadata: &api.MetadataVolumeSource{ Items: []api.MetadataFile{ {Name: "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(metadataPluginName) 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 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, "pods", "", admission.Create, nil), status, client) if err == nil { t.Errorf("Expected memory unbounded usage error") } }
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) err := ResourceQuotaController.syncResourceQuota(quota) if err != nil { t.Fatalf("Unexpected error %v", err) } actions := kubeClient.Actions() if len(actions) != 1 && actions[0].Action != "list-pods" { t.Errorf("SyncResourceQuota made an unexpected client action when state was not dirty: %v", kubeClient.Actions) } }
func TestReplicationControllerStop(t *testing.T) { fake := testclient.NewSimpleFake(&api.ReplicationController{ Spec: api.ReplicationControllerSpec{ Replicas: 0, }, }) reaper := ReplicationControllerReaper{fake, time.Millisecond, time.Millisecond} name := "foo" s, err := reaper.Stop("default", 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) } if len(fake.Actions) != 5 { t.Errorf("unexpected actions: %v, expected 4 actions (get, get, update, get, delete)", fake.Actions) } for i, action := range []string{"get", "get", "update", "get", "delete"} { if fake.Actions[i].Action != action+"-replicationController" { t.Errorf("unexpected action: %v, expected %s-replicationController", fake.Actions[i], action) } } }
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, "Pod", limitRange.Namespace, "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, "Pod", limitRange.Namespace, "pods", "status", admission.Update, nil)) if err != nil { t.Errorf("Should have ignored calls to any subresource of pod %v", err) } }
// Test the case where the 'ready' file has been created and the pod volume dir // is a mountpoint. Mount should not be called. func TestPluginIdempotent(t *testing.T) { var ( testPodUID = types.UID("test_pod_uid2") 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") } podVolumeDir := fmt.Sprintf("%v/pods/test_pod_uid2/volumes/kubernetes.io~secret/test_volume_name", rootDir) podMetadataDir := fmt.Sprintf("%v/pods/test_pod_uid2/plugins/kubernetes.io~secret/test_volume_name", rootDir) pod := &api.Pod{ObjectMeta: api.ObjectMeta{UID: testPodUID}} mounter := &mount.FakeMounter{} mounter.MountPoints = []mount.MountPoint{ { Path: podVolumeDir, }, } util.SetReady(podMetadataDir) builder, err := plugin.NewBuilder(volume.NewSpecFromVolume(volumeSpec), pod, volume.VolumeOptions{}, mounter) 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) } if len(mounter.Log) != 0 { t.Errorf("Unexpected calls made to mounter: %v", mounter.Log) } if _, err := os.Stat(volumePath); err != nil { if !os.IsNotExist(err) { t.Errorf("SetUp() failed unexpectedly: %v", err) } } else { t.Errorf("volume path should not exist: %v", volumePath) } }
func TestSyncResourceQuotaSpecChange(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("3"), }, Used: api.ResourceList{ api.ResourceCPU: resource.MustParse("0"), }, }, } expectedUsage := api.ResourceQuota{ Status: api.ResourceQuotaStatus{ Hard: api.ResourceList{ api.ResourceCPU: resource.MustParse("4"), }, Used: api.ResourceList{ api.ResourceCPU: resource.MustParse("0"), }, }, } kubeClient := testclient.NewSimpleFake("a) ResourceQuotaController := NewResourceQuotaController(kubeClient) err := ResourceQuotaController.syncResourceQuota(quota) if err != nil { t.Fatalf("Unexpected error %v", err) } usage := kubeClient.Actions()[1].Value.(*api.ResourceQuota) // ensure hard and used limits are what we expected for k, v := range expectedUsage.Status.Hard { actual := usage.Status.Hard[k] actualValue := actual.String() expectedValue := v.String() if expectedValue != actualValue { t.Errorf("Usage Hard: Key: %v, Expected: %v, Actual: %v", k, expectedValue, actualValue) } } for k, v := range expectedUsage.Status.Used { actual := usage.Status.Used[k] actualValue := actual.String() expectedValue := v.String() if expectedValue != actualValue { t.Errorf("Usage Used: Key: %v, Expected: %v, Actual: %v", k, expectedValue, actualValue) } } }
// Test the case where the plugin's ready file exists, but the volume dir is not a // mountpoint, which is the state the system will be in after reboot. The dir // should be mounter and the secret data written to it. func TestPluginReboot(t *testing.T) { var ( testPodUID = types.UID("test_pod_uid3") 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{}, &mount.FakeMounter{}) if err != nil { t.Errorf("Failed to make a new Builder: %v", err) } if builder == nil { t.Errorf("Got a nil Builder") } podMetadataDir := fmt.Sprintf("%v/pods/test_pod_uid3/plugins/kubernetes.io~secret/test_volume_name", rootDir) util.SetReady(podMetadataDir) volumePath := builder.GetPath() if !strings.HasSuffix(volumePath, fmt.Sprintf("pods/test_pod_uid3/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) } } doTestSecretDataInVolume(volumePath, secret, t) doTestCleanAndTeardown(plugin, testPodUID, testVolumeName, volumePath, t) }
func TestGetProjectOK(t *testing.T) { mockClient := testclient.NewSimpleFake(&kapi.Namespace{ObjectMeta: kapi.ObjectMeta{Name: "foo"}}) storage := NewREST(mockClient.Namespaces(), &mockLister{}) project, err := storage.Get(kapi.NewContext(), "foo") if project == nil { t.Error("Unexpected nil project") } if err != nil { t.Errorf("Unexpected non-nil error: %v", err) } if project.(*api.Project).Name != "foo" { t.Errorf("Unexpected project: %#v", project) } }
func mockBuildConfigInstantiator(buildcfg *buildapi.BuildConfig, imageStream *imageapi.ImageStream, image *imageapi.Image) *buildConfigInstantiator { builderAccount := kapi.ServiceAccount{ ObjectMeta: kapi.ObjectMeta{Name: bootstrappolicy.BuilderServiceAccountName}, Secrets: []kapi.ObjectReference{}, } instantiator := &buildConfigInstantiator{} instantiator.buildConfigUpdater = &mockBuildConfigUpdater{} generator := buildgenerator.BuildGenerator{ Secrets: testclient.NewSimpleFake(), ServiceAccounts: testclient.NewSimpleFake(&builderAccount), Client: buildgenerator.Client{ GetBuildConfigFunc: func(ctx kapi.Context, name string) (*buildapi.BuildConfig, error) { return buildcfg, nil }, UpdateBuildConfigFunc: func(ctx kapi.Context, buildConfig *buildapi.BuildConfig) error { return instantiator.buildConfigUpdater.Update(buildConfig) }, CreateBuildFunc: func(ctx kapi.Context, build *buildapi.Build) error { instantiator.newBuild = build return instantiator.err }, GetBuildFunc: func(ctx kapi.Context, name string) (*buildapi.Build, error) { return instantiator.newBuild, nil }, GetImageStreamFunc: func(ctx kapi.Context, name string) (*imageapi.ImageStream, error) { return imageStream, nil }, GetImageStreamTagFunc: func(ctx kapi.Context, name string) (*imageapi.ImageStreamTag, error) { return &imageapi.ImageStreamTag{Image: *image}, nil }, GetImageStreamImageFunc: func(ctx kapi.Context, name string) (*imageapi.ImageStreamImage, error) { return &imageapi.ImageStreamImage{Image: *image}, nil }, }} instantiator.generator = generator return instantiator }
func TestDeniesInvalidServiceAccount(t *testing.T) { ns := "myns" // Build a test client that the admission plugin can use to look up the service account missing from its cache client := testclient.NewSimpleFake() admit := NewServiceAccount(client) pod := &api.Pod{} attrs := admission.NewAttributesRecord(pod, "Pod", ns, "myname", string(api.ResourcePods), "", admission.Create, nil) err := admit.Admit(attrs) if err == nil { t.Errorf("Expected error for missing service account, got none") } }
func MockBuilderServiceAccount(secrets []*kapi.Secret) kclient.ServiceAccountsNamespacer { var ( secretRefs []kapi.ObjectReference fakeObjects []runtime.Object ) for _, secret := range secrets { secretRefs = append(secretRefs, kapi.ObjectReference{Name: secret.Name, Kind: "Secret"}) fakeObjects = append(fakeObjects, secret) } fakeObjects = append(fakeObjects, &kapi.ServiceAccount{ ObjectMeta: kapi.ObjectMeta{Name: bootstrappolicy.BuilderServiceAccountName}, Secrets: secretRefs, }) return testclient.NewSimpleFake(fakeObjects...) }
func TestDescribeService(t *testing.T) { fake := testclient.NewSimpleFake(&api.Service{ ObjectMeta: api.ObjectMeta{ Name: "bar", Namespace: "foo", }, }) c := &describeClient{T: t, Namespace: "foo", Interface: fake} d := ServiceDescriber{c} out, err := d.Describe("foo", "bar") if err != nil { t.Errorf("unexpected error: %v", err) } if !strings.Contains(out, "Labels:") || !strings.Contains(out, "bar") { t.Errorf("unexpected out: %s", out) } }
func TestEndpointsFromZero(t *testing.T) { endpoint := api.Endpoints{ ObjectMeta: api.ObjectMeta{Name: "bar", ResourceVersion: "2"}, Subsets: []api.EndpointSubset{{ Addresses: []api.EndpointAddress{{IP: "127.0.0.1"}}, Ports: []api.EndpointPort{{Port: 9000}}, }}, } fakeWatch := watch.NewFake() fakeWatch.Stop() fakeClient := testclient.NewSimpleFake(&api.EndpointsList{ ListMeta: api.ListMeta{ResourceVersion: "2"}, Items: []api.Endpoints{ endpoint, }, }) fakeClient.Watch = fakeWatch endpoints := make(chan EndpointsUpdate) source := SourceAPI{ s: servicesReflector{watcher: fakeClient.Services(api.NamespaceAll)}, e: endpointsReflector{watcher: fakeClient.Endpoints(api.NamespaceAll), endpoints: endpoints}} resourceVersion := "" ch := make(chan struct{}) go func() { source.e.run(&resourceVersion) close(ch) }() // should get endpoints SET actual := <-endpoints expected := EndpointsUpdate{Op: SET, Endpoints: []api.Endpoints{endpoint}} if !reflect.DeepEqual(expected, actual) { t.Errorf("expected %#v, got %#v", expected, actual) } // should have listed, then watched <-ch if resourceVersion != "2" { t.Errorf("unexpected resource version, got %#v", resourceVersion) } if !reflect.DeepEqual(fakeClient.Actions, []testclient.FakeAction{{"list-endpoints", nil}, {"watch-endpoints", "2"}}) { t.Errorf("unexpected actions, got %#v", fakeClient) } }
func TestInstantiateGenerateBuildError(t *testing.T) { fakeSecrets := []runtime.Object{} for _, s := range mocks.MockBuilderSecrets() { fakeSecrets = append(fakeSecrets, s) } generator := BuildGenerator{ Secrets: testclient.NewSimpleFake(fakeSecrets...), ServiceAccounts: mocks.MockBuilderServiceAccount(mocks.MockBuilderSecrets()), Client: Client{ GetBuildConfigFunc: func(ctx kapi.Context, name string) (*buildapi.BuildConfig, error) { return nil, fmt.Errorf("get-error") }, }} _, err := generator.Instantiate(kapi.NewDefaultContext(), &buildapi.BuildRequest{}) if err == nil || !strings.Contains(err.Error(), "get-error") { t.Errorf("Expected get-error, got different %v", err) } }
func TestReplicationControllerScaleFailsPreconditions(t *testing.T) { fake := testclient.NewSimpleFake(&api.ReplicationController{ Spec: api.ReplicationControllerSpec{ Replicas: 10, }, }) scaler := ReplicationControllerScaler{NewScalerClient(fake)} preconditions := ScalePrecondition{2, ""} count := uint(3) name := "foo" scaler.Scale("default", name, count, &preconditions, nil, nil) if len(fake.Actions) != 1 { t.Errorf("unexpected actions: %v, expected 2 actions (get, update)", fake.Actions) } if fake.Actions[0].Action != "get-replicationController" || fake.Actions[0].Value != name { t.Errorf("unexpected action: %v, expected get-replicationController %s", fake.Actions[0], name) } }
func TestReplicationControllerScaleFailsPreconditions(t *testing.T) { fake := testclient.NewSimpleFake(&api.ReplicationController{ Spec: api.ReplicationControllerSpec{ Replicas: 10, }, }) scaler := ReplicationControllerScaler{NewScalerClient(fake)} 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 2 actions (get, update)", actions) } if action, ok := actions[0].(testclient.GetAction); !ok || action.GetResource() != "replicationcontrollers" || action.GetName() != name { t.Errorf("unexpected action: %v, expected get-replicationController %s", actions[0], name) } }
func TestExceedUsageSecrets(t *testing.T) { namespace := "default" client := testclient.NewSimpleFake(&api.SecretList{ Items: []api.Secret{ { ObjectMeta: api.ObjectMeta{Name: "123", Namespace: namespace}, }, }, }) status := &api.ResourceQuotaStatus{ Hard: api.ResourceList{}, Used: api.ResourceList{}, } r := api.ResourceSecrets status.Hard[r] = resource.MustParse("1") status.Used[r] = resource.MustParse("1") _, err := IncrementUsage(admission.NewAttributesRecord(&api.Secret{}, "Secret", namespace, "secrets", "CREATE"), status, client) if err == nil { t.Errorf("Expected error for exceeding hard limits") } }
func TestExceedUsageServices(t *testing.T) { namespace := "default" client := testclient.NewSimpleFake(&api.ServiceList{ Items: []api.Service{ { ObjectMeta: api.ObjectMeta{Name: "123", Namespace: namespace}, }, }, }) status := &api.ResourceQuotaStatus{ Hard: api.ResourceList{}, Used: api.ResourceList{}, } r := api.ResourceServices status.Hard[r] = resource.MustParse("1") status.Used[r] = resource.MustParse("1") _, err := IncrementUsage(admission.NewAttributesRecord(&api.Service{}, "Service", namespace, "services", "", admission.Create, nil), status, client) if err == nil { t.Errorf("Expected error because this would exceed usage") } }
func TestExceedUsagePersistentVolumeClaims(t *testing.T) { namespace := "default" client := testclient.NewSimpleFake(&api.PersistentVolumeClaimList{ Items: []api.PersistentVolumeClaim{ { ObjectMeta: api.ObjectMeta{Name: "123", Namespace: namespace}, }, }, }) status := &api.ResourceQuotaStatus{ Hard: api.ResourceList{}, Used: api.ResourceList{}, } r := api.ResourcePersistentVolumeClaims status.Hard[r] = resource.MustParse("1") status.Used[r] = resource.MustParse("1") _, err := IncrementUsage(admission.NewAttributesRecord(&api.PersistentVolumeClaim{}, "PersistentVolumeClaim", namespace, "persistentVolumeClaims", "", admission.Create, nil), status, client) if err == nil { t.Errorf("Expected error for exceeding hard limits") } }
func TestIncrementUsageMemory(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("2Gi") 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("100m", "1Gi")}}, }} dirty, err := IncrementUsage(admission.NewAttributesRecord(newPod, "Pod", namespace, "pods", "CREATE"), status, client) if err != nil { t.Errorf("Unexpected error", err) } if !dirty { t.Errorf("Expected the status to get incremented, therefore should have been dirty") } expectedVal := resource.MustParse("2Gi") quantity := status.Used[r] if quantity.Value() != expectedVal.Value() { t.Errorf("Expected %v was %v", expectedVal.Value(), quantity.Value()) } }
func TestCreateInstantiate(t *testing.T) { imageStream := mocks.MockImageStream("testImageStream", "registry.com/namespace/imagename", map[string]string{"test": "newImageID123"}) image := mocks.MockImage("testImage@id", "registry.com/namespace/imagename@id") fakeSecrets := []runtime.Object{} for _, s := range mocks.MockBuilderSecrets() { fakeSecrets = append(fakeSecrets, s) } rest := InstantiateREST{&generator.BuildGenerator{ Secrets: testclient.NewSimpleFake(fakeSecrets...), ServiceAccounts: mocks.MockBuilderServiceAccount(mocks.MockBuilderSecrets()), Client: generator.Client{ GetBuildConfigFunc: func(ctx kapi.Context, name string) (*buildapi.BuildConfig, error) { return mocks.MockBuildConfig(mocks.MockSource(), mocks.MockSourceStrategyForImageRepository(), mocks.MockOutput()), nil }, UpdateBuildConfigFunc: func(ctx kapi.Context, buildConfig *buildapi.BuildConfig) error { return nil }, CreateBuildFunc: func(ctx kapi.Context, build *buildapi.Build) error { return nil }, GetBuildFunc: func(ctx kapi.Context, name string) (*buildapi.Build, error) { return &buildapi.Build{}, nil }, GetImageStreamFunc: func(ctx kapi.Context, name string) (*imageapi.ImageStream, error) { return imageStream, nil }, GetImageStreamTagFunc: func(ctx kapi.Context, name string) (*imageapi.ImageStreamTag, error) { return &imageapi.ImageStreamTag{Image: *image}, nil }, GetImageStreamImageFunc: func(ctx kapi.Context, name string) (*imageapi.ImageStreamImage, error) { return &imageapi.ImageStreamImage{Image: *image}, nil }, }}} _, err := rest.Create(kapi.NewDefaultContext(), &buildapi.BuildRequest{ObjectMeta: kapi.ObjectMeta{Name: "name"}}) if err != nil { t.Errorf("Unexpected error %v", err) } }
func TestServicesFromZero(t *testing.T) { service := api.Service{ObjectMeta: api.ObjectMeta{Name: "bar", ResourceVersion: "2"}} fakeWatch := watch.NewFake() fakeWatch.Stop() fakeClient := testclient.NewSimpleFake(&api.ServiceList{ ListMeta: api.ListMeta{ResourceVersion: "2"}, Items: []api.Service{ service, }, }) fakeClient.Watch = fakeWatch services := make(chan ServiceUpdate) source := SourceAPI{ s: servicesReflector{watcher: fakeClient.Services(api.NamespaceAll), services: services}, e: endpointsReflector{watcher: fakeClient.Endpoints(api.NamespaceAll)}} resourceVersion := "" ch := make(chan struct{}) go func() { source.s.run(&resourceVersion) close(ch) }() // should get services SET actual := <-services expected := ServiceUpdate{Op: SET, Services: []api.Service{service}} if !reflect.DeepEqual(expected, actual) { t.Errorf("expected %#v, got %#v", expected, actual) } // should have listed, then watched <-ch if resourceVersion != "2" { t.Errorf("unexpected resource version, got %#v", resourceVersion) } if !reflect.DeepEqual(fakeClient.Actions, []testclient.FakeAction{{"list-services", nil}, {"watch-services", "2"}}) { t.Errorf("unexpected actions, got %#v", fakeClient) } }
func TestPodDescribeResultsSorted(t *testing.T) { // Arrange fake := testclient.NewSimpleFake(&api.EventList{ Items: []api.Event{ { Source: api.EventSource{Component: "kubelet"}, Message: "Item 1", FirstTimestamp: util.NewTime(time.Date(2014, time.January, 15, 0, 0, 0, 0, time.UTC)), LastTimestamp: util.NewTime(time.Date(2014, time.January, 15, 0, 0, 0, 0, time.UTC)), Count: 1, }, { Source: api.EventSource{Component: "scheduler"}, Message: "Item 2", FirstTimestamp: util.NewTime(time.Date(1987, time.June, 17, 0, 0, 0, 0, time.UTC)), LastTimestamp: util.NewTime(time.Date(1987, time.June, 17, 0, 0, 0, 0, time.UTC)), Count: 1, }, { Source: api.EventSource{Component: "kubelet"}, Message: "Item 3", FirstTimestamp: util.NewTime(time.Date(2002, time.December, 25, 0, 0, 0, 0, time.UTC)), LastTimestamp: util.NewTime(time.Date(2002, time.December, 25, 0, 0, 0, 0, time.UTC)), Count: 1, }, }, }) c := &describeClient{T: t, Namespace: "foo", Interface: fake} d := PodDescriber{c} // Act out, err := d.Describe("foo", "bar") // Assert if err != nil { t.Errorf("unexpected error: %v", err) } VerifyDatesInOrder(out, "\n" /* rowDelimiter */, "\t" /* columnDelimiter */, t) }