summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Odersky <jakob@odersky.com>2017-04-09 16:40:32 -0700
committerJakob Odersky <jakob@odersky.com>2017-04-09 16:40:32 -0700
commit7f2467a3464c83e5458bc8d25159b8e091af52e9 (patch)
tree241ddc7978e50bcdc0c221999e20b0ec444b2377
parentb492dcf46718f50ca051017bddd4551faa867339 (diff)
downloadcrashbox-ci-7f2467a3464c83e5458bc8d25159b8e091af52e9.tar.gz
crashbox-ci-7f2467a3464c83e5458bc8d25159b8e091af52e9.tar.bz2
crashbox-ci-7f2467a3464c83e5458bc8d25159b8e091af52e9.zip
Make executors generic
-rw-r--r--crashboxd/src/main/scala/io/crashbox/ci/Builder.scala3
-rw-r--r--crashboxd/src/main/scala/io/crashbox/ci/DockerExecutor.scala9
-rw-r--r--crashboxd/src/main/scala/io/crashbox/ci/Executor.scala20
-rw-r--r--crashboxd/src/test/scala/io/crashbox/ci/DockerExecutorSpec.scala6
4 files changed, 29 insertions, 9 deletions
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)
}