From e68b48a7ffd4fac3ec250cd6184e59d376a5855e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20B=C3=BCscher?= Date: Mon, 14 Mar 2022 19:31:03 +0100 Subject: [PATCH 1/3] Expand coverage of :qa:multi-cluster-search Currently this qa module runs integration tests that cover cross-cluster search with both the local and the remote cluster on the same version. In order to also cover cross-cluster communication across multiple versions, this change adds additional test tasks that also start a remote cluster in the precious minor version and run the same tests against this configuration. Relates #84481 --- .../gradle/internal/BwcVersions.java | 7 +++ qa/multi-cluster-search/build.gradle | 50 ++++++++++++++++++- 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/BwcVersions.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/BwcVersions.java index db5b1ec29ace9..324423e84f4da 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/BwcVersions.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/BwcVersions.java @@ -126,6 +126,13 @@ public UnreleasedVersionInfo unreleasedInfo(Version version) { return unreleased.get(version); } + /** + * Returns the current version + */ + public VersionPair currentVersion() { + return currentVersion; + } + public void forPreviousUnreleased(Consumer consumer) { filterSupportedVersions( getUnreleased().stream().filter(version -> version.equals(currentVersion.elasticsearch) == false).collect(Collectors.toList()) diff --git a/qa/multi-cluster-search/build.gradle b/qa/multi-cluster-search/build.gradle index 3f9ba25394649..e662467813f84 100644 --- a/qa/multi-cluster-search/build.gradle +++ b/qa/multi-cluster-search/build.gradle @@ -7,6 +7,7 @@ */ + import org.elasticsearch.gradle.Version import org.elasticsearch.gradle.internal.info.BuildParams import org.elasticsearch.gradle.internal.test.RestIntegTestTask @@ -15,18 +16,45 @@ apply plugin: 'elasticsearch.internal-testclusters' apply plugin: 'elasticsearch.standalone-rest-test' apply plugin: 'elasticsearch.rest-resources' - dependencies { testImplementation project(":client:rest-high-level") } +/* + This qa module runs yaml and java tests against a local cluster on the current version + with a connected remote cluster and mostly tests CCS behaviour. We run this in two version + configurations for the remote cluster, one time with the current version and one time + with the earliest previous minor, because that is the first version that we guarantee + CCS backward compatibility with. +*/ + +Version bwcVersion() { + Version current = BuildParams.bwcVersions.currentVersion().elasticsearch() + Version previousMinor = (BuildParams.bwcVersions.wireCompatible.reverse().find { + it.before(current) && (it.minor < current.minor || it.major < current.major) + }) + // we want to test against the first revision of this minor series + return new Version(previousMinor.major, previousMinor.minor, 0) +} + +String bwc = bwcVersion().toString() + testClusters.register('remote-cluster') +testClusters.register("remote-cluster-${bwc}") { + versions = [bwc] +} + tasks.register('remote-cluster', RestIntegTestTask) { mustRunAfter("precommit") systemProperty 'tests.rest.suite', 'remote_cluster' } +tasks.register("remote-cluster-${bwc}", RestIntegTestTask) { + mustRunAfter("precommit") + systemProperty 'tests.rest.suite', 'remote_cluster' +} + testClusters.configureEach { requiresFeature 'es.index_mode_feature_flag_registered', Version.fromString("8.0.0") } @@ -37,12 +65,24 @@ testClusters.matching{ it.name == 'remote-cluster' }.configureEach { setting 'xpack.security.enabled', 'false' } +testClusters.matching{ it.name == "remote-cluster-${bwc}" }.configureEach { + numberOfNodes = 2 + setting 'node.roles', '[data,ingest,master]' + setting 'xpack.security.enabled', 'false' +} + tasks.register("mixedClusterTest", RestIntegTestTask) { useCluster testClusters.named('remote-cluster') dependsOn 'remote-cluster' systemProperty 'tests.rest.suite', 'multi_cluster' } +tasks.register("mixedClusterTest-${bwc}", RestIntegTestTask) { + useCluster testClusters.named("remote-cluster-${bwc}") + dependsOn "remote-cluster-${bwc}" + systemProperty 'tests.rest.suite', 'multi_cluster' +} + testClusters.matching { it.name == "mixedClusterTest"}.configureEach { setting 'cluster.remote.my_remote_cluster.seeds', { "\"${testClusters.'remote-cluster'.getAllTransportPortURI().get(0)}\"" } @@ -50,8 +90,16 @@ testClusters.matching { it.name == "mixedClusterTest"}.configureEach { setting 'xpack.security.enabled', 'false' } +testClusters.matching { it.name == "mixedClusterTest-${bwc}"}.configureEach { + setting 'cluster.remote.my_remote_cluster.seeds', + { "\"${testClusters."remote-cluster-${bwc}".getAllTransportPortURI().get(0)}\"" } + setting 'cluster.remote.connections_per_cluster', '1' + setting 'xpack.security.enabled', 'false' +} + tasks.register("integTest") { dependsOn "mixedClusterTest" + dependsOn "mixedClusterTest-${bwc}" } tasks.named("check").configure { dependsOn("integTest") } From 68e2fc87eae0432de8ad56f76ff14835733f45a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20B=C3=BCscher?= Date: Tue, 29 Mar 2022 14:41:36 +0200 Subject: [PATCH 2/3] changing remote bwc to last previous minor --- qa/multi-cluster-search/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qa/multi-cluster-search/build.gradle b/qa/multi-cluster-search/build.gradle index e662467813f84..bcbb26cd8c8c8 100644 --- a/qa/multi-cluster-search/build.gradle +++ b/qa/multi-cluster-search/build.gradle @@ -33,8 +33,8 @@ Version bwcVersion() { Version previousMinor = (BuildParams.bwcVersions.wireCompatible.reverse().find { it.before(current) && (it.minor < current.minor || it.major < current.major) }) - // we want to test against the first revision of this minor series - return new Version(previousMinor.major, previousMinor.minor, 0) + // we stop oce we have the last version of the previous minor branch + return new Version(previousMinor.major, previousMinor.minor, previousMinor.revision) } String bwc = bwcVersion().toString() From b9e34ea23d3fe787ce8a8ec56bb385ef46225fa4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20B=C3=BCscher?= Date: Wed, 30 Mar 2022 18:30:05 +0200 Subject: [PATCH 3/3] test against all wire- and ccs-compatible version on remote --- .../gradle/internal/BwcVersions.java | 7 - qa/multi-cluster-search/build.gradle | 127 +++++++----------- 2 files changed, 51 insertions(+), 83 deletions(-) diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/BwcVersions.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/BwcVersions.java index 324423e84f4da..db5b1ec29ace9 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/BwcVersions.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/BwcVersions.java @@ -126,13 +126,6 @@ public UnreleasedVersionInfo unreleasedInfo(Version version) { return unreleased.get(version); } - /** - * Returns the current version - */ - public VersionPair currentVersion() { - return currentVersion; - } - public void forPreviousUnreleased(Consumer consumer) { filterSupportedVersions( getUnreleased().stream().filter(version -> version.equals(currentVersion.elasticsearch) == false).collect(Collectors.toList()) diff --git a/qa/multi-cluster-search/build.gradle b/qa/multi-cluster-search/build.gradle index bcbb26cd8c8c8..d851ac369f65c 100644 --- a/qa/multi-cluster-search/build.gradle +++ b/qa/multi-cluster-search/build.gradle @@ -6,6 +6,11 @@ * Side Public License, v 1. */ +/* + This qa module runs yaml and java against a local and a remote clusters connected via CCS. + The local cluster is always on the current version, the remote cluster is tested for all wire-compatible versions + that are also CCS compatible (i.e. all versions on the previous minor branch) +*/ import org.elasticsearch.gradle.Version @@ -14,92 +19,62 @@ import org.elasticsearch.gradle.internal.test.RestIntegTestTask apply plugin: 'elasticsearch.internal-testclusters' apply plugin: 'elasticsearch.standalone-rest-test' +apply plugin: 'elasticsearch.bwc-test' apply plugin: 'elasticsearch.rest-resources' dependencies { testImplementation project(":client:rest-high-level") } -/* - This qa module runs yaml and java tests against a local cluster on the current version - with a connected remote cluster and mostly tests CCS behaviour. We run this in two version - configurations for the remote cluster, one time with the current version and one time - with the earliest previous minor, because that is the first version that we guarantee - CCS backward compatibility with. -*/ - -Version bwcVersion() { - Version current = BuildParams.bwcVersions.currentVersion().elasticsearch() - Version previousMinor = (BuildParams.bwcVersions.wireCompatible.reverse().find { - it.before(current) && (it.minor < current.minor || it.major < current.major) - }) - // we stop oce we have the last version of the previous minor branch - return new Version(previousMinor.major, previousMinor.minor, previousMinor.revision) -} - -String bwc = bwcVersion().toString() - -testClusters.register('remote-cluster') - -testClusters.register("remote-cluster-${bwc}") { - versions = [bwc] -} - -tasks.register('remote-cluster', RestIntegTestTask) { - mustRunAfter("precommit") - systemProperty 'tests.rest.suite', 'remote_cluster' +def ccsSupportedVersion = bwcVersion -> { + def currentVersion = Version.fromString(project.version) + // in case the current version is the first in a new major series, all wire compatible versions (i.e. last minor of previous major) + // are CCS compatible + return currentVersion.minor == 0 || (currentVersion.major == bwcVersion.major && currentVersion.minor - bwcVersion.minor <= 1) } -tasks.register("remote-cluster-${bwc}", RestIntegTestTask) { - mustRunAfter("precommit") - systemProperty 'tests.rest.suite', 'remote_cluster' +BuildParams.bwcVersions.withWireCompatible(ccsSupportedVersion) { bwcVersion, baseName -> + + def remoteCluster = testClusters.register("${baseName}-remote") { + numberOfNodes = 2 + versions = [bwcVersion.toString()] + setting 'node.roles', '[data,ingest,master]' + } + + def localCluster = testClusters.register("${baseName}-local") { + versions = [project.version] + setting 'node.roles', '[data,ingest,master,remote_cluster_client]' + setting 'cluster.remote.connections_per_cluster', '1' + setting 'cluster.remote.my_remote_cluster.seeds', + { "\"${remoteCluster.get().getAllTransportPortURI().get(0)}\"" } + } + + tasks.register("${baseName}#remote-cluster", RestIntegTestTask) { + useCluster remoteCluster + doFirst { + nonInputProperties.systemProperty('tests.rest.suite', 'remote_cluster') + nonInputProperties.systemProperty('tests.rest.cluster', remoteCluster.map(c -> c.allHttpSocketURI.join(","))) + } + dependsOn "processTestResources" + } + + tasks.register("${baseName}#multi-cluster", RestIntegTestTask) { + useCluster localCluster + useCluster remoteCluster + doFirst { + nonInputProperties.systemProperty('tests.rest.suite', 'multi_cluster') + nonInputProperties.systemProperty('tests.rest.cluster', localCluster.map(c -> c.allHttpSocketURI.join(","))) + } + dependsOn "${baseName}#remote-cluster" + } + + tasks.register(bwcTaskName(bwcVersion)) { + dependsOn "${baseName}#multi-cluster" + mustRunAfter("precommit") + } } testClusters.configureEach { - requiresFeature 'es.index_mode_feature_flag_registered', Version.fromString("8.0.0") -} - -testClusters.matching{ it.name == 'remote-cluster' }.configureEach { - numberOfNodes = 2 - setting 'node.roles', '[data,ingest,master]' setting 'xpack.security.enabled', 'false' + requiresFeature 'es.index_mode_feature_flag_registered', Version.fromString("8.0.0") } - -testClusters.matching{ it.name == "remote-cluster-${bwc}" }.configureEach { - numberOfNodes = 2 - setting 'node.roles', '[data,ingest,master]' - setting 'xpack.security.enabled', 'false' -} - -tasks.register("mixedClusterTest", RestIntegTestTask) { - useCluster testClusters.named('remote-cluster') - dependsOn 'remote-cluster' - systemProperty 'tests.rest.suite', 'multi_cluster' -} - -tasks.register("mixedClusterTest-${bwc}", RestIntegTestTask) { - useCluster testClusters.named("remote-cluster-${bwc}") - dependsOn "remote-cluster-${bwc}" - systemProperty 'tests.rest.suite', 'multi_cluster' -} - -testClusters.matching { it.name == "mixedClusterTest"}.configureEach { - setting 'cluster.remote.my_remote_cluster.seeds', - { "\"${testClusters.'remote-cluster'.getAllTransportPortURI().get(0)}\"" } - setting 'cluster.remote.connections_per_cluster', '1' - setting 'xpack.security.enabled', 'false' -} - -testClusters.matching { it.name == "mixedClusterTest-${bwc}"}.configureEach { - setting 'cluster.remote.my_remote_cluster.seeds', - { "\"${testClusters."remote-cluster-${bwc}".getAllTransportPortURI().get(0)}\"" } - setting 'cluster.remote.connections_per_cluster', '1' - setting 'xpack.security.enabled', 'false' -} - -tasks.register("integTest") { - dependsOn "mixedClusterTest" - dependsOn "mixedClusterTest-${bwc}" -} - -tasks.named("check").configure { dependsOn("integTest") }