From 8258ac5ded83398be701721c7199b3d2ea714c70 Mon Sep 17 00:00:00 2001 From: Monu Singh Date: Tue, 2 Jan 2024 13:52:24 +0530 Subject: [PATCH 01/20] Use latest version of ipaddress Library (#1302) Use latest version of ipaddress Library, fixes https://nvd.nist.gov/vuln/detail/CVE-2023-50570 Signed-off-by: Monu Singh --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index aa4422a7..ddfea32a 100644 --- a/build.gradle +++ b/build.gradle @@ -138,7 +138,7 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib:${kotlin_version}" implementation "org.jetbrains.kotlin:kotlin-stdlib-common:${kotlin_version}" implementation "org.jetbrains:annotations:13.0" - implementation "com.github.seancfoley:ipaddress:5.3.3" + implementation "com.github.seancfoley:ipaddress:5.4.0" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0" // Moving away from kotlin_version implementation "org.opensearch:common-utils:${common_utils_version}" implementation "org.apache.httpcomponents.client5:httpclient5:5.1.3" From 532a57fe5b4619a1fbe6c576b54161fda67e4506 Mon Sep 17 00:00:00 2001 From: Nishant Goel <113011736+nisgoel-amazon@users.noreply.github.com> Date: Wed, 3 Jan 2024 11:37:36 +0530 Subject: [PATCH 02/20] Ignoring update of final type settings in updateSettings function (#1304) (#1307) Signed-off-by: Nishant Goel --- .../replication/task/index/IndexReplicationTask.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/org/opensearch/replication/task/index/IndexReplicationTask.kt b/src/main/kotlin/org/opensearch/replication/task/index/IndexReplicationTask.kt index d0c812a7..48d0f331 100644 --- a/src/main/kotlin/org/opensearch/replication/task/index/IndexReplicationTask.kt +++ b/src/main/kotlin/org/opensearch/replication/task/index/IndexReplicationTask.kt @@ -461,7 +461,7 @@ open class IndexReplicationTask(id: Long, type: String, action: String, descript continue } val setting = indexScopedSettings[key] - if (!setting.isPrivateIndex) { + if (!setting.isPrivateIndex && !setting.isFinal) { desiredSettingsBuilder.copy(key, settings); } } @@ -473,7 +473,7 @@ open class IndexReplicationTask(id: Long, type: String, action: String, descript if (desiredSettings.get(key) != followerSettings.get(key)) { //Not intended setting on follower side. val setting = indexScopedSettings[key] - if (indexScopedSettings.isPrivateSetting(key)) { + if (indexScopedSettings.isPrivateSetting(key) || setting.isFinal) { continue } if (!setting.isDynamic()) { @@ -486,7 +486,7 @@ open class IndexReplicationTask(id: Long, type: String, action: String, descript for (key in followerSettings.keySet()) { val setting = indexScopedSettings[key] - if (setting == null || setting.isPrivateIndex) { + if (setting == null || setting.isPrivateIndex || setting.isFinal) { continue } From 3ea239b5b308b8c053511fb2da79ac37f12b2340 Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Thu, 18 Jan 2024 23:56:32 -0500 Subject: [PATCH 03/20] Remove references to admin:admin (#1298) * Remove references to admin:admin Signed-off-by: Derek Ho * Try to pass in initial admin password via env variable Signed-off-by: Derek Ho * Try using the env variable Signed-off-by: Derek Ho * Revert file deletion and add logic for integration tests Signed-off-by: Derek Ho * fix env variable Signed-off-by: Derek Ho * Update logic to be the same across all repos Signed-off-by: Derek Ho * Keep old logic Signed-off-by: Derek Ho * Change variable name Signed-off-by: Derek Ho --------- Signed-off-by: Derek Ho --- HANDBOOK.md | 2 +- build.gradle | 4 +++- scripts/integtest.sh | 11 +++++++++-- 3 files changed, 13 insertions(+), 4 deletions(-) mode change 100755 => 100644 scripts/integtest.sh diff --git a/HANDBOOK.md b/HANDBOOK.md index ebb63090..fe1dfa0d 100644 --- a/HANDBOOK.md +++ b/HANDBOOK.md @@ -66,7 +66,7 @@ plugins.security.nodes_dn_dynamic_config_enabled: true Allow connections from follower cluster on the leader as follows ```bash -curl -k -u admin:admin -XPUT "https://${LEADER}/_plugins/_security/api/nodesdn/follower" \ +curl -k -u admin: -XPUT "https://${LEADER}/_plugins/_security/api/nodesdn/follower" \ -H 'Content-type: application/json' \ -d'{"nodes_dn": ["CN=follower.example.com"]}' ``` diff --git a/build.gradle b/build.gradle index ddfea32a..3774dbb9 100644 --- a/build.gradle +++ b/build.gradle @@ -34,6 +34,7 @@ import org.opensearch.gradle.test.RestIntegTestTask buildscript { ext { + System.setProperty("OPENSEARCH_INITIAL_ADMIN_PASSWORD", "myStrongPassword123!") isSnapshot = "true" == System.getProperty("build.snapshot", "true") opensearch_version = System.getProperty("opensearch.version", "3.0.0-SNAPSHOT") buildVersionQualifier = System.getProperty("build.version_qualifier", "") @@ -429,7 +430,7 @@ def configureCluster(OpenSearchCluster cluster, Boolean securityEnabled) { } CrossClusterWaitForHttpResource wait = new CrossClusterWaitForHttpResource(protocol, cluster.getFirstNode().getHttpSocketURI(), cluster.nodes.size()) wait.setUsername("admin") - wait.setPassword("admin") + wait.setPassword(System.getProperty("OPENSEARCH_INITIAL_ADMIN_PASSWORD")) return wait.wait(500) } @@ -682,6 +683,7 @@ clusters.each { name -> if (securityEnabled) { plugin(provider(securityPluginOld)) cliSetup("opensearch-security/install_demo_configuration.sh", "-y") + } // Currently fetching the ARCHIVE distribution fails on mac as it tries to fetch the Mac specific "DARWIN" distribution // for Opensearch which is not publish yet. Changing this to INTEG_TEST to make it work on mac. diff --git a/scripts/integtest.sh b/scripts/integtest.sh old mode 100755 new mode 100644 index 1a0498ae..464108c7 --- a/scripts/integtest.sh +++ b/scripts/integtest.sh @@ -70,9 +70,16 @@ then SECURITY_ENABLED="true" fi +IFS='.' read -ra version_array <<< "$OPENSEARCH_VERSION" + if [ -z "$CREDENTIAL" ] then - CREDENTIAL="admin:admin" + # Starting in 2.12.0, security demo configuration script requires an initial admin password + if (( ${version_array[0]} > 2 || (${version_array[0]} == 2 && ${version_array[1]} >= 12) )); then + CREDENTIAL="admin:myStrongPassword123!" + else + CREDENTIAL="admin:admin" + fi fi USERNAME=`echo $CREDENTIAL | awk -F ':' '{print $1}'` @@ -118,4 +125,4 @@ else TRANSPORT_PORT="9300" fi ./gradlew singleClusterSanityTest -Dfollower.http_host="$BIND_ADDRESS:$BIND_PORT" -Dfollower.transport_host="$BIND_ADDRESS:$TRANSPORT_PORT" -Dsecurity_enabled=$SECURITY_ENABLED -Duser=$USERNAME -Dpassword=$PASSWORD --console=plain -fi +fi \ No newline at end of file From 043a7882a369399b07fead3b1d146aefc359d03a Mon Sep 17 00:00:00 2001 From: Monu Singh Date: Fri, 2 Feb 2024 15:04:16 +0530 Subject: [PATCH 04/20] Fix build failures (#1315) * Fix build failures Signed-off-by: monusingh-1 * Enable xml report Signed-off-by: monusingh-1 --------- Signed-off-by: monusingh-1 --- build.gradle | 9 ++++----- gradle/wrapper/gradle-wrapper.properties | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index 3774dbb9..e7dbd2c5 100644 --- a/build.gradle +++ b/build.gradle @@ -82,7 +82,7 @@ buildscript { } plugins { - id 'nebula.ospackage' version "8.3.0" + id 'com.netflix.nebula.ospackage' version "11.6.0" id "com.dorongold.task-tree" version "1.5" id "jacoco" } @@ -166,15 +166,14 @@ repositories { compileKotlin { kotlinOptions { - // This should be 11, but the OpenSearch logger usage checker tool doesn't like classes > 1.8 - jvmTarget = "1.8" + jvmTarget = "11" freeCompilerArgs = ['-Xjsr305=strict'] // Handle OpenSearch @Nullable annotation correctly } } compileTestKotlin { kotlinOptions { - jvmTarget = "1.8" + jvmTarget = "11" freeCompilerArgs = ['-Xjsr305=strict'] } } @@ -536,7 +535,7 @@ jacocoTestReport { dependsOn test dependsOn integTest reports { - xml.enabled true + xml.required.set(true) } // We're combining the coverage data for both test and integ tests. getExecutionData().setFrom(fileTree(buildDir).include("/jacoco/*.exec")) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 68efe1de..8d687878 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -11,6 +11,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 720e0805b4515acbc07a7c192b8db48f17c99a38 Mon Sep 17 00:00:00 2001 From: Mohit Kumar <113413713+mohitamg@users.noreply.github.com> Date: Tue, 6 Feb 2024 21:25:39 +0530 Subject: [PATCH 05/20] Create opensearch-cross-cluster-replication.release-notes-2.12.0.0.md (#1321) Add Release notes for OS 2.12.0 Signed-off-by: Mohit Kumar <113413713+mohitamg@users.noreply.github.com> --- ...h-cross-cluster-replication.release-notes-2.12.0.0.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 release-notes/opensearch-cross-cluster-replication.release-notes-2.12.0.0.md diff --git a/release-notes/opensearch-cross-cluster-replication.release-notes-2.12.0.0.md b/release-notes/opensearch-cross-cluster-replication.release-notes-2.12.0.0.md new file mode 100644 index 00000000..e8d5c2d1 --- /dev/null +++ b/release-notes/opensearch-cross-cluster-replication.release-notes-2.12.0.0.md @@ -0,0 +1,9 @@ +## Version 2.12.0 Release Notes + +Compatible with OpenSearch 2.12.0 + +## Bug Fixes + +* Implement getSystemIndexDescriptors to support SystemIndex for replication plugin ([#1290](https://github.com/opensearch-project/cross-cluster-replication/pull/1290)) +* Correct error message including what fields are missing when field are not passed when starting replication ([#1292](https://github.com/opensearch-project/cross-cluster-replication/pull/1292)) +* Ignoring all the final settings to copy from leader to follower as those settings won't be able to apply as those are not updatable ([#1304](https://github.com/opensearch-project/cross-cluster-replication/pull/1304)) From b011467b34e7aae2ada814e2323a2f5ca329d50d Mon Sep 17 00:00:00 2001 From: Darshit Chanpura Date: Mon, 5 Feb 2024 12:37:27 -0500 Subject: [PATCH 06/20] Updates integTest behavior to accept the version and set the password accordingly Signed-off-by: Darshit Chanpura --- scripts/integtest.sh | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/scripts/integtest.sh b/scripts/integtest.sh index 464108c7..0d64d05a 100644 --- a/scripts/integtest.sh +++ b/scripts/integtest.sh @@ -50,7 +50,7 @@ while getopts ":h:b:p:t:e:s:c:v:" arg; do CREDENTIAL=$OPTARG ;; v) - # Do nothing as we're not consuming this param. + OPENSEARCH_VERSION=$OPTARG ;; :) echo "-${OPTARG} requires an argument" @@ -70,15 +70,16 @@ then SECURITY_ENABLED="true" fi -IFS='.' read -ra version_array <<< "$OPENSEARCH_VERSION" +OPENSEARCH_REQUIRED_VERSION="2.12.0" if [ -z "$CREDENTIAL" ] then # Starting in 2.12.0, security demo configuration script requires an initial admin password - if (( ${version_array[0]} > 2 || (${version_array[0]} == 2 && ${version_array[1]} >= 12) )); then - CREDENTIAL="admin:myStrongPassword123!" - else + COMPARE_VERSION=`echo $OPENSEARCH_REQUIRED_VERSION $OPENSEARCH_VERSION | tr ' ' '\n' | sort -V | uniq | head -n 1` + if [ "$COMPARE_VERSION" != "$OPENSEARCH_REQUIRED_VERSION" ]; then CREDENTIAL="admin:admin" + else + CREDENTIAL="admin:myStrongPassword123!" fi fi From 581cff05a3efae001225f1578fa254c5e80369c0 Mon Sep 17 00:00:00 2001 From: Darshit Chanpura Date: Mon, 5 Feb 2024 13:07:55 -0500 Subject: [PATCH 07/20] Updates credentials Signed-off-by: Darshit Chanpura --- scripts/integtest.sh | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/scripts/integtest.sh b/scripts/integtest.sh index 0d64d05a..39d94c73 100644 --- a/scripts/integtest.sh +++ b/scripts/integtest.sh @@ -70,17 +70,9 @@ then SECURITY_ENABLED="true" fi -OPENSEARCH_REQUIRED_VERSION="2.12.0" - if [ -z "$CREDENTIAL" ] then - # Starting in 2.12.0, security demo configuration script requires an initial admin password - COMPARE_VERSION=`echo $OPENSEARCH_REQUIRED_VERSION $OPENSEARCH_VERSION | tr ' ' '\n' | sort -V | uniq | head -n 1` - if [ "$COMPARE_VERSION" != "$OPENSEARCH_REQUIRED_VERSION" ]; then - CREDENTIAL="admin:admin" - else - CREDENTIAL="admin:myStrongPassword123!" - fi + CREDENTIAL="admin:admin" # CCR uses custom setup and hence doesn't require custom password fi USERNAME=`echo $CREDENTIAL | awk -F ':' '{print $1}'` From 2612f572b7c6a91b93a89298d4ef3105574bcab8 Mon Sep 17 00:00:00 2001 From: Darshit Chanpura Date: Mon, 5 Feb 2024 13:39:53 -0500 Subject: [PATCH 08/20] Updates credentials to be admin Signed-off-by: Darshit Chanpura --- build.gradle | 3 +-- scripts/integtest.sh | 10 +++++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index e7dbd2c5..40819857 100644 --- a/build.gradle +++ b/build.gradle @@ -34,7 +34,6 @@ import org.opensearch.gradle.test.RestIntegTestTask buildscript { ext { - System.setProperty("OPENSEARCH_INITIAL_ADMIN_PASSWORD", "myStrongPassword123!") isSnapshot = "true" == System.getProperty("build.snapshot", "true") opensearch_version = System.getProperty("opensearch.version", "3.0.0-SNAPSHOT") buildVersionQualifier = System.getProperty("build.version_qualifier", "") @@ -429,7 +428,7 @@ def configureCluster(OpenSearchCluster cluster, Boolean securityEnabled) { } CrossClusterWaitForHttpResource wait = new CrossClusterWaitForHttpResource(protocol, cluster.getFirstNode().getHttpSocketURI(), cluster.nodes.size()) wait.setUsername("admin") - wait.setPassword(System.getProperty("OPENSEARCH_INITIAL_ADMIN_PASSWORD")) + wait.setPassword("admin") return wait.wait(500) } diff --git a/scripts/integtest.sh b/scripts/integtest.sh index 39d94c73..0d64d05a 100644 --- a/scripts/integtest.sh +++ b/scripts/integtest.sh @@ -70,9 +70,17 @@ then SECURITY_ENABLED="true" fi +OPENSEARCH_REQUIRED_VERSION="2.12.0" + if [ -z "$CREDENTIAL" ] then - CREDENTIAL="admin:admin" # CCR uses custom setup and hence doesn't require custom password + # Starting in 2.12.0, security demo configuration script requires an initial admin password + COMPARE_VERSION=`echo $OPENSEARCH_REQUIRED_VERSION $OPENSEARCH_VERSION | tr ' ' '\n' | sort -V | uniq | head -n 1` + if [ "$COMPARE_VERSION" != "$OPENSEARCH_REQUIRED_VERSION" ]; then + CREDENTIAL="admin:admin" + else + CREDENTIAL="admin:myStrongPassword123!" + fi fi USERNAME=`echo $CREDENTIAL | awk -F ':' '{print $1}'` From 341e067aa65a405d28f20399eb334a87fbfaec67 Mon Sep 17 00:00:00 2001 From: Darshit Chanpura Date: Thu, 8 Feb 2024 10:41:20 -0500 Subject: [PATCH 09/20] Forces HTTP1 version policy for local clusters Signed-off-by: Darshit Chanpura --- .../org/opensearch/replication/MultiClusterRestTestCase.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/test/kotlin/org/opensearch/replication/MultiClusterRestTestCase.kt b/src/test/kotlin/org/opensearch/replication/MultiClusterRestTestCase.kt index eca8750f..090bdf00 100644 --- a/src/test/kotlin/org/opensearch/replication/MultiClusterRestTestCase.kt +++ b/src/test/kotlin/org/opensearch/replication/MultiClusterRestTestCase.kt @@ -27,6 +27,7 @@ import org.apache.hc.core5.http.message.BasicHeader import org.apache.hc.core5.http.io.entity.StringEntity import org.apache.hc.core5.ssl.SSLContexts import org.apache.hc.core5.http.io.entity.EntityUtils +import org.apache.hc.core5.http2.HttpVersionPolicy import org.apache.hc.core5.util.Timeout import org.apache.lucene.util.SetOnce import org.opensearch.action.admin.cluster.node.tasks.list.ListTasksRequest @@ -102,6 +103,7 @@ abstract class MultiClusterRestTestCase : OpenSearchTestCase() { val builder = RestClient.builder(*httpHosts.toTypedArray()).setHttpClientConfigCallback { httpAsyncClientBuilder -> httpAsyncClientBuilder.setConnectionManager(connManager) + httpAsyncClientBuilder.setVersionPolicy(HttpVersionPolicy.FORCE_HTTP_1) } configureClient(builder, getClusterSettings(clusterName), securityEnabled) builder.setStrictDeprecationMode(false) From d703887f88f24c444e0513ebeca21e30b93354f8 Mon Sep 17 00:00:00 2001 From: Darshit Chanpura Date: Fri, 9 Feb 2024 10:46:52 -0500 Subject: [PATCH 10/20] Adds more comments Signed-off-by: Darshit Chanpura --- scripts/integtest.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/scripts/integtest.sh b/scripts/integtest.sh index 0d64d05a..f967dc8a 100644 --- a/scripts/integtest.sh +++ b/scripts/integtest.sh @@ -75,8 +75,11 @@ OPENSEARCH_REQUIRED_VERSION="2.12.0" if [ -z "$CREDENTIAL" ] then # Starting in 2.12.0, security demo configuration script requires an initial admin password - COMPARE_VERSION=`echo $OPENSEARCH_REQUIRED_VERSION $OPENSEARCH_VERSION | tr ' ' '\n' | sort -V | uniq | head -n 1` - if [ "$COMPARE_VERSION" != "$OPENSEARCH_REQUIRED_VERSION" ]; then + # Pick the minimum of two versions + VERSION_TO_COMPARE=`echo $OPENSEARCH_REQUIRED_VERSION $OPENSEARCH_VERSION | tr ' ' '\n' | sort -V | uniq | head -n 1` + # Check if the compared version is not equal to the required version. + # If it is not equal, it means the current version is older. + if [ "$VERSION_TO_COMPARE" != "$OPENSEARCH_REQUIRED_VERSION" ]; then CREDENTIAL="admin:admin" else CREDENTIAL="admin:myStrongPassword123!" From 3f4f2163d61ff660d608c39412802dea383a8426 Mon Sep 17 00:00:00 2001 From: Darshit Chanpura <35282393+DarshitChanpura@users.noreply.github.com> Date: Mon, 12 Feb 2024 05:37:24 -0500 Subject: [PATCH 11/20] Updates 2.12 release notes (#1329) Signed-off-by: Darshit Chanpura --- build.gradle | 1 - ...nsearch-cross-cluster-replication.release-notes-2.12.0.0.md | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 40819857..2fee9e0e 100644 --- a/build.gradle +++ b/build.gradle @@ -681,7 +681,6 @@ clusters.each { name -> if (securityEnabled) { plugin(provider(securityPluginOld)) cliSetup("opensearch-security/install_demo_configuration.sh", "-y") - } // Currently fetching the ARCHIVE distribution fails on mac as it tries to fetch the Mac specific "DARWIN" distribution // for Opensearch which is not publish yet. Changing this to INTEG_TEST to make it work on mac. diff --git a/release-notes/opensearch-cross-cluster-replication.release-notes-2.12.0.0.md b/release-notes/opensearch-cross-cluster-replication.release-notes-2.12.0.0.md index e8d5c2d1..19a391a5 100644 --- a/release-notes/opensearch-cross-cluster-replication.release-notes-2.12.0.0.md +++ b/release-notes/opensearch-cross-cluster-replication.release-notes-2.12.0.0.md @@ -7,3 +7,6 @@ Compatible with OpenSearch 2.12.0 * Implement getSystemIndexDescriptors to support SystemIndex for replication plugin ([#1290](https://github.com/opensearch-project/cross-cluster-replication/pull/1290)) * Correct error message including what fields are missing when field are not passed when starting replication ([#1292](https://github.com/opensearch-project/cross-cluster-replication/pull/1292)) * Ignoring all the final settings to copy from leader to follower as those settings won't be able to apply as those are not updatable ([#1304](https://github.com/opensearch-project/cross-cluster-replication/pull/1304)) + +## Maintenance +* Updates integTest behavior to accept the version and set the password accordingly, removes admin:admin references and force HTTP1 policy for local clusters([#1298](https://github.com/opensearch-project/cross-cluster-replication/pull/1298))([#1318](https://github.com/opensearch-project/cross-cluster-replication/pull/1318)) From 74dfcd169d202c1b3eab8e17f3b7bff9461b85d6 Mon Sep 17 00:00:00 2001 From: Darshit Chanpura <35282393+DarshitChanpura@users.noreply.github.com> Date: Wed, 14 Feb 2024 23:18:06 -0500 Subject: [PATCH 12/20] Fixes base64 encoded hardcoded admin credentials (#1331) * Fixes base64 encoded hardcoded admin credentials Signed-off-by: Darshit Chanpura * Fixes broken integTest task Signed-off-by: Darshit Chanpura --------- Signed-off-by: Darshit Chanpura --- build.gradle | 1 + .../org/opensearch/replication/MultiClusterRestTestCase.kt | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 2fee9e0e..e4e20d62 100644 --- a/build.gradle +++ b/build.gradle @@ -450,6 +450,7 @@ int endJmxPort = startJmxPort integTest { useCluster testClusters.leaderCluster useCluster testClusters.followCluster + systemProperty "password", "admin" // setting it to `admin` explicitly since its a custom security setup if(knnEnabled){ nonInputProperties.systemProperty('tests.knn_plugin_enabled', "true") diff --git a/src/test/kotlin/org/opensearch/replication/MultiClusterRestTestCase.kt b/src/test/kotlin/org/opensearch/replication/MultiClusterRestTestCase.kt index 090bdf00..185cadc4 100644 --- a/src/test/kotlin/org/opensearch/replication/MultiClusterRestTestCase.kt +++ b/src/test/kotlin/org/opensearch/replication/MultiClusterRestTestCase.kt @@ -57,12 +57,14 @@ import org.junit.After import org.junit.AfterClass import org.junit.Before import org.junit.BeforeClass +import java.nio.charset.StandardCharsets import java.nio.file.Files import java.security.KeyManagementException import java.security.KeyStore import java.security.KeyStoreException import java.security.NoSuchAlgorithmException import java.security.cert.CertificateException +import java.util.Base64 import java.util.concurrent.TimeUnit import java.util.concurrent.atomic.AtomicReference import java.util.Collections @@ -233,8 +235,10 @@ abstract class MultiClusterRestTestCase : OpenSearchTestCase() { for ((key, value) in headers) { defaultHeaders[i++] = BasicHeader(key, value) } + + val creds = System.getProperty("user", "admin") + ":" + System.getProperty("password", "myStrongPassword123!") if(securityEnabled) { - defaultHeaders[i++] = BasicHeader("Authorization", "Basic YWRtaW46YWRtaW4=") + defaultHeaders[i++] = BasicHeader("Authorization", "Basic " + Base64.getEncoder().encodeToString(creds.toByteArray(StandardCharsets.UTF_8))) } builder.setDefaultHeaders(defaultHeaders) From bfbfdc608e0ba668d658c07ff67412d854011721 Mon Sep 17 00:00:00 2001 From: Mohit Kumar <113413713+mohitamg@users.noreply.github.com> Date: Thu, 29 Feb 2024 15:39:56 +0530 Subject: [PATCH 13/20] Fix for CVE-2023-50570(Bumping up to latest version of ipaddress library (#1339) Signed-off-by: Mohit Kumar --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index e4e20d62..4eb4e250 100644 --- a/build.gradle +++ b/build.gradle @@ -138,7 +138,7 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib:${kotlin_version}" implementation "org.jetbrains.kotlin:kotlin-stdlib-common:${kotlin_version}" implementation "org.jetbrains:annotations:13.0" - implementation "com.github.seancfoley:ipaddress:5.4.0" + implementation "com.github.seancfoley:ipaddress:5.4.1" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0" // Moving away from kotlin_version implementation "org.opensearch:common-utils:${common_utils_version}" implementation "org.apache.httpcomponents.client5:httpclient5:5.1.3" From da8746ff50fbf1d8b8f8d4bce3c312df94607f59 Mon Sep 17 00:00:00 2001 From: Monu Singh Date: Mon, 18 Mar 2024 11:33:36 +0530 Subject: [PATCH 14/20] Update Lucene snapshot location (#1351) Signed-off-by: monusingh-1 --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 4eb4e250..c6658dd5 100644 --- a/build.gradle +++ b/build.gradle @@ -68,7 +68,7 @@ buildscript { mavenCentral() maven { url "https://aws.oss.sonatype.org/content/repositories/snapshots" } maven { url "https://plugins.gradle.org/m2/" } - maven { url "https://d1nvenhzbhpy0q.cloudfront.net/snapshots/lucene/" } + maven { url "https://artifacts.opensearch.org/snapshots/lucene/" } } dependencies { @@ -160,7 +160,7 @@ repositories { mavenCentral() maven { url "https://aws.oss.sonatype.org/content/repositories/snapshots" } maven { url "https://plugins.gradle.org/m2/" } - maven { url "https://d1nvenhzbhpy0q.cloudfront.net/snapshots/lucene/" } + maven { url "https://artifacts.opensearch.org/snapshots/lucene/" } } compileKotlin { From 3e35b09ed58695a094512121ee44ad5645ad8076 Mon Sep 17 00:00:00 2001 From: Mohit Kumar <113413713+mohitamg@users.noreply.github.com> Date: Tue, 19 Mar 2024 13:39:28 +0530 Subject: [PATCH 15/20] Added release notes for OS-cross-cluster-replication_2.13.0 (#1353) Signed-off-by: Mohit Kumar --- ...ross-cluster-replication.release-notes-2.13.0.0.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 release-notes/opensearch-cross-cluster-replication.release-notes-2.13.0.0.md diff --git a/release-notes/opensearch-cross-cluster-replication.release-notes-2.13.0.0.md b/release-notes/opensearch-cross-cluster-replication.release-notes-2.13.0.0.md new file mode 100644 index 00000000..5573ce7b --- /dev/null +++ b/release-notes/opensearch-cross-cluster-replication.release-notes-2.13.0.0.md @@ -0,0 +1,11 @@ +## Version 2.13.0 Release Notes + +Compatible with OpenSearch 2.13.0 + +## Security Fixes + +* Bumped up to latest version of ipaddress library ([#1339](https://github.com/opensearch-project/cross-cluster-replication/pull/1339)) + +## Maintenance + +* Updated lucene snapshot location to prevent builds to fail between file deletion and re-upload when snapshots are updated ([#1351](https://github.com/opensearch-project/cross-cluster-replication/pull/1351)) From 90fcb8bc9c498ad69139969d5eafbdbb87362675 Mon Sep 17 00:00:00 2001 From: Mohit Kumar <113413713+mohitamg@users.noreply.github.com> Date: Tue, 16 Apr 2024 16:47:21 +0530 Subject: [PATCH 16/20] Release notes for opensearch-cross-cluster-replication 1.3.16 (#1366) --- ...pensearch-cross-cluster-replication.release-notes-1.3.16.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 release-notes/opensearch-cross-cluster-replication.release-notes-1.3.16.md diff --git a/release-notes/opensearch-cross-cluster-replication.release-notes-1.3.16.md b/release-notes/opensearch-cross-cluster-replication.release-notes-1.3.16.md new file mode 100644 index 00000000..83e72919 --- /dev/null +++ b/release-notes/opensearch-cross-cluster-replication.release-notes-1.3.16.md @@ -0,0 +1,3 @@ +## Version 1.3.16 Release Notes + +Compatible with OpenSearch 1.3.16 \ No newline at end of file From ff42012067e0b14e0e15b79c9be542cbdff08031 Mon Sep 17 00:00:00 2001 From: Shubh Sahu Date: Tue, 23 Apr 2024 09:56:21 +0530 Subject: [PATCH 17/20] =?UTF-8?q?Adding=20support=20to=20fetch=20changes?= =?UTF-8?q?=20from=20Lucene=20store=20while=20migrating=20from/to=20r?= =?UTF-8?q?=E2=80=A6=20(#1369)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Shubh Sahu --- build.gradle | 2 + .../replication/ReplicationPlugin.kt | 2 +- .../changes/TransportGetChangesAction.kt | 20 +++---- .../replication/util/ValidationUtil.kt | 12 ++-- .../integ/rest/StartReplicationIT.kt | 59 +++++++++++++++++++ 5 files changed, 80 insertions(+), 15 deletions(-) diff --git a/build.gradle b/build.gradle index c6658dd5..7563e849 100644 --- a/build.gradle +++ b/build.gradle @@ -380,6 +380,8 @@ testClusters { testDistribution = "ARCHIVE" } int debugPort = 5005 + //adding it to test migration + systemProperty('opensearch.experimental.feature.remote_store.migration.enabled','true') if (_numNodes > 1) numberOfNodes = _numNodes //numberOfNodes = 3 diff --git a/src/main/kotlin/org/opensearch/replication/ReplicationPlugin.kt b/src/main/kotlin/org/opensearch/replication/ReplicationPlugin.kt index 792ebe27..3790c3c0 100644 --- a/src/main/kotlin/org/opensearch/replication/ReplicationPlugin.kt +++ b/src/main/kotlin/org/opensearch/replication/ReplicationPlugin.kt @@ -387,7 +387,7 @@ internal class ReplicationPlugin : Plugin(), ActionPlugin, PersistentTaskPlugin, override fun getCustomTranslogDeletionPolicyFactory(): Optional { // We don't need a retention lease translog deletion policy for remote store enabled clusters as // we fetch the operations directly from lucene in such cases. - return if (ValidationUtil.isRemoteStoreEnabledCluster(clusterService) == false) { + return if (ValidationUtil.isRemoteEnabledOrMigrating(clusterService) == false) { Optional.of(TranslogDeletionPolicyFactory { indexSettings, retentionLeasesSupplier -> ReplicationTranslogDeletionPolicy(indexSettings, retentionLeasesSupplier) }) diff --git a/src/main/kotlin/org/opensearch/replication/action/changes/TransportGetChangesAction.kt b/src/main/kotlin/org/opensearch/replication/action/changes/TransportGetChangesAction.kt index 392555b5..4e364906 100644 --- a/src/main/kotlin/org/opensearch/replication/action/changes/TransportGetChangesAction.kt +++ b/src/main/kotlin/org/opensearch/replication/action/changes/TransportGetChangesAction.kt @@ -77,8 +77,8 @@ class TransportGetChangesAction @Inject constructor(threadPool: ThreadPool, clus indexMetric.lastFetchTime.set(relativeStartNanos) val indexShard = indicesService.indexServiceSafe(shardId.index).getShard(shardId.id) - val isRemoteStoreEnabled = ValidationUtil.isRemoteStoreEnabledCluster(clusterService) - if (lastGlobalCheckpoint(indexShard, isRemoteStoreEnabled) < request.fromSeqNo) { + val isRemoteEnabledOrMigrating = ValidationUtil.isRemoteEnabledOrMigrating(clusterService) + if (lastGlobalCheckpoint(indexShard, isRemoteEnabledOrMigrating) < request.fromSeqNo) { // There are no new operations to sync. Do a long poll and wait for GlobalCheckpoint to advance. If // the checkpoint doesn't advance by the timeout this throws an ESTimeoutException which the caller // should catch and start a new poll. @@ -87,18 +87,18 @@ class TransportGetChangesAction @Inject constructor(threadPool: ThreadPool, clus // At this point indexShard.lastKnownGlobalCheckpoint has advanced but it may not yet have been synced // to the translog, which means we can't return those changes. Return to the caller to retry. // TODO: Figure out a better way to wait for the global checkpoint to be synced to the translog - if (lastGlobalCheckpoint(indexShard, isRemoteStoreEnabled) < request.fromSeqNo) { - assert(gcp > lastGlobalCheckpoint(indexShard, isRemoteStoreEnabled)) { "Checkpoint didn't advance at all $gcp ${lastGlobalCheckpoint(indexShard, isRemoteStoreEnabled)}" } + if (lastGlobalCheckpoint(indexShard, isRemoteEnabledOrMigrating) < request.fromSeqNo) { + assert(gcp > lastGlobalCheckpoint(indexShard, isRemoteEnabledOrMigrating)) { "Checkpoint didn't advance at all $gcp ${lastGlobalCheckpoint(indexShard, isRemoteEnabledOrMigrating)}" } throw OpenSearchTimeoutException("global checkpoint not synced. Retry after a few miliseconds...") } } relativeStartNanos = System.nanoTime() // At this point lastSyncedGlobalCheckpoint is at least fromSeqNo - val toSeqNo = min(lastGlobalCheckpoint(indexShard, isRemoteStoreEnabled), request.toSeqNo) + val toSeqNo = min(lastGlobalCheckpoint(indexShard, isRemoteEnabledOrMigrating), request.toSeqNo) var ops: List = listOf() - var fetchFromTranslog = isTranslogPruningByRetentionLeaseEnabled(shardId) && isRemoteStoreEnabled == false + var fetchFromTranslog = isTranslogPruningByRetentionLeaseEnabled(shardId) && isRemoteEnabledOrMigrating == false if(fetchFromTranslog) { try { ops = translogService.getHistoryOfOperations(indexShard, request.fromSeqNo, toSeqNo) @@ -136,16 +136,16 @@ class TransportGetChangesAction @Inject constructor(threadPool: ThreadPool, clus indexMetric.ops.addAndGet(ops.size.toLong()) ops.stream().forEach{op -> indexMetric.bytesRead.addAndGet(op.estimateSize()) } - GetChangesResponse(ops, request.fromSeqNo, indexShard.maxSeqNoOfUpdatesOrDeletes, lastGlobalCheckpoint(indexShard, isRemoteStoreEnabled)) + GetChangesResponse(ops, request.fromSeqNo, indexShard.maxSeqNoOfUpdatesOrDeletes, lastGlobalCheckpoint(indexShard, isRemoteEnabledOrMigrating)) } } } - private fun lastGlobalCheckpoint(indexShard: IndexShard, isRemoteStoreEnabled: Boolean): Long { + private fun lastGlobalCheckpoint(indexShard: IndexShard, isRemoteEnabledOrMigrating: Boolean): Long { // We rely on lastSyncedGlobalCheckpoint as it has been durably written to disk. In case of remote store // enabled clusters, the semantics are slightly different, and we can't use lastSyncedGlobalCheckpoint. Falling back to // lastKnownGlobalCheckpoint in such cases. - return if (isRemoteStoreEnabled) { + return if (isRemoteEnabledOrMigrating) { indexShard.lastKnownGlobalCheckpoint } else { indexShard.lastSyncedGlobalCheckpoint @@ -173,7 +173,7 @@ class TransportGetChangesAction @Inject constructor(threadPool: ThreadPool, clus override fun shards(state: ClusterState, request: InternalRequest): ShardsIterator { val shardIt = state.routingTable().shardRoutingTable(request.request().shardId) // Random active shards - return if (ValidationUtil.isRemoteStoreEnabledCluster(clusterService)) shardIt.primaryShardIt() + return if (ValidationUtil.isRemoteEnabledOrMigrating(clusterService)) shardIt.primaryShardIt() else shardIt.activeInitializingShardsRandomIt() } } \ No newline at end of file diff --git a/src/main/kotlin/org/opensearch/replication/util/ValidationUtil.kt b/src/main/kotlin/org/opensearch/replication/util/ValidationUtil.kt index afbcdf60..91d012c2 100644 --- a/src/main/kotlin/org/opensearch/replication/util/ValidationUtil.kt +++ b/src/main/kotlin/org/opensearch/replication/util/ValidationUtil.kt @@ -17,18 +17,18 @@ import org.opensearch.Version import org.opensearch.cluster.ClusterState import org.opensearch.cluster.metadata.IndexMetadata import org.opensearch.cluster.metadata.MetadataCreateIndexService -import org.opensearch.core.common.Strings +import org.opensearch.cluster.service.ClusterService import org.opensearch.common.ValidationException import org.opensearch.common.settings.Settings +import org.opensearch.core.common.Strings import org.opensearch.env.Environment import org.opensearch.index.IndexNotFoundException -import java.io.UnsupportedEncodingException -import org.opensearch.cluster.service.ClusterService import org.opensearch.node.Node import org.opensearch.node.remotestore.RemoteStoreNodeAttribute +import org.opensearch.node.remotestore.RemoteStoreNodeService import org.opensearch.replication.ReplicationPlugin.Companion.KNN_INDEX_SETTING import org.opensearch.replication.ReplicationPlugin.Companion.KNN_PLUGIN_PRESENT_SETTING -import org.opensearch.replication.action.changes.TransportGetChangesAction +import java.io.UnsupportedEncodingException import java.nio.file.Files import java.nio.file.Path import java.util.Locale @@ -161,4 +161,8 @@ object ValidationUtil { return clusterService.settings.getByPrefix(Node.NODE_ATTRIBUTES.key + RemoteStoreNodeAttribute.REMOTE_STORE_NODE_ATTRIBUTE_KEY_PREFIX).isEmpty == false } + fun isRemoteEnabledOrMigrating(clusterService: ClusterService): Boolean { + return isRemoteStoreEnabledCluster(clusterService) || + clusterService.clusterSettings.get(RemoteStoreNodeService.REMOTE_STORE_COMPATIBILITY_MODE_SETTING).equals(RemoteStoreNodeService.CompatibilityMode.MIXED) + } } diff --git a/src/test/kotlin/org/opensearch/replication/integ/rest/StartReplicationIT.kt b/src/test/kotlin/org/opensearch/replication/integ/rest/StartReplicationIT.kt index 0fa3c5ab..a0238b93 100644 --- a/src/test/kotlin/org/opensearch/replication/integ/rest/StartReplicationIT.kt +++ b/src/test/kotlin/org/opensearch/replication/integ/rest/StartReplicationIT.kt @@ -79,7 +79,10 @@ import java.nio.file.Files import java.util.* import java.util.concurrent.TimeUnit import org.opensearch.bootstrap.BootstrapInfo +import org.opensearch.cluster.service.ClusterService import org.opensearch.index.mapper.Mapping +import org.opensearch.indices.replication.common.ReplicationType +import org.opensearch.replication.util.ValidationUtil @MultiClusterAnnotations.ClusterConfigurations( @@ -1255,6 +1258,62 @@ class StartReplicationIT: MultiClusterRestTestCase() { ) } + fun `test operations are fetched from lucene when leader is in mixed mode`() { + + val leaderClient = getClientForCluster(LEADER) + val followerClient = getClientForCluster(FOLLOWER) + + // create index on leader cluster + val settings = Settings.builder() + .put(IndexMetadata.SETTING_NUMBER_OF_SHARDS, 1) + .build() + val createIndexResponse = leaderClient.indices().create( + CreateIndexRequest(leaderIndexName).settings(settings), + RequestOptions.DEFAULT + ) + assertThat(createIndexResponse.isAcknowledged).isTrue() + + // Update leader cluster settings to enable mixed mode and set migration direction to remote_store + val leaderClusterUpdateSettingsRequest = Request("PUT", "_cluster/settings") + val entityAsString = """ + { + "persistent": { + "remote_store.compatibility_mode": "mixed", + "migration.direction" : "remote_store" + } + }""".trimMargin() + + leaderClusterUpdateSettingsRequest.entity = StringEntity(entityAsString,ContentType.APPLICATION_JSON) + val updateSettingResponse = leaderClient.lowLevelClient.performRequest(leaderClusterUpdateSettingsRequest) + assertEquals(HttpStatus.SC_OK.toLong(), updateSettingResponse.statusLine.statusCode.toLong()) + + //create connection and start replication + createConnectionBetweenClusters(FOLLOWER, LEADER) + + followerClient.startReplication( + StartReplicationRequest("source", leaderIndexName, followerIndexName), + TimeValue.timeValueSeconds(10), + true + ) + + //Index documents on leader index + val docCount = 50 + for (i in 1..docCount) { + val sourceMap = mapOf("name" to randomAlphaOfLength(5)) + leaderClient.index(IndexRequest(leaderIndexName).id(i.toString()).source(sourceMap), RequestOptions.DEFAULT) + } + + // Verify that all the documents are replicated to follower index and are fetched from lucene + assertBusy({ + val stats = leaderClient.leaderStats() + assertThat(stats.size).isEqualTo(9) + assertThat(stats.getValue("num_replicated_indices").toString()).isEqualTo("1") + assertThat(stats.getValue("operations_read").toString()).isEqualTo(docCount.toString()) + assertThat(stats.getValue("operations_read_lucene").toString()).isEqualTo(docCount.toString()) + assertThat(stats.getValue("operations_read_translog").toString()).isEqualTo("0") + assertThat(stats.containsKey("index_stats")) + }, 60L, TimeUnit.SECONDS) + } private fun excludeAllClusterNodes(clusterName: String) { val transientSettingsRequest = Request("PUT", "_cluster/settings") From d4047421120b0f24a12fd67eded3e698b25d05f8 Mon Sep 17 00:00:00 2001 From: Sanjay Kumar <93825455+skumarp7@users.noreply.github.com> Date: Tue, 23 Apr 2024 10:16:17 +0530 Subject: [PATCH 18/20] Handle respone for deletion of non-existing autofollow replication rule (#1371) Signed-off-by: Sanjay Kumar --- ...ransportAutoFollowClusterManagerNodeAction.kt | 1 + .../integ/rest/UpdateAutoFollowPatternIT.kt | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/main/kotlin/org/opensearch/replication/action/autofollow/TransportAutoFollowClusterManagerNodeAction.kt b/src/main/kotlin/org/opensearch/replication/action/autofollow/TransportAutoFollowClusterManagerNodeAction.kt index 140a708d..51a0bd06 100644 --- a/src/main/kotlin/org/opensearch/replication/action/autofollow/TransportAutoFollowClusterManagerNodeAction.kt +++ b/src/main/kotlin/org/opensearch/replication/action/autofollow/TransportAutoFollowClusterManagerNodeAction.kt @@ -123,6 +123,7 @@ class TransportAutoFollowClusterManagerNodeAction @Inject constructor(transportS } catch(e: ResourceNotFoundException) { // Log warn as the task is already removed log.warn("Task already stopped for '$clusterAlias:$patternName'", e) + throw OpenSearchException("Autofollow replication rule $clusterAlias:$patternName does not exist") } catch (e: Exception) { log.error("Failed to stop auto follow task for cluster '$clusterAlias:$patternName'", e) throw OpenSearchException(AUTOFOLLOW_EXCEPTION_GENERIC_STRING) diff --git a/src/test/kotlin/org/opensearch/replication/integ/rest/UpdateAutoFollowPatternIT.kt b/src/test/kotlin/org/opensearch/replication/integ/rest/UpdateAutoFollowPatternIT.kt index 57593241..78e4ead4 100644 --- a/src/test/kotlin/org/opensearch/replication/integ/rest/UpdateAutoFollowPatternIT.kt +++ b/src/test/kotlin/org/opensearch/replication/integ/rest/UpdateAutoFollowPatternIT.kt @@ -294,6 +294,22 @@ class UpdateAutoFollowPatternIT: MultiClusterRestTestCase() { .hasMessageContaining(errorMsg) } + fun `test deletion of auto follow pattern`() { + val followerClient = getClientForCluster(FOLLOWER) + createConnectionBetweenClusters(FOLLOWER, LEADER, connectionAlias) + followerClient.updateAutoFollowPattern(connectionAlias, indexPatternName, indexPattern) + //Delete a replication rule which does not exist + Assertions.assertThatThrownBy { + followerClient.deleteAutoFollowPattern(connectionAlias, "dummy_conn") + }.isInstanceOf(ResponseException::class.java) + .hasMessageContaining("does not exist") + //Delete a replication rule which exists + Assertions.assertThatCode { + followerClient.deleteAutoFollowPattern(connectionAlias, indexPatternName) + }.doesNotThrowAnyException() + + } + fun `test removing autofollow pattern stop autofollow task`() { val followerClient = getClientForCluster(FOLLOWER) val leaderClient = getClientForCluster(LEADER) From 12d285bbcd25aabb95503c739ed2695bbf0ccc9c Mon Sep 17 00:00:00 2001 From: Sooraj Sinha <81695996+soosinha@users.noreply.github.com> Date: Thu, 2 May 2024 14:14:42 +0530 Subject: [PATCH 19/20] Add release notes for 2.14 (#1376) Signed-off-by: Sooraj Sinha --- ...cross-cluster-replication.release-notes-2.14.0.0.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 release-notes/opensearch-cross-cluster-replication.release-notes-2.14.0.0.md diff --git a/release-notes/opensearch-cross-cluster-replication.release-notes-2.14.0.0.md b/release-notes/opensearch-cross-cluster-replication.release-notes-2.14.0.0.md new file mode 100644 index 00000000..01ec5f51 --- /dev/null +++ b/release-notes/opensearch-cross-cluster-replication.release-notes-2.14.0.0.md @@ -0,0 +1,10 @@ +## Version 2.14.0.0 Release Notes + +Compatible with OpenSearch 2.14.0 + + +### Enhancements +* Support for fetching changes from Lucene store during remote store migration ([#1369](https://github.com/opensearch-project/cross-cluster-replication/pull/1369)) + +### Bug Fixes +* Handle response for deletion of non-existent autofollow replication rule ([#1371](https://github.com/opensearch-project/cross-cluster-replication/pull/1371)) From d287aa2d99894b2b036014e85a52b078534c8d14 Mon Sep 17 00:00:00 2001 From: Shubh Sahu Date: Fri, 3 May 2024 13:36:54 +0530 Subject: [PATCH 20/20] Disabling docrep to remote store migration test for integTestRemote (#1379) Signed-off-by: Shubh Sahu Co-authored-by: Shubh Sahu --- build.gradle | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 7563e849..e862827b 100644 --- a/build.gradle +++ b/build.gradle @@ -940,7 +940,8 @@ task integTestRemote (type: RestIntegTestTask) { } filter { - setExcludePatterns("org.opensearch.replication.bwc.BackwardsCompatibilityIT","org.opensearch.replication.singleCluster.SingleClusterSanityIT") + setExcludePatterns("org.opensearch.replication.bwc.BackwardsCompatibilityIT","org.opensearch.replication.singleCluster.SingleClusterSanityIT", + "org.opensearch.replication.integ.rest.StartReplicationIT.test operations are fetched from lucene when leader is in mixed mode") } }