From 8a21f71ad12fff3c1270c57a0553015c19b8a4e6 Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Wed, 3 Feb 2016 12:38:18 -0700 Subject: [PATCH] Reuse pause and resume endpoints to the can be disabled. fixes gh-86 --- ...LifecycleMvcEndpointAutoConfiguration.java | 10 ++-- .../RefreshEndpointAutoConfiguration.java | 4 +- .../context/restart/RestartEndpoint.java | 8 +-- .../context/restart/RestartMvcEndpoint.java | 15 +---- .../endpoint/GenericPostableMvcEndpoint.java | 3 +- .../LifecycleMvcAutoConfigurationTests.java | 56 +++++++++++++++++++ 6 files changed, 70 insertions(+), 26 deletions(-) create mode 100644 spring-cloud-context/src/test/java/org/springframework/cloud/autoconfigure/LifecycleMvcAutoConfigurationTests.java diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/autoconfigure/LifecycleMvcEndpointAutoConfiguration.java b/spring-cloud-context/src/main/java/org/springframework/cloud/autoconfigure/LifecycleMvcEndpointAutoConfiguration.java index d28029a5..b218e110 100644 --- a/spring-cloud-context/src/main/java/org/springframework/cloud/autoconfigure/LifecycleMvcEndpointAutoConfiguration.java +++ b/spring-cloud-context/src/main/java/org/springframework/cloud/autoconfigure/LifecycleMvcEndpointAutoConfiguration.java @@ -72,13 +72,15 @@ public class LifecycleMvcEndpointAutoConfiguration { } @Bean - public MvcEndpoint pauseMvcEndpoint(RestartMvcEndpoint restartEndpoint) { - return restartEndpoint.getPauseEndpoint(); + @ConditionalOnBean(RestartEndpoint.PauseEndpoint.class) + public MvcEndpoint pauseMvcEndpoint(RestartEndpoint.PauseEndpoint pauseEndpoint) { + return new GenericPostableMvcEndpoint(pauseEndpoint); } @Bean - public MvcEndpoint resumeMvcEndpoint(RestartMvcEndpoint restartEndpoint) { - return restartEndpoint.getResumeEndpoint(); + @ConditionalOnBean(RestartEndpoint.ResumeEndpoint.class) + public MvcEndpoint resumeMvcEndpoint(RestartEndpoint.ResumeEndpoint resumeEndpoint) { + return new GenericPostableMvcEndpoint(resumeEndpoint); } } diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/autoconfigure/RefreshEndpointAutoConfiguration.java b/spring-cloud-context/src/main/java/org/springframework/cloud/autoconfigure/RefreshEndpointAutoConfiguration.java index 66a29783..347bb2a8 100644 --- a/spring-cloud-context/src/main/java/org/springframework/cloud/autoconfigure/RefreshEndpointAutoConfiguration.java +++ b/spring-cloud-context/src/main/java/org/springframework/cloud/autoconfigure/RefreshEndpointAutoConfiguration.java @@ -94,13 +94,13 @@ public class RefreshEndpointAutoConfiguration { @Bean @ConfigurationProperties("endpoints.pause") - public Endpoint pauseEndpoint(RestartEndpoint restartEndpoint) { + public RestartEndpoint.PauseEndpoint pauseEndpoint(RestartEndpoint restartEndpoint) { return restartEndpoint.getPauseEndpoint(); } @Bean @ConfigurationProperties("endpoints.resume") - public Endpoint resumeEndpoint(RestartEndpoint restartEndpoint) { + public RestartEndpoint.ResumeEndpoint resumeEndpoint(RestartEndpoint restartEndpoint) { return restartEndpoint.getResumeEndpoint(); } diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/context/restart/RestartEndpoint.java b/spring-cloud-context/src/main/java/org/springframework/cloud/context/restart/RestartEndpoint.java index 4e903f8e..11d202f9 100644 --- a/spring-cloud-context/src/main/java/org/springframework/cloud/context/restart/RestartEndpoint.java +++ b/spring-cloud-context/src/main/java/org/springframework/cloud/context/restart/RestartEndpoint.java @@ -107,15 +107,15 @@ public class RestartEndpoint extends AbstractEndpoint implements } } - public Endpoint getPauseEndpoint() { + public PauseEndpoint getPauseEndpoint() { return new PauseEndpoint(); } - public Endpoint getResumeEndpoint() { + public ResumeEndpoint getResumeEndpoint() { return new ResumeEndpoint(); } - private class PauseEndpoint extends AbstractEndpoint { + public class PauseEndpoint extends AbstractEndpoint { public PauseEndpoint() { super("pause", true, true); @@ -131,7 +131,7 @@ public class RestartEndpoint extends AbstractEndpoint implements } } - private class ResumeEndpoint extends AbstractEndpoint { + public class ResumeEndpoint extends AbstractEndpoint { public ResumeEndpoint() { super("resume", true, true); diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/context/restart/RestartMvcEndpoint.java b/spring-cloud-context/src/main/java/org/springframework/cloud/context/restart/RestartMvcEndpoint.java index ab8b32e9..f40a01d3 100644 --- a/spring-cloud-context/src/main/java/org/springframework/cloud/context/restart/RestartMvcEndpoint.java +++ b/spring-cloud-context/src/main/java/org/springframework/cloud/context/restart/RestartMvcEndpoint.java @@ -16,13 +16,10 @@ package org.springframework.cloud.context.restart; import java.util.Collections; -import java.util.Map; import org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter; -import org.springframework.boot.actuate.endpoint.mvc.MvcEndpoint; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.cloud.endpoint.GenericPostableMvcEndpoint; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; @@ -45,7 +42,7 @@ public class RestartMvcEndpoint extends EndpointMvcAdapter { @Override public Object invoke() { if (!getDelegate().isEnabled()) { - return new ResponseEntity>(Collections.singletonMap( + return new ResponseEntity<>(Collections.singletonMap( "message", "This endpoint is disabled"), HttpStatus.NOT_FOUND); } Thread thread = new Thread(new Runnable() { @@ -59,14 +56,4 @@ public class RestartMvcEndpoint extends EndpointMvcAdapter { return Collections.singletonMap("message", "Restarting"); } - public MvcEndpoint getPauseEndpoint() { - return new GenericPostableMvcEndpoint( - ((RestartEndpoint) getDelegate()).getPauseEndpoint()); - } - - public MvcEndpoint getResumeEndpoint() { - return new GenericPostableMvcEndpoint( - ((RestartEndpoint) getDelegate()).getResumeEndpoint()); - } - } diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/endpoint/GenericPostableMvcEndpoint.java b/spring-cloud-context/src/main/java/org/springframework/cloud/endpoint/GenericPostableMvcEndpoint.java index b9547e03..46da5871 100644 --- a/spring-cloud-context/src/main/java/org/springframework/cloud/endpoint/GenericPostableMvcEndpoint.java +++ b/spring-cloud-context/src/main/java/org/springframework/cloud/endpoint/GenericPostableMvcEndpoint.java @@ -16,7 +16,6 @@ package org.springframework.cloud.endpoint; import java.util.Collections; -import java.util.Map; import org.springframework.boot.actuate.endpoint.Endpoint; import org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter; @@ -44,7 +43,7 @@ public class GenericPostableMvcEndpoint extends EndpointMvcAdapter { @Override public Object invoke() { if (!getDelegate().isEnabled()) { - return new ResponseEntity>(Collections.singletonMap( + return new ResponseEntity<>(Collections.singletonMap( "message", "This endpoint is disabled"), HttpStatus.NOT_FOUND); } return super.invoke(); diff --git a/spring-cloud-context/src/test/java/org/springframework/cloud/autoconfigure/LifecycleMvcAutoConfigurationTests.java b/spring-cloud-context/src/test/java/org/springframework/cloud/autoconfigure/LifecycleMvcAutoConfigurationTests.java new file mode 100644 index 00000000..10068e95 --- /dev/null +++ b/spring-cloud-context/src/test/java/org/springframework/cloud/autoconfigure/LifecycleMvcAutoConfigurationTests.java @@ -0,0 +1,56 @@ +package org.springframework.cloud.autoconfigure; + +import org.junit.Test; +import org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; + +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; + +/** + * @author Spencer Gibb + */ +public class LifecycleMvcAutoConfigurationTests { + + @Test + public void pauseMvcEndpointDisabled() { + endpointDisabled("endpoints.pause.enabled", "pauseMvcEndpoint"); + } + + @Test + public void resumeMvcEndpointDisabled() { + endpointDisabled("endpoints.resume.enabled", "resumeMvcEndpoint"); + } + + @Test + public void restartMvcEndpointDisabled() { + endpointDisabled("endpoints.restart.enabled", "restartMvcEndpoint"); + } + + private void endpointDisabled(String enabledProp, String beanName) { + try (ConfigurableApplicationContext context = getApplicationContext(Config.class, "server.port=0", enabledProp +"=false")) { + EndpointMvcAdapter endpoint = context.getBean(beanName, EndpointMvcAdapter.class); + Object result = endpoint.invoke(); + assertThat("result is wrong type", result, is(instanceOf(ResponseEntity.class))); + ResponseEntity response = (ResponseEntity) result; + assertThat("response code was wrong", response.getStatusCode(), equalTo(HttpStatus.NOT_FOUND)); + } + } + + private static ConfigurableApplicationContext getApplicationContext(Class configuration, String... properties) { + return new SpringApplicationBuilder(configuration).properties(properties).run(); + } + + @Configuration + @EnableAutoConfiguration + static class Config { + + } +}