This is an automated email from the ASF dual-hosted git repository. nfilotto pushed a commit to branch CAMEL-17438/add-update-to-producers in repository https://gitbox.apache.org/repos/asf/camel.git
commit 5a668efed0720f6cc67dd0d60259d9e3c7650b5b Author: Nicolas Filotto <[email protected]> AuthorDate: Fri Oct 7 15:25:51 2022 +0200 CAMEL-17438: camel-kubernetes - Add replace operation to producers --- .../docs/kubernetes-config-maps-component.adoc | 1 + .../kubernetes-custom-resources-component.adoc | 1 + .../docs/kubernetes-deployments-component.adoc | 1 + .../src/main/docs/kubernetes-hpa-component.adoc | 1 + .../src/main/docs/kubernetes-job-component.adoc | 1 + .../main/docs/kubernetes-namespaces-component.adoc | 1 + .../src/main/docs/kubernetes-nodes-component.adoc | 1 + ...rnetes-persistent-volumes-claims-component.adoc | 1 + .../src/main/docs/kubernetes-pods-component.adoc | 1 + ...bernetes-replication-controllers-component.adoc | 1 + .../docs/kubernetes-resources-quota-component.adoc | 1 + .../main/docs/kubernetes-secrets-component.adoc | 1 + .../kubernetes-service-accounts-component.adoc | 1 + .../openshift-deploymentconfigs-component.adoc | 1 + .../component/kubernetes/KubernetesOperations.java | 15 +++++++++ .../config_maps/KubernetesConfigMapsProducer.java | 33 +++++++++++++++---- .../KubernetesCustomResourcesProducer.java | 21 ++++++++++-- .../deployments/KubernetesDeploymentsProducer.java | 36 +++++++++++++++----- .../kubernetes/hpa/KubernetesHPAProducer.java | 34 ++++++++++++++----- .../kubernetes/job/KubernetesJobProducer.java | 32 +++++++++++++----- .../namespaces/KubernetesNamespacesProducer.java | 22 +++++++++++-- .../kubernetes/nodes/KubernetesNodesProducer.java | 25 +++++++++++--- .../KubernetesPersistentVolumesClaimsProducer.java | 36 +++++++++++++++----- .../kubernetes/pods/KubernetesPodsProducer.java | 30 +++++++++++++---- .../KubernetesReplicationControllersProducer.java | 36 +++++++++++++++----- .../KubernetesResourcesQuotaProducer.java | 31 ++++++++++++++---- .../secrets/KubernetesSecretsProducer.java | 27 ++++++++++++--- .../KubernetesServiceAccountsProducer.java | 29 +++++++++++++---- .../services/KubernetesServicesProducer.java | 33 +++++++++++++++---- .../OpenshiftDeploymentConfigsProducer.java | 38 ++++++++++++++++------ .../KubernetesConfigMapsConsumerIT.java | 29 ++++++++++++++++- .../producer/KubernetesConfigMapsProducerTest.java | 28 ++++++++++++++++ .../KubernetesCustomResourcesProducerTest.java | 28 ++++++++++++++++ .../KubernetesDeploymentsProducerTest.java | 30 +++++++++++++++++ .../producer/KubernetesHPAProducerTest.java | 31 ++++++++++++++++++ .../producer/KubernetesJobProducerTest.java | 34 +++++++++++++++++++ .../producer/KubernetesNamespacesProducerTest.java | 23 ++++++++++++- .../producer/KubernetesNodesProducerTest.java | 23 +++++++++++++ ...ernetesPersistentVolumesClaimsProducerTest.java | 30 +++++++++++++++++ .../producer/KubernetesPodsProducerTest.java | 27 +++++++++++++++ ...bernetesReplicationControllersProducerTest.java | 30 +++++++++++++++++ .../KubernetesResourcesQuotaProducerTest.java | 29 +++++++++++++++++ .../producer/KubernetesSecretsProducerTest.java | 18 ++++++++++ .../KubernetesServiceAccountsProducerTest.java | 19 +++++++++++ .../producer/KubernetesServicesProducerTest.java | 29 +++++++++++++++++ .../OpenshiftDeploymentConfigsProducerTest.java | 37 +++++++++++++++++++-- 46 files changed, 830 insertions(+), 107 deletions(-) diff --git a/components/camel-kubernetes/src/main/docs/kubernetes-config-maps-component.adoc b/components/camel-kubernetes/src/main/docs/kubernetes-config-maps-component.adoc index 0355489f600..dfe5a6cd862 100644 --- a/components/camel-kubernetes/src/main/docs/kubernetes-config-maps-component.adoc +++ b/components/camel-kubernetes/src/main/docs/kubernetes-config-maps-component.adoc @@ -41,6 +41,7 @@ include::partial$component-endpoint-headers.adoc[] - listConfigMapsByLabels - getConfigMap - createConfigMap +- replaceConfigMap - deleteConfigMap == Kubernetes ConfigMaps Producer Examples diff --git a/components/camel-kubernetes/src/main/docs/kubernetes-custom-resources-component.adoc b/components/camel-kubernetes/src/main/docs/kubernetes-custom-resources-component.adoc index 6c1d0341be5..22b225168c4 100644 --- a/components/camel-kubernetes/src/main/docs/kubernetes-custom-resources-component.adoc +++ b/components/camel-kubernetes/src/main/docs/kubernetes-custom-resources-component.adoc @@ -42,6 +42,7 @@ include::partial$component-endpoint-headers.adoc[] - getCustomResource - deleteCustomResource - createCustomResource +- replaceCustomResource include::spring-boot:partial$starter.adoc[] diff --git a/components/camel-kubernetes/src/main/docs/kubernetes-deployments-component.adoc b/components/camel-kubernetes/src/main/docs/kubernetes-deployments-component.adoc index bd2cd9d5ede..9f14288262c 100644 --- a/components/camel-kubernetes/src/main/docs/kubernetes-deployments-component.adoc +++ b/components/camel-kubernetes/src/main/docs/kubernetes-deployments-component.adoc @@ -40,6 +40,7 @@ include::partial$component-endpoint-headers.adoc[] - listDeploymentsByLabels - getDeployment - createDeployment +- replaceDeployment - deleteDeployment - scaleDeployment diff --git a/components/camel-kubernetes/src/main/docs/kubernetes-hpa-component.adoc b/components/camel-kubernetes/src/main/docs/kubernetes-hpa-component.adoc index eb4a8a72c50..7a72504ff96 100644 --- a/components/camel-kubernetes/src/main/docs/kubernetes-hpa-component.adoc +++ b/components/camel-kubernetes/src/main/docs/kubernetes-hpa-component.adoc @@ -40,6 +40,7 @@ include::partial$component-endpoint-headers.adoc[] - listHPAByLabels - getHPA - createHPA +- replaceHPA - deleteHPA == Kubernetes HPA Producer Examples diff --git a/components/camel-kubernetes/src/main/docs/kubernetes-job-component.adoc b/components/camel-kubernetes/src/main/docs/kubernetes-job-component.adoc index 497631937e0..e1b5eb02303 100644 --- a/components/camel-kubernetes/src/main/docs/kubernetes-job-component.adoc +++ b/components/camel-kubernetes/src/main/docs/kubernetes-job-component.adoc @@ -41,6 +41,7 @@ include::partial$component-endpoint-headers.adoc[] - listJobByLabels - getJob - createJob +- replaceJob - deleteJob == Kubernetes Job Producer Examples diff --git a/components/camel-kubernetes/src/main/docs/kubernetes-namespaces-component.adoc b/components/camel-kubernetes/src/main/docs/kubernetes-namespaces-component.adoc index bf95acf029b..be43674e7bb 100644 --- a/components/camel-kubernetes/src/main/docs/kubernetes-namespaces-component.adoc +++ b/components/camel-kubernetes/src/main/docs/kubernetes-namespaces-component.adoc @@ -41,6 +41,7 @@ include::partial$component-endpoint-headers.adoc[] - listNamespacesByLabels - getNamespace - createNamespace +- replaceNamespace - deleteNamespace == Kubernetes Namespaces Producer Examples diff --git a/components/camel-kubernetes/src/main/docs/kubernetes-nodes-component.adoc b/components/camel-kubernetes/src/main/docs/kubernetes-nodes-component.adoc index 1f87d1e7a0e..2f9088bab5d 100644 --- a/components/camel-kubernetes/src/main/docs/kubernetes-nodes-component.adoc +++ b/components/camel-kubernetes/src/main/docs/kubernetes-nodes-component.adoc @@ -40,6 +40,7 @@ include::partial$component-endpoint-headers.adoc[] - listNodesByLabels - getNode - createNode +- replaceNode - deleteNode diff --git a/components/camel-kubernetes/src/main/docs/kubernetes-persistent-volumes-claims-component.adoc b/components/camel-kubernetes/src/main/docs/kubernetes-persistent-volumes-claims-component.adoc index 742279f8193..05436922d2c 100644 --- a/components/camel-kubernetes/src/main/docs/kubernetes-persistent-volumes-claims-component.adoc +++ b/components/camel-kubernetes/src/main/docs/kubernetes-persistent-volumes-claims-component.adoc @@ -40,6 +40,7 @@ include::partial$component-endpoint-headers.adoc[] - listPersistentVolumesClaimsByLabels - getPersistentVolumeClaim - createPersistentVolumeClaim +- replacePersistentVolumeClaim - deletePersistentVolumeClaim == Kubernetes Persistent Volume Claims Producer Examples diff --git a/components/camel-kubernetes/src/main/docs/kubernetes-pods-component.adoc b/components/camel-kubernetes/src/main/docs/kubernetes-pods-component.adoc index b399b71ccb7..4b02b7556a1 100644 --- a/components/camel-kubernetes/src/main/docs/kubernetes-pods-component.adoc +++ b/components/camel-kubernetes/src/main/docs/kubernetes-pods-component.adoc @@ -40,6 +40,7 @@ include::partial$component-endpoint-headers.adoc[] - listPodsByLabels - getPod - createPod +- replacePod - deletePod == Kubernetes Pods Producer Examples diff --git a/components/camel-kubernetes/src/main/docs/kubernetes-replication-controllers-component.adoc b/components/camel-kubernetes/src/main/docs/kubernetes-replication-controllers-component.adoc index d686cd1ff59..971aba653fe 100644 --- a/components/camel-kubernetes/src/main/docs/kubernetes-replication-controllers-component.adoc +++ b/components/camel-kubernetes/src/main/docs/kubernetes-replication-controllers-component.adoc @@ -41,6 +41,7 @@ include::partial$component-endpoint-headers.adoc[] - listReplicationControllersByLabels - getReplicationController - createReplicationController +- replaceReplicationController - deleteReplicationController - scaleReplicationController diff --git a/components/camel-kubernetes/src/main/docs/kubernetes-resources-quota-component.adoc b/components/camel-kubernetes/src/main/docs/kubernetes-resources-quota-component.adoc index 0da55299cc4..f51e999a22e 100644 --- a/components/camel-kubernetes/src/main/docs/kubernetes-resources-quota-component.adoc +++ b/components/camel-kubernetes/src/main/docs/kubernetes-resources-quota-component.adoc @@ -40,6 +40,7 @@ include::partial$component-endpoint-headers.adoc[] - listResourcesQuotaByLabels - getResourcesQuota - createResourcesQuota +- replaceResourceQuota - deleteResourcesQuota == Kubernetes Resource Quota Producer Examples diff --git a/components/camel-kubernetes/src/main/docs/kubernetes-secrets-component.adoc b/components/camel-kubernetes/src/main/docs/kubernetes-secrets-component.adoc index 36f4e96d9b2..d87ae2735d8 100644 --- a/components/camel-kubernetes/src/main/docs/kubernetes-secrets-component.adoc +++ b/components/camel-kubernetes/src/main/docs/kubernetes-secrets-component.adoc @@ -40,6 +40,7 @@ include::partial$component-endpoint-headers.adoc[] - listSecretsByLabels - getSecret - createSecret +- replaceSecret - deleteSecret == Kubernetes Secrets Producer Examples diff --git a/components/camel-kubernetes/src/main/docs/kubernetes-service-accounts-component.adoc b/components/camel-kubernetes/src/main/docs/kubernetes-service-accounts-component.adoc index 4d1175c2358..e51998f05cc 100644 --- a/components/camel-kubernetes/src/main/docs/kubernetes-service-accounts-component.adoc +++ b/components/camel-kubernetes/src/main/docs/kubernetes-service-accounts-component.adoc @@ -40,6 +40,7 @@ include::partial$component-endpoint-headers.adoc[] - listServiceAccountsByLabels - getServiceAccount - createServiceAccount +- replaceServiceAccount - deleteServiceAccount == Kubernetes ServiceAccounts Produce Examples diff --git a/components/camel-kubernetes/src/main/docs/openshift-deploymentconfigs-component.adoc b/components/camel-kubernetes/src/main/docs/openshift-deploymentconfigs-component.adoc index 14b404ac808..a853b9f78c1 100644 --- a/components/camel-kubernetes/src/main/docs/openshift-deploymentconfigs-component.adoc +++ b/components/camel-kubernetes/src/main/docs/openshift-deploymentconfigs-component.adoc @@ -40,6 +40,7 @@ include::partial$component-endpoint-headers.adoc[] - listDeploymentsConfigsByLabels - getDeploymentConfig - createDeploymentConfig +- replaceDeploymentConfig - deleteDeploymentConfig - scaleDeploymentConfig 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 c9b2fbecc56..91d046c3af3 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 @@ -23,6 +23,7 @@ public final class KubernetesOperations { public static final String LIST_NAMESPACE_BY_LABELS_OPERATION = "listNamespacesByLabels"; public static final String GET_NAMESPACE_OPERATION = "getNamespace"; public static final String CREATE_NAMESPACE_OPERATION = "createNamespace"; + public static final String REPLACE_NAMESPACE_OPERATION = "replaceNamespace"; public static final String DELETE_NAMESPACE_OPERATION = "deleteNamespace"; // Services @@ -30,6 +31,7 @@ public final class KubernetesOperations { public static final String LIST_SERVICES_BY_LABELS_OPERATION = "listServicesByLabels"; public static final String GET_SERVICE_OPERATION = "getService"; public static final String CREATE_SERVICE_OPERATION = "createService"; + public static final String REPLACE_SERVICE_OPERATION = "replaceService"; public static final String DELETE_SERVICE_OPERATION = "deleteService"; // Replication Controllers @@ -37,6 +39,7 @@ public final class KubernetesOperations { public static final String LIST_REPLICATION_CONTROLLERS_BY_LABELS_OPERATION = "listReplicationControllersByLabels"; public static final String GET_REPLICATION_CONTROLLER_OPERATION = "getReplicationController"; public static final String CREATE_REPLICATION_CONTROLLER_OPERATION = "createReplicationController"; + public static final String REPLACE_REPLICATION_CONTROLLER_OPERATION = "replaceReplicationController"; public static final String DELETE_REPLICATION_CONTROLLER_OPERATION = "deleteReplicationController"; public static final String SCALE_REPLICATION_CONTROLLER_OPERATION = "scaleReplicationController"; @@ -45,6 +48,7 @@ public final class KubernetesOperations { public static final String LIST_PODS_BY_LABELS_OPERATION = "listPodsByLabels"; public static final String GET_POD_OPERATION = "getPod"; public static final String CREATE_POD_OPERATION = "createPod"; + public static final String REPLACE_POD_OPERATION = "replacePod"; public static final String DELETE_POD_OPERATION = "deletePod"; // Persistent Volumes @@ -57,6 +61,7 @@ public final class KubernetesOperations { public static final String LIST_PERSISTENT_VOLUMES_CLAIMS_BY_LABELS_OPERATION = "listPersistentVolumesClaimsByLabels"; public static final String GET_PERSISTENT_VOLUME_CLAIM_OPERATION = "getPersistentVolumeClaim"; public static final String CREATE_PERSISTENT_VOLUME_CLAIM_OPERATION = "createPersistentVolumeClaim"; + public static final String REPLACE_PERSISTENT_VOLUME_CLAIM_OPERATION = "replacePersistentVolumeClaim"; public static final String DELETE_PERSISTENT_VOLUME_CLAIM_OPERATION = "deletePersistentVolumeClaim"; // Secrets @@ -64,6 +69,7 @@ public final class KubernetesOperations { public static final String LIST_SECRETS_BY_LABELS_OPERATION = "listSecretsByLabels"; public static final String GET_SECRET_OPERATION = "getSecret"; public static final String CREATE_SECRET_OPERATION = "createSecret"; + public static final String REPLACE_SECRET_OPERATION = "replaceSecret"; public static final String DELETE_SECRET_OPERATION = "deleteSecret"; // Resources quota @@ -71,6 +77,7 @@ public final class KubernetesOperations { public static final String LIST_RESOURCES_QUOTA_BY_LABELS_OPERATION = "listResourcesQuotaByLabels"; public static final String GET_RESOURCE_QUOTA_OPERATION = "getResourceQuota"; public static final String CREATE_RESOURCE_QUOTA_OPERATION = "createResourceQuota"; + public static final String REPLACE_RESOURCE_QUOTA_OPERATION = "replaceResourceQuota"; public static final String DELETE_RESOURCE_QUOTA_OPERATION = "deleteResourceQuota"; // Service Accounts @@ -78,6 +85,7 @@ public final class KubernetesOperations { public static final String LIST_SERVICE_ACCOUNTS_BY_LABELS_OPERATION = "listServiceAccountsByLabels"; public static final String GET_SERVICE_ACCOUNT_OPERATION = "getServiceAccount"; public static final String CREATE_SERVICE_ACCOUNT_OPERATION = "createServiceAccount"; + public static final String REPLACE_SERVICE_ACCOUNT_OPERATION = "replaceServiceAccount"; public static final String DELETE_SERVICE_ACCOUNT_OPERATION = "deleteServiceAccount"; // Nodes @@ -85,6 +93,7 @@ public final class KubernetesOperations { public static final String LIST_NODES_BY_LABELS_OPERATION = "listNodesByLabels"; public static final String GET_NODE_OPERATION = "getNode"; public static final String CREATE_NODE_OPERATION = "createNode"; + public static final String REPLACE_NODE_OPERATION = "replaceNode"; public static final String DELETE_NODE_OPERATION = "deleteNode"; // HPA @@ -92,6 +101,7 @@ public final class KubernetesOperations { public static final String LIST_HPA_BY_LABELS_OPERATION = "listHPAByLabels"; public static final String GET_HPA_OPERATION = "getHPA"; public static final String CREATE_HPA_OPERATION = "createHPA"; + public static final String REPLACE_HPA_OPERATION = "replaceHPA"; public static final String DELETE_HPA_OPERATION = "deleteHPA"; // Deployments @@ -100,6 +110,7 @@ public final class KubernetesOperations { public static final String GET_DEPLOYMENT = "getDeployment"; public static final String DELETE_DEPLOYMENT = "deleteDeployment"; public static final String CREATE_DEPLOYMENT = "createDeployment"; + public static final String REPLACE_DEPLOYMENT = "replaceDeployment"; public static final String SCALE_DEPLOYMENT = "scaleDeployment"; // Config Maps @@ -108,6 +119,7 @@ public final class KubernetesOperations { public static final String GET_CONFIGMAP_OPERATION = "getConfigMap"; public static final String CREATE_CONFIGMAP_OPERATION = "createConfigMap"; public static final String DELETE_CONFIGMAP_OPERATION = "deleteConfigMap"; + public static final String REPLACE_CONFIGMAP_OPERATION = "replaceConfigMap"; // Builds public static final String LIST_BUILD = "listBuilds"; @@ -124,6 +136,7 @@ public final class KubernetesOperations { public static final String LIST_JOB_BY_LABELS_OPERATION = "listJobByLabels"; public static final String GET_JOB_OPERATION = "getJob"; public static final String CREATE_JOB_OPERATION = "createJob"; + public static final String REPLACE_JOB_OPERATION = "replaceJob"; public static final String DELETE_JOB_OPERATION = "deleteJob"; // Custom Resources @@ -132,6 +145,7 @@ public final class KubernetesOperations { public static final String GET_CUSTOMRESOURCE = "getCustomResource"; public static final String DELETE_CUSTOMRESOURCE = "deleteCustomResource"; public static final String CREATE_CUSTOMRESOURCE = "createCustomResource"; + public static final String REPLACE_CUSTOMRESOURCE = "replaceCustomResource"; // Deployment Configs public static final String LIST_DEPLOYMENT_CONFIGS = "listDeploymentConfigs"; @@ -139,6 +153,7 @@ public final class KubernetesOperations { public static final String GET_DEPLOYMENT_CONFIG = "getDeploymentConfig"; public static final String DELETE_DEPLOYMENT_CONFIG = "deleteDeploymentConfig"; public static final String CREATE_DEPLOYMENT_CONFIG = "createDeploymentConfig"; + public static final String REPLACE_DEPLOYMENT_CONFIG = "replaceDeploymentConfig"; public static final String SCALE_DEPLOYMENT_CONFIG = "scaleDeploymentConfig"; private KubernetesOperations() { diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/config_maps/KubernetesConfigMapsProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/config_maps/KubernetesConfigMapsProducer.java index 24638924748..263fe6a1d4d 100644 --- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/config_maps/KubernetesConfigMapsProducer.java +++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/config_maps/KubernetesConfigMapsProducer.java @@ -19,11 +19,13 @@ package org.apache.camel.component.kubernetes.config_maps; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Function; import io.fabric8.kubernetes.api.model.ConfigMap; import io.fabric8.kubernetes.api.model.ConfigMapBuilder; import io.fabric8.kubernetes.api.model.ConfigMapList; import io.fabric8.kubernetes.api.model.StatusDetails; +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; @@ -71,6 +73,10 @@ public class KubernetesConfigMapsProducer extends DefaultProducer { doCreateConfigMap(exchange); break; + case KubernetesOperations.REPLACE_CONFIGMAP_OPERATION: + doReplaceConfigMap(exchange); + break; + case KubernetesOperations.DELETE_CONFIGMAP_OPERATION: doDeleteConfigMap(exchange); break; @@ -114,28 +120,41 @@ public class KubernetesConfigMapsProducer extends DefaultProducer { prepareOutboundMessage(exchange, configMap); } + protected void doReplaceConfigMap(Exchange exchange) { + doCreateOrUpdateConfigMap(exchange, "Replace", Resource::replace); + } + protected void doCreateConfigMap(Exchange exchange) { + doCreateOrUpdateConfigMap(exchange, "Create", Resource::create); + } + + private void doCreateOrUpdateConfigMap( + Exchange exchange, String operationName, Function<Resource<ConfigMap>, ConfigMap> operation) { String cfMapName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_CONFIGMAP_NAME, String.class); String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class); HashMap<String, String> configMapData = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_CONFIGMAP_DATA, HashMap.class); if (ObjectHelper.isEmpty(cfMapName)) { - LOG.error("Create a specific configMap require specify a configMap name"); - throw new IllegalArgumentException("Create a specific configMap require specify a configMap name"); + LOG.error("{} a specific configMap require specify a configMap name", operationName); + throw new IllegalArgumentException( + String.format("%s a specific configMap require specify a configMap name", operationName)); } if (ObjectHelper.isEmpty(namespaceName)) { - LOG.error("Create a specific configMap require specify a namespace name"); - throw new IllegalArgumentException("Create a specific configMap require specify a namespace name"); + LOG.error("{} a specific configMap require specify a namespace name", operationName); + throw new IllegalArgumentException( + String.format("%s a specific configMap require specify a namespace name", operationName)); } if (ObjectHelper.isEmpty(configMapData)) { - LOG.error("Create a specific configMap require specify a data map"); - throw new IllegalArgumentException("Create a specific configMap require specify a data map"); + LOG.error("{} a specific configMap require specify a data map", operationName); + throw new IllegalArgumentException( + String.format("%s a specific configMap require specify a data map", operationName)); } Map<String, String> labels = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_CONFIGMAPS_LABELS, Map.class); ConfigMap cfMapCreating = new ConfigMapBuilder().withNewMetadata().withName(cfMapName).withLabels(labels).endMetadata() .withData(configMapData).build(); ConfigMap configMap - = getEndpoint().getKubernetesClient().configMaps().inNamespace(namespaceName).resource(cfMapCreating).create(); + = operation.apply( + getEndpoint().getKubernetesClient().configMaps().inNamespace(namespaceName).resource(cfMapCreating)); prepareOutboundMessage(exchange, configMap); } diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/customresources/KubernetesCustomResourcesProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/customresources/KubernetesCustomResourcesProducer.java index 86e331188f8..cf0d35dbfe0 100644 --- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/customresources/KubernetesCustomResourcesProducer.java +++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/customresources/KubernetesCustomResourcesProducer.java @@ -18,11 +18,13 @@ package org.apache.camel.component.kubernetes.customresources; import java.util.List; import java.util.Map; +import java.util.function.Function; import io.fabric8.kubernetes.api.model.GenericKubernetesResource; import io.fabric8.kubernetes.api.model.GenericKubernetesResourceList; import io.fabric8.kubernetes.api.model.StatusDetails; import io.fabric8.kubernetes.client.KubernetesClientException; +import io.fabric8.kubernetes.client.dsl.Resource; import io.fabric8.kubernetes.client.dsl.base.CustomResourceDefinitionContext; import io.fabric8.kubernetes.client.utils.Serialization; import org.apache.camel.Exchange; @@ -89,6 +91,10 @@ public class KubernetesCustomResourcesProducer extends DefaultProducer { doCreate(exchange, namespace); break; + case KubernetesOperations.REPLACE_CUSTOMRESOURCE: + doReplace(exchange, namespace); + break; + default: throw new IllegalArgumentException("Unsupported operation " + operation); } @@ -181,15 +187,24 @@ public class KubernetesCustomResourcesProducer extends DefaultProducer { } + protected void doReplace(Exchange exchange, String namespaceName) { + doCreateOrReplace(exchange, namespaceName, Resource::replace); + } + protected void doCreate(Exchange exchange, String namespaceName) { + doCreateOrReplace(exchange, namespaceName, Resource::create); + } + + private void doCreateOrReplace( + Exchange exchange, String namespaceName, + Function<Resource<GenericKubernetesResource>, GenericKubernetesResource> operation) { String customResourceInstance = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_CRD_INSTANCE, String.class); GenericKubernetesResource customResource = new GenericKubernetesResource(); try { - customResource = getEndpoint().getKubernetesClient() + customResource = operation.apply(getEndpoint().getKubernetesClient() .genericKubernetesResources(getCRDContext(exchange.getIn())) .inNamespace(namespaceName) - .resource(Serialization.unmarshal(customResourceInstance, GenericKubernetesResource.class)) - .create(); + .resource(Serialization.unmarshal(customResourceInstance, GenericKubernetesResource.class))); } catch (KubernetesClientException e) { if (e.getCode() == 409) { LOG.info("Custom resource instance already exists", e); diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/deployments/KubernetesDeploymentsProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/deployments/KubernetesDeploymentsProducer.java index 2f37559da4a..f42792c91d5 100644 --- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/deployments/KubernetesDeploymentsProducer.java +++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/deployments/KubernetesDeploymentsProducer.java @@ -18,6 +18,7 @@ package org.apache.camel.component.kubernetes.deployments; import java.util.List; import java.util.Map; +import java.util.function.Function; import io.fabric8.kubernetes.api.model.StatusDetails; import io.fabric8.kubernetes.api.model.apps.Deployment; @@ -25,6 +26,7 @@ import io.fabric8.kubernetes.api.model.apps.DeploymentBuilder; import io.fabric8.kubernetes.api.model.apps.DeploymentList; import io.fabric8.kubernetes.api.model.apps.DeploymentSpec; import io.fabric8.kubernetes.client.dsl.MixedOperation; +import io.fabric8.kubernetes.client.dsl.Resource; import io.fabric8.kubernetes.client.dsl.RollableScalableResource; import org.apache.camel.Exchange; import org.apache.camel.component.kubernetes.AbstractKubernetesEndpoint; @@ -77,6 +79,10 @@ public class KubernetesDeploymentsProducer extends DefaultProducer { doCreateDeployment(exchange); break; + case KubernetesOperations.REPLACE_DEPLOYMENT: + doReplaceDeployment(exchange); + break; + case KubernetesOperations.SCALE_DEPLOYMENT: doScaleDeployment(exchange); break; @@ -133,29 +139,41 @@ public class KubernetesDeploymentsProducer extends DefaultProducer { prepareOutboundMessage(exchange, deploymentDeleted); } + protected void doReplaceDeployment(Exchange exchange) { + doCreateOrUpdateDeployment(exchange, "Replace", Resource::replace); + } + protected void doCreateDeployment(Exchange exchange) { + doCreateOrUpdateDeployment(exchange, "Create", Resource::create); + } + + private void doCreateOrUpdateDeployment( + Exchange exchange, String operationName, Function<Resource<Deployment>, Deployment> operation) { String deploymentName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_DEPLOYMENT_NAME, String.class); String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class); DeploymentSpec deSpec = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_DEPLOYMENT_SPEC, DeploymentSpec.class); if (ObjectHelper.isEmpty(deploymentName)) { - LOG.error("Create a specific Deployment require specify a Deployment name"); - throw new IllegalArgumentException("Create a specific Deployment require specify a pod name"); + LOG.error("{} a specific Deployment require specify a Deployment name", operationName); + throw new IllegalArgumentException( + String.format("%s a specific Deployment require specify a pod name", operationName)); } if (ObjectHelper.isEmpty(namespaceName)) { - LOG.error("Create a specific Deployment require specify a namespace name"); - throw new IllegalArgumentException("Create a specific Deployment require specify a namespace name"); + LOG.error("{} a specific Deployment require specify a namespace name", operationName); + throw new IllegalArgumentException( + String.format("%s a specific Deployment require specify a namespace name", operationName)); } if (ObjectHelper.isEmpty(deSpec)) { - LOG.error("Create a specific Deployment require specify a Deployment spec bean"); - throw new IllegalArgumentException("Create a specific Deployment require specify a Deployment spec bean"); + LOG.error("{} a specific Deployment require specify a Deployment spec bean", operationName); + throw new IllegalArgumentException( + String.format("%s a specific Deployment require specify a Deployment spec bean", operationName)); } Map<String, String> labels = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_DEPLOYMENTS_LABELS, Map.class); Deployment deploymentCreating = new DeploymentBuilder().withNewMetadata().withName(deploymentName).withLabels(labels) .endMetadata().withSpec(deSpec).build(); - Deployment deployment = getEndpoint().getKubernetesClient().apps().deployments().inNamespace(namespaceName) - .resource(deploymentCreating) - .create(); + Deployment deployment + = operation.apply(getEndpoint().getKubernetesClient().apps().deployments().inNamespace(namespaceName) + .resource(deploymentCreating)); prepareOutboundMessage(exchange, deployment); } diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/hpa/KubernetesHPAProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/hpa/KubernetesHPAProducer.java index cc1a13a31e2..3b7dfbe69ff 100644 --- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/hpa/KubernetesHPAProducer.java +++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/hpa/KubernetesHPAProducer.java @@ -18,12 +18,14 @@ package org.apache.camel.component.kubernetes.hpa; import java.util.List; import java.util.Map; +import java.util.function.Function; import io.fabric8.kubernetes.api.model.StatusDetails; import io.fabric8.kubernetes.api.model.autoscaling.v1.HorizontalPodAutoscaler; import io.fabric8.kubernetes.api.model.autoscaling.v1.HorizontalPodAutoscalerBuilder; import io.fabric8.kubernetes.api.model.autoscaling.v1.HorizontalPodAutoscalerList; import io.fabric8.kubernetes.api.model.autoscaling.v1.HorizontalPodAutoscalerSpec; +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; @@ -71,6 +73,10 @@ public class KubernetesHPAProducer extends DefaultProducer { doCreateHPA(exchange); break; + case KubernetesOperations.REPLACE_HPA_OPERATION: + doReplaceHPA(exchange); + break; + case KubernetesOperations.DELETE_HPA_OPERATION: doDeleteHPA(exchange); break; @@ -123,30 +129,40 @@ public class KubernetesHPAProducer extends DefaultProducer { prepareOutboundMessage(exchange, hpa); } + protected void doReplaceHPA(Exchange exchange) { + doCreateOrUpdateHPA(exchange, "Replace", Resource::replace); + } + protected void doCreateHPA(Exchange exchange) { + doCreateOrUpdateHPA(exchange, "Create", Resource::create); + } + + private void doCreateOrUpdateHPA( + Exchange exchange, String operationName, + Function<Resource<HorizontalPodAutoscaler>, HorizontalPodAutoscaler> operation) { String hpaName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_HPA_NAME, String.class); String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class); HorizontalPodAutoscalerSpec hpaSpec = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_HPA_SPEC, HorizontalPodAutoscalerSpec.class); if (ObjectHelper.isEmpty(hpaName)) { - LOG.error("Create a specific hpa require specify a hpa name"); - throw new IllegalArgumentException("Create a specific hpa require specify a hpa name"); + LOG.error("{} a specific hpa require specify a hpa name", operationName); + throw new IllegalArgumentException(operationName + " a specific hpa require specify a hpa name"); } if (ObjectHelper.isEmpty(namespaceName)) { - LOG.error("Create a specific hpa require specify a namespace name"); - throw new IllegalArgumentException("Create a specific hpa require specify a namespace name"); + LOG.error("{} a specific hpa require specify a namespace name", operationName); + throw new IllegalArgumentException(operationName + " a specific hpa require specify a namespace name"); } if (ObjectHelper.isEmpty(hpaSpec)) { - LOG.error("Create a specific hpa require specify a hpa spec bean"); - throw new IllegalArgumentException("Create a specific hpa require specify a hpa spec bean"); + LOG.error("{} a specific hpa require specify a hpa spec bean", operationName); + throw new IllegalArgumentException(operationName + " a specific hpa require specify a hpa spec bean"); } Map<String, String> labels = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_HPA_LABELS, Map.class); HorizontalPodAutoscaler hpaCreating = new HorizontalPodAutoscalerBuilder().withNewMetadata().withName(hpaName) .withLabels(labels).endMetadata().withSpec(hpaSpec).build(); HorizontalPodAutoscaler hpa - = getEndpoint().getKubernetesClient().autoscaling().v1().horizontalPodAutoscalers().inNamespace(namespaceName) - .resource(hpaCreating) - .create(); + = operation.apply(getEndpoint().getKubernetesClient().autoscaling().v1().horizontalPodAutoscalers() + .inNamespace(namespaceName) + .resource(hpaCreating)); prepareOutboundMessage(exchange, hpa); } diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/job/KubernetesJobProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/job/KubernetesJobProducer.java index 51ed0c99cdc..611e3dc2567 100644 --- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/job/KubernetesJobProducer.java +++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/job/KubernetesJobProducer.java @@ -17,12 +17,14 @@ package org.apache.camel.component.kubernetes.job; import java.util.Map; +import java.util.function.Function; import io.fabric8.kubernetes.api.model.batch.v1.Job; import io.fabric8.kubernetes.api.model.batch.v1.JobBuilder; import io.fabric8.kubernetes.api.model.batch.v1.JobList; import io.fabric8.kubernetes.api.model.batch.v1.JobSpec; import io.fabric8.kubernetes.client.dsl.MixedOperation; +import io.fabric8.kubernetes.client.dsl.Resource; import io.fabric8.kubernetes.client.dsl.ScalableResource; import org.apache.camel.Exchange; import org.apache.camel.component.kubernetes.AbstractKubernetesEndpoint; @@ -77,6 +79,10 @@ public class KubernetesJobProducer extends DefaultProducer { doCreateJob(exchange); break; + case KubernetesOperations.REPLACE_JOB_OPERATION: + doReplaceJob(exchange); + break; + case KubernetesOperations.DELETE_JOB_OPERATION: doDeleteJob(exchange); break; @@ -122,27 +128,37 @@ public class KubernetesJobProducer extends DefaultProducer { prepareOutboundMessage(exchange, job); } + protected void doReplaceJob(Exchange exchange) { + doCreateOrUpdateJob(exchange, "Replace", Resource::replace); + } + protected void doCreateJob(Exchange exchange) { + doCreateOrUpdateJob(exchange, "Create", Resource::create); + } + + private void doCreateOrUpdateJob(Exchange exchange, String operationName, Function<Resource<Job>, Job> operation) { String jobName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_JOB_NAME, String.class); String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class); JobSpec jobSpec = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_JOB_SPEC, JobSpec.class); if (ObjectHelper.isEmpty(jobName)) { - LOG.error("Create a specific job require specify a job name"); - throw new IllegalArgumentException("Create a specific job require specify a job name"); + LOG.error("{} a specific job require specify a job name", operationName); + throw new IllegalArgumentException(String.format("%s a specific job require specify a job name", operationName)); } if (ObjectHelper.isEmpty(namespaceName)) { - LOG.error("Create a specific job require specify a namespace name"); - throw new IllegalArgumentException("Create a specific job require specify a namespace name"); + LOG.error("{} a specific job require specify a namespace name", operationName); + throw new IllegalArgumentException( + String.format("%s a specific job require specify a namespace name", operationName)); } if (ObjectHelper.isEmpty(jobSpec)) { - LOG.error("Create a specific job require specify a hpa spec bean"); - throw new IllegalArgumentException("Create a specific job require specify a hpa spec bean"); + LOG.error("{} a specific job require specify a hpa spec bean", operationName); + throw new IllegalArgumentException( + String.format("%s a specific job require specify a hpa spec bean", operationName)); } Map<String, String> labels = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_JOB_LABELS, Map.class); Job jobCreating = new JobBuilder().withNewMetadata().withName(jobName).withLabels(labels).endMetadata() .withSpec(jobSpec).build(); - Job job = getEndpoint().getKubernetesClient().batch().v1().jobs().inNamespace(namespaceName).resource(jobCreating) - .create(); + Job job = operation.apply( + getEndpoint().getKubernetesClient().batch().v1().jobs().inNamespace(namespaceName).resource(jobCreating)); prepareOutboundMessage(exchange, job); } diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/namespaces/KubernetesNamespacesProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/namespaces/KubernetesNamespacesProducer.java index 0f8428506a9..71c8ee2c270 100644 --- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/namespaces/KubernetesNamespacesProducer.java +++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/namespaces/KubernetesNamespacesProducer.java @@ -18,11 +18,13 @@ package org.apache.camel.component.kubernetes.namespaces; import java.util.List; import java.util.Map; +import java.util.function.Function; import io.fabric8.kubernetes.api.model.Namespace; import io.fabric8.kubernetes.api.model.NamespaceBuilder; import io.fabric8.kubernetes.api.model.NamespaceList; import io.fabric8.kubernetes.api.model.StatusDetails; +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; @@ -70,6 +72,10 @@ public class KubernetesNamespacesProducer extends DefaultProducer { doCreateNamespace(exchange); break; + case KubernetesOperations.REPLACE_NAMESPACE_OPERATION: + doReplaceNamespace(exchange); + break; + case KubernetesOperations.DELETE_NAMESPACE_OPERATION: doDeleteNamespace(exchange); break; @@ -108,16 +114,26 @@ public class KubernetesNamespacesProducer extends DefaultProducer { prepareOutboundMessage(exchange, namespace); } + protected void doReplaceNamespace(Exchange exchange) { + doCreateOrUpdateNamespace(exchange, "Replace", Resource::replace); + } + protected void doCreateNamespace(Exchange exchange) { + doCreateOrUpdateNamespace(exchange, "Create", Resource::create); + } + + private void doCreateOrUpdateNamespace( + Exchange exchange, String operationName, Function<Resource<Namespace>, Namespace> operation) { String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class); if (ObjectHelper.isEmpty(namespaceName)) { - LOG.error("Create a specific namespace require specify a namespace name"); - throw new IllegalArgumentException("Create a specific namespace require specify a namespace name"); + LOG.error("{} a specific namespace require specify a namespace name", operationName); + throw new IllegalArgumentException( + String.format("%s a specific namespace require specify a namespace name", operationName)); } Map<String, String> labels = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_LABELS, Map.class); Namespace ns = new NamespaceBuilder().withNewMetadata().withName(namespaceName).withLabels(labels).endMetadata().build(); - Namespace namespace = getEndpoint().getKubernetesClient().namespaces().resource(ns).create(); + Namespace namespace = operation.apply(getEndpoint().getKubernetesClient().namespaces().resource(ns)); prepareOutboundMessage(exchange, namespace); } diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/nodes/KubernetesNodesProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/nodes/KubernetesNodesProducer.java index e767af9c89e..edf44ad6309 100644 --- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/nodes/KubernetesNodesProducer.java +++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/nodes/KubernetesNodesProducer.java @@ -18,12 +18,14 @@ package org.apache.camel.component.kubernetes.nodes; import java.util.List; import java.util.Map; +import java.util.function.Function; import io.fabric8.kubernetes.api.model.Node; import io.fabric8.kubernetes.api.model.NodeBuilder; import io.fabric8.kubernetes.api.model.NodeList; import io.fabric8.kubernetes.api.model.NodeSpec; import io.fabric8.kubernetes.api.model.StatusDetails; +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; @@ -71,6 +73,10 @@ public class KubernetesNodesProducer extends DefaultProducer { doCreateNode(exchange); break; + case KubernetesOperations.REPLACE_NODE_OPERATION: + doReplaceNode(exchange); + break; + case KubernetesOperations.DELETE_NODE_OPERATION: doDeleteNode(exchange); break; @@ -107,21 +113,30 @@ public class KubernetesNodesProducer extends DefaultProducer { prepareOutboundMessage(exchange, node); } + protected void doReplaceNode(Exchange exchange) { + doCreateOrUpdateNode(exchange, "Replace", Resource::replace); + } + protected void doCreateNode(Exchange exchange) { + doCreateOrUpdateNode(exchange, "Create", Resource::create); + } + + private void doCreateOrUpdateNode(Exchange exchange, String operationName, Function<Resource<Node>, Node> operation) { String nodeName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NODE_NAME, String.class); NodeSpec nodeSpec = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NODE_SPEC, NodeSpec.class); if (ObjectHelper.isEmpty(nodeName)) { - LOG.error("Create a specific node require specify a node name"); - throw new IllegalArgumentException("Create a specific node require specify a node name"); + LOG.error("{} a specific node require specify a node name", operationName); + throw new IllegalArgumentException(String.format("%s a specific node require specify a node name", operationName)); } if (ObjectHelper.isEmpty(nodeSpec)) { - LOG.error("Create a specific node require specify a node spec bean"); - throw new IllegalArgumentException("Create a specific node require specify a node spec bean"); + LOG.error("{} a specific node require specify a node spec bean", operationName); + throw new IllegalArgumentException( + String.format("%s a specific node require specify a node spec bean", operationName)); } Map<String, String> labels = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_PODS_LABELS, Map.class); Node nodeCreating = new NodeBuilder().withNewMetadata().withName(nodeName).withLabels(labels).endMetadata() .withSpec(nodeSpec).build(); - Node node = getEndpoint().getKubernetesClient().nodes().resource(nodeCreating).create(); + Node node = operation.apply(getEndpoint().getKubernetesClient().nodes().resource(nodeCreating)); prepareOutboundMessage(exchange, node); } diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/persistent_volumes_claims/KubernetesPersistentVolumesClaimsProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/persistent_volumes_claims/KubernetesPersistentVolumesClaimsProducer.java index 0f7d286ebe7..52ee4f6ecd8 100644 --- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/persistent_volumes_claims/KubernetesPersistentVolumesClaimsProducer.java +++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/persistent_volumes_claims/KubernetesPersistentVolumesClaimsProducer.java @@ -18,12 +18,14 @@ package org.apache.camel.component.kubernetes.persistent_volumes_claims; import java.util.List; import java.util.Map; +import java.util.function.Function; import io.fabric8.kubernetes.api.model.PersistentVolumeClaim; import io.fabric8.kubernetes.api.model.PersistentVolumeClaimBuilder; import io.fabric8.kubernetes.api.model.PersistentVolumeClaimList; import io.fabric8.kubernetes.api.model.PersistentVolumeClaimSpec; import io.fabric8.kubernetes.api.model.StatusDetails; +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; @@ -71,6 +73,10 @@ public class KubernetesPersistentVolumesClaimsProducer extends DefaultProducer { doCreatePersistentVolumeClaim(exchange); break; + case KubernetesOperations.REPLACE_PERSISTENT_VOLUME_CLAIM_OPERATION: + doReplacePersistentVolumeClaim(exchange); + break; + case KubernetesOperations.DELETE_PERSISTENT_VOLUME_CLAIM_OPERATION: doDeletePersistentVolumeClaim(exchange); break; @@ -128,32 +134,46 @@ public class KubernetesPersistentVolumesClaimsProducer extends DefaultProducer { prepareOutboundMessage(exchange, pvc); } + protected void doReplacePersistentVolumeClaim(Exchange exchange) { + doCreateOrUpdatePersistentVolumeClaim(exchange, "Replace", Resource::replace); + } + protected void doCreatePersistentVolumeClaim(Exchange exchange) { + doCreateOrUpdatePersistentVolumeClaim(exchange, "Create", Resource::create); + } + + private void doCreateOrUpdatePersistentVolumeClaim( + Exchange exchange, String operationName, + Function<Resource<PersistentVolumeClaim>, PersistentVolumeClaim> operation) { String pvcName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_PERSISTENT_VOLUME_CLAIM_NAME, String.class); String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class); PersistentVolumeClaimSpec pvcSpec = exchange.getIn() .getHeader(KubernetesConstants.KUBERNETES_PERSISTENT_VOLUME_CLAIM_SPEC, PersistentVolumeClaimSpec.class); if (ObjectHelper.isEmpty(pvcName)) { - LOG.error("Create a specific Persistent Volume Claim require specify a Persistent Volume Claim name"); + LOG.error("{} a specific Persistent Volume Claim require specify a Persistent Volume Claim name", operationName); throw new IllegalArgumentException( - "Create a specific Persistent Volume Claim require specify a Persistent Volume Claim name"); + String.format("%s a specific Persistent Volume Claim require specify a Persistent Volume Claim name", + operationName)); } if (ObjectHelper.isEmpty(namespaceName)) { - LOG.error("Create a specific Persistent Volume Claim require specify a namespace name"); - throw new IllegalArgumentException("Create a specific Persistent Volume Claim require specify a namespace name"); + LOG.error("{} a specific Persistent Volume Claim require specify a namespace name", operationName); + throw new IllegalArgumentException( + String.format("%s a specific Persistent Volume Claim require specify a namespace name", operationName)); } if (ObjectHelper.isEmpty(pvcSpec)) { - LOG.error("Create a specific Persistent Volume Claim require specify a Persistent Volume Claim spec bean"); + LOG.error("{} a specific Persistent Volume Claim require specify a Persistent Volume Claim spec bean", + operationName); throw new IllegalArgumentException( - "Create a specific Persistent Volume Claim require specify a Persistent Volume Claim spec bean"); + String.format("%s a specific Persistent Volume Claim require specify a Persistent Volume Claim spec bean", + operationName)); } Map<String, String> labels = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_PERSISTENT_VOLUMES_CLAIMS_LABELS, Map.class); PersistentVolumeClaim pvcCreating = new PersistentVolumeClaimBuilder().withNewMetadata().withName(pvcName) .withLabels(labels).endMetadata().withSpec(pvcSpec).build(); PersistentVolumeClaim pvc - = getEndpoint().getKubernetesClient().persistentVolumeClaims().inNamespace(namespaceName).resource(pvcCreating) - .create(); + = operation.apply(getEndpoint().getKubernetesClient().persistentVolumeClaims().inNamespace(namespaceName) + .resource(pvcCreating)); prepareOutboundMessage(exchange, pvc); } diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/pods/KubernetesPodsProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/pods/KubernetesPodsProducer.java index 9de34cc7617..f8cc95ae2a7 100644 --- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/pods/KubernetesPodsProducer.java +++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/pods/KubernetesPodsProducer.java @@ -18,12 +18,14 @@ package org.apache.camel.component.kubernetes.pods; import java.util.List; import java.util.Map; +import java.util.function.Function; import io.fabric8.kubernetes.api.model.Pod; import io.fabric8.kubernetes.api.model.PodBuilder; import io.fabric8.kubernetes.api.model.PodList; import io.fabric8.kubernetes.api.model.PodSpec; import io.fabric8.kubernetes.api.model.StatusDetails; +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; @@ -71,6 +73,10 @@ public class KubernetesPodsProducer extends DefaultProducer { doCreatePod(exchange); break; + case KubernetesOperations.REPLACE_POD_OPERATION: + doReplacePod(exchange); + break; + case KubernetesOperations.DELETE_POD_OPERATION: doDeletePod(exchange); break; @@ -123,26 +129,36 @@ public class KubernetesPodsProducer extends DefaultProducer { prepareOutboundMessage(exchange, pod); } + protected void doReplacePod(Exchange exchange) { + doCreateOrUpdatePod(exchange, "Replace", Resource::replace); + } + protected void doCreatePod(Exchange exchange) { + doCreateOrUpdatePod(exchange, "Create", Resource::create); + } + + private void doCreateOrUpdatePod(Exchange exchange, String operationName, Function<Resource<Pod>, Pod> operation) { String podName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_POD_NAME, String.class); String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class); PodSpec podSpec = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_POD_SPEC, PodSpec.class); if (ObjectHelper.isEmpty(podName)) { - LOG.error("Create a specific pod require specify a pod name"); - throw new IllegalArgumentException("Create a specific pod require specify a pod name"); + LOG.error("{} a specific pod require specify a pod name", operationName); + throw new IllegalArgumentException(String.format("%s a specific pod require specify a pod name", operationName)); } if (ObjectHelper.isEmpty(namespaceName)) { - LOG.error("Create a specific pod require specify a namespace name"); - throw new IllegalArgumentException("Create a specific pod require specify a namespace name"); + LOG.error("{} a specific pod require specify a namespace name", operationName); + throw new IllegalArgumentException( + String.format("%s a specific pod require specify a namespace name", operationName)); } if (ObjectHelper.isEmpty(podSpec)) { - LOG.error("Create a specific pod require specify a pod spec bean"); - throw new IllegalArgumentException("Create a specific pod require specify a pod spec bean"); + LOG.error("{} a specific pod require specify a pod spec bean", operationName); + throw new IllegalArgumentException( + String.format("%s a specific pod require specify a pod spec bean", operationName)); } Map<String, String> labels = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_PODS_LABELS, Map.class); Pod podCreating = new PodBuilder().withNewMetadata().withName(podName).withLabels(labels).endMetadata() .withSpec(podSpec).build(); - Pod pod = getEndpoint().getKubernetesClient().pods().inNamespace(namespaceName).resource(podCreating).create(); + Pod pod = operation.apply(getEndpoint().getKubernetesClient().pods().inNamespace(namespaceName).resource(podCreating)); prepareOutboundMessage(exchange, pod); } diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/replication_controllers/KubernetesReplicationControllersProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/replication_controllers/KubernetesReplicationControllersProducer.java index 45a9981961b..f6f839f8522 100644 --- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/replication_controllers/KubernetesReplicationControllersProducer.java +++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/replication_controllers/KubernetesReplicationControllersProducer.java @@ -18,6 +18,7 @@ package org.apache.camel.component.kubernetes.replication_controllers; import java.util.List; import java.util.Map; +import java.util.function.Function; import io.fabric8.kubernetes.api.model.ReplicationController; import io.fabric8.kubernetes.api.model.ReplicationControllerBuilder; @@ -25,6 +26,7 @@ import io.fabric8.kubernetes.api.model.ReplicationControllerList; import io.fabric8.kubernetes.api.model.ReplicationControllerSpec; import io.fabric8.kubernetes.api.model.StatusDetails; import io.fabric8.kubernetes.client.dsl.NonNamespaceOperation; +import io.fabric8.kubernetes.client.dsl.Resource; import io.fabric8.kubernetes.client.dsl.RollableScalableResource; import org.apache.camel.Exchange; import org.apache.camel.component.kubernetes.AbstractKubernetesEndpoint; @@ -73,6 +75,10 @@ public class KubernetesReplicationControllersProducer extends DefaultProducer { doCreateReplicationController(exchange); break; + case KubernetesOperations.REPLACE_REPLICATION_CONTROLLER_OPERATION: + doReplaceReplicationController(exchange); + break; + case KubernetesOperations.DELETE_REPLICATION_CONTROLLER_OPERATION: doDeleteReplicationController(exchange); break; @@ -140,31 +146,45 @@ public class KubernetesReplicationControllersProducer extends DefaultProducer { prepareOutboundMessage(exchange, rc); } + protected void doReplaceReplicationController(Exchange exchange) { + doCreateOrUpdateReplicationController(exchange, "Replace", Resource::replace); + } + protected void doCreateReplicationController(Exchange exchange) { + doCreateOrUpdateReplicationController(exchange, "Create", Resource::create); + } + + private void doCreateOrUpdateReplicationController( + Exchange exchange, String operationName, + Function<Resource<ReplicationController>, ReplicationController> operation) { String rcName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_REPLICATION_CONTROLLER_NAME, String.class); String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class); ReplicationControllerSpec rcSpec = exchange.getIn() .getHeader(KubernetesConstants.KUBERNETES_REPLICATION_CONTROLLER_SPEC, ReplicationControllerSpec.class); if (ObjectHelper.isEmpty(rcName)) { - LOG.error("Create a specific replication controller require specify a replication controller name"); + LOG.error("{} a specific replication controller require specify a replication controller name", operationName); throw new IllegalArgumentException( - "Create a specific replication controller require specify a replication controller name"); + String.format("%s a specific replication controller require specify a replication controller name", + operationName)); } if (ObjectHelper.isEmpty(namespaceName)) { - LOG.error("Create a specific replication controller require specify a namespace name"); - throw new IllegalArgumentException("Create a specific replication controller require specify a namespace name"); + LOG.error("{} a specific replication controller require specify a namespace name", operationName); + throw new IllegalArgumentException( + String.format("%s a specific replication controller require specify a namespace name", operationName)); } if (ObjectHelper.isEmpty(rcSpec)) { - LOG.error("Create a specific replication controller require specify a replication controller spec bean"); + LOG.error("{} a specific replication controller require specify a replication controller spec bean", operationName); throw new IllegalArgumentException( - "Create a specific replication controller require specify a replication controller spec bean"); + String.format("%s a specific replication controller require specify a replication controller spec bean", + operationName)); } Map<String, String> labels = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_REPLICATION_CONTROLLERS_LABELS, Map.class); ReplicationController rcCreating = new ReplicationControllerBuilder().withNewMetadata().withName(rcName) .withLabels(labels).endMetadata().withSpec(rcSpec).build(); - ReplicationController rc = getEndpoint().getKubernetesClient().replicationControllers().inNamespace(namespaceName) - .resource(rcCreating).create(); + ReplicationController rc + = operation.apply(getEndpoint().getKubernetesClient().replicationControllers().inNamespace(namespaceName) + .resource(rcCreating)); prepareOutboundMessage(exchange, rc); } diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/resources_quota/KubernetesResourcesQuotaProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/resources_quota/KubernetesResourcesQuotaProducer.java index be90b4cd3e5..2318340552f 100644 --- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/resources_quota/KubernetesResourcesQuotaProducer.java +++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/resources_quota/KubernetesResourcesQuotaProducer.java @@ -18,6 +18,7 @@ package org.apache.camel.component.kubernetes.resources_quota; import java.util.List; import java.util.Map; +import java.util.function.Function; import io.fabric8.kubernetes.api.model.ResourceQuota; import io.fabric8.kubernetes.api.model.ResourceQuotaBuilder; @@ -74,6 +75,10 @@ public class KubernetesResourcesQuotaProducer extends DefaultProducer { doCreateResourceQuota(exchange); break; + case KubernetesOperations.REPLACE_RESOURCE_QUOTA_OPERATION: + doReplaceResourceQuota(exchange); + break; + case KubernetesOperations.DELETE_RESOURCE_QUOTA_OPERATION: doDeleteResourceQuota(exchange); break; @@ -130,29 +135,41 @@ public class KubernetesResourcesQuotaProducer extends DefaultProducer { prepareOutboundMessage(exchange, rq); } + protected void doReplaceResourceQuota(Exchange exchange) { + doCreateOrUpdateResourceQuota(exchange, "Replace", Resource::replace); + } + protected void doCreateResourceQuota(Exchange exchange) { + doCreateOrUpdateResourceQuota(exchange, "Create", Resource::create); + } + + private void doCreateOrUpdateResourceQuota( + Exchange exchange, String operationName, Function<Resource<ResourceQuota>, ResourceQuota> operation) { String rqName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_RESOURCES_QUOTA_NAME, String.class); String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class); ResourceQuotaSpec rqSpec = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_RESOURCE_QUOTA_SPEC, ResourceQuotaSpec.class); if (ObjectHelper.isEmpty(rqName)) { - LOG.error("Create a specific resource quota require specify a resource quota name"); - throw new IllegalArgumentException("Create a specific resource quota require specify a resource quota name"); + LOG.error("{} a specific resource quota require specify a resource quota name", operationName); + throw new IllegalArgumentException( + operationName + " a specific resource quota require specify a resource quota name"); } if (ObjectHelper.isEmpty(namespaceName)) { - LOG.error("Create a specific resource quota require specify a namespace name"); - throw new IllegalArgumentException("Create a specific resource quota require specify a namespace name"); + LOG.error("{} a specific resource quota require specify a namespace name", operationName); + throw new IllegalArgumentException(operationName + " a specific resource quota require specify a namespace name"); } if (ObjectHelper.isEmpty(rqSpec)) { - LOG.error("Create a specific resource quota require specify a resource quota spec bean"); - throw new IllegalArgumentException("Create a specific resource quota require specify a resource quota spec bean"); + LOG.error("{} a specific resource quota require specify a resource quota spec bean", operationName); + throw new IllegalArgumentException( + operationName + " a specific resource quota require specify a resource quota spec bean"); } Map<String, String> labels = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_RESOURCES_QUOTA_LABELS, Map.class); ResourceQuota rqCreating = new ResourceQuotaBuilder().withNewMetadata().withName(rqName).withLabels(labels) .endMetadata().withSpec(rqSpec).build(); ResourceQuota rq - = getEndpoint().getKubernetesClient().resourceQuotas().inNamespace(namespaceName).resource(rqCreating).create(); + = operation.apply( + getEndpoint().getKubernetesClient().resourceQuotas().inNamespace(namespaceName).resource(rqCreating)); prepareOutboundMessage(exchange, rq); } diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/secrets/KubernetesSecretsProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/secrets/KubernetesSecretsProducer.java index 30c05103d27..003ec056451 100644 --- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/secrets/KubernetesSecretsProducer.java +++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/secrets/KubernetesSecretsProducer.java @@ -18,10 +18,12 @@ package org.apache.camel.component.kubernetes.secrets; import java.util.List; import java.util.Map; +import java.util.function.Function; import io.fabric8.kubernetes.api.model.Secret; import io.fabric8.kubernetes.api.model.SecretList; import io.fabric8.kubernetes.api.model.StatusDetails; +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; @@ -69,6 +71,10 @@ public class KubernetesSecretsProducer extends DefaultProducer { doCreateSecret(exchange); break; + case KubernetesOperations.REPLACE_SECRET_OPERATION: + doReplaceSecret(exchange); + break; + case KubernetesOperations.DELETE_SECRET_OPERATION: doDeleteSecret(exchange); break; @@ -121,19 +127,30 @@ public class KubernetesSecretsProducer extends DefaultProducer { prepareOutboundMessage(exchange, secret); } + protected void doReplaceSecret(Exchange exchange) { + doCreateOrUpdateSecret(exchange, "Replace", Resource::replace); + } + protected void doCreateSecret(Exchange exchange) { + doCreateOrUpdateSecret(exchange, "Create", Resource::create); + } + + private void doCreateOrUpdateSecret(Exchange exchange, String operationName, Function<Resource<Secret>, Secret> operation) { String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class); Secret secretToCreate = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_SECRET, Secret.class); if (ObjectHelper.isEmpty(namespaceName)) { - LOG.error("Create a specific secret require specify a namespace name"); - throw new IllegalArgumentException("Create a specific secret require specify a namespace name"); + LOG.error("{} a specific secret require specify a namespace name", operationName); + throw new IllegalArgumentException( + String.format("%s a specific secret require specify a namespace name", operationName)); } if (ObjectHelper.isEmpty(secretToCreate)) { - LOG.error("Create a specific secret require specify a secret bean"); - throw new IllegalArgumentException("Create a specific secret require specify a secret bean"); + LOG.error("{} a specific secret require specify a secret bean", operationName); + throw new IllegalArgumentException( + String.format("%s a specific secret require specify a secret bean", operationName)); } Secret secret - = getEndpoint().getKubernetesClient().secrets().inNamespace(namespaceName).resource(secretToCreate).create(); + = operation.apply( + getEndpoint().getKubernetesClient().secrets().inNamespace(namespaceName).resource(secretToCreate)); prepareOutboundMessage(exchange, secret); } diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/service_accounts/KubernetesServiceAccountsProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/service_accounts/KubernetesServiceAccountsProducer.java index 95125bca63f..1fffa9d0627 100644 --- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/service_accounts/KubernetesServiceAccountsProducer.java +++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/service_accounts/KubernetesServiceAccountsProducer.java @@ -18,10 +18,12 @@ package org.apache.camel.component.kubernetes.service_accounts; import java.util.List; import java.util.Map; +import java.util.function.Function; import io.fabric8.kubernetes.api.model.ServiceAccount; import io.fabric8.kubernetes.api.model.ServiceAccountList; import io.fabric8.kubernetes.api.model.StatusDetails; +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; @@ -69,6 +71,10 @@ public class KubernetesServiceAccountsProducer extends DefaultProducer { doCreateServiceAccount(exchange); break; + case KubernetesOperations.REPLACE_SERVICE_ACCOUNT_OPERATION: + doReplaceServiceAccount(exchange); + break; + case KubernetesOperations.DELETE_SERVICE_ACCOUNT_OPERATION: doDeleteServiceAccount(exchange); break; @@ -124,20 +130,31 @@ public class KubernetesServiceAccountsProducer extends DefaultProducer { prepareOutboundMessage(exchange, sa); } + protected void doReplaceServiceAccount(Exchange exchange) { + doCreateOrUpdateServiceAccount(exchange, "Replace", Resource::replace); + } + protected void doCreateServiceAccount(Exchange exchange) { + doCreateOrUpdateServiceAccount(exchange, "Create", Resource::create); + } + + private void doCreateOrUpdateServiceAccount( + Exchange exchange, String operationName, Function<Resource<ServiceAccount>, ServiceAccount> operation) { String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class); ServiceAccount saToCreate = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_SERVICE_ACCOUNT, ServiceAccount.class); if (ObjectHelper.isEmpty(namespaceName)) { - LOG.error("Create a specific Service Account require specify a namespace name"); - throw new IllegalArgumentException("Create a specific Service Account require specify a namespace name"); + LOG.error("{} a specific Service Account require specify a namespace name", operationName); + throw new IllegalArgumentException( + String.format("%s a specific Service Account require specify a namespace name", operationName)); } if (ObjectHelper.isEmpty(saToCreate)) { - LOG.error("Create a specific Service Account require specify a Service Account bean"); - throw new IllegalArgumentException("Create a specific Service Account require specify a Service Account bean"); + LOG.error("{} a specific Service Account require specify a Service Account bean", operationName); + throw new IllegalArgumentException( + String.format("%s a specific Service Account require specify a Service Account bean", operationName)); } - ServiceAccount sa = getEndpoint().getKubernetesClient().serviceAccounts().inNamespace(namespaceName) - .resource(saToCreate).create(); + ServiceAccount sa = operation.apply(getEndpoint().getKubernetesClient().serviceAccounts().inNamespace(namespaceName) + .resource(saToCreate)); prepareOutboundMessage(exchange, sa); } diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/services/KubernetesServicesProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/services/KubernetesServicesProducer.java index a97e6946fd1..2383e5c9014 100644 --- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/services/KubernetesServicesProducer.java +++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/services/KubernetesServicesProducer.java @@ -18,12 +18,14 @@ package org.apache.camel.component.kubernetes.services; import java.util.List; import java.util.Map; +import java.util.function.Function; import io.fabric8.kubernetes.api.model.Service; import io.fabric8.kubernetes.api.model.ServiceBuilder; import io.fabric8.kubernetes.api.model.ServiceList; import io.fabric8.kubernetes.api.model.ServiceSpec; import io.fabric8.kubernetes.api.model.StatusDetails; +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; @@ -71,6 +73,10 @@ public class KubernetesServicesProducer extends DefaultProducer { doCreateService(exchange); break; + case KubernetesOperations.REPLACE_SERVICE_OPERATION: + doReplaceService(exchange); + break; + case KubernetesOperations.DELETE_SERVICE_OPERATION: doDeleteService(exchange); break; @@ -130,27 +136,40 @@ public class KubernetesServicesProducer extends DefaultProducer { prepareOutboundMessage(exchange, service); } + protected void doReplaceService(Exchange exchange) { + doCreateOrUpdateService(exchange, "Replace", Resource::replace); + } + protected void doCreateService(Exchange exchange) { + doCreateOrUpdateService(exchange, "Create", Resource::create); + } + + private void doCreateOrUpdateService( + Exchange exchange, String operationName, Function<Resource<Service>, Service> operation) { String serviceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_SERVICE_NAME, String.class); String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class); ServiceSpec serviceSpec = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_SERVICE_SPEC, ServiceSpec.class); if (ObjectHelper.isEmpty(serviceName)) { - LOG.error("Create a specific service require specify a service name"); - throw new IllegalArgumentException("Create a specific service require specify a service name"); + LOG.error("{} a specific service require specify a service name", operationName); + throw new IllegalArgumentException( + String.format("%s a specific service require specify a service name", operationName)); } if (ObjectHelper.isEmpty(namespaceName)) { - LOG.error("Create a specific service require specify a namespace name"); - throw new IllegalArgumentException("Create a specific service require specify a namespace name"); + LOG.error("{} a specific service require specify a namespace name", operationName); + throw new IllegalArgumentException( + String.format("%s a specific service require specify a namespace name", operationName)); } if (ObjectHelper.isEmpty(serviceSpec)) { - LOG.error("Create a specific service require specify a service spec bean"); - throw new IllegalArgumentException("Create a specific service require specify a service spec bean"); + LOG.error("{} a specific service require specify a service spec bean", operationName); + throw new IllegalArgumentException( + String.format("%s a specific service require specify a service spec bean", operationName)); } Map<String, String> labels = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_SERVICE_LABELS, Map.class); Service serviceCreating = new ServiceBuilder().withNewMetadata().withName(serviceName).withLabels(labels).endMetadata() .withSpec(serviceSpec).build(); Service service - = getEndpoint().getKubernetesClient().services().inNamespace(namespaceName).resource(serviceCreating).create(); + = operation.apply( + getEndpoint().getKubernetesClient().services().inNamespace(namespaceName).resource(serviceCreating)); prepareOutboundMessage(exchange, service); } diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/openshift/deploymentconfigs/OpenshiftDeploymentConfigsProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/openshift/deploymentconfigs/OpenshiftDeploymentConfigsProducer.java index 9fdad01b7f7..d49b245002f 100644 --- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/openshift/deploymentconfigs/OpenshiftDeploymentConfigsProducer.java +++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/openshift/deploymentconfigs/OpenshiftDeploymentConfigsProducer.java @@ -18,8 +18,10 @@ package org.apache.camel.component.openshift.deploymentconfigs; import java.util.List; import java.util.Map; +import java.util.function.Function; import io.fabric8.kubernetes.api.model.StatusDetails; +import io.fabric8.kubernetes.client.dsl.Resource; import io.fabric8.openshift.api.model.DeploymentConfig; import io.fabric8.openshift.api.model.DeploymentConfigBuilder; import io.fabric8.openshift.api.model.DeploymentConfigList; @@ -76,6 +78,10 @@ public class OpenshiftDeploymentConfigsProducer extends DefaultProducer { doCreateDeployment(exchange); break; + case KubernetesOperations.REPLACE_DEPLOYMENT_CONFIG: + doReplaceDeployment(exchange); + break; + case KubernetesOperations.SCALE_DEPLOYMENT_CONFIG: doScaleDeploymentConfig(exchange); break; @@ -133,31 +139,43 @@ public class OpenshiftDeploymentConfigsProducer extends DefaultProducer { prepareOutboundMessage(exchange, deploymentConfigDeleted); } + protected void doReplaceDeployment(Exchange exchange) { + doCreateOrUpdateDeployment(exchange, "Replace", Resource::replace); + } + protected void doCreateDeployment(Exchange exchange) { + doCreateOrUpdateDeployment(exchange, "Create", Resource::create); + } + + private void doCreateOrUpdateDeployment( + Exchange exchange, String operationName, Function<Resource<DeploymentConfig>, DeploymentConfig> operation) { String deploymentName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_DEPLOYMENT_NAME, String.class); String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class); DeploymentConfigSpec dcSpec = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_DEPLOYMENT_CONFIG_SPEC, DeploymentConfigSpec.class); if (ObjectHelper.isEmpty(deploymentName)) { - LOG.error("Create a specific Deployment Config require specify a Deployment name"); - throw new IllegalArgumentException("Create a specific Deployment Config require specify a pod name"); + LOG.error("{} a specific Deployment Config require specify a Deployment name", operationName); + throw new IllegalArgumentException( + String.format("%s a specific Deployment Config require specify a pod name", operationName)); } if (ObjectHelper.isEmpty(namespaceName)) { - LOG.error("Create a specific Deployment Config require specify a namespace name"); - throw new IllegalArgumentException("Create a specific Deployment Config require specify a namespace name"); + LOG.error("{} a specific Deployment Config require specify a namespace name", operationName); + throw new IllegalArgumentException( + String.format("%s a specific Deployment Config require specify a namespace name", operationName)); } if (ObjectHelper.isEmpty(dcSpec)) { - LOG.error("Create a specific Deployment Config require specify a Deployment Config spec bean"); + LOG.error("{} a specific Deployment Config require specify a Deployment Config spec bean", operationName); throw new IllegalArgumentException( - "Create a specific Deployment Config require specify a Deployment Config spec bean"); + String.format("%s a specific Deployment Config require specify a Deployment Config spec bean", + operationName)); } Map<String, String> labels = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_DEPLOYMENTS_LABELS, Map.class); DeploymentConfig deploymentCreating = new DeploymentConfigBuilder().withNewMetadata().withName(deploymentName) .withLabels(labels).endMetadata().withSpec(dcSpec).build(); - DeploymentConfig deploymentConfig = getEndpoint().getKubernetesClient().adapt(OpenShiftClient.class).deploymentConfigs() - .inNamespace(namespaceName) - .resource(deploymentCreating) - .create(); + DeploymentConfig deploymentConfig + = operation.apply(getEndpoint().getKubernetesClient().adapt(OpenShiftClient.class).deploymentConfigs() + .inNamespace(namespaceName) + .resource(deploymentCreating)); prepareOutboundMessage(exchange, deploymentConfig); } diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/consumer/integration/KubernetesConfigMapsConsumerIT.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/consumer/integration/KubernetesConfigMapsConsumerIT.java index c5f4e7803e5..c16c2d99301 100644 --- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/consumer/integration/KubernetesConfigMapsConsumerIT.java +++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/consumer/integration/KubernetesConfigMapsConsumerIT.java @@ -38,6 +38,7 @@ import org.junit.jupiter.api.condition.EnabledIfSystemProperty; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -105,8 +106,31 @@ public class KubernetesConfigMapsConsumerIT extends KubernetesTestSupport { assertNotNull(message.getBody()); } - @ParameterizedTest + @Test @Order(3) + void replaceConfigMap() { + configureMock(); + + Map<String, String> configMapData = Map.of("test1", "test1"); + Exchange ex = template.request("direct:replaceConfigmap", exchange -> { + exchange.getIn().removeHeader(KubernetesConstants.KUBERNETES_CONFIGMAPS_LABELS); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "default"); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CONFIGMAP_NAME, "test1"); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CONFIGMAP_DATA, configMapData); + }); + + Message message = ex.getMessage(); + + assertNotNull(message); + ConfigMap result = ex.getMessage().getBody(ConfigMap.class); + + assertEquals("default", result.getMetadata().getNamespace()); + assertEquals("test1", result.getMetadata().getName()); + assertEquals(configMapData, result.getData()); + } + + @ParameterizedTest + @Order(4) @ValueSource(strings = { "test", "test1" }) void deleteConfigMaps(String configMapName) { Exchange ex = template.request("direct:deleteConfigmap", exchange -> { @@ -132,6 +156,9 @@ public class KubernetesConfigMapsConsumerIT extends KubernetesTestSupport { from("direct:createConfigmap") .toF("kubernetes-config-maps://%s?oauthToken=%s&operation=createConfigMap", host, authToken); + from("direct:replaceConfigmap") + .toF("kubernetes-config-maps://%s?oauthToken=%s&operation=replaceConfigMap", host, + authToken); from("direct:deleteConfigmap") .toF("kubernetes-config-maps://%s?oauthToken=%s&operation=deleteConfigMap", host, diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesConfigMapsProducerTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesConfigMapsProducerTest.java index 2327dae6dd3..d18e510328b 100644 --- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesConfigMapsProducerTest.java +++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesConfigMapsProducerTest.java @@ -131,6 +131,32 @@ public class KubernetesConfigMapsProducerTest extends KubernetesTestSupport { assertEquals(labels, result.getMetadata().getLabels()); } + @Test + void replaceConfigMap() { + Map<String, String> labels = Map.of("my.label.key", "my.label.value"); + Map<String, String> data = Map.of("my.data.key", "my.data.value"); + ConfigMap cm1 = new ConfigMapBuilder().withNewMetadata().withName("cm1").withNamespace("test").withLabels(labels).and() + .withData(data).build(); + server.expect().get().withPath("/api/v1/namespaces/test/configmaps/cm1") + .andReturn(200, + new ConfigMapBuilder().withNewMetadata().withName("cm1").withNamespace("test").endMetadata().build()) + .once(); + server.expect().put().withPath("/api/v1/namespaces/test/configmaps/cm1").andReturn(200, cm1).once(); + + Exchange ex = template.request("direct:replaceConfigMap", exchange -> { + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test"); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CONFIGMAPS_LABELS, labels); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CONFIGMAP_NAME, "cm1"); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CONFIGMAP_DATA, data); + }); + + ConfigMap result = ex.getMessage().getBody(ConfigMap.class); + + assertEquals("test", result.getMetadata().getNamespace()); + assertEquals("cm1", result.getMetadata().getName()); + assertEquals(labels, result.getMetadata().getLabels()); + } + @Test void deleteConfigMap() { ConfigMap cm1 = new ConfigMapBuilder().withNewMetadata().withName("cm1").withNamespace("test").and().build(); @@ -159,6 +185,8 @@ public class KubernetesConfigMapsProducerTest extends KubernetesTestSupport { .to("kubernetes-config-maps:///?kubernetesClient=#kubernetesClient&operation=getConfigMap"); from("direct:createConfigMap") .to("kubernetes-config-maps:///?kubernetesClient=#kubernetesClient&operation=createConfigMap"); + from("direct:replaceConfigMap") + .to("kubernetes-config-maps:///?kubernetesClient=#kubernetesClient&operation=replaceConfigMap"); from("direct:deleteConfigMap") .to("kubernetes-config-maps:///?kubernetesClient=#kubernetesClient&operation=deleteConfigMap"); } diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesCustomResourcesProducerTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesCustomResourcesProducerTest.java index 1b1b2d59750..22d54a9ddd4 100644 --- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesCustomResourcesProducerTest.java +++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesCustomResourcesProducerTest.java @@ -99,6 +99,32 @@ public class KubernetesCustomResourcesProducerTest extends KubernetesTestSupport assertNotNull(ex.getMessage().getBody()); } + @Test + @Order(0) + void replaceTest() { + server.expect().get().withPath("/apis/sources.knative.dev/v1alpha1/namespaces/testnamespace/githubsources/samplecr") + .andReturn(200, githubSourceString).once(); + server.expect().put().withPath("/apis/sources.knative.dev/v1alpha1/namespaces/testnamespace/githubsources/samplecr") + .andReturn(200, githubSourceString).once(); + + Exchange ex = template.request("direct:replaceCustomResource", exchange -> { + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CRD_INSTANCE_NAME, "samplecr"); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "testnamespace"); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CRD_NAME, "githubsources.sources.knative.dev"); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CRD_GROUP, "sources.knative.dev"); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CRD_SCOPE, "Namespaced"); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CRD_VERSION, "v1alpha1"); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CRD_PLURAL, "githubsources"); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_CRD_INSTANCE, githubSourceString); + }); + + assertFalse(ex.isFailed()); + assertNull(ex.getException()); + + assertNotNull(ex.getMessage()); + assertNotNull(ex.getMessage().getBody()); + } + @Test @Order(2) void listTest() throws Exception { @@ -204,6 +230,8 @@ public class KubernetesCustomResourcesProducerTest extends KubernetesTestSupport "kubernetes-custom-resources:///?kubernetesClient=#kubernetesClient&operation=deleteCustomResource"); from("direct:createCustomResource").toF( "kubernetes-custom-resources:///?kubernetesClient=#kubernetesClient&operation=createCustomResource"); + from("direct:replaceCustomResource").toF( + "kubernetes-custom-resources:///?kubernetesClient=#kubernetesClient&operation=replaceCustomResource"); } }; } diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesDeploymentsProducerTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesDeploymentsProducerTest.java index b6ba664ad6b..32354ca1462 100644 --- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesDeploymentsProducerTest.java +++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesDeploymentsProducerTest.java @@ -102,6 +102,34 @@ public class KubernetesDeploymentsProducerTest extends KubernetesTestSupport { assertEquals(13, result.getSpec().getReplicas()); } + @Test + void replaceDeployment() { + Map<String, String> labels = Map.of("my.label.key", "my.label.value"); + DeploymentSpec spec = new DeploymentSpecBuilder().withReplicas(13).build(); + Deployment de1 + = new DeploymentBuilder().withNewMetadata().withName("de1").withNamespace("test").withLabels(labels).and() + .withSpec(spec).build(); + server.expect().get().withPath("/apis/apps/v1/namespaces/test/deployments/de1") + .andReturn(200, + new DeploymentBuilder().withNewMetadata().withName("de1").withNamespace("test").endMetadata().build()) + .once(); + server.expect().put().withPath("/apis/apps/v1/namespaces/test/deployments/de1").andReturn(200, de1).once(); + + Exchange ex = template.request("direct:replaceDeployment", exchange -> { + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test"); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_DEPLOYMENTS_LABELS, labels); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_DEPLOYMENT_NAME, "de1"); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_DEPLOYMENT_SPEC, spec); + }); + + Deployment result = ex.getMessage().getBody(Deployment.class); + + assertEquals("test", result.getMetadata().getNamespace()); + assertEquals("de1", result.getMetadata().getName()); + assertEquals(labels, result.getMetadata().getLabels()); + assertEquals(13, result.getSpec().getReplicas()); + } + @Test void deleteDeployment() { Deployment de1 = new DeploymentBuilder().withNewMetadata().withNamespace("test").withName("de1") @@ -162,6 +190,8 @@ public class KubernetesDeploymentsProducerTest extends KubernetesTestSupport { .toF("kubernetes-deployments:///?kubernetesClient=#kubernetesClient&operation=deleteDeployment"); from("direct:createDeployment") .toF("kubernetes-deployments:///?kubernetesClient=#kubernetesClient&operation=createDeployment"); + from("direct:replaceDeployment") + .toF("kubernetes-deployments:///?kubernetesClient=#kubernetesClient&operation=replaceDeployment"); from("direct:scaleDeployment") .toF("kubernetes-deployments:///?kubernetesClient=#kubernetesClient&operation=scaleDeployment"); } diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesHPAProducerTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesHPAProducerTest.java index ad381a809c8..01a4c3d5155 100644 --- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesHPAProducerTest.java +++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesHPAProducerTest.java @@ -126,6 +126,36 @@ public class KubernetesHPAProducerTest extends KubernetesTestSupport { assertEquals(13, result.getSpec().getMinReplicas()); } + @Test + void replaceHPATest() { + Map<String, String> labels = Map.of("my.label.key", "my.label.value"); + HorizontalPodAutoscalerSpec spec = new HorizontalPodAutoscalerSpecBuilder().withMinReplicas(13).build(); + HorizontalPodAutoscaler hpa1 = new HorizontalPodAutoscalerBuilder().withNewMetadata().withName("hpa1") + .withNamespace("test").withLabels(labels).and() + .withSpec(spec).build(); + server.expect().get().withPath("/apis/autoscaling/v1/namespaces/test/horizontalpodautoscalers/hpa1") + .andReturn(200, new HorizontalPodAutoscalerBuilder().withNewMetadata().withName("hpa1") + .withNamespace("test").endMetadata().build()) + .once(); + server.expect().put().withPath("/apis/autoscaling/v1/namespaces/test/horizontalpodautoscalers/hpa1") + .andReturn(200, hpa1) + .once(); + + Exchange ex = template.request("direct:replaceHPA", exchange -> { + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test"); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_HPA_LABELS, labels); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_HPA_NAME, "hpa1"); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_HPA_SPEC, spec); + }); + + HorizontalPodAutoscaler result = ex.getMessage().getBody(HorizontalPodAutoscaler.class); + + assertEquals("test", result.getMetadata().getNamespace()); + assertEquals("hpa1", result.getMetadata().getName()); + assertEquals(labels, result.getMetadata().getLabels()); + assertEquals(13, result.getSpec().getMinReplicas()); + } + @Test void deleteHPATest() { HorizontalPodAutoscaler hpa1 @@ -153,6 +183,7 @@ public class KubernetesHPAProducerTest extends KubernetesTestSupport { .to("kubernetes-hpa:///?kubernetesClient=#kubernetesClient&operation=listHPAByLabels"); from("direct:getHPA").to("kubernetes-hpa:///?kubernetesClient=#kubernetesClient&operation=getHPA"); from("direct:createHPA").to("kubernetes-hpa:///?kubernetesClient=#kubernetesClient&operation=createHPA"); + from("direct:replaceHPA").to("kubernetes-hpa:///?kubernetesClient=#kubernetesClient&operation=replaceHPA"); from("direct:deleteHPA").to("kubernetes-hpa:///?kubernetesClient=#kubernetesClient&operation=deleteHPA"); } }; diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesJobProducerTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesJobProducerTest.java index 3e0b0ab134d..52696df1e0b 100644 --- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesJobProducerTest.java +++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesJobProducerTest.java @@ -20,6 +20,9 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import io.fabric8.kubernetes.api.model.LabelSelector; +import io.fabric8.kubernetes.api.model.ObjectMeta; +import io.fabric8.kubernetes.api.model.PodTemplateSpecBuilder; import io.fabric8.kubernetes.api.model.batch.v1.Job; import io.fabric8.kubernetes.api.model.batch.v1.JobBuilder; import io.fabric8.kubernetes.api.model.batch.v1.JobListBuilder; @@ -114,6 +117,36 @@ public class KubernetesJobProducerTest extends KubernetesTestSupport { assertEquals(13, result.getSpec().getBackoffLimit()); } + @Test + void replaceJobTest() { + Map<String, String> labels = Map.of("my.label.key", "my.label.value"); + JobSpec spec = new JobSpecBuilder().withBackoffLimit(13).withSelector(new LabelSelector()) + .withTemplate(new PodTemplateSpecBuilder().build()).build(); + Job j1 = new JobBuilder().withNewMetadata().withName("j1").withNamespace("test").withLabels(labels).and() + .withSpec(spec).build(); + server.expect().get().withPath("/apis/batch/v1/namespaces/test/jobs/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/jobs/j1").andReturn(200, j1).once(); + + Exchange ex = template.request("direct:replace", exchange -> { + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test"); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_JOB_LABELS, labels); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_JOB_NAME, "j1"); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_JOB_SPEC, spec); + }); + + Job result = ex.getMessage().getBody(Job.class); + + assertEquals("test", result.getMetadata().getNamespace()); + assertEquals("j1", result.getMetadata().getName()); + assertEquals(labels, result.getMetadata().getLabels()); + assertEquals(13, result.getSpec().getBackoffLimit()); + } + @Test void deleteJobTest() { Job j1 = new JobBuilder().withNewMetadata().withName("j1").withNamespace("test").and().build(); @@ -139,6 +172,7 @@ public class KubernetesJobProducerTest extends KubernetesTestSupport { from("direct:listByLabels").to("kubernetes-job:foo?operation=listJobByLabels"); from("direct:get").to("kubernetes-job:foo?operation=getJob"); from("direct:create").to("kubernetes-job:foo?operation=createJob"); + from("direct:replace").to("kubernetes-job:foo?operation=replaceJob"); from("direct:delete").to("kubernetes-job:foo?operation=deleteJob"); } }; diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesNamespacesProducerTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesNamespacesProducerTest.java index 247e3c7f8eb..2b99a42a27d 100644 --- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesNamespacesProducerTest.java +++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesNamespacesProducerTest.java @@ -79,7 +79,26 @@ public class KubernetesNamespacesProducerTest extends KubernetesTestSupport { server.expect().post().withPath("/api/v1/namespaces").andReturn(200, ns1).once(); Exchange ex = template.request("direct:createNamespace", exchange -> { - exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test"); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "ns1"); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_LABELS, labels); + }); + + Namespace result = ex.getMessage().getBody(Namespace.class); + + assertEquals("ns1", result.getMetadata().getName()); + assertEquals(labels, result.getMetadata().getLabels()); + } + + @Test + void replaceNamespace() { + Map<String, String> labels = Map.of("my.label.key", "my.label.value"); + Namespace ns1 = new NamespaceBuilder().withNewMetadata().withName("ns1").withLabels(labels).endMetadata().build(); + server.expect().get().withPath("/api/v1/namespaces/ns1") + .andReturn(200, new NamespaceBuilder().withNewMetadata().withName("ns1").endMetadata().build()).once(); + server.expect().put().withPath("/api/v1/namespaces/ns1").andReturn(200, ns1).once(); + + Exchange ex = template.request("direct:replaceNamespace", exchange -> { + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "ns1"); exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_LABELS, labels); }); @@ -111,6 +130,8 @@ public class KubernetesNamespacesProducerTest extends KubernetesTestSupport { from("direct:getNs").to("kubernetes-namespaces:///?kubernetesClient=#kubernetesClient&operation=getNamespace"); from("direct:createNamespace") .to("kubernetes-namespaces:///?kubernetesClient=#kubernetesClient&operation=createNamespace"); + from("direct:replaceNamespace") + .to("kubernetes-namespaces:///?kubernetesClient=#kubernetesClient&operation=replaceNamespace"); from("direct:deleteNamespace") .to("kubernetes-namespaces:///?kubernetesClient=#kubernetesClient&operation=deleteNamespace"); } diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesNodesProducerTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesNodesProducerTest.java index 32de775f6b2..576fd3b1181 100644 --- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesNodesProducerTest.java +++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesNodesProducerTest.java @@ -95,6 +95,28 @@ public class KubernetesNodesProducerTest extends KubernetesTestSupport { assertEquals("test", result.getMetadata().getName()); } + @Test + void replaceNodeTest() { + ObjectMeta meta = new ObjectMeta(); + meta.setName("test"); + server.expect().get().withPath("/api/v1/nodes/test").andReturn(200, new NodeBuilder().build()).once(); + server.expect().put().withPath("/api/v1/nodes/test").andReturn(200, new NodeBuilder().withMetadata(meta).build()) + .once(); + Exchange ex = template.request("direct:replaceNode", exchange -> { + Map<String, String> labels = new HashMap<>(); + labels.put("key1", "value1"); + labels.put("key2", "value2"); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NODES_LABELS, labels); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NODE_NAME, "test"); + NodeSpec spec = new NodeSpecBuilder().build(); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NODE_SPEC, spec); + }); + + Node result = ex.getMessage().getBody(Node.class); + + assertEquals("test", result.getMetadata().getName()); + } + @Test void deleteNode() { Node node1 = new NodeBuilder().withNewMetadata().withName("node1").withNamespace("test").and().build(); @@ -117,6 +139,7 @@ public class KubernetesNodesProducerTest extends KubernetesTestSupport { from("direct:listByLabels") .toF("kubernetes-nodes:///?kubernetesClient=#kubernetesClient&operation=listNodesByLabels"); from("direct:createNode").toF("kubernetes-nodes:///?kubernetesClient=#kubernetesClient&operation=createNode"); + from("direct:replaceNode").toF("kubernetes-nodes:///?kubernetesClient=#kubernetesClient&operation=replaceNode"); from("direct:deleteNode").toF("kubernetes-nodes:///?kubernetesClient=#kubernetesClient&operation=deleteNode"); } }; diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesPersistentVolumesClaimsProducerTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesPersistentVolumesClaimsProducerTest.java index 00ded9191b3..ab2314c5d24 100644 --- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesPersistentVolumesClaimsProducerTest.java +++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesPersistentVolumesClaimsProducerTest.java @@ -106,6 +106,34 @@ public class KubernetesPersistentVolumesClaimsProducerTest extends KubernetesTes assertEquals("SomeVolumeName", result.getSpec().getVolumeName()); } + @Test + void replacePersistentVolumeClaim() { + Map<String, String> labels = Map.of("my.label.key", "my.label.value"); + PersistentVolumeClaimSpec spec = new PersistentVolumeClaimSpecBuilder().withVolumeName("SomeVolumeName").build(); + PersistentVolumeClaim vc1 = new PersistentVolumeClaimBuilder().withNewMetadata().withName("vc1").withNamespace("test") + .withLabels(labels).and() + .withSpec(spec).build(); + server.expect().get().withPath("/api/v1/namespaces/test/persistentvolumeclaims/vc1") + .andReturn(200, new PersistentVolumeClaimBuilder().withNewMetadata().withName("vc1").withNamespace("test") + .endMetadata().build()) + .once(); + server.expect().put().withPath("/api/v1/namespaces/test/persistentvolumeclaims/vc1").andReturn(200, vc1).once(); + + Exchange ex = template.request("direct:replace", exchange -> { + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test"); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_PERSISTENT_VOLUMES_CLAIMS_LABELS, labels); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_PERSISTENT_VOLUME_CLAIM_NAME, "vc1"); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_PERSISTENT_VOLUME_CLAIM_SPEC, spec); + }); + + PersistentVolumeClaim result = ex.getMessage().getBody(PersistentVolumeClaim.class); + + assertEquals("test", result.getMetadata().getNamespace()); + assertEquals("vc1", result.getMetadata().getName()); + assertEquals(labels, result.getMetadata().getLabels()); + assertEquals("SomeVolumeName", result.getSpec().getVolumeName()); + } + @Test void deletePersistentVolumeClaim() { ObjectMeta meta = new ObjectMeta(); @@ -133,6 +161,8 @@ public class KubernetesPersistentVolumesClaimsProducerTest extends KubernetesTes "kubernetes-persistent-volumes-claims:///?kubernetesClient=#kubernetesClient&operation=listPersistentVolumesClaimsByLabels"); from("direct:create").to( "kubernetes-persistent-volumes-claims:///?kubernetesClient=#kubernetesClient&operation=createPersistentVolumeClaim"); + from("direct:replace").to( + "kubernetes-persistent-volumes-claims:///?kubernetesClient=#kubernetesClient&operation=replacePersistentVolumeClaim"); from("direct:delete").to( "kubernetes-persistent-volumes-claims:///?kubernetesClient=#kubernetesClient&operation=deletePersistentVolumeClaim"); } diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesPodsProducerTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesPodsProducerTest.java index 2533aaf7aa6..bfb957f3e8b 100644 --- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesPodsProducerTest.java +++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesPodsProducerTest.java @@ -122,6 +122,32 @@ public class KubernetesPodsProducerTest extends KubernetesTestSupport { assertEquals("SomeHostname", result.getSpec().getHostname()); } + @Test + void replacePod() { + Map<String, String> labels = Map.of("my.label.key", "my.label.value"); + PodSpec spec = new PodSpecBuilder().withHostname("SomeHostname").build(); + Pod pod1 = new PodBuilder().withNewMetadata().withName("pod1").withNamespace("test").withLabels(labels).and() + .withSpec(spec).build(); + server.expect().get().withPath("/api/v1/namespaces/test/pods/pod1") + .andReturn(200, new PodBuilder().withNewMetadata().withName("pod1").withNamespace("test").endMetadata().build()) + .once(); + server.expect().put().withPath("/api/v1/namespaces/test/pods/pod1").andReturn(200, pod1).once(); + + Exchange ex = template.request("direct:replacePod", exchange -> { + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test"); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_PODS_LABELS, labels); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_POD_NAME, "pod1"); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_POD_SPEC, spec); + }); + + Pod result = ex.getMessage().getBody(Pod.class); + + assertEquals("test", result.getMetadata().getNamespace()); + assertEquals("pod1", result.getMetadata().getName()); + assertEquals(labels, result.getMetadata().getLabels()); + assertEquals("SomeHostname", result.getSpec().getHostname()); + } + @Test void deletePod() { Pod pod1 = new PodBuilder().withNewMetadata().withName("pod1").withNamespace("test").and().build(); @@ -147,6 +173,7 @@ public class KubernetesPodsProducerTest extends KubernetesTestSupport { .to("kubernetes-pods:///?kubernetesClient=#kubernetesClient&operation=listPodsByLabels"); from("direct:getPod").to("kubernetes-pods:///?kubernetesClient=#kubernetesClient&operation=getPod"); from("direct:createPod").to("kubernetes-pods:///?kubernetesClient=#kubernetesClient&operation=createPod"); + from("direct:replacePod").to("kubernetes-pods:///?kubernetesClient=#kubernetesClient&operation=replacePod"); from("direct:deletePod").to("kubernetes-pods:///?kubernetesClient=#kubernetesClient&operation=deletePod"); } }; diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesReplicationControllersProducerTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesReplicationControllersProducerTest.java index 0061fcaf449..c3538678b59 100644 --- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesReplicationControllersProducerTest.java +++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesReplicationControllersProducerTest.java @@ -122,6 +122,34 @@ public class KubernetesReplicationControllersProducerTest extends KubernetesTest assertEquals(13, result.getSpec().getReplicas()); } + @Test + void replaceReplicationController() { + Map<String, String> labels = Map.of("my.label.key", "my.label.value"); + ReplicationControllerSpec spec = new ReplicationControllerSpecBuilder().withReplicas(13).build(); + ReplicationController rc1 = new ReplicationControllerBuilder().withNewMetadata().withName("rc1").withNamespace("test") + .withLabels(labels).and() + .withSpec(spec).build(); + server.expect().get().withPath("/api/v1/namespaces/test/replicationcontrollers/rc1") + .andReturn(200, new ReplicationControllerBuilder().withNewMetadata().withName("rc1").withNamespace("test") + .endMetadata().build()) + .once(); + server.expect().put().withPath("/api/v1/namespaces/test/replicationcontrollers/rc1").andReturn(200, rc1).once(); + + Exchange ex = template.request("direct:replaceReplicationController", exchange -> { + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test"); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_REPLICATION_CONTROLLERS_LABELS, labels); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_REPLICATION_CONTROLLER_NAME, "rc1"); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_REPLICATION_CONTROLLER_SPEC, spec); + }); + + ReplicationController result = ex.getMessage().getBody(ReplicationController.class); + + assertEquals("test", result.getMetadata().getNamespace()); + assertEquals("rc1", result.getMetadata().getName()); + assertEquals(labels, result.getMetadata().getLabels()); + assertEquals(13, result.getSpec().getReplicas()); + } + @Test void deleteReplicationController() { server.expect().withPath("/api/v1/namespaces/test/replicationcontrollers/repl1") @@ -184,6 +212,8 @@ public class KubernetesReplicationControllersProducerTest extends KubernetesTest "kubernetes-replication-controllers:///?kubernetesClient=#kubernetesClient&operation=scaleReplicationController"); from("direct:createReplicationController").to( "kubernetes-replication-controllers:///?kubernetesClient=#kubernetesClient&operation=createReplicationController"); + from("direct:replaceReplicationController").to( + "kubernetes-replication-controllers:///?kubernetesClient=#kubernetesClient&operation=replaceReplicationController"); from("direct:deleteReplicationController").to( "kubernetes-replication-controllers:///?kubernetesClient=#kubernetesClient&operation=deleteReplicationController"); } diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesResourcesQuotaProducerTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesResourcesQuotaProducerTest.java index 4a0514169db..9834c295c9f 100644 --- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesResourcesQuotaProducerTest.java +++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesResourcesQuotaProducerTest.java @@ -83,6 +83,33 @@ public class KubernetesResourcesQuotaProducerTest extends KubernetesTestSupport assertEquals(List.of("SomeScope"), result.getSpec().getScopes()); } + @Test + void replaceResourceQuota() { + Map<String, String> labels = Map.of("my.label.key", "my.label.value"); + ResourceQuotaSpec spec = new ResourceQuotaSpecBuilder().withScopes("SomeScope").build(); + ResourceQuota rq1 + = new ResourceQuotaBuilder().withNewMetadata().withName("rq1").withNamespace("test").withLabels(labels).and() + .withSpec(spec).build(); + server.expect().get().withPath("/api/v1/namespaces/test/resourcequotas/rq1").andReturn(200, + new ResourceQuotaBuilder().withNewMetadata().withName("rq1").withNamespace("test").endMetadata().build()) + .once(); + server.expect().put().withPath("/api/v1/namespaces/test/resourcequotas/rq1").andReturn(200, rq1).once(); + + Exchange ex = template.request("direct:replace", exchange -> { + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test"); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_RESOURCES_QUOTA_LABELS, labels); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_RESOURCES_QUOTA_NAME, "rq1"); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_RESOURCE_QUOTA_SPEC, spec); + }); + + ResourceQuota result = ex.getMessage().getBody(ResourceQuota.class); + + assertEquals("test", result.getMetadata().getNamespace()); + assertEquals("rq1", result.getMetadata().getName()); + assertEquals(labels, result.getMetadata().getLabels()); + assertEquals(List.of("SomeScope"), result.getSpec().getScopes()); + } + @Test void deleteResourceQuota() { ResourceQuota rq1 = new ResourceQuotaBuilder().withNewMetadata().withName("rq1").withNamespace("test").and().build(); @@ -107,6 +134,8 @@ public class KubernetesResourcesQuotaProducerTest extends KubernetesTestSupport .to("kubernetes-resources-quota:///?kubernetesClient=#kubernetesClient&operation=listResourcesQuota"); from("direct:create") .to("kubernetes-resources-quota:///?kubernetesClient=#kubernetesClient&operation=createResourceQuota"); + from("direct:replace") + .to("kubernetes-resources-quota:///?kubernetesClient=#kubernetesClient&operation=replaceResourceQuota"); from("direct:delete") .to("kubernetes-resources-quota:///?kubernetesClient=#kubernetesClient&operation=deleteResourceQuota"); } diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesSecretsProducerTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesSecretsProducerTest.java index f83c45cd87d..f2257bfae5c 100644 --- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesSecretsProducerTest.java +++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesSecretsProducerTest.java @@ -107,6 +107,23 @@ public class KubernetesSecretsProducerTest extends KubernetesTestSupport { assertEquals("sc1", result.getMetadata().getName()); } + @Test + void replaceSecret() { + Secret sc1 = new SecretBuilder().withNewMetadata().withName("sc1").withNamespace("test").and().build(); + server.expect().get().withPath("/api/v1/namespaces/test/secrets/sc1").andReturn(200, sc1).once(); + server.expect().put().withPath("/api/v1/namespaces/test/secrets/sc1").andReturn(200, sc1).once(); + + Exchange ex = template.request("direct:replace", exchange -> { + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test"); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_SECRET, sc1); + }); + + Secret result = ex.getMessage().getBody(Secret.class); + + assertEquals("test", result.getMetadata().getNamespace()); + assertEquals("sc1", result.getMetadata().getName()); + } + @Test void deleteSecret() { Secret sc1 = new SecretBuilder().withNewMetadata().withName("sc1").withNamespace("test").and().build(); @@ -132,6 +149,7 @@ public class KubernetesSecretsProducerTest extends KubernetesTestSupport { .to("kubernetes-secrets:///?kubernetesClient=#kubernetesClient&operation=listSecretsByLabels"); from("direct:get").to("kubernetes-secrets:///?kubernetesClient=#kubernetesClient&operation=getSecret"); from("direct:create").to("kubernetes-secrets:///?kubernetesClient=#kubernetesClient&operation=createSecret"); + from("direct:replace").to("kubernetes-secrets:///?kubernetesClient=#kubernetesClient&operation=replaceSecret"); from("direct:delete").to("kubernetes-secrets:///?kubernetesClient=#kubernetesClient&operation=deleteSecret"); } }; diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesServiceAccountsProducerTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesServiceAccountsProducerTest.java index 833a72cfca5..96e3880677a 100644 --- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesServiceAccountsProducerTest.java +++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesServiceAccountsProducerTest.java @@ -93,6 +93,23 @@ public class KubernetesServiceAccountsProducerTest extends KubernetesTestSupport assertEquals("sa1", result.getMetadata().getName()); } + @Test + void replaceServiceAccount() { + ServiceAccount sa1 = new ServiceAccountBuilder().withNewMetadata().withName("sa1").withNamespace("test").and().build(); + server.expect().get().withPath("/api/v1/namespaces/test/serviceaccounts/sa1").andReturn(200, sa1).once(); + server.expect().put().withPath("/api/v1/namespaces/test/serviceaccounts/sa1").andReturn(200, sa1).once(); + + Exchange ex = template.request("direct:replace", exchange -> { + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test"); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_SERVICE_ACCOUNT, sa1); + }); + + ServiceAccount result = ex.getMessage().getBody(ServiceAccount.class); + + assertEquals("test", result.getMetadata().getNamespace()); + assertEquals("sa1", result.getMetadata().getName()); + } + @Test void deleteServiceAccount() { ServiceAccount sa1 = new ServiceAccountBuilder().withNewMetadata().withName("sa1").withNamespace("test").and().build(); @@ -119,6 +136,8 @@ public class KubernetesServiceAccountsProducerTest extends KubernetesTestSupport "kubernetes-service-accounts:///?kubernetesClient=#kubernetesClient&operation=listServiceAccountsByLabels"); from("direct:create").to( "kubernetes-service-accounts:///?kubernetesClient=#kubernetesClient&operation=createServiceAccount"); + from("direct:replace").to( + "kubernetes-service-accounts:///?kubernetesClient=#kubernetesClient&operation=replaceServiceAccount"); from("direct:delete").to( "kubernetes-service-accounts:///?kubernetesClient=#kubernetesClient&operation=deleteServiceAccount"); } diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesServicesProducerTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesServicesProducerTest.java index 9c981ccb341..e6753286747 100644 --- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesServicesProducerTest.java +++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesServicesProducerTest.java @@ -115,6 +115,33 @@ public class KubernetesServicesProducerTest extends KubernetesTestSupport { assertEquals("SomeClusterIp", result.getSpec().getClusterIP()); } + @Test + void replaceService() { + Map<String, String> labels = Map.of("my.label.key", "my.label.value"); + ServiceSpec spec = new ServiceSpecBuilder().withExternalName("SomeExternalName").build(); + Service se1 = new ServiceBuilder().withNewMetadata().withName("se1").withNamespace("test").withLabels(labels).and() + .withSpec(spec).build(); + server.expect().get().withPath("/api/v1/namespaces/test/services/se1") + .andReturn(200, new ServiceBuilder().withNewMetadata().withName("se1").withNamespace("test").and() + .withSpec(new ServiceSpecBuilder().withClusterIP("SomeClusterIp").build()).build()) + .times(2); + server.expect().put().withPath("/api/v1/namespaces/test/services/se1").andReturn(200, se1).once(); + + Exchange ex = template.request("direct:replaceService", exchange -> { + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test"); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_SERVICE_LABELS, labels); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_SERVICE_NAME, "se1"); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_SERVICE_SPEC, spec); + }); + + Service result = ex.getMessage().getBody(Service.class); + + assertEquals("test", result.getMetadata().getNamespace()); + assertEquals("se1", result.getMetadata().getName()); + assertEquals(labels, result.getMetadata().getLabels()); + assertEquals("SomeExternalName", result.getSpec().getExternalName()); + } + @Test void deleteService() { Service se1 = new ServiceBuilder().withNewMetadata().withName("se1").withNamespace("test").and().build(); @@ -143,6 +170,8 @@ public class KubernetesServicesProducerTest extends KubernetesTestSupport { .to("kubernetes-services:///?kubernetesClient=#kubernetesClient&operation=getService"); from("direct:createService") .to("kubernetes-services:///?kubernetesClient=#kubernetesClient&operation=createService"); + from("direct:replaceService") + .to("kubernetes-services:///?kubernetesClient=#kubernetesClient&operation=replaceService"); from("direct:deleteService") .to("kubernetes-services:///?kubernetesClient=#kubernetesClient&operation=deleteService"); } diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/openshift/producer/OpenshiftDeploymentConfigsProducerTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/openshift/producer/OpenshiftDeploymentConfigsProducerTest.java index 1c39736a182..dc0ac67024b 100644 --- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/openshift/producer/OpenshiftDeploymentConfigsProducerTest.java +++ b/components/camel-kubernetes/src/test/java/org/apache/camel/component/openshift/producer/OpenshiftDeploymentConfigsProducerTest.java @@ -83,9 +83,10 @@ public class OpenshiftDeploymentConfigsProducerTest extends KubernetesTestSuppor Map<String, String> labels = Map.of("my.label.key", "my.label.value"); DeploymentConfigSpec spec = new DeploymentConfigSpecBuilder().withReplicas(13).build(); DeploymentConfig de1 - = new DeploymentConfigBuilder().withNewMetadata().withName("de1").withNamespace("test").withLabels(labels).and() - .withSpec(spec).build(); - server.expect().post().withPath("/apis/apps.openshift.io/v1/namespaces/test/deploymentconfigs").andReturn(200, de1).once(); + = new DeploymentConfigBuilder().withNewMetadata().withName("de1").withNamespace("test").withLabels(labels).and() + .withSpec(spec).build(); + server.expect().post().withPath("/apis/apps.openshift.io/v1/namespaces/test/deploymentconfigs").andReturn(200, de1) + .once(); Exchange ex = template.request("direct:create", exchange -> { exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test"); @@ -102,6 +103,34 @@ public class OpenshiftDeploymentConfigsProducerTest extends KubernetesTestSuppor assertEquals(13, result.getSpec().getReplicas()); } + @Test + void replaceDeploymentConfig() { + Map<String, String> labels = Map.of("my.label.key", "my.label.value"); + DeploymentConfigSpec spec = new DeploymentConfigSpecBuilder().withReplicas(13).build(); + DeploymentConfig de1 + = new DeploymentConfigBuilder().withNewMetadata().withName("de1").withNamespace("test").withLabels(labels).and() + .withSpec(spec).build(); + server.expect().get().withPath("/apis/apps.openshift.io/v1/namespaces/test/deploymentconfigs/de1").andReturn(200, + new DeploymentConfigBuilder().withNewMetadata().withName("de1").withNamespace("test").endMetadata().build()) + .once(); + server.expect().put().withPath("/apis/apps.openshift.io/v1/namespaces/test/deploymentconfigs/de1").andReturn(200, de1) + .once(); + + Exchange ex = template.request("direct:replace", exchange -> { + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test"); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_DEPLOYMENTS_LABELS, labels); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_DEPLOYMENT_NAME, "de1"); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_DEPLOYMENT_CONFIG_SPEC, spec); + }); + + DeploymentConfig result = ex.getMessage().getBody(DeploymentConfig.class); + + assertEquals("test", result.getMetadata().getNamespace()); + assertEquals("de1", result.getMetadata().getName()); + assertEquals(labels, result.getMetadata().getLabels()); + assertEquals(13, result.getSpec().getReplicas()); + } + @Test void deleteDeploymentConfig() { DeploymentConfig de1 = new DeploymentConfigBuilder().withNewMetadata().withNamespace("test").withName("dc1") @@ -162,6 +191,8 @@ public class OpenshiftDeploymentConfigsProducerTest extends KubernetesTestSuppor .toF("openshift-deploymentconfigs:///?kubernetesClient=#kubernetesClient&operation=listDeploymentConfigsByLabels"); from("direct:create") .toF("openshift-deploymentconfigs:///?kubernetesClient=#kubernetesClient&operation=createDeploymentConfig"); + from("direct:replace") + .toF("openshift-deploymentconfigs:///?kubernetesClient=#kubernetesClient&operation=replaceDeploymentConfig"); from("direct:delete") .toF("openshift-deploymentconfigs:///?kubernetesClient=#kubernetesClient&operation=deleteDeploymentConfig"); from("direct:scale")
