From 7f2467a3464c83e5458bc8d25159b8e091af52e9 Mon Sep 17 00:00:00 2001 From: Jakob Odersky Date: Sun, 9 Apr 2017 16:40:32 -0700 Subject: Make executors generic --- .../src/main/scala/io/crashbox/ci/Builder.scala | 3 +-- .../main/scala/io/crashbox/ci/DockerExecutor.scala | 9 +++++---- .../src/main/scala/io/crashbox/ci/Executor.scala | 20 ++++++++++++++++++++ .../scala/io/crashbox/ci/DockerExecutorSpec.scala | 6 +++--- 4 files changed, 29 insertions(+), 9 deletions(-) create mode 100644 crashboxd/src/main/scala/io/crashbox/ci/Executor.scala diff --git a/crashboxd/src/main/scala/io/crashbox/ci/Builder.scala b/crashboxd/src/main/scala/io/crashbox/ci/Builder.scala index 1e0c771..18bf219 100644 --- a/crashboxd/src/main/scala/io/crashbox/ci/Builder.scala +++ b/crashboxd/src/main/scala/io/crashbox/ci/Builder.scala @@ -5,7 +5,6 @@ import akka.stream.SourceShape import akka.stream.stage.{ GraphStageLogic, InHandler, OutHandler, StageLogging } import akka.stream.{ Attributes, FanInShape2, Inlet, Outlet } import akka.stream.stage.{ GraphStage } -import io.crashbox.ci.DockerExecutor.ExecutionId import java.io.{ File, OutputStream } import java.util.concurrent.atomic.AtomicInteger import scala.collection.concurrent.TrieMap @@ -37,7 +36,7 @@ class BuildSource( implicit def ec = materializer.executionContext lazy val instance: Future[ExecutionId] = executor.start( - taskDef.environment.asInstanceOf[DockerEnvironment].image, + taskDef.environment.asInstanceOf[DockerEnvironment], taskDef.script, mkdir, mkout diff --git a/crashboxd/src/main/scala/io/crashbox/ci/DockerExecutor.scala b/crashboxd/src/main/scala/io/crashbox/ci/DockerExecutor.scala index 1646777..715ca65 100644 --- a/crashboxd/src/main/scala/io/crashbox/ci/DockerExecutor.scala +++ b/crashboxd/src/main/scala/io/crashbox/ci/DockerExecutor.scala @@ -19,9 +19,10 @@ import com.spotify.docker.client.exceptions.ContainerNotFoundException import com.spotify.docker.client.messages.{ContainerConfig, HostConfig} import com.spotify.docker.client.messages.HostConfig.Bind +case class ExecutionId(id: String) extends AnyVal + object DockerExecutor { - case class ExecutionId(id: String) extends AnyVal def containerUser = "crashbox" def containerWorkDirectory = "/home/crashbox" @@ -30,7 +31,7 @@ object DockerExecutor { } class DockerExecutor(uri: String = "unix:///run/docker.sock")( - implicit system: ActorSystem) { + implicit system: ActorSystem) extends Executor[DockerEnvironment] { import DockerExecutor._ import system.log @@ -45,7 +46,7 @@ class DockerExecutor(uri: String = "unix:///run/docker.sock")( private val label = "crashbox-executor" -> UUID.randomUUID().toString def start( - image: String, + env: DockerEnvironment, script: String, buildDirectory: File, out: OutputStream @@ -62,7 +63,7 @@ class DockerExecutor(uri: String = "unix:///run/docker.sock")( .labels(Map(label).asJava) .hostConfig(hostConfig) .tty(true) // combine stdout and stderr into stdout - .image(image) + .image(env.image) .user(containerUser) .workingDir(containerWorkDirectory) .entrypoint("/bin/sh", "-c") diff --git a/crashboxd/src/main/scala/io/crashbox/ci/Executor.scala b/crashboxd/src/main/scala/io/crashbox/ci/Executor.scala new file mode 100644 index 0000000..06befee --- /dev/null +++ b/crashboxd/src/main/scala/io/crashbox/ci/Executor.scala @@ -0,0 +1,20 @@ +package io.crashbox.ci + +import java.io.{ File, OutputStream } +import scala.concurrent.Future + + +trait Executor[E <: Environment] { + + def start( + environment: E, + script: String, + buildDirectory: File, + out: OutputStream + ): Future[ExecutionId] + + def result(id: ExecutionId): Future[Int] + + def stop(id: ExecutionId): Unit + +} diff --git a/crashboxd/src/test/scala/io/crashbox/ci/DockerExecutorSpec.scala b/crashboxd/src/test/scala/io/crashbox/ci/DockerExecutorSpec.scala index bd3159b..3c47edf 100644 --- a/crashboxd/src/test/scala/io/crashbox/ci/DockerExecutorSpec.scala +++ b/crashboxd/src/test/scala/io/crashbox/ci/DockerExecutorSpec.scala @@ -22,7 +22,7 @@ class DockerExecutorSpec import IOUtil._ - val image = "crashbox" + val env = DockerEnvironment("crashbox") val timeout = 30.seconds @@ -49,7 +49,7 @@ class DockerExecutorSpec def run[A](script: String)(tests: (Int, File, String) => A): A = withTemp { case (dir, out) => - val awaitable = for (id <- exec.start(image, script, dir, out); + val awaitable = for (id <- exec.start(env, script, dir, out); status <- exec.result(id)) yield { status } @@ -103,7 +103,7 @@ class DockerExecutorSpec withTemp { case (dir, out) => val script = "while true; do sleep 1; echo sleeping; done" - val id = Await.result(exec.start(image, script, dir, out), timeout) + val id = Await.result(exec.start(env, script, dir, out), timeout) val check = exec.result(id).map { res => assert(res == 137) } -- cgit v1.2.3