Commit 26df5576 authored by Stephane Nicoll's avatar Stephane Nicoll

Merge enablement and exposure conditions for Actuator endpoints

This commit merges the conditions for determining if an endpoint is
available in a single condition, deprecating
`ConditionalOnEnabledEndpoint` in the process.

Closes gh-16169
parent 275d7945
......@@ -18,8 +18,7 @@ package org.springframework.boot.actuate.autoconfigure.audit;
import org.springframework.boot.actuate.audit.AuditEventRepository;
import org.springframework.boot.actuate.audit.AuditEventsEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
......@@ -37,8 +36,7 @@ import org.springframework.context.annotation.Configuration;
*/
@Configuration(proxyBeanMethods = false)
@AutoConfigureAfter(AuditAutoConfiguration.class)
@ConditionalOnEnabledEndpoint(endpoint = AuditEventsEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = AuditEventsEndpoint.class)
@ConditionalOnAvailableEndpoint(endpoint = AuditEventsEndpoint.class)
public class AuditEventsEndpointAutoConfiguration {
@Bean
......
......@@ -16,8 +16,7 @@
package org.springframework.boot.actuate.autoconfigure.beans;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.beans.BeansEndpoint;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
......@@ -32,8 +31,7 @@ import org.springframework.context.annotation.Configuration;
* @since 2.0.0
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnEnabledEndpoint(endpoint = BeansEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = BeansEndpoint.class)
@ConditionalOnAvailableEndpoint(endpoint = BeansEndpoint.class)
public class BeansEndpointAutoConfiguration {
@Bean
......
......@@ -18,8 +18,7 @@ package org.springframework.boot.actuate.autoconfigure.cache;
import java.util.Map;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.cache.CachesEndpoint;
import org.springframework.boot.actuate.cache.CachesEndpointWebExtension;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
......@@ -41,8 +40,7 @@ import org.springframework.context.annotation.Configuration;
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(CacheManager.class)
@ConditionalOnEnabledEndpoint(endpoint = CachesEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = CachesEndpoint.class)
@ConditionalOnAvailableEndpoint(endpoint = CachesEndpoint.class)
@AutoConfigureAfter(CacheAutoConfiguration.class)
public class CachesEndpointAutoConfiguration {
......
......@@ -28,8 +28,7 @@ import org.springframework.beans.factory.ObjectProvider;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.boot.actuate.autoconfigure.cloudfoundry.CloudFoundryWebEndpointDiscoverer;
import org.springframework.boot.actuate.autoconfigure.cloudfoundry.servlet.CloudFoundryInfoEndpointWebExtension;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.autoconfigure.health.HealthEndpointAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.info.InfoEndpointAutoConfiguration;
import org.springframework.boot.actuate.endpoint.ExposableEndpoint;
......@@ -86,8 +85,7 @@ public class ReactiveCloudFoundryActuatorAutoConfiguration {
@Bean
@ConditionalOnMissingBean
@ConditionalOnEnabledEndpoint
@ConditionalOnExposedEndpoint
@ConditionalOnAvailableEndpoint
@ConditionalOnBean({ HealthEndpoint.class, ReactiveHealthEndpointWebExtension.class })
public CloudFoundryReactiveHealthEndpointWebExtension cloudFoundryReactiveHealthEndpointWebExtension(
ReactiveHealthEndpointWebExtension reactiveHealthEndpointWebExtension) {
......@@ -97,8 +95,7 @@ public class ReactiveCloudFoundryActuatorAutoConfiguration {
@Bean
@ConditionalOnMissingBean
@ConditionalOnEnabledEndpoint
@ConditionalOnExposedEndpoint
@ConditionalOnAvailableEndpoint
@ConditionalOnBean({ InfoEndpoint.class, GitProperties.class })
public CloudFoundryInfoEndpointWebExtension cloudFoundryInfoEndpointWebExtension(
GitProperties properties, ObjectProvider<InfoContributor> infoContributors) {
......
......@@ -25,8 +25,7 @@ import java.util.stream.Collectors;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.actuate.autoconfigure.cloudfoundry.CloudFoundryWebEndpointDiscoverer;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.autoconfigure.health.HealthEndpointAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.info.InfoEndpointAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.web.servlet.ServletManagementContextAutoConfiguration;
......@@ -88,8 +87,7 @@ public class CloudFoundryActuatorAutoConfiguration {
@Bean
@ConditionalOnMissingBean
@ConditionalOnEnabledEndpoint
@ConditionalOnExposedEndpoint
@ConditionalOnAvailableEndpoint
@ConditionalOnBean({ HealthEndpoint.class, HealthEndpointWebExtension.class })
public CloudFoundryHealthEndpointWebExtension cloudFoundryHealthEndpointWebExtension(
HealthEndpointWebExtension healthEndpointWebExtension) {
......@@ -98,8 +96,7 @@ public class CloudFoundryActuatorAutoConfiguration {
@Bean
@ConditionalOnMissingBean
@ConditionalOnEnabledEndpoint
@ConditionalOnExposedEndpoint
@ConditionalOnAvailableEndpoint
@ConditionalOnBean({ InfoEndpoint.class, GitProperties.class })
public CloudFoundryInfoEndpointWebExtension cloudFoundryInfoEndpointWebExtension(
GitProperties properties, ObjectProvider<InfoContributor> infoContributors) {
......
......@@ -16,8 +16,7 @@
package org.springframework.boot.actuate.autoconfigure.condition;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.SearchStrategy;
......@@ -33,8 +32,7 @@ import org.springframework.context.annotation.Configuration;
* @since 2.0.0
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnEnabledEndpoint(endpoint = ConditionsReportEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = ConditionsReportEndpoint.class)
@ConditionalOnAvailableEndpoint(endpoint = ConditionsReportEndpoint.class)
public class ConditionsReportEndpointAutoConfiguration {
@Bean
......
......@@ -16,8 +16,7 @@
package org.springframework.boot.actuate.autoconfigure.context;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.context.ShutdownEndpoint;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
......@@ -31,8 +30,7 @@ import org.springframework.context.annotation.Configuration;
* @since 2.0.0
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnEnabledEndpoint(endpoint = ShutdownEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = ShutdownEndpoint.class)
@ConditionalOnAvailableEndpoint(endpoint = ShutdownEndpoint.class)
public class ShutdownEndpointAutoConfiguration {
@Bean
......
......@@ -16,8 +16,7 @@
package org.springframework.boot.actuate.autoconfigure.context.properties;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.context.properties.ConfigurationPropertiesReportEndpoint;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
......@@ -34,8 +33,7 @@ import org.springframework.context.annotation.Configuration;
* @since 2.0.0
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnEnabledEndpoint(endpoint = ConfigurationPropertiesReportEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = ConfigurationPropertiesReportEndpoint.class)
@ConditionalOnAvailableEndpoint(endpoint = ConfigurationPropertiesReportEndpoint.class)
@EnableConfigurationProperties(ConfigurationPropertiesReportEndpointProperties.class)
public class ConfigurationPropertiesReportEndpointAutoConfiguration {
......
......@@ -16,10 +16,15 @@
package org.springframework.boot.actuate.autoconfigure.endpoint.condition;
import java.lang.annotation.Annotation;
import java.util.Map;
import java.util.Optional;
import org.springframework.boot.actuate.endpoint.EndpointId;
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.boot.actuate.endpoint.annotation.EndpointExtension;
import org.springframework.boot.autoconfigure.condition.ConditionMessage;
import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ConditionContext;
......@@ -27,10 +32,12 @@ import org.springframework.core.annotation.AnnotationAttributes;
import org.springframework.core.annotation.MergedAnnotation;
import org.springframework.core.annotation.MergedAnnotations;
import org.springframework.core.annotation.MergedAnnotations.SearchStrategy;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;
import org.springframework.core.type.MethodMetadata;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
import org.springframework.util.ConcurrentReferenceHashMap;
/**
* Base class for {@link Endpoint @Endpoint} related {@link SpringBootCondition}
......@@ -42,12 +49,44 @@ import org.springframework.util.ClassUtils;
*/
abstract class AbstractEndpointCondition extends SpringBootCondition {
private static final String ENABLED_BY_DEFAULT_KEY = "management.endpoints.enabled-by-default";
private static final ConcurrentReferenceHashMap<Environment, Optional<Boolean>> enabledByDefaultCache = new ConcurrentReferenceHashMap<>();
AnnotationAttributes getEndpointAttributes(Class<?> annotationClass,
ConditionContext context, AnnotatedTypeMetadata metadata) {
return getEndpointAttributes(getEndpointType(annotationClass, context, metadata));
}
Class<?> getEndpointType(Class<?> annotationClass, ConditionContext context,
protected ConditionOutcome getEnablementOutcome(ConditionContext context,
AnnotatedTypeMetadata metadata, Class<? extends Annotation> annotationClass) {
Environment environment = context.getEnvironment();
AnnotationAttributes attributes = getEndpointAttributes(annotationClass, context,
metadata);
EndpointId id = EndpointId.of(attributes.getString("id"));
String key = "management.endpoint." + id.toLowerCaseString() + ".enabled";
Boolean userDefinedEnabled = environment.getProperty(key, Boolean.class);
if (userDefinedEnabled != null) {
return new ConditionOutcome(userDefinedEnabled,
ConditionMessage.forCondition(annotationClass)
.because("found property " + key + " with value "
+ userDefinedEnabled));
}
Boolean userDefinedDefault = isEnabledByDefault(environment);
if (userDefinedDefault != null) {
return new ConditionOutcome(userDefinedDefault,
ConditionMessage.forCondition(annotationClass)
.because("no property " + key
+ " found so using user defined default from "
+ ENABLED_BY_DEFAULT_KEY));
}
boolean endpointDefault = attributes.getBoolean("enableByDefault");
return new ConditionOutcome(endpointDefault,
ConditionMessage.forCondition(annotationClass).because(
"no property " + key + " found so using endpoint default"));
}
protected Class<?> getEndpointType(Class<?> annotationClass, ConditionContext context,
AnnotatedTypeMetadata metadata) {
Map<String, Object> attributes = metadata
.getAnnotationAttributes(annotationClass.getName());
......@@ -73,7 +112,7 @@ abstract class AbstractEndpointCondition extends SpringBootCondition {
}
}
AnnotationAttributes getEndpointAttributes(Class<?> type) {
protected AnnotationAttributes getEndpointAttributes(Class<?> type) {
MergedAnnotations annotations = MergedAnnotations.from(type,
SearchStrategy.EXHAUSTIVE);
MergedAnnotation<Endpoint> endpoint = annotations.get(Endpoint.class);
......@@ -88,4 +127,14 @@ abstract class AbstractEndpointCondition extends SpringBootCondition {
return getEndpointAttributes(extension.getClass("endpoint"));
}
private Boolean isEnabledByDefault(Environment environment) {
Optional<Boolean> enabledByDefault = enabledByDefaultCache.get(environment);
if (enabledByDefault == null) {
enabledByDefault = Optional.ofNullable(
environment.getProperty(ENABLED_BY_DEFAULT_KEY, Boolean.class));
enabledByDefaultCache.put(environment, enabledByDefault);
}
return enabledByDefault.orElse(null);
}
}
......@@ -28,20 +28,17 @@ import org.springframework.context.annotation.Conditional;
import org.springframework.core.env.Environment;
/**
* {@link Conditional @Conditional} that checks whether an endpoint is exposed or not.
* Matches according to the endpoint exposure configuration {@link Environment}
* properties. This is designed as a companion annotation to
* {@link ConditionalOnEnabledEndpoint @ConditionalOnEnabledEndpoint}.
* {@link Conditional @Conditional} that checks whether an endpoint is available. An
* endpoint is considered available if it is both enabled and exposed. Matches enablement
* according to the endpoints specific {@link Environment} property, falling back to
* {@code management.endpoints.enabled-by-default} or failing that
* {@link Endpoint#enableByDefault()}. Matches exposure according to any of the
* {@code management.endpoints.web.exposure.<id>} or
* {@code management.endpoints.jmx.exposure.<id>} specific properties or failing that to
* whether the application runs on
* {@link org.springframework.boot.cloud.CloudPlatform#CLOUD_FOUNDRY}. Both those
* conditions should match for the endpoint to be considered available.
* <p>
* For a given {@link Endpoint @Endpoint}, the condition will match if:
* <ul>
* <li>{@code "management.endpoints.web.exposure.*"} expose this endpoint</li>
* <li>or if JMX is enabled and {@code "management.endpoints.jmx.exposure.*"} expose this
* endpoint</li>
* <li>or if the application is running on
* {@link org.springframework.boot.cloud.CloudPlatform#CLOUD_FOUNDRY}</li>
* </ul>
*
* When placed on a {@code @Bean} method, the endpoint defaults to the return type of the
* factory method:
*
......@@ -49,7 +46,7 @@ import org.springframework.core.env.Environment;
* &#064;Configuration
* public class MyConfiguration {
*
* &#064;ConditionalOnExposedEndpoint
* &#064;ConditionalOnAvailableEndpoint
* &#064;Bean
* public MyEndpoint myEndpoint() {
* ...
......@@ -63,7 +60,7 @@ import org.springframework.core.env.Environment;
* &#064;Configuration
* public class MyConfiguration {
*
* &#064;ConditionalOnExposedEndpoint
* &#064;ConditionalOnAvailableEndpoint
* &#064;Bean
* public MyEndpointWebExtension myEndpointWebExtension() {
* ...
......@@ -72,8 +69,8 @@ import org.springframework.core.env.Environment;
* }</pre>
* <p>
* In the sample above, {@code MyEndpointWebExtension} will be created if the endpoint is
* enabled as defined by the rules above. {@code MyEndpointWebExtension} must be a regular
* extension that refers to an endpoint, something like:
* available as defined by the rules above. {@code MyEndpointWebExtension} must be a
* regular extension that refers to an endpoint, something like:
*
* <pre class="code">
* &#064;EndpointWebExtension(endpoint = MyEndpoint.class)
......@@ -82,13 +79,13 @@ import org.springframework.core.env.Environment;
* }</pre>
* <p>
* Alternatively, the target endpoint can be manually specified for components that should
* only be created when a given endpoint is enabled:
* only be created when a given endpoint is available:
*
* <pre class="code">
* &#064;Configuration
* public class MyConfiguration {
*
* &#064;ConditionalOnExposedEndpoint(endpoint = MyEndpoint.class)
* &#064;ConditionalOnAvailableEndpoint(endpoint = MyEndpoint.class)
* &#064;Bean
* public MyComponent myComponent() {
* ...
......@@ -97,15 +94,15 @@ import org.springframework.core.env.Environment;
* }</pre>
*
* @author Brian Clozel
* @author Stephane Nicoll
* @since 2.2.0
* @see Endpoint
* @see ConditionalOnEnabledEndpoint
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.TYPE })
@Documented
@Conditional(OnExposedEndpointCondition.class)
public @interface ConditionalOnExposedEndpoint {
@Conditional(OnAvailableEndpointCondition.class)
public @interface ConditionalOnAvailableEndpoint {
/**
* The endpoint type that should be checked. Inferred when the return type of the
......
......@@ -90,11 +90,13 @@ import org.springframework.core.env.Environment;
* @author Stephane Nicoll
* @since 2.0.0
* @see Endpoint
* @deprecated as of 2.2.0 in favor of {@link ConditionalOnAvailableEndpoint}
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.TYPE })
@Documented
@Conditional(OnEnabledEndpointCondition.class)
@Deprecated
public @interface ConditionalOnEnabledEndpoint {
/**
......
......@@ -35,12 +35,13 @@ import org.springframework.core.type.AnnotatedTypeMetadata;
import org.springframework.util.ConcurrentReferenceHashMap;
/**
* A condition that checks if an endpoint is exposed.
* A condition that checks if an endpoint is available (i.e. enabled and exposed).
*
* @author Brian Clozel
* @see ConditionalOnExposedEndpoint
* @author Stephane Nicoll
* @see ConditionalOnAvailableEndpoint
*/
class OnExposedEndpointCondition extends AbstractEndpointCondition {
class OnAvailableEndpointCondition extends AbstractEndpointCondition {
private static final String JMX_ENABLED_KEY = "spring.jmx.enabled";
......@@ -49,28 +50,34 @@ class OnExposedEndpointCondition extends AbstractEndpointCondition {
@Override
public ConditionOutcome getMatchOutcome(ConditionContext context,
AnnotatedTypeMetadata metadata) {
ConditionOutcome enablementOutcome = getEnablementOutcome(context, metadata,
ConditionalOnAvailableEndpoint.class);
if (!enablementOutcome.isMatch()) {
return enablementOutcome;
}
ConditionMessage message = enablementOutcome.getConditionMessage();
Environment environment = context.getEnvironment();
if (CloudPlatform.CLOUD_FOUNDRY.isActive(environment)) {
return new ConditionOutcome(true,
ConditionMessage.forCondition(ConditionalOnExposedEndpoint.class)
message.andCondition(ConditionalOnAvailableEndpoint.class)
.because("application is running on Cloud Foundry"));
}
AnnotationAttributes attributes = getEndpointAttributes(
ConditionalOnExposedEndpoint.class, context, metadata);
ConditionalOnAvailableEndpoint.class, context, metadata);
EndpointId id = EndpointId.of(attributes.getString("id"));
Set<ExposureInformation> exposureInformations = getExposureInformation(
environment);
for (ExposureInformation exposureInformation : exposureInformations) {
if (exposureInformation.isExposed(id)) {
return new ConditionOutcome(true,
ConditionMessage.forCondition(ConditionalOnExposedEndpoint.class)
message.andCondition(ConditionalOnAvailableEndpoint.class)
.because("marked as exposed by a 'management.endpoints."
+ exposureInformation.getPrefix()
+ ".exposure' property"));
}
}
return new ConditionOutcome(false,
ConditionMessage.forCondition(ConditionalOnExposedEndpoint.class).because(
message.andCondition(ConditionalOnAvailableEndpoint.class).because(
"no 'management.endpoints' property marked it as exposed"));
}
......
......@@ -16,16 +16,9 @@
package org.springframework.boot.actuate.autoconfigure.endpoint.condition;
import java.util.Optional;
import org.springframework.boot.actuate.endpoint.EndpointId;
import org.springframework.boot.autoconfigure.condition.ConditionMessage;
import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.annotation.AnnotationAttributes;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;
import org.springframework.util.ConcurrentReferenceHashMap;
/**
* A condition that checks if an endpoint is enabled.
......@@ -34,50 +27,16 @@ import org.springframework.util.ConcurrentReferenceHashMap;
* @author Andy Wilkinson
* @author Phillip Webb
* @see ConditionalOnEnabledEndpoint
* @deprecated as of 2.2.0 in favor of {@link OnAvailableEndpointCondition}
*/
@Deprecated
class OnEnabledEndpointCondition extends AbstractEndpointCondition {
private static final String ENABLED_BY_DEFAULT_KEY = "management.endpoints.enabled-by-default";
private static final ConcurrentReferenceHashMap<Environment, Optional<Boolean>> enabledByDefaultCache = new ConcurrentReferenceHashMap<>();
@Override
public ConditionOutcome getMatchOutcome(ConditionContext context,
AnnotatedTypeMetadata metadata) {
Environment environment = context.getEnvironment();
AnnotationAttributes attributes = getEndpointAttributes(
ConditionalOnEnabledEndpoint.class, context, metadata);
EndpointId id = EndpointId.of(attributes.getString("id"));
String key = "management.endpoint." + id.toLowerCaseString() + ".enabled";
Boolean userDefinedEnabled = environment.getProperty(key, Boolean.class);
if (userDefinedEnabled != null) {
return new ConditionOutcome(userDefinedEnabled,
ConditionMessage.forCondition(ConditionalOnEnabledEndpoint.class)
.because("found property " + key + " with value "
+ userDefinedEnabled));
}
Boolean userDefinedDefault = isEnabledByDefault(environment);
if (userDefinedDefault != null) {
return new ConditionOutcome(userDefinedDefault,
ConditionMessage.forCondition(ConditionalOnEnabledEndpoint.class)
.because("no property " + key
+ " found so using user defined default from "
+ ENABLED_BY_DEFAULT_KEY));
}
boolean endpointDefault = attributes.getBoolean("enableByDefault");
return new ConditionOutcome(endpointDefault,
ConditionMessage.forCondition(ConditionalOnEnabledEndpoint.class).because(
"no property " + key + " found so using endpoint default"));
}
private Boolean isEnabledByDefault(Environment environment) {
Optional<Boolean> enabledByDefault = enabledByDefaultCache.get(environment);
if (enabledByDefault == null) {
enabledByDefault = Optional.ofNullable(
environment.getProperty(ENABLED_BY_DEFAULT_KEY, Boolean.class));
enabledByDefaultCache.put(environment, enabledByDefault);
}
return enabledByDefault.orElse(null);
return getEnablementOutcome(context, metadata,
ConditionalOnEnabledEndpoint.class);
}
}
......@@ -16,8 +16,7 @@
package org.springframework.boot.actuate.autoconfigure.env;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.env.EnvironmentEndpoint;
import org.springframework.boot.actuate.env.EnvironmentEndpointWebExtension;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
......@@ -36,8 +35,7 @@ import org.springframework.core.env.Environment;
* @since 2.0.0
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnEnabledEndpoint(endpoint = EnvironmentEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = EnvironmentEndpoint.class)
@ConditionalOnAvailableEndpoint(endpoint = EnvironmentEndpoint.class)
@EnableConfigurationProperties(EnvironmentEndpointProperties.class)
public class EnvironmentEndpointAutoConfiguration {
......
......@@ -18,8 +18,7 @@ package org.springframework.boot.actuate.autoconfigure.flyway;
import org.flywaydb.core.Flyway;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.flyway.FlywayEndpoint;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
......@@ -39,8 +38,7 @@ import org.springframework.context.annotation.Configuration;
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(Flyway.class)
@ConditionalOnEnabledEndpoint(endpoint = FlywayEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = FlywayEndpoint.class)
@ConditionalOnAvailableEndpoint(endpoint = FlywayEndpoint.class)
@AutoConfigureAfter(FlywayAutoConfiguration.class)
public class FlywayEndpointAutoConfiguration {
......
......@@ -16,8 +16,7 @@
package org.springframework.boot.actuate.autoconfigure.health;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.health.CompositeHealthIndicator;
import org.springframework.boot.actuate.health.HealthAggregator;
import org.springframework.boot.actuate.health.HealthEndpoint;
......@@ -34,8 +33,7 @@ import org.springframework.context.annotation.Configuration;
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnSingleCandidate(HealthIndicatorRegistry.class)
@ConditionalOnEnabledEndpoint(endpoint = HealthEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = HealthEndpoint.class)
@ConditionalOnAvailableEndpoint(endpoint = HealthEndpoint.class)
class HealthEndpointConfiguration {
@Bean
......
......@@ -17,8 +17,7 @@
package org.springframework.boot.actuate.autoconfigure.health;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.health.CompositeReactiveHealthIndicator;
import org.springframework.boot.actuate.health.HealthAggregator;
import org.springframework.boot.actuate.health.HealthEndpoint;
......@@ -44,8 +43,7 @@ import org.springframework.context.annotation.Configuration;
*/
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(HealthIndicatorProperties.class)
@ConditionalOnEnabledEndpoint(endpoint = HealthEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = HealthEndpoint.class)
@ConditionalOnAvailableEndpoint(endpoint = HealthEndpoint.class)
class HealthEndpointWebExtensionConfiguration {
@Bean
......
......@@ -19,8 +19,7 @@ package org.springframework.boot.actuate.autoconfigure.info;
import java.util.stream.Collectors;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.info.InfoContributor;
import org.springframework.boot.actuate.info.InfoEndpoint;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
......@@ -36,8 +35,7 @@ import org.springframework.context.annotation.Configuration;
* @since 2.0.0
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnEnabledEndpoint(endpoint = InfoEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = InfoEndpoint.class)
@ConditionalOnAvailableEndpoint(endpoint = InfoEndpoint.class)
@AutoConfigureAfter(InfoContributorAutoConfiguration.class)
public class InfoEndpointAutoConfiguration {
......
......@@ -16,8 +16,7 @@
package org.springframework.boot.actuate.autoconfigure.integration;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.integration.IntegrationGraphEndpoint;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
......@@ -41,8 +40,7 @@ import org.springframework.integration.graph.IntegrationGraphServer;
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(IntegrationGraphServer.class)
@ConditionalOnBean(IntegrationConfigurationBeanFactoryPostProcessor.class)
@ConditionalOnEnabledEndpoint(endpoint = IntegrationGraphEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = IntegrationGraphEndpoint.class)
@ConditionalOnAvailableEndpoint(endpoint = IntegrationGraphEndpoint.class)
@AutoConfigureAfter(IntegrationAutoConfiguration.class)
public class IntegrationGraphEndpointAutoConfiguration {
......
......@@ -18,8 +18,7 @@ package org.springframework.boot.actuate.autoconfigure.jolokia;
import org.jolokia.http.AgentServlet;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
......@@ -37,8 +36,7 @@ import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = false)
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass(AgentServlet.class)
@ConditionalOnEnabledEndpoint(endpoint = JolokiaEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = JolokiaEndpoint.class)
@ConditionalOnAvailableEndpoint(endpoint = JolokiaEndpoint.class)
@EnableConfigurationProperties(JolokiaProperties.class)
public class JolokiaEndpointAutoConfiguration {
......
......@@ -20,8 +20,7 @@ import liquibase.integration.spring.SpringLiquibase;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.liquibase.LiquibaseEndpoint;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
......@@ -42,8 +41,7 @@ import org.springframework.context.annotation.Configuration;
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(SpringLiquibase.class)
@ConditionalOnEnabledEndpoint(endpoint = LiquibaseEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = LiquibaseEndpoint.class)
@ConditionalOnAvailableEndpoint(endpoint = LiquibaseEndpoint.class)
@AutoConfigureAfter(LiquibaseAutoConfiguration.class)
public class LiquibaseEndpointAutoConfiguration {
......
......@@ -16,8 +16,7 @@
package org.springframework.boot.actuate.autoconfigure.logging;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.logging.LogFileWebEndpoint;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionMessage;
......@@ -42,8 +41,7 @@ import org.springframework.util.StringUtils;
* @since 2.0.0
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnEnabledEndpoint(endpoint = LogFileWebEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = LogFileWebEndpoint.class)
@ConditionalOnAvailableEndpoint(endpoint = LogFileWebEndpoint.class)
@EnableConfigurationProperties(LogFileWebEndpointProperties.class)
public class LogFileWebEndpointAutoConfiguration {
......
......@@ -16,8 +16,7 @@
package org.springframework.boot.actuate.autoconfigure.logging;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.logging.LoggersEndpoint;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionMessage;
......@@ -39,8 +38,7 @@ import org.springframework.core.type.AnnotatedTypeMetadata;
* @since 2.0.0
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnEnabledEndpoint(endpoint = LoggersEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = LoggersEndpoint.class)
@ConditionalOnAvailableEndpoint(endpoint = LoggersEndpoint.class)
public class LoggersEndpointAutoConfiguration {
@Bean
......
......@@ -16,8 +16,7 @@
package org.springframework.boot.actuate.autoconfigure.management;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.management.HeapDumpWebEndpoint;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
......@@ -31,8 +30,7 @@ import org.springframework.context.annotation.Configuration;
* @since 2.0.0
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnEnabledEndpoint(endpoint = HeapDumpWebEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = HeapDumpWebEndpoint.class)
@ConditionalOnAvailableEndpoint(endpoint = HeapDumpWebEndpoint.class)
public class HeapDumpWebEndpointAutoConfiguration {
@Bean
......
......@@ -16,8 +16,7 @@
package org.springframework.boot.actuate.autoconfigure.management;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.management.ThreadDumpEndpoint;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
......@@ -31,8 +30,7 @@ import org.springframework.context.annotation.Configuration;
* @since 2.0.0
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnEnabledEndpoint(endpoint = ThreadDumpEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = ThreadDumpEndpoint.class)
@ConditionalOnAvailableEndpoint(endpoint = ThreadDumpEndpoint.class)
public class ThreadDumpEndpointAutoConfiguration {
@Bean
......
......@@ -19,8 +19,7 @@ package org.springframework.boot.actuate.autoconfigure.metrics;
import io.micrometer.core.annotation.Timed;
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.metrics.MetricsEndpoint;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
......@@ -38,8 +37,7 @@ import org.springframework.context.annotation.Configuration;
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(Timed.class)
@ConditionalOnEnabledEndpoint(endpoint = MetricsEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = MetricsEndpoint.class)
@ConditionalOnAvailableEndpoint(endpoint = MetricsEndpoint.class)
@AutoConfigureAfter({ MetricsAutoConfiguration.class,
CompositeMeterRegistryAutoConfiguration.class })
public class MetricsEndpointAutoConfiguration {
......
......@@ -29,8 +29,7 @@ import io.prometheus.client.exporter.PushGateway;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.autoconfigure.metrics.CompositeMeterRegistryAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration;
......@@ -89,8 +88,7 @@ public class PrometheusMetricsExportAutoConfiguration {
}
@Configuration(proxyBeanMethods = false)
@ConditionalOnEnabledEndpoint(endpoint = PrometheusScrapeEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = PrometheusScrapeEndpoint.class)
@ConditionalOnAvailableEndpoint(endpoint = PrometheusScrapeEndpoint.class)
public static class PrometheusScrapeEndpointConfiguration {
@Bean
......
......@@ -19,8 +19,7 @@ package org.springframework.boot.actuate.autoconfigure.scheduling;
import java.util.stream.Collectors;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.scheduling.ScheduledTasksEndpoint;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
......@@ -35,8 +34,7 @@ import org.springframework.scheduling.config.ScheduledTaskHolder;
* @since 2.0.0
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnEnabledEndpoint(endpoint = ScheduledTasksEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = ScheduledTasksEndpoint.class)
@ConditionalOnAvailableEndpoint(endpoint = ScheduledTasksEndpoint.class)
public class ScheduledTasksEndpointAutoConfiguration {
@Bean
......
......@@ -16,8 +16,7 @@
package org.springframework.boot.actuate.autoconfigure.session;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.session.SessionsEndpoint;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
......@@ -38,8 +37,7 @@ import org.springframework.session.Session;
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(FindByIndexNameSessionRepository.class)
@ConditionalOnEnabledEndpoint(endpoint = SessionsEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = SessionsEndpoint.class)
@ConditionalOnAvailableEndpoint(endpoint = SessionsEndpoint.class)
@AutoConfigureAfter(SessionAutoConfiguration.class)
public class SessionsEndpointAutoConfiguration {
......
......@@ -16,8 +16,7 @@
package org.springframework.boot.actuate.autoconfigure.trace.http;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.trace.http.HttpTraceEndpoint;
import org.springframework.boot.actuate.trace.http.HttpTraceRepository;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
......@@ -34,8 +33,7 @@ import org.springframework.context.annotation.Configuration;
* @since 2.0.0
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnEnabledEndpoint(endpoint = HttpTraceEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = HttpTraceEndpoint.class)
@ConditionalOnAvailableEndpoint(endpoint = HttpTraceEndpoint.class)
@AutoConfigureAfter(HttpTraceAutoConfiguration.class)
public class HttpTraceEndpointAutoConfiguration {
......
......@@ -19,8 +19,7 @@ package org.springframework.boot.actuate.autoconfigure.web.mappings;
import java.util.stream.Collectors;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.web.mappings.MappingDescriptionProvider;
import org.springframework.boot.actuate.web.mappings.MappingsEndpoint;
import org.springframework.boot.actuate.web.mappings.reactive.DispatcherHandlersMappingDescriptionProvider;
......@@ -48,8 +47,7 @@ import org.springframework.web.servlet.DispatcherServlet;
public class MappingsEndpointAutoConfiguration {
@Bean
@ConditionalOnEnabledEndpoint
@ConditionalOnExposedEndpoint
@ConditionalOnAvailableEndpoint
public MappingsEndpoint mappingsEndpoint(ApplicationContext applicationContext,
ObjectProvider<MappingDescriptionProvider> descriptionProviders) {
return new MappingsEndpoint(
......
......@@ -29,11 +29,11 @@ import org.springframework.context.annotation.Configuration;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link ConditionalOnExposedEndpoint @ConditionalOnExposedEndpoint}.
* Tests for {@link ConditionalOnAvailableEndpoint @ConditionalOnAvailableEndpoint}.
*
* @author Brian Clozel
*/
public class ConditionalOnExposedEndpointTests {
public class ConditionalOnAvailableEndpointTests {
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withUserConfiguration(AllEndpointsConfiguration.class);
......@@ -41,15 +41,45 @@ public class ConditionalOnExposedEndpointTests {
@Test
public void outcomeShouldMatchDefaults() {
this.contextRunner.run((context) -> assertThat(context).hasBean("info")
.hasBean("health").doesNotHaveBean("spring").doesNotHaveBean("test"));
.hasBean("health").doesNotHaveBean("spring").doesNotHaveBean("test")
.doesNotHaveBean("shutdown"));
}
@Test
public void outcomeWhenIncludeAllWebShouldMatch() {
public void outcomeWithEnabledByDefaultSetToFalseShouldNotMatchAnything() {
this.contextRunner
.withPropertyValues("management.endpoints.enabled-by-default=false")
.run((context) -> assertThat(context).doesNotHaveBean("info")
.doesNotHaveBean("health").doesNotHaveBean("spring")
.doesNotHaveBean("test").doesNotHaveBean("shutdown"));
}
@Test
public void outcomeWhenIncludeAllWebShouldMatchEnabledEndpoints() {
this.contextRunner
.withPropertyValues("management.endpoints.web.exposure.include=*")
.run((context) -> assertThat(context).hasBean("info").hasBean("health")
.hasBean("test").hasBean("spring"));
.hasBean("test").hasBean("spring").doesNotHaveBean("shutdown"));
}
@Test
public void outcomeWhenIncludeAllWebAndDisablingEndpointShouldMatchEnabledEndpoints() {
this.contextRunner
.withPropertyValues("management.endpoints.web.exposure.include=*",
"management.endpoint.test.enabled=false",
"management.endpoint.health.enabled=false")
.run((context) -> assertThat(context).hasBean("info")
.doesNotHaveBean("health").doesNotHaveBean("test")
.hasBean("spring").doesNotHaveBean("shutdown"));
}
@Test
public void outcomeWhenIncludeAllWebAndEnablingEndpointDisabledByDefaultShouldMatchAll() {
this.contextRunner
.withPropertyValues("management.endpoints.web.exposure.include=*",
"management.endpoint.shutdown.enabled=true")
.run((context) -> assertThat(context).hasBean("info").hasBean("health")
.hasBean("test").hasBean("spring").hasBean("shutdown"));
}
@Test
......@@ -57,16 +87,27 @@ public class ConditionalOnExposedEndpointTests {
this.contextRunner
.withPropertyValues("management.endpoints.jmx.exposure.include=*")
.run((context) -> assertThat(context).hasBean("info").hasBean("health")
.doesNotHaveBean("spring").doesNotHaveBean("test"));
.doesNotHaveBean("spring").doesNotHaveBean("test")
.doesNotHaveBean("shutdown"));
}
@Test
public void outcomeWhenIncludeAllJmxAndJmxEnabledShouldMatch() {
public void outcomeWhenIncludeAllJmxAndJmxEnabledShouldMatchEnabledEndpoints() {
this.contextRunner
.withPropertyValues("management.endpoints.jmx.exposure.include=*",
"spring.jmx.enabled=true")
.run((context) -> assertThat(context).hasBean("info").hasBean("health")
.hasBean("test").hasBean("spring"));
.hasBean("test").hasBean("spring").doesNotHaveBean("shutdown"));
}
@Test
public void outcomeWhenIncludeAllJmxAndJmxEnabledAndEnablingEndpointDisabledByDefaultShouldMatchAll() {
this.contextRunner
.withPropertyValues("management.endpoints.jmx.exposure.include=*",
"spring.jmx.enabled=true",
"management.endpoint.shutdown.enabled=true")
.run((context) -> assertThat(context).hasBean("info").hasBean("health")
.hasBean("test").hasBean("spring").hasBean("shutdown"));
}
@Test
......@@ -75,7 +116,8 @@ public class ConditionalOnExposedEndpointTests {
.withPropertyValues("management.endpoints.web.exposure.include=*",
"management.endpoints.web.exposure.exclude=spring,info")
.run((context) -> assertThat(context).hasBean("health").hasBean("test")
.doesNotHaveBean("info").doesNotHaveBean("spring"));
.doesNotHaveBean("info").doesNotHaveBean("spring")
.doesNotHaveBean("shutdown"));
}
@Test
......@@ -84,16 +126,36 @@ public class ConditionalOnExposedEndpointTests {
"management.endpoints.web.exposure.include=info,health,spring,test",
"management.endpoints.web.exposure.exclude=spring,info")
.run((context) -> assertThat(context).hasBean("health").hasBean("test")
.doesNotHaveBean("info").doesNotHaveBean("spring"));
.doesNotHaveBean("info").doesNotHaveBean("spring")
.doesNotHaveBean("shutdown"));
}
@Test
public void outcomeWhenIncludeMatchesShouldMatch() {
public void outcomeWhenIncludeMatchesShouldMatchEnabledEndpoints() {
this.contextRunner
.withPropertyValues("management.endpoints.web.exposure.include=spring")
.run((context) -> assertThat(context).hasBean("spring")
.doesNotHaveBean("health").doesNotHaveBean("info")
.doesNotHaveBean("test"));
.doesNotHaveBean("test").doesNotHaveBean("shutdown"));
}
@Test
public void outcomeWhenIncludeMatchOnDisabledEndpointShouldNotMatch() {
this.contextRunner
.withPropertyValues("management.endpoints.web.exposure.include=shutdown")
.run((context) -> assertThat(context).doesNotHaveBean("spring")
.doesNotHaveBean("health").doesNotHaveBean("info")
.doesNotHaveBean("test").doesNotHaveBean("shutdown"));
}
@Test
public void outcomeWhenIncludeMatchOnEnabledEndpointShouldNotMatch() {
this.contextRunner
.withPropertyValues("management.endpoints.web.exposure.include=shutdown",
"management.endpoint.shutdown.enabled=true")
.run((context) -> assertThat(context).doesNotHaveBean("spring")
.doesNotHaveBean("health").doesNotHaveBean("info")
.doesNotHaveBean("test").hasBean("shutdown"));
}
@Test
......@@ -102,7 +164,7 @@ public class ConditionalOnExposedEndpointTests {
.withPropertyValues("management.endpoints.web.exposure.include=sPRing")
.run((context) -> assertThat(context).hasBean("spring")
.doesNotHaveBean("health").doesNotHaveBean("info")
.doesNotHaveBean("test"));
.doesNotHaveBean("test").doesNotHaveBean("shutdown"));
}
@Test
......@@ -112,11 +174,11 @@ public class ConditionalOnExposedEndpointTests {
"management.endpoints.web.exposure.exclude=*")
.run((context) -> assertThat(context).doesNotHaveBean("health")
.doesNotHaveBean("info").doesNotHaveBean("spring")
.doesNotHaveBean("test"));
.doesNotHaveBean("test").doesNotHaveBean("shutdown"));
}
@Test
public void outcomeWhenIncludeMatchesShoulMatchWithExtensionsAndComponents() {
public void outcomeWhenIncludeMatchesShouldMatchWithExtensionsAndComponents() {
this.contextRunner
.withUserConfiguration(
ComponentEnabledIfEndpointIsExposedConfiguration.class)
......@@ -124,7 +186,7 @@ public class ConditionalOnExposedEndpointTests {
.run((context) -> assertThat(context).hasBean("spring")
.hasBean("springComponent").hasBean("springExtension")
.doesNotHaveBean("info").doesNotHaveBean("health")
.doesNotHaveBean("test"));
.doesNotHaveBean("test").doesNotHaveBean("shutdown"));
}
@Test
......@@ -169,6 +231,11 @@ public class ConditionalOnExposedEndpointTests {
}
@Endpoint(id = "shutdown", enableByDefault = false)
static class ShutdownEndpoint {
}
@EndpointExtension(endpoint = SpringEndpoint.class, filter = TestFilter.class)
static class SpringEndpointExtension {
......@@ -187,42 +254,48 @@ public class ConditionalOnExposedEndpointTests {
static class AllEndpointsConfiguration {
@Bean
@ConditionalOnExposedEndpoint
@ConditionalOnAvailableEndpoint
public HealthEndpoint health() {
return new HealthEndpoint();
}
@Bean
@ConditionalOnExposedEndpoint
@ConditionalOnAvailableEndpoint
public InfoEndpoint info() {
return new InfoEndpoint();
}
@Bean
@ConditionalOnExposedEndpoint
@ConditionalOnAvailableEndpoint
public SpringEndpoint spring() {
return new SpringEndpoint();
}
@Bean
@ConditionalOnExposedEndpoint
@ConditionalOnAvailableEndpoint
public TestEndpoint test() {
return new TestEndpoint();
}
@Bean
@ConditionalOnAvailableEndpoint
public ShutdownEndpoint shutdown() {
return new ShutdownEndpoint();
}
}
@Configuration(proxyBeanMethods = false)
static class ComponentEnabledIfEndpointIsExposedConfiguration {
@Bean
@ConditionalOnExposedEndpoint(endpoint = SpringEndpoint.class)
@ConditionalOnAvailableEndpoint(endpoint = SpringEndpoint.class)
public String springComponent() {
return "springComponent";
}
@Bean
@ConditionalOnExposedEndpoint
@ConditionalOnAvailableEndpoint
public SpringEndpointExtension springExtension() {
return new SpringEndpointExtension();
}
......@@ -233,7 +306,7 @@ public class ConditionalOnExposedEndpointTests {
static class ComponentWithNoEndpointReferenceConfiguration {
@Bean
@ConditionalOnExposedEndpoint
@ConditionalOnAvailableEndpoint
public String springcomp() {
return "springcomp";
}
......
......@@ -34,6 +34,7 @@ import static org.assertj.core.api.Assertions.assertThat;
* @author Stephane Nicoll
* @author Andy Wilkinson
*/
@Deprecated
public class ConditionalOnEnabledEndpointTests {
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner();
......
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