|
@@ -29,12 +29,16 @@ import org.elasticsearch.common.settings.Settings;
|
|
|
import org.elasticsearch.test.ESTestCase;
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
+import java.util.HashSet;
|
|
|
+import java.util.Iterator;
|
|
|
import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
import java.util.Set;
|
|
|
import java.util.concurrent.atomic.AtomicReference;
|
|
|
import java.util.stream.Collectors;
|
|
|
import java.util.stream.Stream;
|
|
|
|
|
|
+import static java.util.Arrays.asList;
|
|
|
import static org.elasticsearch.common.settings.AbstractScopedSettings.ARCHIVED_SETTINGS_PREFIX;
|
|
|
import static org.hamcrest.Matchers.equalTo;
|
|
|
import static org.hamcrest.Matchers.hasItem;
|
|
@@ -221,24 +225,11 @@ public class SettingsUpdaterTests extends ESTestCase {
|
|
|
|
|
|
// these are invalid settings that exist as either persistent or transient settings
|
|
|
final int numberOfInvalidSettings = randomIntBetween(0, 7);
|
|
|
- final List<Setting<String>> invalidSettings = new ArrayList<>(numberOfInvalidSettings);
|
|
|
- for (int i = 0; i < numberOfInvalidSettings; i++) {
|
|
|
- final Setting<String> invalidSetting = Setting.simpleString(
|
|
|
- "invalid.setting" + i,
|
|
|
- (value, settings) -> {
|
|
|
- throw new IllegalArgumentException("invalid");
|
|
|
- },
|
|
|
- Property.NodeScope);
|
|
|
- invalidSettings.add(invalidSetting);
|
|
|
- }
|
|
|
+ final List<Setting<String>> invalidSettings = invalidSettings(numberOfInvalidSettings);
|
|
|
|
|
|
// these are unknown settings that exist as either persistent or transient settings
|
|
|
final int numberOfUnknownSettings = randomIntBetween(0, 7);
|
|
|
- final List<Setting<String>> unknownSettings = new ArrayList<>(numberOfUnknownSettings);
|
|
|
- for (int i = 0; i < numberOfUnknownSettings; i++) {
|
|
|
- final Setting<String> unknownSetting = Setting.simpleString("unknown.setting" + i, Property.NodeScope);
|
|
|
- unknownSettings.add(unknownSetting);
|
|
|
- }
|
|
|
+ final List<Setting<String>> unknownSettings = unknownSettings(numberOfUnknownSettings);
|
|
|
|
|
|
final Settings.Builder existingPersistentSettings = Settings.builder();
|
|
|
final Settings.Builder existingTransientSettings = Settings.builder();
|
|
@@ -393,24 +384,11 @@ public class SettingsUpdaterTests extends ESTestCase {
|
|
|
|
|
|
// these are invalid settings that exist as either persistent or transient settings
|
|
|
final int numberOfInvalidSettings = randomIntBetween(0, 7);
|
|
|
- final List<Setting<String>> invalidSettings = new ArrayList<>(numberOfInvalidSettings);
|
|
|
- for (int i = 0; i < numberOfInvalidSettings; i++) {
|
|
|
- final Setting<String> invalidSetting = Setting.simpleString(
|
|
|
- "invalid.setting" + i,
|
|
|
- (value, settings) -> {
|
|
|
- throw new IllegalArgumentException("invalid");
|
|
|
- },
|
|
|
- Property.NodeScope);
|
|
|
- invalidSettings.add(invalidSetting);
|
|
|
- }
|
|
|
+ final List<Setting<String>> invalidSettings = invalidSettings(numberOfInvalidSettings);
|
|
|
|
|
|
// these are unknown settings that exist as either persistent or transient settings
|
|
|
final int numberOfUnknownSettings = randomIntBetween(0, 7);
|
|
|
- final List<Setting<String>> unknownSettings = new ArrayList<>(numberOfUnknownSettings);
|
|
|
- for (int i = 0; i < numberOfUnknownSettings; i++) {
|
|
|
- final Setting<String> unknownSetting = Setting.simpleString("unknown.setting" + i, Property.NodeScope);
|
|
|
- unknownSettings.add(unknownSetting);
|
|
|
- }
|
|
|
+ final List<Setting<String>> unknownSettings = unknownSettings(numberOfUnknownSettings);
|
|
|
|
|
|
final Settings.Builder existingPersistentSettings = Settings.builder();
|
|
|
final Settings.Builder existingTransientSettings = Settings.builder();
|
|
@@ -511,4 +489,120 @@ public class SettingsUpdaterTests extends ESTestCase {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ private static List<Setting<String>> unknownSettings(int numberOfUnknownSettings) {
|
|
|
+ final List<Setting<String>> unknownSettings = new ArrayList<>(numberOfUnknownSettings);
|
|
|
+ for (int i = 0; i < numberOfUnknownSettings; i++) {
|
|
|
+ unknownSettings.add(Setting.simpleString("unknown.setting" + i, Property.NodeScope));
|
|
|
+ }
|
|
|
+ return unknownSettings;
|
|
|
+ }
|
|
|
+
|
|
|
+ private static List<Setting<String>> invalidSettings(int numberOfInvalidSettings) {
|
|
|
+ final List<Setting<String>> invalidSettings = new ArrayList<>(numberOfInvalidSettings);
|
|
|
+ for (int i = 0; i < numberOfInvalidSettings; i++) {
|
|
|
+ invalidSettings.add(randomBoolean() ? invalidInIsolationSetting(i) : invalidWithDependenciesSetting(i));
|
|
|
+ }
|
|
|
+ return invalidSettings;
|
|
|
+ }
|
|
|
+
|
|
|
+ private static Setting<String> invalidInIsolationSetting(int index) {
|
|
|
+ return Setting.simpleString("invalid.setting" + index,
|
|
|
+ new Setting.Validator<String>() {
|
|
|
+ @Override
|
|
|
+ public void validate(String value) {
|
|
|
+ throw new IllegalArgumentException("Invalid in isolation setting");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void validate(String value, Map<Setting<String>, String> settings) {
|
|
|
+ }
|
|
|
+ },
|
|
|
+ Property.NodeScope);
|
|
|
+ }
|
|
|
+
|
|
|
+ private static Setting<String> invalidWithDependenciesSetting(int index) {
|
|
|
+ return Setting.simpleString("invalid.setting" + index,
|
|
|
+ new Setting.Validator<String>() {
|
|
|
+ @Override
|
|
|
+ public void validate(String value) {
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void validate(String value, Map<Setting<String>, String> settings) {
|
|
|
+ throw new IllegalArgumentException("Invalid with dependencies setting");
|
|
|
+ }
|
|
|
+ },
|
|
|
+ Property.NodeScope);
|
|
|
+ }
|
|
|
+
|
|
|
+ private static class FooLowSettingValidator implements Setting.Validator<Integer> {
|
|
|
+ @Override
|
|
|
+ public void validate(Integer value) {
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void validate(Integer low, Map<Setting<Integer>, Integer> settings) {
|
|
|
+ if (settings.containsKey(SETTING_FOO_HIGH) && low > settings.get(SETTING_FOO_HIGH)) {
|
|
|
+ throw new IllegalArgumentException("[low]=" + low + " is higher than [high]=" + settings.get(SETTING_FOO_HIGH));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Iterator<Setting<Integer>> settings() {
|
|
|
+ return asList(SETTING_FOO_LOW, SETTING_FOO_HIGH).iterator();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private static class FooHighSettingValidator implements Setting.Validator<Integer> {
|
|
|
+ @Override
|
|
|
+ public void validate(Integer value) {
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void validate(Integer high, Map<Setting<Integer>, Integer> settings) {
|
|
|
+ if (settings.containsKey(SETTING_FOO_LOW) && high < settings.get(SETTING_FOO_LOW)) {
|
|
|
+ throw new IllegalArgumentException("[high]=" + high + " is lower than [low]=" + settings.get(SETTING_FOO_LOW));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Iterator<Setting<Integer>> settings() {
|
|
|
+ return asList(SETTING_FOO_LOW, SETTING_FOO_HIGH).iterator();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private static final Setting<Integer> SETTING_FOO_LOW = new Setting<>("foo.low", "10",
|
|
|
+ Integer::valueOf, new FooLowSettingValidator(), Property.Dynamic, Setting.Property.NodeScope);
|
|
|
+ private static final Setting<Integer> SETTING_FOO_HIGH = new Setting<>("foo.high", "100",
|
|
|
+ Integer::valueOf, new FooHighSettingValidator(), Property.Dynamic, Setting.Property.NodeScope);
|
|
|
+
|
|
|
+ public void testUpdateOfValidationDependentSettings() {
|
|
|
+ final ClusterSettings settings = new ClusterSettings(Settings.EMPTY, new HashSet<>(asList(SETTING_FOO_LOW, SETTING_FOO_HIGH)));
|
|
|
+ final SettingsUpdater updater = new SettingsUpdater(settings);
|
|
|
+ final MetaData.Builder metaData = MetaData.builder().persistentSettings(Settings.EMPTY).transientSettings(Settings.EMPTY);
|
|
|
+
|
|
|
+ ClusterState cluster = ClusterState.builder(new ClusterName("cluster")).metaData(metaData).build();
|
|
|
+
|
|
|
+ cluster = updater.updateSettings(cluster, Settings.builder().put(SETTING_FOO_LOW.getKey(), 20).build(), Settings.EMPTY, logger);
|
|
|
+ assertThat(cluster.getMetaData().settings().get(SETTING_FOO_LOW.getKey()), equalTo("20"));
|
|
|
+
|
|
|
+ cluster = updater.updateSettings(cluster, Settings.builder().put(SETTING_FOO_HIGH.getKey(), 40).build(), Settings.EMPTY, logger);
|
|
|
+ assertThat(cluster.getMetaData().settings().get(SETTING_FOO_LOW.getKey()), equalTo("20"));
|
|
|
+ assertThat(cluster.getMetaData().settings().get(SETTING_FOO_HIGH.getKey()), equalTo("40"));
|
|
|
+
|
|
|
+ cluster = updater.updateSettings(cluster, Settings.builder().put(SETTING_FOO_LOW.getKey(), 5).build(), Settings.EMPTY, logger);
|
|
|
+ assertThat(cluster.getMetaData().settings().get(SETTING_FOO_LOW.getKey()), equalTo("5"));
|
|
|
+ assertThat(cluster.getMetaData().settings().get(SETTING_FOO_HIGH.getKey()), equalTo("40"));
|
|
|
+
|
|
|
+ cluster = updater.updateSettings(cluster, Settings.builder().put(SETTING_FOO_HIGH.getKey(), 8).build(), Settings.EMPTY, logger);
|
|
|
+ assertThat(cluster.getMetaData().settings().get(SETTING_FOO_LOW.getKey()), equalTo("5"));
|
|
|
+ assertThat(cluster.getMetaData().settings().get(SETTING_FOO_HIGH.getKey()), equalTo("8"));
|
|
|
+
|
|
|
+ final ClusterState finalCluster = cluster;
|
|
|
+ Exception exception = expectThrows(IllegalArgumentException.class, () ->
|
|
|
+ updater.updateSettings(finalCluster, Settings.builder().put(SETTING_FOO_HIGH.getKey(), 2).build(), Settings.EMPTY, logger));
|
|
|
+
|
|
|
+ assertThat(exception.getMessage(), equalTo("[high]=2 is lower than [low]=5"));
|
|
|
+ }
|
|
|
+
|
|
|
}
|