Skip to content

Commit 6b55ea8

Browse files
authored
More flexible settings pattern (#123746) (#123759)
This commit reworks the settings globs to be more useable. Primarily it expands the values so that the settings may be lists, iterating over each value. Additionally it simplifies the function to also allow non-glob settings so that this single method may be used to lookup all values for a given setting pattern, whether it contains a glob or not.
1 parent ceaa182 commit 6b55ea8

File tree

10 files changed

+40
-40
lines changed

10 files changed

+40
-40
lines changed

libs/entitlement/src/main/java/org/elasticsearch/entitlement/bootstrap/EntitlementBootstrap.java

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,7 @@ public class EntitlementBootstrap {
3535
public record BootstrapArgs(
3636
Map<String, Policy> pluginPolicies,
3737
Function<Class<?>, String> pluginResolver,
38-
Function<String, String> settingResolver,
39-
Function<String, Stream<String>> settingGlobResolver,
38+
Function<String, Stream<String>> settingResolver,
4039
Path[] dataDirs,
4140
Path[] sharedRepoDirs,
4241
Path configDir,
@@ -51,7 +50,6 @@ public record BootstrapArgs(
5150
requireNonNull(pluginPolicies);
5251
requireNonNull(pluginResolver);
5352
requireNonNull(settingResolver);
54-
requireNonNull(settingGlobResolver);
5553
requireNonNull(dataDirs);
5654
if (dataDirs.length == 0) {
5755
throw new IllegalArgumentException("must provide at least one data directory");
@@ -78,8 +76,7 @@ public static BootstrapArgs bootstrapArgs() {
7876
*
7977
* @param pluginPolicies a map holding policies for plugins (and modules), by plugin (or module) name.
8078
* @param pluginResolver a functor to map a Java Class to the plugin it belongs to (the plugin name).
81-
* @param settingResolver a functor to resolve the value of an Elasticsearch setting.
82-
* @param settingGlobResolver a functor to resolve a glob expression for one or more Elasticsearch settings.
79+
* @param settingResolver a functor to resolve a setting name pattern for one or more Elasticsearch settings.
8380
* @param dataDirs data directories for Elasticsearch
8481
* @param sharedRepoDirs shared repository directories for Elasticsearch
8582
* @param configDir the config directory for Elasticsearch
@@ -93,8 +90,7 @@ public static BootstrapArgs bootstrapArgs() {
9390
public static void bootstrap(
9491
Map<String, Policy> pluginPolicies,
9592
Function<Class<?>, String> pluginResolver,
96-
Function<String, String> settingResolver,
97-
Function<String, Stream<String>> settingGlobResolver,
93+
Function<String, Stream<String>> settingResolver,
9894
Path[] dataDirs,
9995
Path[] sharedRepoDirs,
10096
Path configDir,
@@ -113,7 +109,6 @@ public static void bootstrap(
113109
pluginPolicies,
114110
pluginResolver,
115111
settingResolver,
116-
settingGlobResolver,
117112
dataDirs,
118113
sharedRepoDirs,
119114
configDir,

libs/entitlement/src/main/java/org/elasticsearch/entitlement/initialization/EntitlementInitialization.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,8 +144,7 @@ private static PolicyManager createPolicyManager() {
144144
bootstrapArgs.dataDirs(),
145145
bootstrapArgs.sharedRepoDirs(),
146146
bootstrapArgs.tempDir(),
147-
bootstrapArgs.settingResolver(),
148-
bootstrapArgs.settingGlobResolver()
147+
bootstrapArgs.settingResolver()
149148
);
150149

151150
List<Scope> serverScopes = new ArrayList<>();

libs/entitlement/src/main/java/org/elasticsearch/entitlement/runtime/policy/PathLookup.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,5 @@ public record PathLookup(
1919
Path[] dataDirs,
2020
Path[] sharedRepoDirs,
2121
Path tempDir,
22-
Function<String, String> settingResolver,
23-
Function<String, Stream<String>> settingGlobResolver
22+
Function<String, Stream<String>> settingResolver
2423
) {}

libs/entitlement/src/main/java/org/elasticsearch/entitlement/runtime/policy/entitlements/FilesEntitlement.java

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -232,13 +232,7 @@ public PathSettingFileData withExclusive(boolean exclusive) {
232232

233233
@Override
234234
public Stream<Path> resolveRelativePaths(PathLookup pathLookup) {
235-
Stream<String> result;
236-
if (setting.contains("*")) {
237-
result = pathLookup.settingGlobResolver().apply(setting);
238-
} else {
239-
String path = pathLookup.settingResolver().apply(setting);
240-
result = path == null ? Stream.of() : Stream.of(path);
241-
}
235+
Stream<String> result = pathLookup.settingResolver().apply(setting);
242236
if (ignoreUrl) {
243237
result = result.filter(s -> s.toLowerCase(Locale.ROOT).startsWith("https://") == false);
244238
}

libs/entitlement/src/test/java/org/elasticsearch/entitlement/runtime/policy/FileAccessTreeTests.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,7 @@ private static Path path(String s) {
5050
new Path[] { Path.of("/data1"), Path.of("/data2") },
5151
new Path[] { Path.of("/shared1"), Path.of("/shared2") },
5252
Path.of("/tmp"),
53-
setting -> settings.get(setting),
54-
glob -> settings.getGlobValues(glob)
53+
pattern -> settings.getValues(pattern)
5554
);
5655

5756
public void testEmpty() {

libs/entitlement/src/test/java/org/elasticsearch/entitlement/runtime/policy/PolicyManagerTests.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,7 @@ public static void beforeClass() {
7171
new Path[] { TEST_BASE_DIR.resolve("/data1/"), TEST_BASE_DIR.resolve("/data2") },
7272
new Path[] { TEST_BASE_DIR.resolve("/shared1"), TEST_BASE_DIR.resolve("/shared2") },
7373
TEST_BASE_DIR.resolve("/temp"),
74-
Settings.EMPTY::get,
75-
Settings.EMPTY::getGlobValues
74+
Settings.EMPTY::getValues
7675
);
7776
} catch (Exception e) {
7877
throw new IllegalStateException(e);

libs/entitlement/src/test/java/org/elasticsearch/entitlement/runtime/policy/entitlements/FilesEntitlementTests.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,7 @@ public static void setupRoot() {
4848
new Path[] { Path.of("/data1"), Path.of("/data2") },
4949
new Path[] { Path.of("/shared1"), Path.of("/shared2") },
5050
Path.of("/tmp"),
51-
setting -> settings.get(setting),
52-
glob -> settings.getGlobValues(glob)
51+
pattern -> settings.getValues(pattern)
5352
);
5453

5554
public void testEmptyBuild() {

server/src/main/java/org/elasticsearch/bootstrap/Elasticsearch.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,8 +242,7 @@ private static void initPhase2(Bootstrap bootstrap) throws IOException {
242242
EntitlementBootstrap.bootstrap(
243243
pluginPolicies,
244244
pluginsResolver::resolveClassToPluginName,
245-
nodeEnv.settings()::get,
246-
nodeEnv.settings()::getGlobValues,
245+
nodeEnv.settings()::getValues,
247246
nodeEnv.dataDirs(),
248247
nodeEnv.repoDirs(),
249248
nodeEnv.configDir(),

server/src/main/java/org/elasticsearch/common/settings/Settings.java

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -291,21 +291,25 @@ public String get(String setting, String defaultValue) {
291291
}
292292

293293
/**
294-
* Returns the values for settings that match the given glob pattern.
295-
* A single glob is supported.
294+
* Returns the values for the given settings pattern.
296295
*
297-
* @param settingGlob setting name containing a glob
298-
* @return zero or more values for any settings in this settings object that match the glob pattern
296+
* Either a concrete setting name, or a pattern containing a single glob is supported.
297+
*
298+
* @param settingPattern name of a setting or a setting name pattern containing a glob
299+
* @return zero or more values for any settings in this settings object that match the given pattern
299300
*/
300-
public Stream<String> getGlobValues(String settingGlob) {
301-
int globIndex = settingGlob.indexOf(".*.");
301+
public Stream<String> getValues(String settingPattern) {
302+
int globIndex = settingPattern.indexOf(".*.");
303+
Stream<String> settingNames;
302304
if (globIndex == -1) {
303-
throw new IllegalArgumentException("Pattern [" + settingGlob + "] does not contain a glob [*]");
305+
settingNames = Stream.of(settingPattern);
306+
} else {
307+
String prefix = settingPattern.substring(0, globIndex + 1);
308+
String suffix = settingPattern.substring(globIndex + 2);
309+
Settings subSettings = getByPrefix(prefix);
310+
settingNames = subSettings.names().stream().map(k -> prefix + k + suffix);
304311
}
305-
String prefix = settingGlob.substring(0, globIndex + 1);
306-
String suffix = settingGlob.substring(globIndex + 2);
307-
Settings subSettings = getByPrefix(prefix);
308-
return subSettings.names().stream().map(k -> k + suffix).map(subSettings::get).filter(Objects::nonNull);
312+
return settingNames.map(this::getAsList).flatMap(List::stream).filter(Objects::nonNull);
309313
}
310314

311315
/**

server/src/test/java/org/elasticsearch/common/settings/SettingsTests.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import static org.hamcrest.Matchers.contains;
4545
import static org.hamcrest.Matchers.containsInAnyOrder;
4646
import static org.hamcrest.Matchers.containsString;
47+
import static org.hamcrest.Matchers.empty;
4748
import static org.hamcrest.Matchers.equalTo;
4849
import static org.hamcrest.Matchers.hasToString;
4950
import static org.hamcrest.Matchers.is;
@@ -711,9 +712,21 @@ public void testProcessSetting() throws IOException {
711712
}
712713

713714
public void testGlobValues() throws IOException {
714-
Settings test = Settings.builder().put("foo.x.bar", "1").put("foo.y.bar", "2").build();
715-
var values = test.getGlobValues("foo.*.bar").toList();
715+
Settings test = Settings.builder().put("foo.x.bar", "1").build();
716+
717+
// no values
718+
assertThat(test.getValues("foo.*.baz").toList(), empty());
719+
assertThat(test.getValues("fuz.*.bar").toList(), empty());
720+
721+
var values = test.getValues("foo.*.bar").toList();
722+
assertThat(values, containsInAnyOrder("1"));
723+
724+
test = Settings.builder().put("foo.x.bar", "1").put("foo.y.bar", "2").build();
725+
values = test.getValues("foo.*.bar").toList();
716726
assertThat(values, containsInAnyOrder("1", "2"));
727+
728+
values = test.getValues("foo.x.bar").toList();
729+
assertThat(values, contains("1"));
717730
}
718731

719732
}

0 commit comments

Comments
 (0)