Override CloudPlatform auto-detection with property

This commit adds a new `"spring.main.cloud-platform"` configuration
property that overrides the `CloudPlatform` detection.

This makes it easier to enable paltform-specific features when running
applications locally or when writing integration tests.

Closes gh-20553
This commit is contained in:
Brian Clozel 2020-03-19 14:10:26 +01:00
parent 0b7f198b54
commit 4b7ed5efef
3 changed files with 46 additions and 9 deletions

View File

@ -38,7 +38,7 @@ public enum CloudPlatform {
CLOUD_FOUNDRY {
@Override
public boolean isActive(Environment environment) {
public boolean isAutoDetected(Environment environment) {
return environment.containsProperty("VCAP_APPLICATION") || environment.containsProperty("VCAP_SERVICES");
}
@ -50,7 +50,7 @@ public enum CloudPlatform {
HEROKU {
@Override
public boolean isActive(Environment environment) {
public boolean isAutoDetected(Environment environment) {
return environment.containsProperty("DYNO");
}
@ -62,7 +62,7 @@ public enum CloudPlatform {
SAP {
@Override
public boolean isActive(Environment environment) {
public boolean isAutoDetected(Environment environment) {
return environment.containsProperty("HC_LANDSCAPE");
}
@ -82,14 +82,14 @@ public enum CloudPlatform {
private static final String SERVICE_PORT_SUFFIX = "_SERVICE_PORT";
@Override
public boolean isActive(Environment environment) {
public boolean isAutoDetected(Environment environment) {
if (environment instanceof ConfigurableEnvironment) {
return isActive((ConfigurableEnvironment) environment);
return isAutoDetected((ConfigurableEnvironment) environment);
}
return false;
}
private boolean isActive(ConfigurableEnvironment environment) {
private boolean isAutoDetected(ConfigurableEnvironment environment) {
PropertySource<?> environmentPropertySource = environment.getPropertySources()
.get(StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME);
if (environmentPropertySource != null) {
@ -98,13 +98,13 @@ public enum CloudPlatform {
return true;
}
if (environmentPropertySource instanceof EnumerablePropertySource) {
return isActive((EnumerablePropertySource<?>) environmentPropertySource);
return isAutoDetected((EnumerablePropertySource<?>) environmentPropertySource);
}
}
return false;
}
private boolean isActive(EnumerablePropertySource<?> environmentPropertySource) {
private boolean isAutoDetected(EnumerablePropertySource<?> environmentPropertySource) {
for (String propertyName : environmentPropertySource.getPropertyNames()) {
if (propertyName.endsWith(SERVICE_HOST_SUFFIX)) {
String serviceName = propertyName.substring(0,
@ -124,7 +124,31 @@ public enum CloudPlatform {
* @param environment the environment
* @return if the platform is active.
*/
public abstract boolean isActive(Environment environment);
public boolean isActive(Environment environment) {
return isEnforced(environment) || isAutoDetected(environment);
}
/**
* Detemines if the platform is enforced by looking at the
* {@code "spring.main.cloud-platform"} configuration property.
* @param environment the environment
* @return if the platform is enforced
*/
public boolean isEnforced(Environment environment) {
String platform = environment.getProperty("spring.main.cloud-platform");
if (platform != null) {
return this.name().equalsIgnoreCase(platform);
}
return false;
}
/**
* Determines is the platform is auto-detected by looking ofr platform-specific
* environment variables.
* @param environment the environment
* @return if the platform is auto-detected.
*/
public abstract boolean isAutoDetected(Environment environment);
/**
* Returns if the platform is behind a load balancer and uses

View File

@ -640,6 +640,11 @@
"description": "Mode used to display the banner when the application runs.",
"defaultValue": "console"
},
{
"name": "spring.main.cloud-platform",
"type": "org.springframework.boot.cloud.CloudPlatform",
"description": "Override the Cloud Platform auto-detection."
},
{
"name": "spring.main.lazy-initialization",
"type": "java.lang.Boolean",

View File

@ -129,6 +129,14 @@ class CloudPlatformTests {
assertThat(platform).isNull();
}
@Test
void getActiveWhenHasEnforcedCloudPlatform() {
Environment environment = getEnvironmentWithEnvVariables(
Collections.singletonMap("spring.main.cloud-platform", "kubernetes"));
CloudPlatform platform = CloudPlatform.getActive(environment);
assertThat(platform).isEqualTo(CloudPlatform.KUBERNETES);
}
private Environment getEnvironmentWithEnvVariables(Map<String, Object> environmentVariables) {
MockEnvironment environment = new MockEnvironment();
PropertySource<?> propertySource = new SystemEnvironmentPropertySource(