Skip to content

Commit 07b99ef

Browse files
authored
Add migration check for legacy role settings (#71197)
This commit adds a migration check for the legacy role settings. This check checks for any usage of the legacy role settings, and informs the user of the correct value to use for the node.roles settings instead.
1 parent 79b69dd commit 07b99ef

File tree

3 files changed

+129
-40
lines changed

3 files changed

+129
-40
lines changed

x-pack/plugin/deprecation/src/main/java/org/elasticsearch/xpack/deprecation/DeprecationChecks.java

Lines changed: 46 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.elasticsearch.action.admin.cluster.node.info.PluginsAndModules;
1010
import org.elasticsearch.cluster.ClusterState;
1111
import org.elasticsearch.cluster.metadata.IndexMetadata;
12+
import org.elasticsearch.cluster.node.DiscoveryNode;
1213
import org.elasticsearch.common.settings.Settings;
1314
import org.elasticsearch.xpack.core.XPackSettings;
1415
import org.elasticsearch.xpack.core.deprecation.DeprecationInfoAction;
@@ -21,6 +22,7 @@
2122
import java.util.function.BiFunction;
2223
import java.util.function.Function;
2324
import java.util.stream.Collectors;
25+
import java.util.stream.Stream;
2426

2527
/**
2628
* Class containing all the cluster, node, and index deprecation checks that will be served
@@ -40,40 +42,50 @@ private DeprecationChecks() {
4042
));
4143

4244

43-
static List<BiFunction<Settings, PluginsAndModules, DeprecationIssue>> NODE_SETTINGS_CHECKS =
44-
Collections.unmodifiableList(Arrays.asList(
45-
NodeDeprecationChecks::javaVersionCheck,
46-
NodeDeprecationChecks::checkPidfile,
47-
NodeDeprecationChecks::checkProcessors,
48-
NodeDeprecationChecks::checkMissingRealmOrders,
49-
NodeDeprecationChecks::checkUniqueRealmOrders,
50-
NodeDeprecationChecks::checkImplicitlyDisabledBasicRealms,
51-
(settings, pluginsAndModules) -> NodeDeprecationChecks.checkThreadPoolListenerQueueSize(settings),
52-
(settings, pluginsAndModules) -> NodeDeprecationChecks.checkThreadPoolListenerSize(settings),
53-
NodeDeprecationChecks::checkClusterRemoteConnectSetting,
54-
NodeDeprecationChecks::checkNodeLocalStorageSetting,
55-
NodeDeprecationChecks::checkGeneralScriptSizeSetting,
56-
NodeDeprecationChecks::checkGeneralScriptExpireSetting,
57-
NodeDeprecationChecks::checkGeneralScriptCompileSettings,
58-
(settings, pluginsAndModules) -> NodeDeprecationChecks.checkNodeBasicLicenseFeatureEnabledSetting(settings,
59-
XPackSettings.ENRICH_ENABLED_SETTING),
60-
(settings, pluginsAndModules) -> NodeDeprecationChecks.checkNodeBasicLicenseFeatureEnabledSetting(settings,
61-
XPackSettings.FLATTENED_ENABLED),
62-
(settings, pluginsAndModules) -> NodeDeprecationChecks.checkNodeBasicLicenseFeatureEnabledSetting(settings,
63-
XPackSettings.INDEX_LIFECYCLE_ENABLED),
64-
(settings, pluginsAndModules) -> NodeDeprecationChecks.checkNodeBasicLicenseFeatureEnabledSetting(settings,
65-
XPackSettings.MONITORING_ENABLED),
66-
(settings, pluginsAndModules) -> NodeDeprecationChecks.checkNodeBasicLicenseFeatureEnabledSetting(settings,
67-
XPackSettings.ROLLUP_ENABLED),
68-
(settings, pluginsAndModules) -> NodeDeprecationChecks.checkNodeBasicLicenseFeatureEnabledSetting(settings,
69-
XPackSettings.SNAPSHOT_LIFECYCLE_ENABLED),
70-
(settings, pluginsAndModules) -> NodeDeprecationChecks.checkNodeBasicLicenseFeatureEnabledSetting(settings,
71-
XPackSettings.SQL_ENABLED),
72-
(settings, pluginsAndModules) -> NodeDeprecationChecks.checkNodeBasicLicenseFeatureEnabledSetting(settings,
73-
XPackSettings.TRANSFORM_ENABLED),
74-
(settings, pluginsAndModules) -> NodeDeprecationChecks.checkNodeBasicLicenseFeatureEnabledSetting(settings,
75-
XPackSettings.VECTORS_ENABLED)
76-
));
45+
static final List<BiFunction<Settings, PluginsAndModules, DeprecationIssue>> NODE_SETTINGS_CHECKS;
46+
47+
static {
48+
final Stream<BiFunction<Settings, PluginsAndModules, DeprecationIssue>> legacyRoleSettings = DiscoveryNode.getPossibleRoles()
49+
.stream()
50+
.filter(r -> r.legacySetting() != null)
51+
.map(r -> (s, p) -> NodeDeprecationChecks.checkLegacyRoleSettings(r.legacySetting(), s, p));
52+
NODE_SETTINGS_CHECKS = Stream.concat(
53+
legacyRoleSettings,
54+
Stream.of(
55+
NodeDeprecationChecks::javaVersionCheck,
56+
NodeDeprecationChecks::checkPidfile,
57+
NodeDeprecationChecks::checkProcessors,
58+
NodeDeprecationChecks::checkMissingRealmOrders,
59+
NodeDeprecationChecks::checkUniqueRealmOrders,
60+
NodeDeprecationChecks::checkImplicitlyDisabledBasicRealms,
61+
(settings, pluginsAndModules) -> NodeDeprecationChecks.checkThreadPoolListenerQueueSize(settings),
62+
(settings, pluginsAndModules) -> NodeDeprecationChecks.checkThreadPoolListenerSize(settings),
63+
NodeDeprecationChecks::checkClusterRemoteConnectSetting,
64+
NodeDeprecationChecks::checkNodeLocalStorageSetting,
65+
NodeDeprecationChecks::checkGeneralScriptSizeSetting,
66+
NodeDeprecationChecks::checkGeneralScriptExpireSetting,
67+
NodeDeprecationChecks::checkGeneralScriptCompileSettings,
68+
(settings, pluginsAndModules) -> NodeDeprecationChecks.checkNodeBasicLicenseFeatureEnabledSetting(settings,
69+
XPackSettings.ENRICH_ENABLED_SETTING),
70+
(settings, pluginsAndModules) -> NodeDeprecationChecks.checkNodeBasicLicenseFeatureEnabledSetting(settings,
71+
XPackSettings.FLATTENED_ENABLED),
72+
(settings, pluginsAndModules) -> NodeDeprecationChecks.checkNodeBasicLicenseFeatureEnabledSetting(settings,
73+
XPackSettings.INDEX_LIFECYCLE_ENABLED),
74+
(settings, pluginsAndModules) -> NodeDeprecationChecks.checkNodeBasicLicenseFeatureEnabledSetting(settings,
75+
XPackSettings.MONITORING_ENABLED),
76+
(settings, pluginsAndModules) -> NodeDeprecationChecks.checkNodeBasicLicenseFeatureEnabledSetting(settings,
77+
XPackSettings.ROLLUP_ENABLED),
78+
(settings, pluginsAndModules) -> NodeDeprecationChecks.checkNodeBasicLicenseFeatureEnabledSetting(settings,
79+
XPackSettings.SNAPSHOT_LIFECYCLE_ENABLED),
80+
(settings, pluginsAndModules) -> NodeDeprecationChecks.checkNodeBasicLicenseFeatureEnabledSetting(settings,
81+
XPackSettings.SQL_ENABLED),
82+
(settings, pluginsAndModules) -> NodeDeprecationChecks.checkNodeBasicLicenseFeatureEnabledSetting(settings,
83+
XPackSettings.TRANSFORM_ENABLED),
84+
(settings, pluginsAndModules) -> NodeDeprecationChecks.checkNodeBasicLicenseFeatureEnabledSetting(settings,
85+
XPackSettings.VECTORS_ENABLED)
86+
)
87+
).collect(Collectors.toList());
88+
}
7789

7890
static List<Function<IndexMetadata, DeprecationIssue>> INDEX_SETTINGS_CHECKS =
7991
Collections.unmodifiableList(Arrays.asList(

x-pack/plugin/deprecation/src/main/java/org/elasticsearch/xpack/deprecation/NodeDeprecationChecks.java

Lines changed: 54 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99

1010
import org.elasticsearch.action.admin.cluster.node.info.PluginsAndModules;
1111
import org.elasticsearch.bootstrap.JavaVersion;
12+
import org.elasticsearch.cluster.node.DiscoveryNode;
13+
import org.elasticsearch.cluster.node.DiscoveryNodeRole;
1214
import org.elasticsearch.common.Strings;
1315
import org.elasticsearch.common.settings.Setting;
1416
import org.elasticsearch.common.settings.Setting.Property;
@@ -17,6 +19,7 @@
1719
import org.elasticsearch.common.util.set.Sets;
1820
import org.elasticsearch.env.Environment;
1921
import org.elasticsearch.node.Node;
22+
import org.elasticsearch.node.NodeRoleSettings;
2023
import org.elasticsearch.script.ScriptService;
2124
import org.elasticsearch.threadpool.FixedExecutorBuilder;
2225
import org.elasticsearch.transport.RemoteClusterService;
@@ -32,6 +35,7 @@
3235
import java.util.Map;
3336
import java.util.Optional;
3437
import java.util.Set;
38+
import java.util.function.BiFunction;
3539
import java.util.stream.Collectors;
3640

3741
class NodeDeprecationChecks {
@@ -244,12 +248,45 @@ public static DeprecationIssue checkGeneralScriptCompileSettings(final Settings
244248
);
245249
}
246250

251+
public static DeprecationIssue checkLegacyRoleSettings(
252+
final Setting<Boolean> legacyRoleSetting,
253+
final Settings settings,
254+
final PluginsAndModules pluginsAndModules
255+
) {
256+
257+
return checkDeprecatedSetting(
258+
settings,
259+
pluginsAndModules,
260+
legacyRoleSetting,
261+
NodeRoleSettings.NODE_ROLES_SETTING,
262+
(v, s) -> {
263+
return DiscoveryNode.getRolesFromSettings(s)
264+
.stream()
265+
.map(DiscoveryNodeRole::roleName)
266+
.collect(Collectors.joining(","));
267+
},
268+
"https://www.elastic.co/guide/en/elasticsearch/reference/master/breaking-changes-8.0.html#breaking_80_settings_changes"
269+
);
270+
}
271+
272+
private static DeprecationIssue checkDeprecatedSetting(
273+
final Settings settings,
274+
final PluginsAndModules pluginsAndModules,
275+
final Setting<?> deprecatedSetting,
276+
final Setting<?> replacementSetting,
277+
final String url
278+
) {
279+
return checkDeprecatedSetting(settings, pluginsAndModules, deprecatedSetting, replacementSetting, (v, s) -> v, url);
280+
}
281+
247282
private static DeprecationIssue checkDeprecatedSetting(
248283
final Settings settings,
249284
final PluginsAndModules pluginsAndModules,
250285
final Setting<?> deprecatedSetting,
251286
final Setting<?> replacementSetting,
252-
final String url) {
287+
final BiFunction<String, Settings, String> replacementValue,
288+
final String url
289+
) {
253290
assert deprecatedSetting.isDeprecated() : deprecatedSetting;
254291
if (deprecatedSetting.exists(settings) == false) {
255292
return null;
@@ -268,7 +305,7 @@ private static DeprecationIssue checkDeprecatedSetting(
268305
deprecatedSettingKey,
269306
value,
270307
replacementSettingKey,
271-
value);
308+
replacementValue.apply(value, settings));
272309
return new DeprecationIssue(DeprecationIssue.Level.CRITICAL, message, url, details);
273310
}
274311

@@ -278,7 +315,20 @@ private static DeprecationIssue checkDeprecatedSetting(
278315
final Setting<?> deprecatedSetting,
279316
final Setting.AffixSetting<?> replacementSetting,
280317
final String star,
281-
final String url) {
318+
final String url
319+
) {
320+
return checkDeprecatedSetting(settings, pluginsAndModules, deprecatedSetting, replacementSetting, (v, s) -> v, star, url);
321+
}
322+
323+
private static DeprecationIssue checkDeprecatedSetting(
324+
final Settings settings,
325+
final PluginsAndModules pluginsAndModules,
326+
final Setting<?> deprecatedSetting,
327+
final Setting.AffixSetting<?> replacementSetting,
328+
final BiFunction<String, Settings, String> replacementValue,
329+
final String star,
330+
final String url
331+
) {
282332
assert deprecatedSetting.isDeprecated() : deprecatedSetting;
283333
if (deprecatedSetting.exists(settings) == false) {
284334
return null;
@@ -297,7 +347,7 @@ private static DeprecationIssue checkDeprecatedSetting(
297347
deprecatedSettingKey,
298348
value,
299349
replacementSettingKey,
300-
value,
350+
replacementValue.apply(value, settings),
301351
star);
302352
return new DeprecationIssue(DeprecationIssue.Level.CRITICAL, message, url, details);
303353
}

x-pack/plugin/deprecation/src/test/java/org/elasticsearch/xpack/deprecation/NodeDeprecationChecksTests.java

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99

1010
import org.elasticsearch.action.admin.cluster.node.info.PluginsAndModules;
1111
import org.elasticsearch.bootstrap.JavaVersion;
12-
import org.elasticsearch.common.collect.Set;
12+
import org.elasticsearch.cluster.node.DiscoveryNode;
13+
import org.elasticsearch.cluster.node.DiscoveryNodeRole;
1314
import org.elasticsearch.common.settings.Setting;
1415
import org.elasticsearch.common.settings.Settings;
1516
import org.elasticsearch.common.util.concurrent.EsExecutors;
@@ -401,7 +402,7 @@ public void testNodeLocalStorageSetting() {
401402
}
402403

403404
public void testDeprecatedBasicLicenseSettings() {
404-
Collection<Setting<Boolean>> deprecatedXpackSettings = Set.of(
405+
Collection<Setting<Boolean>> deprecatedXpackSettings = org.elasticsearch.common.collect.Set.of(
405406
XPackSettings.ENRICH_ENABLED_SETTING,
406407
XPackSettings.FLATTENED_ENABLED,
407408
XPackSettings.INDEX_LIFECYCLE_ENABLED,
@@ -430,6 +431,32 @@ public void testDeprecatedBasicLicenseSettings() {
430431
}
431432
}
432433

434+
public void testLegacyRoleSettings() {
435+
final Collection<Setting<Boolean>> legacyRoleSettings = DiscoveryNode.getPossibleRoles()
436+
.stream()
437+
.filter(s -> s.legacySetting() != null)
438+
.map(DiscoveryNodeRole::legacySetting).collect(Collectors.toList());
439+
for (final Setting<Boolean> legacyRoleSetting : legacyRoleSettings) {
440+
final boolean value = randomBoolean();
441+
final Settings settings = Settings.builder().put(legacyRoleSetting.getKey(), value).build();
442+
final PluginsAndModules pluginsAndModules = new PluginsAndModules(Collections.emptyList(), Collections.emptyList());
443+
final List<DeprecationIssue> issues = getDeprecationIssues(settings, pluginsAndModules);
444+
final String roles = DiscoveryNode.getRolesFromSettings(settings)
445+
.stream()
446+
.map(DiscoveryNodeRole::roleName)
447+
.collect(Collectors.joining(","));
448+
final DeprecationIssue expected = new DeprecationIssue(
449+
DeprecationIssue.Level.CRITICAL,
450+
"setting [" + legacyRoleSetting.getKey() + "] is deprecated in favor of setting [node.roles]",
451+
"https://www.elastic.co/guide/en/elasticsearch/reference/master/breaking-changes-8.0.html#breaking_80_settings_changes",
452+
"the setting [" + legacyRoleSetting.getKey() + "] is currently set to ["
453+
+ value + "], instead set [node.roles] to [" + roles + "]"
454+
);
455+
assertThat(issues, hasItem(expected));
456+
assertSettingDeprecationsAndWarnings(new Setting<?>[]{legacyRoleSetting});
457+
}
458+
}
459+
433460
public void testRemovedSettingNotSet() {
434461
final Settings settings = Settings.EMPTY;
435462
final Setting<?> removedSetting = Setting.simpleString("node.removed_setting");

0 commit comments

Comments
 (0)