From b746ad5504c29ca55c009b16266266a4894a7234 Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Tue, 2 Jun 2015 17:25:26 -0600 Subject: [PATCH] Fix name of default ribbon config if config is not in an eclosing class fixes gh-374 --- .../RibbonClientConfigurationRegistrar.java | 9 +- ...RibbonClientDefaultConfigurationTests.java | 89 +++++++++++++++++++ ...ClientDefaultConfigurationTestsConfig.java | 80 +++++++++++++++++ 3 files changed, 176 insertions(+), 2 deletions(-) create mode 100644 spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/test/RibbonClientDefaultConfigurationTests.java create mode 100644 spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/test/RibbonClientDefaultConfigurationTestsConfig.java diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfigurationRegistrar.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfigurationRegistrar.java index 8465f5b7..bb481a77 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfigurationRegistrar.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfigurationRegistrar.java @@ -43,8 +43,13 @@ public class RibbonClientConfigurationRegistrar implements ImportBeanDefinitionR } } if (attrs != null && attrs.containsKey("defaultConfiguration")) { - registerClientConfiguration(registry, - "default." + metadata.getEnclosingClassName(), + String name; + if (metadata.hasEnclosingClass()) { + name = "default." + metadata.getEnclosingClassName(); + } else { + name = "default." + metadata.getClassName(); + } + registerClientConfiguration(registry, name, attrs.get("defaultConfiguration")); } Map client = metadata.getAnnotationAttributes( diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/test/RibbonClientDefaultConfigurationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/test/RibbonClientDefaultConfigurationTests.java new file mode 100644 index 00000000..ce7b1fb2 --- /dev/null +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/test/RibbonClientDefaultConfigurationTests.java @@ -0,0 +1,89 @@ +/* + * Copyright 2013-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.netflix.ribbon.test; + +import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.IntegrationTest; +import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.cloud.netflix.ribbon.SpringClientFactory; +import org.springframework.cloud.netflix.ribbon.test.RibbonClientDefaultConfigurationTestsConfig.BazServiceList; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.netflix.loadbalancer.BestAvailableRule; +import com.netflix.loadbalancer.PingUrl; +import com.netflix.loadbalancer.Server; +import com.netflix.loadbalancer.ServerListSubsetFilter; +import com.netflix.loadbalancer.ZoneAwareLoadBalancer; + +/** + * @author Dave Syer + * @author Spencer Gibb + */ +@RunWith(SpringJUnit4ClassRunner.class) +@SpringApplicationConfiguration(classes = RibbonClientDefaultConfigurationTests.TestConfig.class) +@IntegrationTest("ribbon.eureka.enabled=true") +@DirtiesContext +public class RibbonClientDefaultConfigurationTests { + + @Autowired + private SpringClientFactory factory; + + @Test + public void ruleOverridesDefault() throws Exception { + assertThat("wrong rule type", getLoadBalancer("baz").getRule(), + is(instanceOf(BestAvailableRule.class))); + } + + @Test + public void pingOverridesDefault() throws Exception { + assertThat("wrong ping type", getLoadBalancer("baz").getPing(), + is(instanceOf(PingUrl.class))); + } + + @Test + public void serverListOverridesDefault() throws Exception { + assertThat("wrong server list type", getLoadBalancer("baz").getServerListImpl(), + is(instanceOf(BazServiceList.class))); + } + + @SuppressWarnings("unchecked") + private ZoneAwareLoadBalancer getLoadBalancer(String name) { + return (ZoneAwareLoadBalancer) this.factory.getLoadBalancer(name); + } + + @Test + public void serverListFilterOverride() throws Exception { + assertThat("wrong filter type", getLoadBalancer("baz").getFilter(), + is(instanceOf(ServerListSubsetFilter.class))); + } + + @EnableAutoConfiguration + @Configuration + public static class TestConfig { + + } + +} diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/test/RibbonClientDefaultConfigurationTestsConfig.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/test/RibbonClientDefaultConfigurationTestsConfig.java new file mode 100644 index 00000000..7fdf7cb6 --- /dev/null +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/test/RibbonClientDefaultConfigurationTestsConfig.java @@ -0,0 +1,80 @@ +/* + * Copyright 2013-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.netflix.ribbon.test; + +import com.netflix.client.config.IClientConfig; +import com.netflix.loadbalancer.BestAvailableRule; +import com.netflix.loadbalancer.ConfigurationBasedServerList; +import com.netflix.loadbalancer.IPing; +import com.netflix.loadbalancer.IRule; +import com.netflix.loadbalancer.PingUrl; +import com.netflix.loadbalancer.Server; +import com.netflix.loadbalancer.ServerList; +import com.netflix.loadbalancer.ServerListSubsetFilter; +import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; +import org.springframework.cloud.netflix.archaius.ArchaiusAutoConfiguration; +import org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration; +import org.springframework.cloud.netflix.ribbon.RibbonAutoConfiguration; +import org.springframework.cloud.netflix.ribbon.RibbonClients; +import org.springframework.cloud.netflix.ribbon.eureka.RibbonEurekaAutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +/** + * @author Spencer Gibb + */ +@Configuration +@Import({ PropertyPlaceholderAutoConfiguration.class, + ArchaiusAutoConfiguration.class, EurekaClientAutoConfiguration.class, + RibbonAutoConfiguration.class, RibbonEurekaAutoConfiguration.class}) +@RibbonClients(defaultConfiguration = DefaultRibbonConfig.class) +public class RibbonClientDefaultConfigurationTestsConfig { + + public static class BazServiceList extends ConfigurationBasedServerList { + public BazServiceList(IClientConfig config) { + super.initWithNiwsConfig(config); + } + } +} + + +@Configuration +class DefaultRibbonConfig { + + @Bean + public IRule ribbonRule() { + return new BestAvailableRule(); + } + + @Bean + public IPing ribbonPing() { + return new PingUrl(); + } + + @Bean + public ServerList ribbonServerList(IClientConfig config) { + return new RibbonClientDefaultConfigurationTestsConfig.BazServiceList(config); + } + + @Bean + public ServerListSubsetFilter serverListFilter() { + ServerListSubsetFilter filter = new ServerListSubsetFilter(); + return filter; + } + +} \ No newline at end of file