Skip to content

Commit

Permalink
cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
neko-kai committed Jun 24, 2020
1 parent 0c1d216 commit dac7190
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 44 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -80,21 +80,21 @@ case class ContainerResource[F[_], T](

def await(container: DockerContainer[T], attempt: Int): F[DockerContainer[T]] = {
F.maybeSuspend {
logger.debug(s"Awaiting until alive: $container...")
try {
val status = rawClient.inspectContainerCmd(container.id.name).exec()
// if container is running or does not have any ports
if (status.getState.getRunning || (config.ports.isEmpty && status.getState.getExitCodeLong == 0L)) {
logger.debug(s"Trying healthcheck on running $container...")
Right(config.healthCheck.check(logger, container))
} else {
Left(new RuntimeException(s"$container exited, status: ${status.getState}"))
}
} catch {
case t: Throwable =>
Left(t)
logger.debug(s"Awaiting until alive: $container...")
try {
val status = rawClient.inspectContainerCmd(container.id.name).exec()
// if container is running or does not have any ports
if (status.getState.getRunning || (config.ports.isEmpty && status.getState.getExitCodeLong == 0L)) {
logger.debug(s"Trying healthcheck on running $container...")
Right(config.healthCheck.check(logger, container))
} else {
Left(new RuntimeException(s"$container exited, status: ${status.getState}"))
}
}.flatMap {
} catch {
case t: Throwable =>
Left(t)
}
}.flatMap {
case Right(HealthCheckResult.Available) =>
F.maybeSuspend {
logger.info(s"Continuing without port checks: $container")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,16 +32,9 @@ class DockerClientWrapper[F[_]](
) {
def labels: Map[String, String] = labelsBase ++ labelsJvm ++ labelsUnique

def destroyContainer(containerId: ContainerId, meta: ContainerDestroyMeta): F[Unit] = {
def destroyContainer(containerId: ContainerId, context: ContainerDestroyMeta): F[Unit] = {
F.definitelyRecover {
F.maybeSuspend {
val context = meta match {
case ContainerDestroyMeta.ParameterizedContainer(container) =>
container.toString
case ContainerDestroyMeta.RawContainer(container) =>
container.toString
}

logger.info(s"Going to destroy $containerId ($context)...")

try {
Expand All @@ -66,8 +59,12 @@ class DockerClientWrapper[F[_]](
object DockerClientWrapper {
sealed trait ContainerDestroyMeta
object ContainerDestroyMeta {
case class ParameterizedContainer[T](container: DockerContainer[T]) extends ContainerDestroyMeta
case class RawContainer(container: Container) extends ContainerDestroyMeta
final case class ParameterizedContainer[T](container: DockerContainer[T]) extends ContainerDestroyMeta {
override def toString: String = container.toString
}
final case class RawContainer(container: Container) extends ContainerDestroyMeta {
override def toString: String = container.toString
}
}

private[this] val jvmRun: String = UUID.randomUUID().toString
Expand Down Expand Up @@ -127,7 +124,7 @@ object DockerClientWrapper {
.withLabelFilter(resource.labels.asJava)
.exec()
}
// destroy all containers that should not be reused, or was exited (to not to cumulate containers that could be pruned)
// destroy all containers that should not be reused, or was exited (to not to accumulate containers that could be pruned)
containersToDestroy = containers.asScala.filter {
c =>
Option(c.getLabels.get("distage.reuse")).forall(_ == "false") || c.getState == "exited"
Expand All @@ -137,7 +134,7 @@ object DockerClientWrapper {
val id = ContainerId(c.getId)
DIEffect[F].definitelyRecover(resource.destroyContainer(id, ContainerDestroyMeta.RawContainer(c))) {
error =>
DIEffect[F].maybeSuspend(logger.warn(s"Failed to destroy container $id: $error"))
DIEffect[F].maybeSuspend(logger.warn(s"Failed to destroy container $id: $error"))
}

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import distage.DIKey
import izumi.distage.model.definition.DIResource.DIResourceBase
import izumi.distage.testkit.TestConfig
import izumi.distage.testkit.TestConfig.ParallelLevel
import izumi.distage.testkit.docker.fixtures.{CmdContainerModule, StatefulCheckContainer, PgSvcExample}
import izumi.distage.testkit.docker.fixtures.{PgSvcExample, ReuseCheckContainer}
import izumi.distage.testkit.scalatest.DistageBIOSpecScalatest
import izumi.logstage.api.Log
import zio.IO
Expand All @@ -14,15 +14,15 @@ abstract class DistageTestDockerBIO extends DistageBIOSpecScalatest[IO] {

"distage test runner should start only one container for reusable" should {
"support docker resources" in {
(service: PgSvcExample, verifier: DIResourceBase[IO[Throwable, *], StatefulCheckContainer.Container]) =>
(service: PgSvcExample, verifier: DIResourceBase[IO[Throwable, ?], ReuseCheckContainer.Container]) =>
for {
_ <- IO(println(s"ports/1: pg=${service.pg} ddb=${service.ddb} kafka=${service.kafka} cs=${service.cs}"))
_ <- verifier.use(_ => IO.unit)
_ <- verifier.use(_ => IO.unit)
} yield ()
}

"support memoization" in {
(service: PgSvcExample, verifier: DIResourceBase[IO[Throwable, *], StatefulCheckContainer.Container]) =>
(service: PgSvcExample, verifier: DIResourceBase[IO[Throwable, ?], ReuseCheckContainer.Container]) =>
for {
_ <- IO(println(s"ports/2: pg=${service.pg} ddb=${service.ddb} kafka=${service.kafka} cs=${service.cs}"))
_ <- verifier.use(_ => IO.unit)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,12 @@ import zio.Task
import scala.concurrent.duration._

class PgSvcExample(
val pg: AvailablePort @Id("pg"),
val ddb: AvailablePort @Id("ddb"),
val kafka: AvailablePort @Id("kafka"),
val cs: AvailablePort @Id("cs"),
val mq: AvailablePort @Id("mq"),
val cmd: StatefulContainer.Container,
val pg: AvailablePort @Id("pg"),
val ddb: AvailablePort @Id("ddb"),
val kafka: AvailablePort @Id("kafka"),
val cs: AvailablePort @Id("cs"),
val mq: AvailablePort @Id("mq"),
val cmd: ReusedOneshotContainer.Container,
) extends IntegrationCheck {
override def resourcesAvailable(): ResourceCheck = {
new PortCheck(10.milliseconds).checkPort(pg.hostV4, pg.port)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package izumi.distage.testkit.docker.fixtures

import java.util.UUID

import distage.{ModuleDef, TagK}
import izumi.distage.docker.ContainerDef
import izumi.distage.docker.Docker.Mount
import izumi.distage.model.definition.DIResource.DIResourceBase

object StatefulContainer extends ContainerDef {
object ReusedOneshotContainer extends ContainerDef {
override def config: Config = {
Config(
image = "alpine:3.12.0",
Expand All @@ -17,31 +19,30 @@ object StatefulContainer extends ContainerDef {
}
}

object StatefulCheckContainer extends ContainerDef {
object ReuseCheckContainer extends ContainerDef {
override def config: Config = {
Config(
image = "alpine:3.12.0",
image = "alpine:3.11.0",
ports = Seq(),
mounts = Seq(CmdContainerModule.stateFileMount),
entrypoint = Seq("sh", "-c", s"if [[ $$(cat ${CmdContainerModule.stateFilePath} | wc -l | awk '{print $$1}') == 1 ]]; then exit 0; else exit 42; fi"),
// entrypoint = Seq("sh", "-c", s"exit 1"),
reuse = false,
)
}
}

class CmdContainerModule[F[_]: TagK] extends ModuleDef {
make[StatefulContainer.Container].fromResource {
StatefulContainer.make[F]
make[ReusedOneshotContainer.Container].fromResource {
ReusedOneshotContainer.make[F]
}

make[DIResourceBase[F, StatefulCheckContainer.Container]].from(StatefulCheckContainer.make[F])
make[DIResourceBase[F, ReuseCheckContainer.Container]].from(ReuseCheckContainer.make[F])
}

object CmdContainerModule {
def apply[F[_]: TagK]: CmdContainerModule[F] = new CmdContainerModule[F]

private val runId = System.nanoTime().toString
private val runId = UUID.randomUUID().toString

val stateFileMount: Mount = Mount("/tmp/", s"/tmp/docker-test/")
val stateFilePath: String = s"/tmp/docker-test/docker-test-${CmdContainerModule.runId}.txt"
Expand Down

0 comments on commit dac7190

Please sign in to comment.