This is an automated email from the ASF dual-hosted git repository. acosentino pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
commit 7a020b8da981d91a42cfc9567c319a5edc22950b Author: Andrea Cosentino <anco...@gmail.com> AuthorDate: Thu Mar 15 10:59:39 2018 +0100 CAMEL-12354 - Camel-Kubernetes: Add scale operation to deployment component --- .../component/kubernetes/KubernetesConstants.java | 1 + .../component/kubernetes/KubernetesOperations.java | 1 + .../deployments/KubernetesDeploymentsProducer.java | 27 ++++++++++++++++++++++ .../KubernetesDeploymentsProducerTest.java | 26 +++++++++++++++++++++ 4 files changed, 55 insertions(+) diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesConstants.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesConstants.java index 4814076..eecc409 100644 --- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesConstants.java +++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesConstants.java @@ -57,6 +57,7 @@ public interface KubernetesConstants { String KUBERNETES_BUILD_NAME = "CamelKubernetesBuildName"; String KUBERNETES_BUILD_CONFIGS_LABELS = "CamelKubernetesBuildConfigsLabels"; String KUBERNETES_BUILD_CONFIG_NAME = "CamelKubernetesBuildConfigName"; + String KUBERNETES_DEPLOYMENT_REPLICAS = "CamelKubernetesDeploymentReplicas"; // Consumer String KUBERNETES_EVENT_ACTION = "CamelKubernetesEventAction"; 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 6ea4ed6..4eb8dc5 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 @@ -91,6 +91,7 @@ public interface KubernetesOperations { String GET_DEPLOYMENT = "getDeployment"; String DELETE_DEPLOYMENT = "deleteDeployment"; String CREATE_DEPLOYMENT = "createDeployment"; + String SCALE_DEPLOYMENT = "scaleDeployment"; // Config Maps String LIST_CONFIGMAPS = "listConfigMaps"; 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 29015c5..339810b 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.Map; +import io.fabric8.kubernetes.api.model.ReplicationController; import io.fabric8.kubernetes.api.model.extensions.Deployment; import io.fabric8.kubernetes.api.model.extensions.DeploymentBuilder; import io.fabric8.kubernetes.api.model.extensions.DeploymentList; @@ -80,6 +81,10 @@ public class KubernetesDeploymentsProducer extends DefaultProducer { case KubernetesOperations.CREATE_DEPLOYMENT: doCreateDeployment(exchange, operation); break; + + case KubernetesOperations.SCALE_DEPLOYMENT: + doScaleDeployment(exchange, operation); + break; default: throw new IllegalArgumentException("Unsupported operation " + operation); @@ -162,4 +167,26 @@ public class KubernetesDeploymentsProducer extends DefaultProducer { MessageHelper.copyHeaders(exchange.getIn(), exchange.getOut(), true); exchange.getOut().setBody(deployment); } + + protected void doScaleDeployment(Exchange exchange, String operation) throws Exception { + String deploymentName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_DEPLOYMENT_NAME, String.class); + String namespaceName = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class); + Integer replicasNumber = exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_DEPLOYMENT_REPLICAS, Integer.class); + if (ObjectHelper.isEmpty(deploymentName)) { + LOG.error("Scale a specific deployment require specify a deployment name"); + throw new IllegalArgumentException("Scale a specific deployment require specify a deployment name"); + } + if (ObjectHelper.isEmpty(namespaceName)) { + LOG.error("Scale a specific deployment require specify a namespace name"); + throw new IllegalArgumentException("Scale a specific deployment require specify a namespace name"); + } + if (ObjectHelper.isEmpty(replicasNumber)) { + LOG.error("Scale a specific deployment require specify a replicas number"); + throw new IllegalArgumentException("Scale a specific deployment require specify a replicas number"); + } + Deployment deploymentScaled = getEndpoint().getKubernetesClient().extensions().deployments().inNamespace(namespaceName).withName(deploymentName).scale(replicasNumber, false); + + MessageHelper.copyHeaders(exchange.getIn(), exchange.getOut(), true); + exchange.getOut().setBody(deploymentScaled.getStatus().getReplicas()); + } } 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 3b71c13..f1c0b03 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 @@ -22,6 +22,7 @@ import java.util.Map; import io.fabric8.kubernetes.api.model.Namespace; import io.fabric8.kubernetes.api.model.NamespaceBuilder; +import io.fabric8.kubernetes.api.model.ReplicationControllerBuilder; import io.fabric8.kubernetes.api.model.Secret; import io.fabric8.kubernetes.api.model.SecretBuilder; import io.fabric8.kubernetes.api.model.extensions.Deployment; @@ -120,6 +121,29 @@ public class KubernetesDeploymentsProducerTest extends KubernetesTestSupport { assertTrue(deDeleted); } + + @Test + public void createScaleAndDeleteDeployment() throws Exception { + server.expect().withPath("/apis/extensions/v1beta1/namespaces/test/deployments/de1").andReturn(200, new DeploymentBuilder().withNewMetadata().withName("de1") + .withResourceVersion("1").endMetadata().withNewSpec().withReplicas(5).endSpec().withNewStatus().withReplicas(1).endStatus().build()).once(); + + server.expect().withPath("/apis/extensions/v1beta1/namespaces/test/deployments/de1").andReturn(200, new DeploymentBuilder().withNewMetadata().withName("de1") + .withResourceVersion("1").endMetadata().withNewSpec().withReplicas(5).endSpec().withNewStatus().withReplicas(5).endStatus().build()).always(); + Exchange ex = template.request("direct:scaleDeployment", new Processor() { + + @Override + public void process(Exchange exchange) throws Exception { + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_NAMESPACE_NAME, "test"); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_DEPLOYMENT_NAME, "de1"); + exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_DEPLOYMENT_REPLICAS, 1); + } + }); + + //Thread.sleep(3000); + int replicas = ex.getOut().getBody(Integer.class); + + assertEquals(5, replicas); + } @Override protected RouteBuilder createRouteBuilder() throws Exception { @@ -134,6 +158,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:scaleDeployment") + .toF("kubernetes-deployments:///?kubernetesClient=#kubernetesClient&operation=scaleDeployment"); } }; } -- To stop receiving notification emails like this one, please contact acosent...@apache.org.