/**
* 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.impl.cloud;
import java.util.List;
import java.util.UUID;
import org.apache.camel.CamelContext;
import org.apache.camel.Processor;
import org.apache.camel.Route;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.cloud.ServiceDefinition;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.camel.impl.SimpleRegistry;
import org.apache.camel.model.cloud.ServiceCallConfigurationDefinition;
import org.apache.camel.model.cloud.ServiceCallDefinitionConstants;
import org.apache.camel.model.cloud.ServiceCallExpressionConfiguration;
import org.apache.camel.model.language.SimpleExpression;
import org.junit.Assert;
import org.junit.Test;
public class ServiceCallConfigurationTest {
// ****************************************
// test default resolution
// ****************************************
@Test
public void testDefaultConfigurationFromCamelContext() throws Exception {
StaticServiceDiscovery sd = new StaticServiceDiscovery();
sd.addServer("127.0.0.1:8080");
sd.addServer("127.0.0.1:8081");
BlacklistServiceFilter sf = new BlacklistServiceFilter();
sf.addServer("127.0.0.1:8080");
ServiceCallConfigurationDefinition conf = new ServiceCallConfigurationDefinition();
conf.setServiceDiscovery(sd);
conf.setServiceFilter(sf);
CamelContext context = new DefaultCamelContext();
context.setServiceCallConfiguration(conf);
context.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
from("direct:start")
.routeId("default")
.serviceCall()
.name("scall")
.component("file")
.end();
}
});
context.start();
DefaultServiceCallProcessor proc = findServiceCallProcessor(context.getRoute("default"));
Assert.assertNotNull(proc);
Assert.assertTrue(proc.getLoadBalancer() instanceof DefaultServiceLoadBalancer);
DefaultServiceLoadBalancer loadBalancer = (DefaultServiceLoadBalancer)proc.getLoadBalancer();
Assert.assertEquals(sd, loadBalancer.getServiceDiscovery());
Assert.assertEquals(sf, loadBalancer.getServiceFilter());
context.stop();
}
@Test
public void testDefaultConfigurationFromRegistryWithDefaultName() throws Exception {
StaticServiceDiscovery sd = new StaticServiceDiscovery();
sd.addServer("127.0.0.1:8080");
sd.addServer("127.0.0.1:8081");
BlacklistServiceFilter sf = new BlacklistServiceFilter();
sf.addServer("127.0.0.1:8080");
ServiceCallConfigurationDefinition conf = new ServiceCallConfigurationDefinition();
conf.setServiceDiscovery(sd);
conf.serviceFilter(sf);
SimpleRegistry reg = new SimpleRegistry();
reg.put(ServiceCallDefinitionConstants.DEFAULT_SERVICE_CALL_CONFIG_ID, conf);
CamelContext context = new DefaultCamelContext(reg);
context.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
from("direct:start")
.routeId("default")
.serviceCall()
.name("scall")
.component("file")
.end();
}
});
context.start();
DefaultServiceCallProcessor proc = findServiceCallProcessor(context.getRoute("default"));
Assert.assertNotNull(proc);
Assert.assertTrue(proc.getLoadBalancer() instanceof DefaultServiceLoadBalancer);
DefaultServiceLoadBalancer loadBalancer = (DefaultServiceLoadBalancer)proc.getLoadBalancer();
Assert.assertEquals(sd, loadBalancer.getServiceDiscovery());
Assert.assertEquals(sf, loadBalancer.getServiceFilter());
context.stop();
}
@Test
public void testDefaultConfigurationFromRegistryWithNonDefaultName() throws Exception {
StaticServiceDiscovery sd = new StaticServiceDiscovery();
sd.addServer("127.0.0.1:8080");
sd.addServer("127.0.0.1:8081");
BlacklistServiceFilter sf = new BlacklistServiceFilter();
sf.addServer("127.0.0.1:8080");
ServiceCallConfigurationDefinition conf = new ServiceCallConfigurationDefinition();
conf.setServiceDiscovery(sd);
conf.serviceFilter(sf);
SimpleRegistry reg = new SimpleRegistry();
reg.put(UUID.randomUUID().toString(), conf);
CamelContext context = new DefaultCamelContext(reg);
context.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
from("direct:start")
.routeId("default")
.serviceCall()
.name("scall")
.component("file")
.end();
}
});
context.start();
DefaultServiceCallProcessor proc = findServiceCallProcessor(context.getRoute("default"));
Assert.assertNotNull(proc);
Assert.assertTrue(proc.getLoadBalancer() instanceof DefaultServiceLoadBalancer);
DefaultServiceLoadBalancer loadBalancer = (DefaultServiceLoadBalancer)proc.getLoadBalancer();
Assert.assertEquals(sd, loadBalancer.getServiceDiscovery());
Assert.assertEquals(sf, loadBalancer.getServiceFilter());
context.stop();
}
// ****************************************
// test mixed resolution
// ****************************************
@Test
public void testMixedConfiguration() throws Exception {
// Default
StaticServiceDiscovery defaultServiceDiscovery = new StaticServiceDiscovery();
defaultServiceDiscovery.addServer("127.0.0.1:8080");
defaultServiceDiscovery.addServer("127.0.0.1:8081");
defaultServiceDiscovery.addServer("127.0.0.1:8082");
BlacklistServiceFilter defaultServiceFilter = new BlacklistServiceFilter();
defaultServiceFilter.addServer("127.0.0.1:8080");
ServiceCallConfigurationDefinition defaultConfiguration = new ServiceCallConfigurationDefinition();
defaultConfiguration.setServiceDiscovery(defaultServiceDiscovery);
defaultConfiguration.serviceFilter(defaultServiceFilter);
// Named
BlacklistServiceFilter namedServiceFilter = new BlacklistServiceFilter();
namedServiceFilter.addServer("127.0.0.1:8081");
ServiceCallConfigurationDefinition namedConfiguration = new ServiceCallConfigurationDefinition();
namedConfiguration.serviceFilter(namedServiceFilter);
// Local
StaticServiceDiscovery localServiceDiscovery = new StaticServiceDiscovery();
localServiceDiscovery.addServer("127.0.0.1:8080");
localServiceDiscovery.addServer("127.0.0.1:8081");
localServiceDiscovery.addServer("127.0.0.1:8082");
localServiceDiscovery.addServer("127.0.0.1:8084");
// Camel context
CamelContext context = new DefaultCamelContext();
context.setServiceCallConfiguration(defaultConfiguration);
context.addServiceCallConfiguration("named", namedConfiguration);
context.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
from("direct:default")
.id("default")
.serviceCall()
.name("default-scall")
.component("file")
.end();
from("direct:named")
.id("named")
.serviceCall()
.serviceCallConfiguration("named")
.name("named-scall")
.component("file")
.end();
from("direct:local")
.id("local")
.serviceCall()
.serviceCallConfiguration("named")
.name("local-scall")
.component("file")
.serviceDiscovery(localServiceDiscovery)
.end();
}
});
context.start();
{
// Default
DefaultServiceCallProcessor proc = findServiceCallProcessor(context.getRoute("default"));
Assert.assertNotNull(proc);
Assert.assertTrue(proc.getLoadBalancer() instanceof DefaultServiceLoadBalancer);
DefaultServiceLoadBalancer loadBalancer = (DefaultServiceLoadBalancer) proc.getLoadBalancer();
Assert.assertEquals(defaultServiceDiscovery, loadBalancer.getServiceDiscovery());
Assert.assertEquals(defaultServiceFilter, loadBalancer.getServiceFilter());
}
{
// Named
DefaultServiceCallProcessor proc = findServiceCallProcessor(context.getRoute("named"));
Assert.assertNotNull(proc);
Assert.assertTrue(proc.getLoadBalancer() instanceof DefaultServiceLoadBalancer);
DefaultServiceLoadBalancer loadBalancer = (DefaultServiceLoadBalancer) proc.getLoadBalancer();
Assert.assertEquals(defaultServiceDiscovery, loadBalancer.getServiceDiscovery());
Assert.assertEquals(namedServiceFilter, loadBalancer.getServiceFilter());
}
{
// Local
DefaultServiceCallProcessor proc = findServiceCallProcessor(context.getRoute("local"));
Assert.assertNotNull(proc);
Assert.assertTrue(proc.getLoadBalancer() instanceof DefaultServiceLoadBalancer);
DefaultServiceLoadBalancer loadBalancer = (DefaultServiceLoadBalancer) proc.getLoadBalancer();
Assert.assertEquals(localServiceDiscovery, loadBalancer.getServiceDiscovery());
Assert.assertEquals(namedServiceFilter, loadBalancer.getServiceFilter());
}
context.stop();
}
// **********************************************
// test placeholders
// **********************************************
@Test
public void testPlaceholders() throws Exception {
CamelContext context = null;
try {
System.setProperty("scall.name", "service-name");
System.setProperty("scall.scheme", "file");
System.setProperty("scall.servers1", "hello-service@localhost:8081,hello-service@localhost:8082");
System.setProperty("scall.servers2", "hello-svc@localhost:8083,hello-svc@localhost:8084");
System.setProperty("scall.filter", "hello-svc@localhost:8083");
ServiceCallConfigurationDefinition global = new ServiceCallConfigurationDefinition();
global.blacklistFilter().servers("{{scall.filter}}");
context = new DefaultCamelContext();
context.setServiceCallConfiguration(global);
context.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
from("direct:start")
.routeId("default")
.serviceCall()
.name("{{scall.name}}")
.component("{{scall.scheme}}")
.uri("direct:{{scall.name}}")
.staticServiceDiscovery()
.servers("{{scall.servers1}}")
.servers("{{scall.servers2}}")
.end()
.end();
}
});
context.start();
DefaultServiceCallProcessor proc = findServiceCallProcessor(context.getRoute("default"));
Assert.assertNotNull(proc);
Assert.assertTrue(proc.getLoadBalancer() instanceof DefaultServiceLoadBalancer);
Assert.assertEquals("service-name", proc.getName());
Assert.assertEquals("file", proc.getScheme());
Assert.assertEquals("direct:service-name", proc.getUri());
DefaultServiceLoadBalancer lb = (DefaultServiceLoadBalancer)proc.getLoadBalancer();
Assert.assertTrue(lb.getServiceFilter() instanceof BlacklistServiceFilter);
BlacklistServiceFilter filter = (BlacklistServiceFilter)lb.getServiceFilter();
List<ServiceDefinition> blacklist = filter.getBlacklistedServices();
Assert.assertEquals(1, blacklist.size());
Assert.assertTrue(lb.getServiceDiscovery() instanceof StaticServiceDiscovery);
List<ServiceDefinition> services1 = lb.getServiceDiscovery().getServices("hello-service");
Assert.assertEquals(2, filter.apply(services1).size());
List<ServiceDefinition> services2 = lb.getServiceDiscovery().getServices("hello-svc");
Assert.assertEquals(1, filter.apply(services2).size());
} finally {
if (context != null) {
context.stop();
}
// Cleanup system properties
System.clearProperty("scall.name");
System.clearProperty("scall.scheme");
System.clearProperty("scall.servers1");
System.clearProperty("scall.servers2");
System.clearProperty("scall.filter");
}
context.stop();
}
// **********************************************
// test placeholders
// **********************************************
@Test
public void testExpression() throws Exception {
CamelContext context = null;
try {
ServiceCallConfigurationDefinition config = new ServiceCallConfigurationDefinition();
config.setServiceDiscovery(new StaticServiceDiscovery());
config.setExpressionConfiguration(
new ServiceCallExpressionConfiguration().expression(
new SimpleExpression("file:${header.CamelServiceCallServiceHost}:${header.CamelServiceCallServicePort}")
)
);
context = new DefaultCamelContext();
context.setServiceCallConfiguration(config);
context.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
from("direct:start")
.routeId("default")
.serviceCall("scall");
}
});
context.start();
DefaultServiceCallProcessor proc = findServiceCallProcessor(context.getRoute("default"));
Assert.assertNotNull(proc);
Assert.assertTrue(proc.getExpression() instanceof SimpleExpression);
} finally {
if (context != null) {
context.stop();
}
}
context.stop();
}
// **********************************************
// Helper
// **********************************************
private DefaultServiceCallProcessor findServiceCallProcessor(Route route) {
for (Processor processor : route.navigate().next()) {
if (processor instanceof DefaultServiceCallProcessor) {
return (DefaultServiceCallProcessor)processor;
}
}
throw new IllegalStateException("Unable to find a ServiceCallProcessor");
}
}