Merge pull request #99423 from soltysh/cronjob_controller
Switch cronjob controller to batch/v1 Kubernetes-commit: 06a4b6f3421b11a3df4653e07bcee8b2cfcc1b12
This commit is contained in:
commit
dbd0f6b6c6
|
@ -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
12
go.mod
|
@ -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
6
go.sum
|
@ -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=
|
||||
|
|
|
@ -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(),
|
||||
},
|
||||
|
|
|
@ -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(),
|
||||
},
|
||||
|
|
|
@ -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
Loading…
Reference in New Issue