Don't detect CloudPlatform when property is set

Update `CloudPlatform.isActive` to back-off from detection when any
`spring.main.cloud-platform` property is set.

See gh-25455
pull/27078/head
nguyensach 4 years ago committed by Phillip Webb
parent fcb2210a87
commit 70f44d3a56

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2020 the original author or authors. * Copyright 2012-2021 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -28,6 +28,7 @@ import org.springframework.core.env.StandardEnvironment;
* *
* @author Phillip Webb * @author Phillip Webb
* @author Brian Clozel * @author Brian Clozel
* @author Nguyen Sach
* @since 1.3.0 * @since 1.3.0
*/ */
public enum CloudPlatform { public enum CloudPlatform {
@ -131,13 +132,15 @@ public enum CloudPlatform {
}; };
private static final String PROPERTY_NAME = "spring.main.cloud-platform";
/** /**
* Determines if the platform is active (i.e. the application is running in it). * Determines if the platform is active (i.e. the application is running in it).
* @param environment the environment * @param environment the environment
* @return if the platform is active. * @return if the platform is active.
*/ */
public boolean isActive(Environment environment) { public boolean isActive(Environment environment) {
return isEnforced(environment) || isDetected(environment); return isEnforced(environment) || (isAutoDetectionEnabled(environment) && isDetected(environment));
} }
/** /**
@ -148,7 +151,7 @@ public enum CloudPlatform {
* @since 2.3.0 * @since 2.3.0
*/ */
public boolean isEnforced(Environment environment) { public boolean isEnforced(Environment environment) {
String platform = environment.getProperty("spring.main.cloud-platform"); String platform = environment.getProperty(PROPERTY_NAME);
return name().equalsIgnoreCase(platform); return name().equalsIgnoreCase(platform);
} }
@ -161,6 +164,16 @@ public enum CloudPlatform {
*/ */
public abstract boolean isDetected(Environment environment); public abstract boolean isDetected(Environment environment);
/**
* Determines if it is enabled that the platform is detected by looking for
* platform-specific environment variables.
* @param environment the environment
* @return if the platform auto-detection is enabled.
*/
private boolean isAutoDetectionEnabled(Environment environment) {
return environment.getProperty(PROPERTY_NAME) == null;
}
/** /**
* Returns if the platform is behind a load balancer and uses * Returns if the platform is behind a load balancer and uses
* {@literal X-Forwarded-For} headers. * {@literal X-Forwarded-For} headers.

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2020 the original author or authors. * Copyright 2012-2021 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -18,7 +18,10 @@ package org.springframework.boot.cloud;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -34,6 +37,7 @@ import static org.assertj.core.api.Assertions.assertThat;
* Tests for {@link CloudPlatform}. * Tests for {@link CloudPlatform}.
* *
* @author Phillip Webb * @author Phillip Webb
* @author Nguyen Sach
*/ */
class CloudPlatformTests { class CloudPlatformTests {
@ -137,6 +141,18 @@ class CloudPlatformTests {
assertThat(platform).isEqualTo(CloudPlatform.KUBERNETES); assertThat(platform).isEqualTo(CloudPlatform.KUBERNETES);
} }
@Test
void isActiveWhenNoCloudPlatformIsEnforcedAndHasKubernetesServiceHostAndKubernetesServicePort() {
Map<String, Object> envVars = new HashMap<>();
envVars.put("EXAMPLE_SERVICE_HOST", "---");
envVars.put("EXAMPLE_SERVICE_PORT", "8080");
Environment environment = getEnvironmentWithEnvVariables(envVars);
((MockEnvironment) environment).setProperty("spring.main.cloud-platform", "none");
List<CloudPlatform> activeCloudPlatforms = Stream.of(CloudPlatform.values())
.filter((cloudPlatform) -> cloudPlatform.isActive(environment)).collect(Collectors.toList());
assertThat(activeCloudPlatforms).containsExactly(CloudPlatform.NONE);
}
private Environment getEnvironmentWithEnvVariables(Map<String, Object> environmentVariables) { private Environment getEnvironmentWithEnvVariables(Map<String, Object> environmentVariables) {
MockEnvironment environment = new MockEnvironment(); MockEnvironment environment = new MockEnvironment();
PropertySource<?> propertySource = new SystemEnvironmentPropertySource( PropertySource<?> propertySource = new SystemEnvironmentPropertySource(

Loading…
Cancel
Save