Skip to content

Commit

Permalink
Add write operation to change toggle state via Spring Boot Actuator (#…
Browse files Browse the repository at this point in the history
…310)

* Add write operation to change toggle state via Spring Boot Actuator

Resolves: #308
  • Loading branch information
kschlesselmann authored and ruifigueira committed Dec 22, 2018
1 parent 82d2fa9 commit c6183b5
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 9 deletions.
Expand Up @@ -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.
*
Expand All @@ -53,4 +55,18 @@ public List<TogglzFeature> 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);
}
}
Expand Up @@ -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}.
*
Expand Down Expand Up @@ -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()
Expand Down

0 comments on commit c6183b5

Please sign in to comment.