Do not permit multiple settings files
This commit enforces that at most a single settings file is found. If multiple settings files are found, a SettingsException will be thrown Closes #13042
This commit is contained in:
parent
5002f3b5ac
commit
fe8eb80b4c
|
@ -21,6 +21,7 @@ package org.elasticsearch.node.internal;
|
||||||
|
|
||||||
import com.google.common.base.Charsets;
|
import com.google.common.base.Charsets;
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
import com.google.common.collect.UnmodifiableIterator;
|
import com.google.common.collect.UnmodifiableIterator;
|
||||||
import org.elasticsearch.cluster.ClusterName;
|
import org.elasticsearch.cluster.ClusterName;
|
||||||
import org.elasticsearch.common.Booleans;
|
import org.elasticsearch.common.Booleans;
|
||||||
|
@ -40,6 +41,7 @@ import java.nio.file.Path;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
|
|
||||||
import static org.elasticsearch.common.Strings.cleanPath;
|
import static org.elasticsearch.common.Strings.cleanPath;
|
||||||
|
@ -113,12 +115,21 @@ public class InternalSettingsPreparer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (loadFromEnv) {
|
if (loadFromEnv) {
|
||||||
|
boolean settingsFileFound = false;
|
||||||
|
Set<String> foundSuffixes = Sets.newHashSet();
|
||||||
for (String allowedSuffix : ALLOWED_SUFFIXES) {
|
for (String allowedSuffix : ALLOWED_SUFFIXES) {
|
||||||
Path path = environment.configFile().resolve("elasticsearch" + allowedSuffix);
|
Path path = environment.configFile().resolve("elasticsearch" + allowedSuffix);
|
||||||
if (Files.exists(path)) {
|
if (Files.exists(path)) {
|
||||||
settingsBuilder.loadFromPath(path);
|
if (!settingsFileFound) {
|
||||||
|
settingsBuilder.loadFromPath(path);
|
||||||
|
}
|
||||||
|
settingsFileFound = true;
|
||||||
|
foundSuffixes.add(allowedSuffix);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (foundSuffixes.size() > 1) {
|
||||||
|
throw new SettingsException("multiple settings files found with suffixes: " + Strings.collectionToDelimitedString(foundSuffixes, ","));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,9 @@ import org.elasticsearch.env.Environment;
|
||||||
import org.elasticsearch.test.ESTestCase;
|
import org.elasticsearch.test.ESTestCase;
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
|
import org.junit.Rule;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import org.junit.rules.ExpectedException;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
@ -42,6 +44,8 @@ import static org.elasticsearch.common.settings.Settings.settingsBuilder;
|
||||||
import static org.hamcrest.Matchers.*;
|
import static org.hamcrest.Matchers.*;
|
||||||
|
|
||||||
public class InternalSettingsPreparerTests extends ESTestCase {
|
public class InternalSettingsPreparerTests extends ESTestCase {
|
||||||
|
@Rule
|
||||||
|
public ExpectedException expectedException = ExpectedException.none();
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setupSystemProperties() {
|
public void setupSystemProperties() {
|
||||||
|
@ -75,29 +79,6 @@ public class InternalSettingsPreparerTests extends ESTestCase {
|
||||||
assertThat(tuple.v1().get("node.zone"), equalTo("bar"));
|
assertThat(tuple.v1().get("node.zone"), equalTo("bar"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testAlternateConfigFileSuffixes() throws Exception {
|
|
||||||
InputStream yaml = getClass().getResourceAsStream("/config/elasticsearch.yaml");
|
|
||||||
InputStream json = getClass().getResourceAsStream("/config/elasticsearch.json");
|
|
||||||
InputStream properties = getClass().getResourceAsStream("/config/elasticsearch.properties");
|
|
||||||
Path home = createTempDir();
|
|
||||||
Path config = home.resolve("config");
|
|
||||||
Files.createDirectory(config);
|
|
||||||
Files.copy(yaml, config.resolve("elasticsearch.yaml"));
|
|
||||||
Files.copy(json, config.resolve("elasticsearch.json"));
|
|
||||||
Files.copy(properties, config.resolve("elasticsearch.properties"));
|
|
||||||
|
|
||||||
// test that we can read config files with .yaml, .json, and .properties suffixes
|
|
||||||
Tuple<Settings, Environment> tuple = InternalSettingsPreparer.prepareSettings(settingsBuilder()
|
|
||||||
.put("config.ignore_system_properties", true)
|
|
||||||
.put("path.home", home)
|
|
||||||
.build(), true);
|
|
||||||
|
|
||||||
assertThat(tuple.v1().get("yaml.config.exists"), equalTo("true"));
|
|
||||||
assertThat(tuple.v1().get("json.config.exists"), equalTo("true"));
|
|
||||||
assertThat(tuple.v1().get("properties.config.exists"), equalTo("true"));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testReplacePromptPlaceholders() {
|
public void testReplacePromptPlaceholders() {
|
||||||
final List<String> replacedSecretProperties = new ArrayList<>();
|
final List<String> replacedSecretProperties = new ArrayList<>();
|
||||||
|
@ -248,4 +229,24 @@ public class InternalSettingsPreparerTests extends ESTestCase {
|
||||||
.put("path.home", home)
|
.put("path.home", home)
|
||||||
.build(), true);
|
.build(), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testMultipleSettingsFileNotAllowed() throws IOException {
|
||||||
|
InputStream yaml = getClass().getResourceAsStream("/config/elasticsearch.yaml");
|
||||||
|
InputStream properties = getClass().getResourceAsStream("/config/elasticsearch.properties");
|
||||||
|
Path home = createTempDir();
|
||||||
|
Path config = home.resolve("config");
|
||||||
|
Files.createDirectory(config);
|
||||||
|
Files.copy(yaml, config.resolve("elasticsearch.yaml"));
|
||||||
|
Files.copy(properties, config.resolve("elasticsearch.properties"));
|
||||||
|
|
||||||
|
expectedException.expect(SettingsException.class);
|
||||||
|
expectedException.expectMessage("multiple settings files found with suffixes: ");
|
||||||
|
expectedException.expectMessage("yaml");
|
||||||
|
expectedException.expectMessage("properties");
|
||||||
|
|
||||||
|
InternalSettingsPreparer.prepareSettings(settingsBuilder()
|
||||||
|
.put("config.ignore_system_properties", true)
|
||||||
|
.put("path.home", home)
|
||||||
|
.build(), true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue