Skip to content

Commit 979e17a

Browse files
Prevent upgrades to 8.0 from 7.non-last (#82321)
* Prevent upgrades to 8.0 from 7.non-last This PR introduces a check to prevent upgrading to 8.0 without first upgrading to 7.last. Closes #81865 Co-authored-by: David Turner <[email protected]>
1 parent dc27d1d commit 979e17a

File tree

5 files changed

+62
-17
lines changed

5 files changed

+62
-17
lines changed

docs/changelog/82321.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
pr: 82321
2+
summary: Prevent upgrades to 8.0 from 7.non-last
3+
area: Infra/Core
4+
type: enhancement
5+
issues:
6+
- 81865

server/src/internalClusterTest/java/org/elasticsearch/env/NodeEnvironmentIT.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,16 @@ public void testFailsToStartIfUpgradedTooFar() {
136136
);
137137
assertThat(
138138
illegalStateException.getMessage(),
139-
allOf(startsWith("cannot upgrade a node from version ["), endsWith("] directly to version [" + Version.CURRENT + "]"))
139+
allOf(
140+
startsWith("cannot upgrade a node from version ["),
141+
endsWith(
142+
"] directly to version ["
143+
+ Version.CURRENT
144+
+ "], upgrade to version ["
145+
+ Version.CURRENT.minimumCompatibilityVersion()
146+
+ "] first."
147+
)
148+
)
140149
);
141150
}
142151

server/src/main/java/org/elasticsearch/env/NodeMetadata.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -92,14 +92,19 @@ public Version previousNodeVersion() {
9292
}
9393

9494
public NodeMetadata upgradeToCurrentVersion() {
95-
if (nodeVersion.equals(Version.V_EMPTY)) {
96-
assert Version.CURRENT.major <= Version.V_7_0_0.major + 1 : "version is required in the node metadata from v9 onwards";
97-
return new NodeMetadata(nodeId, Version.CURRENT, Version.V_EMPTY);
98-
}
95+
assert (nodeVersion.equals(Version.V_EMPTY) == false) || (Version.CURRENT.major <= Version.V_7_0_0.major + 1)
96+
: "version is required in the node metadata from v9 onwards";
9997

100-
if (nodeVersion.before(Version.CURRENT.minimumIndexCompatibilityVersion())) {
98+
if (nodeVersion.before(Version.CURRENT.minimumCompatibilityVersion())) {
10199
throw new IllegalStateException(
102-
"cannot upgrade a node from version [" + nodeVersion + "] directly to version [" + Version.CURRENT + "]"
100+
"cannot upgrade a node from version ["
101+
+ nodeVersion
102+
+ "] directly to version ["
103+
+ Version.CURRENT
104+
+ "], "
105+
+ "upgrade to version ["
106+
+ Version.CURRENT.minimumCompatibilityVersion()
107+
+ "] first."
103108
);
104109
}
105110

server/src/test/java/org/elasticsearch/env/NodeMetadataTests.java

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public void testUpgradesLegitimateVersions() {
7373
final NodeMetadata nodeMetadata = new NodeMetadata(
7474
nodeId,
7575
randomValueOtherThanMany(
76-
v -> v.after(Version.CURRENT) || v.before(Version.CURRENT.minimumIndexCompatibilityVersion()),
76+
v -> v.after(Version.CURRENT) || v.before(Version.CURRENT.minimumCompatibilityVersion()),
7777
this::randomVersion
7878
)
7979
).upgradeToCurrentVersion();
@@ -83,9 +83,15 @@ public void testUpgradesLegitimateVersions() {
8383

8484
public void testUpgradesMissingVersion() {
8585
final String nodeId = randomAlphaOfLength(10);
86-
final NodeMetadata nodeMetadata = new NodeMetadata(nodeId, Version.V_EMPTY).upgradeToCurrentVersion();
87-
assertThat(nodeMetadata.nodeVersion(), equalTo(Version.CURRENT));
88-
assertThat(nodeMetadata.nodeId(), equalTo(nodeId));
86+
87+
final IllegalStateException illegalStateException = expectThrows(
88+
IllegalStateException.class,
89+
() -> new NodeMetadata(nodeId, Version.V_EMPTY).upgradeToCurrentVersion()
90+
);
91+
assertThat(
92+
illegalStateException.getMessage(),
93+
startsWith("cannot upgrade a node from version [" + Version.V_EMPTY + "] directly to version [" + Version.CURRENT + "]")
94+
);
8995
}
9096

9197
public void testDoesNotUpgradeFutureVersion() {
@@ -106,13 +112,23 @@ public void testDoesNotUpgradeAncientVersion() {
106112
);
107113
assertThat(
108114
illegalStateException.getMessage(),
109-
allOf(startsWith("cannot upgrade a node from version ["), endsWith("] directly to version [" + Version.CURRENT + "]"))
115+
allOf(
116+
startsWith("cannot upgrade a node from version ["),
117+
endsWith(
118+
"] directly to version ["
119+
+ Version.CURRENT
120+
+ "], upgrade to version ["
121+
+ Version.CURRENT.minimumCompatibilityVersion()
122+
+ "] first."
123+
)
124+
)
110125
);
111126
}
112127

113128
public void testUpgradeMarksPreviousVersion() {
114129
final String nodeId = randomAlphaOfLength(10);
115-
final Version version = VersionUtils.randomVersionBetween(random(), Version.V_7_3_0, Version.V_7_16_0);
130+
final Version version = VersionUtils.randomVersionBetween(random(), Version.CURRENT.minimumCompatibilityVersion(), Version.V_8_0_0);
131+
116132
final NodeMetadata nodeMetadata = new NodeMetadata(nodeId, version).upgradeToCurrentVersion();
117133
assertThat(nodeMetadata.nodeVersion(), equalTo(Version.CURRENT));
118134
assertThat(nodeMetadata.previousNodeVersion(), equalTo(version));
@@ -123,6 +139,6 @@ public static Version tooNewVersion() {
123139
}
124140

125141
public static Version tooOldVersion() {
126-
return Version.fromId(between(1, Version.CURRENT.minimumIndexCompatibilityVersion().id - 1));
142+
return Version.fromId(between(1, Version.CURRENT.minimumCompatibilityVersion().id - 1));
127143
}
128144
}

x-pack/plugin/security/src/test/java/org/elasticsearch/xpack/security/SecurityImplicitBehaviorBootstrapCheckTests.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@
2626
public class SecurityImplicitBehaviorBootstrapCheckTests extends AbstractBootstrapCheckTestCase {
2727

2828
public void testFailureUpgradeFrom7xWithImplicitSecuritySettings() throws Exception {
29-
final Version previousVersion = VersionUtils.randomVersionBetween(random(), Version.V_7_2_0, Version.V_7_16_0);
29+
final Version previousVersion = randomValueOtherThan(
30+
Version.V_8_0_0,
31+
() -> VersionUtils.randomVersionBetween(random(), Version.CURRENT.minimumCompatibilityVersion(), Version.V_8_0_0)
32+
);
3033
NodeMetadata nodeMetadata = new NodeMetadata(randomAlphaOfLength(10), previousVersion);
3134
nodeMetadata = nodeMetadata.upgradeToCurrentVersion();
3235
BootstrapCheck.BootstrapCheckResult result = new SecurityImplicitBehaviorBootstrapCheck(nodeMetadata).check(
@@ -52,7 +55,10 @@ public void testFailureUpgradeFrom7xWithImplicitSecuritySettings() throws Except
5255
}
5356

5457
public void testUpgradeFrom7xWithImplicitSecuritySettingsOnGoldPlus() throws Exception {
55-
final Version previousVersion = VersionUtils.randomVersionBetween(random(), Version.V_7_2_0, Version.V_7_16_0);
58+
final Version previousVersion = randomValueOtherThan(
59+
Version.V_8_0_0,
60+
() -> VersionUtils.randomVersionBetween(random(), Version.CURRENT.minimumCompatibilityVersion(), Version.V_8_0_0)
61+
);
5662
NodeMetadata nodeMetadata = new NodeMetadata(randomAlphaOfLength(10), previousVersion);
5763
nodeMetadata = nodeMetadata.upgradeToCurrentVersion();
5864
BootstrapCheck.BootstrapCheckResult result = new SecurityImplicitBehaviorBootstrapCheck(nodeMetadata).check(
@@ -62,7 +68,10 @@ public void testUpgradeFrom7xWithImplicitSecuritySettingsOnGoldPlus() throws Exc
6268
}
6369

6470
public void testUpgradeFrom7xWithExplicitSecuritySettings() throws Exception {
65-
final Version previousVersion = VersionUtils.randomVersionBetween(random(), Version.V_7_2_0, Version.V_7_16_0);
71+
final Version previousVersion = randomValueOtherThan(
72+
Version.V_8_0_0,
73+
() -> VersionUtils.randomVersionBetween(random(), Version.CURRENT.minimumCompatibilityVersion(), Version.V_8_0_0)
74+
);
6675
NodeMetadata nodeMetadata = new NodeMetadata(randomAlphaOfLength(10), previousVersion);
6776
nodeMetadata = nodeMetadata.upgradeToCurrentVersion();
6877
BootstrapCheck.BootstrapCheckResult result = new SecurityImplicitBehaviorBootstrapCheck(nodeMetadata).check(

0 commit comments

Comments
 (0)