Commit 2723892b authored by Andy Wilkinson's avatar Andy Wilkinson

Consistently include context id in endpoint responses

Closes gh-10980
parent 07462be0
...@@ -63,21 +63,21 @@ public class BeansEndpoint { ...@@ -63,21 +63,21 @@ public class BeansEndpoint {
*/ */
public static final class ApplicationContextDescriptor { public static final class ApplicationContextDescriptor {
private final String id; private final String contextId;
private final Map<String, BeanDescriptor> beans; private final Map<String, BeanDescriptor> beans;
private final ApplicationContextDescriptor parent; private final ApplicationContextDescriptor parent;
private ApplicationContextDescriptor(String id, Map<String, BeanDescriptor> beans, private ApplicationContextDescriptor(String contextId,
ApplicationContextDescriptor parent) { Map<String, BeanDescriptor> beans, ApplicationContextDescriptor parent) {
this.id = id; this.contextId = contextId;
this.beans = beans; this.beans = beans;
this.parent = parent; this.parent = parent;
} }
public String getId() { public String getContextId() {
return this.id; return this.contextId;
} }
public ApplicationContextDescriptor getParent() { public ApplicationContextDescriptor getParent() {
......
...@@ -111,7 +111,7 @@ public class ConfigurationPropertiesReportEndpoint implements ApplicationContext ...@@ -111,7 +111,7 @@ public class ConfigurationPropertiesReportEndpoint implements ApplicationContext
beanDescriptors.put(beanName, new ConfigurationPropertiesBeanDescriptor( beanDescriptors.put(beanName, new ConfigurationPropertiesBeanDescriptor(
prefix, sanitize(prefix, safeSerialize(mapper, bean, prefix)))); prefix, sanitize(prefix, safeSerialize(mapper, bean, prefix))));
} }
return new ConfigurationPropertiesDescriptor(beanDescriptors, return new ConfigurationPropertiesDescriptor(context.getId(), beanDescriptors,
describeConfigurationProperties(context.getParent(), mapper)); describeConfigurationProperties(context.getParent(), mapper));
} }
...@@ -360,17 +360,24 @@ public class ConfigurationPropertiesReportEndpoint implements ApplicationContext ...@@ -360,17 +360,24 @@ public class ConfigurationPropertiesReportEndpoint implements ApplicationContext
*/ */
public static final class ConfigurationPropertiesDescriptor { public static final class ConfigurationPropertiesDescriptor {
private final String contextId;
private final Map<String, ConfigurationPropertiesBeanDescriptor> beans; private final Map<String, ConfigurationPropertiesBeanDescriptor> beans;
private final ConfigurationPropertiesDescriptor parent; private final ConfigurationPropertiesDescriptor parent;
private ConfigurationPropertiesDescriptor( private ConfigurationPropertiesDescriptor(String contextId,
Map<String, ConfigurationPropertiesBeanDescriptor> beans, Map<String, ConfigurationPropertiesBeanDescriptor> beans,
ConfigurationPropertiesDescriptor parent) { ConfigurationPropertiesDescriptor parent) {
this.contextId = contextId;
this.beans = beans; this.beans = beans;
this.parent = parent; this.parent = parent;
} }
public String getContextId() {
return this.contextId;
}
public Map<String, ConfigurationPropertiesBeanDescriptor> getBeans() { public Map<String, ConfigurationPropertiesBeanDescriptor> getBeans() {
return this.beans; return this.beans;
} }
......
...@@ -51,7 +51,7 @@ public class BeansEndpointTests { ...@@ -51,7 +51,7 @@ public class BeansEndpointTests {
ApplicationContextDescriptor result = context.getBean(BeansEndpoint.class) ApplicationContextDescriptor result = context.getBean(BeansEndpoint.class)
.beans(); .beans();
assertThat(result.getParent()).isNull(); assertThat(result.getParent()).isNull();
assertThat(result.getId()).isEqualTo(context.getId()); assertThat(result.getContextId()).isEqualTo(context.getId());
Map<String, BeanDescriptor> beans = result.getBeans(); Map<String, BeanDescriptor> beans = result.getBeans();
assertThat(beans.size()) assertThat(beans.size())
.isLessThanOrEqualTo(context.getBeanDefinitionCount()); .isLessThanOrEqualTo(context.getBeanDefinitionCount());
......
...@@ -22,7 +22,7 @@ import java.util.Collections; ...@@ -22,7 +22,7 @@ import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.function.Consumer; import java.util.function.BiConsumer;
import org.junit.Test; import org.junit.Test;
...@@ -31,6 +31,7 @@ import org.springframework.boot.actuate.context.properties.ConfigurationProperti ...@@ -31,6 +31,7 @@ import org.springframework.boot.actuate.context.properties.ConfigurationProperti
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
...@@ -47,20 +48,20 @@ public class ConfigurationPropertiesReportEndpointTests { ...@@ -47,20 +48,20 @@ public class ConfigurationPropertiesReportEndpointTests {
@Test @Test
public void configurationPropertiesAreReturned() throws Exception { public void configurationPropertiesAreReturned() throws Exception {
load((properties) -> { load((context, properties) -> {
assertThat(properties.getContextId()).isEqualTo(context.getId());
assertThat(properties.getBeans().size()).isGreaterThan(0); assertThat(properties.getBeans().size()).isGreaterThan(0);
ConfigurationPropertiesBeanDescriptor nestedProperties = properties.getBeans() ConfigurationPropertiesBeanDescriptor nestedProperties = properties.getBeans()
.get("testProperties"); .get("testProperties");
assertThat(nestedProperties).isNotNull(); assertThat(nestedProperties).isNotNull();
assertThat(nestedProperties.getPrefix()).isEqualTo("test"); assertThat(nestedProperties.getPrefix()).isEqualTo("test");
assertThat(nestedProperties.getProperties()).isNotNull();
assertThat(nestedProperties.getProperties()).isNotEmpty(); assertThat(nestedProperties.getProperties()).isNotEmpty();
}); });
} }
@Test @Test
public void entriesWithNullValuesAreNotIncluded() { public void entriesWithNullValuesAreNotIncluded() {
load((properties) -> { load((context, properties) -> {
Map<String, Object> nestedProperties = properties.getBeans() Map<String, Object> nestedProperties = properties.getBeans()
.get("testProperties").getProperties(); .get("testProperties").getProperties();
assertThat(nestedProperties).doesNotContainKey("nullValue"); assertThat(nestedProperties).doesNotContainKey("nullValue");
...@@ -69,7 +70,7 @@ public class ConfigurationPropertiesReportEndpointTests { ...@@ -69,7 +70,7 @@ public class ConfigurationPropertiesReportEndpointTests {
@Test @Test
public void defaultKeySanitization() throws Exception { public void defaultKeySanitization() throws Exception {
load((properties) -> { load((context, properties) -> {
Map<String, Object> nestedProperties = properties.getBeans() Map<String, Object> nestedProperties = properties.getBeans()
.get("testProperties").getProperties(); .get("testProperties").getProperties();
assertThat(nestedProperties).isNotNull(); assertThat(nestedProperties).isNotNull();
...@@ -80,7 +81,7 @@ public class ConfigurationPropertiesReportEndpointTests { ...@@ -80,7 +81,7 @@ public class ConfigurationPropertiesReportEndpointTests {
@Test @Test
public void customKeySanitization() throws Exception { public void customKeySanitization() throws Exception {
load("property", (properties) -> { load("property", (context, properties) -> {
Map<String, Object> nestedProperties = properties.getBeans() Map<String, Object> nestedProperties = properties.getBeans()
.get("testProperties").getProperties(); .get("testProperties").getProperties();
assertThat(nestedProperties).isNotNull(); assertThat(nestedProperties).isNotNull();
...@@ -91,7 +92,7 @@ public class ConfigurationPropertiesReportEndpointTests { ...@@ -91,7 +92,7 @@ public class ConfigurationPropertiesReportEndpointTests {
@Test @Test
public void customPatternKeySanitization() throws Exception { public void customPatternKeySanitization() throws Exception {
load(".*pass.*", (properties) -> { load(".*pass.*", (context, properties) -> {
Map<String, Object> nestedProperties = properties.getBeans() Map<String, Object> nestedProperties = properties.getBeans()
.get("testProperties").getProperties(); .get("testProperties").getProperties();
assertThat(nestedProperties).isNotNull(); assertThat(nestedProperties).isNotNull();
...@@ -104,23 +105,24 @@ public class ConfigurationPropertiesReportEndpointTests { ...@@ -104,23 +105,24 @@ public class ConfigurationPropertiesReportEndpointTests {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public void keySanitizationWithCustomPatternUsingCompositeKeys() throws Exception { public void keySanitizationWithCustomPatternUsingCompositeKeys() throws Exception {
// gh-4415 // gh-4415
load(Arrays.asList(".*\\.secrets\\..*", ".*\\.hidden\\..*"), (properties) -> { load(Arrays.asList(".*\\.secrets\\..*", ".*\\.hidden\\..*"),
Map<String, Object> nestedProperties = properties.getBeans() (context, properties) -> {
.get("testProperties").getProperties(); Map<String, Object> nestedProperties = properties.getBeans()
assertThat(nestedProperties).isNotNull(); .get("testProperties").getProperties();
Map<String, Object> secrets = (Map<String, Object>) nestedProperties assertThat(nestedProperties).isNotNull();
.get("secrets"); Map<String, Object> secrets = (Map<String, Object>) nestedProperties
Map<String, Object> hidden = (Map<String, Object>) nestedProperties .get("secrets");
.get("hidden"); Map<String, Object> hidden = (Map<String, Object>) nestedProperties
assertThat(secrets.get("mine")).isEqualTo("******"); .get("hidden");
assertThat(secrets.get("yours")).isEqualTo("******"); assertThat(secrets.get("mine")).isEqualTo("******");
assertThat(hidden.get("mine")).isEqualTo("******"); assertThat(secrets.get("yours")).isEqualTo("******");
}); assertThat(hidden.get("mine")).isEqualTo("******");
});
} }
@Test @Test
public void mixedBoolean() throws Exception { public void mixedBoolean() throws Exception {
load((properties) -> { load((context, properties) -> {
Map<String, Object> nestedProperties = properties.getBeans() Map<String, Object> nestedProperties = properties.getBeans()
.get("testProperties").getProperties(); .get("testProperties").getProperties();
assertThat(nestedProperties.get("mixedBoolean")).isEqualTo(true); assertThat(nestedProperties.get("mixedBoolean")).isEqualTo(true);
...@@ -130,7 +132,7 @@ public class ConfigurationPropertiesReportEndpointTests { ...@@ -130,7 +132,7 @@ public class ConfigurationPropertiesReportEndpointTests {
@Test @Test
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public void listsAreSanitized() throws Exception { public void listsAreSanitized() throws Exception {
load((properties) -> { load((context, properties) -> {
Map<String, Object> nestedProperties = properties.getBeans() Map<String, Object> nestedProperties = properties.getBeans()
.get("testProperties").getProperties(); .get("testProperties").getProperties();
assertThat(nestedProperties.get("listItems")).isInstanceOf(List.class); assertThat(nestedProperties.get("listItems")).isInstanceOf(List.class);
...@@ -144,7 +146,7 @@ public class ConfigurationPropertiesReportEndpointTests { ...@@ -144,7 +146,7 @@ public class ConfigurationPropertiesReportEndpointTests {
@Test @Test
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public void listsOfListsAreSanitized() throws Exception { public void listsOfListsAreSanitized() throws Exception {
load((properties) -> { load((context, properties) -> {
Map<String, Object> nestedProperties = properties.getBeans() Map<String, Object> nestedProperties = properties.getBeans()
.get("testProperties").getProperties(); .get("testProperties").getProperties();
assertThat(nestedProperties.get("listOfListItems")).isInstanceOf(List.class); assertThat(nestedProperties.get("listOfListItems")).isInstanceOf(List.class);
...@@ -158,17 +160,18 @@ public class ConfigurationPropertiesReportEndpointTests { ...@@ -158,17 +160,18 @@ public class ConfigurationPropertiesReportEndpointTests {
}); });
} }
private void load(Consumer<ConfigurationPropertiesDescriptor> properties) { private void load(
BiConsumer<ApplicationContext, ConfigurationPropertiesDescriptor> properties) {
load(Collections.emptyList(), properties); load(Collections.emptyList(), properties);
} }
private void load(String keyToSanitize, private void load(String keyToSanitize,
Consumer<ConfigurationPropertiesDescriptor> properties) { BiConsumer<ApplicationContext, ConfigurationPropertiesDescriptor> properties) {
load(Collections.singletonList(keyToSanitize), properties); load(Collections.singletonList(keyToSanitize), properties);
} }
private void load(List<String> keysToSanitize, private void load(List<String> keysToSanitize,
Consumer<ConfigurationPropertiesDescriptor> properties) { BiConsumer<ApplicationContext, ConfigurationPropertiesDescriptor> properties) {
ApplicationContextRunner contextRunner = new ApplicationContextRunner() ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withUserConfiguration(Config.class); .withUserConfiguration(Config.class);
contextRunner.run((context) -> { contextRunner.run((context) -> {
...@@ -178,7 +181,7 @@ public class ConfigurationPropertiesReportEndpointTests { ...@@ -178,7 +181,7 @@ public class ConfigurationPropertiesReportEndpointTests {
endpoint.setKeysToSanitize( endpoint.setKeysToSanitize(
keysToSanitize.toArray(new String[keysToSanitize.size()])); keysToSanitize.toArray(new String[keysToSanitize.size()]));
} }
properties.accept(endpoint.configurationProperties()); properties.accept(context, endpoint.configurationProperties());
}); });
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment