func TestGetSortedObjects(t *testing.T) { pods := &api.PodList{ ListMeta: unversioned.ListMeta{ ResourceVersion: "15", }, Items: []api.Pod{ { ObjectMeta: api.ObjectMeta{Name: "c", Namespace: "test", ResourceVersion: "10"}, Spec: apitesting.DeepEqualSafePodSpec(), }, { ObjectMeta: api.ObjectMeta{Name: "b", Namespace: "test", ResourceVersion: "11"}, Spec: apitesting.DeepEqualSafePodSpec(), }, { ObjectMeta: api.ObjectMeta{Name: "a", Namespace: "test", ResourceVersion: "9"}, Spec: apitesting.DeepEqualSafePodSpec(), }, }, } f, tf, codec := NewAPIFactory() tf.Printer = &testPrinter{} tf.Client = &fake.RESTClient{ Codec: codec, Resp: &http.Response{StatusCode: 200, Header: defaultHeader(), Body: objBody(codec, pods)}, } tf.Namespace = "test" tf.ClientConfig = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: &unversioned.GroupVersion{Version: "v1"}}} buf := bytes.NewBuffer([]byte{}) cmd := NewCmdGet(f, buf) cmd.SetOutput(buf) // sorting with metedata.name cmd.Flags().Set("sort-by", ".metadata.name") cmd.Run(cmd, []string{"pods"}) // expect sorted: a,b,c expected := []runtime.Object{&pods.Items[2], &pods.Items[1], &pods.Items[0]} actual := tf.Printer.(*testPrinter).Objects if !reflect.DeepEqual(expected, actual) { t.Errorf("unexpected object: %#v", actual) } if len(buf.String()) == 0 { t.Errorf("unexpected empty output") } }
func testData() (*api.PodList, *api.ServiceList, *api.ReplicationControllerList) { pods := &api.PodList{ ListMeta: unversioned.ListMeta{ ResourceVersion: "15", }, Items: []api.Pod{ { ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: "test", ResourceVersion: "10"}, Spec: apitesting.DeepEqualSafePodSpec(), }, { ObjectMeta: api.ObjectMeta{Name: "bar", Namespace: "test", ResourceVersion: "11"}, Spec: apitesting.DeepEqualSafePodSpec(), }, }, } svc := &api.ServiceList{ ListMeta: unversioned.ListMeta{ ResourceVersion: "16", }, Items: []api.Service{ { ObjectMeta: api.ObjectMeta{Name: "baz", Namespace: "test", ResourceVersion: "12"}, Spec: api.ServiceSpec{ SessionAffinity: "None", Type: api.ServiceTypeClusterIP, }, }, }, } rc := &api.ReplicationControllerList{ ListMeta: unversioned.ListMeta{ ResourceVersion: "17", }, Items: []api.ReplicationController{ { ObjectMeta: api.ObjectMeta{Name: "rc1", Namespace: "test", ResourceVersion: "18"}, Spec: api.ReplicationControllerSpec{ Replicas: 1, }, }, }, } return pods, svc, rc }
func TestModifyHostConfigPodSecurityContext(t *testing.T) { supplementalGroupsSC := &api.PodSecurityContext{} supplementalGroupsSC.SupplementalGroups = []int64{2222} supplementalGroupHC := fullValidHostConfig() supplementalGroupHC.GroupAdd = []string{"2222"} fsGroupHC := fullValidHostConfig() fsGroupHC.GroupAdd = []string{"1234"} bothHC := fullValidHostConfig() bothHC.GroupAdd = []string{"2222", "1234"} fsGroup := int64(1234) testCases := map[string]struct { securityContext *api.PodSecurityContext expected *dockercontainer.HostConfig }{ "nil": { securityContext: nil, expected: fullValidHostConfig(), }, "SupplementalGroup": { securityContext: supplementalGroupsSC, expected: supplementalGroupHC, }, "FSGroup": { securityContext: &api.PodSecurityContext{FSGroup: &fsGroup}, expected: fsGroupHC, }, "FSGroup + SupplementalGroups": { securityContext: &api.PodSecurityContext{ SupplementalGroups: []int64{2222}, FSGroup: &fsGroup, }, expected: bothHC, }, } provider := NewSimpleSecurityContextProvider() dummyContainer := &api.Container{} dummyContainer.SecurityContext = fullValidSecurityContext() dummyPod := &api.Pod{ Spec: apitesting.DeepEqualSafePodSpec(), } for k, v := range testCases { dummyPod.Spec.SecurityContext = v.securityContext dockerCfg := &dockercontainer.HostConfig{} provider.ModifyHostConfig(dummyPod, dummyContainer, dockerCfg) if !reflect.DeepEqual(v.expected, dockerCfg) { t.Errorf("unexpected modification of host config for %s. Expected: %#v Got: %#v", k, v.expected, dockerCfg) } } }
func watchTestData() ([]api.Pod, []watch.Event) { pods := []api.Pod{ { ObjectMeta: api.ObjectMeta{ Name: "foo", Namespace: "test", ResourceVersion: "10", }, Spec: apitesting.DeepEqualSafePodSpec(), }, } events := []watch.Event{ { Type: watch.Modified, Object: &api.Pod{ ObjectMeta: api.ObjectMeta{ Name: "foo", Namespace: "test", ResourceVersion: "11", }, Spec: apitesting.DeepEqualSafePodSpec(), }, }, { Type: watch.Deleted, Object: &api.Pod{ ObjectMeta: api.ObjectMeta{ Name: "foo", Namespace: "test", ResourceVersion: "12", }, Spec: apitesting.DeepEqualSafePodSpec(), }, }, } return pods, events }
func makeTestPod(name string) *api.Pod { return &api.Pod{ ObjectMeta: api.ObjectMeta{Namespace: "ns", Name: name}, Spec: apitesting.DeepEqualSafePodSpec(), } }
func TestMerge(t *testing.T) { grace := int64(30) tests := []struct { obj runtime.Object fragment string expected runtime.Object expectErr bool kind string }{ { kind: "Pod", obj: &api.Pod{ ObjectMeta: api.ObjectMeta{ Name: "foo", }, }, fragment: fmt.Sprintf(`{ "apiVersion": "%s" }`, testapi.Default.GroupVersion().String()), expected: &api.Pod{ ObjectMeta: api.ObjectMeta{ Name: "foo", }, Spec: apitesting.DeepEqualSafePodSpec(), }, }, /* TODO: uncomment this test once Merge is updated to use strategic-merge-patch. See #8449. { kind: "Pod", obj: &api.Pod{ ObjectMeta: api.ObjectMeta{ Name: "foo", }, Spec: api.PodSpec{ Containers: []api.Container{ api.Container{ Name: "c1", Image: "red-image", }, api.Container{ Name: "c2", Image: "blue-image", }, }, }, }, fragment: fmt.Sprintf(`{ "apiVersion": "%s", "spec": { "containers": [ { "name": "c1", "image": "green-image" } ] } }`, testapi.Default.GroupVersion().String()), expected: &api.Pod{ ObjectMeta: api.ObjectMeta{ Name: "foo", }, Spec: api.PodSpec{ Containers: []api.Container{ api.Container{ Name: "c1", Image: "green-image", }, api.Container{ Name: "c2", Image: "blue-image", }, }, }, }, }, */ { kind: "Pod", obj: &api.Pod{ ObjectMeta: api.ObjectMeta{ Name: "foo", }, }, fragment: fmt.Sprintf(`{ "apiVersion": "%s", "spec": { "volumes": [ {"name": "v1"}, {"name": "v2"} ] } }`, testapi.Default.GroupVersion().String()), expected: &api.Pod{ ObjectMeta: api.ObjectMeta{ Name: "foo", }, Spec: api.PodSpec{ Volumes: []api.Volume{ { Name: "v1", VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}, }, { Name: "v2", VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}, }, }, RestartPolicy: api.RestartPolicyAlways, DNSPolicy: api.DNSClusterFirst, TerminationGracePeriodSeconds: &grace, SecurityContext: &api.PodSecurityContext{}, }, }, }, { kind: "Pod", obj: &api.Pod{}, fragment: "invalid json", expected: &api.Pod{}, expectErr: true, }, { kind: "Service", obj: &api.Service{}, fragment: `{ "apiVersion": "badVersion" }`, expectErr: true, }, { kind: "Service", obj: &api.Service{ Spec: api.ServiceSpec{}, }, fragment: fmt.Sprintf(`{ "apiVersion": "%s", "spec": { "ports": [ { "port": 0 } ] } }`, testapi.Default.GroupVersion().String()), expected: &api.Service{ Spec: api.ServiceSpec{ SessionAffinity: "None", Type: api.ServiceTypeClusterIP, Ports: []api.ServicePort{ { Protocol: api.ProtocolTCP, Port: 0, }, }, }, }, }, { kind: "Service", obj: &api.Service{ Spec: api.ServiceSpec{ Selector: map[string]string{ "version": "v1", }, }, }, fragment: fmt.Sprintf(`{ "apiVersion": "%s", "spec": { "selector": { "version": "v2" } } }`, testapi.Default.GroupVersion().String()), expected: &api.Service{ Spec: api.ServiceSpec{ SessionAffinity: "None", Type: api.ServiceTypeClusterIP, Selector: map[string]string{ "version": "v2", }, }, }, }, } for i, test := range tests { out, err := Merge(testapi.Default.Codec(), test.obj, test.fragment, test.kind) if !test.expectErr { if err != nil { t.Errorf("testcase[%d], unexpected error: %v", i, err) } else if !reflect.DeepEqual(out, test.expected) { t.Errorf("\n\ntestcase[%d]\nexpected:\n%+v\nsaw:\n%+v", i, test.expected, out) } } if test.expectErr && err == nil { t.Errorf("testcase[%d], unexpected non-error", i) } } }