[CAMEL-9946] Camel-Kubernetes: Add support for ConfigMap

Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/913c8fa6
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/913c8fa6
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/913c8fa6

Branch: refs/heads/master
Commit: 913c8fa6e78b11c90b39a15cb6981e6d7dc60c12
Parents: 330eff3
Author: Andrea Cosentino <anco...@gmail.com>
Authored: Thu May 5 10:09:01 2016 +0200
Committer: Andrea Cosentino <anco...@gmail.com>
Committed: Thu May 5 10:18:01 2016 +0200

----------------------------------------------------------------------
 .../kubernetes/KubernetesCategory.java          |   2 +
 .../kubernetes/KubernetesConstants.java         |   3 +
 .../kubernetes/KubernetesEndpoint.java          |   4 +
 .../producer/KubernetesConfigMapsProducer.java  | 167 ++++++++++++++++
 .../producer/KubernetesOperations.java          |   7 +
 .../KubernetesConfigMapsProducerTest.java       | 197 +++++++++++++++++++
 6 files changed, 380 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/913c8fa6/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesCategory.java
----------------------------------------------------------------------
diff --git 
a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesCategory.java
 
b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesCategory.java
index faf4a89..23610ee 100644
--- 
a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesCategory.java
+++ 
b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesCategory.java
@@ -38,6 +38,8 @@ public interface KubernetesCategory {
     
     String NODES = "nodes";
     
+    String CONFIGMAPS = "configMaps";
+    
     String BUILDS = "builds";
     
     String BUILD_CONFIGS = "buildConfigs";

http://git-wip-us.apache.org/repos/asf/camel/blob/913c8fa6/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesConstants.java
----------------------------------------------------------------------
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 6613f19..3d78497 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
@@ -46,6 +46,9 @@ public interface KubernetesConstants {
     String KUBERNETES_SERVICE_ACCOUNT = "CamelKubernetesServiceAccount";
     String KUBERNETES_NODES_LABELS = "CamelKubernetesNodesLabels";
     String KUBERNETES_NODE_NAME = "CamelKubernetesNodeName";
+    String KUBERNETES_CONFIGMAPS_LABELS = "CamelKubernetesConfigMapsLabels";
+    String KUBERNETES_CONFIGMAP_NAME = "CamelKubernetesConfigMapName";
+    String KUBERNETES_CONFIGMAP_DATA = "CamelKubernetesConfigData";
     String KUBERNETES_BUILDS_LABELS = "CamelKubernetesBuildsLabels";
     String KUBERNETES_BUILD_NAME = "CamelKubernetesBuildName";
     String KUBERNETES_BUILD_CONFIGS_LABELS = 
"CamelKubernetesBuildConfigsLabels";

http://git-wip-us.apache.org/repos/asf/camel/blob/913c8fa6/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesEndpoint.java
----------------------------------------------------------------------
diff --git 
a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesEndpoint.java
 
b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesEndpoint.java
index 86dd081..c0312a3 100644
--- 
a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesEndpoint.java
+++ 
b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesEndpoint.java
@@ -32,6 +32,7 @@ import 
org.apache.camel.component.kubernetes.consumer.KubernetesSecretsConsumer;
 import 
org.apache.camel.component.kubernetes.consumer.KubernetesServicesConsumer;
 import 
org.apache.camel.component.kubernetes.producer.KubernetesBuildConfigsProducer;
 import org.apache.camel.component.kubernetes.producer.KubernetesBuildsProducer;
+import 
org.apache.camel.component.kubernetes.producer.KubernetesConfigMapsProducer;
 import 
org.apache.camel.component.kubernetes.producer.KubernetesNamespacesProducer;
 import org.apache.camel.component.kubernetes.producer.KubernetesNodesProducer;
 import 
org.apache.camel.component.kubernetes.producer.KubernetesPersistentVolumesClaimsProducer;
@@ -105,6 +106,9 @@ public class KubernetesEndpoint extends DefaultEndpoint {
 
             case KubernetesCategory.NODES:
                 return new KubernetesNodesProducer(this);
+                
+            case KubernetesCategory.CONFIGMAPS:
+                return new KubernetesConfigMapsProducer(this);
 
             case KubernetesCategory.BUILDS:
                 return new KubernetesBuildsProducer(this);

http://git-wip-us.apache.org/repos/asf/camel/blob/913c8fa6/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/producer/KubernetesConfigMapsProducer.java
----------------------------------------------------------------------
diff --git 
a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/producer/KubernetesConfigMapsProducer.java
 
b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/producer/KubernetesConfigMapsProducer.java
new file mode 100644
index 0000000..b0b389c
--- /dev/null
+++ 
b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/producer/KubernetesConfigMapsProducer.java
@@ -0,0 +1,167 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.kubernetes.producer;
+
+import java.util.HashMap;
+import java.util.Map;
+
+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.DoneableConfigMap;
+import io.fabric8.kubernetes.api.model.EditableConfigMap;
+import io.fabric8.kubernetes.client.dsl.ClientNonNamespaceOperation;
+import io.fabric8.kubernetes.client.dsl.ClientResource;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.component.kubernetes.KubernetesConstants;
+import org.apache.camel.component.kubernetes.KubernetesEndpoint;
+import org.apache.camel.impl.DefaultProducer;
+import org.apache.camel.util.ObjectHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class KubernetesConfigMapsProducer extends DefaultProducer {
+
+    private static final Logger LOG = 
LoggerFactory.getLogger(KubernetesConfigMapsProducer.class);
+
+    public KubernetesConfigMapsProducer(KubernetesEndpoint endpoint) {
+        super(endpoint);
+    }
+
+    @Override
+    public KubernetesEndpoint getEndpoint() {
+        return (KubernetesEndpoint) super.getEndpoint();
+    }
+
+    @Override
+    public void process(Exchange exchange) throws Exception {
+        String operation;
+
+        if 
(ObjectHelper.isEmpty(getEndpoint().getKubernetesConfiguration().getOperation()))
 {
+            operation = 
exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_OPERATION, 
String.class);
+        } else {
+            operation = 
getEndpoint().getKubernetesConfiguration().getOperation();
+        }
+
+        switch (operation) {
+
+        case KubernetesOperations.LIST_CONFIGMAPS:
+            doList(exchange, operation);
+            break;
+
+        case KubernetesOperations.LIST_CONFIGMAPS_BY_LABELS_OPERATION:
+            doListConfigMapsByLabels(exchange, operation);
+            break;
+
+        case KubernetesOperations.GET_CONFIGMAP_OPERATION:
+            doGetConfigMap(exchange, operation);
+            break;
+            
+        case KubernetesOperations.CREATE_CONFIGMAP_OPERATION:
+            doCreateConfigMap(exchange, operation);
+            break;
+            
+        case KubernetesOperations.DELETE_CONFIGMAP_OPERATION:
+            doDeleteConfigMap(exchange, operation);
+            break;
+
+        default:
+            throw new IllegalArgumentException("Unsupported operation " + 
operation);
+        }
+    }
+
+    protected void doList(Exchange exchange, String operation) throws 
Exception {
+        ConfigMapList configMapsList = 
getEndpoint().getKubernetesClient().configMaps().list();
+        exchange.getOut().setBody(configMapsList.getItems());
+    }
+
+    protected void doListConfigMapsByLabels(Exchange exchange, String 
operation) throws Exception {
+        ConfigMapList configMapsList = null;
+        Map<String, String> labels = 
exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_CONFIGMAPS_LABELS, 
Map.class);
+        ClientNonNamespaceOperation<ConfigMap, ConfigMapList, 
DoneableConfigMap, ClientResource<ConfigMap, DoneableConfigMap>> configMaps = 
getEndpoint().getKubernetesClient().configMaps();
+        for (Map.Entry<String, String> entry : labels.entrySet()) {
+            configMaps.withLabel(entry.getKey(), entry.getValue());
+        }
+        configMapsList = configMaps.list();
+        exchange.getOut().setBody(configMapsList.getItems());
+    }
+
+    protected void doGetConfigMap(Exchange exchange, String operation) throws 
Exception {
+        ConfigMap configMap = null;
+        String cfMapName = 
exchange.getIn().getHeader(KubernetesConstants.KUBERNETES_CONFIGMAP_NAME, 
String.class);
+        if (ObjectHelper.isEmpty(cfMapName)) {
+            LOG.error("Get a specific ConfigMap require specify a ConfigMap 
name");
+            throw new IllegalArgumentException("Get a specific ConfigMap 
require specify a ConfigMap name");
+        }
+        configMap = 
getEndpoint().getKubernetesClient().configMaps().withName(cfMapName).get();
+
+        exchange.getOut().setBody(configMap);
+    }
+    
+    protected void doCreateConfigMap(Exchange exchange, String operation) 
throws Exception {
+        ConfigMap configMap = null;
+        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");
+        }
+        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");
+        }
+        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");
+        }
+        Map<String, String> labels = exchange.getIn().getHeader(
+                KubernetesConstants.KUBERNETES_CONFIGMAPS_LABELS, Map.class);
+        EditableConfigMap cfMapCreating = new 
ConfigMapBuilder().withNewMetadata().withName(cfMapName)
+                
.withLabels(labels).endMetadata().withData(configMapData).build();
+        configMap = getEndpoint().getKubernetesClient().configMaps()
+                .inNamespace(namespaceName).create(cfMapCreating);
+        exchange.getOut().setBody(configMap);
+    }
+    
+    protected void doDeleteConfigMap(Exchange exchange, String operation) 
throws Exception {
+        String configMapName = exchange.getIn().getHeader(
+                KubernetesConstants.KUBERNETES_CONFIGMAP_NAME, String.class);
+        String namespaceName = exchange.getIn().getHeader(
+                KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
+        if (ObjectHelper.isEmpty(configMapName)) {
+            LOG.error("Delete a specific config map require specify a config 
map name");
+            throw new IllegalArgumentException(
+                    "Delete a specific config map require specify a config map 
name");
+        }
+        if (ObjectHelper.isEmpty(namespaceName)) {
+            LOG.error("Delete a specific config map require specify a 
namespace name");
+            throw new IllegalArgumentException(
+                    "Delete a specific config map require specify a namespace 
name");
+        }
+        boolean cfMapDeleted = getEndpoint().getKubernetesClient().configMaps()
+                .inNamespace(namespaceName).withName(configMapName).delete();
+        exchange.getOut().setBody(cfMapDeleted);
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/913c8fa6/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/producer/KubernetesOperations.java
----------------------------------------------------------------------
diff --git 
a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/producer/KubernetesOperations.java
 
b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/producer/KubernetesOperations.java
index c926cbf..e6dec94 100644
--- 
a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/producer/KubernetesOperations.java
+++ 
b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/producer/KubernetesOperations.java
@@ -84,6 +84,13 @@ public interface KubernetesOperations {
     String LIST_NODES_BY_LABELS_OPERATION = "listNodesByLabels";
     String GET_NODE_OPERATION = "getNode";
     
+    // Config Maps
+    String LIST_CONFIGMAPS = "listConfigMaps";
+    String LIST_CONFIGMAPS_BY_LABELS_OPERATION = "listConfigMapsByLabels";
+    String GET_CONFIGMAP_OPERATION = "getConfigMap";
+    String CREATE_CONFIGMAP_OPERATION = "createConfigMap";
+    String DELETE_CONFIGMAP_OPERATION = "deleteConfigMap";
+    
     // Builds
     String LIST_BUILD = "listBuilds";
     String LIST_BUILD_BY_LABELS_OPERATION = "listBuildsByLabels";

http://git-wip-us.apache.org/repos/asf/camel/blob/913c8fa6/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesConfigMapsProducerTest.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..d4a997c
--- /dev/null
+++ 
b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/producer/KubernetesConfigMapsProducerTest.java
@@ -0,0 +1,197 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.kubernetes.producer;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import io.fabric8.kubernetes.api.model.ConfigMap;
+import io.fabric8.kubernetes.api.model.Container;
+import io.fabric8.kubernetes.api.model.ContainerPort;
+import io.fabric8.kubernetes.api.model.Pod;
+import io.fabric8.kubernetes.api.model.PodSpec;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.kubernetes.KubernetesConstants;
+import org.apache.camel.component.kubernetes.KubernetesTestSupport;
+import org.apache.camel.util.ObjectHelper;
+import org.junit.Test;
+
+public class KubernetesConfigMapsProducerTest extends KubernetesTestSupport {
+
+    @Test
+    public void listTest() throws Exception {
+        if (ObjectHelper.isEmpty(authToken)) {
+            return;
+        }
+        List<ConfigMap> result = template.requestBody("direct:list", "", 
List.class);
+
+        assertEquals(0, result.size());
+    }
+
+    @Test
+    public void listByLabelsTest() throws Exception {
+        if (ObjectHelper.isEmpty(authToken)) {
+            return;
+        }
+        Exchange ex = template.request("direct:listConfigMapsByLabels", new 
Processor() {
+
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(
+                        KubernetesConstants.KUBERNETES_NAMESPACE_NAME,
+                        "default");
+                Map<String, String> labels = new HashMap<String, String>();
+                labels.put("component", "elasticsearch");
+                exchange.getIn().setHeader(
+                        KubernetesConstants.KUBERNETES_CONFIGMAPS_LABELS, 
labels);
+            }
+        });
+
+        List<ConfigMap> result = ex.getOut().getBody(List.class);
+
+        boolean configMapExists = false;
+        Iterator<ConfigMap> it = result.iterator();
+        while (it.hasNext()) {
+               ConfigMap cfMap = it.next();
+            if 
(cfMap.getMetadata().getLabels().containsValue("elasticsearch")) {
+               configMapExists = true;
+            }
+        }
+
+        assertFalse(configMapExists);
+    }
+
+    @Test
+    public void getConfigMapTest() throws Exception {
+        if (ObjectHelper.isEmpty(authToken)) {
+            return;
+        }
+        Exchange ex = template.request("direct:getConfigMap", new Processor() {
+
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(
+                        KubernetesConstants.KUBERNETES_NAMESPACE_NAME,
+                        "default");
+                exchange.getIn().setHeader(
+                        KubernetesConstants.KUBERNETES_CONFIGMAP_NAME,
+                        "elasticsearch-7015o");
+            }
+        });
+
+        ConfigMap result = ex.getOut().getBody(ConfigMap.class);
+
+        assertNull(result);
+    }
+
+    @Test
+    public void createGetAndDeleteConfigMap() throws Exception {
+        if (ObjectHelper.isEmpty(authToken)) {
+            return;
+        }
+        Exchange ex = template.request("direct:createConfigMap", new 
Processor() {
+
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(
+                        KubernetesConstants.KUBERNETES_NAMESPACE_NAME,
+                        "default");
+                exchange.getIn().setHeader(
+                        KubernetesConstants.KUBERNETES_CONFIGMAP_NAME, "test");
+                Map<String, String> labels = new HashMap<String, String>();
+                labels.put("this", "rocks");
+                exchange.getIn().setHeader(
+                        KubernetesConstants.KUBERNETES_CONFIGMAPS_LABELS, 
labels);
+
+                Map<String, String> data = new HashMap<String, String>();
+                
+                data.put("test", "test1");
+                data.put("test1", "test2");
+
+                exchange.getIn().setHeader(
+                        KubernetesConstants.KUBERNETES_CONFIGMAP_DATA, data);
+            }
+        });
+        
+        ex = template.request("direct:getConfigMap", new Processor() {
+
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(
+                        KubernetesConstants.KUBERNETES_NAMESPACE_NAME,
+                        "default");
+                exchange.getIn().setHeader(
+                        KubernetesConstants.KUBERNETES_CONFIGMAP_NAME,
+                        "test");
+            }
+        });
+
+        ConfigMap result = ex.getOut().getBody(ConfigMap.class);
+        
+        assertNotNull(result);
+        assertTrue(result.getData().containsKey("test"));
+        assertTrue(result.getData().containsKey("test1"));
+        assertEquals("test1",result.getData().get("test"));
+        assertEquals("test2",result.getData().get("test1"));
+
+        ex = template.request("direct:deleteConfigMap", new Processor() {
+
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(
+                        KubernetesConstants.KUBERNETES_NAMESPACE_NAME,
+                        "default");
+                exchange.getIn().setHeader(
+                        KubernetesConstants.KUBERNETES_CONFIGMAP_NAME, "test");
+            }
+        });
+
+        boolean configMapDeleted = ex.getOut().getBody(Boolean.class);
+
+        assertTrue(configMapDeleted);
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:list")
+                        
.toF("kubernetes://%s?oauthToken=%s&category=configMaps&operation=listConfigMaps",
+                                host, authToken);
+                from("direct:listConfigMapsByLabels")
+                        
.toF("kubernetes://%s?oauthToken=%s&category=configMaps&operation=listConfigMapsByLabels",
+                                host, authToken);
+                from("direct:getConfigMap")
+                        
.toF("kubernetes://%s?oauthToken=%s&category=configMaps&operation=getConfigMap",
+                                host, authToken);
+                from("direct:createConfigMap")
+                        
.toF("kubernetes://%s?oauthToken=%s&category=configMaps&operation=createConfigMap",
+                                host, authToken);
+                from("direct:deleteConfigMap")
+                        
.toF("kubernetes://%s?oauthToken=%s&category=configMaps&operation=deleteConfigMap",
+                                host, authToken);
+            }
+        };
+    }
+}

Reply via email to