Peter Palaga created CAMEL-11882:
------------------------------------

             Summary: ServiceDefinition.metadata not passed to 
RibbonServiceLoadBalancer
                 Key: CAMEL-11882
                 URL: https://issues.apache.org/jira/browse/CAMEL-11882
             Project: Camel
          Issue Type: Bug
          Components: camel-ribbon
            Reporter: Peter Palaga
            Assignee: Peter Palaga


I tried to write a Ribbon Load Balancer test that would send requests to two 
application paths on the same server and port. Because 
{{org.apache.camel.cloud.ServiceDefinition}} has no notion of context path, I 
used the {{ServiceDefinition.metadata}} to define it and in the {{serviceCall}} 
I used an expression 
{{.expression().simple("jetty:http://${header.CamelServiceCallServiceHost}:${header.CamelServiceCallServicePort}/${header.CamelServiceCallServiceMeta[contextPath]}";)}}
 to use it.
However, the test is not passing because 
{{RibbonServiceLoadBalancer.RibbonServerList.asRibbonServerList(List<ServiceDefinition>)}}
 is not passing the medata map to {{RibbonServiceDefinition}}. The test passes 
as expected when {{RibbonServerList.asRibbonServerList()}} is fixed.

Here is the test:

{code}

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 RibbonServiceCallRouteMetadataTest extends CamelTestSupport {
    @Test
    public void testServiceCall() throws Exception {
        getMockEndpoint("mock:app1").expectedMessageCount(1);
        getMockEndpoint("mock:app2").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("app2", out);
        assertEquals("app1", 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("myService", "localhost", 9090, 
Collections.singletonMap("contextPath", "app1"));
                servers.addServer("myService", "localhost", 9090, 
Collections.singletonMap("contextPath", "app2"));

                RibbonConfiguration configuration = new RibbonConfiguration();
                RibbonServiceLoadBalancer loadBalancer = new 
RibbonServiceLoadBalancer(configuration);

                from("direct:start")
                    .serviceCall()
                        .name("myService")
                        
.expression().simple("jetty:http://${header.CamelServiceCallServiceHost}:${header.CamelServiceCallServicePort}/${header.CamelServiceCallServiceMeta[contextPath]}";)
                        .loadBalancer(loadBalancer)
                        .serviceDiscovery(servers)
                        .end()
                    .to("mock:result");
                from("jetty:http://localhost:9090/app1";)
                    .to("mock:app1")
                    .transform().constant("app1");
                from("jetty:http://localhost:9090/app2";)
                    .to("mock:app2")
                    .transform().constant("app2");
            }
        };
    }
}

{code}



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to