Polish "Make Kubernetes detection slightly more efficient"

See gh-19002
This commit is contained in:
Stephane Nicoll 2020-02-07 14:17:56 +01:00
parent aee22bfb51
commit ddb5cc3f99
2 changed files with 49 additions and 45 deletions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2019 the original author or authors. * Copyright 2012-2020 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.
@ -16,8 +16,6 @@
package org.springframework.boot.cloud; package org.springframework.boot.cloud;
import java.io.File;
import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.EnumerablePropertySource; import org.springframework.core.env.EnumerablePropertySource;
import org.springframework.core.env.Environment; import org.springframework.core.env.Environment;
@ -75,22 +73,16 @@ public enum CloudPlatform {
*/ */
KUBERNETES { KUBERNETES {
private static final String SERVICE_HOST_SUFFIX = "_SERVICE_HOST";
private static final String SERVICE_PORT_SUFFIX = "_SERVICE_PORT";
private static final String SECRET_LOCATION = "/var/run/secrets/kubernetes.io";
private static final String KUBERNETES_SERVICE_HOST = "KUBERNETES_SERVICE_HOST"; private static final String KUBERNETES_SERVICE_HOST = "KUBERNETES_SERVICE_HOST";
private static final String KUBERNETES_SERVICE_PORT = "KUBERNETES_SERVICE_PORT"; private static final String KUBERNETES_SERVICE_PORT = "KUBERNETES_SERVICE_PORT";
private static final String SERVICE_HOST_SUFFIX = "_SERVICE_HOST";
private static final String SERVICE_PORT_SUFFIX = "_SERVICE_PORT";
@Override @Override
public boolean isActive(Environment environment) { public boolean isActive(Environment environment) {
if (environment.containsProperty(KUBERNETES_SERVICE_HOST)
|| environment.containsProperty(KUBERNETES_SERVICE_PORT) || isSecretLocationExists()) {
return true;
}
if (environment instanceof ConfigurableEnvironment) { if (environment instanceof ConfigurableEnvironment) {
return isActive((ConfigurableEnvironment) environment); return isActive((ConfigurableEnvironment) environment);
} }
@ -100,9 +92,15 @@ public enum CloudPlatform {
private boolean isActive(ConfigurableEnvironment environment) { private boolean isActive(ConfigurableEnvironment environment) {
PropertySource<?> environmentPropertySource = environment.getPropertySources() PropertySource<?> environmentPropertySource = environment.getPropertySources()
.get(StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME); .get(StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME);
if (environmentPropertySource != null) {
if (environmentPropertySource.containsProperty(KUBERNETES_SERVICE_HOST)
&& environmentPropertySource.containsProperty(KUBERNETES_SERVICE_PORT)) {
return true;
}
if (environmentPropertySource instanceof EnumerablePropertySource) { if (environmentPropertySource instanceof EnumerablePropertySource) {
return isActive((EnumerablePropertySource<?>) environmentPropertySource); return isActive((EnumerablePropertySource<?>) environmentPropertySource);
} }
}
return false; return false;
} }
@ -119,11 +117,6 @@ public enum CloudPlatform {
return false; return false;
} }
private boolean isSecretLocationExists() {
File file = new File(SECRET_LOCATION);
return file.exists() && file.isDirectory();
}
}; };
/** /**

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2019 the original author or authors. * Copyright 2012-2020 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.
@ -16,7 +16,6 @@
package org.springframework.boot.cloud; package org.springframework.boot.cloud;
import java.io.File;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@ -85,28 +84,38 @@ class CloudPlatformTests {
} }
@Test @Test
void getActiveWhenHasServiceHostAndServicePortShouldReturnKubernetes() { void getActiveWhenHasKubernetesServiceHostAndPortShouldReturnKubernetes() {
MockEnvironment environment = new MockEnvironment(); Map<String, Object> envVars = new HashMap<>();
Map<String, Object> source = new HashMap<>(); envVars.put("KUBERNETES_SERVICE_HOST", "---");
source.put("EXAMPLE_SERVICE_HOST", "---"); envVars.put("KUBERNETES_SERVICE_PORT", "8080");
source.put("EXAMPLE_SERVICE_PORT", "8080"); Environment environment = getEnvironmentWithEnvVariables(envVars);
PropertySource<?> propertySource = new SystemEnvironmentPropertySource(
StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME, source);
environment.getPropertySources().addFirst(propertySource);
CloudPlatform platform = CloudPlatform.getActive(environment); CloudPlatform platform = CloudPlatform.getActive(environment);
assertThat(platform).isEqualTo(CloudPlatform.KUBERNETES); assertThat(platform).isEqualTo(CloudPlatform.KUBERNETES);
assertThat(platform.isActive(environment)).isTrue(); assertThat(platform.isActive(environment)).isTrue();
} }
@Test @Test
void getActiveWhenHasKubernetesHostAndPortShouldReturnKubernetes() { void getActiveWhenHasKubernetesServiceHostAndNoKubernetesServicePortShouldNotReturnKubernetes() {
MockEnvironment environment = new MockEnvironment(); Environment environment = getEnvironmentWithEnvVariables(
Map<String, Object> source = new HashMap<>(); Collections.singletonMap("KUBERNETES_SERVICE_HOST", "---"));
source.put("KUBERNETES_SERVICE_HOST", "---"); CloudPlatform platform = CloudPlatform.getActive(environment);
source.put("KUBERNETES_SERVICE_PORT", "8080"); assertThat(platform).isNull();
PropertySource<?> propertySource = new SystemEnvironmentPropertySource( }
StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME, source);
environment.getPropertySources().addFirst(propertySource); @Test
void getActiveWhenHasKubernetesServicePortAndNoKubernetesServiceHostShouldNotReturnKubernetes() {
Environment environment = getEnvironmentWithEnvVariables(
Collections.singletonMap("KUBERNETES_SERVICE_PORT", "8080"));
CloudPlatform platform = CloudPlatform.getActive(environment);
assertThat(platform).isNull();
}
@Test
void getActiveWhenHasServiceHostAndServicePortShouldReturnKubernetes() {
Map<String, Object> envVars = new HashMap<>();
envVars.put("EXAMPLE_SERVICE_HOST", "---");
envVars.put("EXAMPLE_SERVICE_PORT", "8080");
Environment environment = getEnvironmentWithEnvVariables(envVars);
CloudPlatform platform = CloudPlatform.getActive(environment); CloudPlatform platform = CloudPlatform.getActive(environment);
assertThat(platform).isEqualTo(CloudPlatform.KUBERNETES); assertThat(platform).isEqualTo(CloudPlatform.KUBERNETES);
assertThat(platform.isActive(environment)).isTrue(); assertThat(platform.isActive(environment)).isTrue();
@ -114,16 +123,18 @@ class CloudPlatformTests {
@Test @Test
void getActiveWhenHasServiceHostAndNoServicePortShouldNotReturnKubernetes() { void getActiveWhenHasServiceHostAndNoServicePortShouldNotReturnKubernetes() {
MockEnvironment environment = new MockEnvironment(); Environment environment = getEnvironmentWithEnvVariables(
PropertySource<?> propertySource = new SystemEnvironmentPropertySource(
StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME,
Collections.singletonMap("EXAMPLE_SERVICE_HOST", "---")); Collections.singletonMap("EXAMPLE_SERVICE_HOST", "---"));
environment.getPropertySources().addFirst(propertySource);
CloudPlatform platform = CloudPlatform.getActive(environment); CloudPlatform platform = CloudPlatform.getActive(environment);
File path = new File("/var/run/secrets/kubernetes.io");
if (!path.exists() && !path.isDirectory()) {
assertThat(platform).isNull(); assertThat(platform).isNull();
} }
private Environment getEnvironmentWithEnvVariables(Map<String, Object> environmentVariables) {
MockEnvironment environment = new MockEnvironment();
PropertySource<?> propertySource = new SystemEnvironmentPropertySource(
StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME, environmentVariables);
environment.getPropertySources().addFirst(propertySource);
return environment;
} }
} }