You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ac...@apache.org on 2023/12/05 11:05:26 UTC

(camel) 01/03: CAMEL-20185 - Kubernetes CronJob Component

This is an automated email from the ASF dual-hosted git repository.

acosentino pushed a commit to branch CAMEL-20185
in repository https://gitbox.apache.org/repos/asf/camel.git

commit ea98237a97050c645cb7a1478137f9020d1715e2
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Tue Dec 5 11:53:18 2023 +0100

    CAMEL-20185 - Kubernetes CronJob Component
    
    Signed-off-by: Andrea Cosentino <an...@gmail.com>
---
 .../KubernetesCronJobComponentConfigurer.java      |  72 +++++++
 .../KubernetesCronJobEndpointConfigurer.java       | 229 +++++++++++++++++++++
 .../KubernetesCronJobEndpointUriFactory.java       | 114 ++++++++++
 .../services/org/apache/camel/component.properties |   2 +-
 .../org/apache/camel/component/kubernetes-cronjob  |   2 +
 .../camel/configurer/kubernetes-cronjob-component  |   2 +
 .../camel/configurer/kubernetes-cronjob-endpoint   |   2 +
 .../camel/urifactory/kubernetes-cronjob-endpoint   |   2 +
 .../kubernetes/cronjob/kubernetes-cronjob.json     |  72 +++++++
 .../component/kubernetes/KubernetesConstants.java  |  11 +
 .../component/kubernetes/KubernetesOperations.java |  10 +-
 .../cronjob/KubernetesCronJobComponent.java        |  30 +++
 .../cronjob/KubernetesCronJobEndpoint.java         |  52 +++++
 .../cronjob/KubernetesCronJobProducer.java         | 183 ++++++++++++++++
 .../producer/KubernetesCronJobProducerTest.java    | 174 ++++++++++++++++
 15 files changed, 955 insertions(+), 2 deletions(-)

diff --git a/components/camel-kubernetes/src/generated/java/org/apache/camel/component/kubernetes/cronjob/KubernetesCronJobComponentConfigurer.java b/components/camel-kubernetes/src/generated/java/org/apache/camel/component/kubernetes/cronjob/KubernetesCronJobComponentConfigurer.java
new file mode 100644
index 00000000000..12cd5e1fb7e
--- /dev/null
+++ b/components/camel-kubernetes/src/generated/java/org/apache/camel/component/kubernetes/cronjob/KubernetesCronJobComponentConfigurer.java
@@ -0,0 +1,72 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.kubernetes.cronjob;
+
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.ExtendedPropertyConfigurerGetter;
+import org.apache.camel.spi.PropertyConfigurerGetter;
+import org.apache.camel.spi.ConfigurerStrategy;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.util.CaseInsensitiveMap;
+import org.apache.camel.support.component.PropertyConfigurerSupport;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class KubernetesCronJobComponentConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {
+
+    @Override
+    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
+        KubernetesCronJobComponent target = (KubernetesCronJobComponent) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "autowiredenabled":
+        case "autowiredEnabled": target.setAutowiredEnabled(property(camelContext, boolean.class, value)); return true;
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": target.setBridgeErrorHandler(property(camelContext, boolean.class, value)); return true;
+        case "kubernetesclient":
+        case "kubernetesClient": target.setKubernetesClient(property(camelContext, io.fabric8.kubernetes.client.KubernetesClient.class, value)); return true;
+        case "lazystartproducer":
+        case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
+        default: return false;
+        }
+    }
+
+    @Override
+    public String[] getAutowiredNames() {
+        return new String[]{"kubernetesClient"};
+    }
+
+    @Override
+    public Class<?> getOptionType(String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "autowiredenabled":
+        case "autowiredEnabled": return boolean.class;
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": return boolean.class;
+        case "kubernetesclient":
+        case "kubernetesClient": return io.fabric8.kubernetes.client.KubernetesClient.class;
+        case "lazystartproducer":
+        case "lazyStartProducer": return boolean.class;
+        default: return null;
+        }
+    }
+
+    @Override
+    public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
+        KubernetesCronJobComponent target = (KubernetesCronJobComponent) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "autowiredenabled":
+        case "autowiredEnabled": return target.isAutowiredEnabled();
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": return target.isBridgeErrorHandler();
+        case "kubernetesclient":
+        case "kubernetesClient": return target.getKubernetesClient();
+        case "lazystartproducer":
+        case "lazyStartProducer": return target.isLazyStartProducer();
+        default: return null;
+        }
+    }
+}
+
diff --git a/components/camel-kubernetes/src/generated/java/org/apache/camel/component/kubernetes/cronjob/KubernetesCronJobEndpointConfigurer.java b/components/camel-kubernetes/src/generated/java/org/apache/camel/component/kubernetes/cronjob/KubernetesCronJobEndpointConfigurer.java
new file mode 100644
index 00000000000..b7cde6001e2
--- /dev/null
+++ b/components/camel-kubernetes/src/generated/java/org/apache/camel/component/kubernetes/cronjob/KubernetesCronJobEndpointConfigurer.java
@@ -0,0 +1,229 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.kubernetes.cronjob;
+
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.ExtendedPropertyConfigurerGetter;
+import org.apache.camel.spi.PropertyConfigurerGetter;
+import org.apache.camel.spi.ConfigurerStrategy;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.util.CaseInsensitiveMap;
+import org.apache.camel.support.component.PropertyConfigurerSupport;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class KubernetesCronJobEndpointConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {
+
+    @Override
+    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
+        KubernetesCronJobEndpoint target = (KubernetesCronJobEndpoint) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "apiversion":
+        case "apiVersion": target.getConfiguration().setApiVersion(property(camelContext, java.lang.String.class, value)); return true;
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": target.setBridgeErrorHandler(property(camelContext, boolean.class, value)); return true;
+        case "cacertdata":
+        case "caCertData": target.getConfiguration().setCaCertData(property(camelContext, java.lang.String.class, value)); return true;
+        case "cacertfile":
+        case "caCertFile": target.getConfiguration().setCaCertFile(property(camelContext, java.lang.String.class, value)); return true;
+        case "clientcertdata":
+        case "clientCertData": target.getConfiguration().setClientCertData(property(camelContext, java.lang.String.class, value)); return true;
+        case "clientcertfile":
+        case "clientCertFile": target.getConfiguration().setClientCertFile(property(camelContext, java.lang.String.class, value)); return true;
+        case "clientkeyalgo":
+        case "clientKeyAlgo": target.getConfiguration().setClientKeyAlgo(property(camelContext, java.lang.String.class, value)); return true;
+        case "clientkeydata":
+        case "clientKeyData": target.getConfiguration().setClientKeyData(property(camelContext, java.lang.String.class, value)); return true;
+        case "clientkeyfile":
+        case "clientKeyFile": target.getConfiguration().setClientKeyFile(property(camelContext, java.lang.String.class, value)); return true;
+        case "clientkeypassphrase":
+        case "clientKeyPassphrase": target.getConfiguration().setClientKeyPassphrase(property(camelContext, java.lang.String.class, value)); return true;
+        case "connectiontimeout":
+        case "connectionTimeout": target.getConfiguration().setConnectionTimeout(property(camelContext, java.lang.Integer.class, value)); return true;
+        case "crdgroup":
+        case "crdGroup": target.getConfiguration().setCrdGroup(property(camelContext, java.lang.String.class, value)); return true;
+        case "crdname":
+        case "crdName": target.getConfiguration().setCrdName(property(camelContext, java.lang.String.class, value)); return true;
+        case "crdplural":
+        case "crdPlural": target.getConfiguration().setCrdPlural(property(camelContext, java.lang.String.class, value)); return true;
+        case "crdscope":
+        case "crdScope": target.getConfiguration().setCrdScope(property(camelContext, java.lang.String.class, value)); return true;
+        case "crdversion":
+        case "crdVersion": target.getConfiguration().setCrdVersion(property(camelContext, java.lang.String.class, value)); return true;
+        case "dnsdomain":
+        case "dnsDomain": target.getConfiguration().setDnsDomain(property(camelContext, java.lang.String.class, value)); return true;
+        case "exceptionhandler":
+        case "exceptionHandler": target.setExceptionHandler(property(camelContext, org.apache.camel.spi.ExceptionHandler.class, value)); return true;
+        case "exchangepattern":
+        case "exchangePattern": target.setExchangePattern(property(camelContext, org.apache.camel.ExchangePattern.class, value)); return true;
+        case "kubernetesclient":
+        case "kubernetesClient": target.getConfiguration().setKubernetesClient(property(camelContext, io.fabric8.kubernetes.client.KubernetesClient.class, value)); return true;
+        case "labelkey":
+        case "labelKey": target.getConfiguration().setLabelKey(property(camelContext, java.lang.String.class, value)); return true;
+        case "labelvalue":
+        case "labelValue": target.getConfiguration().setLabelValue(property(camelContext, java.lang.String.class, value)); return true;
+        case "lazystartproducer":
+        case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
+        case "namespace": target.getConfiguration().setNamespace(property(camelContext, java.lang.String.class, value)); return true;
+        case "oauthtoken":
+        case "oauthToken": target.getConfiguration().setOauthToken(property(camelContext, java.lang.String.class, value)); return true;
+        case "operation": target.getConfiguration().setOperation(property(camelContext, java.lang.String.class, value)); return true;
+        case "password": target.getConfiguration().setPassword(property(camelContext, java.lang.String.class, value)); return true;
+        case "poolsize":
+        case "poolSize": target.getConfiguration().setPoolSize(property(camelContext, int.class, value)); return true;
+        case "portname":
+        case "portName": target.getConfiguration().setPortName(property(camelContext, java.lang.String.class, value)); return true;
+        case "portprotocol":
+        case "portProtocol": target.getConfiguration().setPortProtocol(property(camelContext, java.lang.String.class, value)); return true;
+        case "resourcename":
+        case "resourceName": target.getConfiguration().setResourceName(property(camelContext, java.lang.String.class, value)); return true;
+        case "trustcerts":
+        case "trustCerts": target.getConfiguration().setTrustCerts(property(camelContext, java.lang.Boolean.class, value)); return true;
+        case "username": target.getConfiguration().setUsername(property(camelContext, java.lang.String.class, value)); return true;
+        default: return false;
+        }
+    }
+
+    @Override
+    public Class<?> getOptionType(String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "apiversion":
+        case "apiVersion": return java.lang.String.class;
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": return boolean.class;
+        case "cacertdata":
+        case "caCertData": return java.lang.String.class;
+        case "cacertfile":
+        case "caCertFile": return java.lang.String.class;
+        case "clientcertdata":
+        case "clientCertData": return java.lang.String.class;
+        case "clientcertfile":
+        case "clientCertFile": return java.lang.String.class;
+        case "clientkeyalgo":
+        case "clientKeyAlgo": return java.lang.String.class;
+        case "clientkeydata":
+        case "clientKeyData": return java.lang.String.class;
+        case "clientkeyfile":
+        case "clientKeyFile": return java.lang.String.class;
+        case "clientkeypassphrase":
+        case "clientKeyPassphrase": return java.lang.String.class;
+        case "connectiontimeout":
+        case "connectionTimeout": return java.lang.Integer.class;
+        case "crdgroup":
+        case "crdGroup": return java.lang.String.class;
+        case "crdname":
+        case "crdName": return java.lang.String.class;
+        case "crdplural":
+        case "crdPlural": return java.lang.String.class;
+        case "crdscope":
+        case "crdScope": return java.lang.String.class;
+        case "crdversion":
+        case "crdVersion": return java.lang.String.class;
+        case "dnsdomain":
+        case "dnsDomain": return java.lang.String.class;
+        case "exceptionhandler":
+        case "exceptionHandler": return org.apache.camel.spi.ExceptionHandler.class;
+        case "exchangepattern":
+        case "exchangePattern": return org.apache.camel.ExchangePattern.class;
+        case "kubernetesclient":
+        case "kubernetesClient": return io.fabric8.kubernetes.client.KubernetesClient.class;
+        case "labelkey":
+        case "labelKey": return java.lang.String.class;
+        case "labelvalue":
+        case "labelValue": return java.lang.String.class;
+        case "lazystartproducer":
+        case "lazyStartProducer": return boolean.class;
+        case "namespace": return java.lang.String.class;
+        case "oauthtoken":
+        case "oauthToken": return java.lang.String.class;
+        case "operation": return java.lang.String.class;
+        case "password": return java.lang.String.class;
+        case "poolsize":
+        case "poolSize": return int.class;
+        case "portname":
+        case "portName": return java.lang.String.class;
+        case "portprotocol":
+        case "portProtocol": return java.lang.String.class;
+        case "resourcename":
+        case "resourceName": return java.lang.String.class;
+        case "trustcerts":
+        case "trustCerts": return java.lang.Boolean.class;
+        case "username": return java.lang.String.class;
+        default: return null;
+        }
+    }
+
+    @Override
+    public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
+        KubernetesCronJobEndpoint target = (KubernetesCronJobEndpoint) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "apiversion":
+        case "apiVersion": return target.getConfiguration().getApiVersion();
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": return target.isBridgeErrorHandler();
+        case "cacertdata":
+        case "caCertData": return target.getConfiguration().getCaCertData();
+        case "cacertfile":
+        case "caCertFile": return target.getConfiguration().getCaCertFile();
+        case "clientcertdata":
+        case "clientCertData": return target.getConfiguration().getClientCertData();
+        case "clientcertfile":
+        case "clientCertFile": return target.getConfiguration().getClientCertFile();
+        case "clientkeyalgo":
+        case "clientKeyAlgo": return target.getConfiguration().getClientKeyAlgo();
+        case "clientkeydata":
+        case "clientKeyData": return target.getConfiguration().getClientKeyData();
+        case "clientkeyfile":
+        case "clientKeyFile": return target.getConfiguration().getClientKeyFile();
+        case "clientkeypassphrase":
+        case "clientKeyPassphrase": return target.getConfiguration().getClientKeyPassphrase();
+        case "connectiontimeout":
+        case "connectionTimeout": return target.getConfiguration().getConnectionTimeout();
+        case "crdgroup":
+        case "crdGroup": return target.getConfiguration().getCrdGroup();
+        case "crdname":
+        case "crdName": return target.getConfiguration().getCrdName();
+        case "crdplural":
+        case "crdPlural": return target.getConfiguration().getCrdPlural();
+        case "crdscope":
+        case "crdScope": return target.getConfiguration().getCrdScope();
+        case "crdversion":
+        case "crdVersion": return target.getConfiguration().getCrdVersion();
+        case "dnsdomain":
+        case "dnsDomain": return target.getConfiguration().getDnsDomain();
+        case "exceptionhandler":
+        case "exceptionHandler": return target.getExceptionHandler();
+        case "exchangepattern":
+        case "exchangePattern": return target.getExchangePattern();
+        case "kubernetesclient":
+        case "kubernetesClient": return target.getConfiguration().getKubernetesClient();
+        case "labelkey":
+        case "labelKey": return target.getConfiguration().getLabelKey();
+        case "labelvalue":
+        case "labelValue": return target.getConfiguration().getLabelValue();
+        case "lazystartproducer":
+        case "lazyStartProducer": return target.isLazyStartProducer();
+        case "namespace": return target.getConfiguration().getNamespace();
+        case "oauthtoken":
+        case "oauthToken": return target.getConfiguration().getOauthToken();
+        case "operation": return target.getConfiguration().getOperation();
+        case "password": return target.getConfiguration().getPassword();
+        case "poolsize":
+        case "poolSize": return target.getConfiguration().getPoolSize();
+        case "portname":
+        case "portName": return target.getConfiguration().getPortName();
+        case "portprotocol":
+        case "portProtocol": return target.getConfiguration().getPortProtocol();
+        case "resourcename":
+        case "resourceName": return target.getConfiguration().getResourceName();
+        case "trustcerts":
+        case "trustCerts": return target.getConfiguration().getTrustCerts();
+        case "username": return target.getConfiguration().getUsername();
+        default: return null;
+        }
+    }
+}
+
diff --git a/components/camel-kubernetes/src/generated/java/org/apache/camel/component/kubernetes/cronjob/KubernetesCronJobEndpointUriFactory.java b/components/camel-kubernetes/src/generated/java/org/apache/camel/component/kubernetes/cronjob/KubernetesCronJobEndpointUriFactory.java
new file mode 100644
index 00000000000..197107226c3
--- /dev/null
+++ b/components/camel-kubernetes/src/generated/java/org/apache/camel/component/kubernetes/cronjob/KubernetesCronJobEndpointUriFactory.java
@@ -0,0 +1,114 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.kubernetes.cronjob;
+
+import java.net.URISyntaxException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.camel.spi.EndpointUriFactory;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+public class KubernetesCronJobEndpointUriFactory extends org.apache.camel.support.component.EndpointUriFactorySupport implements EndpointUriFactory {
+
+    private static final String BASE = ":masterUrl";
+
+    private static final Set<String> PROPERTY_NAMES;
+    private static final Set<String> SECRET_PROPERTY_NAMES;
+    private static final Set<String> MULTI_VALUE_PREFIXES;
+    static {
+        Set<String> props = new HashSet<>(34);
+        props.add("apiVersion");
+        props.add("bridgeErrorHandler");
+        props.add("caCertData");
+        props.add("caCertFile");
+        props.add("clientCertData");
+        props.add("clientCertFile");
+        props.add("clientKeyAlgo");
+        props.add("clientKeyData");
+        props.add("clientKeyFile");
+        props.add("clientKeyPassphrase");
+        props.add("connectionTimeout");
+        props.add("crdGroup");
+        props.add("crdName");
+        props.add("crdPlural");
+        props.add("crdScope");
+        props.add("crdVersion");
+        props.add("dnsDomain");
+        props.add("exceptionHandler");
+        props.add("exchangePattern");
+        props.add("kubernetesClient");
+        props.add("labelKey");
+        props.add("labelValue");
+        props.add("lazyStartProducer");
+        props.add("masterUrl");
+        props.add("namespace");
+        props.add("oauthToken");
+        props.add("operation");
+        props.add("password");
+        props.add("poolSize");
+        props.add("portName");
+        props.add("portProtocol");
+        props.add("resourceName");
+        props.add("trustCerts");
+        props.add("username");
+        PROPERTY_NAMES = Collections.unmodifiableSet(props);
+        Set<String> secretProps = new HashSet<>(12);
+        secretProps.add("caCertData");
+        secretProps.add("caCertFile");
+        secretProps.add("clientCertData");
+        secretProps.add("clientCertFile");
+        secretProps.add("clientKeyAlgo");
+        secretProps.add("clientKeyData");
+        secretProps.add("clientKeyFile");
+        secretProps.add("clientKeyPassphrase");
+        secretProps.add("oauthToken");
+        secretProps.add("password");
+        secretProps.add("trustCerts");
+        secretProps.add("username");
+        SECRET_PROPERTY_NAMES = Collections.unmodifiableSet(secretProps);
+        MULTI_VALUE_PREFIXES = Collections.emptySet();
+    }
+
+    @Override
+    public boolean isEnabled(String scheme) {
+        return "kubernetes-cronjob".equals(scheme);
+    }
+
+    @Override
+    public String buildUri(String scheme, Map<String, Object> properties, boolean encode) throws URISyntaxException {
+        String syntax = scheme + BASE;
+        String uri = syntax;
+
+        Map<String, Object> copy = new HashMap<>(properties);
+
+        uri = buildPathParameter(syntax, uri, "masterUrl", null, true, copy);
+        uri = buildQueryParameters(uri, copy, encode);
+        return uri;
+    }
+
+    @Override
+    public Set<String> propertyNames() {
+        return PROPERTY_NAMES;
+    }
+
+    @Override
+    public Set<String> secretPropertyNames() {
+        return SECRET_PROPERTY_NAMES;
+    }
+
+    @Override
+    public Set<String> multiValuePrefixes() {
+        return MULTI_VALUE_PREFIXES;
+    }
+
+    @Override
+    public boolean isLenientProperties() {
+        return false;
+    }
+}
+
diff --git a/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/component.properties b/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/component.properties
index 1a460b7efb0..7a9327a50f9 100644
--- a/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/component.properties
+++ b/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/component.properties
@@ -1,5 +1,5 @@
 # Generated by camel build tools - do NOT edit this file!
-components=kubernetes-config-maps kubernetes-custom-resources kubernetes-deployments kubernetes-events kubernetes-hpa kubernetes-job kubernetes-namespaces kubernetes-nodes kubernetes-persistent-volumes kubernetes-persistent-volumes-claims kubernetes-pods kubernetes-replication-controllers kubernetes-resources-quota kubernetes-secrets kubernetes-service-accounts kubernetes-services openshift-build-configs openshift-builds openshift-deploymentconfigs
+components=kubernetes-config-maps kubernetes-cronjob kubernetes-custom-resources kubernetes-deployments kubernetes-events kubernetes-hpa kubernetes-job kubernetes-namespaces kubernetes-nodes kubernetes-persistent-volumes kubernetes-persistent-volumes-claims kubernetes-pods kubernetes-replication-controllers kubernetes-resources-quota kubernetes-secrets kubernetes-service-accounts kubernetes-services openshift-build-configs openshift-builds openshift-deploymentconfigs
 groupId=org.apache.camel
 artifactId=camel-kubernetes
 version=4.3.0-SNAPSHOT
diff --git a/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/component/kubernetes-cronjob b/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/component/kubernetes-cronjob
new file mode 100644
index 00000000000..97c63dcddaa
--- /dev/null
+++ b/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/component/kubernetes-cronjob
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.kubernetes.cronjob.KubernetesCronJobComponent
diff --git a/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/configurer/kubernetes-cronjob-component b/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/configurer/kubernetes-cronjob-component
new file mode 100644
index 00000000000..0fa70c87ad7
--- /dev/null
+++ b/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/configurer/kubernetes-cronjob-component
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.kubernetes.cronjob.KubernetesCronJobComponentConfigurer
diff --git a/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/configurer/kubernetes-cronjob-endpoint b/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/configurer/kubernetes-cronjob-endpoint
new file mode 100644
index 00000000000..bd324665907
--- /dev/null
+++ b/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/configurer/kubernetes-cronjob-endpoint
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.kubernetes.cronjob.KubernetesCronJobEndpointConfigurer
diff --git a/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/urifactory/kubernetes-cronjob-endpoint b/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/urifactory/kubernetes-cronjob-endpoint
new file mode 100644
index 00000000000..650baab71f9
--- /dev/null
+++ b/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/urifactory/kubernetes-cronjob-endpoint
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.kubernetes.cronjob.KubernetesCronJobEndpointUriFactory
diff --git a/components/camel-kubernetes/src/generated/resources/org/apache/camel/component/kubernetes/cronjob/kubernetes-cronjob.json b/components/camel-kubernetes/src/generated/resources/org/apache/camel/component/kubernetes/cronjob/kubernetes-cronjob.json
new file mode 100644
index 00000000000..2c2b6fb8bde
--- /dev/null
+++ b/components/camel-kubernetes/src/generated/resources/org/apache/camel/component/kubernetes/cronjob/kubernetes-cronjob.json
@@ -0,0 +1,72 @@
+{
+  "component": {
+    "kind": "component",
+    "name": "kubernetes-cronjob",
+    "title": "Kubernetes Cronjob",
+    "description": "Perform operations on Kubernetes CronJob.",
+    "deprecated": false,
+    "firstVersion": "4.3.0",
+    "label": "container,cloud",
+    "javaType": "org.apache.camel.component.kubernetes.cronjob.KubernetesCronJobComponent",
+    "supportLevel": "Preview",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-kubernetes",
+    "version": "4.3.0-SNAPSHOT",
+    "scheme": "kubernetes-cronjob",
+    "extendsScheme": "",
+    "syntax": "kubernetes-cronjob:masterUrl",
+    "async": false,
+    "api": false,
+    "consumerOnly": false,
+    "producerOnly": false,
+    "lenientProperties": false
+  },
+  "componentProperties": {
+    "kubernetesClient": { "index": 0, "kind": "property", "displayName": "Kubernetes Client", "group": "common", "label": "", "required": false, "type": "object", "javaType": "io.fabric8.kubernetes.client.KubernetesClient", "deprecated": false, "autowired": true, "secret": false, "description": "To use an existing kubernetes client." },
+    "bridgeErrorHandler": { "index": 1, "kind": "property", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions (if possible) occurred while the Camel consumer is trying to pickup incoming messages, or the like [...]
+    "lazyStartProducer": { "index": 2, "kind": "property", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail [...]
+    "autowiredEnabled": { "index": 3, "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching t [...]
+  },
+  "headers": {
+    "CamelKubernetesOperation": { "index": 0, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Producer operation", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_OPERATION" },
+    "CamelKubernetesCronJobLabels": { "index": 1, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Map<String, String>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Cronjob labels.", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_CRON_JOB_LABELS" },
+    "CamelKubernetesCronJobName": { "index": 2, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Cronjob name.", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_CRON_JOB_NAME" },
+    "CamelKubernetesCronJobSpec": { "index": 3, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "io.fabric8.kubernetes.api.model.batch.v1.CronJobSpec", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The spec for a Job.", "constantName": "org.apache.camel.component.kubernetes.KubernetesConstants#KUBERNETES_CRON_JOB_SPEC" }
+  },
+  "properties": {
+    "masterUrl": { "index": 0, "kind": "path", "displayName": "Master Url", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "Kubernetes Master url" },
+    "apiVersion": { "index": 1, "kind": "parameter", "displayName": "Api Version", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The Kubernetes API Version to use" },
+    "dnsDomain": { "index": 2, "kind": "parameter", "displayName": "Dns Domain", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The dns domain, used for ServiceCall EIP" },
+    "kubernetesClient": { "index": 3, "kind": "parameter", "displayName": "Kubernetes Client", "group": "common", "label": "", "required": false, "type": "object", "javaType": "io.fabric8.kubernetes.client.KubernetesClient", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "Default KubernetesClient to use if provided" },
+    "namespace": { "index": 4, "kind": "parameter", "displayName": "Namespace", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The namespace" },
+    "portName": { "index": 5, "kind": "parameter", "displayName": "Port Name", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The port name, used for ServiceCall EIP" },
+    "portProtocol": { "index": 6, "kind": "parameter", "displayName": "Port Protocol", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "tcp", "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The port protocol, used for ServiceCall EIP" },
+    "crdGroup": { "index": 7, "kind": "parameter", "displayName": "Crd Group", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The Consumer CRD Resource Group we would like to watch" },
+    "crdName": { "index": 8, "kind": "parameter", "displayName": "Crd Name", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The Consumer CRD Resource name we would like to watch" },
+    "crdPlural": { "index": 9, "kind": "parameter", "displayName": "Crd Plural", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The Consumer CRD Resource Plural we would like to watch" },
+    "crdScope": { "index": 10, "kind": "parameter", "displayName": "Crd Scope", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The Consumer CRD Resource Scope we would like to watch" },
+    "crdVersion": { "index": 11, "kind": "parameter", "displayName": "Crd Version", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The Consumer CRD Resource Version we would like to watch" },
+    "labelKey": { "index": 12, "kind": "parameter", "displayName": "Label Key", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The Consumer Label key when watching at some resources" },
+    "labelValue": { "index": 13, "kind": "parameter", "displayName": "Label Value", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The Consumer Label value when watching at some resources" },
+    "poolSize": { "index": 14, "kind": "parameter", "displayName": "Pool Size", "group": "consumer", "label": "consumer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 1, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The Consumer pool size" },
+    "resourceName": { "index": 15, "kind": "parameter", "displayName": "Resource Name", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The Consumer Resource Name we would like to watch" },
+    "bridgeErrorHandler": { "index": 16, "kind": "parameter", "displayName": "Bridge Error Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions (if possible) occurred while the Camel consumer is trying to pickup incoming [...]
+    "exceptionHandler": { "index": 17, "kind": "parameter", "displayName": "Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", "deprecated": false, "autowired": false, "secret": false, "description": "To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By de [...]
+    "exchangePattern": { "index": 18, "kind": "parameter", "displayName": "Exchange Pattern", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut" ], "deprecated": false, "autowired": false, "secret": false, "description": "Sets the exchange pattern when the consumer creates an exchange." },
+    "operation": { "index": 19, "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "producer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "Producer operation to do on Kubernetes" },
+    "lazyStartProducer": { "index": 20, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a produ [...]
+    "connectionTimeout": { "index": 21, "kind": "parameter", "displayName": "Connection Timeout", "group": "advanced", "label": "advanced", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "Connection timeout in milliseconds to use when making requests to the Kubernetes  [...]
+    "caCertData": { "index": 22, "kind": "parameter", "displayName": "Ca Cert Data", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The CA Cert Data" },
+    "caCertFile": { "index": 23, "kind": "parameter", "displayName": "Ca Cert File", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The CA Cert File" },
+    "clientCertData": { "index": 24, "kind": "parameter", "displayName": "Client Cert Data", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The Client Cert Data" },
+    "clientCertFile": { "index": 25, "kind": "parameter", "displayName": "Client Cert File", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The Client Cert File" },
+    "clientKeyAlgo": { "index": 26, "kind": "parameter", "displayName": "Client Key Algo", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The Key Algorithm used by the client" },
+    "clientKeyData": { "index": 27, "kind": "parameter", "displayName": "Client Key Data", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The Client Key data" },
+    "clientKeyFile": { "index": 28, "kind": "parameter", "displayName": "Client Key File", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The Client Key file" },
+    "clientKeyPassphrase": { "index": 29, "kind": "parameter", "displayName": "Client Key Passphrase", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The Client Key Passphrase" },
+    "oauthToken": { "index": 30, "kind": "parameter", "displayName": "Oauth Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "The Auth Token" },
+    "password": { "index": 31, "kind": "parameter", "displayName": "Password", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "Password to connect to Kubernetes" },
+    "trustCerts": { "index": 32, "kind": "parameter", "displayName": "Trust Certs", "group": "security", "label": "security", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "Define if the certs we used are trusted anyway or not" },
+    "username": { "index": 33, "kind": "parameter", "displayName": "Username", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.kubernetes.KubernetesConfiguration", "configurationField": "configuration", "description": "Username to connect to Kubernetes" }
+  }
+}
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesConstants.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesConstants.java
index 9a53bb5ca2d..c8967e066b1 100644
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesConstants.java
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesConstants.java
@@ -26,6 +26,7 @@ public final class KubernetesConstants {
     public static final String SCHEME_EVENTS = "kubernetes-events";
     public static final String SCHEME_HPA = "kubernetes-hpa";
     public static final String SCHEME_JOB = "kubernetes-job";
+    public static final String SCHEME_CRON_JOB = "kubernetes-cronjob";
     public static final String SCHEME_NAMESPACES = "kubernetes-namespaces";
     public static final String SCHEME_NODES = "kubernetes-nodes";
     public static final String SCHEME_PERSISTENT_VOLUMES = "kubernetes-persistent-volumes";
@@ -256,6 +257,16 @@ public final class KubernetesConstants {
                       SCHEME_REPLICATION_CONTROLLERS, SCHEME_SERVICES, SCHEME_DEPLOYMENT_CONFIGS, SCHEME_EVENTS })
     public static final String KUBERNETES_EVENT_TIMESTAMP = "CamelKubernetesEventTimestamp";
 
+    @Metadata(label = "producer", description = "The Cronjob labels.", javaType = "Map<String, String>",
+              applicableFor = SCHEME_CRON_JOB)
+    public static final String KUBERNETES_CRON_JOB_LABELS = "CamelKubernetesCronJobLabels";
+
+    @Metadata(label = "producer", description = "The Cronjob name.", javaType = "String", applicableFor = SCHEME_CRON_JOB)
+    public static final String KUBERNETES_CRON_JOB_NAME = "CamelKubernetesCronJobName";
+    @Metadata(label = "producer", description = "The spec for a Job.",
+              javaType = "io.fabric8.kubernetes.api.model.batch.v1.CronJobSpec", applicableFor = SCHEME_CRON_JOB)
+    public static final String KUBERNETES_CRON_JOB_SPEC = "CamelKubernetesCronJobSpec";
+
     private KubernetesConstants() {
 
     }
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesOperations.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesOperations.java
index a6fdfbec2af..79b725f0473 100644
--- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesOperations.java
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesOperations.java
@@ -139,7 +139,15 @@ public final class KubernetesOperations {
     public static final String LIST_BUILD_CONFIGS_BY_LABELS_OPERATION = "listBuildConfigsByLabels";
     public static final String GET_BUILD_CONFIG_OPERATION = "getBuildConfig";
 
-    // Secrets
+    // Cronjob
+    public static final String LIST_CRON_JOB_OPERATION = "listCronJob";
+    public static final String LIST_CRON_JOB_BY_LABELS_OPERATION = "listCronJobByLabels";
+    public static final String GET_CRON_JOB_OPERATION = "getCronJob";
+    public static final String CREATE_CRON_JOB_OPERATION = "createCronJob";
+    public static final String UPDATE_CRON_JOB_OPERATION = "updateCronJob";
+    public static final String DELETE_CRON_JOB_OPERATION = "deleteCronJob";
+
+    // Job
     public static final String LIST_JOB = "listJob";
     public static final String LIST_JOB_BY_LABELS_OPERATION = "listJobByLabels";
     public static final String GET_JOB_OPERATION = "getJob";
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/cronjob/KubernetesCronJobComponent.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/cronjob/KubernetesCronJobComponent.java
new file mode 100644
index 00000000000..1f8c1481849
--- /dev/null
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/cronjob/KubernetesCronJobComponent.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.camel.component.kubernetes.cronjob;
+
+import org.apache.camel.component.kubernetes.AbstractKubernetesComponent;
+import org.apache.camel.component.kubernetes.KubernetesConfiguration;
+import org.apache.camel.spi.annotations.Component;
+
+@Component("kubernetes-cronjob")
+public class KubernetesCronJobComponent extends AbstractKubernetesComponent {
+
+    @Override
+    protected KubernetesCronJobEndpoint doCreateEndpoint(String uri, String remaining, KubernetesConfiguration config) {
+        return new KubernetesCronJobEndpoint(uri, this, config);
+    }
+}
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/cronjob/KubernetesCronJobEndpoint.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/cronjob/KubernetesCronJobEndpoint.java
new file mode 100644
index 00000000000..9d70577d89b
--- /dev/null
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/cronjob/KubernetesCronJobEndpoint.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.camel.component.kubernetes.cronjob;
+
+import org.apache.camel.Category;
+import org.apache.camel.Consumer;
+import org.apache.camel.Processor;
+import org.apache.camel.Producer;
+import org.apache.camel.component.kubernetes.AbstractKubernetesEndpoint;
+import org.apache.camel.component.kubernetes.KubernetesConfiguration;
+import org.apache.camel.component.kubernetes.KubernetesConstants;
+import org.apache.camel.spi.UriEndpoint;
+
+import static org.apache.camel.component.kubernetes.KubernetesConstants.SCHEME_CRON_JOB;
+
+/**
+ * Perform operations on Kubernetes CronJob.
+ */
+@UriEndpoint(firstVersion = "4.3.0", scheme = SCHEME_CRON_JOB, title = "Kubernetes Cronjob",
+             syntax = "kubernetes-cronjob:masterUrl",
+             category = { Category.CONTAINER, Category.CLOUD }, headersClass = KubernetesConstants.class)
+public class KubernetesCronJobEndpoint extends AbstractKubernetesEndpoint {
+
+    public KubernetesCronJobEndpoint(String uri, KubernetesCronJobComponent component, KubernetesConfiguration config) {
+        super(uri, component, config);
+    }
+
+    @Override
+    public Producer createProducer() throws Exception {
+        return new KubernetesCronJobProducer(this);
+    }
+
+    @Override
+    public Consumer createConsumer(Processor processor) throws Exception {
+        throw new IllegalArgumentException("The kubernetes-cronjob doesn't support consumer");
+    }
+
+}
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/cronjob/KubernetesCronJobProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/cronjob/KubernetesCronJobProducer.java
new file mode 100644
index 00000000000..49c182d6b82
--- /dev/null
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/cronjob/KubernetesCronJobProducer.java
@@ -0,0 +1,183 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.camel.component.kubernetes.cronjob;
+
+import java.util.Map;
+import java.util.function.Function;
+
+import io.fabric8.kubernetes.api.model.batch.v1.*;
+import io.fabric8.kubernetes.client.dsl.MixedOperation;
+import io.fabric8.kubernetes.client.dsl.Resource;
+import org.apache.camel.Exchange;
+import org.apache.camel.component.kubernetes.AbstractKubernetesEndpoint;
+import org.apache.camel.component.kubernetes.KubernetesConstants;
+import org.apache.camel.component.kubernetes.KubernetesOperations;
+import org.apache.camel.support.DefaultProducer;
+import org.apache.camel.support.MessageHelper;
+import org.apache.camel.util.ObjectHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.apache.camel.component.kubernetes.KubernetesHelper.prepareOutboundMessage;
+
+public class KubernetesCronJobProducer extends DefaultProducer {
+
+    private static final Logger LOG = LoggerFactory.getLogger(KubernetesCronJobProducer.class);
+
+    public KubernetesCronJobProducer(AbstractKubernetesEndpoint endpoint) {
+        super(endpoint);
+    }
+
+    @Override
+    public AbstractKubernetesEndpoint getEndpoint() {
+        return (AbstractKubernetesEndpoint) super.getEndpoint();
+    }
+
+    @Override
+    public void process(Exchange exchange) throws Exception {
+        String operation;
+
+        if (ObjectHelper.isEmpty(getEndpoint().getKubernetesConfiguration().getOperation())) {
+            operation = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_OPERATION, String.class);
+        } else {
+            operation = getEndpoint().getKubernetesConfiguration().getOperation();
+        }
+
+        switch (operation) {
+
+            case KubernetesOperations.LIST_CRON_JOB_OPERATION:
+                doList(exchange);
+                break;
+
+            case KubernetesOperations.LIST_CRON_JOB_BY_LABELS_OPERATION:
+                doListCronJobByLabel(exchange);
+                break;
+
+            case KubernetesOperations.GET_CRON_JOB_OPERATION:
+                doGetCronJob(exchange);
+                break;
+
+            case KubernetesOperations.CREATE_CRON_JOB_OPERATION:
+                doCreateCronJob(exchange);
+                break;
+
+            case KubernetesOperations.UPDATE_CRON_JOB_OPERATION:
+                doUpdateCronJob(exchange);
+                break;
+
+            case KubernetesOperations.DELETE_CRON_JOB_OPERATION:
+                doDeleteCronJob(exchange);
+                break;
+
+            default:
+                throw new IllegalArgumentException("Unsupported operation " + operation);
+        }
+    }
+
+    protected void doList(Exchange exchange) {
+        CronJobList cronJobList = getEndpoint().getKubernetesClient().batch().v1().cronjobs().list();
+
+        prepareOutboundMessage(exchange, cronJobList.getItems());
+    }
+
+    protected void doListCronJobByLabel(Exchange exchange) {
+        Map<String, String> labels = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_CRON_JOB_LABELS, Map.class);
+        if (ObjectHelper.isEmpty(labels)) {
+            LOG.error("List CronJob by labels require specify a labels set");
+            throw new IllegalArgumentException("Cron Job by labels require specify a labels set");
+        }
+
+        MixedOperation<CronJob, CronJobList, Resource<CronJob>> cronJobs
+                = getEndpoint().getKubernetesClient().batch().v1().cronjobs();
+
+        CronJobList jobList = cronJobs.withLabels(labels).list();
+
+        prepareOutboundMessage(exchange, jobList.getItems());
+    }
+
+    protected void doGetCronJob(Exchange exchange) {
+        String cronjobName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_CRON_JOB_NAME, String.class);
+        String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
+        if (ObjectHelper.isEmpty(cronjobName)) {
+            LOG.error("Get a specific cronjob require specify a cronjob name");
+            throw new IllegalArgumentException("Get a specific cronjob require specify a cronnjob name");
+        }
+        if (ObjectHelper.isEmpty(namespaceName)) {
+            LOG.error("Get a specific cronjob require specify a namespace name");
+            throw new IllegalArgumentException("Get a specific cronjob require specify a namespace name");
+        }
+        CronJob cronJob = getEndpoint().getKubernetesClient().batch().v1().cronjobs().inNamespace(namespaceName)
+                .withName(cronjobName).get();
+
+        prepareOutboundMessage(exchange, cronJob);
+    }
+
+    protected void doUpdateCronJob(Exchange exchange) {
+        doCreateOrUpdateCronJob(exchange, "Update", Resource::update);
+    }
+
+    protected void doCreateCronJob(Exchange exchange) {
+        doCreateOrUpdateCronJob(exchange, "Create", Resource::create);
+    }
+
+    private void doCreateOrUpdateCronJob(
+            Exchange exchange, String operationName, Function<Resource<CronJob>, Object> operation) {
+        String cronjobName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_CRON_JOB_NAME, String.class);
+        String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
+        CronJobSpec cronjobSpec = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_CRON_JOB_SPEC, CronJobSpec.class);
+        if (ObjectHelper.isEmpty(cronjobName)) {
+            LOG.error("{} a specific cronjob require specify a cronjob name", operationName);
+            throw new IllegalArgumentException(
+                    String.format("%s a specific cronjob require specify a cronjob name", operationName));
+        }
+        if (ObjectHelper.isEmpty(namespaceName)) {
+            LOG.error("{} a specific cronjob require specify a namespace name", operationName);
+            throw new IllegalArgumentException(
+                    String.format("%s a specific cronjob require specify a namespace name", operationName));
+        }
+        if (ObjectHelper.isEmpty(cronjobSpec)) {
+            LOG.error("{} a specific cronjob require specify a cronjob spec bean", operationName);
+            throw new IllegalArgumentException(
+                    String.format("%s a specific cronjob require specify a cronjob spec bean", operationName));
+        }
+        Map<String, String> labels = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_CRON_JOB_LABELS, Map.class);
+        CronJob cronjobCreating = new CronJobBuilder().withNewMetadata().withName(cronjobName).withLabels(labels).endMetadata()
+                .withSpec(cronjobSpec).build();
+        Object cronJob = operation.apply(
+                getEndpoint().getKubernetesClient().batch().v1().cronjobs().inNamespace(namespaceName)
+                        .resource(cronjobCreating));
+
+        prepareOutboundMessage(exchange, cronJob);
+    }
+
+    protected void doDeleteCronJob(Exchange exchange) {
+        String cronjobName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_CRON_JOB_NAME, String.class);
+        String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
+        if (ObjectHelper.isEmpty(cronjobName)) {
+            LOG.error("Delete a specific cronjob require specify a cronjob name");
+            throw new IllegalArgumentException("Delete a specific cronjob require specify a cronjob name");
+        }
+        if (ObjectHelper.isEmpty(namespaceName)) {
+            LOG.error("Delete a specific cronjob require specify a namespace name");
+            throw new IllegalArgumentException("Delete a specific cronjob require specify a namespace name");
+        }
+
+        getEndpoint().getKubernetesClient().batch().v1().cronjobs().inNamespace(namespaceName).withName(cronjobName).delete();
+
+        MessageHelper.copyHeaders(exchange.getIn(), exchange.getMessage(), true);
+    }
+}
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesCronJobProducerTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesCronJobProducerTest.java
new file mode 100644
index 00000000000..ea86704e6cf
--- /dev/null
+++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesCronJobProducerTest.java
@@ -0,0 +1,174 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.camel.component.kubernetes.producer;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import io.fabric8.kubernetes.api.model.ObjectMeta;
+import io.fabric8.kubernetes.api.model.PodTemplateSpecBuilder;
+import io.fabric8.kubernetes.api.model.batch.v1.*;
+import io.fabric8.kubernetes.client.KubernetesClient;
+import io.fabric8.kubernetes.client.NamespacedKubernetesClient;
+import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient;
+import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer;
+import org.apache.camel.BindToRegistry;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.kubernetes.KubernetesConstants;
+import org.apache.camel.component.kubernetes.KubernetesTestSupport;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+@EnableKubernetesMockClient
+public class KubernetesCronJobProducerTest extends KubernetesTestSupport {
+
+    KubernetesMockServer server;
+    NamespacedKubernetesClient client;
+
+    @BindToRegistry("kubernetesClient")
+    public KubernetesClient getClient() {
+        return client;
+    }
+
+    @Test
+    void listTest() {
+        server.expect().withPath("/apis/batch/v1/namespaces/test/cronjobs")
+                .andReturn(200, new CronJobListBuilder().addNewItem().and().addNewItem().and().addNewItem().and().build())
+                .once();
+        List<?> result = template.requestBody("direct:listCronJob", "", List.class);
+
+        assertEquals(3, result.size());
+    }
+
+    @Test
+    void listByLabelsTest() throws Exception {
+        server.expect()
+                .withPath("/apis/batch/v1/namespaces/test/cronjobs?labelSelector=" + toUrlEncoded("key1=value1,key2=value2"))
+                .andReturn(200, new CronJobListBuilder().addNewItem().and().addNewItem().and().addNewItem().and().build())
+                .once();
+        Exchange ex = template.request("direct:listByLabels", exchange -> {
+            Map<String, String> labels = new HashMap<>();
+            labels.put("key1", "value1");
+            labels.put("key2", "value2");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CRON_JOB_LABELS, labels);
+        });
+
+        List<?> result = ex.getMessage().getBody(List.class);
+
+        assertEquals(3, result.size());
+    }
+
+    @Test
+    void getJobTest() {
+        CronJob sc1 = new CronJobBuilder().withNewMetadata().withName("sc1").withNamespace("test").and().build();
+
+        server.expect().withPath("/apis/batch/v1/namespaces/test/cronjobs/sc1").andReturn(200, sc1).once();
+        Exchange ex = template.request("direct:get", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CRON_JOB_NAME, "sc1");
+        });
+
+        CronJob result = ex.getMessage().getBody(CronJob.class);
+
+        assertNotNull(result);
+    }
+
+    @Test
+    void createJobTest() {
+        Map<String, String> labels = Map.of("my.label.key", "my.label.value");
+        CronJobSpec spec = new CronJobSpecBuilder().build();
+        CronJob j1 = new CronJobBuilder().withNewMetadata().withName("j1").withNamespace("test").withLabels(labels).and()
+                .withSpec(spec).build();
+        server.expect().post().withPath("/apis/batch/v1/namespaces/test/cronjobs").andReturn(200, j1).once();
+
+        Exchange ex = template.request("direct:create", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CRON_JOB_LABELS, labels);
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CRON_JOB_NAME, "j1");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CRON_JOB_SPEC, spec);
+        });
+
+        CronJob result = ex.getMessage().getBody(CronJob.class);
+
+        assertEquals("test", result.getMetadata().getNamespace());
+        assertEquals("j1", result.getMetadata().getName());
+        assertEquals(labels, result.getMetadata().getLabels());
+    }
+
+    @Test
+    void updateJobTest() {
+        Map<String, String> labels = Map.of("my.label.key", "my.label.value");
+        CronJobSpec spec = new CronJobSpecBuilder().withJobTemplate(new JobTemplateSpecBuilder().build()).build();
+        CronJob j1 = new CronJobBuilder().withNewMetadata().withName("j1").withNamespace("test").withLabels(labels).and()
+                .withSpec(spec).build();
+        server.expect().get().withPath("/apis/batch/v1/namespaces/test/cronjobs/j1")
+                .andReturn(200, new JobBuilder().withNewMetadata().withName("j1").withNamespace("test").endMetadata()
+                        .withSpec(new JobSpecBuilder()
+                                .withTemplate(new PodTemplateSpecBuilder().withMetadata(new ObjectMeta()).build()).build())
+                        .build())
+                .times(2);
+        server.expect().put().withPath("/apis/batch/v1/namespaces/test/cronjobs/j1").andReturn(200, j1).once();
+
+        Exchange ex = template.request("direct:update", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CRON_JOB_LABELS, labels);
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CRON_JOB_NAME, "j1");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CRON_JOB_SPEC, spec);
+        });
+
+        CronJob result = ex.getMessage().getBody(CronJob.class);
+
+        assertEquals("test", result.getMetadata().getNamespace());
+        assertEquals("j1", result.getMetadata().getName());
+        assertEquals(labels, result.getMetadata().getLabels());
+    }
+
+    @Test
+    void deleteJobTest() {
+        CronJob j1 = new CronJobBuilder().withNewMetadata().withName("j1").withNamespace("test").and().build();
+        server.expect().delete().withPath("/apis/batch/v1/namespaces/test/cronjobs/j1").andReturn(200, j1)
+                .once();
+
+        Exchange ex = template.request("direct:delete", exchange -> {
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test");
+            exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CRON_JOB_NAME, "j1");
+        });
+
+        assertNotNull(ex.getMessage());
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            @Override
+            public void configure() {
+                // the kubernetes-client is autowired on the component
+
+                from("direct:listCronJob").to("kubernetes-cronjob:foo?operation=listCronJob");
+                from("direct:listByLabels").to("kubernetes-cronjob:foo?operation=listCronJobByLabels");
+                from("direct:get").to("kubernetes-cronjob:foo?operation=getCronJob");
+                from("direct:create").to("kubernetes-cronjob:foo?operation=createCronJob");
+                from("direct:update").to("kubernetes-cronjob:foo?operation=updateCronJob");
+                from("direct:delete").to("kubernetes-cronjob:foo?operation=deleteCronJob");
+            }
+        };
+    }
+}