diff --git a/pkg/kubectl/BUILD b/pkg/kubectl/BUILD index 98923897872..86b2b708736 100644 --- a/pkg/kubectl/BUILD +++ b/pkg/kubectl/BUILD @@ -55,6 +55,8 @@ go_library( "//pkg/apis/apps:go_default_library", "//pkg/apis/autoscaling:go_default_library", "//pkg/apis/batch:go_default_library", + "//pkg/apis/batch/v1:go_default_library", + "//pkg/apis/batch/v2alpha1:go_default_library", "//pkg/apis/extensions:go_default_library", "//pkg/apis/extensions/v1beta1:go_default_library", "//pkg/apis/policy:go_default_library", @@ -136,7 +138,10 @@ go_test( "//pkg/api/testing:go_default_library", "//pkg/api/v1:go_default_library", "//pkg/apis/batch:go_default_library", + "//pkg/apis/batch/v1:go_default_library", + "//pkg/apis/batch/v2alpha1:go_default_library", "//pkg/apis/extensions:go_default_library", + "//pkg/apis/extensions/v1beta1:go_default_library", "//pkg/client/clientset_generated/internalclientset:go_default_library", "//pkg/client/clientset_generated/internalclientset/fake:go_default_library", "//pkg/client/clientset_generated/internalclientset/typed/batch/internalversion:go_default_library", diff --git a/pkg/kubectl/deployment.go b/pkg/kubectl/deployment.go index cbe12a410a9..56a1358e16d 100644 --- a/pkg/kubectl/deployment.go +++ b/pkg/kubectl/deployment.go @@ -22,8 +22,8 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/apis/extensions" + "k8s.io/kubernetes/pkg/api/v1" + extensionsv1beta1 "k8s.io/kubernetes/pkg/apis/extensions/v1beta1" ) // DeploymentBasicGeneratorV1 supports stable generation of a deployment @@ -65,7 +65,7 @@ func (s *DeploymentBasicGeneratorV1) StructuredGenerate() (runtime.Object, error return nil, err } - podSpec := api.PodSpec{Containers: []api.Container{}} + podSpec := v1.PodSpec{Containers: []v1.Container{}} for _, imageString := range s.Images { // Retain just the image name imageSplit := strings.Split(imageString, "/") @@ -76,22 +76,23 @@ func (s *DeploymentBasicGeneratorV1) StructuredGenerate() (runtime.Object, error } else if strings.Contains(name, "@") { name = strings.Split(name, "@")[0] } - podSpec.Containers = append(podSpec.Containers, api.Container{Name: name, Image: imageString}) + podSpec.Containers = append(podSpec.Containers, v1.Container{Name: name, Image: imageString}) } // setup default label and selector labels := map[string]string{} labels["app"] = s.Name + one := int32(1) selector := metav1.LabelSelector{MatchLabels: labels} - deployment := extensions.Deployment{ + deployment := extensionsv1beta1.Deployment{ ObjectMeta: metav1.ObjectMeta{ Name: s.Name, Labels: labels, }, - Spec: extensions.DeploymentSpec{ - Replicas: 1, + Spec: extensionsv1beta1.DeploymentSpec{ + Replicas: &one, Selector: &selector, - Template: api.PodTemplateSpec{ + Template: v1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: labels, }, diff --git a/pkg/kubectl/deployment_test.go b/pkg/kubectl/deployment_test.go index db010ca2627..bea83f098df 100644 --- a/pkg/kubectl/deployment_test.go +++ b/pkg/kubectl/deployment_test.go @@ -21,14 +21,15 @@ import ( "testing" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/apis/extensions" + "k8s.io/kubernetes/pkg/api/v1" + extensionsv1beta1 "k8s.io/kubernetes/pkg/apis/extensions/v1beta1" ) func TestDeploymentGenerate(t *testing.T) { + one := int32(1) tests := []struct { params map[string]interface{} - expected *extensions.Deployment + expected *extensionsv1beta1.Deployment expectErr bool }{ { @@ -36,20 +37,20 @@ func TestDeploymentGenerate(t *testing.T) { "name": "foo", "image": []string{"abc/app:v4"}, }, - expected: &extensions.Deployment{ + expected: &extensionsv1beta1.Deployment{ ObjectMeta: metav1.ObjectMeta{ Name: "foo", Labels: map[string]string{"app": "foo"}, }, - Spec: extensions.DeploymentSpec{ - Replicas: 1, + Spec: extensionsv1beta1.DeploymentSpec{ + Replicas: &one, Selector: &metav1.LabelSelector{MatchLabels: map[string]string{"app": "foo"}}, - Template: api.PodTemplateSpec{ + Template: v1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: map[string]string{"app": "foo"}, }, - Spec: api.PodSpec{ - Containers: []api.Container{{Name: "app", Image: "abc/app:v4"}}, + Spec: v1.PodSpec{ + Containers: []v1.Container{{Name: "app", Image: "abc/app:v4"}}, }, }, }, @@ -61,20 +62,20 @@ func TestDeploymentGenerate(t *testing.T) { "name": "foo", "image": []string{"abc/app:v4", "zyx/ape"}, }, - expected: &extensions.Deployment{ + expected: &extensionsv1beta1.Deployment{ ObjectMeta: metav1.ObjectMeta{ Name: "foo", Labels: map[string]string{"app": "foo"}, }, - Spec: extensions.DeploymentSpec{ - Replicas: 1, + Spec: extensionsv1beta1.DeploymentSpec{ + Replicas: &one, Selector: &metav1.LabelSelector{MatchLabels: map[string]string{"app": "foo"}}, - Template: api.PodTemplateSpec{ + Template: v1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: map[string]string{"app": "foo"}, }, - Spec: api.PodSpec{ - Containers: []api.Container{{Name: "app", Image: "abc/app:v4"}, + Spec: v1.PodSpec{ + Containers: []v1.Container{{Name: "app", Image: "abc/app:v4"}, {Name: "ape", Image: "zyx/ape"}}, }, }, @@ -128,8 +129,8 @@ func TestDeploymentGenerate(t *testing.T) { case !test.expectErr && err == nil: // do nothing and drop through } - if !reflect.DeepEqual(obj.(*extensions.Deployment), test.expected) { - t.Errorf("expected:\n%#v\nsaw:\n%#v", test.expected, obj.(*extensions.Deployment)) + if !reflect.DeepEqual(obj.(*extensionsv1beta1.Deployment), test.expected) { + t.Errorf("expected:\n%#v\nsaw:\n%#v", test.expected, obj.(*extensionsv1beta1.Deployment)) } } } diff --git a/pkg/kubectl/run.go b/pkg/kubectl/run.go index cb9ec17c9bd..d5d83df2b7c 100644 --- a/pkg/kubectl/run.go +++ b/pkg/kubectl/run.go @@ -26,8 +26,10 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation" "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/apis/batch" - "k8s.io/kubernetes/pkg/apis/extensions" + "k8s.io/kubernetes/pkg/api/v1" + batchv1 "k8s.io/kubernetes/pkg/apis/batch/v1" + batchv2alpha1 "k8s.io/kubernetes/pkg/apis/batch/v2alpha1" + extensionsv1beta1 "k8s.io/kubernetes/pkg/apis/extensions/v1beta1" ) type DeploymentV1Beta1 struct{} @@ -88,7 +90,7 @@ func (DeploymentV1Beta1) Generate(genericParams map[string]interface{}) (runtime return nil, err } - imagePullPolicy := api.PullPolicy(params["image-pull-policy"]) + imagePullPolicy := v1.PullPolicy(params["image-pull-policy"]) if err = updatePodContainers(params, args, envs, imagePullPolicy, podSpec); err != nil { return nil, err } @@ -99,15 +101,16 @@ func (DeploymentV1Beta1) Generate(genericParams map[string]interface{}) (runtime // TODO: use versioned types for generators so that we don't need to // set default values manually (see issue #17384) - deployment := extensions.Deployment{ + count32 := int32(count) + deployment := extensionsv1beta1.Deployment{ ObjectMeta: metav1.ObjectMeta{ Name: name, Labels: labels, }, - Spec: extensions.DeploymentSpec{ - Replicas: int32(count), + Spec: extensionsv1beta1.DeploymentSpec{ + Replicas: &count32, Selector: &metav1.LabelSelector{MatchLabels: labels}, - Template: api.PodTemplateSpec{ + Template: v1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: labels, }, @@ -172,8 +175,8 @@ func getArgs(genericParams map[string]interface{}) ([]string, error) { return args, nil } -func getEnvs(genericParams map[string]interface{}) ([]api.EnvVar, error) { - var envs []api.EnvVar +func getEnvs(genericParams map[string]interface{}) ([]v1.EnvVar, error) { + var envs []v1.EnvVar envStrings, found := genericParams["env"] if found { if envStringArray, isArray := envStrings.([]string); isArray { @@ -244,7 +247,7 @@ func (JobV1) Generate(genericParams map[string]interface{}) (runtime.Object, err return nil, err } - imagePullPolicy := api.PullPolicy(params["image-pull-policy"]) + imagePullPolicy := v1.PullPolicy(params["image-pull-policy"]) if err = updatePodContainers(params, args, envs, imagePullPolicy, podSpec); err != nil { return nil, err } @@ -259,19 +262,19 @@ func (JobV1) Generate(genericParams map[string]interface{}) (runtime.Object, err return nil, err } - restartPolicy := api.RestartPolicy(params["restart"]) + restartPolicy := v1.RestartPolicy(params["restart"]) if len(restartPolicy) == 0 { - restartPolicy = api.RestartPolicyNever + restartPolicy = v1.RestartPolicyNever } podSpec.RestartPolicy = restartPolicy - job := batch.Job{ + job := batchv1.Job{ ObjectMeta: metav1.ObjectMeta{ Name: name, Labels: labels, }, - Spec: batch.JobSpec{ - Template: api.PodTemplateSpec{ + Spec: batchv1.JobSpec{ + Template: v1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: labels, }, @@ -338,7 +341,7 @@ func (CronJobV2Alpha1) Generate(genericParams map[string]interface{}) (runtime.O return nil, err } - imagePullPolicy := api.PullPolicy(params["image-pull-policy"]) + imagePullPolicy := v1.PullPolicy(params["image-pull-policy"]) if err = updatePodContainers(params, args, envs, imagePullPolicy, podSpec); err != nil { return nil, err } @@ -353,23 +356,23 @@ func (CronJobV2Alpha1) Generate(genericParams map[string]interface{}) (runtime.O return nil, err } - restartPolicy := api.RestartPolicy(params["restart"]) + restartPolicy := v1.RestartPolicy(params["restart"]) if len(restartPolicy) == 0 { - restartPolicy = api.RestartPolicyNever + restartPolicy = v1.RestartPolicyNever } podSpec.RestartPolicy = restartPolicy - cronJob := batch.CronJob{ + cronJob := batchv2alpha1.CronJob{ ObjectMeta: metav1.ObjectMeta{ Name: name, Labels: labels, }, - Spec: batch.CronJobSpec{ + Spec: batchv2alpha1.CronJobSpec{ Schedule: params["schedule"], - ConcurrencyPolicy: batch.AllowConcurrent, - JobTemplate: batch.JobTemplateSpec{ - Spec: batch.JobSpec{ - Template: api.PodTemplateSpec{ + ConcurrencyPolicy: batchv2alpha1.AllowConcurrent, + JobTemplate: batchv2alpha1.JobTemplateSpec{ + Spec: batchv1.JobSpec{ + Template: v1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: labels, }, @@ -429,6 +432,30 @@ func populateResourceList(spec string) (api.ResourceList, error) { return result, nil } +// populateResourceListV1 takes strings of form =,= +func populateResourceListV1(spec string) (v1.ResourceList, error) { + // empty input gets a nil response to preserve generator test expected behaviors + if spec == "" { + return nil, nil + } + + result := v1.ResourceList{} + resourceStatements := strings.Split(spec, ",") + for _, resourceStatement := range resourceStatements { + parts := strings.Split(resourceStatement, "=") + if len(parts) != 2 { + return nil, fmt.Errorf("Invalid argument syntax %v, expected =", resourceStatement) + } + resourceName := v1.ResourceName(parts[0]) + resourceQuantity, err := resource.ParseQuantity(parts[1]) + if err != nil { + return nil, err + } + result[resourceName] = resourceQuantity + } + return result, nil +} + // HandleResourceRequirements parses the limits and requests parameters if specified func HandleResourceRequirements(params map[string]string) (api.ResourceRequirements, error) { result := api.ResourceRequirements{} @@ -445,7 +472,23 @@ func HandleResourceRequirements(params map[string]string) (api.ResourceRequireme return result, nil } -func makePodSpec(params map[string]string, name string) (*api.PodSpec, error) { +// HandleResourceRequirementsV1 parses the limits and requests parameters if specified +func HandleResourceRequirementsV1(params map[string]string) (v1.ResourceRequirements, error) { + result := v1.ResourceRequirements{} + limits, err := populateResourceListV1(params["limits"]) + if err != nil { + return result, err + } + result.Limits = limits + requests, err := populateResourceListV1(params["requests"]) + if err != nil { + return result, err + } + result.Requests = requests + return result, nil +} + +func makePodSpec(params map[string]string, name string) (*v1.PodSpec, error) { stdin, err := GetBool(params, "stdin", false) if err != nil { return nil, err @@ -456,13 +499,13 @@ func makePodSpec(params map[string]string, name string) (*api.PodSpec, error) { return nil, err } - resourceRequirements, err := HandleResourceRequirements(params) + resourceRequirements, err := HandleResourceRequirementsV1(params) if err != nil { return nil, err } - spec := api.PodSpec{ - Containers: []api.Container{ + spec := v1.PodSpec{ + Containers: []v1.Container{ { Name: name, Image: params["image"], @@ -511,7 +554,7 @@ func (BasicReplicationController) Generate(genericParams map[string]interface{}) return nil, err } - imagePullPolicy := api.PullPolicy(params["image-pull-policy"]) + imagePullPolicy := v1.PullPolicy(params["image-pull-policy"]) if err = updatePodContainers(params, args, envs, imagePullPolicy, podSpec); err != nil { return nil, err } @@ -520,15 +563,16 @@ func (BasicReplicationController) Generate(genericParams map[string]interface{}) return nil, err } - controller := api.ReplicationController{ + count32 := int32(count) + controller := v1.ReplicationController{ ObjectMeta: metav1.ObjectMeta{ Name: name, Labels: labels, }, - Spec: api.ReplicationControllerSpec{ - Replicas: int32(count), + Spec: v1.ReplicationControllerSpec{ + Replicas: &count32, Selector: labels, - Template: &api.PodTemplateSpec{ + Template: &v1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: labels, }, @@ -539,7 +583,7 @@ func (BasicReplicationController) Generate(genericParams map[string]interface{}) return &controller, nil } -func updatePodContainers(params map[string]string, args []string, envs []api.EnvVar, imagePullPolicy api.PullPolicy, podSpec *api.PodSpec) error { +func updatePodContainers(params map[string]string, args []string, envs []v1.EnvVar, imagePullPolicy v1.PullPolicy, podSpec *v1.PodSpec) error { if len(args) > 0 { command, err := GetBool(params, "command", false) if err != nil { @@ -563,7 +607,7 @@ func updatePodContainers(params map[string]string, args []string, envs []api.Env return nil } -func updatePodPorts(params map[string]string, podSpec *api.PodSpec) (err error) { +func updatePodPorts(params map[string]string, podSpec *v1.PodSpec) (err error) { port := -1 hostPort := -1 if len(params["port"]) > 0 { @@ -585,7 +629,7 @@ func updatePodPorts(params map[string]string, podSpec *api.PodSpec) (err error) // Don't include the port if it was not specified. if len(params["port"]) > 0 { - podSpec.Containers[0].Ports = []api.ContainerPort{ + podSpec.Containers[0].Ports = []v1.ContainerPort{ { ContainerPort: int32(port), }, @@ -660,39 +704,39 @@ func (BasicPod) Generate(genericParams map[string]interface{}) (runtime.Object, return nil, err } - resourceRequirements, err := HandleResourceRequirements(params) + resourceRequirements, err := HandleResourceRequirementsV1(params) if err != nil { return nil, err } - restartPolicy := api.RestartPolicy(params["restart"]) + restartPolicy := v1.RestartPolicy(params["restart"]) if len(restartPolicy) == 0 { - restartPolicy = api.RestartPolicyAlways + restartPolicy = v1.RestartPolicyAlways } // TODO: Figure out why we set ImagePullPolicy here, whether we can make it // consistent with the other places imagePullPolicy is set using flag. - pod := api.Pod{ + pod := v1.Pod{ ObjectMeta: metav1.ObjectMeta{ Name: name, Labels: labels, }, - Spec: api.PodSpec{ - Containers: []api.Container{ + Spec: v1.PodSpec{ + Containers: []v1.Container{ { Name: name, Image: params["image"], - ImagePullPolicy: api.PullIfNotPresent, + ImagePullPolicy: v1.PullIfNotPresent, Stdin: stdin, StdinOnce: !leaveStdinOpen && stdin, TTY: tty, Resources: resourceRequirements, }, }, - DNSPolicy: api.DNSClusterFirst, + DNSPolicy: v1.DNSClusterFirst, RestartPolicy: restartPolicy, }, } - imagePullPolicy := api.PullPolicy(params["image-pull-policy"]) + imagePullPolicy := v1.PullPolicy(params["image-pull-policy"]) if err = updatePodContainers(params, args, envs, imagePullPolicy, &pod.Spec); err != nil { return nil, err } @@ -703,8 +747,8 @@ func (BasicPod) Generate(genericParams map[string]interface{}) (runtime.Object, return &pod, nil } -func parseEnvs(envArray []string) ([]api.EnvVar, error) { - envs := make([]api.EnvVar, 0, len(envArray)) +func parseEnvs(envArray []string) ([]v1.EnvVar, error) { + envs := make([]v1.EnvVar, 0, len(envArray)) for _, env := range envArray { pos := strings.Index(env, "=") if pos == -1 { @@ -718,7 +762,7 @@ func parseEnvs(envArray []string) ([]api.EnvVar, error) { if len(validation.IsCIdentifier(name)) != 0 { return nil, fmt.Errorf("invalid env: %v", env) } - envVar := api.EnvVar{Name: name, Value: value} + envVar := v1.EnvVar{Name: name, Value: value} envs = append(envs, envVar) } return envs, nil diff --git a/pkg/kubectl/run_test.go b/pkg/kubectl/run_test.go index 258f2f95b79..b42ec40fb0d 100644 --- a/pkg/kubectl/run_test.go +++ b/pkg/kubectl/run_test.go @@ -22,15 +22,17 @@ import ( "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/apis/batch" - "k8s.io/kubernetes/pkg/apis/extensions" + "k8s.io/kubernetes/pkg/api/v1" + batchv1 "k8s.io/kubernetes/pkg/apis/batch/v1" + batchv2alpha1 "k8s.io/kubernetes/pkg/apis/batch/v2alpha1" + extensionsv1beta1 "k8s.io/kubernetes/pkg/apis/extensions/v1beta1" ) func TestGenerate(t *testing.T) { + one := int32(1) tests := []struct { params map[string]interface{} - expected *api.ReplicationController + expected *v1.ReplicationController expectErr bool }{ { @@ -41,24 +43,24 @@ func TestGenerate(t *testing.T) { "replicas": "1", "port": "", }, - expected: &api.ReplicationController{ + expected: &v1.ReplicationController{ ObjectMeta: metav1.ObjectMeta{ Name: "foo", Labels: map[string]string{"run": "foo"}, }, - Spec: api.ReplicationControllerSpec{ - Replicas: 1, + Spec: v1.ReplicationControllerSpec{ + Replicas: &one, Selector: map[string]string{"run": "foo"}, - Template: &api.PodTemplateSpec{ + Template: &v1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: map[string]string{"run": "foo"}, }, - Spec: api.PodSpec{ - Containers: []api.Container{ + Spec: v1.PodSpec{ + Containers: []v1.Container{ { Name: "foo", Image: "someimage", - ImagePullPolicy: api.PullAlways, + ImagePullPolicy: v1.PullAlways, }, }, }, @@ -75,24 +77,24 @@ func TestGenerate(t *testing.T) { "port": "", "env": []string{"a=b", "c=d"}, }, - expected: &api.ReplicationController{ + expected: &v1.ReplicationController{ ObjectMeta: metav1.ObjectMeta{ Name: "foo", Labels: map[string]string{"run": "foo"}, }, - Spec: api.ReplicationControllerSpec{ - Replicas: 1, + Spec: v1.ReplicationControllerSpec{ + Replicas: &one, Selector: map[string]string{"run": "foo"}, - Template: &api.PodTemplateSpec{ + Template: &v1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: map[string]string{"run": "foo"}, }, - Spec: api.PodSpec{ - Containers: []api.Container{ + Spec: v1.PodSpec{ + Containers: []v1.Container{ { Name: "foo", Image: "someimage", - Env: []api.EnvVar{ + Env: []v1.EnvVar{ { Name: "a", Value: "b", @@ -119,24 +121,24 @@ func TestGenerate(t *testing.T) { "port": "", "args": []string{"bar", "baz", "blah"}, }, - expected: &api.ReplicationController{ + expected: &v1.ReplicationController{ ObjectMeta: metav1.ObjectMeta{ Name: "foo", Labels: map[string]string{"run": "foo"}, }, - Spec: api.ReplicationControllerSpec{ - Replicas: 1, + Spec: v1.ReplicationControllerSpec{ + Replicas: &one, Selector: map[string]string{"run": "foo"}, - Template: &api.PodTemplateSpec{ + Template: &v1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: map[string]string{"run": "foo"}, }, - Spec: api.PodSpec{ - Containers: []api.Container{ + Spec: v1.PodSpec{ + Containers: []v1.Container{ { Name: "foo", Image: "someimage", - ImagePullPolicy: api.PullNever, + ImagePullPolicy: v1.PullNever, Args: []string{"bar", "baz", "blah"}, }, }, @@ -154,20 +156,20 @@ func TestGenerate(t *testing.T) { "args": []string{"bar", "baz", "blah"}, "command": "true", }, - expected: &api.ReplicationController{ + expected: &v1.ReplicationController{ ObjectMeta: metav1.ObjectMeta{ Name: "foo", Labels: map[string]string{"run": "foo"}, }, - Spec: api.ReplicationControllerSpec{ - Replicas: 1, + Spec: v1.ReplicationControllerSpec{ + Replicas: &one, Selector: map[string]string{"run": "foo"}, - Template: &api.PodTemplateSpec{ + Template: &v1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: map[string]string{"run": "foo"}, }, - Spec: api.PodSpec{ - Containers: []api.Container{ + Spec: v1.PodSpec{ + Containers: []v1.Container{ { Name: "foo", Image: "someimage", @@ -186,24 +188,24 @@ func TestGenerate(t *testing.T) { "replicas": "1", "port": "80", }, - expected: &api.ReplicationController{ + expected: &v1.ReplicationController{ ObjectMeta: metav1.ObjectMeta{ Name: "foo", Labels: map[string]string{"run": "foo"}, }, - Spec: api.ReplicationControllerSpec{ - Replicas: 1, + Spec: v1.ReplicationControllerSpec{ + Replicas: &one, Selector: map[string]string{"run": "foo"}, - Template: &api.PodTemplateSpec{ + Template: &v1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: map[string]string{"run": "foo"}, }, - Spec: api.PodSpec{ - Containers: []api.Container{ + Spec: v1.PodSpec{ + Containers: []v1.Container{ { Name: "foo", Image: "someimage", - Ports: []api.ContainerPort{ + Ports: []v1.ContainerPort{ { ContainerPort: 80, }, @@ -224,25 +226,25 @@ func TestGenerate(t *testing.T) { "port": "80", "hostport": "80", }, - expected: &api.ReplicationController{ + expected: &v1.ReplicationController{ ObjectMeta: metav1.ObjectMeta{ Name: "foo", Labels: map[string]string{"run": "foo"}, }, - Spec: api.ReplicationControllerSpec{ - Replicas: 1, + Spec: v1.ReplicationControllerSpec{ + Replicas: &one, Selector: map[string]string{"run": "foo"}, - Template: &api.PodTemplateSpec{ + Template: &v1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: map[string]string{"run": "foo"}, }, - Spec: api.PodSpec{ - Containers: []api.Container{ + Spec: v1.PodSpec{ + Containers: []v1.Container{ { Name: "foo", Image: "someimage", - ImagePullPolicy: api.PullIfNotPresent, - Ports: []api.ContainerPort{ + ImagePullPolicy: v1.PullIfNotPresent, + Ports: []v1.ContainerPort{ { ContainerPort: 80, HostPort: 80, @@ -272,20 +274,20 @@ func TestGenerate(t *testing.T) { "replicas": "1", "labels": "foo=bar,baz=blah", }, - expected: &api.ReplicationController{ + expected: &v1.ReplicationController{ ObjectMeta: metav1.ObjectMeta{ Name: "foo", Labels: map[string]string{"foo": "bar", "baz": "blah"}, }, - Spec: api.ReplicationControllerSpec{ - Replicas: 1, + Spec: v1.ReplicationControllerSpec{ + Replicas: &one, Selector: map[string]string{"foo": "bar", "baz": "blah"}, - Template: &api.PodTemplateSpec{ + Template: &v1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: map[string]string{"foo": "bar", "baz": "blah"}, }, - Spec: api.PodSpec{ - Containers: []api.Container{ + Spec: v1.PodSpec{ + Containers: []v1.Container{ { Name: "foo", Image: "someimage", @@ -348,31 +350,31 @@ func TestGenerate(t *testing.T) { "requests": "cpu=100m,memory=100Mi", "limits": "cpu=400m,memory=200Mi", }, - expected: &api.ReplicationController{ + expected: &v1.ReplicationController{ ObjectMeta: metav1.ObjectMeta{ Name: "foo", Labels: map[string]string{"foo": "bar", "baz": "blah"}, }, - Spec: api.ReplicationControllerSpec{ - Replicas: 1, + Spec: v1.ReplicationControllerSpec{ + Replicas: &one, Selector: map[string]string{"foo": "bar", "baz": "blah"}, - Template: &api.PodTemplateSpec{ + Template: &v1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: map[string]string{"foo": "bar", "baz": "blah"}, }, - Spec: api.PodSpec{ - Containers: []api.Container{ + Spec: v1.PodSpec{ + Containers: []v1.Container{ { Name: "foo", Image: "someimage", - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceCPU: resource.MustParse("100m"), - api.ResourceMemory: resource.MustParse("100Mi"), + Resources: v1.ResourceRequirements{ + Requests: v1.ResourceList{ + v1.ResourceCPU: resource.MustParse("100m"), + v1.ResourceMemory: resource.MustParse("100Mi"), }, - Limits: api.ResourceList{ - api.ResourceCPU: resource.MustParse("400m"), - api.ResourceMemory: resource.MustParse("200Mi"), + Limits: v1.ResourceList{ + v1.ResourceCPU: resource.MustParse("400m"), + v1.ResourceMemory: resource.MustParse("200Mi"), }, }, }, @@ -394,8 +396,8 @@ func TestGenerate(t *testing.T) { if test.expectErr && err != nil { continue } - if !reflect.DeepEqual(obj.(*api.ReplicationController).Spec.Template, test.expected.Spec.Template) { - t.Errorf("\nexpected:\n%#v\nsaw:\n%#v", test.expected.Spec.Template, obj.(*api.ReplicationController).Spec.Template) + if !reflect.DeepEqual(obj.(*v1.ReplicationController).Spec.Template, test.expected.Spec.Template) { + t.Errorf("\nexpected:\n%#v\nsaw:\n%#v", test.expected.Spec.Template, obj.(*v1.ReplicationController).Spec.Template) } } } @@ -403,7 +405,7 @@ func TestGenerate(t *testing.T) { func TestGeneratePod(t *testing.T) { tests := []struct { params map[string]interface{} - expected *api.Pod + expected *v1.Pod expectErr bool }{ { @@ -412,20 +414,20 @@ func TestGeneratePod(t *testing.T) { "image": "someimage", "port": "", }, - expected: &api.Pod{ + expected: &v1.Pod{ ObjectMeta: metav1.ObjectMeta{ Name: "foo", }, - Spec: api.PodSpec{ - Containers: []api.Container{ + Spec: v1.PodSpec{ + Containers: []v1.Container{ { Name: "foo", Image: "someimage", - ImagePullPolicy: api.PullIfNotPresent, + ImagePullPolicy: v1.PullIfNotPresent, }, }, - DNSPolicy: api.DNSClusterFirst, - RestartPolicy: api.RestartPolicyAlways, + DNSPolicy: v1.DNSClusterFirst, + RestartPolicy: v1.RestartPolicyAlways, }, }, }, @@ -446,17 +448,17 @@ func TestGeneratePod(t *testing.T) { "image-pull-policy": "Always", "env": []string{"a=b", "c=d"}, }, - expected: &api.Pod{ + expected: &v1.Pod{ ObjectMeta: metav1.ObjectMeta{ Name: "foo", }, - Spec: api.PodSpec{ - Containers: []api.Container{ + Spec: v1.PodSpec{ + Containers: []v1.Container{ { Name: "foo", Image: "someimage", - ImagePullPolicy: api.PullAlways, - Env: []api.EnvVar{ + ImagePullPolicy: v1.PullAlways, + Env: []v1.EnvVar{ { Name: "a", Value: "b", @@ -468,8 +470,8 @@ func TestGeneratePod(t *testing.T) { }, }, }, - DNSPolicy: api.DNSClusterFirst, - RestartPolicy: api.RestartPolicyAlways, + DNSPolicy: v1.DNSClusterFirst, + RestartPolicy: v1.RestartPolicyAlways, }, }, }, @@ -479,25 +481,25 @@ func TestGeneratePod(t *testing.T) { "image": "someimage", "port": "80", }, - expected: &api.Pod{ + expected: &v1.Pod{ ObjectMeta: metav1.ObjectMeta{ Name: "foo", }, - Spec: api.PodSpec{ - Containers: []api.Container{ + Spec: v1.PodSpec{ + Containers: []v1.Container{ { Name: "foo", Image: "someimage", - ImagePullPolicy: api.PullIfNotPresent, - Ports: []api.ContainerPort{ + ImagePullPolicy: v1.PullIfNotPresent, + Ports: []v1.ContainerPort{ { ContainerPort: 80, }, }, }, }, - DNSPolicy: api.DNSClusterFirst, - RestartPolicy: api.RestartPolicyAlways, + DNSPolicy: v1.DNSClusterFirst, + RestartPolicy: v1.RestartPolicyAlways, }, }, }, @@ -508,17 +510,17 @@ func TestGeneratePod(t *testing.T) { "port": "80", "hostport": "80", }, - expected: &api.Pod{ + expected: &v1.Pod{ ObjectMeta: metav1.ObjectMeta{ Name: "foo", }, - Spec: api.PodSpec{ - Containers: []api.Container{ + Spec: v1.PodSpec{ + Containers: []v1.Container{ { Name: "foo", Image: "someimage", - ImagePullPolicy: api.PullIfNotPresent, - Ports: []api.ContainerPort{ + ImagePullPolicy: v1.PullIfNotPresent, + Ports: []v1.ContainerPort{ { ContainerPort: 80, HostPort: 80, @@ -526,8 +528,8 @@ func TestGeneratePod(t *testing.T) { }, }, }, - DNSPolicy: api.DNSClusterFirst, - RestartPolicy: api.RestartPolicyAlways, + DNSPolicy: v1.DNSClusterFirst, + RestartPolicy: v1.RestartPolicyAlways, }, }, }, @@ -547,21 +549,21 @@ func TestGeneratePod(t *testing.T) { "replicas": "1", "labels": "foo=bar,baz=blah", }, - expected: &api.Pod{ + expected: &v1.Pod{ ObjectMeta: metav1.ObjectMeta{ Name: "foo", Labels: map[string]string{"foo": "bar", "baz": "blah"}, }, - Spec: api.PodSpec{ - Containers: []api.Container{ + Spec: v1.PodSpec{ + Containers: []v1.Container{ { Name: "foo", Image: "someimage", - ImagePullPolicy: api.PullIfNotPresent, + ImagePullPolicy: v1.PullIfNotPresent, }, }, - DNSPolicy: api.DNSClusterFirst, - RestartPolicy: api.RestartPolicyAlways, + DNSPolicy: v1.DNSClusterFirst, + RestartPolicy: v1.RestartPolicyAlways, }, }, }, @@ -573,23 +575,23 @@ func TestGeneratePod(t *testing.T) { "labels": "foo=bar,baz=blah", "stdin": "true", }, - expected: &api.Pod{ + expected: &v1.Pod{ ObjectMeta: metav1.ObjectMeta{ Name: "foo", Labels: map[string]string{"foo": "bar", "baz": "blah"}, }, - Spec: api.PodSpec{ - Containers: []api.Container{ + Spec: v1.PodSpec{ + Containers: []v1.Container{ { Name: "foo", Image: "someimage", - ImagePullPolicy: api.PullIfNotPresent, + ImagePullPolicy: v1.PullIfNotPresent, Stdin: true, StdinOnce: true, }, }, - DNSPolicy: api.DNSClusterFirst, - RestartPolicy: api.RestartPolicyAlways, + DNSPolicy: v1.DNSClusterFirst, + RestartPolicy: v1.RestartPolicyAlways, }, }, }, @@ -602,23 +604,23 @@ func TestGeneratePod(t *testing.T) { "stdin": "true", "leave-stdin-open": "true", }, - expected: &api.Pod{ + expected: &v1.Pod{ ObjectMeta: metav1.ObjectMeta{ Name: "foo", Labels: map[string]string{"foo": "bar", "baz": "blah"}, }, - Spec: api.PodSpec{ - Containers: []api.Container{ + Spec: v1.PodSpec{ + Containers: []v1.Container{ { Name: "foo", Image: "someimage", - ImagePullPolicy: api.PullIfNotPresent, + ImagePullPolicy: v1.PullIfNotPresent, Stdin: true, StdinOnce: false, }, }, - DNSPolicy: api.DNSClusterFirst, - RestartPolicy: api.RestartPolicyAlways, + DNSPolicy: v1.DNSClusterFirst, + RestartPolicy: v1.RestartPolicyAlways, }, }, }, @@ -632,16 +634,17 @@ func TestGeneratePod(t *testing.T) { if test.expectErr && err != nil { continue } - if !reflect.DeepEqual(obj.(*api.Pod), test.expected) { - t.Errorf("\nexpected:\n%#v\nsaw:\n%#v", test.expected, obj.(*api.Pod)) + if !reflect.DeepEqual(obj.(*v1.Pod), test.expected) { + t.Errorf("\nexpected:\n%#v\nsaw:\n%#v", test.expected, obj.(*v1.Pod)) } } } func TestGenerateDeployment(t *testing.T) { + three := int32(3) tests := []struct { params map[string]interface{} - expected *extensions.Deployment + expected *extensionsv1beta1.Deployment expectErr bool }{ { @@ -660,33 +663,33 @@ func TestGenerateDeployment(t *testing.T) { "requests": "cpu=100m,memory=100Mi", "limits": "cpu=400m,memory=200Mi", }, - expected: &extensions.Deployment{ + expected: &extensionsv1beta1.Deployment{ ObjectMeta: metav1.ObjectMeta{ Name: "foo", Labels: map[string]string{"foo": "bar", "baz": "blah"}, }, - Spec: extensions.DeploymentSpec{ - Replicas: 3, + Spec: extensionsv1beta1.DeploymentSpec{ + Replicas: &three, Selector: &metav1.LabelSelector{MatchLabels: map[string]string{"foo": "bar", "baz": "blah"}}, - Template: api.PodTemplateSpec{ + Template: v1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: map[string]string{"foo": "bar", "baz": "blah"}, }, - Spec: api.PodSpec{ - Containers: []api.Container{ + Spec: v1.PodSpec{ + Containers: []v1.Container{ { Name: "foo", Image: "someimage", - ImagePullPolicy: api.PullAlways, + ImagePullPolicy: v1.PullAlways, Stdin: true, - Ports: []api.ContainerPort{ + Ports: []v1.ContainerPort{ { ContainerPort: 80, HostPort: 80, }, }, Command: []string{"bar", "baz", "blah"}, - Env: []api.EnvVar{ + Env: []v1.EnvVar{ { Name: "a", Value: "b", @@ -696,14 +699,14 @@ func TestGenerateDeployment(t *testing.T) { Value: "d", }, }, - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceCPU: resource.MustParse("100m"), - api.ResourceMemory: resource.MustParse("100Mi"), + Resources: v1.ResourceRequirements{ + Requests: v1.ResourceList{ + v1.ResourceCPU: resource.MustParse("100m"), + v1.ResourceMemory: resource.MustParse("100Mi"), }, - Limits: api.ResourceList{ - api.ResourceCPU: resource.MustParse("400m"), - api.ResourceMemory: resource.MustParse("200Mi"), + Limits: v1.ResourceList{ + v1.ResourceCPU: resource.MustParse("400m"), + v1.ResourceMemory: resource.MustParse("200Mi"), }, }, }, @@ -724,8 +727,8 @@ func TestGenerateDeployment(t *testing.T) { if test.expectErr && err != nil { continue } - if !reflect.DeepEqual(obj.(*extensions.Deployment), test.expected) { - t.Errorf("\nexpected:\n%#v\nsaw:\n%#v", test.expected, obj.(*extensions.Deployment)) + if !reflect.DeepEqual(obj.(*extensionsv1beta1.Deployment), test.expected) { + t.Errorf("\nexpected:\n%#v\nsaw:\n%#v", test.expected, obj.(*extensionsv1beta1.Deployment)) } } } @@ -733,7 +736,7 @@ func TestGenerateDeployment(t *testing.T) { func TestGenerateJob(t *testing.T) { tests := []struct { params map[string]interface{} - expected *batch.Job + expected *batchv1.Job expectErr bool }{ { @@ -752,32 +755,32 @@ func TestGenerateJob(t *testing.T) { "limits": "cpu=400m,memory=200Mi", "restart": "OnFailure", }, - expected: &batch.Job{ + expected: &batchv1.Job{ ObjectMeta: metav1.ObjectMeta{ Name: "foo", Labels: map[string]string{"foo": "bar", "baz": "blah"}, }, - Spec: batch.JobSpec{ - Template: api.PodTemplateSpec{ + Spec: batchv1.JobSpec{ + Template: v1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: map[string]string{"foo": "bar", "baz": "blah"}, }, - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyOnFailure, - Containers: []api.Container{ + Spec: v1.PodSpec{ + RestartPolicy: v1.RestartPolicyOnFailure, + Containers: []v1.Container{ { Name: "foo", Image: "someimage", Stdin: true, StdinOnce: false, - Ports: []api.ContainerPort{ + Ports: []v1.ContainerPort{ { ContainerPort: 80, HostPort: 80, }, }, Command: []string{"bar", "baz", "blah"}, - Env: []api.EnvVar{ + Env: []v1.EnvVar{ { Name: "a", Value: "b", @@ -787,14 +790,14 @@ func TestGenerateJob(t *testing.T) { Value: "d", }, }, - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceCPU: resource.MustParse("100m"), - api.ResourceMemory: resource.MustParse("100Mi"), + Resources: v1.ResourceRequirements{ + Requests: v1.ResourceList{ + v1.ResourceCPU: resource.MustParse("100m"), + v1.ResourceMemory: resource.MustParse("100Mi"), }, - Limits: api.ResourceList{ - api.ResourceCPU: resource.MustParse("400m"), - api.ResourceMemory: resource.MustParse("200Mi"), + Limits: v1.ResourceList{ + v1.ResourceCPU: resource.MustParse("400m"), + v1.ResourceMemory: resource.MustParse("200Mi"), }, }, }, @@ -815,8 +818,8 @@ func TestGenerateJob(t *testing.T) { if test.expectErr && err != nil { continue } - if !reflect.DeepEqual(obj.(*batch.Job), test.expected) { - t.Errorf("\nexpected:\n%#v\nsaw:\n%#v", test.expected, obj.(*batch.Job)) + if !reflect.DeepEqual(obj.(*batchv1.Job), test.expected) { + t.Errorf("\nexpected:\n%#v\nsaw:\n%#v", test.expected, obj.(*batchv1.Job)) } } } @@ -824,7 +827,7 @@ func TestGenerateJob(t *testing.T) { func TestGenerateCronJob(t *testing.T) { tests := []struct { params map[string]interface{} - expected *batch.CronJob + expected *batchv2alpha1.CronJob expectErr bool }{ { @@ -844,36 +847,36 @@ func TestGenerateCronJob(t *testing.T) { "restart": "OnFailure", "schedule": "0/5 * * * ?", }, - expected: &batch.CronJob{ + expected: &batchv2alpha1.CronJob{ ObjectMeta: metav1.ObjectMeta{ Name: "foo", Labels: map[string]string{"foo": "bar", "baz": "blah"}, }, - Spec: batch.CronJobSpec{ + Spec: batchv2alpha1.CronJobSpec{ Schedule: "0/5 * * * ?", - ConcurrencyPolicy: batch.AllowConcurrent, - JobTemplate: batch.JobTemplateSpec{ - Spec: batch.JobSpec{ - Template: api.PodTemplateSpec{ + ConcurrencyPolicy: batchv2alpha1.AllowConcurrent, + JobTemplate: batchv2alpha1.JobTemplateSpec{ + Spec: batchv1.JobSpec{ + Template: v1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: map[string]string{"foo": "bar", "baz": "blah"}, }, - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyOnFailure, - Containers: []api.Container{ + Spec: v1.PodSpec{ + RestartPolicy: v1.RestartPolicyOnFailure, + Containers: []v1.Container{ { Name: "foo", Image: "someimage", Stdin: true, StdinOnce: false, - Ports: []api.ContainerPort{ + Ports: []v1.ContainerPort{ { ContainerPort: 80, HostPort: 80, }, }, Command: []string{"bar", "baz", "blah"}, - Env: []api.EnvVar{ + Env: []v1.EnvVar{ { Name: "a", Value: "b", @@ -883,14 +886,14 @@ func TestGenerateCronJob(t *testing.T) { Value: "d", }, }, - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceCPU: resource.MustParse("100m"), - api.ResourceMemory: resource.MustParse("100Mi"), + Resources: v1.ResourceRequirements{ + Requests: v1.ResourceList{ + v1.ResourceCPU: resource.MustParse("100m"), + v1.ResourceMemory: resource.MustParse("100Mi"), }, - Limits: api.ResourceList{ - api.ResourceCPU: resource.MustParse("400m"), - api.ResourceMemory: resource.MustParse("200Mi"), + Limits: v1.ResourceList{ + v1.ResourceCPU: resource.MustParse("400m"), + v1.ResourceMemory: resource.MustParse("200Mi"), }, }, }, @@ -913,8 +916,8 @@ func TestGenerateCronJob(t *testing.T) { if test.expectErr && err != nil { continue } - if !reflect.DeepEqual(obj.(*batch.CronJob), test.expected) { - t.Errorf("\nexpected:\n%#v\nsaw:\n%#v", test.expected, obj.(*batch.CronJob)) + if !reflect.DeepEqual(obj.(*batchv2alpha1.CronJob), test.expected) { + t.Errorf("\nexpected:\n%#v\nsaw:\n%#v", test.expected, obj.(*batchv2alpha1.CronJob)) } } } @@ -922,7 +925,7 @@ func TestGenerateCronJob(t *testing.T) { func TestParseEnv(t *testing.T) { tests := []struct { envArray []string - expected []api.EnvVar + expected []v1.EnvVar expectErr bool test string }{ @@ -932,7 +935,7 @@ func TestParseEnv(t *testing.T) { "HAS_COMMAS=foo,bar", "HAS_EQUALS=jJnro54iUu75xNy==", }, - expected: []api.EnvVar{ + expected: []v1.EnvVar{ { Name: "THIS_ENV", Value: "isOK", @@ -953,7 +956,7 @@ func TestParseEnv(t *testing.T) { envArray: []string{ "WITH_OUT_EQUALS", }, - expected: []api.EnvVar{}, + expected: []v1.EnvVar{}, expectErr: true, test: "test case 2", }, @@ -961,7 +964,7 @@ func TestParseEnv(t *testing.T) { envArray: []string{ "WITH_OUT_VALUES=", }, - expected: []api.EnvVar{ + expected: []v1.EnvVar{ { Name: "WITH_OUT_VALUES", Value: "", @@ -974,7 +977,7 @@ func TestParseEnv(t *testing.T) { envArray: []string{ "=WITH_OUT_NAME", }, - expected: []api.EnvVar{}, + expected: []v1.EnvVar{}, expectErr: true, test: "test case 4", },