[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); + } + }; + } +}