diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/RestrictedBuildApiService.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/RestrictedBuildApiService.java index c9833eab3ddb0..2ee424094fa31 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/RestrictedBuildApiService.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/RestrictedBuildApiService.java @@ -61,7 +61,6 @@ private static ListMultimap, String> createLegacyRestTestBasePluginUsag map.put(LegacyRestTestBasePlugin.class, ":qa:smoke-test-ingest-with-all-dependencies"); map.put(LegacyRestTestBasePlugin.class, ":qa:smoke-test-plugins"); map.put(LegacyRestTestBasePlugin.class, ":qa:system-indices"); - map.put(LegacyRestTestBasePlugin.class, ":qa:verify-version-constants"); map.put(LegacyRestTestBasePlugin.class, ":test:external-modules:test-apm-integration"); map.put(LegacyRestTestBasePlugin.class, ":test:external-modules:test-delayed-aggs"); map.put(LegacyRestTestBasePlugin.class, ":test:external-modules:test-die-with-dignity"); diff --git a/docs/build.gradle b/docs/build.gradle index 3b6f060b5c0aa..6ac29ef0b2469 100644 --- a/docs/build.gradle +++ b/docs/build.gradle @@ -1,4 +1,5 @@ import org.elasticsearch.gradle.Version +import org.elasticsearch.gradle.VersionProperties import org.elasticsearch.gradle.internal.doc.DocSnippetTask import static org.elasticsearch.gradle.testclusters.TestDistribution.DEFAULT @@ -2048,3 +2049,29 @@ setups['setup-snapshots'] = setups['setup-repository'] + ''' setups['atomic_red_regsvr32'].replace('#atomic_red_data#', events) } } + +tasks.register('verifyDocsLuceneVersion') { + doFirst { + File docsVersionsFile = file('Versions.asciidoc') + List versionLines = docsVersionsFile.readLines('UTF-8') + String docsLuceneVersion = null + for (String line : versionLines) { + if (line.startsWith(':lucene_version:')) { + docsLuceneVersion = line.split()[1] + } + } + if (docsLuceneVersion == null) { + throw new GradleException('Could not find lucene version in docs version file') + } + String expectedLuceneVersion = VersionProperties.lucene + // remove potential -snapshot-{gitrev} suffix + expectedLuceneVersion -= ~/-snapshot-[0-9a-f]+$/ + if (docsLuceneVersion != expectedLuceneVersion) { + throw new GradleException("Lucene version in docs [${docsLuceneVersion}] does not match version.properties [${expectedLuceneVersion}]") + } + } +} + +tasks.named('check') { + dependsOn 'verifyDocsLuceneVersion' +} diff --git a/qa/verify-version-constants/build.gradle b/qa/verify-version-constants/build.gradle index 3e56bcc79ac1b..e7d9ac3e1ecc5 100644 --- a/qa/verify-version-constants/build.gradle +++ b/qa/verify-version-constants/build.gradle @@ -7,58 +7,14 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import org.elasticsearch.gradle.VersionProperties -import org.elasticsearch.gradle.internal.info.BuildParams import org.elasticsearch.gradle.testclusters.StandaloneRestIntegTestTask -apply plugin: 'elasticsearch.internal-testclusters' -apply plugin: 'elasticsearch.standalone-rest-test' +apply plugin: 'elasticsearch.internal-java-rest-test' apply plugin: 'elasticsearch.bwc-test' -dependencies { - testImplementation project(':modules:rest-root') -} - buildParams.bwcVersions.withIndexCompatible { bwcVersion, baseName -> - def baseCluster = testClusters.register(baseName) { - version = bwcVersion.toString() - setting 'xpack.security.enabled', 'true' - user username: 'admin', password: 'admin-password', role: 'superuser' - } - - tasks.register("${baseName}#integTest", StandaloneRestIntegTestTask) { - useCluster baseCluster - nonInputProperties.systemProperty('tests.rest.cluster', baseCluster.map(c -> c.allHttpSocketURI.join(","))) - nonInputProperties.systemProperty('tests.clustername', "${->baseCluster.get().getName()}") - } - - tasks.register(bwcTaskName(bwcVersion)) { - dependsOn "${baseName}#integTest" + tasks.register(bwcTaskName(bwcVersion), StandaloneRestIntegTestTask) { + usesBwcDistribution(bwcVersion) + systemProperty 'tests.cluster_version', bwcVersion } } - -tasks.register("verifyDocsLuceneVersion") { - doFirst { - File docsVersionsFile = layout.settingsDirectory.file('docs/Versions.asciidoc').asFile - List versionLines = docsVersionsFile.readLines('UTF-8') - String docsLuceneVersion = null - for (String line : versionLines) { - if (line.startsWith(':lucene_version:')) { - docsLuceneVersion = line.split()[1] - } - } - if (docsLuceneVersion == null) { - throw new GradleException('Could not find lucene version in docs version file') - } - String expectedLuceneVersion = VersionProperties.lucene - // remove potential -snapshot-{gitrev} suffix - expectedLuceneVersion -= ~/-snapshot-[0-9a-f]+$/ - if (docsLuceneVersion != expectedLuceneVersion) { - throw new GradleException("Lucene version in docs [${docsLuceneVersion}] does not match version.properties [${expectedLuceneVersion}]") - } - } -} - -tasks.named("check").configure { - dependsOn "verifyDocsLuceneVersion" -} diff --git a/qa/verify-version-constants/src/javaRestTest/java/org/elasticsearch/qa/verify_version_constants/VerifyVersionConstantsIT.java b/qa/verify-version-constants/src/javaRestTest/java/org/elasticsearch/qa/verify_version_constants/VerifyVersionConstantsIT.java new file mode 100644 index 0000000000000..941d34673c2b2 --- /dev/null +++ b/qa/verify-version-constants/src/javaRestTest/java/org/elasticsearch/qa/verify_version_constants/VerifyVersionConstantsIT.java @@ -0,0 +1,97 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +package org.elasticsearch.qa.verify_version_constants; + +import org.elasticsearch.client.Request; +import org.elasticsearch.client.Response; +import org.elasticsearch.index.IndexVersion; +import org.elasticsearch.index.IndexVersions; +import org.elasticsearch.test.cluster.ElasticsearchCluster; +import org.elasticsearch.test.cluster.local.distribution.DistributionType; +import org.elasticsearch.test.rest.ESRestTestCase; +import org.elasticsearch.test.rest.ObjectPath; +import org.hamcrest.Matchers; +import org.junit.ClassRule; + +import java.io.IOException; +import java.text.ParseException; +import java.util.Map; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.Matchers.notNullValue; + +public class VerifyVersionConstantsIT extends ESRestTestCase { + + @ClassRule + public static ElasticsearchCluster cluster = ElasticsearchCluster.local() + .distribution(DistributionType.DEFAULT) + .version(System.getProperty("tests.cluster_version")) + .setting("xpack.security.enabled", "false") + .build(); + + public void testLuceneVersionConstant() throws IOException, ParseException { + Response response = client().performRequest(new Request("GET", "/")); + assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); + ObjectPath objectPath = ObjectPath.createFromResponse(response); + + String luceneVersionString = objectPath.evaluate("version.lucene_version").toString(); + org.apache.lucene.util.Version luceneVersion = org.apache.lucene.util.Version.parse(luceneVersionString); + + IndexVersion indexVersion = getIndexVersion(); + assertThat(indexVersion.luceneVersion(), equalTo(luceneVersion)); + } + + private IndexVersion getIndexVersion() throws IOException { + IndexVersion indexVersion = null; + + Request request = new Request("GET", "_nodes"); + request.addParameter("filter_path", "nodes.*.index_version,nodes.*.name"); + Response response = client().performRequest(request); + ObjectPath objectPath = ObjectPath.createFromResponse(response); + Map nodeMap = objectPath.evaluate("nodes"); + for (String id : nodeMap.keySet()) { + Number ix = objectPath.evaluate("nodes." + id + ".index_version"); + IndexVersion version; + if (ix != null) { + version = IndexVersion.fromId(ix.intValue()); + } else { + // it doesn't have index version (pre 8.11) - just infer it from the release version + version = parseLegacyVersion(System.getProperty("tests.cluster_version")).map(x -> IndexVersion.fromId(x.id())) + .orElse(IndexVersions.MINIMUM_COMPATIBLE); + } + + if (indexVersion == null) { + indexVersion = version; + } else { + String name = objectPath.evaluate("nodes." + id + ".name"); + assertThat("Node " + name + " has a different index version to other nodes", version, Matchers.equalTo(indexVersion)); + } + } + + assertThat("Index version could not be read", indexVersion, notNullValue()); + return indexVersion; + } + + @Override + public boolean preserveClusterUponCompletion() { + /* + * We don't perform any writes to the cluster so there won't be anything + * to clean up. Also, our cleanup code is really only compatible with + * *write* compatible versions but this runs with *index* compatible + * versions. + */ + return true; + } + + @Override + protected String getTestRestCluster() { + return cluster.getHttpAddresses(); + } +} diff --git a/qa/verify-version-constants/src/test/java/org/elasticsearch/qa/verify_version_constants/VerifyVersionConstantsIT.java b/qa/verify-version-constants/src/test/java/org/elasticsearch/qa/verify_version_constants/VerifyVersionConstantsIT.java deleted file mode 100644 index 9b2aebb2e4c8d..0000000000000 --- a/qa/verify-version-constants/src/test/java/org/elasticsearch/qa/verify_version_constants/VerifyVersionConstantsIT.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -package org.elasticsearch.qa.verify_version_constants; - -import org.apache.lucene.tests.util.LuceneTestCase; -import org.elasticsearch.Version; -import org.elasticsearch.client.Request; -import org.elasticsearch.client.Response; -import org.elasticsearch.common.settings.SecureString; -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.util.concurrent.ThreadContext; -import org.elasticsearch.index.IndexVersion; -import org.elasticsearch.test.rest.ESRestTestCase; -import org.elasticsearch.test.rest.ObjectPath; - -import java.io.IOException; -import java.text.ParseException; - -import static org.hamcrest.CoreMatchers.equalTo; -import static org.hamcrest.Matchers.lessThan; - -@LuceneTestCase.AwaitsFix(bugUrl = "https://github.com/elastic/elasticsearch/issues/97736") -public class VerifyVersionConstantsIT extends ESRestTestCase { - - public void testLuceneVersionConstant() throws IOException, ParseException { - Response response = client().performRequest(new Request("GET", "/")); - assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); - ObjectPath objectPath = ObjectPath.createFromResponse(response); - - String luceneVersionString = objectPath.evaluate("version.lucene_version").toString(); - org.apache.lucene.util.Version luceneVersion = org.apache.lucene.util.Version.parse(luceneVersionString); - - IndexVersion indexVersion; - Object indexVersionString = objectPath.evaluate("version.index_version"); - if (indexVersionString != null) { - indexVersion = IndexVersion.fromId(Integer.parseInt(indexVersionString.toString())); - } else { - String elasticsearchVersionString = objectPath.evaluate("version.number").toString(); - Version elasticsearchVersion = Version.fromString(elasticsearchVersionString.replace("-SNAPSHOT", "")); - assertThat(elasticsearchVersion, lessThan(Version.V_8_10_0)); - indexVersion = IndexVersion.fromId(elasticsearchVersion.id); - } - - assertThat(indexVersion.luceneVersion(), equalTo(luceneVersion)); - } - - @Override - public boolean preserveClusterUponCompletion() { - /* - * We don't perform any writes to the cluster so there won't be anything - * to clean up. Also, our cleanup code is really only compatible with - * *write* compatible versions but this runs with *index* compatible - * versions. - */ - return true; - } - - @Override - protected Settings restClientSettings() { - String token = basicAuthHeaderValue("admin", new SecureString("admin-password".toCharArray())); - return Settings.builder().put(ThreadContext.PREFIX + ".Authorization", token).build(); - } -} diff --git a/server/src/main/java/org/elasticsearch/index/IndexVersions.java b/server/src/main/java/org/elasticsearch/index/IndexVersions.java index 5ec3ab7b1f13a..455255dc15c0f 100644 --- a/server/src/main/java/org/elasticsearch/index/IndexVersions.java +++ b/server/src/main/java/org/elasticsearch/index/IndexVersions.java @@ -69,12 +69,14 @@ private static IndexVersion def(int id, Version luceneVersion) { public static final IndexVersion V_7_15_0 = def(7_15_00_99, Version.LUCENE_8_9_0); public static final IndexVersion V_7_16_0 = def(7_16_00_99, Version.LUCENE_8_10_1); public static final IndexVersion V_7_17_0 = def(7_17_00_99, Version.LUCENE_8_11_1); + public static final IndexVersion V_7_17_19 = def(7_17_19_99, Version.LUCENE_8_11_3); public static final IndexVersion V_8_0_0 = def(8_00_00_99, Version.LUCENE_9_0_0); public static final IndexVersion V_8_1_0 = def(8_01_00_99, Version.LUCENE_9_0_0); public static final IndexVersion V_8_2_0 = def(8_02_00_99, Version.LUCENE_9_1_0); public static final IndexVersion V_8_3_0 = def(8_03_00_99, Version.LUCENE_9_2_0); public static final IndexVersion V_8_4_0 = def(8_04_00_99, Version.LUCENE_9_3_0); public static final IndexVersion V_8_5_0 = def(8_05_00_99, Version.LUCENE_9_4_1); + public static final IndexVersion V_8_5_3 = def(8_05_03_99, Version.LUCENE_9_4_2); public static final IndexVersion V_8_6_0 = def(8_06_00_99, Version.LUCENE_9_4_2); public static final IndexVersion V_8_7_0 = def(8_07_00_99, Version.LUCENE_9_5_0); public static final IndexVersion V_8_8_0 = def(8_08_00_99, Version.LUCENE_9_6_0); diff --git a/test/test-clusters/src/main/java/org/elasticsearch/test/cluster/local/AbstractLocalSpecBuilder.java b/test/test-clusters/src/main/java/org/elasticsearch/test/cluster/local/AbstractLocalSpecBuilder.java index 9617cb633aa9b..78f3d9e66159b 100644 --- a/test/test-clusters/src/main/java/org/elasticsearch/test/cluster/local/AbstractLocalSpecBuilder.java +++ b/test/test-clusters/src/main/java/org/elasticsearch/test/cluster/local/AbstractLocalSpecBuilder.java @@ -276,6 +276,12 @@ public T version(Version version) { return cast(this); } + @Override + public T version(String version) { + this.version = Version.fromString(version); + return cast(this); + } + public Version getVersion() { return inherit(() -> parent.getVersion(), version); } diff --git a/test/test-clusters/src/main/java/org/elasticsearch/test/cluster/local/LocalSpecBuilder.java b/test/test-clusters/src/main/java/org/elasticsearch/test/cluster/local/LocalSpecBuilder.java index 20c92dc2b11d7..52846bcc2b6fd 100644 --- a/test/test-clusters/src/main/java/org/elasticsearch/test/cluster/local/LocalSpecBuilder.java +++ b/test/test-clusters/src/main/java/org/elasticsearch/test/cluster/local/LocalSpecBuilder.java @@ -130,6 +130,11 @@ interface LocalSpecBuilder> { */ T version(Version version); + /** + * Sets the version of Elasticsearch. Defaults to {@link Version#CURRENT}. + */ + T version(String version); + /** * Adds a system property to node JVM arguments. */