From 99ad52c2ddde248a8a433b7a7843f9ca6968a2c5 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Sat, 9 Dec 2017 06:59:57 -0800 Subject: [PATCH] Fixed stub runner cloud registration --- .../cloud/eureka/EurekaStubsRegistrar.java | 15 ++++- ...nerSpringCloudEurekaAutoConfiguration.java | 55 ++++++++++++++++--- 2 files changed, 60 insertions(+), 10 deletions(-) diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/spring/cloud/eureka/EurekaStubsRegistrar.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/spring/cloud/eureka/EurekaStubsRegistrar.java index e12bc4c3af..5210c97056 100644 --- a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/spring/cloud/eureka/EurekaStubsRegistrar.java +++ b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/spring/cloud/eureka/EurekaStubsRegistrar.java @@ -48,9 +48,10 @@ public class EurekaStubsRegistrar implements StubsRegistrar { .validNamesAndPorts(); for (Map.Entry entry : activeStubs.entrySet()) { Application application = new Application(name(entry.getKey()), entry.getKey().getArtifactId(), - StringUtils.hasText(this.eurekaInstanceConfigBean.getHostname()) ? - this.eurekaInstanceConfigBean.getHostname() : - this.inetUtils.findFirstNonLoopbackAddress().getHostName(), entry.getValue()); + StringUtils.hasText(hostName(entry)) ? + hostName(entry) : + this.inetUtils.findFirstNonLoopbackAddress().getHostName(), + port(entry)); try { Registration register = this.eurekaClient.register(application); this.discoveryList.add(new Renewer( @@ -67,6 +68,14 @@ public class EurekaStubsRegistrar implements StubsRegistrar { } } + protected String hostName(Map.Entry entry) { + return this.eurekaInstanceConfigBean.getHostname(); + } + + protected int port(Map.Entry entry) { + return entry.getValue(); + } + private String name(StubConfiguration stubConfiguration) { String resolvedName = this.stubMapperProperties.fromIvyNotationToId( stubConfiguration.toColonSeparatedDependencyNotation()); diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/spring/cloud/eureka/StubRunnerSpringCloudEurekaAutoConfiguration.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/spring/cloud/eureka/StubRunnerSpringCloudEurekaAutoConfiguration.java index 4bb6b448bf..b900c5aadd 100644 --- a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/spring/cloud/eureka/StubRunnerSpringCloudEurekaAutoConfiguration.java +++ b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/spring/cloud/eureka/StubRunnerSpringCloudEurekaAutoConfiguration.java @@ -16,10 +16,19 @@ package org.springframework.cloud.contract.stubrunner.spring.cloud.eureka; +import java.util.Map; + +import com.netflix.appinfo.ApplicationInfoManager; +import com.netflix.discovery.EurekaClientConfig; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.bind.RelaxedPropertyResolver; import org.springframework.cloud.commons.util.InetUtils; +import org.springframework.cloud.contract.stubrunner.StubConfiguration; import org.springframework.cloud.contract.stubrunner.StubRunning; import org.springframework.cloud.contract.stubrunner.spring.StubRunnerConfiguration; import org.springframework.cloud.contract.stubrunner.spring.cloud.ConditionalOnStubbedDiscoveryDisabled; @@ -32,9 +41,8 @@ import org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; - -import com.netflix.appinfo.ApplicationInfoManager; -import com.netflix.discovery.EurekaClientConfig; +import org.springframework.context.annotation.Profile; +import org.springframework.core.env.Environment; /** * Autoconfiguration for registering stubs in a Eureka Service discovery @@ -51,10 +59,43 @@ import com.netflix.discovery.EurekaClientConfig; @ConditionalOnProperty(value = "stubrunner.cloud.eureka.enabled", matchIfMissing = true) public class StubRunnerSpringCloudEurekaAutoConfiguration { - @Bean(initMethod = "registerStubs") - public StubsRegistrar stubsRegistrar(StubRunning stubRunning, Eureka eureka, - StubMapperProperties stubMapperProperties, InetUtils inetUtils, EurekaInstanceConfigBean eurekaInstanceConfigBean) { - return new EurekaStubsRegistrar(stubRunning, eureka, stubMapperProperties, inetUtils, eurekaInstanceConfigBean); + @Profile("!cloud") + @Configuration + protected static class NonCloudConfig { + @Bean(initMethod = "registerStubs") + public StubsRegistrar stubsRegistrar(StubRunning stubRunning, Eureka eureka, + StubMapperProperties stubMapperProperties, InetUtils inetUtils, EurekaInstanceConfigBean eurekaInstanceConfigBean) { + return new EurekaStubsRegistrar(stubRunning, eureka, stubMapperProperties, inetUtils, eurekaInstanceConfigBean); + } + } + + @Profile("cloud") + @Configuration + protected static class CloudConfig { + private static final int DEFAULT_PORT = 80; + private static final Log log = LogFactory.getLog(CloudConfig.class); + + @Autowired Environment environment; + + @Bean(initMethod = "registerStubs") + public StubsRegistrar cloudStubsRegistrar(StubRunning stubRunning, Eureka eureka, + StubMapperProperties stubMapperProperties, InetUtils inetUtils, EurekaInstanceConfigBean eurekaInstanceConfigBean) { + final RelaxedPropertyResolver resolver = new RelaxedPropertyResolver( + CloudConfig.this.environment); + return new EurekaStubsRegistrar(stubRunning, eureka, stubMapperProperties, inetUtils, eurekaInstanceConfigBean) { + @Override protected String hostName(Map.Entry entry) { + String hostname = + resolver.getProperty("application.hostname") + + "-" + entry.getValue() + "." + resolver.getProperty("application.domain"); + log.info("Registering stub [" + entry.getKey().getArtifactId() + "] with hostname [" + hostname + "]"); + return hostname; + } + + @Override protected int port(Map.Entry entry) { + return DEFAULT_PORT; + } + }; + } } @Bean(name = "eurekaRegistrar")