Browse Source

Passing down cluster features to YAML test framework (#102921)

- Cluster features passed down as a predicate via context
- Removing the not-needed (unused) master node version
Lorenzo Dematté 1 year ago
parent
commit
efeec01f3b

+ 3 - 2
docs/src/yamlRestTest/java/org/elasticsearch/smoketest/DocsClientYamlTestSuiteIT.java

@@ -48,6 +48,7 @@ import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Predicate;
 
 import static java.util.Collections.emptyList;
 import static java.util.Collections.emptyMap;
@@ -99,7 +100,7 @@ public class DocsClientYamlTestSuiteIT extends ESClientYamlSuiteTestCase {
         final RestClient restClient,
         final List<HttpHost> hosts,
         final Version esVersion,
-        final Version masterVersion,
+        final Predicate<String> clusterFeaturesPredicate,
         final String os
     ) {
         return new ClientYamlDocsTestClient(
@@ -107,7 +108,7 @@ public class DocsClientYamlTestSuiteIT extends ESClientYamlSuiteTestCase {
             restClient,
             hosts,
             esVersion,
-            masterVersion,
+            clusterFeaturesPredicate,
             os,
             this::getClientBuilderWithSniffedHosts
         );

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

@@ -29,6 +29,7 @@ import org.elasticsearch.core.Tuple;
 import org.elasticsearch.test.cluster.ElasticsearchCluster;
 import org.elasticsearch.test.cluster.FeatureFlag;
 import org.elasticsearch.test.cluster.local.LocalClusterConfigProvider;
+import org.elasticsearch.test.rest.ESRestTestCase;
 import org.elasticsearch.test.rest.ObjectPath;
 import org.elasticsearch.test.rest.yaml.restspec.ClientYamlSuiteRestApi;
 import org.elasticsearch.test.rest.yaml.restspec.ClientYamlSuiteRestSpec;
@@ -50,6 +51,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.function.BiPredicate;
+import java.util.function.Predicate;
 
 import static java.util.Collections.unmodifiableList;
 
@@ -159,7 +161,6 @@ public class CcsCommonYamlTestSuiteIT extends ESClientYamlSuiteTestCase {
 
             Tuple<Version, Version> versionVersionTuple = readVersionsFromCatNodes(adminSearchClient);
             final Version esVersion = versionVersionTuple.v1();
-            final Version masterVersion = versionVersionTuple.v2();
             final String os = readOsFromNodesInfo(adminSearchClient);
 
             searchYamlTestClient = new TestCandidateAwareClient(
@@ -167,7 +168,7 @@ public class CcsCommonYamlTestSuiteIT extends ESClientYamlSuiteTestCase {
                 searchClient,
                 hosts,
                 esVersion,
-                masterVersion,
+                ESRestTestCase::clusterHasFeature,
                 os,
                 this::getClientBuilderWithSniffedHosts
             );
@@ -328,11 +329,11 @@ public class CcsCommonYamlTestSuiteIT extends ESClientYamlSuiteTestCase {
             RestClient restClient,
             List<HttpHost> hosts,
             Version esVersion,
-            Version masterVersion,
+            Predicate<String> clusterFeaturesPredicate,
             String os,
             CheckedSupplier<RestClientBuilder, IOException> clientBuilderWithSniffedNodes
         ) {
-            super(restSpec, restClient, hosts, esVersion, masterVersion, os, clientBuilderWithSniffedNodes);
+            super(restSpec, restClient, hosts, esVersion, clusterFeaturesPredicate, os, clientBuilderWithSniffedNodes);
         }
 
         public void setTestCandidate(ClientYamlTestCandidate testCandidate) {

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

@@ -31,6 +31,7 @@ import org.elasticsearch.test.cluster.ElasticsearchCluster;
 import org.elasticsearch.test.cluster.FeatureFlag;
 import org.elasticsearch.test.cluster.local.LocalClusterConfigProvider;
 import org.elasticsearch.test.cluster.util.resource.Resource;
+import org.elasticsearch.test.rest.ESRestTestCase;
 import org.elasticsearch.test.rest.ObjectPath;
 import org.elasticsearch.test.rest.yaml.CcsCommonYamlTestSuiteIT.TestCandidateAwareClient;
 import org.junit.AfterClass;
@@ -222,7 +223,6 @@ public class RcsCcsCommonYamlTestSuiteIT extends ESClientYamlSuiteTestCase {
 
             Tuple<Version, Version> versionVersionTuple = readVersionsFromCatNodes(adminSearchClient);
             final Version esVersion = versionVersionTuple.v1();
-            final Version masterVersion = versionVersionTuple.v2();
             final String os = readOsFromNodesInfo(adminSearchClient);
 
             searchYamlTestClient = new TestCandidateAwareClient(
@@ -230,7 +230,7 @@ public class RcsCcsCommonYamlTestSuiteIT extends ESClientYamlSuiteTestCase {
                 searchClient,
                 hosts,
                 esVersion,
-                masterVersion,
+                ESRestTestCase::clusterHasFeature,
                 os,
                 this::getClientBuilderWithSniffedHosts
             );

+ 5 - 1
test/framework/src/main/java/org/elasticsearch/test/rest/RestTestLegacyFeatures.java

@@ -58,6 +58,9 @@ public class RestTestLegacyFeatures implements FeatureSpecification {
     @UpdateForV9
     public static final NodeFeature ML_ANALYTICS_MAPPINGS = new NodeFeature("ml.analytics_mappings");
 
+    // YAML
+    public static final NodeFeature REST_ELASTIC_PRODUCT_HEADER_PRESENT = new NodeFeature("action.rest.product_header_present");
+
     @Override
     public Map<NodeFeature, Version> getHistoricalFeatures() {
         return Map.ofEntries(
@@ -75,7 +78,8 @@ public class RestTestLegacyFeatures implements FeatureSpecification {
             entry(SEARCH_AGGREGATIONS_FORCE_INTERVAL_SELECTION_DATE_HISTOGRAM, Version.V_7_2_0),
             entry(TRANSFORM_NEW_API_ENDPOINT, Version.V_7_5_0),
             entry(ML_INDICES_HIDDEN, Version.V_7_7_0),
-            entry(ML_ANALYTICS_MAPPINGS, Version.V_7_3_0)
+            entry(ML_ANALYTICS_MAPPINGS, Version.V_7_3_0),
+            entry(REST_ELASTIC_PRODUCT_HEADER_PRESENT, Version.V_8_0_1)
         );
     }
 }

+ 3 - 2
test/yaml-rest-runner/src/main/java/org/elasticsearch/test/rest/yaml/ClientYamlDocsTestClient.java

@@ -27,6 +27,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.function.BiPredicate;
+import java.util.function.Predicate;
 
 /**
  * Used to execute REST requests according to the docs snippets that need to be tests. Wraps a
@@ -40,11 +41,11 @@ public final class ClientYamlDocsTestClient extends ClientYamlTestClient {
         final RestClient restClient,
         final List<HttpHost> hosts,
         final Version esVersion,
-        final Version masterVersion,
+        final Predicate<String> clusterFeaturesPredicate,
         final String os,
         final CheckedSupplier<RestClientBuilder, IOException> clientBuilderWithSniffedNodes
     ) {
-        super(restSpec, restClient, hosts, esVersion, masterVersion, os, clientBuilderWithSniffedNodes);
+        super(restSpec, restClient, hosts, esVersion, clusterFeaturesPredicate, os, clientBuilderWithSniffedNodes);
     }
 
     @Override

+ 6 - 5
test/yaml-rest-runner/src/main/java/org/elasticsearch/test/rest/yaml/ClientYamlTestClient.java

@@ -47,6 +47,7 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
 import java.util.function.BiPredicate;
+import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
 import static com.carrotsearch.randomizedtesting.RandomizedTest.frequently;
@@ -64,24 +65,24 @@ public class ClientYamlTestClient implements Closeable {
     private final ClientYamlSuiteRestSpec restSpec;
     private final Map<NodeSelector, RestClient> restClients = new HashMap<>();
     private final Version esVersion;
-    private final Version masterVersion;
     private final String os;
     private final CheckedSupplier<RestClientBuilder, IOException> clientBuilderWithSniffedNodes;
+    private final Predicate<String> clusterFeaturesPredicate;
 
     ClientYamlTestClient(
         final ClientYamlSuiteRestSpec restSpec,
         final RestClient restClient,
         final List<HttpHost> hosts,
         final Version esVersion,
-        final Version masterVersion,
+        final Predicate<String> clusterFeaturesPredicate,
         final String os,
         final CheckedSupplier<RestClientBuilder, IOException> clientBuilderWithSniffedNodes
     ) {
+        this.clusterFeaturesPredicate = clusterFeaturesPredicate;
         assert hosts.size() > 0;
         this.restSpec = restSpec;
         this.restClients.put(NodeSelector.ANY, restClient);
         this.esVersion = esVersion;
-        this.masterVersion = masterVersion;
         this.os = os;
         this.clientBuilderWithSniffedNodes = clientBuilderWithSniffedNodes;
     }
@@ -93,8 +94,8 @@ public class ClientYamlTestClient implements Closeable {
         return esVersion;
     }
 
-    public Version getMasterVersion() {
-        return masterVersion;
+    public boolean clusterHasFeature(String featureId) {
+        return clusterFeaturesPredicate.test(featureId);
     }
 
     public String getOs() {

+ 4 - 4
test/yaml-rest-runner/src/main/java/org/elasticsearch/test/rest/yaml/ClientYamlTestExecutionContext.java

@@ -230,10 +230,6 @@ public class ClientYamlTestExecutionContext {
         return clientYamlTestClient.getEsVersion();
     }
 
-    public Version masterVersion() {
-        return clientYamlTestClient.getMasterVersion();
-    }
-
     public String os() {
         return clientYamlTestClient.getOs();
     }
@@ -241,4 +237,8 @@ public class ClientYamlTestExecutionContext {
     public ClientYamlTestCandidate getClientYamlTestCandidate() {
         return clientYamlTestCandidate;
     }
+
+    public boolean clusterHasFeature(String featureId) {
+        return clientYamlTestClient.clusterHasFeature(featureId);
+    }
 }

+ 12 - 3
test/yaml-rest-runner/src/main/java/org/elasticsearch/test/rest/yaml/ESClientYamlSuiteTestCase.java

@@ -61,6 +61,7 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.SortedSet;
 import java.util.TreeSet;
+import java.util.function.Predicate;
 
 import static org.elasticsearch.xcontent.XContentFactory.jsonBuilder;
 
@@ -150,7 +151,7 @@ public abstract class ESClientYamlSuiteTestCase extends ESRestTestCase {
                 hosts,
                 os
             );
-            clientYamlTestClient = initClientYamlTestClient(restSpec, client(), hosts, esVersion, masterVersion, os);
+            clientYamlTestClient = initClientYamlTestClient(restSpec, client(), hosts, esVersion, ESRestTestCase::clusterHasFeature, os);
             restTestExecutionContext = createRestTestExecutionContext(testCandidate, clientYamlTestClient);
             adminExecutionContext = new ClientYamlTestExecutionContext(testCandidate, clientYamlTestClient, false);
             final String[] blacklist = resolvePathsProperty(REST_TESTS_BLACKLIST, null);
@@ -188,10 +189,18 @@ public abstract class ESClientYamlSuiteTestCase extends ESRestTestCase {
         final RestClient restClient,
         final List<HttpHost> hosts,
         final Version esVersion,
-        final Version masterVersion,
+        final Predicate<String> clusterFeaturesPredicate,
         final String os
     ) {
-        return new ClientYamlTestClient(restSpec, restClient, hosts, esVersion, masterVersion, os, this::getClientBuilderWithSniffedHosts);
+        return new ClientYamlTestClient(
+            restSpec,
+            restClient,
+            hosts,
+            esVersion,
+            clusterFeaturesPredicate,
+            os,
+            this::getClientBuilderWithSniffedHosts
+        );
     }
 
     @AfterClass

+ 11 - 4
test/yaml-rest-runner/src/main/java/org/elasticsearch/test/rest/yaml/section/DoSection.java

@@ -19,7 +19,9 @@ import org.elasticsearch.common.ParsingException;
 import org.elasticsearch.common.Strings;
 import org.elasticsearch.common.logging.HeaderWarning;
 import org.elasticsearch.core.Tuple;
+import org.elasticsearch.core.UpdateForV9;
 import org.elasticsearch.rest.action.admin.indices.RestPutIndexTemplateAction;
+import org.elasticsearch.test.rest.RestTestLegacyFeatures;
 import org.elasticsearch.test.rest.yaml.ClientYamlTestExecutionContext;
 import org.elasticsearch.test.rest.yaml.ClientYamlTestResponse;
 import org.elasticsearch.test.rest.yaml.ClientYamlTestResponseException;
@@ -364,10 +366,15 @@ public class DoSection implements ExecutableSection {
                 ? executionContext.getClientYamlTestCandidate().getTestPath()
                 : null;
 
-            if (executionContext.esVersion().onOrAfter(Version.V_8_0_1)
-                || (executionContext.esVersion().major == Version.V_7_17_0.major
-                    && executionContext.esVersion().onOrAfter(Version.V_7_17_2))) {
-                // #84038 and #84089 mean that this assertion fails when running against some 8.0.x and 7.17.x released versions
+            // #84038 and #84089 mean that this assertion fails when running against < 7.17.2 and 8.0.0 released versions
+            // This is really difficult to express just with features, so I will break it down into 2 parts: version check for v7,
+            // and feature check for v8. This way the version check can be removed once we move to v9
+            @UpdateForV9
+            var fixedInV7 = executionContext.esVersion().major == Version.V_7_17_0.major
+                && executionContext.esVersion().onOrAfter(Version.V_7_17_2);
+            var fixedProductionHeader = fixedInV7
+                || executionContext.clusterHasFeature(RestTestLegacyFeatures.REST_ELASTIC_PRODUCT_HEADER_PRESENT.id());
+            if (fixedProductionHeader) {
                 checkElasticProductHeader(response.getHeaders("X-elastic-product"));
             }
             checkWarningHeaders(response.getWarningHeaders(), testPath);