This is an automated email from the ASF dual-hosted git repository. acosentino pushed a commit to branch camel-2.x in repository https://gitbox.apache.org/repos/asf/camel.git
commit f27b23cc0e004ab8a28a2f01da04d547b7665fbb Author: Andrea Cosentino <anco...@gmail.com> AuthorDate: Tue Sep 17 09:48:23 2019 +0200 CAMEL-13983 - Provide CreateNode feature in Kubernetes Component --- .../component/kubernetes/KubernetesConstants.java | 1 + .../component/kubernetes/KubernetesOperations.java | 3 +- .../kubernetes/nodes/KubernetesNodesProducer.java | 30 ++++++++++++++++++ .../producer/KubernetesNodesProducerTest.java | 37 +++++++++++++++++++--- 4 files changed, 66 insertions(+), 5 deletions(-) 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 3f5b3d9..a15a3d8 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 @@ -47,6 +47,7 @@ public interface KubernetesConstants { String KUBERNETES_SERVICE_ACCOUNT = "CamelKubernetesServiceAccount"; String KUBERNETES_NODES_LABELS = "CamelKubernetesNodesLabels"; String KUBERNETES_NODE_NAME = "CamelKubernetesNodeName"; + String KUBERNETES_NODE_SPEC = "CamelKubernetesNodeSpec"; String KUBERNETES_DEPLOYMENTS_LABELS = "CamelKubernetesDeploymentsLabels"; String KUBERNETES_DEPLOYMENT_NAME = "CamelKubernetesDeploymentName"; String KUBERNETES_DEPLOYMENT_SPEC = "CamelKubernetesDeploymentSpec"; 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 936d6a7..60f4745 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 @@ -84,7 +84,8 @@ public interface KubernetesOperations { String LIST_NODES = "listNodes"; String LIST_NODES_BY_LABELS_OPERATION = "listNodesByLabels"; String GET_NODE_OPERATION = "getNode"; - + String CREATE_NODE_OPERATION = "createNode"; + // HPA String LIST_HPA = "listHPA"; String LIST_HPA_BY_LABELS_OPERATION = "listHPAByLabels"; 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 058ae66..0e10b0c 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 @@ -19,8 +19,13 @@ package org.apache.camel.component.kubernetes.nodes; import java.util.Map; import io.fabric8.kubernetes.api.model.DoneableNode; +import io.fabric8.kubernetes.api.model.HorizontalPodAutoscaler; +import io.fabric8.kubernetes.api.model.HorizontalPodAutoscalerBuilder; +import io.fabric8.kubernetes.api.model.HorizontalPodAutoscalerSpec; 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.client.dsl.NonNamespaceOperation; import io.fabric8.kubernetes.client.dsl.Resource; @@ -70,6 +75,10 @@ public class KubernetesNodesProducer extends DefaultProducer { case KubernetesOperations.GET_NODE_OPERATION: doGetNode(exchange, operation); break; + + case KubernetesOperations.CREATE_NODE_OPERATION: + doCreateNode(exchange, operation); + break; default: throw new IllegalArgumentException("Unsupported operation " + operation); @@ -108,4 +117,25 @@ public class KubernetesNodesProducer extends DefaultProducer { MessageHelper.copyHeaders(exchange.getIn(), exchange.getOut(), true); exchange.getOut().setBody(node); } + + protected void doCreateNode(Exchange exchange, String operation) throws Exception { + Node node = null; + 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"); + } + 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"); + } + 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 = getEndpoint().getKubernetesClient().nodes().create(nodeCreating); + System.err.println(node.toString()); + + MessageHelper.copyHeaders(exchange.getIn(), exchange.getOut(), true); + exchange.getOut().setBody(node); + } } 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 c725738..a5acf1a 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 @@ -21,7 +21,12 @@ import java.util.List; import java.util.Map; import io.fabric8.kubernetes.api.model.Node; +import io.fabric8.kubernetes.api.model.NodeBuilder; import io.fabric8.kubernetes.api.model.NodeListBuilder; +import io.fabric8.kubernetes.api.model.NodeSpec; +import io.fabric8.kubernetes.api.model.NodeSpecBuilder; +import io.fabric8.kubernetes.api.model.ObjectMeta; +import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.server.mock.KubernetesServer; import org.apache.camel.Exchange; @@ -76,16 +81,40 @@ public class KubernetesNodesProducerTest extends KubernetesTestSupport { assertEquals(3, result.size()); } + + @Test + public void createNodeTest() throws Exception { + ObjectMeta meta = new ObjectMeta(); + meta.setName("test"); + server.expect().withPath("/api/v1/nodes") + .andReturn(200, new NodeBuilder().withMetadata(meta).build()).once(); + Exchange ex = template.request("direct:createNode", new Processor() { + + @Override + public void process(Exchange exchange) throws Exception { + 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.getOut().getBody(Node.class); + + assertEquals("test", result.getMetadata().getName()); + } @Override protected RouteBuilder createRouteBuilder() throws Exception { return new RouteBuilder() { @Override public void configure() throws Exception { - from("direct:list") - .toF("kubernetes-nodes:///?kubernetesClient=#kubernetesClient&operation=listNodes"); - from("direct:listByLabels") - .toF("kubernetes-nodes:///?kubernetesClient=#kubernetesClient&operation=listNodesByLabels"); + from("direct:list").toF("kubernetes-nodes:///?kubernetesClient=#kubernetesClient&operation=listNodes"); + from("direct:listByLabels").toF("kubernetes-nodes:///?kubernetesClient=#kubernetesClient&operation=listNodesByLabels"); + from("direct:createNode").toF("kubernetes-nodes:///?kubernetesClient=#kubernetesClient&operation=createNode"); } }; }