From bbd65c85952ff50264c694c23f2473028568724d Mon Sep 17 00:00:00 2001 From: Mathieu MELIS Date: Thu, 15 Sep 2022 11:56:53 +0200 Subject: [PATCH] Add convert v1cronjob to v1job. --- .../client/util/conversion/Jobs.java | 80 ++++++++++++++----- .../client/util/conversion/JobsTest.java | 71 ++++++++++++++++ 2 files changed, 131 insertions(+), 20 deletions(-) create mode 100644 util/src/test/java/io/kubernetes/client/util/conversion/JobsTest.java diff --git a/util/src/main/java/io/kubernetes/client/util/conversion/Jobs.java b/util/src/main/java/io/kubernetes/client/util/conversion/Jobs.java index dac982b853..94a9a947c9 100644 --- a/util/src/main/java/io/kubernetes/client/util/conversion/Jobs.java +++ b/util/src/main/java/io/kubernetes/client/util/conversion/Jobs.java @@ -12,21 +12,24 @@ */ package io.kubernetes.client.util.conversion; +import io.kubernetes.client.openapi.models.V1CronJob; +import io.kubernetes.client.openapi.models.V1CronJobSpec; import io.kubernetes.client.openapi.models.V1Job; import io.kubernetes.client.openapi.models.V1JobSpec; import io.kubernetes.client.openapi.models.V1ObjectMeta; import io.kubernetes.client.openapi.models.V1OwnerReference; import io.kubernetes.client.openapi.models.V1beta1CronJob; import io.kubernetes.client.openapi.models.V1beta1CronJobSpec; -import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.Map; +import java.util.Objects; public class Jobs { /** - * Convert V1beta1CronJob object into V1Job object, based on kubectl code - * https://github.com/kubernetes/kubectl/blob/master/pkg/cmd/create/create_job.go + * Convert V1beta1CronJob object into V1Job object, based on kubectl code create_job * * @param cronJob cronJob object (required) * @param jobName cronJob name @@ -34,40 +37,77 @@ public class Jobs { */ public static V1Job cronJobToJob(V1beta1CronJob cronJob, String jobName) { - Map annotations = new HashMap<>(); - Map labels = new HashMap<>(); V1JobSpec jobSpec = null; - + V1ObjectMeta jobTemplateMetadata = null; V1beta1CronJobSpec cronJobSpec = cronJob.getSpec(); if (cronJobSpec != null && cronJobSpec.getJobTemplate() != null) { - V1ObjectMeta metadata = cronJobSpec.getJobTemplate().getMetadata(); - if (metadata != null) { - if (metadata.getAnnotations() != null) { - annotations.putAll(metadata.getAnnotations()); - } - if (metadata.getLabels() != null) { - labels.putAll(metadata.getLabels()); - } - } + jobTemplateMetadata = cronJobSpec.getJobTemplate().getMetadata(); jobSpec = cronJobSpec.getJobTemplate().getSpec(); } + return createV1Job( + jobName, cronJob.getApiVersion(), cronJob.getMetadata(), jobTemplateMetadata, jobSpec); + } + + /** + * Convert V1CronJob object into V1Job object, based on kubectl code create_job + * + * @param cronJob cronJob object (required) + * @param jobName cronJob name + * @return V1Job object + */ + public static V1Job cronJobToJob(V1CronJob cronJob, String jobName) { + + V1JobSpec jobSpec = null; + V1ObjectMeta jobTemplateMetadata = null; + V1CronJobSpec cronJobSpec = cronJob.getSpec(); + + if (cronJobSpec != null && cronJobSpec.getJobTemplate() != null) { + jobTemplateMetadata = cronJobSpec.getJobTemplate().getMetadata(); + jobSpec = cronJobSpec.getJobTemplate().getSpec(); + } + + return createV1Job( + jobName, cronJob.getApiVersion(), cronJob.getMetadata(), jobTemplateMetadata, jobSpec); + } + + private static V1Job createV1Job( + String jobName, + String cronJobApiVersion, + V1ObjectMeta cronJobMetadata, + V1ObjectMeta jobTemplateMetadata, + V1JobSpec jobSpec) { + Objects.requireNonNull(cronJobMetadata); + + Map annotations = new HashMap<>(); + Map labels = new HashMap<>(); + + if (jobTemplateMetadata != null) { + if (jobTemplateMetadata.getAnnotations() != null) { + annotations.putAll(jobTemplateMetadata.getAnnotations()); + } + if (jobTemplateMetadata.getLabels() != null) { + labels.putAll(jobTemplateMetadata.getLabels()); + } + } + annotations.put("cronjob.kubernetes.io/instantiate", "manual"); V1OwnerReference v1OwnerReference = new V1OwnerReference(); v1OwnerReference.setKind("CronJob"); - v1OwnerReference.setName(cronJob.getMetadata().getName()); + v1OwnerReference.setName(cronJobMetadata.getName()); v1OwnerReference.setBlockOwnerDeletion(true); v1OwnerReference.setController(true); - v1OwnerReference.setUid(cronJob.getMetadata().getUid()); - v1OwnerReference.setApiVersion("batch/v1beta1"); + v1OwnerReference.setUid(cronJobMetadata.getUid()); + v1OwnerReference.setApiVersion(cronJobApiVersion); V1ObjectMeta jobMetadata = new V1ObjectMeta(); - jobMetadata.setName(jobName != null ? jobName : cronJob.getMetadata().getName() + "-manual"); + jobMetadata.setName(jobName != null ? jobName : cronJobMetadata.getName() + "-manual"); jobMetadata.setAnnotations(annotations); jobMetadata.setLabels(labels); - jobMetadata.setOwnerReferences(Arrays.asList(v1OwnerReference)); + jobMetadata.setOwnerReferences(Collections.singletonList(v1OwnerReference)); V1Job job = new V1Job(); job.setKind("Job"); diff --git a/util/src/test/java/io/kubernetes/client/util/conversion/JobsTest.java b/util/src/test/java/io/kubernetes/client/util/conversion/JobsTest.java new file mode 100644 index 0000000000..b00cee4251 --- /dev/null +++ b/util/src/test/java/io/kubernetes/client/util/conversion/JobsTest.java @@ -0,0 +1,71 @@ +/* +Copyright 2022 The Kubernetes Authors. +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package io.kubernetes.client.util.conversion; + +import static org.junit.Assert.*; + +import io.kubernetes.client.openapi.models.V1CronJob; +import io.kubernetes.client.openapi.models.V1Job; +import io.kubernetes.client.openapi.models.V1ObjectMeta; +import io.kubernetes.client.openapi.models.V1beta1CronJob; +import org.junit.Test; + +/** Tests for the Jobs helper class */ +public class JobsTest { + + @Test + public void testCronJobToJobShouldReturnV1JobWithV1beta1CronJob() { + + String cronJobName = "cronJobName"; + V1ObjectMeta v1ObjectMeta = new V1ObjectMeta(); + v1ObjectMeta.setName(cronJobName); + + V1beta1CronJob v1beta1CronJob = new V1beta1CronJob(); + v1beta1CronJob.setMetadata(v1ObjectMeta); + v1beta1CronJob.setApiVersion("batch/v1beta1"); + + V1Job v1Job = Jobs.cronJobToJob(v1beta1CronJob, null); + + assertNotNull(v1Job.getMetadata()); + assertNotNull(v1Job.getMetadata().getOwnerReferences()); + assertFalse(v1Job.getMetadata().getOwnerReferences().isEmpty()); + + assertEquals("batch/v1", v1Job.getApiVersion()); + assertEquals(cronJobName + "-manual", v1Job.getMetadata().getName()); + assertEquals( + v1beta1CronJob.getApiVersion(), + v1Job.getMetadata().getOwnerReferences().get(0).getApiVersion()); + } + + @Test + public void testCronJobToJobShouldReturnV1JobWithV1CronJob() { + String cronJobName = "cronJobName"; + V1ObjectMeta v1ObjectMeta = new V1ObjectMeta(); + v1ObjectMeta.setName(cronJobName); + + V1CronJob v1CronJob = new V1CronJob(); + v1CronJob.setMetadata(v1ObjectMeta); + v1CronJob.setApiVersion("batch/v1"); + + V1Job v1Job = Jobs.cronJobToJob(v1CronJob, null); + + assertNotNull(v1Job.getMetadata()); + assertNotNull(v1Job.getMetadata().getOwnerReferences()); + assertFalse(v1Job.getMetadata().getOwnerReferences().isEmpty()); + + assertEquals("batch/v1", v1Job.getApiVersion()); + assertEquals(cronJobName + "-manual", v1Job.getMetadata().getName()); + assertEquals( + v1CronJob.getApiVersion(), v1Job.getMetadata().getOwnerReferences().get(0).getApiVersion()); + } +}