You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by lb...@apache.org on 2017/01/11 12:04:14 UTC
[03/10] camel git commit: CAMEL-10638: Refactor ServiceCall EIP
http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/processor/ServiceCallClientRouteTest.java
----------------------------------------------------------------------
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/processor/ServiceCallClientRouteTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/processor/ServiceCallClientRouteTest.java
deleted file mode 100644
index b5e03e3..0000000
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/processor/ServiceCallClientRouteTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * 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.processor;
-
-import org.apache.camel.RoutesBuilder;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.model.remote.KubernetesConfigurationDefinition;
-import org.apache.camel.test.junit4.CamelTestSupport;
-import org.junit.Ignore;
-import org.junit.Test;
-
-@Ignore("Manual test")
-public class ServiceCallClientRouteTest extends CamelTestSupport {
-
- @Test
- public void testServiceCall() throws Exception {
- getMockEndpoint("mock:result").expectedMessageCount(1);
-
- template.sendBody("direct:start", "Hello World");
-
- assertMockEndpointsSatisfied();
- }
-
- @Override
- protected RoutesBuilder createRouteBuilder() throws Exception {
- return new RouteBuilder() {
- @Override
- public void configure() throws Exception {
- KubernetesConfigurationDefinition config = new KubernetesConfigurationDefinition();
- config.setMasterUrl("http://172.28.128.80:8080");
- config.setUsername("admin");
- config.setPassword("admin");
- config.setNamespace("default");
- config.setLookup("client");
- // lets use the built-in round robin (random is default)
- config.setLoadBalancerRef("roundrobin");
-
- // register configuration
- context.setServiceCallConfiguration(config);
-
- from("direct:start")
- .serviceCall("cdi-camel-jetty")
- .serviceCall("cdi-camel-jetty")
- .to("mock:result");
- }
- };
- }
-}
http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/processor/ServiceCallEnvironmentRouteTest.java
----------------------------------------------------------------------
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/processor/ServiceCallEnvironmentRouteTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/processor/ServiceCallEnvironmentRouteTest.java
deleted file mode 100644
index 1e34cb5..0000000
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/processor/ServiceCallEnvironmentRouteTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/**
- * 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.processor;
-
-import org.apache.camel.RoutesBuilder;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.model.remote.KubernetesConfigurationDefinition;
-import org.apache.camel.test.junit4.CamelTestSupport;
-import org.junit.Ignore;
-import org.junit.Test;
-
-@Ignore("Manual test")
-public class ServiceCallEnvironmentRouteTest extends CamelTestSupport {
-
- @Test
- public void testServiceCall() throws Exception {
- getMockEndpoint("mock:result").expectedMessageCount(1);
-
- template.sendBody("direct:start", "Hello World");
-
- assertMockEndpointsSatisfied();
- }
-
- @Override
- protected RoutesBuilder createRouteBuilder() throws Exception {
- return new RouteBuilder() {
- @Override
- public void configure() throws Exception {
- KubernetesConfigurationDefinition config = new KubernetesConfigurationDefinition();
- config.setLookup("environment");
-
- // register configuration
- context.setServiceCallConfiguration(config);
-
- from("direct:start")
- .serviceCall("cdi-camel-jetty")
- .serviceCall("cdi-camel-jetty")
- .to("mock:result");
- }
- };
- }
-}
http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/processor/SpringServiceCallClientRouteTest.java
----------------------------------------------------------------------
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/processor/SpringServiceCallClientRouteTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/processor/SpringServiceCallClientRouteTest.java
deleted file mode 100644
index 3e8fcba3..0000000
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/processor/SpringServiceCallClientRouteTest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * 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.processor;
-
-import org.apache.camel.test.spring.CamelSpringTestSupport;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.springframework.context.support.AbstractApplicationContext;
-import org.springframework.context.support.ClassPathXmlApplicationContext;
-
-@Ignore("Manual test")
-public class SpringServiceCallClientRouteTest extends CamelSpringTestSupport {
-
- @Override
- protected AbstractApplicationContext createApplicationContext() {
- return new ClassPathXmlApplicationContext("org/apache/camel/component/kubernetes/processor/SpringServiceCallClientRouteTest.xml");
- }
-
- @Test
- public void testServiceCall() throws Exception {
- getMockEndpoint("mock:result").expectedMessageCount(1);
-
- template.sendBody("direct:start", "Hello World");
-
- assertMockEndpointsSatisfied();
- }
-}
http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/processor/SpringServiceCallEnvironmentRouteTest.java
----------------------------------------------------------------------
diff --git a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/processor/SpringServiceCallEnvironmentRouteTest.java b/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/processor/SpringServiceCallEnvironmentRouteTest.java
deleted file mode 100644
index bd09c31..0000000
--- a/components/camel-kubernetes/src/test/java/org/apache/camel/component/kubernetes/processor/SpringServiceCallEnvironmentRouteTest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * 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.processor;
-
-import org.apache.camel.test.spring.CamelSpringTestSupport;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.springframework.context.support.AbstractApplicationContext;
-import org.springframework.context.support.ClassPathXmlApplicationContext;
-
-@Ignore("Manual test")
-public class SpringServiceCallEnvironmentRouteTest extends CamelSpringTestSupport {
-
- @Override
- protected AbstractApplicationContext createApplicationContext() {
- return new ClassPathXmlApplicationContext("org/apache/camel/component/kubernetes/processor/SpringServiceCallEnvironmentRouteTest.xml");
- }
-
- @Test
- public void testServiceCall() throws Exception {
- getMockEndpoint("mock:result").expectedMessageCount(1);
-
- template.sendBody("direct:start", "Hello World");
-
- assertMockEndpointsSatisfied();
- }
-}
http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-kubernetes/src/test/resources/org/apache/camel/component/kubernetes/cloud/SpringServiceCallClientRouteTest.xml
----------------------------------------------------------------------
diff --git a/components/camel-kubernetes/src/test/resources/org/apache/camel/component/kubernetes/cloud/SpringServiceCallClientRouteTest.xml b/components/camel-kubernetes/src/test/resources/org/apache/camel/component/kubernetes/cloud/SpringServiceCallClientRouteTest.xml
new file mode 100644
index 0000000..1e98b25
--- /dev/null
+++ b/components/camel-kubernetes/src/test/resources/org/apache/camel/component/kubernetes/cloud/SpringServiceCallClientRouteTest.xml
@@ -0,0 +1,57 @@
+<?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.
+ -->
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="
+ http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://camel.apache.org/schema/spring
+ http://camel.apache.org/schema/spring/camel-spring.xsd">
+
+ <camelContext xmlns="http://camel.apache.org/schema/spring">
+ <!--
+ <serviceCallConfiguration id="kubernetes">
+ <kubernetesServiceDiscovery masterUrl="http://172.28.128.80:8080"
+ username="admin"
+ password="admin"
+ namespace="default"
+ lookup="client"/>
+ </serviceCallConfiguration
+ -->
+
+ <route>
+ <from uri="direct:start"/>
+ <serviceCall name="cdi-camel-jetty">
+ <kubernetesServiceDiscovery masterUrl="http://172.28.128.80:8080"
+ username="admin"
+ password="admin"
+ namespace="default"
+ lookup="client"/>
+ </serviceCall>
+ <serviceCall name="cdi-camel-jetty">
+ <kubernetesServiceDiscovery masterUrl="http://172.28.128.80:8080"
+ username="admin"
+ password="admin"
+ namespace="default"
+ lookup="client"/>
+ </serviceCall>
+ <to uri="mock:result"/>
+ </route>
+ </camelContext>
+
+</beans>
http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-kubernetes/src/test/resources/org/apache/camel/component/kubernetes/cloud/SpringServiceCallDnsRouteTest.xml
----------------------------------------------------------------------
diff --git a/components/camel-kubernetes/src/test/resources/org/apache/camel/component/kubernetes/cloud/SpringServiceCallDnsRouteTest.xml b/components/camel-kubernetes/src/test/resources/org/apache/camel/component/kubernetes/cloud/SpringServiceCallDnsRouteTest.xml
new file mode 100644
index 0000000..b8be867
--- /dev/null
+++ b/components/camel-kubernetes/src/test/resources/org/apache/camel/component/kubernetes/cloud/SpringServiceCallDnsRouteTest.xml
@@ -0,0 +1,44 @@
+<?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.
+ -->
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="
+ http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://camel.apache.org/schema/spring
+ http://camel.apache.org/schema/spring/camel-spring.xsd">
+ <camelContext xmlns="http://camel.apache.org/schema/spring">
+ <!--
+ <serviceCallConfiguration id="kubernetes">
+ <kubernetesServiceDiscovery lookup="dns"/>
+ </serviceCallConfiguration>
+ -->
+
+ <route>
+ <from uri="direct:start"/>
+ <serviceCall name="cdi-camel-jetty">
+ <kubernetesServiceDiscovery lookup="dns"/>
+ </serviceCall>
+ <serviceCall name="cdi-camel-jetty">
+ <kubernetesServiceDiscovery lookup="dns"/>
+ </serviceCall>
+ <to uri="mock:result"/>
+ </route>
+ </camelContext>
+
+</beans>
http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-kubernetes/src/test/resources/org/apache/camel/component/kubernetes/cloud/SpringServiceCallEnvironmentRouteTest.xml
----------------------------------------------------------------------
diff --git a/components/camel-kubernetes/src/test/resources/org/apache/camel/component/kubernetes/cloud/SpringServiceCallEnvironmentRouteTest.xml b/components/camel-kubernetes/src/test/resources/org/apache/camel/component/kubernetes/cloud/SpringServiceCallEnvironmentRouteTest.xml
new file mode 100644
index 0000000..8a8686f
--- /dev/null
+++ b/components/camel-kubernetes/src/test/resources/org/apache/camel/component/kubernetes/cloud/SpringServiceCallEnvironmentRouteTest.xml
@@ -0,0 +1,44 @@
+<?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.
+ -->
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="
+ http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://camel.apache.org/schema/spring
+ http://camel.apache.org/schema/spring/camel-spring.xsd">
+ <camelContext xmlns="http://camel.apache.org/schema/spring">
+ <!--
+ <serviceCallConfiguration id="kubernetes">
+ <kubernetesServiceDiscovery lookup="environment"/>
+ </serviceCallConfiguration>
+ -->
+
+ <route>
+ <from uri="direct:start"/>
+ <serviceCall name="cdi-camel-jetty">
+ <kubernetesServiceDiscovery lookup="environment"/>
+ </serviceCall>
+ <serviceCall name="cdi-camel-jetty">
+ <kubernetesServiceDiscovery lookup="environment"/>
+ </serviceCall>
+ <to uri="mock:result"/>
+ </route>
+ </camelContext>
+
+</beans>
http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-kubernetes/src/test/resources/org/apache/camel/component/kubernetes/processor/SpringServiceCallClientRouteTest.xml
----------------------------------------------------------------------
diff --git a/components/camel-kubernetes/src/test/resources/org/apache/camel/component/kubernetes/processor/SpringServiceCallClientRouteTest.xml b/components/camel-kubernetes/src/test/resources/org/apache/camel/component/kubernetes/processor/SpringServiceCallClientRouteTest.xml
deleted file mode 100644
index 87162d9..0000000
--- a/components/camel-kubernetes/src/test/resources/org/apache/camel/component/kubernetes/processor/SpringServiceCallClientRouteTest.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?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.
--->
-<beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
- http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
- ">
-
- <camelContext xmlns="http://camel.apache.org/schema/spring">
-
- <!-- use client to lookup the service, which requires to setup a number of options -->
- <kubernetesConfiguration id="kubernetes" masterUrl="http://172.28.128.80:8080" lookup="client"
- username="admin" password="admin" namespace="default" loadBalancerRef="roundrobin"/>
-
- <route>
- <from uri="direct:start"/>
- <serviceCall name="cdi-camel-jetty"/>
- <serviceCall name="cdi-camel-jetty"/>
- <to uri="mock:result"/>
- </route>
- </camelContext>
-
-</beans>
http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-kubernetes/src/test/resources/org/apache/camel/component/kubernetes/processor/SpringServiceCallEnvironmentRouteTest.xml
----------------------------------------------------------------------
diff --git a/components/camel-kubernetes/src/test/resources/org/apache/camel/component/kubernetes/processor/SpringServiceCallEnvironmentRouteTest.xml b/components/camel-kubernetes/src/test/resources/org/apache/camel/component/kubernetes/processor/SpringServiceCallEnvironmentRouteTest.xml
deleted file mode 100644
index 6f2f028..0000000
--- a/components/camel-kubernetes/src/test/resources/org/apache/camel/component/kubernetes/processor/SpringServiceCallEnvironmentRouteTest.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?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.
--->
-<beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
- http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
- ">
-
- <camelContext xmlns="http://camel.apache.org/schema/spring">
-
- <!-- use environment variables to lookup the service -->
- <kubernetesConfiguration id="kubernetes" lookup="environment"/>
-
- <route>
- <from uri="direct:start"/>
- <serviceCall name="cdi-camel-jetty"/>
- <serviceCall name="cdi-camel-jetty"/>
- <to uri="mock:result"/>
- </route>
- </camelContext>
-
-</beans>
http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/RibbonConfiguration.java
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/RibbonConfiguration.java b/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/RibbonConfiguration.java
index 4931a5b..40bcb31 100644
--- a/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/RibbonConfiguration.java
+++ b/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/RibbonConfiguration.java
@@ -16,16 +16,20 @@
*/
package org.apache.camel.component.ribbon;
+import java.util.Map;
+import java.util.function.Supplier;
+
import com.netflix.loadbalancer.IPing;
import com.netflix.loadbalancer.IRule;
public class RibbonConfiguration {
-
private String namespace;
private String username;
private String password;
private IRule rule;
private IPing ping;
+ private String clientName;
+ private Map<String, String> clientConfig;
public String getNamespace() {
return namespace;
@@ -55,6 +59,10 @@ public class RibbonConfiguration {
return rule;
}
+ public IRule getRuleOrDefault(Supplier<IRule> supplier) {
+ return rule != null ? rule : supplier.get();
+ }
+
public void setRule(IRule rule) {
this.rule = rule;
}
@@ -63,7 +71,27 @@ public class RibbonConfiguration {
return ping;
}
+ public IPing getPingOrDefault(Supplier<IPing> supplier) {
+ return ping != null ? ping : supplier.get();
+ }
+
public void setPing(IPing ping) {
this.ping = ping;
}
+
+ public String getClientName() {
+ return clientName;
+ }
+
+ public void setClientName(String clientName) {
+ this.clientName = clientName;
+ }
+
+ public Map<String, String> getClientConfig() {
+ return clientConfig;
+ }
+
+ public void setClientConfig(Map<String, String> clientConfig) {
+ this.clientConfig = clientConfig;
+ }
}
http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/cloud/RibbonLoadBalancer.java
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/cloud/RibbonLoadBalancer.java b/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/cloud/RibbonLoadBalancer.java
new file mode 100644
index 0000000..eb23c1b
--- /dev/null
+++ b/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/cloud/RibbonLoadBalancer.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.ribbon.cloud;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.RejectedExecutionException;
+
+import com.netflix.client.config.IClientConfig;
+import com.netflix.client.config.IClientConfigKey;
+import com.netflix.loadbalancer.DummyPing;
+import com.netflix.loadbalancer.ILoadBalancer;
+import com.netflix.loadbalancer.PollingServerListUpdater;
+import com.netflix.loadbalancer.RoundRobinRule;
+import com.netflix.loadbalancer.ServerList;
+import com.netflix.loadbalancer.ServerListFilter;
+import com.netflix.loadbalancer.ZoneAwareLoadBalancer;
+import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
+import org.apache.camel.cloud.LoadBalancer;
+import org.apache.camel.cloud.LoadBalancerFunction;
+import org.apache.camel.cloud.ServiceDefinition;
+import org.apache.camel.cloud.ServiceDiscovery;
+import org.apache.camel.cloud.ServiceDiscoveryAware;
+import org.apache.camel.cloud.ServiceFilter;
+import org.apache.camel.cloud.ServiceFilterAware;
+import org.apache.camel.component.ribbon.RibbonConfiguration;
+import org.apache.camel.support.ServiceSupport;
+import org.apache.camel.util.ObjectHelper;
+import org.apache.camel.util.ServiceHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class RibbonLoadBalancer
+ extends ServiceSupport
+ implements CamelContextAware, ServiceDiscoveryAware, ServiceFilterAware, LoadBalancer {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(RibbonLoadBalancer.class);
+
+ private final RibbonConfiguration configuration;
+ private final ConcurrentMap<String, ZoneAwareLoadBalancer<RibbonServiceDefinition>> loadBalancers;
+ private CamelContext camelContext;
+ private ServiceDiscovery serviceDiscovery;
+ private ServiceFilter serviceFilter;
+
+ public RibbonLoadBalancer(RibbonConfiguration configuration) {
+ this.configuration = configuration;
+ this.loadBalancers = new ConcurrentHashMap<>();
+ }
+
+ @Override
+ public CamelContext getCamelContext() {
+ return camelContext;
+ }
+
+ @Override
+ public void setCamelContext(CamelContext camelContext) {
+ this.camelContext = camelContext;
+ }
+
+ @Override
+ public ServiceDiscovery getServiceDiscovery() {
+ return serviceDiscovery;
+ }
+
+ @Override
+ public void setServiceDiscovery(ServiceDiscovery serviceDiscovery) {
+ this.serviceDiscovery = serviceDiscovery;
+ }
+
+ @Override
+ public ServiceFilter getServiceFilter() {
+ return serviceFilter;
+ }
+
+ @Override
+ public void setServiceFilter(ServiceFilter serviceFilter) {
+ this.serviceFilter = serviceFilter;
+ }
+
+ // ************************
+ // lifecycle
+ // ************************
+
+ @Override
+ protected void doStart() throws Exception {
+ ObjectHelper.notNull(configuration, "configuration");
+ ObjectHelper.notNull(camelContext, "camel context");
+ ObjectHelper.notNull(serviceDiscovery, "service discovery");
+ ObjectHelper.notNull(serviceFilter, "service filter");
+
+ LOGGER.info("ServiceCall is using ribbon load balancer with service discovery type: {} and service filter type: {}",
+ serviceDiscovery.getClass(),
+ serviceFilter.getClass());
+
+ ServiceHelper.startService(serviceDiscovery);
+ }
+
+ @Override
+ protected void doStop() throws Exception {
+ loadBalancers.values().forEach(ZoneAwareLoadBalancer::stopServerListRefreshing);
+ loadBalancers.clear();
+
+ ServiceHelper.stopService(serviceDiscovery);
+ }
+
+ // ************************
+ // Processor
+ // ************************
+
+ @Override
+ public <T> T process(String serviceName, LoadBalancerFunction<T> request) throws Exception {
+ ILoadBalancer loadBalancer = loadBalancers.computeIfAbsent(serviceName, key -> createLoadBalancer(key, serviceDiscovery));
+ RibbonServiceDefinition service = (RibbonServiceDefinition)loadBalancer.chooseServer(serviceName);
+
+ if (service == null) {
+ throw new RejectedExecutionException("No active services with name " + serviceName);
+ }
+
+ return request.apply(service);
+ }
+
+ // ************************
+ // Helpers
+ // ************************
+
+ private ZoneAwareLoadBalancer<RibbonServiceDefinition> createLoadBalancer(String serviceName, ServiceDiscovery serviceDiscovery) {
+ // setup client config
+ IClientConfig config = configuration.getClientName() != null
+ ? IClientConfig.Builder.newBuilder(configuration.getClientName()).build()
+ : IClientConfig.Builder.newBuilder().build();
+
+ if (configuration.getClientConfig() != null) {
+ for (Map.Entry<String, String> entry : configuration.getClientConfig().entrySet()) {
+ IClientConfigKey key = IClientConfigKey.Keys.valueOf(entry.getKey());
+ String value = entry.getValue();
+
+ LOGGER.debug("RibbonClientConfig: {}={}", key.key(), value);
+ config.set(key, value);
+ }
+ }
+
+ return new ZoneAwareLoadBalancer<>(
+ config,
+ configuration.getRuleOrDefault(RoundRobinRule::new),
+ configuration.getPingOrDefault(DummyPing::new),
+ new RibbonServerList(serviceName, serviceDiscovery),
+ new RibbonServerFilter(serviceFilter),
+ new PollingServerListUpdater(config));
+ }
+
+ static final class RibbonServerList implements ServerList<RibbonServiceDefinition> {
+ private final String serviceName;
+ private final ServiceDiscovery serviceDiscovery;
+
+ RibbonServerList(String serviceName, ServiceDiscovery serviceDiscovery) {
+ this.serviceName = serviceName;
+ this.serviceDiscovery = serviceDiscovery;
+ }
+
+ @Override
+ public List<RibbonServiceDefinition> getInitialListOfServers() {
+ return asRibbonServerList(
+ serviceDiscovery.getInitialListOfServices(serviceName)
+ );
+ }
+
+ @Override
+ public List<RibbonServiceDefinition> getUpdatedListOfServers() {
+ return asRibbonServerList(
+ serviceDiscovery.getUpdatedListOfServices(serviceName)
+ );
+ }
+
+ private List<RibbonServiceDefinition> asRibbonServerList(List<ServiceDefinition> services) {
+ List<RibbonServiceDefinition> ribbonServers = new ArrayList<>();
+
+ for (ServiceDefinition service : services) {
+ if (service instanceof RibbonServiceDefinition) {
+ ribbonServers.add((RibbonServiceDefinition)service);
+ } else {
+ RibbonServiceDefinition serviceDef = new RibbonServiceDefinition(
+ serviceName,
+ service.getHost(),
+ service.getPort(),
+ service.getHealth()
+ );
+
+ String zone = serviceDef.getMetadata().get("zone");
+ if (zone != null) {
+ serviceDef.setZone(zone);
+ }
+
+ ribbonServers.add(serviceDef);
+ }
+ }
+
+ return ribbonServers;
+ }
+ }
+
+ static final class RibbonServerFilter implements ServerListFilter<RibbonServiceDefinition> {
+ private final ServiceFilter serviceFilter;
+
+ RibbonServerFilter(ServiceFilter serviceFilter) {
+ this.serviceFilter = serviceFilter;
+ }
+
+ public List<RibbonServiceDefinition> getFilteredListOfServers(List<RibbonServiceDefinition> servers) {
+ return serviceFilter.apply(servers);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/cloud/RibbonLoadBalancerFactory.java
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/cloud/RibbonLoadBalancerFactory.java b/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/cloud/RibbonLoadBalancerFactory.java
new file mode 100644
index 0000000..86874f0
--- /dev/null
+++ b/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/cloud/RibbonLoadBalancerFactory.java
@@ -0,0 +1,61 @@
+/**
+ * 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.ribbon.cloud;
+
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.cloud.LoadBalancer;
+import org.apache.camel.cloud.LoadBalancerFactory;
+import org.apache.camel.component.ribbon.RibbonConfiguration;
+
+public class RibbonLoadBalancerFactory implements LoadBalancerFactory {
+ private final RibbonConfiguration configuration;
+
+ public RibbonLoadBalancerFactory() {
+ this.configuration = new RibbonConfiguration();
+ }
+
+ // *************************************************************************
+ // Properties
+ // *************************************************************************
+
+ public String getClientName() {
+ return configuration.getClientName();
+ }
+
+ public void setClientName(String clientName) {
+ configuration.setClientName(clientName);
+ }
+
+ public Map<String, String> getProperies() {
+ return configuration.getClientConfig();
+ }
+
+ public void setProperties(Map<String, String> clientConfig) {
+ configuration.setClientConfig(clientConfig);
+ }
+
+ // *************************************************************************
+ // Factory
+ // *************************************************************************
+
+ @Override
+ public LoadBalancer newInstance(CamelContext camelContext) throws Exception {
+ return new RibbonLoadBalancer(configuration);
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/cloud/RibbonServiceDefinition.java
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/cloud/RibbonServiceDefinition.java b/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/cloud/RibbonServiceDefinition.java
new file mode 100644
index 0000000..d9d5772
--- /dev/null
+++ b/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/cloud/RibbonServiceDefinition.java
@@ -0,0 +1,74 @@
+/**
+ * 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.ribbon.cloud;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import com.netflix.loadbalancer.Server;
+import org.apache.camel.cloud.ServiceDefinition;
+import org.apache.camel.cloud.ServiceHealth;
+import org.apache.camel.impl.cloud.DefaultServiceHealth;
+import org.apache.camel.util.ObjectHelper;
+
+public class RibbonServiceDefinition extends Server implements ServiceDefinition {
+ private String name;
+ private ServiceHealth health;
+
+ public RibbonServiceDefinition(String name, String host, int port) {
+ this(name, host, port, DefaultServiceHealth.INSTANCE);
+ }
+
+ public RibbonServiceDefinition(String name, String host, int port, ServiceHealth healt) {
+ super(host, port);
+ this.name = name;
+ this.health = healt;
+ }
+
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public String getHost() {
+ return super.getHost();
+ }
+
+ @Override
+ public int getPort() {
+ return super.getPort();
+ }
+
+ @Override
+ public ServiceHealth getHealth() {
+ return health;
+ }
+
+ @Override
+ public Map<String, String> getMetadata() {
+ Map<String, String> meta = new HashMap<>();
+ ObjectHelper.ifNotEmpty(super.getId(), val -> meta.put("id", val));
+ ObjectHelper.ifNotEmpty(super.getZone(), val -> meta.put("zone", val));
+ ObjectHelper.ifNotEmpty(super.isAlive(), val -> meta.put("is_alive", Boolean.toString(val)));
+ ObjectHelper.ifNotEmpty(super.isReadyToServe(), val -> meta.put("ready_to_server", Boolean.toString(val)));
+
+ return Collections.unmodifiableMap(meta);
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/processor/RibbonProcessorFactory.java
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/processor/RibbonProcessorFactory.java b/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/processor/RibbonProcessorFactory.java
deleted file mode 100644
index 00e9c52..0000000
--- a/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/processor/RibbonProcessorFactory.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/**
- * 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.ribbon.processor;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-import com.netflix.loadbalancer.IRule;
-import org.apache.camel.ExchangePattern;
-import org.apache.camel.Processor;
-import org.apache.camel.component.ribbon.RibbonConfiguration;
-import org.apache.camel.impl.remote.DefaultServiceCallProcessorFactory;
-import org.apache.camel.model.remote.RibbonConfigurationDefinition;
-import org.apache.camel.model.remote.ServiceCallConfigurationDefinition;
-import org.apache.camel.model.remote.ServiceCallDefinition;
-import org.apache.camel.spi.ProcessorFactory;
-import org.apache.camel.spi.RouteContext;
-import org.apache.camel.spi.ServiceCallServerListStrategy;
-import org.apache.camel.util.CamelContextHelper;
-import org.apache.camel.util.IntrospectionSupport;
-
-/**
- * {@link ProcessorFactory} that creates the Ribbon implementation of the ServiceCall EIP.
- */
-public class RibbonProcessorFactory extends DefaultServiceCallProcessorFactory<RibbonConfiguration, RibbonServer> {
-
-
- @Override
- protected Processor createProcessor(RouteContext routeContext, ServiceCallDefinition definition, RibbonConfiguration cfg) throws Exception {
- String name = definition.getName();
- String uri = definition.getUri();
- ExchangePattern mep = definition.getPattern();
-
- RibbonConfigurationDefinition config = (RibbonConfigurationDefinition) definition.getServiceCallConfiguration();
- RibbonConfigurationDefinition configRef = null;
- if (definition.getServiceCallConfigurationRef() != null) {
- // lookup in registry first
- configRef = CamelContextHelper.lookup(routeContext.getCamelContext(), definition.getServiceCallConfigurationRef(), RibbonConfigurationDefinition.class);
- if (configRef == null) {
- // and fallback as service configuration
- routeContext.getCamelContext().getServiceCallConfiguration(definition.getServiceCallConfigurationRef(), RibbonConfigurationDefinition.class);
- }
- }
-
- // if no configuration explicit configured then use default
- if (config == null && configRef == null) {
- config = routeContext.getCamelContext().getServiceCallConfiguration(null, RibbonConfigurationDefinition.class);
- }
- if (config == null) {
- // if no default then try to find if there configuration in the registry of the given type
- Set<RibbonConfigurationDefinition> set = routeContext.getCamelContext().getRegistry().findByType(RibbonConfigurationDefinition.class);
- if (set.size() == 1) {
- config = set.iterator().next();
- }
- }
-
- if (config == null && configRef == null) {
- throw new IllegalStateException("The ServiceCall: " + definition + " must be configured before it can be used.");
- }
-
- // extract the properties from the configuration from the model
- Map<String, Object> parameters = new HashMap<>();
- if (configRef != null) {
- IntrospectionSupport.getProperties(configRef, parameters, null);
- }
- if (config != null) {
- IntrospectionSupport.getProperties(config, parameters, null);
- }
-
- // and set them on the kubernetes configuration class
- IntrospectionSupport.setProperties(cfg, parameters);
-
- // lookup the load balancer to use (configured on EIP takes precedence vs configured on configuration)
- Object lb = configureLoadBalancer(routeContext, definition);
- if (lb == null && config != null) {
- lb = configureLoadBalancer(routeContext, config);
- }
- if (lb == null && configRef != null) {
- lb = configureLoadBalancer(routeContext, configRef);
- }
-
- // lookup the server list strategy to use (configured on EIP takes precedence vs configured on configuration)
- ServiceCallServerListStrategy sl = configureServerListStrategy(routeContext, definition);
- if (sl == null && config != null) {
- sl = configureServerListStrategy(routeContext, config);
- }
- if (sl == null && configRef != null) {
- sl = configureServerListStrategy(routeContext, configRef);
- }
-
- // must be a ribbon load balancer
- if (lb != null && !(lb instanceof IRule)) {
- throw new IllegalArgumentException("Load balancer must be of type: " + IRule.class + " but is of type: " + lb.getClass().getName());
- }
-
- // The component is used to configure what the default scheme to use (eg camel component name).
- // The component configured on EIP takes precedence vs configured on configuration.
- String component = definition.getComponent();
- if (component == null) {
- component = config != null ? config.getComponent() : null;
- if (component == null && configRef != null) {
- component = configRef.getComponent();
- }
- }
-
- Map<String, String> properties = configureProperties(routeContext, config, configRef);
-
- RibbonServiceCallProcessor processor = new RibbonServiceCallProcessor(name, uri, component, mep, cfg);
- processor.setRule((IRule) lb);
- processor.setServerListStrategy(sl);
- processor.setRibbonClientConfig(properties);
- return processor;
- }
-
- @Override
- protected RibbonConfiguration createConfiguration(RouteContext routeContext) throws Exception {
- return new RibbonConfiguration();
- }
-
- private Object configureLoadBalancer(RouteContext routeContext, ServiceCallDefinition sd) {
- Object lb = null;
-
- if (sd != null) {
- lb = sd.getLoadBalancer();
- if (lb == null && sd.getLoadBalancerRef() != null) {
- String ref = sd.getLoadBalancerRef();
- lb = CamelContextHelper.mandatoryLookup(routeContext.getCamelContext(), ref);
- }
- }
-
- return lb;
- }
-
- private Object configureLoadBalancer(RouteContext routeContext, ServiceCallConfigurationDefinition config) {
- Object lb = config.getLoadBalancer();
- if (lb == null && config.getLoadBalancerRef() != null) {
- String ref = config.getLoadBalancerRef();
- lb = CamelContextHelper.mandatoryLookup(routeContext.getCamelContext(), ref);
- }
- return lb;
- }
-
- private ServiceCallServerListStrategy configureServerListStrategy(RouteContext routeContext, ServiceCallDefinition sd) {
- ServiceCallServerListStrategy lb = null;
-
- if (sd != null) {
- lb = sd.getServerListStrategy();
- if (lb == null && sd.getServerListStrategyRef() != null) {
- lb = CamelContextHelper.mandatoryLookup(routeContext.getCamelContext(), sd.getServerListStrategyRef(), ServiceCallServerListStrategy.class);
- }
- }
-
- return lb;
- }
-
- private ServiceCallServerListStrategy configureServerListStrategy(RouteContext routeContext, ServiceCallConfigurationDefinition config) {
- ServiceCallServerListStrategy lb = config.getServerListStrategy();
- if (lb == null && config.getServerListStrategyRef() != null) {
- String ref = config.getServerListStrategyRef();
- lb = CamelContextHelper.mandatoryLookup(routeContext.getCamelContext(), ref, ServiceCallServerListStrategy.class);
- }
- return lb;
- }
-
-}
-
http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/processor/RibbonServer.java
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/processor/RibbonServer.java b/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/processor/RibbonServer.java
deleted file mode 100644
index d30d656..0000000
--- a/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/processor/RibbonServer.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * 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.ribbon.processor;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import com.netflix.loadbalancer.Server;
-import org.apache.camel.spi.ServiceCallServer;
-
-import static org.apache.camel.util.ObjectHelper.ifNotEmpty;
-
-public class RibbonServer extends Server implements ServiceCallServer {
-
- public RibbonServer(String host, int port) {
- super(host, port);
- }
-
- @Override
- public String getIp() {
- return super.getHost();
- }
-
- @Override
- public int getPort() {
- return super.getPort();
- }
-
- @Override
- public Map<String, String> getMetadata() {
- Map<String, String> meta = new HashMap<>();
- ifNotEmpty(super.getId(), val -> meta.put("id", val));
- ifNotEmpty(super.getZone(), val -> meta.put("zone", val));
-
- if (super.getMetaInfo() != null) {
- ifNotEmpty(super.getMetaInfo().getAppName(), val -> meta.put("app_name", val));
- ifNotEmpty(super.getMetaInfo().getServiceIdForDiscovery(), val -> meta.put("discovery_id", val));
- ifNotEmpty(super.getMetaInfo().getInstanceId(), val -> meta.put("instance_id", val));
- ifNotEmpty(super.getMetaInfo().getServerGroup(), val -> meta.put("server_group", val));
- }
-
- return Collections.unmodifiableMap(meta);
- }
-}
http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/processor/RibbonServiceCallProcessor.java
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/processor/RibbonServiceCallProcessor.java b/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/processor/RibbonServiceCallProcessor.java
deleted file mode 100644
index f701ba0..0000000
--- a/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/processor/RibbonServiceCallProcessor.java
+++ /dev/null
@@ -1,250 +0,0 @@
-/**
- * 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.ribbon.processor;
-
-import java.util.Map;
-import java.util.concurrent.RejectedExecutionException;
-
-import com.netflix.client.config.IClientConfig;
-import com.netflix.client.config.IClientConfigKey;
-import com.netflix.loadbalancer.DummyPing;
-import com.netflix.loadbalancer.IPing;
-import com.netflix.loadbalancer.IRule;
-import com.netflix.loadbalancer.PollingServerListUpdater;
-import com.netflix.loadbalancer.RoundRobinRule;
-import com.netflix.loadbalancer.Server;
-import com.netflix.loadbalancer.ServerList;
-import com.netflix.loadbalancer.ServerListUpdater;
-import com.netflix.loadbalancer.ZoneAwareLoadBalancer;
-import org.apache.camel.AsyncCallback;
-import org.apache.camel.AsyncProcessor;
-import org.apache.camel.CamelContext;
-import org.apache.camel.CamelContextAware;
-import org.apache.camel.Exchange;
-import org.apache.camel.ExchangePattern;
-import org.apache.camel.Traceable;
-import org.apache.camel.component.ribbon.RibbonConfiguration;
-import org.apache.camel.impl.remote.DefaultServiceCallExpression;
-import org.apache.camel.impl.remote.ServiceCallConstants;
-import org.apache.camel.processor.SendDynamicProcessor;
-import org.apache.camel.spi.IdAware;
-import org.apache.camel.spi.ServiceCallServerListStrategy;
-import org.apache.camel.support.ServiceSupport;
-import org.apache.camel.util.AsyncProcessorHelper;
-import org.apache.camel.util.ServiceHelper;
-import org.apache.camel.util.StringHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Ribbon based implementation of the the ServiceCall EIP.
- */
-public class RibbonServiceCallProcessor extends ServiceSupport implements AsyncProcessor, CamelContextAware, Traceable, IdAware {
-
- private static final Logger LOG = LoggerFactory.getLogger(RibbonServiceCallProcessor.class);
-
- private CamelContext camelContext;
- private String id;
- private final String name;
- private final String scheme;
- private final String contextPath;
- private final String uri;
- private final ExchangePattern exchangePattern;
- private final RibbonConfiguration configuration;
- private ServiceCallServerListStrategy<RibbonServer> serverListStrategy;
- private ZoneAwareLoadBalancer<RibbonServer> ribbonLoadBalancer;
- private IRule rule;
- private IPing ping;
- private final DefaultServiceCallExpression serviceCallExpression;
- private Map<String, String> ribbonClientConfig;
- private SendDynamicProcessor processor;
-
- public RibbonServiceCallProcessor(String name, String uri, String scheme, ExchangePattern exchangePattern, RibbonConfiguration configuration) {
- // setup from the provided name which can contain scheme and context-path information as well
- String serviceName;
- if (name.contains("/")) {
- serviceName = StringHelper.before(name, "/");
- this.contextPath = StringHelper.after(name, "/");
- } else if (name.contains("?")) {
- serviceName = StringHelper.before(name, "?");
- this.contextPath = StringHelper.after(name, "?");
- } else {
- serviceName = name;
- this.contextPath = null;
- }
- if (serviceName.contains(":")) {
- this.scheme = StringHelper.before(serviceName, ":");
- this.name = StringHelper.after(serviceName, ":");
- } else {
- this.scheme = scheme;
- this.name = serviceName;
- }
-
- this.uri = uri;
- this.exchangePattern = exchangePattern;
- this.configuration = configuration;
- this.rule = configuration.getRule();
- this.ping = configuration.getPing();
- this.serviceCallExpression = new DefaultServiceCallExpression(this.name, this.scheme, this.contextPath, this.uri);
- }
-
- @Override
- public void process(Exchange exchange) throws Exception {
- AsyncProcessorHelper.process(this, exchange);
- }
-
- @Override
- public boolean process(Exchange exchange, AsyncCallback callback) {
- Server server = null;
- try {
- // let the client load balancer chose which server to use
- server = ribbonLoadBalancer.chooseServer();
- if (server == null) {
- exchange.setException(new RejectedExecutionException("No active services with name " + name));
- }
- } catch (Throwable e) {
- exchange.setException(e);
- }
-
- if (exchange.getException() != null) {
- callback.done(true);
- return true;
- }
-
- String ip = server.getHost();
- int port = server.getPort();
- LOG.debug("Service {} active at server: {}:{}", name, ip, port);
-
- // set selected server as header
- exchange.getIn().setHeader(ServiceCallConstants.SERVER_IP, ip);
- exchange.getIn().setHeader(ServiceCallConstants.SERVER_PORT, port);
- exchange.getIn().setHeader(ServiceCallConstants.SERVICE_NAME, name);
-
- // use the dynamic send processor to call the service
- return processor.process(exchange, callback);
- }
-
- @Override
- public CamelContext getCamelContext() {
- return camelContext;
- }
-
- @Override
- public void setCamelContext(CamelContext camelContext) {
- this.camelContext = camelContext;
- }
-
- @Override
- public String getId() {
- return id;
- }
-
- @Override
- public void setId(String id) {
- this.id = id;
- }
-
- @Override
- public String getTraceLabel() {
- return "kubernetes";
- }
-
- public ServiceCallServerListStrategy getServerListStrategy() {
- return serverListStrategy;
- }
-
- public void setServerListStrategy(ServiceCallServerListStrategy serverListStrategy) {
- this.serverListStrategy = serverListStrategy;
- }
-
- public IRule getRule() {
- return rule;
- }
-
- public void setRule(IRule rule) {
- this.rule = rule;
- }
-
- public IPing getPing() {
- return ping;
- }
-
- public void setPing(IPing ping) {
- this.ping = ping;
- }
-
- public Map<String, String> getRibbonClientConfig() {
- return ribbonClientConfig;
- }
-
- public void setRibbonClientConfig(Map<String, String> ribbonClientConfig) {
- this.ribbonClientConfig = ribbonClientConfig;
- }
-
- @Override
- @SuppressWarnings("unchecked")
- protected void doStart() throws Exception {
- StringHelper.notEmpty(name, "name", this);
-
- if (serverListStrategy == null) {
- serverListStrategy = new RibbonServiceCallStaticServerListStrategy();
- }
-
- if (!(serverListStrategy instanceof ServerList)) {
- throw new IllegalArgumentException("ServerListStrategy must be instanceof com.netflix.loadbalancer.ServerList but is of type: " + serverListStrategy.getClass().getName());
- }
-
- if (rule == null) {
- // use round robin rule by default
- rule = new RoundRobinRule();
- }
- if (ping == null) {
- // use dummy ping by default
- ping = new DummyPing();
- }
-
- // setup client config
- IClientConfig config = IClientConfig.Builder.newBuilder(name).build();
- if (ribbonClientConfig != null) {
- for (Map.Entry<String, String> entry : ribbonClientConfig.entrySet()) {
- IClientConfigKey key = IClientConfigKey.Keys.valueOf(entry.getKey());
- String value = entry.getValue();
- LOG.debug("RibbonClientConfig: {}={}", key.key(), value);
- config.set(key, entry.getValue());
- }
- }
-
- ServerListUpdater updater = new PollingServerListUpdater(config);
- ribbonLoadBalancer = new ZoneAwareLoadBalancer<>(config, rule, ping, (ServerList<RibbonServer>) serverListStrategy, null, updater);
-
- LOG.info("RibbonServiceCall with service name: {} is using load balancer: {} and server list: {}", name, ribbonLoadBalancer, serverListStrategy);
-
- processor = new SendDynamicProcessor(uri, serviceCallExpression);
- processor.setCamelContext(getCamelContext());
- if (exchangePattern != null) {
- processor.setPattern(exchangePattern);
- }
- ServiceHelper.startServices(serverListStrategy, processor);
- }
-
- @Override
- protected void doStop() throws Exception {
- ServiceHelper.stopServices(processor, serverListStrategy);
- }
-
-}
-
http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/processor/RibbonServiceCallStaticServerListStrategy.java
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/processor/RibbonServiceCallStaticServerListStrategy.java b/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/processor/RibbonServiceCallStaticServerListStrategy.java
deleted file mode 100644
index 6188e6d..0000000
--- a/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/processor/RibbonServiceCallStaticServerListStrategy.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/**
- * 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.ribbon.processor;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import com.netflix.client.config.IClientConfig;
-import com.netflix.loadbalancer.AbstractServerList;
-import com.netflix.loadbalancer.ServerList;
-import org.apache.camel.spi.ServiceCallServerListStrategy;
-import org.apache.camel.util.ObjectHelper;
-
-/**
- * A static list of known servers to be used by the Ribbon load balancer with the Camel Service Call EIP.
- * <p/>
- * You can implement custom implementations by existing this class and override the {@link #getUpdatedListOfServers()} that is called by Ribbon to refresh the known list
- * of servers. For example to periodically query a remote server registry for a list of active servers.
- */
-public class RibbonServiceCallStaticServerListStrategy extends AbstractServerList<RibbonServer> implements ServerList<RibbonServer>, ServiceCallServerListStrategy<RibbonServer> {
-
- private IClientConfig clientConfig;
- private final List<RibbonServer> servers = new ArrayList<>();
-
- public RibbonServiceCallStaticServerListStrategy() {
- }
-
- public RibbonServiceCallStaticServerListStrategy(List<RibbonServer> servers) {
- this.servers.addAll(servers);
- }
-
- /**
- * Build a {@link RibbonServiceCallStaticServerListStrategy} with the initial list of servers
- *
- * @param servers servers separated by comma in the format: host:port,host2:port,host3:port and so on.
- */
- public static RibbonServiceCallStaticServerListStrategy build(String servers) {
- RibbonServiceCallStaticServerListStrategy answer = new RibbonServiceCallStaticServerListStrategy();
- String[] parts = servers.split(",");
- for (String part : parts) {
- String host = ObjectHelper.before(part, ":");
- String port = ObjectHelper.after(part, ":");
- int num = Integer.valueOf(port);
- answer.addServer(host, num);
- }
- return answer;
- }
-
- /**
- * Add a server to the known list of servers.
- */
- public void addServer(RibbonServer server) {
- servers.add(server);
- }
-
- /**
- * Add a server to the known list of servers.
- */
- public void addServer(String host, int port) {
- servers.add(new RibbonServer(host, port));
- }
-
- /**
- * Remove an existing server from the list of known servers.
- */
- public void removeServer(String host, int port) {
- servers.remove(new RibbonServer(host, port));
- }
-
- @Override
- public void initWithNiwsConfig(IClientConfig clientConfig) {
- this.clientConfig = clientConfig;
- }
-
- @Override
- public List<RibbonServer> getInitialListOfServers() {
- return servers;
- }
-
- @Override
- public List<RibbonServer> getUpdatedListOfServers() {
- return servers;
- }
-
- @Override
- public List<RibbonServer> getInitialListOfServers(String name) {
- return getInitialListOfServers();
- }
-
- @Override
- public List<RibbonServer> getUpdatedListOfServers(String name) {
- return getUpdatedListOfServers();
- }
-}
http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-ribbon/src/main/resources/META-INF/services/org/apache/camel/cloud/ribbon-load-balancer
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/main/resources/META-INF/services/org/apache/camel/cloud/ribbon-load-balancer b/components/camel-ribbon/src/main/resources/META-INF/services/org/apache/camel/cloud/ribbon-load-balancer
new file mode 100644
index 0000000..161ac23
--- /dev/null
+++ b/components/camel-ribbon/src/main/resources/META-INF/services/org/apache/camel/cloud/ribbon-load-balancer
@@ -0,0 +1,17 @@
+#
+# 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.ribbon.cloud.RibbonLoadBalancerFactory
http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-ribbon/src/main/resources/META-INF/services/org/apache/camel/model/ServiceCallDefinition
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/main/resources/META-INF/services/org/apache/camel/model/ServiceCallDefinition b/components/camel-ribbon/src/main/resources/META-INF/services/org/apache/camel/model/ServiceCallDefinition
deleted file mode 100644
index 5642951..0000000
--- a/components/camel-ribbon/src/main/resources/META-INF/services/org/apache/camel/model/ServiceCallDefinition
+++ /dev/null
@@ -1,18 +0,0 @@
-#
-# 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.ribbon.processor.RibbonProcessorFactory
http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/RibbonServerListTest.java
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/RibbonServerListTest.java b/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/RibbonServerListTest.java
new file mode 100644
index 0000000..fcc4f6b
--- /dev/null
+++ b/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/RibbonServerListTest.java
@@ -0,0 +1,56 @@
+/**
+ * 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.ribbon.cloud;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.netflix.loadbalancer.LoadBalancerBuilder;
+import com.netflix.loadbalancer.RoundRobinRule;
+import com.netflix.loadbalancer.Server;
+import com.netflix.loadbalancer.ZoneAwareLoadBalancer;
+import org.apache.camel.cloud.ServiceDefinition;
+import org.apache.camel.cloud.ServiceDiscovery;
+import org.apache.camel.impl.cloud.StaticServiceDiscovery;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class RibbonServerListTest {
+ @Test
+ public void testFixedServerList() throws Exception {
+ List<ServiceDefinition> servers = new ArrayList<>();
+ servers.add(new RibbonServiceDefinition("unknown", "localhost", 9090));
+ servers.add(new RibbonServiceDefinition("unknown", "localhost", 9091));
+
+ ServiceDiscovery list = new StaticServiceDiscovery(servers);
+
+ ZoneAwareLoadBalancer<RibbonServiceDefinition> lb = LoadBalancerBuilder.<RibbonServiceDefinition>newBuilder()
+ .withDynamicServerList(new RibbonLoadBalancer.RibbonServerList("unknown", list))
+ .withRule(new RoundRobinRule())
+ .buildDynamicServerListLoadBalancer();
+
+ Server server = lb.chooseServer();
+ assertEquals("localhost", server.getHost());
+ assertEquals(9091, server.getPort());
+
+ server = lb.chooseServer();
+ assertEquals("localhost", server.getHost());
+ assertEquals(9090, server.getPort());
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/RibbonServiceCallRegistryRouteTest.java
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/RibbonServiceCallRegistryRouteTest.java b/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/RibbonServiceCallRegistryRouteTest.java
new file mode 100644
index 0000000..7f95639
--- /dev/null
+++ b/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/RibbonServiceCallRegistryRouteTest.java
@@ -0,0 +1,61 @@
+/**
+ * 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.ribbon.cloud;
+
+import org.apache.camel.RoutesBuilder;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.ribbon.RibbonConfiguration;
+import org.apache.camel.impl.cloud.StaticServiceDiscovery;
+import org.apache.camel.model.cloud.ServiceCallConfigurationDefinition;
+
+public class RibbonServiceCallRegistryRouteTest extends RibbonServiceCallRouteTest {
+ @Override
+ protected RoutesBuilder createRouteBuilder() throws Exception {
+ return new RouteBuilder() {
+ @Override
+ public void configure() throws Exception {
+ // setup a static ribbon server list with these 2 servers to start with
+ StaticServiceDiscovery servers = new StaticServiceDiscovery();
+ servers.addServer("localhost", 9090);
+ servers.addServer("localhost", 9091);
+
+ RibbonConfiguration configuration = new RibbonConfiguration();
+ RibbonLoadBalancer loadBalancer = new RibbonLoadBalancer(configuration);
+
+ // configure camel service call
+ ServiceCallConfigurationDefinition config = new ServiceCallConfigurationDefinition();
+ config.setLoadBalancer(loadBalancer);
+ config.setServiceDiscovery(servers);
+
+ // register configuration
+ context.setServiceCallConfiguration(config);
+
+ from("direct:start")
+ .serviceCall("myService")
+ .to("mock:result");
+ from("jetty:http://localhost:9090")
+ .to("mock:9090")
+ .transform().constant("9090");
+ from("jetty:http://localhost:9091")
+ .to("mock:9091")
+ .transform().constant("9091");
+ }
+ };
+ }
+}
+
http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/RibbonServiceCallRouteTest.java
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/RibbonServiceCallRouteTest.java b/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/RibbonServiceCallRouteTest.java
new file mode 100644
index 0000000..6bda099
--- /dev/null
+++ b/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/RibbonServiceCallRouteTest.java
@@ -0,0 +1,72 @@
+/**
+ * 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.ribbon.cloud;
+
+import org.apache.camel.RoutesBuilder;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.ribbon.RibbonConfiguration;
+import org.apache.camel.impl.cloud.StaticServiceDiscovery;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+
+public class RibbonServiceCallRouteTest extends CamelTestSupport {
+ @Test
+ public void testServiceCall() throws Exception {
+ getMockEndpoint("mock:9090").expectedMessageCount(1);
+ getMockEndpoint("mock:9091").expectedMessageCount(1);
+ getMockEndpoint("mock:result").expectedMessageCount(2);
+
+ String out = template.requestBody("direct:start", null, String.class);
+ String out2 = template.requestBody("direct:start", null, String.class);
+ assertEquals("9091", out);
+ assertEquals("9090", out2);
+
+ assertMockEndpointsSatisfied();
+ }
+
+ @Override
+ protected RoutesBuilder createRouteBuilder() throws Exception {
+ return new RouteBuilder() {
+ @Override
+ public void configure() throws Exception {
+ // setup a static ribbon server list with these 2 servers to start with
+ StaticServiceDiscovery servers = new StaticServiceDiscovery();
+ servers.addServer("localhost", 9090);
+ servers.addServer("localhost", 9091);
+
+ RibbonConfiguration configuration = new RibbonConfiguration();
+ RibbonLoadBalancer loadBalancer = new RibbonLoadBalancer(configuration);
+
+ from("direct:start")
+ .serviceCall()
+ .name("myService")
+ .loadBalancer(loadBalancer)
+ .serviceDiscovery(servers)
+ .end()
+ .to("mock:result");
+ from("jetty:http://localhost:9090")
+ .to("mock:9090")
+ .transform().constant("9090");
+ from("jetty:http://localhost:9091")
+ .to("mock:9091")
+ .transform().constant("9091");
+ }
+ };
+ }
+}
+
http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/RibbonServiceCallUpdateRouteTest.java
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/RibbonServiceCallUpdateRouteTest.java b/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/RibbonServiceCallUpdateRouteTest.java
new file mode 100644
index 0000000..c00f1c7
--- /dev/null
+++ b/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/RibbonServiceCallUpdateRouteTest.java
@@ -0,0 +1,99 @@
+/**
+ * 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.ribbon.cloud;
+
+import java.util.Collections;
+
+import org.apache.camel.RoutesBuilder;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.ribbon.RibbonConfiguration;
+import org.apache.camel.impl.cloud.StaticServiceDiscovery;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+
+public class RibbonServiceCallUpdateRouteTest extends CamelTestSupport {
+ private final StaticServiceDiscovery servers = new StaticServiceDiscovery();
+
+ @Override
+ public void setUp() throws Exception {
+ // setup a static ribbon server list with these 2 servers to start with
+ servers.addServer("localhost", 9090);
+ servers.addServer("localhost", 9091);
+
+ super.setUp();
+ }
+
+ @Test
+ public void testServiceCall() throws Exception {
+ getMockEndpoint("mock:9090").expectedMessageCount(1);
+ getMockEndpoint("mock:9091").expectedMessageCount(1);
+ getMockEndpoint("mock:result").expectedMessageCount(2);
+
+ String out = template.requestBody("direct:start", null, String.class);
+ String out2 = template.requestBody("direct:start", null, String.class);
+ assertEquals("9091", out);
+ assertEquals("9090", out2);
+
+ assertMockEndpointsSatisfied();
+
+ // stop the first server and remove it from the known list of servers
+ context.stopRoute("9090");
+ servers.removeServer("localhost", 9090);
+
+ // call the other active server
+ String out3 = template.requestBody("direct:start", null, String.class);
+ assertEquals("9091", out3);
+
+ // sleep a bit to make the server updated run and detect that a server is no longer in the list
+ log.debug("Sleeping to all the server list updated to run");
+ Thread.sleep(1000);
+ log.debug("Calling the service now");
+
+ // call again and it should call 9091 as its the only active server
+ String out4 = template.requestBody("direct:start", null, String.class);
+ assertEquals("9091", out4);
+ }
+
+ @Override
+ protected RoutesBuilder createRouteBuilder() throws Exception {
+ return new RouteBuilder() {
+ @Override
+ public void configure() throws Exception {
+ RibbonConfiguration configuration = new RibbonConfiguration();
+ // lets update quick so we do not have to sleep so much in the tests
+ configuration.setClientConfig(Collections.singletonMap("ServerListRefreshInterval", "250"));
+ RibbonLoadBalancer loadBalancer = new RibbonLoadBalancer(configuration);
+
+ from("direct:start")
+ .serviceCall()
+ .name("myService")
+ .loadBalancer(loadBalancer)
+ .serviceDiscovery(servers)
+ .end()
+ .to("mock:result");
+ from("jetty:http://localhost:9090").routeId("9090")
+ .to("mock:9090")
+ .transform().constant("9090");
+ from("jetty:http://localhost:9091").routeId("9091")
+ .to("mock:9091")
+ .transform().constant("9091");
+ }
+ };
+ }
+}
+
http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/SpringBeanServiceCallRouteTest.java
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/SpringBeanServiceCallRouteTest.java b/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/SpringBeanServiceCallRouteTest.java
new file mode 100644
index 0000000..9c99aec
--- /dev/null
+++ b/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/SpringBeanServiceCallRouteTest.java
@@ -0,0 +1,31 @@
+/**
+ * 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.ribbon.cloud;
+
+import org.springframework.context.support.AbstractApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+import org.springframework.test.annotation.DirtiesContext;
+
+@DirtiesContext
+public class SpringBeanServiceCallRouteTest extends SpringRibbonServiceCallRouteTest {
+ @Override
+ protected AbstractApplicationContext createApplicationContext() {
+ return new ClassPathXmlApplicationContext("org/apache/camel/component/ribbon/cloud/SpringBeanRibbonServiceCallRouteTest.xml");
+ }
+}
+