Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion project.clj
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
[clj-time "0.15.1"] ;; latest is 0.15.2
[org.clojure/clojure "1.11.2"] ;; lattest is 1.11.4 or 1.12.2
[org.apache.commons/commons-compress "1.28.0"] ;; see testcontainers
[org.testcontainers/testcontainers "1.21.3" ;; latest
[org.testcontainers/testcontainers "2.0.2" ;; latest
:exclusions [[org.apache.commons/commons-compress]]]]
Comment on lines +25 to 26
Copy link

@coderabbitai coderabbitai bot Nov 26, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

Script executed:

#!/bin/bash
# Find all references to testcontainers in the codebase
rg -in "testcontainers" -C2 --type=clj --type=java --type=gradle

Repository: nasa/Common-Metadata-Repository


<shell_result>
Repository: nasa/Common-Metadata-Repository
Exit code: 2

stderr:

unrecognized file type: clj

</shell_result>


Script executed:

#!/bin/bash
# Find all references to testcontainers without file type restriction
rg -in "testcontainers" -C2

Repository: nasa/Common-Metadata-Repository


<shell_result>
Repository: nasa/Common-Metadata-Repository
Exit code: 0

stdout:

project.clj-22-                          [clj-time "0.15.1"] ;; latest is 0.15.2
project.clj-23-                          [org.clojure/clojure "1.11.2"] ;; lattest is 1.11.4 or 1.12.2
project.clj:24:                          [org.apache.commons/commons-compress "1.28.0"] ;; see testcontainers
project.clj:25:                          [org.testcontainers/testcontainers "2.0.2" ;; latest
project.clj-26-                           :exclusions [[org.apache.commons/commons-compress]]]]
project.clj-27-  :profiles {:uberjar {:modules {:dirs ["access-control-app"
--
elastic-utils-lib/project.clj-16-                 [org.clojure/clojure]
elastic-utils-lib/project.clj-17-                 [org.elasticsearch/elasticsearch ~elastic-version]
elastic-utils-lib/project.clj:18:                 ;; testcontainers needs a newer version of commons-compress, for now
elastic-utils-lib/project.clj-19-                 ;; we will force it to use the latest version
elastic-utils-lib/project.clj-20-                 [org.apache.commons/commons-compress]
elastic-utils-lib/project.clj:21:                 [org.testcontainers/testcontainers]
elastic-utils-lib/project.clj-22-                 [org.yaml/snakeyaml "1.31"]
elastic-utils-lib/project.clj-23-                 [potemkin "0.4.5"]]
--
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj-7-  (:import
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj-8-   (java.time Duration)
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj:9:   (org.testcontainers.containers FixedHostPortGenericContainer Network)
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj:10:   (org.testcontainers.containers.wait.strategy Wait)
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj:11:   (org.testcontainers.images.builder ImageFromDockerfile)))
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj-12-
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj-13-(def ^:private elasticsearch-official-docker-image
--
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj-38-        image specified. Must specify dockerfile with key \"Dockerfile\" otherwise
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj-39-        uses default image. See:
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj:40:        https://www.testcontainers.org/features/creating_images/
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj-41-       kibana-port -> if provided will also bring up a kibana container to use with the
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj-42-        new elasticsearch node."
--
redis-utils-lib/project.clj-15-                 [nasa-cmr/cmr-common-lib "0.1.1-SNAPSHOT"]
redis-utils-lib/project.clj-16-                 [org.clojure/clojure]
redis-utils-lib/project.clj:17:                 ;; testcontainers needs a newer version of commons-compress, for now
redis-utils-lib/project.clj-18-                 ;; we will force it to use the latest version
redis-utils-lib/project.clj-19-                 [org.apache.commons/commons-compress]
redis-utils-lib/project.clj:20:                 [org.testcontainers/testcontainers]]
redis-utils-lib/project.clj-21-  :plugins [[lein-exec "0.3.7"]
redis-utils-lib/project.clj-22-            [lein-parent "0.3.9"]
--
message-queue-lib/project.clj-40-                 [org.clojure/clojure]
message-queue-lib/project.clj-41-                 [org.clojure/tools.reader "1.3.2"]
message-queue-lib/project.clj:42:                 ;; testcontainers needs a newer version of commons-compress, for now
message-queue-lib/project.clj-43-                 ;; we will force it to use the latest version
message-queue-lib/project.clj-44-                 [org.apache.commons/commons-compress]
message-queue-lib/project.clj:45:                 [org.testcontainers/testcontainers]
message-queue-lib/project.clj-46-
message-queue-lib/project.clj-47-                 [potemkin "0.4.5"]
--
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj-6-   [cmr.message-queue.config :as config])
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj-7-  (:import
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj:8:   (org.testcontainers.containers FixedHostPortGenericContainer Network)))
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj-9-
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj-10-(def ELASTIC_MQ_UI_PORT 9325)
--
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj-5-   [cmr.common.log :as log :refer [debug error]])
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj-6-  (:import
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj:7:   (org.testcontainers.containers FixedHostPortGenericContainer Network)))
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj-8-
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj-9-(def REDIS_DEFAULT_PORT 6379)

</shell_result>


Script executed:

#!/bin/bash
# Find test files that may use testcontainers
fd -e clj -path "*/test/*" | head -20

Repository: nasa/Common-Metadata-Repository


<shell_result>
Repository: nasa/Common-Metadata-Repository
Exit code: 0

stderr:

error: 'h' isn't a valid value for '--type <filetype>'
  [possible values: file, directory, symlink, executable, empty, socket, pipe]

For more information try '--help'

</shell_result>


Script executed:

#!/bin/bash
# Find test files that use testcontainers
find . -name "*test*.clj" -o -name "*_test.clj" | xargs rg -l "testcontainers" 2>/dev/null | head -10

Repository: nasa/Common-Metadata-Repository


<shell_result>
Repository: nasa/Common-Metadata-Repository
Exit code: 0

</shell_result>


Testcontainers 2.0.0 release notes breaking changes


<web_search_result>
Testcontainers Java 2.0.0 (released Oct 14, 2025) — breaking changes (summary):

  • Removed JUnit 4 support. [1]
  • All module artifact coordinates renamed/prefixed to testcontainers- (e.g., org.testcontainers:mysql → org.testcontainers:testcontainers-mysql). [1]
  • Container classes moved to module-specific packages (e.g., MySQLContainer → org.testcontainers.mysql). [1]
  • Add support for specifying Docker image in DockerComposeContainer and ComposeContainer (API change). [1]
  • Make Neo4jContainer generic and drop a deprecated method. [1]
  • Drop modules’ default constructors (constructors removed). [1]
  • Remove LinkableContainer from NginxContainer. [1]

Sources: GitHub release notes for testcontainers-java 2.0.0. [1] (github.com)

Citations:


Script executed:

#!/bin/bash
# Check how FixedHostPortGenericContainer is instantiated
rg "FixedHostPortGenericContainer" -A3 -B1

Repository: nasa/Common-Metadata-Repository


<shell_result>
Repository: nasa/Common-Metadata-Repository
Exit code: 0

stdout:

redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj-  (:import
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj:   (org.testcontainers.containers FixedHostPortGenericContainer Network)))
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj-
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj-(def REDIS_DEFAULT_PORT 6379)
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj-
--
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj-  [http-port network]
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj:  (doto (FixedHostPortGenericContainer. redis-image)
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj-    (.withFixedExposedPort (int http-port) REDIS_DEFAULT_PORT)
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj-    (.withNetwork network)))
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj-
--
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj-    (let [network (Network/newNetwork)
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj:          ^FixedHostPortGenericContainer redis (build-redis http-port network)]
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj-      (try
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj-        (.start redis)
redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj-        (assoc this :redis redis)
--
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj-  (:import
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj:   (org.testcontainers.containers FixedHostPortGenericContainer Network)))
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj-
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj-(def ELASTIC_MQ_UI_PORT 9325)
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj-
--
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj-  [http-port1 http-port2 network]
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj:  (-> (FixedHostPortGenericContainer. elasticmq-image)
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj-      (.withNetwork network)
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj-      (.withFixedExposedPort (Integer. http-port1) (Integer. http-port1))
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj-      (.withFixedExposedPort (Integer. http-port2) (Integer. http-port2))))
--
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj-    (let [network (Network/newNetwork)
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj:          ^FixedHostPortGenericContainer sqs-server (build-sqs-server queue-port ui-port network)]
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj-      (try
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj-        (.start sqs-server)
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj-        (assoc this :sqs-server sqs-server)
--
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj-   (java.time Duration)
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj:   (org.testcontainers.containers FixedHostPortGenericContainer Network)
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj-   (org.testcontainers.containers.wait.strategy Wait)
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj-   (org.testcontainers.images.builder ImageFromDockerfile)))
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj-
--
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj-  [http-port network]
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj:  (doto (FixedHostPortGenericContainer. kibana-official-docker-image)
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj-    (.withFixedExposedPort (int http-port) 5601)
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj-    (.withNetwork network)
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj-    (.withStartupTimeout (Duration/ofSeconds 240))))
--
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj-                 elasticsearch-official-docker-image)
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj:         container (FixedHostPortGenericContainer. image)
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj-         network (Network/newNetwork)
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj-         kibana (when kibana-port
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj-                  (build-kibana kibana-port network))]
--
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj-    (let [containers (build-node http-port opts)
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj:          ^FixedHostPortGenericContainer node (:elasticsearch containers)
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj:          ^FixedHostPortGenericContainer kibana (:kibana containers)]
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj-      (try
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj-        (.start node)
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj-        (when kibana
--
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj-    (let [containers (:containers this)
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj:          ^FixedHostPortGenericContainer node (:elasticsearch containers)
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj:          ^FixedHostPortGenericContainer kibana (:kibana containers)]
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj-      (when node
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj-        (.stop node))
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj-      (when (get-in this [:opts :data-dir])

</shell_result>


Testcontainers FixedHostPortGenericContainer constructor 2.0 changes


<web_search_result>
Short answer: In Testcontainers 2.0 the old no-arg / String-image constructors (including FixedHostPortGenericContainer(String)) are deprecated/removed — FixedHostPortGenericContainer remains deprecated (you should avoid fixed host ports) and container constructors now require a DockerImageName instance (e.g. new GenericContainer(DockerImageName.parse("image:tag"))). Also many container classes were moved to module-specific packages. See release notes and API docs for details. [1][2][3][4]

References

  • Testcontainers 2.x release notes (breaking changes: drop of module default/no-arg constructors, package moves). [1]
  • FixedHostPortGenericContainer API (marked deprecated; shows constructor deprecated). [2]
  • Testcontainers releases page (2.0.0 / 2.0.x changelog). [3]
  • Deprecated constructors list (calls out FixedHostPortGenericContainer(String) deprecation). [4]
    </web_search_result>

Major breaking API changes in Testcontainers 2.0.2 will cause compilation failures

The bump from 1.21.3 to 2.0.2 introduces breaking changes that will prevent the codebase from compiling:

  • FixedHostPortGenericContainer(String) constructor has been removed/deprecated in 2.0. The new API requires DockerImageName.parse("image:tag").
  • This affects three modules that currently use the old constructor syntax:
    • redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj(FixedHostPortGenericContainer. redis-image)
    • message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj(FixedHostPortGenericContainer. elasticmq-image)
    • elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj(FixedHostPortGenericContainer. image) (2 instances)

All constructor calls must be updated to use DockerImageName.parse() before this version bump will work.

🤖 Prompt for AI Agents
In project.clj around lines 25 to 26, the Testcontainers bump to 2.0.2 breaks
code that uses the removed FixedHostPortGenericContainer(String) constructor;
update every call that does (FixedHostPortGenericContainer.
<image-var-or-literal>) to pass a DockerImageName instance instead, e.g.
(FixedHostPortGenericContainer. (DockerImageName/parse <image-var-or-literal>));
update the three affected files
(redis-utils-lib/src/cmr/redis_utils/embedded_redis_server.clj,
message-queue-lib/src/cmr/message_queue/queue_server/embedded_sqs_server.clj,
elastic-utils-lib/src/cmr/elastic_utils/embedded_elastic_server.clj) and add an
import or fully-qualify DockerImageName
(org.testcontainers.utility.DockerImageName) where necessary.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FixedHostPortGenericContainer is deprecated but is not removed. No change needed for that

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧩 Analysis chain

🌐 Web query:

Testcontainers 2.0.2 FixedHostPortGenericContainer constructor String parameter

💡 Result:

Yes — Testcontainers 2.0.2 provides a FixedHostPortGenericContainer(String dockerImageName) constructor, but the constructor is marked deprecated (use of fixed host ports is discouraged). [1][2]

Sources:

  • Testcontainers 2.0.2 API index (FixedHostPortGenericContainer(String)). [1]
  • FixedHostPortGenericContainer Javadoc showing the constructor deprecated in later 1.x docs. [2]

@TylerHeald1, you're absolutely right! I apologize for the confusion. The FixedHostPortGenericContainer(String) constructor is indeed still available in Testcontainers 2.0.2, though it's marked as deprecated. The version bump from 1.21.3 to 2.0.2 should work without requiring any code changes to the constructor calls.

Thank you for the clarification—the upgrade can proceed as-is! 👍

:profiles {:uberjar {:modules {:dirs ["access-control-app"
"bootstrap-app"
Expand Down