Reject duplicate settings on the command line
Today Elasticsearch and other CLI tools that rely on environment aware command leniently accept duplicate settings with the last one winning. This commit removes this leniency. Relates #24053
This commit is contained in:
parent
cf6b03c8f4
commit
b4c3bb5d21
|
@ -45,7 +45,16 @@ public abstract class EnvironmentAwareCommand extends Command {
|
||||||
final Map<String, String> settings = new HashMap<>();
|
final Map<String, String> settings = new HashMap<>();
|
||||||
for (final KeyValuePair kvp : settingOption.values(options)) {
|
for (final KeyValuePair kvp : settingOption.values(options)) {
|
||||||
if (kvp.value.isEmpty()) {
|
if (kvp.value.isEmpty()) {
|
||||||
throw new UserException(ExitCodes.USAGE, "Setting [" + kvp.key + "] must not be empty");
|
throw new UserException(ExitCodes.USAGE, "setting [" + kvp.key + "] must not be empty");
|
||||||
|
}
|
||||||
|
if (settings.containsKey(kvp.key)) {
|
||||||
|
final String message = String.format(
|
||||||
|
Locale.ROOT,
|
||||||
|
"setting [%s] already set, saw [%s] and [%s]",
|
||||||
|
kvp.key,
|
||||||
|
settings.get(kvp.key),
|
||||||
|
kvp.value);
|
||||||
|
throw new UserException(ExitCodes.USAGE, message);
|
||||||
}
|
}
|
||||||
settings.put(kvp.key, kvp.value);
|
settings.put(kvp.key, kvp.value);
|
||||||
}
|
}
|
||||||
|
|
|
@ -79,22 +79,19 @@ public class ElasticsearchCliTests extends ESElasticsearchCliTestCase {
|
||||||
false,
|
false,
|
||||||
output -> assertThat(output, containsString("Positional arguments not allowed, found [foo]")),
|
output -> assertThat(output, containsString("Positional arguments not allowed, found [foo]")),
|
||||||
(foreground, pidFile, quiet, esSettings) -> {},
|
(foreground, pidFile, quiet, esSettings) -> {},
|
||||||
"foo"
|
"foo");
|
||||||
);
|
|
||||||
runTest(
|
runTest(
|
||||||
ExitCodes.USAGE,
|
ExitCodes.USAGE,
|
||||||
false,
|
false,
|
||||||
output -> assertThat(output, containsString("Positional arguments not allowed, found [foo, bar]")),
|
output -> assertThat(output, containsString("Positional arguments not allowed, found [foo, bar]")),
|
||||||
(foreground, pidFile, quiet, esSettings) -> {},
|
(foreground, pidFile, quiet, esSettings) -> {},
|
||||||
"foo", "bar"
|
"foo", "bar");
|
||||||
);
|
|
||||||
runTest(
|
runTest(
|
||||||
ExitCodes.USAGE,
|
ExitCodes.USAGE,
|
||||||
false,
|
false,
|
||||||
output -> assertThat(output, containsString("Positional arguments not allowed, found [foo]")),
|
output -> assertThat(output, containsString("Positional arguments not allowed, found [foo]")),
|
||||||
(foreground, pidFile, quiet, esSettings) -> {},
|
(foreground, pidFile, quiet, esSettings) -> {},
|
||||||
"-E", "foo=bar", "foo", "-E", "baz=qux"
|
"-E", "foo=bar", "foo", "-E", "baz=qux");
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testThatPidFileCanBeConfigured() throws Exception {
|
public void testThatPidFileCanBeConfigured() throws Exception {
|
||||||
|
@ -157,18 +154,25 @@ public class ElasticsearchCliTests extends ESElasticsearchCliTestCase {
|
||||||
assertThat(settings, hasEntry("foo", "bar"));
|
assertThat(settings, hasEntry("foo", "bar"));
|
||||||
assertThat(settings, hasEntry("baz", "qux"));
|
assertThat(settings, hasEntry("baz", "qux"));
|
||||||
},
|
},
|
||||||
"-Efoo=bar", "-E", "baz=qux"
|
"-Efoo=bar", "-E", "baz=qux");
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testElasticsearchSettingCanNotBeEmpty() throws Exception {
|
public void testElasticsearchSettingCanNotBeEmpty() throws Exception {
|
||||||
runTest(
|
runTest(
|
||||||
ExitCodes.USAGE,
|
ExitCodes.USAGE,
|
||||||
false,
|
false,
|
||||||
output -> assertThat(output, containsString("Setting [foo] must not be empty")),
|
output -> assertThat(output, containsString("setting [foo] must not be empty")),
|
||||||
(foreground, pidFile, quiet, esSettings) -> {},
|
(foreground, pidFile, quiet, esSettings) -> {},
|
||||||
"-E", "foo="
|
"-E", "foo=");
|
||||||
);
|
}
|
||||||
|
|
||||||
|
public void testElasticsearchSettingCanNotBeDuplicated() throws Exception {
|
||||||
|
runTest(
|
||||||
|
ExitCodes.USAGE,
|
||||||
|
false,
|
||||||
|
output -> assertThat(output, containsString("setting [foo] already set, saw [bar] and [baz]")),
|
||||||
|
(foreground, pidFile, quiet, initialEnv) -> {},
|
||||||
|
"-E", "foo=bar", "-E", "foo=baz");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testUnknownOption() throws Exception {
|
public void testUnknownOption() throws Exception {
|
||||||
|
|
Loading…
Reference in New Issue