diff --git a/pkg/kubectl/cmd/create/BUILD b/pkg/kubectl/cmd/create/BUILD index c953ef12bc..5dc33d6457 100644 --- a/pkg/kubectl/cmd/create/BUILD +++ b/pkg/kubectl/cmd/create/BUILD @@ -31,6 +31,7 @@ go_library( "//pkg/kubectl/scheme:go_default_library", "//pkg/kubectl/util/i18n:go_default_library", "//pkg/kubectl/util/templates:go_default_library", + "//staging/src/k8s.io/api/apps/v1:go_default_library", "//staging/src/k8s.io/api/batch/v1:go_default_library", "//staging/src/k8s.io/api/batch/v1beta1:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", @@ -82,6 +83,7 @@ go_test( "//pkg/kubectl/cmd/testing:go_default_library", "//pkg/kubectl/generate/versioned:go_default_library", "//pkg/kubectl/scheme:go_default_library", + "//staging/src/k8s.io/api/apps/v1:go_default_library", "//staging/src/k8s.io/api/batch/v1:go_default_library", "//staging/src/k8s.io/api/batch/v1beta1:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", diff --git a/pkg/kubectl/cmd/create/create_job.go b/pkg/kubectl/cmd/create/create_job.go index c1ca95fc4f..d6291ea01d 100644 --- a/pkg/kubectl/cmd/create/create_job.go +++ b/pkg/kubectl/cmd/create/create_job.go @@ -21,6 +21,7 @@ import ( "github.com/spf13/cobra" + appsv1 "k8s.io/api/apps/v1" batchv1 "k8s.io/api/batch/v1" batchv1beta1 "k8s.io/api/batch/v1beta1" corev1 "k8s.io/api/core/v1" @@ -230,6 +231,7 @@ func (o *CreateJobOptions) createJobFromCronJob(cronJob *batchv1beta1.CronJob) * for k, v := range cronJob.Spec.JobTemplate.Annotations { annotations[k] = v } + return &batchv1.Job{ // this is ok because we know exactly how we want to be serialized TypeMeta: metav1.TypeMeta{APIVersion: batchv1.SchemeGroupVersion.String(), Kind: "Job"}, @@ -237,6 +239,9 @@ func (o *CreateJobOptions) createJobFromCronJob(cronJob *batchv1beta1.CronJob) * Name: o.Name, Annotations: annotations, Labels: cronJob.Spec.JobTemplate.Labels, + OwnerReferences: []metav1.OwnerReference{ + *metav1.NewControllerRef(cronJob, appsv1.SchemeGroupVersion.WithKind("CronJob")), + }, }, Spec: cronJob.Spec.JobTemplate.Spec, } diff --git a/pkg/kubectl/cmd/create/create_job_test.go b/pkg/kubectl/cmd/create/create_job_test.go index 317010c287..585d452981 100644 --- a/pkg/kubectl/cmd/create/create_job_test.go +++ b/pkg/kubectl/cmd/create/create_job_test.go @@ -20,6 +20,7 @@ import ( "strings" "testing" + apps "k8s.io/api/apps/v1" batchv1 "k8s.io/api/batch/v1" batchv1beta1 "k8s.io/api/batch/v1beta1" corev1 "k8s.io/api/core/v1" @@ -137,32 +138,34 @@ func TestCreateJob(t *testing.T) { func TestCreateJobFromCronJob(t *testing.T) { jobName := "test-job" + cronJob := &batchv1beta1.CronJob{ + Spec: batchv1beta1.CronJobSpec{ + JobTemplate: batchv1beta1.JobTemplateSpec{ + Spec: batchv1.JobSpec{ + Template: corev1.PodTemplateSpec{ + Spec: corev1.PodSpec{ + Containers: []corev1.Container{ + {Image: "test-image"}, + }, + RestartPolicy: corev1.RestartPolicyNever, + }, + }, + }, + }, + }, + } tests := map[string]struct { from *batchv1beta1.CronJob expected *batchv1.Job }{ "from CronJob": { - from: &batchv1beta1.CronJob{ - Spec: batchv1beta1.CronJobSpec{ - JobTemplate: batchv1beta1.JobTemplateSpec{ - Spec: batchv1.JobSpec{ - Template: corev1.PodTemplateSpec{ - Spec: corev1.PodSpec{ - Containers: []corev1.Container{ - {Image: "test-image"}, - }, - RestartPolicy: corev1.RestartPolicyNever, - }, - }, - }, - }, - }, - }, + from: cronJob, expected: &batchv1.Job{ TypeMeta: metav1.TypeMeta{APIVersion: batchv1.SchemeGroupVersion.String(), Kind: "Job"}, ObjectMeta: metav1.ObjectMeta{ - Name: jobName, - Annotations: map[string]string{"cronjob.kubernetes.io/instantiate": "manual"}, + Name: jobName, + Annotations: map[string]string{"cronjob.kubernetes.io/instantiate": "manual"}, + OwnerReferences: []metav1.OwnerReference{*metav1.NewControllerRef(cronJob, apps.SchemeGroupVersion.WithKind("CronJob"))}, }, Spec: batchv1.JobSpec{ Template: corev1.PodTemplateSpec{ @@ -184,6 +187,7 @@ func TestCreateJobFromCronJob(t *testing.T) { Name: jobName, } job := o.createJobFromCronJob(tc.from) + if !apiequality.Semantic.DeepEqual(job, tc.expected) { t.Errorf("expected:\n%#v\ngot:\n%#v", tc.expected, job) }