From c786143f9e606c47adc7b7bc5260462b45478809 Mon Sep 17 00:00:00 2001 From: Xun Guo Date: Fri, 22 Dec 2023 16:53:18 +0800 Subject: [PATCH] Add DockerClickhouseService to facilitate clickhouse integration in docker --- README.md | 4 +-- build.sbt | 3 +- .../docker/testkit/DockerReadyChecker.scala | 2 ++ .../testkit/DockerClickhouseService.scala | 33 +++++++++++++++++++ .../testkit/test/ClickhouseServiceTest.scala | 12 +++++++ 5 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 samples/src/main/scala/com/whisk/docker/testkit/DockerClickhouseService.scala create mode 100644 tests/src/test/scala/com/whisk/docker/testkit/test/ClickhouseServiceTest.scala diff --git a/README.md b/README.md index e3bdf97..523d69e 100644 --- a/README.md +++ b/README.md @@ -40,8 +40,8 @@ export DOCKER_HOST=unix:///var/run/docker.sock - [Mongodb](https://github.com/whisklabs/docker-it-scala/blob/master/samples/src/main/scala/com/whisk/docker/testkit/DockerMongodbService.scala) - [MySQL](https://github.com/whisklabs/docker-it-scala/blob/master/samples/src/main/scala/com/whisk/docker/testkit/DockerMysqlService.scala) - [Postgres](https://github.com/whisklabs/docker-it-scala/blob/master/samples/src/main/scala/com/whisk/docker/testkit/DockerPostgresService.scala) +- [Clickhouse](https://github.com/whisklabs/docker-it-scala/blob/master/samples/src/main/scala/com/whisk/docker/testkit/DockerClickhouseService.scala) - [Multi container test](https://github.com/whisklabs/docker-it-scala/blob/master/tests/src/test/scala/com/whisk/docker/testkit/test/MultiContainerTest.scala) - # Defining Containers There are two ways to define a docker container. @@ -76,7 +76,7 @@ You can check [usage example](https://github.com/whisklabs/docker-it-scala/blob/ - Mongodb => `docker.mongo` - Neo4j => `docker.mysql` - Postgres => `docker.postgres` - +- Clickhouse => `docker.clickhouse` ### Fields - `image-name` required (String) diff --git a/build.sbt b/build.sbt index 5650d0b..b2532e6 100644 --- a/build.sbt +++ b/build.sbt @@ -75,7 +75,8 @@ lazy val tests = name := "docker-testkit-tests", libraryDependencies ++= Seq( "org.postgresql" % "postgresql" % "42.1.4" % "test", - "mysql" % "mysql-connector-java" % "5.1.44" % "test" + "mysql" % "mysql-connector-java" % "5.1.44" % "test", + "com.clickhouse" % "clickhouse-jdbc" % "0.5.0" % "test" ) ) .dependsOn(core, scalatest, samples % "test") diff --git a/core/src/main/scala/com/whisk/docker/testkit/DockerReadyChecker.scala b/core/src/main/scala/com/whisk/docker/testkit/DockerReadyChecker.scala index f8793da..8c3ed0d 100644 --- a/core/src/main/scala/com/whisk/docker/testkit/DockerReadyChecker.scala +++ b/core/src/main/scala/com/whisk/docker/testkit/DockerReadyChecker.scala @@ -198,6 +198,8 @@ object DockerReadyChecker { "mysql" } else if (driverLower.contains("postgres")) { "postgresql" + } else if (driverLower.contains("clickhouse")) { + "clickhouse" } else { throw new IllegalArgumentException("unsupported database for ready check") } diff --git a/samples/src/main/scala/com/whisk/docker/testkit/DockerClickhouseService.scala b/samples/src/main/scala/com/whisk/docker/testkit/DockerClickhouseService.scala new file mode 100644 index 0000000..d88517d --- /dev/null +++ b/samples/src/main/scala/com/whisk/docker/testkit/DockerClickhouseService.scala @@ -0,0 +1,33 @@ +package com.whisk.docker.testkit + +import com.spotify.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) + + def ClickhouseAdvertisedPort = 8123 + def ClickhouseExposedPort = 8123 + + val ClickhouseUser = "default" + val ClickhousePassword = "" + + val clickhouseContainer = ContainerSpec("clickhouse/clickhouse-server:23.6") + .withEnv(s"CLICKHOUSE_USER=$ClickhouseUser", s"CLICKHOUSE_PASSWORD=$ClickhousePassword") + .withPortBindings((ClickhouseAdvertisedPort, PortBinding.of("0.0.0.0", ClickhouseExposedPort))) + .withReadyChecker( + DockerReadyChecker + .Jdbc( + driverClass = "com.clickhouse.jdbc.ClickHouseDriver", + user = ClickhouseUser, + password = Some(ClickhousePassword) + ) + .looped(15, 1.second) + ) + .toContainer + + override val managedContainers: ManagedContainers = clickhouseContainer.toManagedContainer +} diff --git a/tests/src/test/scala/com/whisk/docker/testkit/test/ClickhouseServiceTest.scala b/tests/src/test/scala/com/whisk/docker/testkit/test/ClickhouseServiceTest.scala new file mode 100644 index 0000000..f89d312 --- /dev/null +++ b/tests/src/test/scala/com/whisk/docker/testkit/test/ClickhouseServiceTest.scala @@ -0,0 +1,12 @@ +package com.whisk.docker.testkit.test + +import com.whisk.docker.testkit.{ContainerState, DockerClickhouseService} +import org.scalatest.funsuite.AnyFunSuite + +class ClickhouseServiceTest extends AnyFunSuite with DockerClickhouseService { + test("test container started") { + assert(clickhouseContainer.state().isInstanceOf[ContainerState.Ready], "clickhouse is ready") + assert(clickhouseContainer.mappedPortOpt(ClickhouseAdvertisedPort) === Some(ClickhouseExposedPort), + "clickhouse port exposed") + } +}