Merge pull request #99423 from soltysh/cronjob_controller

Switch cronjob controller to batch/v1

Kubernetes-commit: 06a4b6f3421b11a3df4653e07bcee8b2cfcc1b12
This commit is contained in:
Kubernetes Publisher 2021-03-05 10:00:22 -08:00
commit dbd0f6b6c6
7 changed files with 24890 additions and 26092 deletions

6
Godeps/Godeps.json generated
View File

@ -920,7 +920,7 @@
},
{
"ImportPath": "k8s.io/api",
"Rev": "3687c906b8c9"
"Rev": "2e936115a3c6"
},
{
"ImportPath": "k8s.io/apimachinery",
@ -928,11 +928,11 @@
},
{
"ImportPath": "k8s.io/cli-runtime",
"Rev": "56fe8e947484"
"Rev": "0d4cd42bdbc7"
},
{
"ImportPath": "k8s.io/client-go",
"Rev": "1745c9faaaff"
"Rev": "75a1e7fffe07"
},
{
"ImportPath": "k8s.io/code-generator",

12
go.mod
View File

@ -33,10 +33,10 @@ require (
github.com/stretchr/testify v1.6.1
golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073
gopkg.in/yaml.v2 v2.2.8
k8s.io/api v0.0.0-20210306132658-3687c906b8c9
k8s.io/api v0.0.0-20210306132700-2e936115a3c6
k8s.io/apimachinery v0.0.0-20210306132128-283a3268598b
k8s.io/cli-runtime v0.0.0-20210306142334-56fe8e947484
k8s.io/client-go v0.0.0-20210306133319-1745c9faaaff
k8s.io/cli-runtime v0.0.0-20210306142336-0d4cd42bdbc7
k8s.io/client-go v0.0.0-20210306133322-75a1e7fffe07
k8s.io/component-base v0.0.0-20210306134452-c5389948b7b3
k8s.io/component-helpers v0.0.0-20210306134759-13f6e97127a5
k8s.io/klog/v2 v2.5.0
@ -48,10 +48,10 @@ require (
)
replace (
k8s.io/api => k8s.io/api v0.0.0-20210306132658-3687c906b8c9
k8s.io/api => k8s.io/api v0.0.0-20210306132700-2e936115a3c6
k8s.io/apimachinery => k8s.io/apimachinery v0.0.0-20210306132128-283a3268598b
k8s.io/cli-runtime => k8s.io/cli-runtime v0.0.0-20210306142334-56fe8e947484
k8s.io/client-go => k8s.io/client-go v0.0.0-20210306133319-1745c9faaaff
k8s.io/cli-runtime => k8s.io/cli-runtime v0.0.0-20210306142336-0d4cd42bdbc7
k8s.io/client-go => k8s.io/client-go v0.0.0-20210306133322-75a1e7fffe07
k8s.io/code-generator => k8s.io/code-generator v0.0.0-20210306131731-cc2553e427ca
k8s.io/component-base => k8s.io/component-base v0.0.0-20210306134452-c5389948b7b3
k8s.io/component-helpers => k8s.io/component-helpers v0.0.0-20210306134759-13f6e97127a5

6
go.sum
View File

@ -628,10 +628,10 @@ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWh
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
k8s.io/api v0.0.0-20210306132658-3687c906b8c9/go.mod h1:oXIlxI7P0Fm+wAl92K966U84hJ8jYH+vvhPMIFggXJQ=
k8s.io/api v0.0.0-20210306132700-2e936115a3c6/go.mod h1:oXIlxI7P0Fm+wAl92K966U84hJ8jYH+vvhPMIFggXJQ=
k8s.io/apimachinery v0.0.0-20210306132128-283a3268598b/go.mod h1:2LERmYT9PI3b4uQt87vnb2UVkblBDzZhucIf8PxvJ2o=
k8s.io/cli-runtime v0.0.0-20210306142334-56fe8e947484/go.mod h1:Il3RF6BFU3lV0degu95SlGwPZaFPXWCCe6TW7CKl8i0=
k8s.io/client-go v0.0.0-20210306133319-1745c9faaaff/go.mod h1:6sIQTB5ixU8S85LXc02aEOi6MFC7iU6ch0aEcoorij8=
k8s.io/cli-runtime v0.0.0-20210306142336-0d4cd42bdbc7/go.mod h1:75VZI2v5ikaS8lKia04ivLTySY9Ylvec0MIC6Ctu+4A=
k8s.io/client-go v0.0.0-20210306133322-75a1e7fffe07/go.mod h1:hcawgCmh6c53kdHiIH1dk9ZLukLcM6NPVE8rs3YLqdU=
k8s.io/code-generator v0.0.0-20210306131731-cc2553e427ca/go.mod h1:+mcF5UBXubtZGDob4qNax0wjPWZG3wKwQNlGJiVCadA=
k8s.io/component-base v0.0.0-20210306134452-c5389948b7b3/go.mod h1:2ya12jDaQJjcaKT8nzcj8NaBD/pVn7wbgKhamPmQJSs=
k8s.io/component-helpers v0.0.0-20210306134759-13f6e97127a5/go.mod h1:kSezxJTi9WjrBqCVq2uzr2STcQ5TMu85JuNmNpWo8to=

View File

@ -177,7 +177,7 @@ func (o *CreateJobOptions) Run() error {
job = o.createJob()
} else {
infos, err := o.Builder.
Unstructured().
WithScheme(scheme.Scheme, scheme.Scheme.PrioritizedVersionsAllGroups()...).
NamespaceParam(o.Namespace).DefaultNamespace().
ResourceTypeOrNameArgs(false, o.From).
Flatten().
@ -191,16 +191,14 @@ func (o *CreateJobOptions) Run() error {
return fmt.Errorf("from must be an existing cronjob")
}
uncastVersionedObj, err := scheme.Scheme.ConvertToVersion(infos[0].Object, batchv1beta1.SchemeGroupVersion)
if err != nil {
return fmt.Errorf("from must be an existing cronjob: %v", err)
switch obj := infos[0].Object.(type) {
case *batchv1.CronJob:
job = o.createJobFromCronJob(obj)
case *batchv1beta1.CronJob:
job = o.createJobFromCronJobV1Beta1(obj)
default:
return fmt.Errorf("unknown object type %T", obj)
}
cronJob, ok := uncastVersionedObj.(*batchv1beta1.CronJob)
if !ok {
return fmt.Errorf("from must be an existing cronjob")
}
job = o.createJobFromCronJob(cronJob)
}
if err := util.CreateOrUpdateAnnotation(o.CreateAnnotation, job, scheme.DefaultJSONEncoder()); err != nil {
@ -256,7 +254,39 @@ func (o *CreateJobOptions) createJob() *batchv1.Job {
return job
}
func (o *CreateJobOptions) createJobFromCronJob(cronJob *batchv1beta1.CronJob) *batchv1.Job {
func (o *CreateJobOptions) createJobFromCronJobV1Beta1(cronJob *batchv1beta1.CronJob) *batchv1.Job {
annotations := make(map[string]string)
annotations["cronjob.kubernetes.io/instantiate"] = "manual"
for k, v := range cronJob.Spec.JobTemplate.Annotations {
annotations[k] = v
}
job := &batchv1.Job{
// this is ok because we know exactly how we want to be serialized
TypeMeta: metav1.TypeMeta{APIVersion: batchv1.SchemeGroupVersion.String(), Kind: "Job"},
ObjectMeta: metav1.ObjectMeta{
Name: o.Name,
Annotations: annotations,
Labels: cronJob.Spec.JobTemplate.Labels,
OwnerReferences: []metav1.OwnerReference{
{
// TODO (soltysh): switch this to v1 in v1.22, when n-1 skew will be fulfilled
APIVersion: batchv1beta1.SchemeGroupVersion.String(),
Kind: "CronJob",
Name: cronJob.GetName(),
UID: cronJob.GetUID(),
},
},
},
Spec: cronJob.Spec.JobTemplate.Spec,
}
if o.EnforceNamespace {
job.Namespace = o.Namespace
}
return job
}
func (o *CreateJobOptions) createJobFromCronJob(cronJob *batchv1.CronJob) *batchv1.Job {
annotations := make(map[string]string)
annotations["cronjob.kubernetes.io/instantiate"] = "manual"
for k, v := range cronJob.Spec.JobTemplate.Annotations {
@ -273,7 +303,7 @@ func (o *CreateJobOptions) createJobFromCronJob(cronJob *batchv1beta1.CronJob) *
OwnerReferences: []metav1.OwnerReference{
{
APIVersion: batchv1beta1.SchemeGroupVersion.String(),
Kind: cronJob.Kind,
Kind: "CronJob",
Name: cronJob.GetName(),
UID: cronJob.GetUID(),
},

View File

@ -135,7 +135,7 @@ func TestCreateJob(t *testing.T) {
}
}
func TestCreateJobFromCronJob(t *testing.T) {
func TestCreateJobFromCronJobV1Beta1(t *testing.T) {
jobName := "test-job"
cronJob := &batchv1beta1.CronJob{
Spec: batchv1beta1.CronJobSpec{
@ -167,7 +167,73 @@ func TestCreateJobFromCronJob(t *testing.T) {
OwnerReferences: []metav1.OwnerReference{
{
APIVersion: batchv1beta1.SchemeGroupVersion.String(),
Kind: cronJob.Kind,
Kind: "CronJob",
Name: cronJob.GetName(),
UID: cronJob.GetUID(),
},
},
},
Spec: batchv1.JobSpec{
Template: corev1.PodTemplateSpec{
Spec: corev1.PodSpec{
Containers: []corev1.Container{
{Image: "test-image"},
},
RestartPolicy: corev1.RestartPolicyNever,
},
},
},
},
},
}
for name, tc := range tests {
t.Run(name, func(t *testing.T) {
o := &CreateJobOptions{
Name: jobName,
}
job := o.createJobFromCronJobV1Beta1(tc.from)
if !apiequality.Semantic.DeepEqual(job, tc.expected) {
t.Errorf("expected:\n%#v\ngot:\n%#v", tc.expected, job)
}
})
}
}
func TestCreateJobFromCronJob(t *testing.T) {
jobName := "test-job"
cronJob := &batchv1.CronJob{
Spec: batchv1.CronJobSpec{
JobTemplate: batchv1.JobTemplateSpec{
Spec: batchv1.JobSpec{
Template: corev1.PodTemplateSpec{
Spec: corev1.PodSpec{
Containers: []corev1.Container{
{Image: "test-image"},
},
RestartPolicy: corev1.RestartPolicyNever,
},
},
},
},
},
}
tests := map[string]struct {
from *batchv1.CronJob
expected *batchv1.Job
}{
"from CronJob": {
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"},
OwnerReferences: []metav1.OwnerReference{
{
APIVersion: batchv1beta1.SchemeGroupVersion.String(),
Kind: "CronJob",
Name: cronJob.GetName(),
UID: cronJob.GetUID(),
},

View File

@ -30,7 +30,7 @@ import (
var fakeSchema = testing.Fake{Path: filepath.Join("..", "..", "..", "testdata", "openapi", "swagger.json")}
var _ = Describe("Reading apps/v1beta1/Deployment from openAPIData", func() {
var _ = Describe("Reading apps/v1/Deployment from openAPIData", func() {
var resources openapi.Resources
BeforeEach(func() {
s, err := fakeSchema.OpenAPISchema()
@ -41,7 +41,7 @@ var _ = Describe("Reading apps/v1beta1/Deployment from openAPIData", func() {
gvk := schema.GroupVersionKind{
Kind: "Deployment",
Version: "v1beta1",
Version: "v1",
Group: "apps",
}

File diff suppressed because it is too large Load Diff