From 57ea3ac683cae4d8c964d5ac42bfa388ad9ef7d6 Mon Sep 17 00:00:00 2001 From: Colt Frederickson Date: Tue, 20 May 2025 11:43:36 -0600 Subject: [PATCH 1/7] Update to the new docker client --- README.md | 5 +---- build.sbt | 10 +++++----- .../whisk/docker/testkit/BaseContainer.scala | 2 +- .../testkit/ContainerCommandExecutor.scala | 15 +++++++-------- .../whisk/docker/testkit/ContainerSpec.scala | 4 ++-- .../testkit/DockerContainerManager.scala | 4 ++-- .../testkit/DockerClickhouseService.scala | 19 ++++++++++--------- .../testkit/DockerPostgresService.scala | 2 +- .../scalatest/DockerTestKitForAll.scala | 5 +++-- 9 files changed, 32 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index 523d69e..733ace7 100644 --- a/README.md +++ b/README.md @@ -11,9 +11,6 @@ You can read about reasoning behind it at [Finely Distributed](https://finelydis ## Setup -docker-it-scala works with Spotify's docker-client to communicate to docker engine through *REST API* or *unix socket*. -- [Spotify's docker-client](https://github.com/spotify/docker-client) (used in Whisk) - ```scala libraryDependencies ++= Seq( "com.whisk" %% "docker-testkit-scalatest" % "0.11.0" % "test" @@ -145,4 +142,4 @@ class MultiContainerTest assert(mongodbContainer.mappedPortOpt(27017).nonEmpty, "port 2017 is exposed") } } -``` \ No newline at end of file +``` diff --git a/build.sbt b/build.sbt index 48b0d09..ecca536 100644 --- a/build.sbt +++ b/build.sbt @@ -1,8 +1,8 @@ lazy val commonSettings = Seq( organization := "com.whisk", - version := "0.12.0", - scalaVersion := "2.13.6", - crossScalaVersions := Seq("2.13.6", "2.12.15", "2.11.12", "3.0.2"), + version := "0.13.0-PRE", + scalaVersion := "2.13.16", + crossScalaVersions := Seq("2.13.16", "2.12.15", "2.11.12", "3.0.2"), scalacOptions ++= Seq("-feature", "-deprecation"), Test / fork := true, licenses += ("MIT", url("http://opensource.org/licenses/MIT")), @@ -45,7 +45,7 @@ lazy val core = name := "docker-testkit-core", libraryDependencies ++= Seq( "org.slf4j" % "slf4j-api" % "1.7.25", - "com.spotify" % "docker-client" % "8.16.0", + "org.mandas" % "docker-client" % "9.0.3", "com.google.code.findbugs" % "jsr305" % "3.0.1" ) ) @@ -89,7 +89,7 @@ lazy val coreShaded = name := "docker-testkit-core-shaded", libraryDependencies ++= Seq( - "com.spotify" % "docker-client" % "8.16.0" classifier "shaded", + "org.mandas" % "docker-client" % "9.0.3", "com.google.code.findbugs" % "jsr305" % "3.0.1" ), target := baseDirectory.value / "target-shaded" diff --git a/core/src/main/scala/com/whisk/docker/testkit/BaseContainer.scala b/core/src/main/scala/com/whisk/docker/testkit/BaseContainer.scala index 8590792..60e1ee0 100644 --- a/core/src/main/scala/com/whisk/docker/testkit/BaseContainer.scala +++ b/core/src/main/scala/com/whisk/docker/testkit/BaseContainer.scala @@ -2,7 +2,7 @@ package com.whisk.docker.testkit import java.util.concurrent.atomic.AtomicReference -import com.spotify.docker.client.messages.ContainerInfo +import org.mandas.docker.client.messages.ContainerInfo import org.slf4j.LoggerFactory import scala.collection.JavaConverters._ diff --git a/core/src/main/scala/com/whisk/docker/testkit/ContainerCommandExecutor.scala b/core/src/main/scala/com/whisk/docker/testkit/ContainerCommandExecutor.scala index a6307b4..c914a2c 100644 --- a/core/src/main/scala/com/whisk/docker/testkit/ContainerCommandExecutor.scala +++ b/core/src/main/scala/com/whisk/docker/testkit/ContainerCommandExecutor.scala @@ -3,12 +3,12 @@ package com.whisk.docker.testkit import java.nio.charset.StandardCharsets import java.util.concurrent.TimeUnit -import com.google.common.io.Closeables -import com.spotify.docker.client.DockerClient.{AttachParameter, RemoveContainerParam} -import com.spotify.docker.client.messages._ -import com.spotify.docker.client.{DockerClient, LogMessage, LogStream} +import org.mandas.docker.client.DockerClient.{AttachParameter, RemoveContainerParam} +import org.mandas.docker.client.messages._ +import org.mandas.docker.client.{DockerClient, LogMessage, LogStream} import scala.concurrent.{ExecutionContext, Future, Promise} +import scala.util.Try class StartFailedException(msg: String) extends Exception(msg) @@ -90,7 +90,7 @@ class ContainerCommandExecutor(val client: DockerClient) { val str = StandardCharsets.US_ASCII.decode(t.content()).toString if (f(str)) { p.trySuccess(()) - Closeables.close(stream, true) + Try(client.close()) } } }) @@ -113,7 +113,6 @@ class ContainerCommandExecutor(val client: DockerClient) { ) } - def close(): Unit = { - Closeables.close(client, true) - } + def close(): Unit = Try(client.close()) + } diff --git a/core/src/main/scala/com/whisk/docker/testkit/ContainerSpec.scala b/core/src/main/scala/com/whisk/docker/testkit/ContainerSpec.scala index a7a387c..fff77f1 100644 --- a/core/src/main/scala/com/whisk/docker/testkit/ContainerSpec.scala +++ b/core/src/main/scala/com/whisk/docker/testkit/ContainerSpec.scala @@ -2,8 +2,8 @@ package com.whisk.docker.testkit import java.util.Collections -import com.spotify.docker.client.messages.{ContainerConfig, HostConfig, PortBinding} -import com.spotify.docker.client.messages.HostConfig.Bind +import org.mandas.docker.client.messages.{ContainerConfig, HostConfig, PortBinding} +import org.mandas.docker.client.messages.HostConfig.Bind import scala.collection.JavaConverters._ diff --git a/core/src/main/scala/com/whisk/docker/testkit/DockerContainerManager.scala b/core/src/main/scala/com/whisk/docker/testkit/DockerContainerManager.scala index f410eb9..0a69c01 100644 --- a/core/src/main/scala/com/whisk/docker/testkit/DockerContainerManager.scala +++ b/core/src/main/scala/com/whisk/docker/testkit/DockerContainerManager.scala @@ -2,8 +2,8 @@ package com.whisk.docker.testkit import java.util.concurrent.{ConcurrentHashMap, TimeUnit} -import com.spotify.docker.client.exceptions.ImageNotFoundException -import com.spotify.docker.client.messages.ContainerCreation +import org.mandas.docker.client.exceptions.ImageNotFoundException +import org.mandas.docker.client.messages.ContainerCreation import org.slf4j.LoggerFactory import scala.concurrent.{Await, ExecutionContext, Future} diff --git a/samples/src/main/scala/com/whisk/docker/testkit/DockerClickhouseService.scala b/samples/src/main/scala/com/whisk/docker/testkit/DockerClickhouseService.scala index d88517d..7f221dd 100644 --- a/samples/src/main/scala/com/whisk/docker/testkit/DockerClickhouseService.scala +++ b/samples/src/main/scala/com/whisk/docker/testkit/DockerClickhouseService.scala @@ -1,13 +1,14 @@ package com.whisk.docker.testkit -import com.spotify.docker.client.messages.PortBinding +import org.mandas.docker.client.messages.PortBinding import com.whisk.docker.testkit.scalatest.DockerTestKitForAll import org.scalatest.Suite import scala.concurrent.duration._ trait DockerClickhouseService extends DockerTestKitForAll { self: Suite => - override val dockerTestTimeouts: DockerTestTimeouts = DockerTestTimeouts(pull = 10.minutes, init = 10.minutes, stop = 1.minutes) + override val dockerTestTimeouts: DockerTestTimeouts = + DockerTestTimeouts(pull = 10.minutes, init = 10.minutes, stop = 1.minutes) def ClickhouseAdvertisedPort = 8123 def ClickhouseExposedPort = 8123 @@ -20,14 +21,14 @@ trait DockerClickhouseService extends DockerTestKitForAll { self: Suite => .withPortBindings((ClickhouseAdvertisedPort, PortBinding.of("0.0.0.0", ClickhouseExposedPort))) .withReadyChecker( DockerReadyChecker - .Jdbc( - driverClass = "com.clickhouse.jdbc.ClickHouseDriver", - user = ClickhouseUser, - password = Some(ClickhousePassword) - ) + .Jdbc( + driverClass = "com.clickhouse.jdbc.ClickHouseDriver", + user = ClickhouseUser, + password = Some(ClickhousePassword) + ) .looped(15, 1.second) - ) - .toContainer + ) + .toContainer override val managedContainers: ManagedContainers = clickhouseContainer.toManagedContainer } diff --git a/samples/src/main/scala/com/whisk/docker/testkit/DockerPostgresService.scala b/samples/src/main/scala/com/whisk/docker/testkit/DockerPostgresService.scala index 2eb0fb0..be9ac86 100644 --- a/samples/src/main/scala/com/whisk/docker/testkit/DockerPostgresService.scala +++ b/samples/src/main/scala/com/whisk/docker/testkit/DockerPostgresService.scala @@ -1,6 +1,6 @@ package com.whisk.docker.testkit -import com.spotify.docker.client.messages.PortBinding +import org.mandas.docker.client.messages.PortBinding import com.whisk.docker.testkit.scalatest.DockerTestKitForAll import org.scalatest.Suite diff --git a/scalatest/src/main/scala/com/whisk/docker/testkit/scalatest/DockerTestKitForAll.scala b/scalatest/src/main/scala/com/whisk/docker/testkit/scalatest/DockerTestKitForAll.scala index b13d5ec..6d9bb17 100644 --- a/scalatest/src/main/scala/com/whisk/docker/testkit/scalatest/DockerTestKitForAll.scala +++ b/scalatest/src/main/scala/com/whisk/docker/testkit/scalatest/DockerTestKitForAll.scala @@ -2,16 +2,17 @@ package com.whisk.docker.testkit.scalatest import java.util.concurrent.ForkJoinPool -import com.spotify.docker.client.{DefaultDockerClient, DockerClient} +import org.mandas.docker.client.{DockerClient} import com.whisk.docker.testkit._ import org.scalatest.{Args, Status, Suite, SuiteMixin} import scala.concurrent.ExecutionContext import scala.language.implicitConversions +import org.mandas.docker.client.builder.DockerClientBuilder trait DockerTestKitForAll extends SuiteMixin { self: Suite => - val dockerClient: DockerClient = DefaultDockerClient.fromEnv().build() + val dockerClient: DockerClient = DockerClientBuilder.fromEnv().build(); val dockerExecutionContext: ExecutionContext = ExecutionContext.fromExecutor(new ForkJoinPool()) From 03e301c6f917cac8769c2c3b23947cd7f4cd6c1a Mon Sep 17 00:00:00 2001 From: Colt Frederickson Date: Tue, 20 May 2025 11:44:59 -0600 Subject: [PATCH 2/7] fix version number --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index ecca536..728fb98 100644 --- a/build.sbt +++ b/build.sbt @@ -1,6 +1,6 @@ lazy val commonSettings = Seq( organization := "com.whisk", - version := "0.13.0-PRE", + version := "0.13.0", scalaVersion := "2.13.16", crossScalaVersions := Seq("2.13.16", "2.12.15", "2.11.12", "3.0.2"), scalacOptions ++= Seq("-feature", "-deprecation"), From 049bbc0b69abc1d8a08b3ecfe9222f52e2ff8ed5 Mon Sep 17 00:00:00 2001 From: Colt Frederickson Date: Tue, 20 May 2025 12:03:09 -0600 Subject: [PATCH 3/7] Try to fix ci --- .github/workflows/ci.yaml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index f459406..b2e8d3a 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -7,10 +7,12 @@ jobs: steps: - name: Checkout uses: actions/checkout@v2 - - name: Setup JDK - uses: actions/setup-java@v2 + - name: Cache + uses: coursier/cache-action@v6 + - name: Setup SBT + uses: coursier/setup-action@v1 with: - distribution: temurin - java-version: 11 + apps: sbt + jvm: adopt:11 - name: Build and Test run: sbt -v +test From 34a484190bf4ce795139b705744498b631b5d2fc Mon Sep 17 00:00:00 2001 From: Colt Frederickson Date: Tue, 20 May 2025 12:09:00 -0600 Subject: [PATCH 4/7] Try to update the build.sbt --- build.sbt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 728fb98..fbb2f3b 100644 --- a/build.sbt +++ b/build.sbt @@ -3,7 +3,8 @@ lazy val commonSettings = Seq( version := "0.13.0", scalaVersion := "2.13.16", crossScalaVersions := Seq("2.13.16", "2.12.15", "2.11.12", "3.0.2"), - scalacOptions ++= Seq("-feature", "-deprecation"), + scalacOptions ++= Seq("-feature", "-deprecation", "-target:jvm-11"), + javacOptions ++= Seq("-source", "11", "-target", "11"), Test / fork := true, licenses += ("MIT", url("http://opensource.org/licenses/MIT")), sonatypeProfileName := "com.whisk", From dae199cd30703ca049cd4c37937d3c5839b36e5f Mon Sep 17 00:00:00 2001 From: Colt Frederickson Date: Tue, 20 May 2025 12:11:41 -0600 Subject: [PATCH 5/7] Dropping 2.11 support --- build.sbt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/build.sbt b/build.sbt index fbb2f3b..0f03e0b 100644 --- a/build.sbt +++ b/build.sbt @@ -2,9 +2,8 @@ lazy val commonSettings = Seq( organization := "com.whisk", version := "0.13.0", scalaVersion := "2.13.16", - crossScalaVersions := Seq("2.13.16", "2.12.15", "2.11.12", "3.0.2"), - scalacOptions ++= Seq("-feature", "-deprecation", "-target:jvm-11"), - javacOptions ++= Seq("-source", "11", "-target", "11"), + crossScalaVersions := Seq("2.13.16", "2.12.15", "3.0.2"), + scalacOptions ++= Seq("-feature", "-deprecation"), Test / fork := true, licenses += ("MIT", url("http://opensource.org/licenses/MIT")), sonatypeProfileName := "com.whisk", From 199b580392ffa62f36b26293104cf78713624bdb Mon Sep 17 00:00:00 2001 From: Colt Frederickson Date: Tue, 20 May 2025 12:14:54 -0600 Subject: [PATCH 6/7] update 2.12 version --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 0f03e0b..02e5ef0 100644 --- a/build.sbt +++ b/build.sbt @@ -2,7 +2,7 @@ lazy val commonSettings = Seq( organization := "com.whisk", version := "0.13.0", scalaVersion := "2.13.16", - crossScalaVersions := Seq("2.13.16", "2.12.15", "3.0.2"), + crossScalaVersions := Seq("2.13.16", "2.12.20", "3.0.2"), scalacOptions ++= Seq("-feature", "-deprecation"), Test / fork := true, licenses += ("MIT", url("http://opensource.org/licenses/MIT")), From ad7c20202441b13dfda09b92588642e89e6fd558 Mon Sep 17 00:00:00 2001 From: Colt Frederickson Date: Tue, 20 May 2025 13:23:21 -0600 Subject: [PATCH 7/7] Fix build issue for scala 3 --- build.sbt | 33 ++++++++++++++----- .../testkit/ContainerCommandExecutor.scala | 12 +++++-- 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/build.sbt b/build.sbt index 02e5ef0..fbc3277 100644 --- a/build.sbt +++ b/build.sbt @@ -2,7 +2,7 @@ lazy val commonSettings = Seq( organization := "com.whisk", version := "0.13.0", scalaVersion := "2.13.16", - crossScalaVersions := Seq("2.13.16", "2.12.20", "3.0.2"), + crossScalaVersions := Seq("2.13.16", "2.12.20", "3.7.0"), scalacOptions ++= Seq("-feature", "-deprecation"), Test / fork := true, licenses += ("MIT", url("http://opensource.org/licenses/MIT")), @@ -43,11 +43,19 @@ lazy val core = .settings(commonSettings: _*) .settings( name := "docker-testkit-core", - libraryDependencies ++= Seq( - "org.slf4j" % "slf4j-api" % "1.7.25", - "org.mandas" % "docker-client" % "9.0.3", - "com.google.code.findbugs" % "jsr305" % "3.0.1" - ) + libraryDependencies ++= { + val base = Seq( + "org.slf4j" % "slf4j-api" % "1.7.25", + "org.mandas" % "docker-client" % "9.0.3", + "com.google.code.findbugs" % "jsr305" % "3.0.1" + ) + CrossVersion.partialVersion(scalaVersion.value) match { + case Some((3, _)) => + base :+ ("org.immutables" % "value" % "2.9.3" % Provided) + case _ => + base + } + } ) lazy val scalatest = @@ -87,10 +95,17 @@ lazy val coreShaded = .settings(commonSettings: _*) .settings( name := "docker-testkit-core-shaded", - libraryDependencies ++= - Seq( + libraryDependencies ++= { + val base = Seq( "org.mandas" % "docker-client" % "9.0.3", "com.google.code.findbugs" % "jsr305" % "3.0.1" - ), + ) + CrossVersion.partialVersion(scalaVersion.value) match { + case Some((3, _)) => + base :+ ("org.immutables" % "value" % "2.9.3" % Provided) + case _ => + base + } + }, target := baseDirectory.value / "target-shaded" ) diff --git a/core/src/main/scala/com/whisk/docker/testkit/ContainerCommandExecutor.scala b/core/src/main/scala/com/whisk/docker/testkit/ContainerCommandExecutor.scala index c914a2c..110ab75 100644 --- a/core/src/main/scala/com/whisk/docker/testkit/ContainerCommandExecutor.scala +++ b/core/src/main/scala/com/whisk/docker/testkit/ContainerCommandExecutor.scala @@ -3,7 +3,7 @@ package com.whisk.docker.testkit import java.nio.charset.StandardCharsets import java.util.concurrent.TimeUnit -import org.mandas.docker.client.DockerClient.{AttachParameter, RemoveContainerParam} +import org.mandas.docker.client.DockerClient.RemoveContainerParam import org.mandas.docker.client.messages._ import org.mandas.docker.client.{DockerClient, LogMessage, LogStream} @@ -57,8 +57,14 @@ class ContainerCommandExecutor(val client: DockerClient) { private def logStreamFuture(id: String, withErr: Boolean)(implicit ec: ExecutionContext ): Future[LogStream] = { - val baseParams = List(AttachParameter.STDOUT, AttachParameter.STREAM, AttachParameter.LOGS) - val logParams = if (withErr) AttachParameter.STDERR :: baseParams else baseParams + val baseParams = List( + DockerClient.AttachParameter.STDOUT, + DockerClient.AttachParameter.STREAM, + DockerClient.AttachParameter.LOGS + ) + val logParams = + if (withErr) DockerClient.AttachParameter.STDERR :: baseParams + else baseParams Future(scala.concurrent.blocking(client.attachContainer(id, logParams: _*))) }