Skip to content

Commit 8524525

Browse files
committed
feat: add support for elasticmq
1 parent 0ab7b22 commit 8524525

File tree

6 files changed

+184
-1
lines changed

6 files changed

+184
-1
lines changed

build.sbt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,17 @@ val `docker-controller-scala-redis` = (project in file("docker-controller-scala-
172172
)
173173
).dependsOn(`docker-controller-scala-core`, `docker-controller-scala-scalatest` % Test)
174174

175+
val `docker-controller-scala-elasticmq` = (project in file("docker-controller-scala-elasticmq"))
176+
.settings(baseSettings)
177+
.settings(
178+
name := "docker-controller-scala-elasticmq",
179+
libraryDependencies ++= Seq(
180+
scalatest.scalatest % Test,
181+
logback.classic % Test,
182+
amazonAws.sqs % Test
183+
)
184+
).dependsOn(`docker-controller-scala-core`, `docker-controller-scala-scalatest` % Test)
185+
175186
val `docker-controller-scala-elasticsearch` = (project in file("docker-controller-scala-elasticsearch"))
176187
.settings(baseSettings)
177188
.settings(
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package com.github.j5ik2o.dockerController.elasticmq
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.elasticmq.ElasticMQController.{
9+
DefaultContainerPorts,
10+
DefaultImageName,
11+
DefaultImageTag
12+
}
13+
14+
import scala.concurrent.duration.{ DurationInt, FiniteDuration }
15+
import scala.jdk.CollectionConverters._
16+
17+
object ElasticMQController {
18+
final val DefaultImageName: String = "softwaremill/elasticmq"
19+
final val DefaultImageTag: Option[String] = Some("1.1.1")
20+
final val DefaultContainerPorts: Seq[Int] = Seq(9324, 9325)
21+
22+
def apply(
23+
dockerClient: DockerClient,
24+
outputFrameInterval: FiniteDuration = 500.millis,
25+
imageName: String = DefaultImageName,
26+
imageTag: Option[String] = DefaultImageTag,
27+
envVars: Map[String, String] = Map.empty
28+
)(dockerHost: String, hostPorts: Seq[Int]): ElasticMQController =
29+
new ElasticMQController(dockerClient, outputFrameInterval, imageName, imageTag, envVars)(
30+
dockerHost,
31+
hostPorts
32+
)
33+
}
34+
35+
class ElasticMQController(
36+
dockerClient: DockerClient,
37+
outputFrameInterval: FiniteDuration = 500.millis,
38+
imageName: String = DefaultImageName,
39+
imageTag: Option[String] = DefaultImageTag,
40+
envVars: Map[String, String] = Map.empty
41+
)(dockerHost: String, hostPorts: Seq[Int])
42+
extends DockerControllerImpl(dockerClient, outputFrameInterval)(imageName, imageTag) {
43+
44+
private val environmentVariables = Map(
45+
"JAVA_OPTS" -> "-Dconfig.override_with_env_vars=true",
46+
"CONFIG_FORCE_node__address_host" -> "*",
47+
"CONFIG_FORCE_rest__sqs_bind__hostname" -> "0.0.0.0",
48+
"CONFIG_FORCE_generate__node__address" -> "false"
49+
) ++
50+
envVars
51+
52+
override protected def newCreateContainerCmd(): CreateContainerCmd = {
53+
val containerPorts = DefaultContainerPorts.map(ExposedPort.tcp)
54+
val ports = new Ports()
55+
containerPorts.zip(hostPorts).foreach { case (containerPort, hostPort) =>
56+
ports.bind(containerPort, Ports.Binding.bindPort(hostPort))
57+
}
58+
super
59+
.newCreateContainerCmd()
60+
.withEnv(environmentVariables.map { case (k, v) => s"$k=$v" }.toArray: _*)
61+
.withExposedPorts(containerPorts.toList.asJava)
62+
.withHostConfig(newHostConfig().withPortBindings(ports))
63+
}
64+
}
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,85 @@
1+
package com.github.j5ik2o.dockerController.elasticmq
2+
3+
import com.amazonaws.auth.{ AWSCredentialsProviderChain, AWSStaticCredentialsProvider, BasicAWSCredentials }
4+
import com.amazonaws.client.builder.AwsClientBuilder
5+
import com.amazonaws.regions.Regions
6+
import com.amazonaws.services.sqs.AmazonSQSClientBuilder
7+
import com.amazonaws.services.sqs.model.{ CreateQueueRequest, SendMessageRequest, SetQueueAttributesRequest }
8+
import com.github.j5ik2o.dockerController.{
9+
DockerController,
10+
DockerControllerSpecSupport,
11+
RandomPortUtil,
12+
WaitPredicates
13+
}
14+
import org.scalatest.freespec.AnyFreeSpec
15+
16+
import java.util.UUID
17+
import scala.concurrent.duration._
18+
19+
class ElasticMQControllerSpec extends AnyFreeSpec with DockerControllerSpecSupport {
20+
21+
val testTimeFactor: Int = sys.env.getOrElse("TEST_TIME_FACTOR", "1").toInt
22+
logger.debug(s"testTimeFactor = $testTimeFactor")
23+
24+
val hostPorts: Seq[Int] = Seq(RandomPortUtil.temporaryServerPort(), RandomPortUtil.temporaryServerPort())
25+
val controller: ElasticMQController = ElasticMQController(dockerClient)(dockerHost, hostPorts)
26+
27+
override protected val dockerControllers: Vector[DockerController] = Vector(controller)
28+
29+
override protected val waitPredicatesSettings: Map[DockerController, WaitPredicateSetting] =
30+
Map(
31+
controller -> WaitPredicateSetting(
32+
Duration.Inf,
33+
WaitPredicates.forListeningHostTcpPort(
34+
dockerHost,
35+
hostPorts.head,
36+
(1 * testTimeFactor).seconds,
37+
Some((5 * testTimeFactor).seconds)
38+
)
39+
)
40+
)
41+
42+
"ElasticMQController" - {
43+
"run" in {
44+
val client = AmazonSQSClientBuilder
45+
.standard()
46+
.withCredentials(
47+
new AWSCredentialsProviderChain(new AWSStaticCredentialsProvider(new BasicAWSCredentials("x", "x")))
48+
)
49+
.withEndpointConfiguration(
50+
new AwsClientBuilder.EndpointConfiguration(
51+
s"http://${dockerHost}:${hostPorts.head}",
52+
Regions.DEFAULT_REGION.getName
53+
)
54+
).build()
55+
56+
val queueName = "test"
57+
val request = new CreateQueueRequest(queueName)
58+
.addAttributesEntry("VisibilityTimeout", "5")
59+
.addAttributesEntry("DelaySeconds", "1")
60+
61+
val createQueueResult = client.createQueue(request)
62+
assert(createQueueResult.getSdkHttpMetadata.getHttpStatusCode == 200)
63+
val queueUrlResult = client.getQueueUrl(queueName)
64+
assert(queueUrlResult.getSdkHttpMetadata.getHttpStatusCode == 200)
65+
val queueUrl = queueUrlResult.getQueueUrl
66+
67+
val setAttrsRequest = new SetQueueAttributesRequest()
68+
.withQueueUrl(queueUrl)
69+
.addAttributesEntry("ReceiveMessageWaitTimeSeconds", "5")
70+
val queueAttributesResult = client.setQueueAttributes(setAttrsRequest)
71+
assert(queueAttributesResult.getSdkHttpMetadata.getHttpStatusCode == 200)
72+
73+
val text = UUID.randomUUID().toString
74+
val sendMessageRequest = new SendMessageRequest(queueUrl, text)
75+
val sendMessageResult = client.sendMessage(sendMessageRequest)
76+
assert(sendMessageResult.getSdkHttpMetadata.getHttpStatusCode == 200)
77+
78+
val receiveMessageResult = client.receiveMessage(queueUrl)
79+
assert(receiveMessageResult.getSdkHttpMetadata.getHttpStatusCode == 200)
80+
assert(receiveMessageResult.getMessages.size() > 0)
81+
val message = receiveMessageResult.getMessages.get(0)
82+
assert(message.getBody == text)
83+
}
84+
}
85+
}

docker-controller-scala-redis/src/main/scala/com/github/j5ik2o/dockerController/redis/RedisController.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ class RedisController(
5656

5757
override protected def newCreateContainerCmd(): CreateContainerCmd = {
5858
val containerPort = ExposedPort.tcp(DefaultContainerPort)
59-
val portBinding = new Ports()
59+
val portBinding = new Ports
6060
portBinding.bind(containerPort, Ports.Binding.bindPort(hostPort))
6161
super
6262
.newCreateContainerCmd()

project/Dependencies.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ object Dependencies {
3333
object amazonAws {
3434
val dynamodb = "com.amazonaws" % "aws-java-sdk-dynamodb" % "1.12.12"
3535
val s3 = "com.amazonaws" % "aws-java-sdk-s3" % "1.12.12"
36+
val sqs = "com.amazonaws" % "aws-java-sdk-sqs" % "1.12.12"
3637
}
3738

3839
object apache {

0 commit comments

Comments
 (0)