Please also update the NOTICE.txt file as required by [1], because the openshift-java-client is using the EPL-1.0 license.
[1] https://www.apache.org/legal/3party.html#category-b [2] http://search.maven.org/#artifactdetails|com.openshift|openshift-java-client|2.5.0.Final|jar Best, Christian ----------------- Software Integration Specialist Apache Member V.P. Apache Camel | Apache Camel PMC Member | Apache Camel committer Apache Incubator PMC Member https://www.linkedin.com/pub/christian-mueller/11/551/642 On Tue, Apr 22, 2014 at 6:20 PM, <davscl...@apache.org> wrote: > Repository: camel > Updated Branches: > refs/heads/master c1214efb7 -> 189980693 > > > CAMEL-7386: camel-openshift component. > > > Project: http://git-wip-us.apache.org/repos/asf/camel/repo > Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/18998069 > Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/18998069 > Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/18998069 > > Branch: refs/heads/master > Commit: 1899806936c463868d1b843c0240772073de7198 > Parents: c1214ef > Author: Claus Ibsen <davscl...@apache.org> > Authored: Tue Apr 22 18:18:49 2014 +0200 > Committer: Claus Ibsen <davscl...@apache.org> > Committed: Tue Apr 22 18:19:31 2014 +0200 > > ---------------------------------------------------------------------- > apache-camel/pom.xml | 4 + > .../src/main/descriptors/common-bin.xml | 1 + > components/camel-openshift/pom.xml | 67 ++++++ > .../component/openshift/OpenShiftComponent.java | 69 ++++++ > .../component/openshift/OpenShiftConstants.java | 26 +++ > .../component/openshift/OpenShiftEndpoint.java | 106 +++++++++ > .../component/openshift/OpenShiftOperation.java | 23 ++ > .../component/openshift/OpenShiftProducer.java | 231 +++++++++++++++++++ > .../src/main/resources/META-INF/LICENSE.txt | 203 ++++++++++++++++ > .../src/main/resources/META-INF/NOTICE.txt | 11 + > .../org/apache/camel/component/openshift | 18 ++ > .../OpenShiftListApplicationsTest.java | 60 +++++ > .../component/openshift/OpenShiftStateTest.java | 62 +++++ > .../src/test/resources/log4j.properties | 41 ++++ > components/pom.xml | 1 + > parent/pom.xml | 6 + > .../features/src/main/resources/features.xml | 5 + > .../camel/itest/karaf/CamelOpenshiftTest.java | 40 ++++ > 18 files changed, 974 insertions(+) > ---------------------------------------------------------------------- > > > > http://git-wip-us.apache.org/repos/asf/camel/blob/18998069/apache-camel/pom.xml > ---------------------------------------------------------------------- > diff --git a/apache-camel/pom.xml b/apache-camel/pom.xml > index dce9c39..ce59468 100644 > --- a/apache-camel/pom.xml > +++ b/apache-camel/pom.xml > @@ -436,6 +436,10 @@ > </dependency> > <dependency> > <groupId>org.apache.camel</groupId> > + <artifactId>camel-openshift</artifactId> > + </dependency> > + <dependency> > + <groupId>org.apache.camel</groupId> > <artifactId>camel-optaplanner</artifactId> > </dependency> > <dependency> > > > http://git-wip-us.apache.org/repos/asf/camel/blob/18998069/apache-camel/src/main/descriptors/common-bin.xml > ---------------------------------------------------------------------- > diff --git a/apache-camel/src/main/descriptors/common-bin.xml > b/apache-camel/src/main/descriptors/common-bin.xml > index a0b5996..a544060 100644 > --- a/apache-camel/src/main/descriptors/common-bin.xml > +++ b/apache-camel/src/main/descriptors/common-bin.xml > @@ -120,6 +120,7 @@ > <include>org.apache.camel:camel-netty</include> > <include>org.apache.camel:camel-netty-http</include> > <include>org.apache.camel:camel-ognl</include> > + <include>org.apache.camel:camel-openshift</include> > <include>org.apache.camel:camel-optaplanner</include> > <include>org.apache.camel:camel-paxlogging</include> > <include>org.apache.camel:camel-printer</include> > > > http://git-wip-us.apache.org/repos/asf/camel/blob/18998069/components/camel-openshift/pom.xml > ---------------------------------------------------------------------- > diff --git a/components/camel-openshift/pom.xml > b/components/camel-openshift/pom.xml > new file mode 100644 > index 0000000..a2c897b > --- /dev/null > +++ b/components/camel-openshift/pom.xml > @@ -0,0 +1,67 @@ > +<?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.14-SNAPSHOT</version> > + </parent> > + > + <artifactId>camel-openshift</artifactId> > + <packaging>bundle</packaging> > + <name>Camel :: OpenShift</name> > + <description>Camel OpenShift support</description> > + > + <properties> > + > > <camel.osgi.export.pkg>org.apache.camel.component.openshift.*</camel.osgi.export.pkg> > + > > <camel.osgi.export.service>org.apache.camel.spi.ComponentResolver;component=openshift</camel.osgi.export.service> > + </properties> > + > + <dependencies> > + > + <dependency> > + <groupId>org.apache.camel</groupId> > + <artifactId>camel-core</artifactId> > + </dependency> > + <dependency> > + <groupId>com.openshift</groupId> > + <artifactId>openshift-java-client</artifactId> > + <version>${openshift-java-client-version}</version> > + </dependency> > + > + <!-- testing --> > + <dependency> > + <groupId>org.apache.camel</groupId> > + <artifactId>camel-test</artifactId> > + <scope>test</scope> > + </dependency> > + <dependency> > + <groupId>junit</groupId> > + <artifactId>junit</artifactId> > + <scope>test</scope> > + </dependency> > + <dependency> > + <groupId>org.slf4j</groupId> > + <artifactId>slf4j-log4j12</artifactId> > + <scope>test</scope> > + </dependency> > + </dependencies> > + > +</project> > > > http://git-wip-us.apache.org/repos/asf/camel/blob/18998069/components/camel-openshift/src/main/java/org/apache/camel/component/openshift/OpenShiftComponent.java > ---------------------------------------------------------------------- > diff --git > a/components/camel-openshift/src/main/java/org/apache/camel/component/openshift/OpenShiftComponent.java > b/components/camel-openshift/src/main/java/org/apache/camel/component/openshift/OpenShiftComponent.java > new file mode 100644 > index 0000000..2883c5d > --- /dev/null > +++ > b/components/camel-openshift/src/main/java/org/apache/camel/component/openshift/OpenShiftComponent.java > @@ -0,0 +1,69 @@ > +/** > + * 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.openshift; > + > +import java.util.Map; > + > +import org.apache.camel.Endpoint; > +import org.apache.camel.impl.UriEndpointComponent; > + > +public class OpenShiftComponent extends UriEndpointComponent { > + > + private String username; > + private String password; > + private String domain; > + > + public OpenShiftComponent() { > + super(OpenShiftEndpoint.class); > + } > + > + protected Endpoint createEndpoint(String uri, String remaining, > Map<String, Object> parameters) throws Exception { > + String clientId = remaining; > + > + OpenShiftEndpoint endpoint = new OpenShiftEndpoint(uri, this); > + endpoint.setClientId(clientId); > + endpoint.setUsername(getUsername()); > + endpoint.setPassword(getPassword()); > + endpoint.setDomain(getDomain()); > + setProperties(endpoint, parameters); > + return endpoint; > + } > + > + public String getUsername() { > + return username; > + } > + > + public void setUsername(String username) { > + this.username = username; > + } > + > + public String getPassword() { > + return password; > + } > + > + public void setPassword(String password) { > + this.password = password; > + } > + > + public String getDomain() { > + return domain; > + } > + > + public void setDomain(String domain) { > + this.domain = domain; > + } > +} > > > http://git-wip-us.apache.org/repos/asf/camel/blob/18998069/components/camel-openshift/src/main/java/org/apache/camel/component/openshift/OpenShiftConstants.java > ---------------------------------------------------------------------- > diff --git > a/components/camel-openshift/src/main/java/org/apache/camel/component/openshift/OpenShiftConstants.java > b/components/camel-openshift/src/main/java/org/apache/camel/component/openshift/OpenShiftConstants.java > new file mode 100644 > index 0000000..dcbabbf > --- /dev/null > +++ > b/components/camel-openshift/src/main/java/org/apache/camel/component/openshift/OpenShiftConstants.java > @@ -0,0 +1,26 @@ > +/** > + * 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.openshift; > + > +public final class OpenShiftConstants { > + > + public static final String OPERATION = "CamelOpenShiftOperation"; > + public static final String APPLICATION = "CamelOpenShiftApplication"; > + > + private OpenShiftConstants() { > + } > +} > > > http://git-wip-us.apache.org/repos/asf/camel/blob/18998069/components/camel-openshift/src/main/java/org/apache/camel/component/openshift/OpenShiftEndpoint.java > ---------------------------------------------------------------------- > diff --git > a/components/camel-openshift/src/main/java/org/apache/camel/component/openshift/OpenShiftEndpoint.java > b/components/camel-openshift/src/main/java/org/apache/camel/component/openshift/OpenShiftEndpoint.java > new file mode 100644 > index 0000000..a583cf6 > --- /dev/null > +++ > b/components/camel-openshift/src/main/java/org/apache/camel/component/openshift/OpenShiftEndpoint.java > @@ -0,0 +1,106 @@ > +/** > + * 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.openshift; > + > +import org.apache.camel.Component; > +import org.apache.camel.Consumer; > +import org.apache.camel.Processor; > +import org.apache.camel.Producer; > +import org.apache.camel.impl.DefaultEndpoint; > +import org.apache.camel.spi.UriEndpoint; > +import org.apache.camel.util.ObjectHelper; > + > +@UriEndpoint(scheme = "openshift") > +public class OpenShiftEndpoint extends DefaultEndpoint { > + > + private String username; > + private String password; > + private String clientId; > + private String domain; > + private OpenShiftOperation operation; > + private String application; > + > + public OpenShiftEndpoint(String endpointUri, Component component) { > + super(endpointUri, component); > + } > + > + @Override > + public Producer createProducer() throws Exception { > + ObjectHelper.notEmpty(clientId, "clientId", this); > + ObjectHelper.notEmpty(username, "username", this); > + ObjectHelper.notEmpty(password, "password", this); > + return new OpenShiftProducer(this); > + } > + > + @Override > + public Consumer createConsumer(Processor processor) throws Exception { > + throw new UnsupportedOperationException("Consumer not supported > on this component"); > + } > + > + @Override > + public boolean isSingleton() { > + return true; > + } > + > + public String getUsername() { > + return username; > + } > + > + public void setUsername(String username) { > + this.username = username; > + } > + > + public String getPassword() { > + return password; > + } > + > + public void setPassword(String password) { > + this.password = password; > + } > + > + public String getClientId() { > + return clientId; > + } > + > + public void setClientId(String clientId) { > + this.clientId = clientId; > + } > + > + public String getDomain() { > + return domain; > + } > + > + public void setDomain(String domain) { > + this.domain = domain; > + } > + > + public OpenShiftOperation getOperation() { > + return operation; > + } > + > + public void setOperation(OpenShiftOperation operation) { > + this.operation = operation; > + } > + > + public String getApplication() { > + return application; > + } > + > + public void setApplication(String application) { > + this.application = application; > + } > +} > > > http://git-wip-us.apache.org/repos/asf/camel/blob/18998069/components/camel-openshift/src/main/java/org/apache/camel/component/openshift/OpenShiftOperation.java > ---------------------------------------------------------------------- > diff --git > a/components/camel-openshift/src/main/java/org/apache/camel/component/openshift/OpenShiftOperation.java > b/components/camel-openshift/src/main/java/org/apache/camel/component/openshift/OpenShiftOperation.java > new file mode 100644 > index 0000000..2fd7b8d > --- /dev/null > +++ > b/components/camel-openshift/src/main/java/org/apache/camel/component/openshift/OpenShiftOperation.java > @@ -0,0 +1,23 @@ > +/** > + * 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.openshift; > + > +public enum OpenShiftOperation { > + > + list, start, stop, restart, state > + > +} > > > http://git-wip-us.apache.org/repos/asf/camel/blob/18998069/components/camel-openshift/src/main/java/org/apache/camel/component/openshift/OpenShiftProducer.java > ---------------------------------------------------------------------- > diff --git > a/components/camel-openshift/src/main/java/org/apache/camel/component/openshift/OpenShiftProducer.java > b/components/camel-openshift/src/main/java/org/apache/camel/component/openshift/OpenShiftProducer.java > new file mode 100644 > index 0000000..74e35a2 > --- /dev/null > +++ > b/components/camel-openshift/src/main/java/org/apache/camel/component/openshift/OpenShiftProducer.java > @@ -0,0 +1,231 @@ > +/** > + * 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.openshift; > + > +import java.text.SimpleDateFormat; > +import java.util.Iterator; > +import java.util.List; > +import java.util.Locale; > + > +import com.openshift.client.IApplication; > +import com.openshift.client.IDomain; > +import com.openshift.client.IGear; > +import com.openshift.client.IGearGroup; > +import com.openshift.client.IOpenShiftConnection; > +import com.openshift.client.IUser; > +import com.openshift.client.OpenShiftConnectionFactory; > +import com.openshift.client.cartridge.IEmbeddedCartridge; > +import com.openshift.client.configuration.OpenShiftConfiguration; > +import org.apache.camel.CamelExchangeException; > +import org.apache.camel.Endpoint; > +import org.apache.camel.Exchange; > +import org.apache.camel.impl.DefaultProducer; > + > +public class OpenShiftProducer extends DefaultProducer { > + > + public static final String TIMESTAMP_FORMAT = > "yyyy-MM-dd'T'HH:mm:ss.SSSZ"; > + > + public OpenShiftProducer(Endpoint endpoint) { > + super(endpoint); > + } > + > + @Override > + public OpenShiftEndpoint getEndpoint() { > + return (OpenShiftEndpoint) super.getEndpoint(); > + } > + > + @Override > + public void process(Exchange exchange) throws Exception { > + String openshiftServer = new > OpenShiftConfiguration().getLibraServer(); > + > + IOpenShiftConnection connection = > + new > OpenShiftConnectionFactory().getConnection(getEndpoint().getClientId(), > getEndpoint().getUsername(), getEndpoint().getPassword(), openshiftServer); > + > + IUser user = connection.getUser(); > + > + IDomain domain; > + if (getEndpoint().getDomain() != null) { > + domain = user.getDomain(getEndpoint().getDomain()); > + } else { > + domain = user.getDefaultDomain(); > + } > + if (domain == null) { > + throw new CamelExchangeException("User has no domain with id > " + getEndpoint().getDomain(), exchange); > + } > + > + OpenShiftOperation operation = > exchange.getIn().getHeader(OpenShiftConstants.OPERATION, > getEndpoint().getOperation(), OpenShiftOperation.class); > + > + switch (operation) { > + case list: > + doList(exchange, domain); > + break; > + case start: > + doStart(exchange, domain); > + break; > + case stop: > + doStop(exchange, domain); > + break; > + case restart: > + doRestart(exchange, domain); > + break; > + case state: > + doState(exchange, domain); > + break; > + default: > + // and do list by default > + doList(exchange, domain); > + break; > + } > + } > + > + protected void doList(Exchange exchange, IDomain domain) { > + StringBuilder sb = new StringBuilder("{\n \"applications\": ["); > + > + boolean first = true; > + for (IApplication application : domain.getApplications()) { > + if (!first) { > + sb.append("\n ],"); > + } else { > + first = false; > + } > + > + String date = new > SimpleDateFormat(TIMESTAMP_FORMAT).format(application.getCreationTime()); > + > + // application > + sb.append("\n {"); > + sb.append("\n \"uuid\": \"" + application.getUUID() + > "\","); > + sb.append("\n \"domain\": \"" + > application.getDomain().getId() + "\","); > + sb.append("\n \"name\": \"" + application.getName() + > "\","); > + sb.append("\n \"creationTime\": \"" + date + "\","); > + sb.append("\n \"applicationUrl\": \"" + > application.getApplicationUrl() + "\","); > + sb.append("\n \"gitUrl\": \"" + application.getGitUrl() > + "\","); > + sb.append("\n \"sshUrl\": \"" + application.getSshUrl() > + "\","); > + > + // catridge > + sb.append("\n \"catridge\": {"); > + sb.append("\n \"name\": \"" + > application.getCartridge().getName() + "\","); > + sb.append("\n \"displayName\": \"" + > application.getCartridge().getDisplayName() + "\","); > + sb.append("\n \"description\": \"" + > application.getCartridge().getDescription() + "\""); > + sb.append("\n },"); > + > + // embedded catridges > + List<IEmbeddedCartridge> embeddedCartridges = > application.getEmbeddedCartridges(); > + if (embeddedCartridges != null && > !embeddedCartridges.isEmpty()) { > + sb.append("\n \"embeddedCatridges\": ["); > + for (Iterator<IEmbeddedCartridge> it = > embeddedCartridges.iterator(); it.hasNext();) { > + IEmbeddedCartridge cartridge = it.next(); > + sb.append("\n \"catridge\": {"); > + sb.append("\n \"name\": \"" + > cartridge.getName() + "\","); > + sb.append("\n \"displayName\": \"" + > cartridge.getDisplayName() + "\","); > + sb.append("\n \"description\": \"" + > cartridge.getDescription() + "\""); > + sb.append("\n }"); > + if (it.hasNext()) { > + sb.append(","); > + } > + } > + sb.append("\n ]"); > + } > + > + sb.append("\n \"gearProfile\": \"" + > application.getGearProfile().getName() + "\","); > + sb.append("\n \"gears\": ["); > + boolean firstGear = true; > + for (IGearGroup group : application.getGearGroups()) { > + for (IGear gear : group.getGears()) { > + if (!firstGear) { > + sb.append(","); > + } else { > + firstGear = false; > + } > + sb.append("\n {"); > + sb.append("\n \"id\": \"" + gear.getId() + > "\","); > + sb.append("\n \"sshUrl\": \"" + > gear.getSshUrl() + "\","); > + sb.append("\n \"state\": \"" + > gear.getState().name().toLowerCase(Locale.ENGLISH) + "\""); > + sb.append("\n }"); > + } > + } > + sb.append("\n ]"); > + sb.append("\n }"); > + } > + sb.append("\n ]"); > + sb.append("\n}"); > + > + exchange.getIn().setBody(sb.toString()); > + } > + > + protected void doStart(Exchange exchange, IDomain domain) throws > CamelExchangeException { > + String name = > exchange.getIn().getHeader(OpenShiftConstants.APPLICATION, > getEndpoint().getApplication(), String.class); > + if (name == null) { > + throw new CamelExchangeException("Application not specified", > exchange); > + } > + > + IApplication app = domain.getApplicationByName(name); > + if (app == null) { > + throw new CamelExchangeException("Application with id " + > name + " not found.", exchange); > + } else { > + app.start(); > + } > + } > + > + protected void doStop(Exchange exchange, IDomain domain) throws > CamelExchangeException { > + String name = > exchange.getIn().getHeader(OpenShiftConstants.APPLICATION, > getEndpoint().getApplication(), String.class); > + if (name == null) { > + throw new CamelExchangeException("Application not specified", > exchange); > + } > + > + IApplication app = domain.getApplicationByName(name); > + if (app == null) { > + throw new CamelExchangeException("Application with id " + > name + " not found.", exchange); > + } else { > + app.stop(); > + } > + } > + > + protected void doRestart(Exchange exchange, IDomain domain) throws > CamelExchangeException { > + String name = > exchange.getIn().getHeader(OpenShiftConstants.APPLICATION, > getEndpoint().getApplication(), String.class); > + if (name == null) { > + throw new CamelExchangeException("Application not specified", > exchange); > + } > + > + IApplication app = domain.getApplicationByName(name); > + if (app == null) { > + throw new CamelExchangeException("Application with id " + > name + " not found.", exchange); > + } else { > + app.restart(); > + } > + } > + > + protected void doState(Exchange exchange, IDomain domain) throws > CamelExchangeException { > + String name = > exchange.getIn().getHeader(OpenShiftConstants.APPLICATION, > getEndpoint().getApplication(), String.class); > + if (name == null) { > + throw new CamelExchangeException("Application not specified", > exchange); > + } > + > + IApplication app = domain.getApplicationByName(name); > + if (app == null) { > + throw new CamelExchangeException("Application with id " + > name + " not found.", exchange); > + } else { > + for (IGearGroup group : app.getGearGroups()) { > + for (IGear gear : group.getGears()) { > + String state = > gear.getState().name().toLowerCase(Locale.ENGLISH); > + exchange.getIn().setBody(state); > + break; > + } > + } > + } > + } > + > +} > > > http://git-wip-us.apache.org/repos/asf/camel/blob/18998069/components/camel-openshift/src/main/resources/META-INF/LICENSE.txt > ---------------------------------------------------------------------- > diff --git > a/components/camel-openshift/src/main/resources/META-INF/LICENSE.txt > b/components/camel-openshift/src/main/resources/META-INF/LICENSE.txt > new file mode 100644 > index 0000000..6b0b127 > --- /dev/null > +++ b/components/camel-openshift/src/main/resources/META-INF/LICENSE.txt > @@ -0,0 +1,203 @@ > + > + Apache License > + Version 2.0, January 2004 > + http://www.apache.org/licenses/ > + > + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION > + > + 1. Definitions. > + > + "License" shall mean the terms and conditions for use, reproduction, > + and distribution as defined by Sections 1 through 9 of this > document. > + > + "Licensor" shall mean the copyright owner or entity authorized by > + the copyright owner that is granting the License. > + > + "Legal Entity" shall mean the union of the acting entity and all > + other entities that control, are controlled by, or are under common > + control with that entity. For the purposes of this definition, > + "control" means (i) the power, direct or indirect, to cause the > + direction or management of such entity, whether by contract or > + otherwise, or (ii) ownership of fifty percent (50%) or more of the > + outstanding shares, or (iii) beneficial ownership of such entity. > + > + "You" (or "Your") shall mean an individual or Legal Entity > + exercising permissions granted by this License. > + > + "Source" form shall mean the preferred form for making > modifications, > + including but not limited to software source code, documentation > + source, and configuration files. > + > + "Object" form shall mean any form resulting from mechanical > + transformation or translation of a Source form, including but > + not limited to compiled object code, generated documentation, > + and conversions to other media types. > + > + "Work" shall mean the work of authorship, whether in Source or > + Object form, made available under the License, as indicated by a > + copyright notice that is included in or attached to the work > + (an example is provided in the Appendix below). > + > + "Derivative Works" shall mean any work, whether in Source or Object > + form, that is based on (or derived from) the Work and for which the > + editorial revisions, annotations, elaborations, or other > modifications > + represent, as a whole, an original work of authorship. For the > purposes > + of this License, Derivative Works shall not include works that > remain > + separable from, or merely link (or bind by name) to the interfaces > of, > + the Work and Derivative Works thereof. > + > + "Contribution" shall mean any work of authorship, including > + the original version of the Work and any modifications or additions > + to that Work or Derivative Works thereof, that is intentionally > + submitted to Licensor for inclusion in the Work by the copyright > owner > + or by an individual or Legal Entity authorized to submit on behalf > of > + the copyright owner. For the purposes of this definition, > "submitted" > + means any form of electronic, verbal, or written communication sent > + to the Licensor or its representatives, including but not limited to > + communication on electronic mailing lists, source code control > systems, > + and issue tracking systems that are managed by, or on behalf of, the > + Licensor for the purpose of discussing and improving the Work, but > + excluding communication that is conspicuously marked or otherwise > + designated in writing by the copyright owner as "Not a > Contribution." > + > + "Contributor" shall mean Licensor and any individual or Legal Entity > + on behalf of whom a Contribution has been received by Licensor and > + subsequently incorporated within the Work. > + > + 2. Grant of Copyright License. Subject to the terms and conditions of > + this License, each Contributor hereby grants to You a perpetual, > + worldwide, non-exclusive, no-charge, royalty-free, irrevocable > + copyright license to reproduce, prepare Derivative Works of, > + publicly display, publicly perform, sublicense, and distribute the > + Work and such Derivative Works in Source or Object form. > + > + 3. Grant of Patent License. Subject to the terms and conditions of > + this License, each Contributor hereby grants to You a perpetual, > + worldwide, non-exclusive, no-charge, royalty-free, irrevocable > + (except as stated in this section) patent license to make, have > made, > + use, offer to sell, sell, import, and otherwise transfer the Work, > + where such license applies only to those patent claims licensable > + by such Contributor that are necessarily infringed by their > + Contribution(s) alone or by combination of their Contribution(s) > + with the Work to which such Contribution(s) was submitted. If You > + institute patent litigation against any entity (including a > + cross-claim or counterclaim in a lawsuit) alleging that the Work > + or a Contribution incorporated within the Work constitutes direct > + or contributory patent infringement, then any patent licenses > + granted to You under this License for that Work shall terminate > + as of the date such litigation is filed. > + > + 4. Redistribution. You may reproduce and distribute copies of the > + Work or Derivative Works thereof in any medium, with or without > + modifications, and in Source or Object form, provided that You > + meet the following conditions: > + > + (a) You must give any other recipients of the Work or > + Derivative Works a copy of this License; and > + > + (b) You must cause any modified files to carry prominent notices > + stating that You changed the files; and > + > + (c) You must retain, in the Source form of any Derivative Works > + that You distribute, all copyright, patent, trademark, and > + attribution notices from the Source form of the Work, > + excluding those notices that do not pertain to any part of > + the Derivative Works; and > + > + (d) If the Work includes a "NOTICE" text file as part of its > + distribution, then any Derivative Works that You distribute must > + include a readable copy of the attribution notices contained > + within such NOTICE file, excluding those notices that do not > + pertain to any part of the Derivative Works, in at least one > + of the following places: within a NOTICE text file distributed > + as part of the Derivative Works; within the Source form or > + documentation, if provided along with the Derivative Works; or, > + within a display generated by the Derivative Works, if and > + wherever such third-party notices normally appear. The contents > + of the NOTICE file are for informational purposes only and > + do not modify the License. You may add Your own attribution > + notices within Derivative Works that You distribute, alongside > + or as an addendum to the NOTICE text from the Work, provided > + that such additional attribution notices cannot be construed > + as modifying the License. > + > + You may add Your own copyright statement to Your modifications and > + may provide additional or different license terms and conditions > + for use, reproduction, or distribution of Your modifications, or > + for any such Derivative Works as a whole, provided Your use, > + reproduction, and distribution of the Work otherwise complies with > + the conditions stated in this License. > + > + 5. Submission of Contributions. Unless You explicitly state otherwise, > + any Contribution intentionally submitted for inclusion in the Work > + by You to the Licensor shall be under the terms and conditions of > + this License, without any additional terms or conditions. > + Notwithstanding the above, nothing herein shall supersede or modify > + the terms of any separate license agreement you may have executed > + with Licensor regarding such Contributions. > + > + 6. Trademarks. This License does not grant permission to use the trade > + names, trademarks, service marks, or product names of the Licensor, > + except as required for reasonable and customary use in describing > the > + origin of the Work and reproducing the content of the NOTICE file. > + > + 7. Disclaimer of Warranty. Unless required by applicable law or > + agreed to in writing, Licensor provides the Work (and each > + Contributor provides its Contributions) on an "AS IS" BASIS, > + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or > + implied, including, without limitation, any warranties or conditions > + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A > + PARTICULAR PURPOSE. You are solely responsible for determining the > + appropriateness of using or redistributing the Work and assume any > + risks associated with Your exercise of permissions under this > License. > + > + 8. Limitation of Liability. In no event and under no legal theory, > + whether in tort (including negligence), contract, or otherwise, > + unless required by applicable law (such as deliberate and grossly > + negligent acts) or agreed to in writing, shall any Contributor be > + liable to You for damages, including any direct, indirect, special, > + incidental, or consequential damages of any character arising as a > + result of this License or out of the use or inability to use the > + Work (including but not limited to damages for loss of goodwill, > + work stoppage, computer failure or malfunction, or any and all > + other commercial damages or losses), even if such Contributor > + has been advised of the possibility of such damages. > + > + 9. Accepting Warranty or Additional Liability. While redistributing > + the Work or Derivative Works thereof, You may choose to offer, > + and charge a fee for, acceptance of support, warranty, indemnity, > + or other liability obligations and/or rights consistent with this > + License. However, in accepting such obligations, You may act only > + on Your own behalf and on Your sole responsibility, not on behalf > + of any other Contributor, and only if You agree to indemnify, > + defend, and hold each Contributor harmless for any liability > + incurred by, or claims asserted against, such Contributor by reason > + of your accepting any such warranty or additional liability. > + > + END OF TERMS AND CONDITIONS > + > + APPENDIX: How to apply the Apache License to your work. > + > + To apply the Apache License to your work, attach the following > + boilerplate notice, with the fields enclosed by brackets "[]" > + replaced with your own identifying information. (Don't include > + the brackets!) The text should be enclosed in the appropriate > + comment syntax for the file format. We also recommend that a > + file or class name and description of purpose be included on the > + same "printed page" as the copyright notice for easier > + identification within third-party archives. > + > + Copyright [yyyy] [name of copyright owner] > + > + Licensed 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. > + > > > http://git-wip-us.apache.org/repos/asf/camel/blob/18998069/components/camel-openshift/src/main/resources/META-INF/NOTICE.txt > ---------------------------------------------------------------------- > diff --git > a/components/camel-openshift/src/main/resources/META-INF/NOTICE.txt > b/components/camel-openshift/src/main/resources/META-INF/NOTICE.txt > new file mode 100644 > index 0000000..2e215bf > --- /dev/null > +++ b/components/camel-openshift/src/main/resources/META-INF/NOTICE.txt > @@ -0,0 +1,11 @@ > + > ========================================================================= > + == NOTICE file corresponding to the section 4 d of > == > + == the Apache License, Version 2.0, > == > + == in this case for the Apache Camel distribution. > == > + > ========================================================================= > + > + This product includes software developed by > + The Apache Software Foundation (http://www.apache.org/). > + > + Please read the different LICENSE files present in the licenses > directory of > + this distribution. > > > http://git-wip-us.apache.org/repos/asf/camel/blob/18998069/components/camel-openshift/src/main/resources/META-INF/services/org/apache/camel/component/openshift > ---------------------------------------------------------------------- > diff --git > a/components/camel-openshift/src/main/resources/META-INF/services/org/apache/camel/component/openshift > b/components/camel-openshift/src/main/resources/META-INF/services/org/apache/camel/component/openshift > new file mode 100644 > index 0000000..9051897 > --- /dev/null > +++ > b/components/camel-openshift/src/main/resources/META-INF/services/org/apache/camel/component/openshift > @@ -0,0 +1,18 @@ > +# > +# 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. > +# > + > +class=org.apache.camel.component.openshift.OpenShiftComponent > > > http://git-wip-us.apache.org/repos/asf/camel/blob/18998069/components/camel-openshift/src/test/java/org/apache/camel/component/openshift/OpenShiftListApplicationsTest.java > ---------------------------------------------------------------------- > diff --git > a/components/camel-openshift/src/test/java/org/apache/camel/component/openshift/OpenShiftListApplicationsTest.java > b/components/camel-openshift/src/test/java/org/apache/camel/component/openshift/OpenShiftListApplicationsTest.java > new file mode 100644 > index 0000000..a8b4e2c > --- /dev/null > +++ > b/components/camel-openshift/src/test/java/org/apache/camel/component/openshift/OpenShiftListApplicationsTest.java > @@ -0,0 +1,60 @@ > +/** > + * 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.openshift; > + > +import org.apache.camel.builder.RouteBuilder; > +import org.apache.camel.test.junit4.CamelTestSupport; > +import org.junit.Test; > + > +public class OpenShiftListApplicationsTest extends CamelTestSupport { > + > + private String username; > + private String password; > + > + @Override > + public void setUp() throws Exception { > + // INSERT credentials here > + username = null; > + password = null; > + super.setUp(); > + } > + > + @Test > + public void testListApplications() throws Exception { > + if (username == null) { > + return; > + } > + > + getMockEndpoint("mock:result").expectedMessageCount(1); > + > + template.sendBody("direct:start", "Hello World"); > + > + assertMockEndpointsSatisfied(); > + } > + > + @Override > + protected RouteBuilder createRouteBuilder() throws Exception { > + return new RouteBuilder() { > + @Override > + public void configure() throws Exception { > + from("direct:start") > + > .toF("openshift:myApp?operation=list&username=%s&password=%s", username, > password) > + .to("mock:result"); > + } > + }; > + } > +} > > > http://git-wip-us.apache.org/repos/asf/camel/blob/18998069/components/camel-openshift/src/test/java/org/apache/camel/component/openshift/OpenShiftStateTest.java > ---------------------------------------------------------------------- > diff --git > a/components/camel-openshift/src/test/java/org/apache/camel/component/openshift/OpenShiftStateTest.java > b/components/camel-openshift/src/test/java/org/apache/camel/component/openshift/OpenShiftStateTest.java > new file mode 100644 > index 0000000..c57992e > --- /dev/null > +++ > b/components/camel-openshift/src/test/java/org/apache/camel/component/openshift/OpenShiftStateTest.java > @@ -0,0 +1,62 @@ > +/** > + * 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.openshift; > + > +import org.apache.camel.builder.RouteBuilder; > +import org.apache.camel.test.junit4.CamelTestSupport; > +import org.junit.Test; > + > +public class OpenShiftStateTest extends CamelTestSupport { > + > + private String username; > + private String password; > + private String application; > + > + @Override > + public void setUp() throws Exception { > + // INSERT credentials here > + username = null; > + password = null; > + application = "myapp"; > + super.setUp(); > + } > + > + @Test > + public void testState() throws Exception { > + if (username == null) { > + return; > + } > + > + getMockEndpoint("mock:result").expectedBodiesReceived("started"); > + > + template.sendBody("direct:start", "Hello World"); > + > + assertMockEndpointsSatisfied(); > + } > + > + @Override > + protected RouteBuilder createRouteBuilder() throws Exception { > + return new RouteBuilder() { > + @Override > + public void configure() throws Exception { > + from("direct:start") > + > > .toF("openshift:myApp?operation=state&application=%s&username=%s&password=%s", > application, username, password) > + .to("mock:result"); > + } > + }; > + } > +} > > > http://git-wip-us.apache.org/repos/asf/camel/blob/18998069/components/camel-openshift/src/test/resources/log4j.properties > ---------------------------------------------------------------------- > diff --git > a/components/camel-openshift/src/test/resources/log4j.properties > b/components/camel-openshift/src/test/resources/log4j.properties > new file mode 100644 > index 0000000..7127791 > --- /dev/null > +++ b/components/camel-openshift/src/test/resources/log4j.properties > @@ -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. > +## > ------------------------------------------------------------------------ > + > +# > +# The logging properties used for testing. > +# > +log4j.rootLogger=INFO, file > + > +# uncomment the following to enable camel debugging > +#log4j.logger.org.apache.camel.component.openshift=TRACE > + > +# CONSOLE appender not used by default > +log4j.appender.out=org.apache.log4j.ConsoleAppender > +log4j.appender.out.layout=org.apache.log4j.PatternLayout > +log4j.appender.out.layout.ConversionPattern=%d [%-15.15t] %-5p > %-30.30c{1} - %m%n > +# MDC > +#log4j.appender.out.layout.ConversionPattern=%d [%-15.15t] %-5p > %-30.30c{1} - %-10.10X{camel.breadcrumbId} - %-10.10X{camelexchangeId} - > %-10.10X{camel.correlationId} - %-10.10X{camel.routeId} - %m%n > + > +# File appender > +log4j.appender.file=org.apache.log4j.FileAppender > +log4j.appender.file.layout=org.apache.log4j.PatternLayout > +log4j.appender.file.file=target/camel-openshift-test.log > +log4j.appender.file.append=true > +log4j.appender.file.layout.ConversionPattern=%d [%-15.15t] %-5p > %-30.30c{1} - %m%n > +# MDC > +#log4j.appender.file.layout.ConversionPattern=%d [%-15.15t] %-5p > %-30.30c{1} - %-10.10X{camel.breadcrumbId} - %-10.10X{camel.exchangeId} - > %-10.10X{camel.correlationId} - %-10.10X{camel.routeId} - %m%n > + > > > http://git-wip-us.apache.org/repos/asf/camel/blob/18998069/components/pom.xml > ---------------------------------------------------------------------- > diff --git a/components/pom.xml b/components/pom.xml > index 9e5292f..942218f 100644 > --- a/components/pom.xml > +++ b/components/pom.xml > @@ -141,6 +141,7 @@ > <module>camel-netty</module> > <module>camel-netty-http</module> > <module>camel-ognl</module> > + <module>camel-openshift</module> > <module>camel-optaplanner</module> > <module>camel-paxlogging</module> > <module>camel-printer</module> > > http://git-wip-us.apache.org/repos/asf/camel/blob/18998069/parent/pom.xml > ---------------------------------------------------------------------- > diff --git a/parent/pom.xml b/parent/pom.xml > index 8ff5f30..01c3689 100644 > --- a/parent/pom.xml > +++ b/parent/pom.xml > @@ -313,6 +313,7 @@ > <openejb-version>4.5.2</openejb-version> > <openjpa-version>2.3.0</openjpa-version> > <opensaml-version>2.5.1_2</opensaml-version> > + > <openshift-java-client-version>2.5.0.Final</openshift-java-client-version> > <optaplanner-version>6.0.1.Final</optaplanner-version> > <oro-bundle-version>2.0.8_6</oro-bundle-version> > <oscache-bundle-version>2.4_5</oscache-bundle-version> > @@ -998,6 +999,11 @@ > </dependency> > <dependency> > <groupId>org.apache.camel</groupId> > + <artifactId>camel-openshift</artifactId> > + <version>${project.version}</version> > + </dependency> > + <dependency> > + <groupId>org.apache.camel</groupId> > <artifactId>camel-optaplanner</artifactId> > <version>${project.version}</version> > </dependency> > > > http://git-wip-us.apache.org/repos/asf/camel/blob/18998069/platforms/karaf/features/src/main/resources/features.xml > ---------------------------------------------------------------------- > diff --git a/platforms/karaf/features/src/main/resources/features.xml > b/platforms/karaf/features/src/main/resources/features.xml > index 415943d..727f1dc 100644 > --- a/platforms/karaf/features/src/main/resources/features.xml > +++ b/platforms/karaf/features/src/main/resources/features.xml > @@ -829,6 +829,11 @@ > <bundle > dependency='true'>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.javassist/${javassist-bundle-version}</bundle> > <bundle>mvn:org.apache.camel/camel-ognl/${project.version}</bundle> > </feature> > + <feature name='camel-openshift' version='${project.version}' > resolver='(obr)' start-level='50'> > + <feature version='${project.version}'>camel-core</feature> > + <bundle > dependency='true'>wrap:mvn:com.openshift/openshift-java-client/${openshift-java-client-version}</bundle> > + > <bundle>mvn:org.apache.camel/camel-openshift/${project.version}</bundle> > + </feature> > <feature name='camel-optaplanner' version='${project.version}' > resolver='(obr)' start-level='50'> > <details>The camel-optaplanner feature can only run on a SUN JVM. You > need to add the package com.sun.tools.xjc to the java platform packages in > the etc/jre.properties file.</details> > <feature version='${project.version}'>camel-core</feature> > > > http://git-wip-us.apache.org/repos/asf/camel/blob/18998069/tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/CamelOpenshiftTest.java > ---------------------------------------------------------------------- > diff --git > a/tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/CamelOpenshiftTest.java > b/tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/CamelOpenshiftTest.java > new file mode 100644 > index 0000000..e9f73eb > --- /dev/null > +++ > b/tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/CamelOpenshiftTest.java > @@ -0,0 +1,40 @@ > +/** > + * 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.itest.karaf; > + > +import org.junit.Test; > +import org.junit.runner.RunWith; > +import org.ops4j.pax.exam.Option; > +import org.ops4j.pax.exam.junit.Configuration; > +import org.ops4j.pax.exam.junit.JUnit4TestRunner; > + > +@RunWith(JUnit4TestRunner.class) > +public class CamelOpenshiftTest extends AbstractFeatureTest { > + > + public static final String COMPONENT = > extractName(CamelOpenshiftTest.class); > + > + @Test > + public void test() throws Exception { > + testComponent(COMPONENT); > + } > + > + @Configuration > + public static Option[] configure() { > + return configure(COMPONENT); > + } > + > +} > \ No newline at end of file > >