pekko/akka-actor-tests/src/test/scala/akka/io/dns/DockerBindDnsService.scala

94 lines
2.8 KiB
Scala
Raw Normal View History

2018-10-16 15:35:55 +02:00
/*
* Copyright (C) 2018-2019 Lightbend Inc. <https://www.lightbend.com>
2018-10-16 15:35:55 +02:00
*/
package akka.io.dns
2019-05-24 08:11:50 +02:00
import akka.util.ccompat.JavaConverters._
2018-10-16 15:35:55 +02:00
import akka.testkit.AkkaSpec
import com.spotify.docker.client.DefaultDockerClient
import com.spotify.docker.client.DockerClient.{ ListContainersParam, LogsParam }
2018-10-16 15:35:55 +02:00
import com.spotify.docker.client.messages.{ ContainerConfig, HostConfig, PortBinding }
import org.scalatest.concurrent.Eventually
import scala.concurrent.duration._
2018-10-16 15:35:55 +02:00
import scala.util.Try
import scala.util.control.NonFatal
trait DockerBindDnsService extends Eventually { self: AkkaSpec =>
2018-10-16 15:35:55 +02:00
val client = DefaultDockerClient.fromEnv().build()
val hostPort: Int
var id: Option[String] = None
def dockerAvailable() = Try(client.ping()).isSuccess
override def atStartup(): Unit = {
log.info("Running on port port {}", hostPort)
2018-10-16 15:35:55 +02:00
self.atStartup()
// https://github.com/sameersbn/docker-bind/pull/61
val image = "raboof/bind:9.11.3-20180713-nochown"
try {
client.pull(image)
} catch {
case NonFatal(_) =>
2018-10-16 15:35:55 +02:00
log.warning(s"Failed to pull docker image [$image], is docker running?")
return
}
2019-03-11 10:38:24 +01:00
val containerConfig = ContainerConfig
.builder()
2018-10-16 15:35:55 +02:00
.image(image)
.env("NO_CHOWN=true")
.cmd("-4") // only listen on ipv4
2018-10-16 15:35:55 +02:00
.hostConfig(
2019-03-11 10:38:24 +01:00
HostConfig
.builder()
2019-03-13 10:56:20 +01:00
.portBindings(Map(
"53/tcp" -> List(PortBinding.of("", hostPort)).asJava,
"53/udp" -> List(PortBinding.of("", hostPort)).asJava).asJava)
2019-03-11 10:38:24 +01:00
.binds(HostConfig.Bind
.from(new java.io.File("akka-actor-tests/src/test/bind/").getAbsolutePath)
.to("/data/bind")
.build())
.build())
2018-10-16 15:35:55 +02:00
.build()
val containerName = "akka-test-dns-" + getClass.getCanonicalName
2019-03-11 10:38:24 +01:00
client
.listContainers(ListContainersParam.allContainers())
.asScala
.find(_.names().asScala.exists(_.contains(containerName)))
.foreach(c => {
if ("running" == c.state()) {
client.killContainer(c.id)
}
client.removeContainer(c.id)
})
val creation = client.createContainer(containerConfig, containerName)
creation.warnings() should be(null).or(have(size(0)))
2018-10-16 15:35:55 +02:00
id = Some(creation.id())
client.startContainer(creation.id())
eventually(timeout(25.seconds)) {
2018-10-16 15:35:55 +02:00
client.logs(creation.id(), LogsParam.stderr()).readFully() should include("all zones loaded")
}
}
def dumpNameserverLogs(): Unit = {
id.foreach(id => log.info("Nameserver std out: {} ", client.logs(id, LogsParam.stdout()).readFully()))
id.foreach(id => log.info("Nameserver std err: {} ", client.logs(id, LogsParam.stderr()).readFully()))
}
2018-10-16 15:35:55 +02:00
override def afterTermination(): Unit = {
self.afterTermination()
id.foreach(client.killContainer)
id.foreach(client.removeContainer)
}
}