Skip to content

Commit be2f61a

Browse files
authored
Add checks for old cluster features in rolling upgrade tests (#104279)
Add the ability to test for the original/old cluster features during a rolling upgrade * Moving ALL_FEATURES to ESRestTestCase (and make it private - only usage)
1 parent de992c2 commit be2f61a

File tree

14 files changed

+139
-42
lines changed

14 files changed

+139
-42
lines changed

qa/ccs-common-rest/src/yamlRestTest/java/org/elasticsearch/test/rest/yaml/CcsCommonYamlTestSuiteIT.java

+9
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.elasticsearch.client.RestClientBuilder;
2424
import org.elasticsearch.common.CheckedSupplier;
2525
import org.elasticsearch.common.Strings;
26+
import org.elasticsearch.common.util.set.Sets;
2627
import org.elasticsearch.core.IOUtils;
2728
import org.elasticsearch.test.cluster.ElasticsearchCluster;
2829
import org.elasticsearch.test.cluster.FeatureFlag;
@@ -313,6 +314,14 @@ protected ClientYamlTestExecutionContext createRestTestExecutionContext(
313314
public boolean clusterHasFeature(String featureId) {
314315
return testFeatureService.clusterHasFeature(featureId) && searchTestFeatureService.clusterHasFeature(featureId);
315316
}
317+
318+
@Override
319+
public Set<String> getAllSupportedFeatures() {
320+
return Sets.intersection(
321+
testFeatureService.getAllSupportedFeatures(),
322+
searchTestFeatureService.getAllSupportedFeatures()
323+
);
324+
}
316325
};
317326
final Set<String> combinedOsSet = Stream.concat(osSet.stream(), Stream.of(searchOs)).collect(Collectors.toSet());
318327
final Set<String> combinedNodeVersions = Stream.concat(nodesVersions.stream(), searchNodeVersions.stream())

qa/ccs-common-rest/src/yamlRestTest/java/org/elasticsearch/test/rest/yaml/RcsCcsCommonYamlTestSuiteIT.java

+9
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.elasticsearch.common.settings.SecureString;
2525
import org.elasticsearch.common.settings.Settings;
2626
import org.elasticsearch.common.util.concurrent.ThreadContext;
27+
import org.elasticsearch.common.util.set.Sets;
2728
import org.elasticsearch.core.IOUtils;
2829
import org.elasticsearch.test.cluster.ElasticsearchCluster;
2930
import org.elasticsearch.test.cluster.FeatureFlag;
@@ -298,6 +299,14 @@ protected ClientYamlTestExecutionContext createRestTestExecutionContext(
298299
public boolean clusterHasFeature(String featureId) {
299300
return testFeatureService.clusterHasFeature(featureId) && searchTestFeatureService.clusterHasFeature(featureId);
300301
}
302+
303+
@Override
304+
public Set<String> getAllSupportedFeatures() {
305+
return Sets.intersection(
306+
testFeatureService.getAllSupportedFeatures(),
307+
searchTestFeatureService.getAllSupportedFeatures()
308+
);
309+
}
301310
};
302311
final Set<String> combinedOsSet = Stream.concat(osSet.stream(), Stream.of(searchOs)).collect(Collectors.toSet());
303312
final Set<String> combinedNodeVersions = Stream.concat(nodesVersions.stream(), searchNodeVersions.stream())

qa/rolling-upgrade/src/javaRestTest/java/org/elasticsearch/upgrades/ClusterFeatureMigrationIT.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import org.elasticsearch.client.Request;
1414
import org.elasticsearch.common.xcontent.support.XContentMapValues;
1515
import org.elasticsearch.features.FeatureService;
16-
import org.junit.BeforeClass;
16+
import org.junit.Before;
1717

1818
import java.io.IOException;
1919
import java.util.List;
@@ -26,11 +26,11 @@
2626

2727
public class ClusterFeatureMigrationIT extends ParameterizedRollingUpgradeTestCase {
2828

29-
@BeforeClass
30-
public static void checkMigrationVersion() {
31-
assumeTrue(
29+
@Before
30+
public void checkMigrationVersion() {
31+
assumeFalse(
3232
"This checks migrations from before cluster features were introduced",
33-
getOldClusterVersion().before(FeatureService.CLUSTER_FEATURES_ADDED_VERSION)
33+
oldClusterHasFeature(FeatureService.FEATURES_SUPPORTED)
3434
);
3535
}
3636

qa/rolling-upgrade/src/javaRestTest/java/org/elasticsearch/upgrades/DesiredNodesUpgradeIT.java

+4-6
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@
1616
import org.elasticsearch.client.ResponseException;
1717
import org.elasticsearch.cluster.metadata.DesiredNode;
1818
import org.elasticsearch.cluster.metadata.DesiredNodeWithStatus;
19-
import org.elasticsearch.cluster.metadata.MetadataFeatures;
2019
import org.elasticsearch.common.Strings;
2120
import org.elasticsearch.common.settings.Settings;
2221
import org.elasticsearch.common.unit.ByteSizeValue;
2322
import org.elasticsearch.common.xcontent.support.XContentMapValues;
23+
import org.elasticsearch.test.rest.RestTestLegacyFeatures;
2424
import org.elasticsearch.xcontent.json.JsonXContent;
2525

2626
import java.io.IOException;
@@ -48,13 +48,11 @@ private enum ProcessorsPrecision {
4848
}
4949

5050
public void testUpgradeDesiredNodes() throws Exception {
51-
assumeTrue("Desired nodes was introduced in 8.1", getOldClusterVersion().onOrAfter(Version.V_8_1_0));
51+
assumeTrue("Desired nodes was introduced in 8.1", oldClusterHasFeature(RestTestLegacyFeatures.DESIRED_NODE_API_SUPPORTED));
5252

53-
var featureVersions = new MetadataFeatures().getHistoricalFeatures();
54-
55-
if (getOldClusterVersion().onOrAfter(featureVersions.get(DesiredNode.DOUBLE_PROCESSORS_SUPPORTED))) {
53+
if (oldClusterHasFeature(DesiredNode.DOUBLE_PROCESSORS_SUPPORTED)) {
5654
assertUpgradedNodesCanReadDesiredNodes();
57-
} else if (getOldClusterVersion().onOrAfter(featureVersions.get(DesiredNode.RANGE_FLOAT_PROCESSORS_SUPPORTED))) {
55+
} else if (oldClusterHasFeature(DesiredNode.RANGE_FLOAT_PROCESSORS_SUPPORTED)) {
5856
assertDesiredNodesUpdatedWithRoundedUpFloatsAreIdempotent();
5957
} else {
6058
assertDesiredNodesWithFloatProcessorsAreRejectedInOlderVersions();

qa/rolling-upgrade/src/javaRestTest/java/org/elasticsearch/upgrades/IndexingIT.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.elasticsearch.common.xcontent.support.XContentMapValues;
2020
import org.elasticsearch.index.mapper.DateFieldMapper;
2121
import org.elasticsearch.test.ListMatcher;
22+
import org.elasticsearch.test.rest.RestTestLegacyFeatures;
2223
import org.elasticsearch.xcontent.XContentBuilder;
2324
import org.elasticsearch.xcontent.XContentType;
2425
import org.elasticsearch.xcontent.json.JsonXContent;
@@ -229,7 +230,7 @@ private void bulk(String index, String valueSuffix, int count) throws IOExceptio
229230
}
230231

231232
public void testTsdb() throws IOException {
232-
assumeTrue("indexing time series indices changed in 8.2.0", getOldClusterVersion().onOrAfter(Version.V_8_2_0));
233+
assumeTrue("indexing time series indices changed in 8.2.0", oldClusterHasFeature(RestTestLegacyFeatures.TSDB_NEW_INDEX_FORMAT));
233234

234235
StringBuilder bulk = new StringBuilder();
235236
if (isOldCluster()) {
@@ -337,7 +338,7 @@ private void assertTsdbAgg(Matcher<?>... expected) throws IOException {
337338
}
338339

339340
public void testSyntheticSource() throws IOException {
340-
assumeTrue("added in 8.4.0", getOldClusterVersion().onOrAfter(Version.V_8_4_0));
341+
assumeTrue("added in 8.4.0", oldClusterHasFeature(RestTestLegacyFeatures.SYNTHETIC_SOURCE_SUPPORTED));
341342

342343
if (isOldCluster()) {
343344
Request createIndex = new Request("PUT", "/synthetic");

qa/rolling-upgrade/src/javaRestTest/java/org/elasticsearch/upgrades/ParameterizedRollingUpgradeTestCase.java

+20
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import org.elasticsearch.client.Response;
1616
import org.elasticsearch.common.settings.Settings;
1717
import org.elasticsearch.core.SuppressForbidden;
18+
import org.elasticsearch.features.NodeFeature;
1819
import org.elasticsearch.index.IndexVersion;
1920
import org.elasticsearch.test.cluster.ElasticsearchCluster;
2021
import org.elasticsearch.test.cluster.FeatureFlag;
@@ -69,6 +70,7 @@ public static Iterable<Object[]> parameters() {
6970
}
7071

7172
private static final Set<Integer> upgradedNodes = new HashSet<>();
73+
private static final Set<String> oldClusterFeatures = new HashSet<>();
7274
private static boolean upgradeFailed = false;
7375
private static IndexVersion oldIndexVersion;
7476

@@ -78,6 +80,13 @@ protected ParameterizedRollingUpgradeTestCase(@Name("upgradedNodes") int upgrade
7880
this.requestedUpgradedNodes = upgradedNodes;
7981
}
8082

83+
@Before
84+
public void extractOldClusterFeatures() {
85+
if (isOldCluster() && oldClusterFeatures.isEmpty()) {
86+
oldClusterFeatures.addAll(testFeatureService.getAllSupportedFeatures());
87+
}
88+
}
89+
8190
@Before
8291
public void extractOldIndexVersion() throws Exception {
8392
if (oldIndexVersion == null && upgradedNodes.isEmpty()) {
@@ -138,13 +147,24 @@ public void upgradeNode() throws Exception {
138147
public static void resetNodes() {
139148
oldIndexVersion = null;
140149
upgradedNodes.clear();
150+
oldClusterFeatures.clear();
141151
upgradeFailed = false;
142152
}
143153

154+
@Deprecated // Use the new testing framework and oldClusterHasFeature(feature) instead
144155
protected static org.elasticsearch.Version getOldClusterVersion() {
145156
return org.elasticsearch.Version.fromString(OLD_CLUSTER_VERSION);
146157
}
147158

159+
protected static boolean oldClusterHasFeature(String featureId) {
160+
assert oldClusterFeatures.isEmpty() == false;
161+
return oldClusterFeatures.contains(featureId);
162+
}
163+
164+
protected static boolean oldClusterHasFeature(NodeFeature feature) {
165+
return oldClusterHasFeature(feature.id());
166+
}
167+
148168
protected static IndexVersion getOldClusterIndexVersion() {
149169
assert oldIndexVersion != null;
150170
return oldIndexVersion;

qa/rolling-upgrade/src/javaRestTest/java/org/elasticsearch/upgrades/SnapshotBasedRecoveryIT.java

+5-8
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import org.apache.http.client.methods.HttpGet;
1414
import org.apache.http.client.methods.HttpPost;
1515
import org.apache.http.util.EntityUtils;
16-
import org.elasticsearch.Version;
1716
import org.elasticsearch.client.Request;
1817
import org.elasticsearch.client.Response;
1918
import org.elasticsearch.cluster.metadata.IndexMetadata;
@@ -24,6 +23,7 @@
2423
import org.elasticsearch.index.query.QueryBuilders;
2524
import org.elasticsearch.repositories.blobstore.BlobStoreRepository;
2625
import org.elasticsearch.search.builder.SearchSourceBuilder;
26+
import org.elasticsearch.test.rest.RestTestLegacyFeatures;
2727
import org.elasticsearch.xcontent.XContentBuilder;
2828

2929
import java.io.IOException;
@@ -49,13 +49,10 @@ public SnapshotBasedRecoveryIT(@Name("upgradedNodes") int upgradedNodes) {
4949
}
5050

5151
public void testSnapshotBasedRecovery() throws Exception {
52-
53-
assumeFalse(
54-
"Cancel shard allocation command is broken for initial desired balance versions and might allocate shard "
55-
+ "on the node where it is not supposed to be. Fixed by https://github.com/elastic/elasticsearch/pull/93635",
56-
getOldClusterVersion() == Version.V_8_6_0
57-
|| getOldClusterVersion() == Version.V_8_6_1
58-
|| getOldClusterVersion() == Version.V_8_7_0
52+
assumeTrue(
53+
"Cancel shard allocation command is broken for initial versions of the desired_balance allocator",
54+
oldClusterHasFeature(RestTestLegacyFeatures.DESIRED_BALANCED_ALLOCATOR_SUPPORTED) == false
55+
|| oldClusterHasFeature(RestTestLegacyFeatures.DESIRED_BALANCED_ALLOCATOR_FIXED)
5956
);
6057

6158
final String indexName = "snapshot_based_recovery";

qa/rolling-upgrade/src/javaRestTest/java/org/elasticsearch/upgrades/TsdbIT.java

+5-7
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@
1010

1111
import com.carrotsearch.randomizedtesting.annotations.Name;
1212

13-
import org.elasticsearch.Version;
1413
import org.elasticsearch.client.Request;
1514
import org.elasticsearch.common.time.DateFormatter;
1615
import org.elasticsearch.common.time.FormatNames;
1716
import org.elasticsearch.test.rest.ObjectPath;
17+
import org.elasticsearch.test.rest.RestTestLegacyFeatures;
1818

1919
import java.io.IOException;
2020
import java.time.Instant;
@@ -130,10 +130,7 @@ public TsdbIT(@Name("upgradedNodes") int upgradedNodes) {
130130
""";
131131

132132
public void testTsdbDataStream() throws Exception {
133-
assumeTrue(
134-
"Skipping version [" + getOldClusterVersion() + "], because TSDB was GA-ed in 8.7.0",
135-
getOldClusterVersion().onOrAfter(Version.V_8_7_0)
136-
);
133+
assumeTrue("TSDB was GA-ed in 8.7.0", oldClusterHasFeature(RestTestLegacyFeatures.TSDB_GENERALLY_AVAILABLE));
137134
String dataStreamName = "k8s";
138135
if (isOldCluster()) {
139136
final String INDEX_TEMPLATE = """
@@ -159,8 +156,9 @@ public void testTsdbDataStream() throws Exception {
159156

160157
public void testTsdbDataStreamWithComponentTemplate() throws Exception {
161158
assumeTrue(
162-
"Skipping version [" + getOldClusterVersion() + "], because TSDB was GA-ed in 8.7.0 and bug was fixed in 8.11.0",
163-
getOldClusterVersion().onOrAfter(Version.V_8_7_0) && getOldClusterVersion().before(Version.V_8_11_0)
159+
"TSDB was GA-ed in 8.7.0 and bug was fixed in 8.11.0",
160+
oldClusterHasFeature(RestTestLegacyFeatures.TSDB_GENERALLY_AVAILABLE)
161+
&& (oldClusterHasFeature(RestTestLegacyFeatures.TSDB_EMPTY_TEMPLATE_FIXED) == false)
164162
);
165163
String dataStreamName = "template-with-component-template";
166164
if (isOldCluster()) {

qa/rolling-upgrade/src/javaRestTest/java/org/elasticsearch/upgrades/UpgradeWithOldIndexSettingsIT.java

+9-9
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@
1010

1111
import com.carrotsearch.randomizedtesting.annotations.Name;
1212

13-
import org.elasticsearch.Version;
1413
import org.elasticsearch.client.Request;
1514
import org.elasticsearch.client.Response;
1615
import org.elasticsearch.client.ResponseException;
1716
import org.elasticsearch.common.settings.Settings;
1817
import org.elasticsearch.common.xcontent.support.XContentMapValues;
1918
import org.elasticsearch.core.Strings;
19+
import org.elasticsearch.test.rest.RestTestLegacyFeatures;
2020

2121
import java.io.IOException;
2222
import java.util.Map;
@@ -42,23 +42,23 @@ public void testOldIndexSettings() throws Exception {
4242
Request createTestIndex = new Request("PUT", "/" + INDEX_NAME);
4343
createTestIndex.setJsonEntity("{\"settings\": {\"index.indexing.slowlog.level\": \"WARN\"}}");
4444
createTestIndex.setOptions(expectWarnings(EXPECTED_WARNING));
45-
if (getOldClusterVersion().before(Version.V_8_0_0)) {
46-
// create index with settings no longer valid in 8.0
47-
client().performRequest(createTestIndex);
48-
} else {
45+
if (oldClusterHasFeature(RestTestLegacyFeatures.INDEXING_SLOWLOG_LEVEL_SETTING_REMOVED)) {
4946
assertTrue(
5047
expectThrows(ResponseException.class, () -> client().performRequest(createTestIndex)).getMessage()
5148
.contains("unknown setting [index.indexing.slowlog.level]")
5249
);
5350

5451
Request createTestIndex1 = new Request("PUT", "/" + INDEX_NAME);
5552
client().performRequest(createTestIndex1);
53+
} else {
54+
// create index with settings no longer valid in 8.0
55+
client().performRequest(createTestIndex);
5656
}
5757

5858
// add some data
5959
Request bulk = new Request("POST", "/_bulk");
6060
bulk.addParameter("refresh", "true");
61-
if (getOldClusterVersion().before(Version.V_8_0_0)) {
61+
if (oldClusterHasFeature(RestTestLegacyFeatures.INDEXING_SLOWLOG_LEVEL_SETTING_REMOVED) == false) {
6262
bulk.setOptions(expectWarnings(EXPECTED_WARNING));
6363
}
6464
bulk.setJsonEntity(Strings.format("""
@@ -70,7 +70,7 @@ public void testOldIndexSettings() throws Exception {
7070
// add some more data
7171
Request bulk = new Request("POST", "/_bulk");
7272
bulk.addParameter("refresh", "true");
73-
if (getOldClusterVersion().before(Version.V_8_0_0)) {
73+
if (oldClusterHasFeature(RestTestLegacyFeatures.INDEXING_SLOWLOG_LEVEL_SETTING_REMOVED) == false) {
7474
bulk.setOptions(expectWarnings(EXPECTED_WARNING));
7575
}
7676
bulk.setJsonEntity(Strings.format("""
@@ -79,7 +79,7 @@ public void testOldIndexSettings() throws Exception {
7979
""", INDEX_NAME));
8080
client().performRequest(bulk);
8181
} else {
82-
if (getOldClusterVersion().before(Version.V_8_0_0)) {
82+
if (oldClusterHasFeature(RestTestLegacyFeatures.INDEXING_SLOWLOG_LEVEL_SETTING_REMOVED) == false) {
8383
Request createTestIndex = new Request("PUT", "/" + INDEX_NAME + "/_settings");
8484
// update index settings should work
8585
createTestIndex.setJsonEntity("{\"index.indexing.slowlog.level\": \"INFO\"}");
@@ -117,7 +117,7 @@ private void assertCount(String index, int countAtLeast) throws IOException {
117117
public static void updateIndexSettingsPermittingSlowlogDeprecationWarning(String index, Settings.Builder settings) throws IOException {
118118
Request request = new Request("PUT", "/" + index + "/_settings");
119119
request.setJsonEntity(org.elasticsearch.common.Strings.toString(settings.build()));
120-
if (getOldClusterVersion().before(Version.V_7_17_9)) {
120+
if (oldClusterHasFeature(RestTestLegacyFeatures.DEPRECATION_WARNINGS_LEAK_FIXED) == false) {
121121
// There is a bug (fixed in 7.17.9 and 8.7.0 where deprecation warnings could leak into ClusterApplierService#applyChanges)
122122
// Below warnings are set (and leaking) from an index in this test case
123123
request.setOptions(expectVersionSpecificWarnings(v -> {

test/framework/src/main/java/org/elasticsearch/test/rest/ESRestTestCase.java

+16-2
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,6 @@
131131
import static org.elasticsearch.client.RestClient.IGNORE_RESPONSE_CODES_PARAM;
132132
import static org.elasticsearch.cluster.ClusterState.VERSION_INTRODUCING_TRANSPORT_VERSIONS;
133133
import static org.elasticsearch.core.Strings.format;
134-
import static org.elasticsearch.test.rest.TestFeatureService.ALL_FEATURES;
135134
import static org.elasticsearch.xcontent.ToXContent.EMPTY_PARAMS;
136135
import static org.hamcrest.Matchers.anyOf;
137136
import static org.hamcrest.Matchers.containsString;
@@ -232,7 +231,22 @@ public enum ProductFeature {
232231

233232
private static EnumSet<ProductFeature> availableFeatures;
234233
private static Set<String> nodesVersions;
235-
private static TestFeatureService testFeatureService = ALL_FEATURES;
234+
235+
private static final TestFeatureService ALL_FEATURES = new TestFeatureService() {
236+
@Override
237+
public boolean clusterHasFeature(String featureId) {
238+
return true;
239+
}
240+
241+
@Override
242+
public Set<String> getAllSupportedFeatures() {
243+
throw new UnsupportedOperationException(
244+
"Only available to properly initialized TestFeatureService. See ESRestTestCase#createTestFeatureService"
245+
);
246+
}
247+
};
248+
249+
protected static TestFeatureService testFeatureService = ALL_FEATURES;
236250

237251
protected static Set<String> getCachedNodesVersions() {
238252
assert nodesVersions != null;

0 commit comments

Comments
 (0)