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");
             }
         };
     }

Reply via email to