Skip to content

Commit f7b4122

Browse files
committed
feat: add support for redis
1 parent 0e7d59e commit f7b4122

File tree

5 files changed

+148
-0
lines changed

5 files changed

+148
-0
lines changed

build.sbt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,17 @@ val `docker-controller-scala-mysql` = (project in file("docker-controller-scala-
161161
)
162162
).dependsOn(`docker-controller-scala-core`, `docker-controller-scala-scalatest` % Test)
163163

164+
val `docker-controller-scala-redis` = (project in file("docker-controller-scala-redis"))
165+
.settings(baseSettings)
166+
.settings(
167+
name := "docker-controller-scala-redis",
168+
libraryDependencies ++= Seq(
169+
scalatest.scalatest % Test,
170+
logback.classic % Test,
171+
(debasishg.redisClient % Test).cross(CrossVersion.for3Use2_13)
172+
)
173+
).dependsOn(`docker-controller-scala-core`, `docker-controller-scala-scalatest` % Test)
174+
164175
val `docker-controller-scala-elasticsearch` = (project in file("docker-controller-scala-elasticsearch"))
165176
.settings(baseSettings)
166177
.settings(
@@ -191,6 +202,7 @@ val `docker-controller-scala-root` = (project in file("."))
191202
`docker-controller-scala-core`,
192203
`docker-controller-scala-scalatest`,
193204
`docker-controller-scala-mysql`,
205+
`docker-controller-scala-redis`,
194206
`docker-controller-scala-dynamodb-local`,
195207
`docker-controller-scala-minio`,
196208
`docker-controller-scala-zookeeper`,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package com.github.j5ik2o.dockerController.redis
2+
3+
import com.github.dockerjava.api.DockerClient
4+
import com.github.dockerjava.api.command.CreateContainerCmd
5+
import com.github.dockerjava.api.model.HostConfig.newHostConfig
6+
import com.github.dockerjava.api.model.{ ExposedPort, Ports }
7+
import com.github.j5ik2o.dockerController.DockerControllerImpl
8+
import com.github.j5ik2o.dockerController.redis.RedisController._
9+
10+
import scala.concurrent.duration.{ DurationInt, FiniteDuration }
11+
12+
object RedisController {
13+
final val DefaultImageName: String = "redis"
14+
final val DefaultImageTag: Option[String] = Some("6.2.4")
15+
final val DefaultContainerPort: Int = 6379
16+
17+
def apply(
18+
dockerClient: DockerClient,
19+
outputFrameInterval: FiniteDuration = 500.millis,
20+
imageName: String = DefaultImageName,
21+
imageTag: Option[String] = DefaultImageTag,
22+
envVars: Map[String, String] = Map.empty
23+
)(
24+
hostPort: Int,
25+
allowEmptyPassword: Boolean = true,
26+
redisPassword: Option[String] = None,
27+
redisAofEnabled: Boolean = false
28+
): RedisController =
29+
new RedisController(dockerClient, outputFrameInterval, imageName, imageTag, envVars)(
30+
hostPort,
31+
allowEmptyPassword,
32+
redisPassword,
33+
redisAofEnabled
34+
)
35+
}
36+
37+
class RedisController(
38+
dockerClient: DockerClient,
39+
outputFrameInterval: FiniteDuration = 500.millis,
40+
imageName: String = DefaultImageName,
41+
imageTag: Option[String] = DefaultImageTag,
42+
envVars: Map[String, String] = Map.empty
43+
)(
44+
hostPort: Int,
45+
allowEmptyPassword: Boolean = true,
46+
redisPassword: Option[String] = None,
47+
redisAofEnabled: Boolean = false
48+
) extends DockerControllerImpl(dockerClient, outputFrameInterval)(imageName, imageTag) {
49+
50+
private val environmentVariables = Map(
51+
"ALLOW_EMPTY_PASSWORD" -> { if (allowEmptyPassword) "yes" else "no" },
52+
"REDIS_AOF_ENABLED" -> { if (redisAofEnabled) "yes" else "no" }
53+
) ++
54+
redisPassword.map(password => Map("REDIS_PASSWORD" -> password)).getOrElse(Map.empty) ++
55+
envVars
56+
57+
override protected def newCreateContainerCmd(): CreateContainerCmd = {
58+
val containerPort = ExposedPort.tcp(DefaultContainerPort)
59+
val portBinding = new Ports()
60+
portBinding.bind(containerPort, Ports.Binding.bindPort(hostPort))
61+
super
62+
.newCreateContainerCmd()
63+
.withEnv(environmentVariables.map { case (k, v) => s"$k=$v" }.toArray: _*)
64+
.withExposedPorts(containerPort)
65+
.withHostConfig(newHostConfig().withPortBindings(portBinding))
66+
}
67+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<configuration>
2+
3+
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
4+
<layout class="ch.qos.logback.classic.PatternLayout">
5+
<Pattern>
6+
%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
7+
</Pattern>
8+
</layout>
9+
</appender>
10+
11+
<appender name="ASYNCSTDOUT" class="ch.qos.logback.classic.AsyncAppender">
12+
<appender-ref ref="STDOUT" />
13+
</appender>
14+
15+
<logger name="org.apache" level="INFO">
16+
</logger>
17+
18+
<root level="DEBUG">
19+
<appender-ref ref="ASYNCSTDOUT" />
20+
</root>
21+
22+
</configuration>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.github.j5ik2o.dockerController.redis
2+
3+
import com.github.j5ik2o.dockerController.{
4+
DockerController,
5+
DockerControllerSpecSupport,
6+
RandomPortUtil,
7+
WaitPredicates
8+
}
9+
import com.redis.RedisClient
10+
import org.scalatest.freespec.AnyFreeSpec
11+
12+
import scala.concurrent.duration._
13+
14+
class RedisControllerSpec extends AnyFreeSpec with DockerControllerSpecSupport {
15+
val testTimeFactor: Int = sys.env.getOrElse("TEST_TIME_FACTOR", "1").toInt
16+
logger.debug(s"testTimeFactor = $testTimeFactor")
17+
18+
val hostPort: Int = RandomPortUtil.temporaryServerPort()
19+
val controller: RedisController = RedisController(dockerClient)(hostPort)
20+
override protected val dockerControllers: Vector[DockerController] = Vector(controller)
21+
22+
override protected val waitPredicatesSettings: Map[DockerController, WaitPredicateSetting] =
23+
Map(
24+
controller -> WaitPredicateSetting(
25+
Duration.Inf,
26+
WaitPredicates.forListeningHostTcpPort(
27+
dockerHost,
28+
hostPort,
29+
(1 * testTimeFactor).seconds,
30+
Some((5 * testTimeFactor).seconds)
31+
)
32+
)
33+
)
34+
35+
"RedisController" - {
36+
"run" in {
37+
val r = new RedisClient(dockerHost, hostPort)
38+
r.set("1", "2")
39+
assert(r.get("1").get == "2")
40+
r.close()
41+
}
42+
}
43+
}

project/Dependencies.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,4 +98,8 @@ object Dependencies {
9898

9999
}
100100

101+
object debasishg {
102+
val redisClient = "net.debasishg" %% "redisclient" % "3.30"
103+
}
104+
101105
}

0 commit comments

Comments
 (0)