This is an automated email from the ASF dual-hosted git repository.

pjfanning pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/pekko-connectors.git


The following commit(s) were added to refs/heads/main by this push:
     new d7c2df39a Elasticsearch: test Opensearch against 2.x and 3.x (#1933)
d7c2df39a is described below

commit d7c2df39a6eff87fa37b940ae24a79199856cbfd
Author: PJ Fanning <[email protected]>
AuthorDate: Fri Sep 18 09:03:05 2026 +0100

    Elasticsearch: test Opensearch against 2.x and 3.x (#1933)
    
    * Elasticsearch: test Opensearch against 2.x and 3.x
    
    Motivation:
    The Opensearch integration tests only ran against Opensearch 1.3.20.
    The 1.x line is end-of-life (1.3.20 was its final release, May 2025), so
    the connector had no coverage against any currently supported Opensearch.
    
    Modification:
    Replaced the `opensearch1` compose service with `opensearch2`
    (2.19.6, port 9203) and `opensearch3` (3.8.0, port 9204), both with the
    demo security config disabled and a 512m heap so the extra node does not
    grow the CI footprint. Updated the elasticsearch CI pre_cmd to start
    both. Turned `OpensearchV1Spec` into an abstract `OpensearchSpec` taking
    the base URL, with `Opensearch2Spec` and `Opensearch3Spec` running the
    whole spec against each server, and added port 9204 to
    `OpensearchParameterizedTest`.
    
    Result:
    The Opensearch connector is exercised against both supported Opensearch
    major lines instead of an end-of-life one. `OpensearchApiVersion.V1`
    remains the only API version - 2.x and 3.x keep the Elasticsearch 7.x
    compatible bulk and search API that it targets.
    
    Tests:
    - `sbt "elasticsearch/Test/compile"` - success
    - `sbt "elasticsearch/scalafmtAll" "elasticsearch/javafmtAll"` - success
    - Integration run not done locally: the containers start but this machine
      cannot run the suite; relying on the `elasticsearch` CI job.
    
    References:
    None - keeping test dependencies on supported versions
    
    * fix build
    
    * Elasticsearch: bump test server to 7.17.29
    
    Motivation:
    The Elasticsearch 7 test server was pinned to 7.17.28, one patch behind
    the latest 7.17 release.
    
    Modification:
    Bumped the `elasticsearch7` compose service to 7.17.29.
    
    Result:
    The connector is tested against the current 7.17 patch. `elasticsearch6`
    stays on 6.8.23, which is the final 6.8 release. The test servers cannot
    move to 8.x or 9.x without a new `ApiVersion`: those removed the mapping
    types that `ApiVersion.V5` depends on.
    
    Tests:
    - `sbt "elasticsearch/Test/compile"` - success
    - Integration run relies on the `elasticsearch` CI job.
    
    References:
    Refs #1933
---
 .github/workflows/check-build-test.yml             |  2 +-
 docker-compose.yml                                 | 17 ++++++++++--
 docs/src/main/paradox/opensearch.md                | 32 +++++++++++-----------
 ...{OpensearchV1Test.java => Opensearch2Test.java} |  2 +-
 .../docs/javadsl/OpensearchParameterizedTest.java  |  3 +-
 ...OpensearchV1Spec.scala => OpensearchSpec.scala} | 12 +++++---
 6 files changed, 42 insertions(+), 26 deletions(-)

diff --git a/.github/workflows/check-build-test.yml 
b/.github/workflows/check-build-test.yml
index 01052616b..5f58910a2 100644
--- a/.github/workflows/check-build-test.yml
+++ b/.github/workflows/check-build-test.yml
@@ -109,7 +109,7 @@ jobs:
           - { connector: couchbase3,                   pre_cmd: 'docker 
compose up -d couchbase8_prep' }
           - { connector: csv }
           - { connector: dynamodb,                     pre_cmd: 'docker 
compose up -d dynamodb' }
-          - { connector: elasticsearch,                pre_cmd: 'docker 
compose up -d elasticsearch6 elasticsearch7 opensearch1' }
+          - { connector: elasticsearch,                pre_cmd: 'docker 
compose up -d elasticsearch6 elasticsearch7 opensearch2 opensearch3' }
           - { connector: file }
           - { connector: ftp,                          pre_cmd: 
'./scripts/ftp-servers.sh' }
           - { connector: geode,                        pre_cmd: 'docker 
compose up -d geode' }
diff --git a/docker-compose.yml b/docker-compose.yml
index 7e891fdff..694a36b56 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -39,18 +39,29 @@ services:
     environment:
       - "discovery.type=single-node"
   elasticsearch7:
-    image: docker.elastic.co/elasticsearch/elasticsearch:7.17.28
+    image: docker.elastic.co/elasticsearch/elasticsearch:7.17.29
     ports:
       - "9202:9200"
     environment:
       - "discovery.type=single-node"
-  opensearch1:
-    image: opensearchproject/opensearch:1.3.20
+  opensearch2:
+    image: opensearchproject/opensearch:2.19.6
     ports:
       - "9203:9200"
     environment:
       - "discovery.type=single-node"
+      - "DISABLE_INSTALL_DEMO_CONFIG=true"
       - "DISABLE_SECURITY_PLUGIN=true"
+      - "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m"
+  opensearch3:
+    image: opensearchproject/opensearch:3.8.0
+    ports:
+      - "9204:9200"
+    environment:
+      - "discovery.type=single-node"
+      - "DISABLE_INSTALL_DEMO_CONFIG=true"
+      - "DISABLE_SECURITY_PLUGIN=true"
+      - "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m"
   ftp:
     image: stilliard/pure-ftpd:latest
     ports:
diff --git a/docs/src/main/paradox/opensearch.md 
b/docs/src/main/paradox/opensearch.md
index f266015c1..7510faea5 100644
--- a/docs/src/main/paradox/opensearch.md
+++ b/docs/src/main/paradox/opensearch.md
@@ -74,20 +74,20 @@ Use `ElasticsearchSource.typed` and 
`ElasticsearchSink.create` to create source
 @java[The data is converted to and from JSON by Jackson's ObjectMapper.]
 
 Scala
-: @@snip 
[snip](/elasticsearch/src/test/scala/docs/scaladsl/OpensearchV1Spec.scala) { 
#run-typed }
+: @@snip 
[snip](/elasticsearch/src/test/scala/docs/scaladsl/OpensearchSpec.scala) { 
#run-typed }
 
 Java
-: @@snip 
[snip](/elasticsearch/src/test/java/docs/javadsl/OpensearchV1Test.java) { 
#run-typed }
+: @@snip 
[snip](/elasticsearch/src/test/java/docs/javadsl/Opensearch2Test.java) { 
#run-typed }
 
 ### With JSON source
 
 Use `ElasticsearchSource.create` and `ElasticsearchSink.create` to create 
source and sink.
 
 Scala
-: @@snip 
[snip](/elasticsearch/src/test/scala/docs/scaladsl/OpensearchV1Spec.scala) { 
#run-jsobject }
+: @@snip 
[snip](/elasticsearch/src/test/scala/docs/scaladsl/OpensearchSpec.scala) { 
#run-jsobject }
 
 Java
-: @@snip 
[snip](/elasticsearch/src/test/java/docs/javadsl/OpensearchV1Test.java) { 
#run-jsobject }
+: @@snip 
[snip](/elasticsearch/src/test/java/docs/javadsl/Opensearch2Test.java) { 
#run-jsobject }
 
 
 ### Writing to Opensearch
@@ -103,10 +103,10 @@ In the above examples, `WriteMessage` is used as the 
input to `ElasticsearchSink
 | WriteMessage.createDeleteMessage  | Delete an existing document. If there is 
no document with the specified `id`, do nothing.            |
 
 Scala
-: @@snip 
[snip](/elasticsearch/src/test/scala/docs/scaladsl/OpensearchV1Spec.scala) { 
#multiple-operations }
+: @@snip 
[snip](/elasticsearch/src/test/scala/docs/scaladsl/OpensearchSpec.scala) { 
#multiple-operations }
 
 Java
-: @@snip 
[snip](/elasticsearch/src/test/java/docs/javadsl/OpensearchV1Test.java) { 
#multiple-operations }
+: @@snip 
[snip](/elasticsearch/src/test/java/docs/javadsl/Opensearch2Test.java) { 
#multiple-operations }
 
 ### Source configuration
 
@@ -174,7 +174,7 @@ This will be used to:
 1. transform the bulk request into a format understood by the corresponding 
Opensearch server.
 2. determine whether to include the index type mapping in the API calls. See 
[removal of 
types](https://www.elastic.co/guide/en/elasticsearch/reference/current/removal-of-types.html)
 
-Currently 
[`V1`](https://opensearch.org/docs/1.3/opensearch/rest-api/document-apis/bulk/) 
is supported specifically but this parameter does not need to match the server 
version exactly (for example, `V1` should also work with Opensearch 2.x).
+Currently 
[`V1`](https://opensearch.org/docs/latest/api-reference/document-apis/bulk/) is 
supported specifically but this parameter does not need to match the server 
version exactly (for example, `V1` also works with Opensearch 2.x and 3.x, 
which the connector is tested against).
 
 ### Allow explicit index
 
@@ -186,10 +186,10 @@ You can also build flow stages with 
@apidoc[ElasticsearchFlow$].
 The API is similar to creating Sinks.
 
 Scala
-: @@snip 
[snip](/elasticsearch/src/test/scala/docs/scaladsl/OpensearchV1Spec.scala) { 
#run-flow }
+: @@snip 
[snip](/elasticsearch/src/test/scala/docs/scaladsl/OpensearchSpec.scala) { 
#run-flow }
 
 Java
-: @@snip 
[snip](/elasticsearch/src/test/java/docs/javadsl/OpensearchV1Test.java) { 
#run-flow }
+: @@snip 
[snip](/elasticsearch/src/test/java/docs/javadsl/Opensearch2Test.java) { 
#run-flow }
 
 
 ### Storing documents from Strings
@@ -197,10 +197,10 @@ Java
 Opensearch requires the documents to be properly formatted JSON. If your data 
is available as JSON in Strings, you may use the pre-defined 
`StringMessageWriter` to avoid any conversions. For any other JSON 
technologies, implement a @scala[`MessageWriter[T]`]@java[`MessageWriter<T>`].
 
 Scala
-: @@snip 
[snip](/elasticsearch/src/test/scala/docs/scaladsl/OpensearchV1Spec.scala) { 
#string }
+: @@snip 
[snip](/elasticsearch/src/test/scala/docs/scaladsl/OpensearchSpec.scala) { 
#string }
 
 Java
-: @@snip 
[snip](/elasticsearch/src/test/java/docs/javadsl/OpensearchV1Test.java) { 
#string }
+: @@snip 
[snip](/elasticsearch/src/test/java/docs/javadsl/Opensearch2Test.java) { 
#string }
 
 
 
@@ -209,10 +209,10 @@ Java
 When streaming documents from Kafka, you might want to commit to Kafka 
**AFTER** the document has been written to Opensearch.
 
 Scala
-: @@snip 
[snip](/elasticsearch/src/test/scala/docs/scaladsl/OpensearchV1Spec.scala) { 
#kafka-example }
+: @@snip 
[snip](/elasticsearch/src/test/scala/docs/scaladsl/OpensearchSpec.scala) { 
#kafka-example }
 
 Java
-: @@snip 
[snip](/elasticsearch/src/test/java/docs/javadsl/OpensearchV1Test.java) { 
#kafka-example }
+: @@snip 
[snip](/elasticsearch/src/test/java/docs/javadsl/Opensearch2Test.java) { 
#kafka-example }
 
 
 ### Specifying custom index-name for every document
@@ -221,7 +221,7 @@ When working with index-patterns using wildcards, you might 
need to specify a cu
 index-name for each document:
 
 Scala
-: @@snip 
[snip](/elasticsearch/src/test/scala/docs/scaladsl/OpensearchV1Spec.scala) { 
#custom-index-name-example }
+: @@snip 
[snip](/elasticsearch/src/test/scala/docs/scaladsl/OpensearchSpec.scala) { 
#custom-index-name-example }
 
 Java
 : @@snip 
[snip](/elasticsearch/src/test/java/docs/javadsl/OpensearchParameterizedTest.java)
 { #custom-index-name-example }
@@ -245,10 +245,10 @@ The easiest way of using Opensearch-source, is to just 
specify the query-param.
 like specifying which fields to return and so on. In such cases you can 
instead use 'searchParams' instead:
 
 Scala
-: @@snip 
[snip](/elasticsearch/src/test/scala/docs/scaladsl/OpensearchV1Spec.scala) { 
#custom-search-params }
+: @@snip 
[snip](/elasticsearch/src/test/scala/docs/scaladsl/OpensearchSpec.scala) { 
#custom-search-params }
 
 Java
-: @@snip 
[snip](/elasticsearch/src/test/java/docs/javadsl/OpensearchV1Test.java) { 
#custom-search-params }
+: @@snip 
[snip](/elasticsearch/src/test/java/docs/javadsl/Opensearch2Test.java) { 
#custom-search-params }
 
 
 #### Routing
diff --git a/elasticsearch/src/test/java/docs/javadsl/OpensearchV1Test.java 
b/elasticsearch/src/test/java/docs/javadsl/Opensearch2Test.java
similarity index 99%
rename from elasticsearch/src/test/java/docs/javadsl/OpensearchV1Test.java
rename to elasticsearch/src/test/java/docs/javadsl/Opensearch2Test.java
index c9b94d92b..5d9695cad 100644
--- a/elasticsearch/src/test/java/docs/javadsl/OpensearchV1Test.java
+++ b/elasticsearch/src/test/java/docs/javadsl/Opensearch2Test.java
@@ -32,7 +32,7 @@ import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 
-public class OpensearchV1Test extends ElasticsearchTestBase {
+public class Opensearch2Test extends ElasticsearchTestBase {
   @BeforeAll
   public static void setup() throws IOException {
     setupBase();
diff --git 
a/elasticsearch/src/test/java/docs/javadsl/OpensearchParameterizedTest.java 
b/elasticsearch/src/test/java/docs/javadsl/OpensearchParameterizedTest.java
index 477df6585..fbf46bd8e 100644
--- a/elasticsearch/src/test/java/docs/javadsl/OpensearchParameterizedTest.java
+++ b/elasticsearch/src/test/java/docs/javadsl/OpensearchParameterizedTest.java
@@ -38,7 +38,8 @@ public class OpensearchParameterizedTest extends 
ElasticsearchTestBase {
   private OpensearchApiVersion apiVersion;
 
   public static Stream<Arguments> data() {
-    return Stream.of(Arguments.of(9203, OpensearchApiVersion.V1));
+    return Stream.of(
+        Arguments.of(9203, OpensearchApiVersion.V1), Arguments.of(9204, 
OpensearchApiVersion.V1));
   }
 
   @AfterEach
diff --git a/elasticsearch/src/test/scala/docs/scaladsl/OpensearchV1Spec.scala 
b/elasticsearch/src/test/scala/docs/scaladsl/OpensearchSpec.scala
similarity index 97%
rename from elasticsearch/src/test/scala/docs/scaladsl/OpensearchV1Spec.scala
rename to elasticsearch/src/test/scala/docs/scaladsl/OpensearchSpec.scala
index 5bba48a91..050abed40 100644
--- a/elasticsearch/src/test/scala/docs/scaladsl/OpensearchV1Spec.scala
+++ b/elasticsearch/src/test/scala/docs/scaladsl/OpensearchSpec.scala
@@ -35,10 +35,9 @@ import spray.json.jsonReader
 import scala.concurrent.Future
 import spray.json._
 
-class OpensearchV1Spec extends ElasticsearchSpecBase with 
ElasticsearchSpecUtils {
+abstract class OpensearchSpec(baseUrl: String) extends ElasticsearchSpecBase 
with ElasticsearchSpecUtils {
 
-  private val connectionSettings: ElasticsearchConnectionSettings = 
OpensearchConnectionSettings(
-    "http://localhost:9203";)
+  private val connectionSettings: ElasticsearchConnectionSettings = 
OpensearchConnectionSettings(baseUrl)
   private val baseSourceSettings = 
OpensearchSourceSettings(connectionSettings).withApiVersion(OpensearchApiVersion.V1)
   private val baseWriteSettings = 
OpensearchWriteSettings(connectionSettings).withApiVersion(OpensearchApiVersion.V1)
 
@@ -421,7 +420,8 @@ class OpensearchV1Spec extends ElasticsearchSpecBase with 
ElasticsearchSpecUtils
       // Assert no errors except a missing document for a update request
       val errorMessages = results.flatMap(_.errorReason)
       errorMessages should have size 1
-      errorMessages.head shouldEqual "[_doc][00004]: document missing"
+      // Opensearch 2.x dropped mapping types, so the error reason no longer 
carries a `[_doc]` prefix
+      errorMessages.head shouldEqual "[00004]: document missing"
       flushAndRefresh(connectionSettings, indexName)
 
       // Assert docs in sink8/_doc
@@ -527,3 +527,7 @@ class OpensearchV1Spec extends ElasticsearchSpecBase with 
ElasticsearchSpecUtils
     }
   }
 }
+
+class Opensearch2Spec extends OpensearchSpec("http://localhost:9203";)
+
+class Opensearch3Spec extends OpensearchSpec("http://localhost:9204";)


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to