diff --git a/spring-boot/starter/src/main/java/org/togglz/spring/boot/actuate/TogglzEndpoint.java b/spring-boot/starter/src/main/java/org/togglz/spring/boot/actuate/TogglzEndpoint.java index 42d783dc1..179235c88 100644 --- a/spring-boot/starter/src/main/java/org/togglz/spring/boot/actuate/TogglzEndpoint.java +++ b/spring-boot/starter/src/main/java/org/togglz/spring/boot/actuate/TogglzEndpoint.java @@ -16,18 +16,20 @@ package org.togglz.spring.boot.actuate; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - import org.springframework.boot.actuate.endpoint.annotation.Endpoint; import org.springframework.boot.actuate.endpoint.annotation.ReadOperation; +import org.springframework.boot.actuate.endpoint.annotation.Selector; +import org.springframework.boot.actuate.endpoint.annotation.WriteOperation; import org.springframework.util.Assert; import org.togglz.core.Feature; import org.togglz.core.manager.FeatureManager; import org.togglz.core.repository.FeatureState; import org.togglz.spring.boot.autoconfigure.TogglzFeature; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + /** * Spring Boot 2+ {@link Endpoint} to expose Togglz info. * @@ -53,4 +55,18 @@ public List getAllFeatures() { Collections.sort(features); return features; } + + @WriteOperation + public TogglzFeature setFeatureState(@Selector String featureName, boolean enabled) { + final Feature feature = featureManager.getFeatures().stream() + .filter(f -> f.name().equals(featureName)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("Could not find feature with name " + featureName)); + + FeatureState featureState = featureManager.getFeatureState(feature); + featureState.setEnabled(enabled); + featureManager.setFeatureState(featureState); + + return new TogglzFeature(feature, featureState); + } } diff --git a/spring-boot/starter/src/test/java/org/togglz/spring/boot/actuate/TogglzEndpointTest.java b/spring-boot/starter/src/test/java/org/togglz/spring/boot/actuate/TogglzEndpointTest.java index 7c2e14347..9619d4801 100644 --- a/spring-boot/starter/src/test/java/org/togglz/spring/boot/actuate/TogglzEndpointTest.java +++ b/spring-boot/starter/src/test/java/org/togglz/spring/boot/actuate/TogglzEndpointTest.java @@ -16,17 +16,16 @@ package org.togglz.spring.boot.actuate; -import static org.assertj.core.api.Assertions.assertThat; - -import java.util.List; - import org.junit.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; -import org.togglz.spring.boot.actuate.TogglzEndpoint; import org.togglz.spring.boot.actuate.autoconfigure.TogglzEndpointAutoConfiguration; import org.togglz.spring.boot.autoconfigure.TogglzAutoConfiguration; import org.togglz.spring.boot.autoconfigure.TogglzFeature; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + /** * Tests for Spring Boot 2 compatible {@link TogglzEndpoint}. * @@ -69,6 +68,58 @@ public void getAllFeatures() throws Exception { }); } + @Test + public void shouldEnableAFeature() { + contextRunner.withConfiguration(AutoConfigurations.of( + TogglzAutoConfiguration.class, + TogglzEndpointAutoConfiguration.class)) + .withPropertyValues( + "togglz.features.FEATURE_ONE.enabled: false") + .run((context) -> { + // Given + TogglzEndpoint endpoint = context.getBean(TogglzEndpoint.class); + + // When + final TogglzFeature togglzFeature = endpoint.setFeatureState("FEATURE_ONE", true); + + // Then + assertThat(togglzFeature.isEnabled()).isTrue(); + }); + } + + @Test + public void shouldDisableAFeature() { + contextRunner.withConfiguration(AutoConfigurations.of( + TogglzAutoConfiguration.class, + TogglzEndpointAutoConfiguration.class)) + .withPropertyValues( + "togglz.features.FEATURE_ONE.enabled: true") + .run((context) -> { + // Given + TogglzEndpoint endpoint = context.getBean(TogglzEndpoint.class); + + // When + final TogglzFeature togglzFeature = endpoint.setFeatureState("FEATURE_ONE", false); + + // Then + assertThat(togglzFeature.isEnabled()).isFalse(); + }); + } + + @Test(expected = IllegalArgumentException.class) + public void shouldThrowAnIllegalArgumentExceptionIfTheFeatureDoesNotExist() { + contextRunner.withConfiguration(AutoConfigurations.of( + TogglzAutoConfiguration.class, + TogglzEndpointAutoConfiguration.class)) + .run((context) -> { + // Given + TogglzEndpoint endpoint = context.getBean(TogglzEndpoint.class); + + // When + final TogglzFeature togglzFeature = endpoint.setFeatureState("FEATURE_ONE", false); + }); + } + @Test public void endpointDisabled() { contextRunnerWithFeatureProviderConfig()