You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ac...@apache.org on 2015/10/18 10:18:58 UTC
[6/7] camel git commit: CAMEL-9085 Create a
Camel-Kubernetes/Openshift v3 Component
CAMEL-9085 Create a Camel-Kubernetes/Openshift v3 Component
Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/a452d0ac
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/a452d0ac
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/a452d0ac
Branch: refs/heads/master
Commit: a452d0ac25c34a4cdf06b1cf3491a807c9072c71
Parents: be3cc2f
Author: Andrea Cosentino <an...@gmail.com>
Authored: Mon Sep 14 17:38:54 2015 +0200
Committer: Andrea Cosentino <an...@gmail.com>
Committed: Sun Oct 18 09:33:00 2015 +0200
----------------------------------------------------------------------
components/camel-kubernetes/pom.xml | 81 +++++
.../kubernetes/KubernetesCategory.java | 44 +++
.../kubernetes/KubernetesComponent.java | 41 +++
.../kubernetes/KubernetesConfiguration.java | 303 +++++++++++++++++++
.../kubernetes/KubernetesConstants.java | 57 ++++
.../kubernetes/KubernetesEndpoint.java | 212 +++++++++++++
.../consumer/KubernetesPodsConsumer.java | 132 ++++++++
...ubernetesReplicationControllersConsumer.java | 129 ++++++++
.../consumer/KubernetesSecretsConsumer.java | 125 ++++++++
.../consumer/KubernetesServicesConsumer.java | 127 ++++++++
.../kubernetes/consumer/common/PodEvent.java | 32 ++
.../common/ReplicationControllerEvent.java | 33 ++
.../kubernetes/consumer/common/SecretEvent.java | 32 ++
.../consumer/common/ServiceEvent.java | 32 ++
.../KubernetesBuildConfigsProducer.java | 147 +++++++++
.../producer/KubernetesBuildsProducer.java | 143 +++++++++
.../producer/KubernetesNamespacesProducer.java | 159 ++++++++++
.../producer/KubernetesNodesProducer.java | 123 ++++++++
.../producer/KubernetesOperations.java | 96 ++++++
...bernetesPersistentVolumesClaimsProducer.java | 216 +++++++++++++
.../KubernetesPersistentVolumesProducer.java | 139 +++++++++
.../producer/KubernetesPodsProducer.java | 193 ++++++++++++
...ubernetesReplicationControllersProducer.java | 223 ++++++++++++++
.../KubernetesResourcesQuotaProducer.java | 210 +++++++++++++
.../producer/KubernetesSecretsProducer.java | 190 ++++++++++++
.../KubernetesServiceAccountsProducer.java | 193 ++++++++++++
.../producer/KubernetesServicesProducer.java | 211 +++++++++++++
.../src/main/resources/META-INF/LICENSE.txt | 203 +++++++++++++
.../src/main/resources/META-INF/NOTICE.txt | 11 +
.../org/apache/camel/component/kubernetes | 18 ++
.../kubernetes/KubernetesTestSupport.java | 38 +++
.../consumer/KubernetesPodsConsumerTest.java | 158 ++++++++++
...netesReplicationControllersConsumerTest.java | 165 ++++++++++
.../consumer/KubernetesSecretsConsumerTest.java | 141 +++++++++
.../KubernetesServicesConsumerTest.java | 145 +++++++++
.../KubernetesBuildConfigsProducerTest.java | 86 ++++++
.../producer/KubernetesBuildsProducerTest.java | 89 ++++++
.../KubernetesNamespacesProducerTest.java | 210 +++++++++++++
.../producer/KubernetesNodesProducerTest.java | 89 ++++++
...etesPersistentVolumesClaimsProducerTest.java | 191 ++++++++++++
...KubernetesPersistentVolumesProducerTest.java | 86 ++++++
.../producer/KubernetesPodsProducerTest.java | 205 +++++++++++++
...netesReplicationControllersProducerTest.java | 215 +++++++++++++
.../KubernetesResourcesQuotaProducerTest.java | 142 +++++++++
.../producer/KubernetesSecretsProducerTest.java | 170 +++++++++++
.../KubernetesServiceAccountsProducerTest.java | 161 ++++++++++
.../KubernetesServicesProducerTest.java | 198 ++++++++++++
.../src/test/resources/log4j.properties | 36 +++
48 files changed, 6380 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/camel/blob/a452d0ac/components/camel-kubernetes/pom.xml
----------------------------------------------------------------------
diff --git a/components/camel-kubernetes/pom.xml b/components/camel-kubernetes/pom.xml
new file mode 100644
index 0000000..cc70793
--- /dev/null
+++ b/components/camel-kubernetes/pom.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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. -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>components</artifactId>
+ <version>2.17-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>camel-kubernetes</artifactId>
+ <packaging>bundle</packaging>
+ <name>Camel :: Kubernetes</name>
+
+ <properties>
+ <camel.osgi.export.pkg>org.apache.camel.component.kubernetes.*</camel.osgi.export.pkg>
+ <camel.osgi.export.service>org.apache.camel.spi.ComponentResolver;component=kubernetes</camel.osgi.export.service>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>io.fabric8</groupId>
+ <artifactId>kubernetes-client</artifactId>
+ <version>1.3.52</version>
+ </dependency>
+ <dependency>
+ <groupId>io.fabric8</groupId>
+ <artifactId>openshift-client</artifactId>
+ <version>1.3.52</version>
+ </dependency>
+ <!-- testing -->
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <!-- logging -->
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-log4j12</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>log4j</groupId>
+ <artifactId>log4j</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <forkCount>1</forkCount>
+ <reuseForks>false</reuseForks>
+ <forkedProcessTimeoutInSeconds>300</forkedProcessTimeoutInSeconds>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
http://git-wip-us.apache.org/repos/asf/camel/blob/a452d0ac/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
new file mode 100644
index 0000000..faf4a89
--- /dev/null
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesCategory.java
@@ -0,0 +1,44 @@
+/**
+ * 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;
+
+public interface KubernetesCategory {
+
+ String NAMESPACES = "namespaces";
+
+ String SERVICES = "services";
+
+ String REPLICATION_CONTROLLERS = "replicationControllers";
+
+ String PODS = "pods";
+
+ String PERSISTENT_VOLUMES = "persistentVolumes";
+
+ String PERSISTENT_VOLUMES_CLAIMS = "persistentVolumesClaims";
+
+ String SECRETS = "secrets";
+
+ String RESOURCES_QUOTA = "resourcesQuota";
+
+ String SERVICE_ACCOUNTS = "serviceAccounts";
+
+ String NODES = "nodes";
+
+ String BUILDS = "builds";
+
+ String BUILD_CONFIGS = "buildConfigs";
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/a452d0ac/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesComponent.java
----------------------------------------------------------------------
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesComponent.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesComponent.java
new file mode 100644
index 0000000..028bfaf
--- /dev/null
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesComponent.java
@@ -0,0 +1,41 @@
+/**
+ * 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;
+
+import java.util.Map;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.impl.DefaultComponent;
+import org.apache.camel.util.ObjectHelper;
+
+/**
+ * Represents the component that manages {@link GitEndpoint}.
+ */
+public class KubernetesComponent extends DefaultComponent {
+
+ protected Endpoint createEndpoint(String uri, String remaining,
+ Map<String, Object> parameters) throws Exception {
+ KubernetesConfiguration config = new KubernetesConfiguration();
+ setProperties(config, parameters);
+ config.setMasterUrl(remaining);
+ if (ObjectHelper.isEmpty(config.getMasterUrl())) {
+ throw new IllegalArgumentException("Master URL must be specified");
+ }
+ KubernetesEndpoint endpoint = new KubernetesEndpoint(uri, this, config);
+ return endpoint;
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/a452d0ac/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesConfiguration.java
----------------------------------------------------------------------
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesConfiguration.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesConfiguration.java
new file mode 100644
index 0000000..9c5696f
--- /dev/null
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesConfiguration.java
@@ -0,0 +1,303 @@
+/**
+ * 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;
+
+import io.fabric8.kubernetes.client.DefaultKubernetesClient;
+
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.spi.UriParams;
+import org.apache.camel.spi.UriPath;
+
+@UriParams
+public class KubernetesConfiguration {
+
+ @UriPath
+ @Metadata(required = "true")
+ private String masterUrl;
+
+ @UriParam(enums = "namespaces,services,replicationControllers,pods,persistentVolumes,persistentVolumesClaims,secrets,resourcesQuota,serviceAccounts,nodes,builds,buildConfigs")
+ @Metadata(required = "true")
+ private String category;
+
+ @UriParam
+ private DefaultKubernetesClient kubernetesClient;
+
+ @UriParam
+ private String username;
+
+ @UriParam
+ private String password;
+
+ @UriParam(label = "producer", enums = "listNamespaces,listNamespacesByLabels,getNamespace,createNamespace,deleteNamespace,listServices,listServicesByLabels,getService,createService,"
+ + "deleteService,listReplicationControllers,listReplicationControllersByLabels,getReplicationController,createReplicationController,deleteReplicationController,listPods,"
+ + "listPodsByLabels,getPod,createPod,deletePod,listPersistentVolumes,listPersistentVolumesByLabels,getPersistentVolume,listPersistentVolumesClaims,listPersistentVolumesClaimsByLabels,"
+ + "getPersistentVolumeClaim,createPersistentVolumeClaim,deletePersistentVolumeClaim,listSecrets,listSecretsByLabels,getSecret,createSecret,deleteSecret,listResourcesQuota,"
+ + "listResourcesQuotaByLabels,getResourceQuota,createResourceQuota,deleteResourceQuota,listServiceAccounts,listServiceAccountsByLabels,getServiceAccount,createServiceAccount,"
+ + "deleteServiceAccount,listNodes,listNodesByLabels,getNode,listBuilds,listBuildsByLabels,getBuild,listBuildConfigs,listBuildConfigsByLabels,getBuildConfig")
+ private String operation;
+
+ @UriParam
+ private String apiVersion;
+
+ @UriParam
+ private String caCertData;
+
+ @UriParam
+ private String caCertFile;
+
+ @UriParam
+ private String clientCertData;
+
+ @UriParam
+ private String clientCertFile;
+
+ @UriParam
+ private String clientKeyAlgo;
+
+ @UriParam
+ private String clientKeyData;
+
+ @UriParam
+ private String clientKeyFile;
+
+ @UriParam
+ private String clientKeyPassphrase;
+
+ @UriParam
+ private String oauthToken;
+
+ @UriParam
+ private Boolean trustCerts;
+
+ @UriParam(label = "consumer")
+ private String namespaceName;
+
+ /**
+ * Kubernetes Master url
+ */
+ public String getMasterUrl() {
+ return masterUrl;
+ }
+
+ public void setMasterUrl(String masterUrl) {
+ this.masterUrl = masterUrl;
+ }
+
+ /**
+ * Kubernetes Producer and Consumer category
+ */
+ public String getCategory() {
+ return category;
+ }
+
+ public void setCategory(String category) {
+ this.category = category;
+ }
+
+ /**
+ * Default KubernetesClient to use if provided
+ */
+ public DefaultKubernetesClient getKubernetesClient() {
+ return kubernetesClient;
+ }
+
+ public void setKubernetesClient(DefaultKubernetesClient kubernetesClient) {
+ this.kubernetesClient = kubernetesClient;
+ }
+
+ /**
+ * Username to connect to Kubernetes
+ */
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ /**
+ * Password to connect to Kubernetes
+ */
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ /**
+ * Producer operation to do on Kubernetes
+ */
+ public String getOperation() {
+ return operation;
+ }
+
+ public void setOperation(String operation) {
+ this.operation = operation;
+ }
+
+ /**
+ * The Kubernetes API Version to use
+ */
+ public String getApiVersion() {
+ return apiVersion;
+ }
+
+ public void setApiVersion(String apiVersion) {
+ this.apiVersion = apiVersion;
+ }
+
+ /**
+ * The CA Cert Data
+ */
+ public String getCaCertData() {
+ return caCertData;
+ }
+
+ public void setCaCertData(String caCertData) {
+ this.caCertData = caCertData;
+ }
+
+ /**
+ * The CA Cert File
+ */
+ public String getCaCertFile() {
+ return caCertFile;
+ }
+
+ public void setCaCertFile(String caCertFile) {
+ this.caCertFile = caCertFile;
+ }
+
+ /**
+ * The Client Cert Data
+ */
+ public String getClientCertData() {
+ return clientCertData;
+ }
+
+ public void setClientCertData(String clientCertData) {
+ this.clientCertData = clientCertData;
+ }
+
+ /**
+ * The Client Cert File
+ */
+ public String getClientCertFile() {
+ return clientCertFile;
+ }
+
+ public void setClientCertFile(String clientCertFile) {
+ this.clientCertFile = clientCertFile;
+ }
+
+ /**
+ * The Key Algorithm used by the client
+ */
+ public String getClientKeyAlgo() {
+ return clientKeyAlgo;
+ }
+
+ public void setClientKeyAlgo(String clientKeyAlgo) {
+ this.clientKeyAlgo = clientKeyAlgo;
+ }
+
+ /**
+ * The Client Key data
+ */
+ public String getClientKeyData() {
+ return clientKeyData;
+ }
+
+ public void setClientKeyData(String clientKeyData) {
+ this.clientKeyData = clientKeyData;
+ }
+
+ /**
+ * The Client Key file
+ */
+ public String getClientKeyFile() {
+ return clientKeyFile;
+ }
+
+ public void setClientKeyFile(String clientKeyFile) {
+ this.clientKeyFile = clientKeyFile;
+ }
+
+ /**
+ * The Client Key Passphrase
+ */
+ public String getClientKeyPassphrase() {
+ return clientKeyPassphrase;
+ }
+
+ public void setClientKeyPassphrase(String clientKeyPassphrase) {
+ this.clientKeyPassphrase = clientKeyPassphrase;
+ }
+
+ /**
+ * The Auth Token
+ */
+ public String getOauthToken() {
+ return oauthToken;
+ }
+
+ public void setOauthToken(String oauthToken) {
+ this.oauthToken = oauthToken;
+ }
+
+ /**
+ * Define if the certs we used are trusted anyway or not
+ */
+ public Boolean getTrustCerts() {
+ return trustCerts;
+ }
+
+ public void setTrustCerts(Boolean trustCerts) {
+ this.trustCerts = trustCerts;
+ }
+
+ /**
+ * The namespace name
+ */
+ public String getNamespaceName() {
+ return namespaceName;
+ }
+
+ public void setNamespaceName(String namespaceName) {
+ this.namespaceName = namespaceName;
+ }
+
+ @Override
+ public String toString() {
+ return "KubernetesConfiguration [masterUrl=" + masterUrl
+ + ", category=" + category + ", kubernetesClient="
+ + kubernetesClient + ", username=" + username + ", password="
+ + password + ", operation=" + operation + ", apiVersion="
+ + apiVersion + ", caCertData=" + caCertData + ", caCertFile="
+ + caCertFile + ", clientCertData=" + clientCertData
+ + ", clientCertFile=" + clientCertFile + ", clientKeyAlgo="
+ + clientKeyAlgo + ", clientKeyData=" + clientKeyData
+ + ", clientKeyFile=" + clientKeyFile + ", clientKeyPassphrase="
+ + clientKeyPassphrase + ", oauthToken=" + oauthToken
+ + ", trustCerts=" + trustCerts + ", namespaceName="
+ + namespaceName + "]";
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/a452d0ac/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
new file mode 100644
index 0000000..6fcad8e
--- /dev/null
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesConstants.java
@@ -0,0 +1,57 @@
+/**
+ * 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;
+
+public interface KubernetesConstants {
+ // Producer
+ String KUBERNETES_OPERATION = "CamelKubernetesOperation";
+ String KUBERNETES_NAMESPACE_NAME = "CamelKubernetesNamespaceName";
+ String KUBERNETES_NAMESPACE_LABELS = "CamelKubernetesNamespaceLabels";
+ String KUBERNETES_SERVICE_LABELS = "CamelKubernetesServiceLabels";
+ String KUBERNETES_SERVICE_NAME = "CamelKubernetesServiceName";
+ String KUBERNETES_SERVICE_SPEC = "CamelKubernetesServiceSpec";
+ String KUBERNETES_REPLICATION_CONTROLLERS_LABELS = "CamelKubernetesReplicationControllersLabels";
+ String KUBERNETES_REPLICATION_CONTROLLER_NAME = "CamelKubernetesReplicationControllerName";
+ String KUBERNETES_REPLICATION_CONTROLLER_SPEC = "CamelKubernetesReplicationControllerSpec";
+ String KUBERNETES_PODS_LABELS = "CamelKubernetesPodsLabels";
+ String KUBERNETES_POD_NAME = "CamelKubernetesPodName";
+ String KUBERNETES_POD_SPEC = "CamelKubernetesPodSpec";
+ String KUBERNETES_PERSISTENT_VOLUMES_LABELS = "CamelKubernetesPersistentVolumesLabels";
+ String KUBERNETES_PERSISTENT_VOLUME_NAME = "CamelKubernetesPersistentVolumeName";
+ String KUBERNETES_PERSISTENT_VOLUMES_CLAIMS_LABELS = "CamelKubernetesPersistentVolumesClaimsLabels";
+ String KUBERNETES_PERSISTENT_VOLUME_CLAIM_NAME = "CamelKubernetesPersistentVolumeClaimName";
+ String KUBERNETES_PERSISTENT_VOLUME_CLAIM_SPEC = "CamelKubernetesPersistentVolumeClaimSpec";
+ String KUBERNETES_SECRETS_LABELS = "CamelKubernetesSecretsLabels";
+ String KUBERNETES_SECRET_NAME = "CamelKubernetesSecretName";
+ String KUBERNETES_SECRET = "CamelKubernetesSecret";
+ String KUBERNETES_RESOURCES_QUOTA_LABELS = "CamelKubernetesResourcesQuotaLabels";
+ String KUBERNETES_RESOURCES_QUOTA_NAME = "CamelKubernetesResourcesQuotaName";
+ String KUBERNETES_RESOURCE_QUOTA_SPEC = "CamelKubernetesResourceQuotaSpec";
+ String KUBERNETES_SERVICE_ACCOUNTS_LABELS = "CamelKubernetesServiceAccountsLabels";
+ String KUBERNETES_SERVICE_ACCOUNT_NAME = "CamelKubernetesServiceAccountName";
+ String KUBERNETES_SERVICE_ACCOUNT = "CamelKubernetesServiceAccount";
+ String KUBERNETES_NODES_LABELS = "CamelKubernetesNodesLabels";
+ String KUBERNETES_NODE_NAME = "CamelKubernetesNodeName";
+ String KUBERNETES_BUILDS_LABELS = "CamelKubernetesBuildsLabels";
+ String KUBERNETES_BUILD_NAME = "CamelKubernetesBuildName";
+ String KUBERNETES_BUILD_CONFIGS_LABELS = "CamelKubernetesBuildConfigsLabels";
+ String KUBERNETES_BUILD_CONFIG_NAME = "CamelKubernetesBuildConfigName";
+
+ // Consumer
+ String KUBERNETES_EVENT_ACTION = "CamelKubernetesEventAction";
+ String KUBERNETES_EVENT_TIMESTAMP = "CamelKubernetesEventTimestamp";
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/a452d0ac/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
new file mode 100644
index 0000000..4833a37
--- /dev/null
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/KubernetesEndpoint.java
@@ -0,0 +1,212 @@
+/**
+ * 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;
+
+import io.fabric8.kubernetes.client.Config;
+import io.fabric8.kubernetes.client.ConfigBuilder;
+import io.fabric8.kubernetes.client.DefaultKubernetesClient;
+
+import org.apache.camel.Consumer;
+import org.apache.camel.Processor;
+import org.apache.camel.Producer;
+import org.apache.camel.component.kubernetes.consumer.KubernetesPodsConsumer;
+import org.apache.camel.component.kubernetes.consumer.KubernetesReplicationControllersConsumer;
+import org.apache.camel.component.kubernetes.consumer.KubernetesSecretsConsumer;
+import org.apache.camel.component.kubernetes.consumer.KubernetesServicesConsumer;
+import org.apache.camel.component.kubernetes.producer.KubernetesNamespacesProducer;
+import org.apache.camel.component.kubernetes.producer.KubernetesPersistentVolumesClaimsProducer;
+import org.apache.camel.component.kubernetes.producer.KubernetesPersistentVolumesProducer;
+import org.apache.camel.component.kubernetes.producer.KubernetesPodsProducer;
+import org.apache.camel.component.kubernetes.KubernetesCategory;
+import org.apache.camel.component.kubernetes.producer.KubernetesBuildConfigsProducer;
+import org.apache.camel.component.kubernetes.producer.KubernetesBuildsProducer;
+import org.apache.camel.component.kubernetes.producer.KubernetesNodesProducer;
+import org.apache.camel.component.kubernetes.producer.KubernetesReplicationControllersProducer;
+import org.apache.camel.component.kubernetes.producer.KubernetesResourcesQuotaProducer;
+import org.apache.camel.component.kubernetes.producer.KubernetesSecretsProducer;
+import org.apache.camel.component.kubernetes.producer.KubernetesServiceAccountsProducer;
+import org.apache.camel.component.kubernetes.producer.KubernetesServicesProducer;
+import org.apache.camel.impl.DefaultEndpoint;
+import org.apache.camel.spi.UriEndpoint;
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.util.ObjectHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@UriEndpoint(scheme = "kubernetes", title = "Kubernetes", syntax = "kubernetes:master", label = "cloud,paas")
+public class KubernetesEndpoint extends DefaultEndpoint {
+
+ private static final Logger LOG = LoggerFactory
+ .getLogger(KubernetesEndpoint.class);
+
+ @UriParam
+ private KubernetesConfiguration configuration;
+
+ private DefaultKubernetesClient client;
+
+ public KubernetesEndpoint(String uri, KubernetesComponent component,
+ KubernetesConfiguration config) {
+ super(uri, component);
+ this.configuration = config;
+ }
+
+ @Override
+ public Producer createProducer() throws Exception {
+ if (ObjectHelper.isEmpty(configuration.getCategory())) {
+ throw new IllegalArgumentException(
+ "A producer category must be specified");
+ } else {
+ String category = configuration.getCategory();
+
+ switch (category) {
+
+ case KubernetesCategory.NAMESPACES:
+ return new KubernetesNamespacesProducer(this);
+
+ case KubernetesCategory.SERVICES:
+ return new KubernetesServicesProducer(this);
+
+ case KubernetesCategory.REPLICATION_CONTROLLERS:
+ return new KubernetesReplicationControllersProducer(this);
+
+ case KubernetesCategory.PODS:
+ return new KubernetesPodsProducer(this);
+
+ case KubernetesCategory.PERSISTENT_VOLUMES:
+ return new KubernetesPersistentVolumesProducer(this);
+
+ case KubernetesCategory.PERSISTENT_VOLUMES_CLAIMS:
+ return new KubernetesPersistentVolumesClaimsProducer(this);
+
+ case KubernetesCategory.SECRETS:
+ return new KubernetesSecretsProducer(this);
+
+ case KubernetesCategory.RESOURCES_QUOTA:
+ return new KubernetesResourcesQuotaProducer(this);
+
+ case KubernetesCategory.SERVICE_ACCOUNTS:
+ return new KubernetesServiceAccountsProducer(this);
+
+ case KubernetesCategory.NODES:
+ return new KubernetesNodesProducer(this);
+
+ case KubernetesCategory.BUILDS:
+ return new KubernetesBuildsProducer(this);
+
+ case KubernetesCategory.BUILD_CONFIGS:
+ return new KubernetesBuildConfigsProducer(this);
+
+ default:
+ throw new IllegalArgumentException("The " + category
+ + " producer category doesn't exist");
+ }
+ }
+ }
+
+ @Override
+ public Consumer createConsumer(Processor processor) throws Exception {
+ if (ObjectHelper.isEmpty(configuration.getCategory())) {
+ throw new IllegalArgumentException(
+ "A consumer category must be specified");
+ } else {
+ String category = configuration.getCategory();
+
+ switch (category) {
+
+ case KubernetesCategory.PODS:
+ return new KubernetesPodsConsumer(this, processor);
+
+ case KubernetesCategory.SERVICES:
+ return new KubernetesServicesConsumer(this, processor);
+
+ case KubernetesCategory.REPLICATION_CONTROLLERS:
+ return new KubernetesReplicationControllersConsumer(this, processor);
+
+ case KubernetesCategory.SECRETS:
+ return new KubernetesSecretsConsumer(this, processor);
+
+ default:
+ throw new IllegalArgumentException("The " + category
+ + " consumer category doesn't exist");
+ }
+ }
+ }
+
+ @Override
+ public boolean isSingleton() {
+ return false;
+ }
+
+ @Override
+ protected void doStart() throws Exception {
+ super.doStart();
+
+ client = configuration.getKubernetesClient() != null ? configuration
+ .getKubernetesClient() : createKubernetesClient();
+ }
+
+ @Override
+ protected void doStop() throws Exception {
+ super.doStop();
+ client.close();
+ }
+
+ public DefaultKubernetesClient getKubernetesClient() {
+ return client;
+ }
+
+
+ /**
+ * The kubernetes Configuration
+ */
+ public KubernetesConfiguration getKubernetesConfiguration() {
+ return configuration;
+ }
+
+ private DefaultKubernetesClient createKubernetesClient() {
+ LOG.debug("Create Kubernetes client with the following Configuration: " + configuration.toString());
+
+ DefaultKubernetesClient kubeClient = new DefaultKubernetesClient();
+ ConfigBuilder builder = new ConfigBuilder();
+ builder.withMasterUrl(configuration.getMasterUrl());
+ if ((ObjectHelper.isNotEmpty(configuration.getUsername()) && ObjectHelper
+ .isNotEmpty(configuration.getPassword()))
+ && ObjectHelper.isEmpty(configuration.getOauthToken())) {
+ builder.withUsername(configuration.getUsername());
+ builder.withPassword(configuration.getPassword());
+ } else {
+ builder.withOauthToken(configuration.getOauthToken());
+ }
+ if (ObjectHelper.isNotEmpty(configuration.getCaCertData())) {
+ builder.withCaCertData(configuration.getCaCertData());
+ }
+ if (ObjectHelper.isNotEmpty(configuration.getCaCertFile())) {
+ builder.withCaCertFile(configuration.getCaCertFile());
+ }
+ if (ObjectHelper.isNotEmpty(configuration.getClientCertData())) {
+ builder.withClientCertData(configuration.getClientCertData());
+ }
+ if (ObjectHelper.isNotEmpty(configuration.getClientCertFile())) {
+ builder.withClientCertFile(configuration.getClientCertFile());
+ }
+
+ Config conf = builder.build();
+
+ kubeClient = new DefaultKubernetesClient(conf);
+ return kubeClient;
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/a452d0ac/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/KubernetesPodsConsumer.java
----------------------------------------------------------------------
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/KubernetesPodsConsumer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/KubernetesPodsConsumer.java
new file mode 100644
index 0000000..9524f71
--- /dev/null
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/KubernetesPodsConsumer.java
@@ -0,0 +1,132 @@
+/**
+ * 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.consumer;
+
+import io.fabric8.kubernetes.api.model.Pod;
+import io.fabric8.kubernetes.client.KubernetesClientException;
+import io.fabric8.kubernetes.client.Watcher;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.component.kubernetes.KubernetesConstants;
+import org.apache.camel.component.kubernetes.KubernetesEndpoint;
+import org.apache.camel.component.kubernetes.consumer.common.PodEvent;
+import org.apache.camel.impl.ScheduledPollConsumer;
+import org.apache.camel.util.ObjectHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class KubernetesPodsConsumer extends ScheduledPollConsumer {
+
+ private static final Logger LOG = LoggerFactory
+ .getLogger(KubernetesPodsConsumer.class);
+
+ private ConcurrentMap<Long, PodEvent> map;
+
+ public KubernetesPodsConsumer(KubernetesEndpoint endpoint,
+ Processor processor) {
+ super(endpoint, processor);
+ }
+
+ @Override
+ public KubernetesEndpoint getEndpoint() {
+ return (KubernetesEndpoint) super.getEndpoint();
+ }
+
+ @Override
+ protected void doStart() throws Exception {
+ super.doStart();
+ map = new ConcurrentHashMap<Long, PodEvent>();
+
+ if (ObjectHelper.isNotEmpty(getEndpoint().getKubernetesConfiguration()
+ .getOauthToken())) {
+ if (ObjectHelper.isNotEmpty(getEndpoint()
+ .getKubernetesConfiguration().getNamespaceName())) {
+ getEndpoint()
+ .getKubernetesClient()
+ .pods()
+ .inNamespace(
+ getEndpoint().getKubernetesConfiguration()
+ .getNamespaceName())
+ .watch(new Watcher<Pod>() {
+
+ @Override
+ public void eventReceived(
+ io.fabric8.kubernetes.client.Watcher.Action action,
+ Pod resource) {
+ PodEvent pe = new PodEvent(action, resource);
+ map.put(System.currentTimeMillis(), pe);
+ }
+
+ @Override
+ public void onClose(KubernetesClientException cause) {
+ if (cause != null) {
+ LOG.error(cause.getMessage(), cause);
+ }
+
+ }
+ });
+ } else {
+ getEndpoint().getKubernetesClient().pods()
+ .watch(new Watcher<Pod>() {
+
+ @Override
+ public void eventReceived(
+ io.fabric8.kubernetes.client.Watcher.Action action,
+ Pod resource) {
+ PodEvent pe = new PodEvent(action, resource);
+ map.put(System.currentTimeMillis(), pe);
+ }
+
+ @Override
+ public void onClose(KubernetesClientException cause) {
+ if (cause != null) {
+ LOG.error(cause.getMessage(), cause);
+ }
+ }
+ });
+ }
+ }
+ }
+
+ @Override
+ protected void doStop() throws Exception {
+ super.doStop();
+ map.clear();
+ }
+
+ @Override
+ protected int poll() throws Exception {
+ int mapSize = map.size();
+ for (ConcurrentMap.Entry<Long, PodEvent> entry : map.entrySet()) {
+ PodEvent podEvent = (PodEvent) entry.getValue();
+ Exchange e = getEndpoint().createExchange();
+ e.getIn().setBody(podEvent.getPod());
+ e.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_ACTION,
+ podEvent.getAction());
+ e.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_TIMESTAMP,
+ entry.getKey());
+ getProcessor().process(e);
+ map.remove(entry.getKey());
+ }
+ return mapSize;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/a452d0ac/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/KubernetesReplicationControllersConsumer.java
----------------------------------------------------------------------
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/KubernetesReplicationControllersConsumer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/KubernetesReplicationControllersConsumer.java
new file mode 100644
index 0000000..574a8f7
--- /dev/null
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/KubernetesReplicationControllersConsumer.java
@@ -0,0 +1,129 @@
+/**
+ * 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.consumer;
+
+import io.fabric8.kubernetes.api.model.ReplicationController;
+import io.fabric8.kubernetes.api.model.Service;
+import io.fabric8.kubernetes.client.KubernetesClientException;
+import io.fabric8.kubernetes.client.Watcher;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.component.kubernetes.KubernetesConstants;
+import org.apache.camel.component.kubernetes.KubernetesEndpoint;
+import org.apache.camel.component.kubernetes.consumer.common.ReplicationControllerEvent;
+import org.apache.camel.component.kubernetes.consumer.common.ServiceEvent;
+import org.apache.camel.impl.ScheduledPollConsumer;
+import org.apache.camel.util.ObjectHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class KubernetesReplicationControllersConsumer extends ScheduledPollConsumer {
+
+ private static final Logger LOG = LoggerFactory
+ .getLogger(KubernetesReplicationControllersConsumer.class);
+
+ private ConcurrentMap<Long, ReplicationControllerEvent> map;
+
+ public KubernetesReplicationControllersConsumer(KubernetesEndpoint endpoint,
+ Processor processor) {
+ super(endpoint, processor);
+ }
+
+ @Override
+ public KubernetesEndpoint getEndpoint() {
+ return (KubernetesEndpoint) super.getEndpoint();
+ }
+
+ @Override
+ protected void doStart() throws Exception {
+ super.doStart();
+ map = new ConcurrentHashMap<Long, ReplicationControllerEvent>();
+
+ if (ObjectHelper.isNotEmpty(getEndpoint().getKubernetesConfiguration().getOauthToken())) {
+ if (ObjectHelper.isNotEmpty(getEndpoint().getKubernetesConfiguration().getNamespaceName())) {
+ getEndpoint().getKubernetesClient().replicationControllers().inNamespace(getEndpoint().getKubernetesConfiguration().getNamespaceName())
+ .watch(new Watcher<ReplicationController>() {
+
+ @Override
+ public void eventReceived(
+ io.fabric8.kubernetes.client.Watcher.Action action,
+ ReplicationController resource) {
+ ReplicationControllerEvent rce = new ReplicationControllerEvent(action, resource);
+ map.put(System.currentTimeMillis(), rce);
+
+ }
+
+ @Override
+ public void onClose(KubernetesClientException cause) {
+ if (cause != null) {
+ LOG.error(cause.getMessage(), cause);
+ }
+ }
+
+
+ });
+ } else {
+ getEndpoint().getKubernetesClient().replicationControllers()
+ .watch(new Watcher<ReplicationController>() {
+
+
+ @Override
+ public void eventReceived(
+ io.fabric8.kubernetes.client.Watcher.Action action,
+ ReplicationController resource) {
+ ReplicationControllerEvent se = new ReplicationControllerEvent(action, resource);
+ map.put(System.currentTimeMillis(), se);
+
+ }
+
+ @Override
+ public void onClose(KubernetesClientException cause) {
+ if (cause != null) {
+ LOG.error(cause.getMessage(), cause);
+ }
+ }
+ });
+ }
+ }
+ }
+
+ @Override
+ protected void doStop() throws Exception {
+ super.doStop();
+ map.clear();
+ }
+
+ @Override
+ protected int poll() throws Exception {
+ int mapSize = map.size();
+ for (ConcurrentMap.Entry<Long, ReplicationControllerEvent> entry : map.entrySet()) {
+ ReplicationControllerEvent serviceEvent = (ReplicationControllerEvent) entry.getValue();
+ Exchange e = getEndpoint().createExchange();
+ e.getIn().setBody(serviceEvent.getReplicationController());
+ e.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_ACTION, serviceEvent.getAction());
+ e.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_TIMESTAMP, entry.getKey());
+ getProcessor().process(e);
+ map.remove(entry.getKey());
+ }
+ return mapSize;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/a452d0ac/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/KubernetesSecretsConsumer.java
----------------------------------------------------------------------
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/KubernetesSecretsConsumer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/KubernetesSecretsConsumer.java
new file mode 100644
index 0000000..4d68a35
--- /dev/null
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/KubernetesSecretsConsumer.java
@@ -0,0 +1,125 @@
+/**
+ * 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.consumer;
+
+import io.fabric8.kubernetes.api.model.Pod;
+import io.fabric8.kubernetes.api.model.Secret;
+import io.fabric8.kubernetes.client.KubernetesClientException;
+import io.fabric8.kubernetes.client.Watcher;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.component.kubernetes.KubernetesConstants;
+import org.apache.camel.component.kubernetes.KubernetesEndpoint;
+import org.apache.camel.component.kubernetes.consumer.common.PodEvent;
+import org.apache.camel.component.kubernetes.consumer.common.SecretEvent;
+import org.apache.camel.impl.ScheduledPollConsumer;
+import org.apache.camel.util.ObjectHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class KubernetesSecretsConsumer extends ScheduledPollConsumer {
+
+ private static final Logger LOG = LoggerFactory
+ .getLogger(KubernetesSecretsConsumer.class);
+
+ private ConcurrentMap<Long, SecretEvent> map;
+
+ public KubernetesSecretsConsumer(KubernetesEndpoint endpoint,
+ Processor processor) {
+ super(endpoint, processor);
+ }
+
+ @Override
+ public KubernetesEndpoint getEndpoint() {
+ return (KubernetesEndpoint) super.getEndpoint();
+ }
+
+ @Override
+ protected void doStart() throws Exception {
+ super.doStart();
+ map = new ConcurrentHashMap<Long, SecretEvent>();
+
+ if (ObjectHelper.isNotEmpty(getEndpoint().getKubernetesConfiguration().getOauthToken())) {
+ if (ObjectHelper.isNotEmpty(getEndpoint().getKubernetesConfiguration().getNamespaceName())) {
+ getEndpoint().getKubernetesClient().secrets().inNamespace(getEndpoint().getKubernetesConfiguration().getNamespaceName())
+ .watch(new Watcher<Secret>() {
+
+ @Override
+ public void eventReceived(
+ io.fabric8.kubernetes.client.Watcher.Action action,
+ Secret resource) {
+ SecretEvent se = new SecretEvent(action, resource);
+ map.put(System.currentTimeMillis(), se);
+ }
+
+ @Override
+ public void onClose(KubernetesClientException cause) {
+ if (cause != null) {
+ LOG.error(cause.getMessage(), cause);
+ }
+
+ }
+ });
+ } else {
+ getEndpoint().getKubernetesClient().secrets()
+ .watch(new Watcher<Secret>() {
+
+ @Override
+ public void eventReceived(
+ io.fabric8.kubernetes.client.Watcher.Action action,
+ Secret resource) {
+ SecretEvent se = new SecretEvent(action, resource);
+ map.put(System.currentTimeMillis(), se);
+ }
+
+ @Override
+ public void onClose(KubernetesClientException cause) {
+ if (cause != null) {
+ LOG.error(cause.getMessage(), cause);
+ }
+ }
+ });
+ }
+ }
+ }
+
+ @Override
+ protected void doStop() throws Exception {
+ super.doStop();
+ map.clear();
+ }
+
+ @Override
+ protected int poll() throws Exception {
+ int mapSize = map.size();
+ for (ConcurrentMap.Entry<Long, SecretEvent> entry : map.entrySet()) {
+ SecretEvent podEvent = (SecretEvent) entry.getValue();
+ Exchange e = getEndpoint().createExchange();
+ e.getIn().setBody(podEvent.getSecret());
+ e.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_ACTION, podEvent.getAction());
+ e.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_TIMESTAMP, entry.getKey());
+ getProcessor().process(e);
+ map.remove(entry.getKey());
+ }
+ return mapSize;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/a452d0ac/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/KubernetesServicesConsumer.java
----------------------------------------------------------------------
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/KubernetesServicesConsumer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/KubernetesServicesConsumer.java
new file mode 100644
index 0000000..de25388
--- /dev/null
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/KubernetesServicesConsumer.java
@@ -0,0 +1,127 @@
+/**
+ * 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.consumer;
+
+import io.fabric8.kubernetes.api.model.Service;
+import io.fabric8.kubernetes.client.KubernetesClientException;
+import io.fabric8.kubernetes.client.Watcher;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.component.kubernetes.KubernetesConstants;
+import org.apache.camel.component.kubernetes.KubernetesEndpoint;
+import org.apache.camel.component.kubernetes.consumer.common.ServiceEvent;
+import org.apache.camel.impl.ScheduledPollConsumer;
+import org.apache.camel.util.ObjectHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class KubernetesServicesConsumer extends ScheduledPollConsumer {
+
+ private static final Logger LOG = LoggerFactory
+ .getLogger(KubernetesServicesConsumer.class);
+
+ private ConcurrentMap<Long, ServiceEvent> map;
+
+ public KubernetesServicesConsumer(KubernetesEndpoint endpoint,
+ Processor processor) {
+ super(endpoint, processor);
+ }
+
+ @Override
+ public KubernetesEndpoint getEndpoint() {
+ return (KubernetesEndpoint) super.getEndpoint();
+ }
+
+ @Override
+ protected void doStart() throws Exception {
+ super.doStart();
+ map = new ConcurrentHashMap<Long, ServiceEvent>();
+
+ if (ObjectHelper.isNotEmpty(getEndpoint().getKubernetesConfiguration().getOauthToken())) {
+ if (ObjectHelper.isNotEmpty(getEndpoint().getKubernetesConfiguration().getNamespaceName())) {
+ getEndpoint().getKubernetesClient().services().inNamespace(getEndpoint().getKubernetesConfiguration().getNamespaceName())
+ .watch(new Watcher<Service>() {
+
+ @Override
+ public void eventReceived(
+ io.fabric8.kubernetes.client.Watcher.Action action,
+ Service resource) {
+ ServiceEvent se = new ServiceEvent(action, resource);
+ map.put(System.currentTimeMillis(), se);
+
+ }
+
+ @Override
+ public void onClose(KubernetesClientException cause) {
+ if (cause != null) {
+ LOG.error(cause.getMessage(), cause);
+ }
+ }
+
+
+ });
+ } else {
+ getEndpoint().getKubernetesClient().services()
+ .watch(new Watcher<Service>() {
+
+
+ @Override
+ public void eventReceived(
+ io.fabric8.kubernetes.client.Watcher.Action action,
+ Service resource) {
+ ServiceEvent se = new ServiceEvent(action, resource);
+ map.put(System.currentTimeMillis(), se);
+
+ }
+
+ @Override
+ public void onClose(KubernetesClientException cause) {
+ if (cause != null) {
+ LOG.error(cause.getMessage(), cause);
+ }
+ }
+ });
+ }
+ }
+ }
+
+ @Override
+ protected void doStop() throws Exception {
+ super.doStop();
+ map.clear();
+ }
+
+ @Override
+ protected int poll() throws Exception {
+ int mapSize = map.size();
+ for (ConcurrentMap.Entry<Long, ServiceEvent> entry : map.entrySet()) {
+ ServiceEvent serviceEvent = (ServiceEvent) entry.getValue();
+ Exchange e = getEndpoint().createExchange();
+ e.getIn().setBody(serviceEvent.getService());
+ e.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_ACTION, serviceEvent.getAction());
+ e.getIn().setHeader(KubernetesConstants.KUBERNETES_EVENT_TIMESTAMP, entry.getKey());
+ getProcessor().process(e);
+ map.remove(entry.getKey());
+ }
+ return mapSize;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/a452d0ac/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/PodEvent.java
----------------------------------------------------------------------
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/PodEvent.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/PodEvent.java
new file mode 100644
index 0000000..7b87b48
--- /dev/null
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/PodEvent.java
@@ -0,0 +1,32 @@
+package org.apache.camel.component.kubernetes.consumer.common;
+
+import io.fabric8.kubernetes.api.model.Pod;
+import io.fabric8.kubernetes.client.Watcher.Action;
+
+public class PodEvent {
+ private io.fabric8.kubernetes.client.Watcher.Action action;
+
+ private Pod pod;
+
+ public PodEvent(Action action, Pod pod) {
+ super();
+ this.action = action;
+ this.pod = pod;
+ }
+
+ public io.fabric8.kubernetes.client.Watcher.Action getAction() {
+ return action;
+ }
+
+ public void setAction(io.fabric8.kubernetes.client.Watcher.Action action) {
+ this.action = action;
+ }
+
+ public Pod getPod() {
+ return pod;
+ }
+
+ public void setPod(Pod pod) {
+ this.pod = pod;
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/a452d0ac/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/ReplicationControllerEvent.java
----------------------------------------------------------------------
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/ReplicationControllerEvent.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/ReplicationControllerEvent.java
new file mode 100644
index 0000000..dda946d
--- /dev/null
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/ReplicationControllerEvent.java
@@ -0,0 +1,33 @@
+package org.apache.camel.component.kubernetes.consumer.common;
+
+import io.fabric8.kubernetes.api.model.ReplicationController;
+import io.fabric8.kubernetes.api.model.Service;
+import io.fabric8.kubernetes.client.Watcher.Action;
+
+public class ReplicationControllerEvent {
+ private io.fabric8.kubernetes.client.Watcher.Action action;
+
+ private ReplicationController replicationController;
+
+ public ReplicationControllerEvent(Action action, ReplicationController rc) {
+ super();
+ this.action = action;
+ this.replicationController = rc;
+ }
+
+ public io.fabric8.kubernetes.client.Watcher.Action getAction() {
+ return action;
+ }
+
+ public void setAction(io.fabric8.kubernetes.client.Watcher.Action action) {
+ this.action = action;
+ }
+
+ public ReplicationController getReplicationController() {
+ return replicationController;
+ }
+
+ public void setReplicationController(ReplicationController replicationController) {
+ this.replicationController = replicationController;
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/a452d0ac/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/SecretEvent.java
----------------------------------------------------------------------
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/SecretEvent.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/SecretEvent.java
new file mode 100644
index 0000000..048a478
--- /dev/null
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/SecretEvent.java
@@ -0,0 +1,32 @@
+package org.apache.camel.component.kubernetes.consumer.common;
+
+import io.fabric8.kubernetes.api.model.Secret;
+import io.fabric8.kubernetes.client.Watcher.Action;
+
+public class SecretEvent {
+ private io.fabric8.kubernetes.client.Watcher.Action action;
+
+ private Secret secret;
+
+ public SecretEvent(Action action, Secret secret) {
+ super();
+ this.action = action;
+ this.secret = secret;
+ }
+
+ public io.fabric8.kubernetes.client.Watcher.Action getAction() {
+ return action;
+ }
+
+ public void setAction(io.fabric8.kubernetes.client.Watcher.Action action) {
+ this.action = action;
+ }
+
+ public Secret getSecret() {
+ return secret;
+ }
+
+ public void setSecret(Secret secret) {
+ this.secret = secret;
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/a452d0ac/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/ServiceEvent.java
----------------------------------------------------------------------
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/ServiceEvent.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/ServiceEvent.java
new file mode 100644
index 0000000..199ee44
--- /dev/null
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/consumer/common/ServiceEvent.java
@@ -0,0 +1,32 @@
+package org.apache.camel.component.kubernetes.consumer.common;
+
+import io.fabric8.kubernetes.api.model.Service;
+import io.fabric8.kubernetes.client.Watcher.Action;
+
+public class ServiceEvent {
+ private io.fabric8.kubernetes.client.Watcher.Action action;
+
+ private Service service;
+
+ public ServiceEvent(Action action, Service service) {
+ super();
+ this.action = action;
+ this.service = service;
+ }
+
+ public io.fabric8.kubernetes.client.Watcher.Action getAction() {
+ return action;
+ }
+
+ public void setAction(io.fabric8.kubernetes.client.Watcher.Action action) {
+ this.action = action;
+ }
+
+ public Service getService() {
+ return service;
+ }
+
+ public void setService(Service service) {
+ this.service = service;
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/a452d0ac/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/producer/KubernetesBuildConfigsProducer.java
----------------------------------------------------------------------
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/producer/KubernetesBuildConfigsProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/producer/KubernetesBuildConfigsProducer.java
new file mode 100644
index 0000000..9eb23dc
--- /dev/null
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/producer/KubernetesBuildConfigsProducer.java
@@ -0,0 +1,147 @@
+/**
+ * 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.Map;
+
+import io.fabric8.kubernetes.api.model.DoneablePersistentVolume;
+import io.fabric8.kubernetes.api.model.PersistentVolume;
+import io.fabric8.kubernetes.api.model.PersistentVolumeList;
+import io.fabric8.kubernetes.client.KubernetesClient;
+import io.fabric8.kubernetes.client.dsl.ClientNonNamespaceOperation;
+import io.fabric8.kubernetes.client.dsl.ClientOperation;
+import io.fabric8.kubernetes.client.dsl.ClientResource;
+import io.fabric8.openshift.api.model.Build;
+import io.fabric8.openshift.api.model.BuildConfig;
+import io.fabric8.openshift.api.model.BuildConfigList;
+import io.fabric8.openshift.api.model.BuildList;
+import io.fabric8.openshift.api.model.DoneableBuild;
+import io.fabric8.openshift.api.model.DoneableBuildConfig;
+import io.fabric8.openshift.client.OpenShiftClient;
+import io.fabric8.openshift.client.dsl.ClientBuildConfigResource;
+
+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 KubernetesBuildConfigsProducer extends DefaultProducer {
+
+ private static final Logger LOG = LoggerFactory
+ .getLogger(KubernetesBuildConfigsProducer.class);
+
+ public KubernetesBuildConfigsProducer(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_BUILD_CONFIGS:
+ doList(exchange, operation);
+ break;
+
+ case KubernetesOperations.LIST_BUILD_CONFIGS_BY_LABELS_OPERATION:
+ doListBuildConfigsByLabels(exchange, operation);
+ break;
+
+ case KubernetesOperations.GET_BUILD_CONFIG_OPERATION:
+ doGetBuildConfig(exchange, operation);
+ break;
+
+ default:
+ throw new IllegalArgumentException("Unsupported operation "
+ + operation);
+ }
+ }
+
+ protected void doList(Exchange exchange, String operation) throws Exception {
+ BuildConfigList buildConfigsList = getEndpoint()
+ .getKubernetesClient().adapt(OpenShiftClient.class).buildConfigs().list();
+ exchange.getOut().setBody(buildConfigsList.getItems());
+ }
+
+ protected void doListBuildConfigsByLabels(Exchange exchange,
+ String operation) throws Exception {
+ BuildConfigList buildConfigsList = null;
+ Map<String, String> labels = exchange.getIn().getHeader(
+ KubernetesConstants.KUBERNETES_BUILD_CONFIGS_LABELS,
+ Map.class);
+ String namespaceName = exchange.getIn().getHeader(
+ KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
+ if (!ObjectHelper.isEmpty(namespaceName)) {
+ ClientNonNamespaceOperation<OpenShiftClient, BuildConfig, BuildConfigList, DoneableBuildConfig, ClientBuildConfigResource<BuildConfig, DoneableBuildConfig, Void, Void>> buildConfigs;
+ buildConfigs = getEndpoint().getKubernetesClient().adapt(OpenShiftClient.class).buildConfigs()
+ .inNamespace(namespaceName);
+ for (Map.Entry<String, String> entry : labels.entrySet()) {
+ buildConfigs.withLabel(entry.getKey(), entry.getValue());
+ }
+ buildConfigsList = buildConfigs.list();
+ } else {
+ ClientOperation<OpenShiftClient, BuildConfig, BuildConfigList, DoneableBuildConfig, ClientBuildConfigResource<BuildConfig, DoneableBuildConfig, Void, Void>> buildConfigs;
+ buildConfigs = getEndpoint().getKubernetesClient().adapt(OpenShiftClient.class).buildConfigs();
+ for (Map.Entry<String, String> entry : labels.entrySet()) {
+ buildConfigs.withLabel(entry.getKey(), entry.getValue());
+ }
+ buildConfigsList = buildConfigs.list();
+ }
+ exchange.getOut().setBody(buildConfigsList.getItems());
+ }
+
+ protected void doGetBuildConfig(Exchange exchange, String operation)
+ throws Exception {
+ BuildConfig buildConfig = null;
+ String buildConfigName = exchange.getIn().getHeader(
+ KubernetesConstants.KUBERNETES_BUILD_CONFIG_NAME,
+ String.class);
+ String namespaceName = exchange.getIn().getHeader(
+ KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
+ if (ObjectHelper.isEmpty(buildConfigName)) {
+ LOG.error("Get a specific Build Config require specify a Build Config name");
+ throw new IllegalArgumentException(
+ "Get a specific Build Config require specify a Build Config name");
+ }
+ if (ObjectHelper.isEmpty(namespaceName)) {
+ LOG.error("Get a specific Build Config require specify a namespace name");
+ throw new IllegalArgumentException(
+ "Get a specific Build Config require specify a namespace name");
+ }
+ buildConfig = getEndpoint().getKubernetesClient().adapt(OpenShiftClient.class).buildConfigs()
+ .inNamespace(namespaceName).withName(buildConfigName).get();
+ exchange.getOut().setBody(buildConfig);
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/a452d0ac/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/producer/KubernetesBuildsProducer.java
----------------------------------------------------------------------
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/producer/KubernetesBuildsProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/producer/KubernetesBuildsProducer.java
new file mode 100644
index 0000000..bd54f32
--- /dev/null
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/producer/KubernetesBuildsProducer.java
@@ -0,0 +1,143 @@
+/**
+ * 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.Map;
+
+import io.fabric8.kubernetes.api.model.DoneablePersistentVolume;
+import io.fabric8.kubernetes.api.model.PersistentVolume;
+import io.fabric8.kubernetes.api.model.PersistentVolumeList;
+import io.fabric8.kubernetes.client.KubernetesClient;
+import io.fabric8.kubernetes.client.dsl.ClientNonNamespaceOperation;
+import io.fabric8.kubernetes.client.dsl.ClientOperation;
+import io.fabric8.kubernetes.client.dsl.ClientResource;
+import io.fabric8.openshift.api.model.Build;
+import io.fabric8.openshift.api.model.BuildList;
+import io.fabric8.openshift.api.model.DoneableBuild;
+import io.fabric8.openshift.client.OpenShiftClient;
+
+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 KubernetesBuildsProducer extends DefaultProducer {
+
+ private static final Logger LOG = LoggerFactory
+ .getLogger(KubernetesBuildsProducer.class);
+
+ public KubernetesBuildsProducer(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_BUILD:
+ doList(exchange, operation);
+ break;
+
+ case KubernetesOperations.LIST_BUILD_BY_LABELS_OPERATION:
+ doListBuildByLabels(exchange, operation);
+ break;
+
+ case KubernetesOperations.GET_BUILD_OPERATION:
+ doGetBuild(exchange, operation);
+ break;
+
+ default:
+ throw new IllegalArgumentException("Unsupported operation "
+ + operation);
+ }
+ }
+
+ protected void doList(Exchange exchange, String operation) throws Exception {
+ BuildList buildList = getEndpoint()
+ .getKubernetesClient().adapt(OpenShiftClient.class).builds().list();
+ exchange.getOut().setBody(buildList.getItems());
+ }
+
+ protected void doListBuildByLabels(Exchange exchange,
+ String operation) throws Exception {
+ BuildList buildList = null;
+ Map<String, String> labels = exchange.getIn().getHeader(
+ KubernetesConstants.KUBERNETES_BUILDS_LABELS,
+ Map.class);
+ String namespaceName = exchange.getIn().getHeader(
+ KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
+ if (!ObjectHelper.isEmpty(namespaceName)) {
+ ClientNonNamespaceOperation<OpenShiftClient, Build, BuildList, DoneableBuild, ClientResource<Build, DoneableBuild>> builds;
+ builds = getEndpoint().getKubernetesClient().adapt(OpenShiftClient.class).builds()
+ .inNamespace(namespaceName);
+ for (Map.Entry<String, String> entry : labels.entrySet()) {
+ builds.withLabel(entry.getKey(), entry.getValue());
+ }
+ buildList = builds.list();
+ } else {
+ ClientOperation<OpenShiftClient, Build, BuildList, DoneableBuild, ClientResource<Build, DoneableBuild>> builds;
+ builds = getEndpoint().getKubernetesClient().adapt(OpenShiftClient.class).builds();
+ for (Map.Entry<String, String> entry : labels.entrySet()) {
+ builds.withLabel(entry.getKey(), entry.getValue());
+ }
+ buildList = builds.list();
+ }
+ exchange.getOut().setBody(buildList.getItems());
+ }
+
+ protected void doGetBuild(Exchange exchange, String operation)
+ throws Exception {
+ Build build = null;
+ String buildName = exchange.getIn().getHeader(
+ KubernetesConstants.KUBERNETES_BUILD_NAME,
+ String.class);
+ String namespaceName = exchange.getIn().getHeader(
+ KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
+ if (ObjectHelper.isEmpty(buildName)) {
+ LOG.error("Get a specific Build require specify a Build name");
+ throw new IllegalArgumentException(
+ "Get a specific Build require specify a Build name");
+ }
+ if (ObjectHelper.isEmpty(namespaceName)) {
+ LOG.error("Get a specific Build require specify a namespace name");
+ throw new IllegalArgumentException(
+ "Get a specific Build require specify a namespace name");
+ }
+ build = getEndpoint().getKubernetesClient().adapt(OpenShiftClient.class).builds()
+ .inNamespace(namespaceName).withName(buildName).get();
+ exchange.getOut().setBody(build);
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/a452d0ac/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/producer/KubernetesNamespacesProducer.java
----------------------------------------------------------------------
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/producer/KubernetesNamespacesProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/producer/KubernetesNamespacesProducer.java
new file mode 100644
index 0000000..0db6cc5
--- /dev/null
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/producer/KubernetesNamespacesProducer.java
@@ -0,0 +1,159 @@
+/**
+ * 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.Map;
+
+import io.fabric8.kubernetes.api.model.DoneableNamespace;
+import io.fabric8.kubernetes.api.model.EditableNamespace;
+import io.fabric8.kubernetes.api.model.Namespace;
+import io.fabric8.kubernetes.api.model.NamespaceBuilder;
+import io.fabric8.kubernetes.api.model.NamespaceList;
+import io.fabric8.kubernetes.client.KubernetesClient;
+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 KubernetesNamespacesProducer extends DefaultProducer {
+
+ private static final Logger LOG = LoggerFactory
+ .getLogger(KubernetesNamespacesProducer.class);
+
+ public KubernetesNamespacesProducer(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_NAMESPACE_OPERATION:
+ doList(exchange, operation);
+ break;
+
+ case KubernetesOperations.LIST_NAMESPACE_BY_LABELS_OPERATION:
+ doListNamespaceByLabel(exchange, operation);
+ break;
+
+ case KubernetesOperations.GET_NAMESPACE_OPERATION:
+ doGetNamespace(exchange, operation);
+ break;
+
+ case KubernetesOperations.CREATE_NAMESPACE_OPERATION:
+ doCreateNamespace(exchange, operation);
+ break;
+
+ case KubernetesOperations.DELETE_NAMESPACE_OPERATION:
+ doDeleteNamespace(exchange, operation);
+ break;
+
+ default:
+ throw new IllegalArgumentException("Unsupported operation "
+ + operation);
+ }
+ }
+
+ protected void doList(Exchange exchange, String operation) throws Exception {
+ NamespaceList namespacesList = getEndpoint().getKubernetesClient()
+ .namespaces().list();
+ exchange.getOut().setBody(namespacesList.getItems());
+ }
+
+ protected void doListNamespaceByLabel(Exchange exchange, String operation) {
+ Map<String, String> labels = exchange.getIn().getHeader(
+ KubernetesConstants.KUBERNETES_NAMESPACE_LABELS, Map.class);
+ if (ObjectHelper.isEmpty(labels)) {
+ LOG.error("Get a specific namespace by labels require specify a labels set");
+ throw new IllegalArgumentException(
+ "Get a specific namespace by labels require specify a labels set");
+ }
+ ClientNonNamespaceOperation<KubernetesClient, Namespace, NamespaceList, DoneableNamespace, ClientResource<Namespace, DoneableNamespace>> namespaces;
+ namespaces = getEndpoint().getKubernetesClient().namespaces();
+ for (Map.Entry<String, String> entry : labels.entrySet()) {
+ namespaces.withLabel(entry.getKey(), entry.getValue());
+ }
+ NamespaceList namespace = namespaces.list();
+ exchange.getOut().setBody(namespace.getItems());
+ }
+
+ protected void doGetNamespace(Exchange exchange, String operation) {
+ String namespaceName = exchange.getIn().getHeader(
+ KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
+ if (ObjectHelper.isEmpty(namespaceName)) {
+ LOG.error("Get a specific namespace require specify a namespace name");
+ throw new IllegalArgumentException(
+ "Get a specific namespace require specify a namespace name");
+ }
+ Namespace namespace = getEndpoint().getKubernetesClient().namespaces()
+ .withName(namespaceName).get();
+ exchange.getOut().setBody(namespace);
+ }
+
+ protected void doCreateNamespace(Exchange exchange, String operation) {
+ String namespaceName = exchange.getIn().getHeader(
+ KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
+ if (ObjectHelper.isEmpty(namespaceName)) {
+ LOG.error("Create a specific namespace require specify a namespace name");
+ throw new IllegalArgumentException(
+ "Create a specific namespace require specify a namespace name");
+ }
+ Map<String, String> labels = exchange.getIn().getHeader(
+ KubernetesConstants.KUBERNETES_NAMESPACE_LABELS, Map.class);
+ EditableNamespace ns = new NamespaceBuilder().withNewMetadata()
+ .withName(namespaceName).withLabels(labels).endMetadata()
+ .build();
+ Namespace namespace = getEndpoint().getKubernetesClient().namespaces()
+ .create(ns);
+ exchange.getOut().setBody(namespace);
+ }
+
+ protected void doDeleteNamespace(Exchange exchange, String operation) {
+ String namespaceName = exchange.getIn().getHeader(
+ KubernetesConstants.KUBERNETES_NAMESPACE_NAME, String.class);
+ if (ObjectHelper.isEmpty(namespaceName)) {
+ LOG.error("Delete a specific namespace require specify a namespace name");
+ throw new IllegalArgumentException(
+ "Delete a specific namespace require specify a namespace name");
+ }
+ Boolean namespace = getEndpoint().getKubernetesClient().namespaces()
+ .withName(namespaceName).delete();
+ exchange.getOut().setBody(namespace);
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/a452d0ac/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/producer/KubernetesNodesProducer.java
----------------------------------------------------------------------
diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/producer/KubernetesNodesProducer.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/producer/KubernetesNodesProducer.java
new file mode 100644
index 0000000..cae957b
--- /dev/null
+++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/producer/KubernetesNodesProducer.java
@@ -0,0 +1,123 @@
+/**
+ * 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.Map;
+
+import io.fabric8.kubernetes.api.model.DoneableNode;
+import io.fabric8.kubernetes.api.model.DoneablePersistentVolume;
+import io.fabric8.kubernetes.api.model.Node;
+import io.fabric8.kubernetes.api.model.NodeList;
+import io.fabric8.kubernetes.api.model.PersistentVolume;
+import io.fabric8.kubernetes.api.model.PersistentVolumeList;
+import io.fabric8.kubernetes.client.KubernetesClient;
+import io.fabric8.kubernetes.client.dsl.ClientNonNamespaceOperation;
+import io.fabric8.kubernetes.client.dsl.ClientOperation;
+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 KubernetesNodesProducer extends DefaultProducer {
+
+ private static final Logger LOG = LoggerFactory
+ .getLogger(KubernetesNodesProducer.class);
+
+ public KubernetesNodesProducer(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_NODES:
+ doList(exchange, operation);
+ break;
+
+ case KubernetesOperations.LIST_NODES_BY_LABELS_OPERATION:
+ doListNodesByLabels(exchange, operation);
+ break;
+
+ case KubernetesOperations.GET_NODE_OPERATION:
+ doGetNode(exchange, operation);
+ break;
+
+ default:
+ throw new IllegalArgumentException("Unsupported operation "
+ + operation);
+ }
+ }
+
+ protected void doList(Exchange exchange, String operation) throws Exception {
+ NodeList nodeList = getEndpoint()
+ .getKubernetesClient().nodes().list();
+ exchange.getOut().setBody(nodeList.getItems());
+ }
+
+ protected void doListNodesByLabels(Exchange exchange,
+ String operation) throws Exception {
+ NodeList nodeList = null;
+ Map<String, String> labels = exchange.getIn().getHeader(
+ KubernetesConstants.KUBERNETES_NODES_LABELS,
+ Map.class);
+ ClientNonNamespaceOperation<KubernetesClient, Node, NodeList, DoneableNode, ClientResource<Node, DoneableNode>> nodes;
+ nodes = getEndpoint().getKubernetesClient().nodes();
+ for (Map.Entry<String, String> entry : labels.entrySet()) {
+ nodes.withLabel(entry.getKey(), entry.getValue());
+ }
+ nodeList = nodes.list();
+ exchange.getOut().setBody(nodeList.getItems());
+ }
+
+ protected void doGetNode(Exchange exchange, String operation)
+ throws Exception {
+ Node node = null;
+ String pvName = exchange.getIn().getHeader(
+ KubernetesConstants.KUBERNETES_NODE_NAME,
+ String.class);
+ if (ObjectHelper.isEmpty(pvName)) {
+ LOG.error("Get a specific Node require specify a Node name");
+ throw new IllegalArgumentException(
+ "Get a specific Node require specify a Node name");
+ }
+ node = getEndpoint().getKubernetesClient().nodes().withName(pvName).get();
+
+ exchange.getOut().setBody(node);
+ }
+}