Skip to content

Commit 6ad2022

Browse files
authored
Add DockerClickhouseService to facilitate clickhouse integration in docker (#152)
1 parent 306cdbb commit 6ad2022

File tree

5 files changed

+51
-3
lines changed

5 files changed

+51
-3
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ export DOCKER_HOST=unix:///var/run/docker.sock
4040
- [Mongodb](https://github.com/whisklabs/docker-it-scala/blob/master/samples/src/main/scala/com/whisk/docker/testkit/DockerMongodbService.scala)
4141
- [MySQL](https://github.com/whisklabs/docker-it-scala/blob/master/samples/src/main/scala/com/whisk/docker/testkit/DockerMysqlService.scala)
4242
- [Postgres](https://github.com/whisklabs/docker-it-scala/blob/master/samples/src/main/scala/com/whisk/docker/testkit/DockerPostgresService.scala)
43+
- [Clickhouse](https://github.com/whisklabs/docker-it-scala/blob/master/samples/src/main/scala/com/whisk/docker/testkit/DockerClickhouseService.scala)
4344
- [Multi container test](https://github.com/whisklabs/docker-it-scala/blob/master/tests/src/test/scala/com/whisk/docker/testkit/test/MultiContainerTest.scala)
44-
4545
# Defining Containers
4646

4747
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/
7676
- Mongodb => `docker.mongo`
7777
- Neo4j => `docker.mysql`
7878
- Postgres => `docker.postgres`
79-
79+
- Clickhouse => `docker.clickhouse`
8080
### Fields
8181

8282
- `image-name` required (String)

build.sbt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ lazy val tests =
7575
name := "docker-testkit-tests",
7676
libraryDependencies ++= Seq(
7777
"org.postgresql" % "postgresql" % "42.1.4" % "test",
78-
"mysql" % "mysql-connector-java" % "5.1.44" % "test"
78+
"mysql" % "mysql-connector-java" % "5.1.44" % "test",
79+
"com.clickhouse" % "clickhouse-jdbc" % "0.5.0" % "test"
7980
)
8081
)
8182
.dependsOn(core, scalatest, samples % "test")

core/src/main/scala/com/whisk/docker/testkit/DockerReadyChecker.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,8 @@ object DockerReadyChecker {
198198
"mysql"
199199
} else if (driverLower.contains("postgres")) {
200200
"postgresql"
201+
} else if (driverLower.contains("clickhouse")) {
202+
"clickhouse"
201203
} else {
202204
throw new IllegalArgumentException("unsupported database for ready check")
203205
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.whisk.docker.testkit
2+
3+
import com.spotify.docker.client.messages.PortBinding
4+
import com.whisk.docker.testkit.scalatest.DockerTestKitForAll
5+
import org.scalatest.Suite
6+
7+
import scala.concurrent.duration._
8+
9+
trait DockerClickhouseService extends DockerTestKitForAll { self: Suite =>
10+
override val dockerTestTimeouts: DockerTestTimeouts = DockerTestTimeouts(pull = 10.minutes, init = 10.minutes, stop = 1.minutes)
11+
12+
def ClickhouseAdvertisedPort = 8123
13+
def ClickhouseExposedPort = 8123
14+
15+
val ClickhouseUser = "default"
16+
val ClickhousePassword = ""
17+
18+
val clickhouseContainer = ContainerSpec("clickhouse/clickhouse-server:23.6")
19+
.withEnv(s"CLICKHOUSE_USER=$ClickhouseUser", s"CLICKHOUSE_PASSWORD=$ClickhousePassword")
20+
.withPortBindings((ClickhouseAdvertisedPort, PortBinding.of("0.0.0.0", ClickhouseExposedPort)))
21+
.withReadyChecker(
22+
DockerReadyChecker
23+
.Jdbc(
24+
driverClass = "com.clickhouse.jdbc.ClickHouseDriver",
25+
user = ClickhouseUser,
26+
password = Some(ClickhousePassword)
27+
)
28+
.looped(15, 1.second)
29+
)
30+
.toContainer
31+
32+
override val managedContainers: ManagedContainers = clickhouseContainer.toManagedContainer
33+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.whisk.docker.testkit.test
2+
3+
import com.whisk.docker.testkit.{ContainerState, DockerClickhouseService}
4+
import org.scalatest.funsuite.AnyFunSuite
5+
6+
class ClickhouseServiceTest extends AnyFunSuite with DockerClickhouseService {
7+
test("test container started") {
8+
assert(clickhouseContainer.state().isInstanceOf[ContainerState.Ready], "clickhouse is ready")
9+
assert(clickhouseContainer.mappedPortOpt(ClickhouseAdvertisedPort) === Some(ClickhouseExposedPort),
10+
"clickhouse port exposed")
11+
}
12+
}

0 commit comments

Comments
 (0)