Skip to content

Commit c691e1c

Browse files
committed
feat: Update local-stack image
1 parent 1883dbb commit c691e1c

File tree

2 files changed

+99
-66
lines changed

2 files changed

+99
-66
lines changed
Lines changed: 92 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,104 +1,136 @@
11
package com.github.j5ik2o.dockerController.localstack
22

33
import com.github.dockerjava.api.DockerClient
4-
import com.github.dockerjava.api.command.CreateContainerCmd
4+
import com.github.dockerjava.api.command.{CreateContainerCmd, RemoveContainerCmd}
55
import com.github.dockerjava.api.model.HostConfig.newHostConfig
6-
import com.github.dockerjava.api.model.{ ExposedPort, Ports }
6+
import com.github.dockerjava.api.model.{ExposedPort, Ports}
77
import com.github.j5ik2o.dockerController.DockerControllerImpl
88
import com.github.j5ik2o.dockerController.localstack.LocalStackController._
99

10-
import scala.concurrent.duration.{ DurationInt, FiniteDuration }
10+
import scala.concurrent.duration.{DurationInt, FiniteDuration}
1111

1212
object LocalStackController {
13-
final val DefaultImageName = "localstack/localstack"
14-
final val DefaultImageTag: Some[String] = Some("0.11.2")
13+
final val DefaultImageName = "localstack/localstack"
14+
final val DefaultImageTag: Some[String] = Some("latest")
1515

1616
def apply(
17-
dockerClient: DockerClient,
18-
outputFrameInterval: FiniteDuration = 500.millis,
19-
imageName: String = DefaultImageName,
20-
imageTag: Option[String] = DefaultImageTag,
21-
envVars: Map[String, String] = Map.empty
22-
)(
23-
services: Set[Service],
24-
hostPorts: Map[Service, Int],
25-
hostName: Option[String] = None,
26-
hostNameExternal: Option[String] = None,
27-
defaultRegion: Option[String] = None
28-
): LocalStackController =
17+
dockerClient: DockerClient,
18+
outputFrameInterval: FiniteDuration = 500.millis,
19+
imageName: String = DefaultImageName,
20+
imageTag: Option[String] = DefaultImageTag,
21+
envVars: Map[String, String] = Map.empty
22+
)(
23+
services: Set[Service],
24+
edgeHostPort: Int,
25+
hostPorts: Map[Service, Int] = Map.empty,
26+
hostName: Option[String] = None,
27+
hostNameExternal: Option[String] = None,
28+
defaultRegion: Option[String] = None
29+
): LocalStackController =
2930
new LocalStackController(dockerClient, outputFrameInterval, imageName, imageTag, envVars)(
3031
services,
32+
edgeHostPort,
3133
hostPorts,
3234
hostName,
3335
hostNameExternal,
3436
defaultRegion
3537
)
3638
}
3739

38-
sealed abstract class Service(val entryName: String, val port: Int)
40+
sealed abstract class Service(val entryName: String)
3941

4042
object Service {
41-
case object ApiGateway extends Service("apigateway", 4567)
42-
case object DynamoDB extends Service("dynamodb", 4569)
43-
case object DynamoDBStreams extends Service("dynamodbstreams", 4570)
44-
case object Elasticsearch extends Service("es", 4571)
45-
case object S3 extends Service("s3", 4572)
46-
case object Firehose extends Service("firehose", 4573)
47-
case object Lambda extends Service("lambda", 4574)
48-
case object SNS extends Service("sns", 4575)
49-
case object SQS extends Service("sqs", 4576)
50-
case object RedShift extends Service("redshift", 4577)
51-
case object SES extends Service("ses", 4579)
52-
case object Route53 extends Service("route53", 4580)
53-
case object CloudFormation extends Service("cloudformation", 4581)
54-
case object CloudWatch extends Service("cloudwatch", 4582)
55-
case object SSM extends Service("ssm", 4583)
56-
case object SecretManager extends Service("secretsmanager", 4584)
57-
case object StepFunctions extends Service("stepfunctions", 4585)
58-
case object CloudWatchLogs extends Service("logs", 4586)
59-
case object STS extends Service("sts", 4592)
60-
case object IAM extends Service("iam", 4593)
61-
case object KMS extends Service("kms", 4599)
43+
44+
case object ACM extends Service("acm")
45+
46+
case object ApiGateway extends Service("apigateway")
47+
48+
case object CloudFormation extends Service("cloudformation")
49+
50+
case object CloudWatch extends Service("cloudwatch")
51+
52+
case object CloudWatchLogs extends Service("logs")
53+
54+
case object DynamoDB extends Service("dynamodb")
55+
56+
case object DynamoDBStreams extends Service("dynamodbstreams")
57+
58+
case object EC2 extends Service("ec2")
59+
60+
case object Elasticsearch extends Service("es")
61+
62+
case object EventBridge extends Service("eventbridge")
63+
64+
case object Firehose extends Service("firehose")
65+
66+
case object IAM extends Service("iam")
67+
68+
case object Kinesis extends Service("kinesis")
69+
70+
case object KMS extends Service("kms")
71+
72+
case object Lambda extends Service("lambda")
73+
74+
case object RedShift extends Service("redshift")
75+
76+
case object Route53 extends Service("route53")
77+
78+
case object S3 extends Service("s3")
79+
80+
case object SecretManager extends Service("secretsmanager")
81+
82+
case object SES extends Service("ses")
83+
84+
case object SNS extends Service("sns")
85+
86+
case object SQS extends Service("sqs")
87+
88+
case object SSM extends Service("ssm")
89+
90+
case object StepFunctions extends Service("stepfunctions")
91+
92+
case object STS extends Service("sts")
93+
6294
}
6395

6496
class LocalStackController(
65-
dockerClient: DockerClient,
66-
outputFrameInterval: FiniteDuration = 500.millis,
67-
imageName: String = DefaultImageName,
68-
imageTag: Option[String] = DefaultImageTag,
69-
envVars: Map[String, String] = Map.empty
70-
)(
71-
services: Set[Service],
72-
hostPorts: Map[Service, Int],
73-
hostName: Option[String] = None,
74-
hostNameExternal: Option[String] = None,
75-
defaultRegion: Option[String] = None
76-
) extends DockerControllerImpl(dockerClient, outputFrameInterval)(imageName, imageTag) {
97+
dockerClient: DockerClient,
98+
outputFrameInterval: FiniteDuration = 500.millis,
99+
imageName: String = DefaultImageName,
100+
imageTag: Option[String] = DefaultImageTag,
101+
envVars: Map[String, String] = Map.empty
102+
)(
103+
services: Set[Service],
104+
edgeHostPort: Int,
105+
hostPorts: Map[Service, Int],
106+
edgeBindHost: Option[String] = None,
107+
hostName: Option[String] = None,
108+
hostNameExternal: Option[String] = None,
109+
defaultRegion: Option[String] = None
110+
) extends DockerControllerImpl(dockerClient, outputFrameInterval)(imageName, imageTag) {
77111

78112
private val environmentVariables: Map[String, String] = Map(
79-
"SERVICES" -> services.map(_.entryName).mkString(",")
113+
"SERVICES" -> services.map(_.entryName).mkString(","),
80114
) ++
115+
edgeBindHost.fold(Map.empty[String, String]) { e => Map("EDGE_BIND_HOST" -> e) } ++
81116
hostName.fold(Map.empty[String, String]) { h => Map("HOSTNAME" -> h) } ++
82117
hostNameExternal.fold(Map.empty[String, String]) { h => Map("HOSTNAME_EXTERNAL" -> h) } ++
83118
defaultRegion.fold(Map.empty[String, String]) { r => Map("DEFAULT_REGION" -> r) } ++
84119
hostPorts.foldLeft(Map.empty[String, String]) { case (result, (s, p)) =>
85120
result ++ Map(s.entryName.toUpperCase + "_PORT_EXTERNAL" -> p.toString)
86-
} ++ envVars
121+
} ++
122+
envVars
87123

88124
logger.debug(s"environmentVariables= $environmentVariables")
89125

90126
override protected def newCreateContainerCmd(): CreateContainerCmd = {
91127
val portBinding = new Ports()
92-
val containerPortWithHostPorts = hostPorts.map { case (service, port) =>
93-
(ExposedPort.tcp(service.port), port)
94-
}
95-
containerPortWithHostPorts.foreach { case (servicePort, hostPort) =>
96-
portBinding.bind(servicePort, Ports.Binding.bindPort(hostPort))
97-
}
128+
portBinding.bind(ExposedPort.tcp(4566), Ports.Binding.bindPort(edgeHostPort))
129+
98130
super
99131
.newCreateContainerCmd()
100132
.withEnv(environmentVariables.map { case (k, v) => s"$k=$v" }.toArray: _*)
101-
.withExposedPorts(containerPortWithHostPorts.keys.toArray: _*)
102133
.withHostConfig(newHostConfig().withPortBindings(portBinding))
103134
}
135+
104136
}

docker-controller-scala-localstack/src/test/scala/com/github/j5ik2o/dockerController/localstack/LocalStackControllerSpec.scala

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,16 @@ import scala.jdk.CollectionConverters._
2727
class LocalStackControllerSpec extends AnyFreeSpec with DockerControllerSpecSupport {
2828
val accessKeyId: String = "AKIAIOSFODNN7EXAMPLE"
2929
val secretAccessKey: String = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
30-
val hostPortForS3: Int = temporaryServerPort()
31-
val hostPortForDynamoDB: Int = temporaryServerPort()
32-
val endpointForS3: String = s"http://$dockerHost:$hostPortForS3"
33-
val endpointForDynamoDB: String = s"http://$dockerHost:$hostPortForDynamoDB"
30+
val hostPort: Int = temporaryServerPort()
31+
val endpointForS3: String = s"http://$dockerHost:$hostPort"
32+
val endpointForDynamoDB: String = s"http://$dockerHost:$hostPort"
3433
val region: Regions = Regions.AP_NORTHEAST_1
3534

3635
val controller: LocalStackController =
3736
LocalStackController(dockerClient)(
38-
Set(Service.S3, Service.DynamoDB),
39-
Map(Service.S3 -> hostPortForS3, Service.DynamoDB -> hostPortForDynamoDB),
37+
services = Set(Service.S3, Service.DynamoDB),
38+
edgeHostPort = hostPort,
39+
hostNameExternal = Some(dockerHost),
4040
defaultRegion = Some(region.getName)
4141
)
4242

@@ -57,6 +57,7 @@ class LocalStackControllerSpec extends AnyFreeSpec with DockerControllerSpecSupp
5757
.withCredentials(
5858
new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKeyId, secretAccessKey))
5959
)
60+
.withPathStyleAccessEnabled(true)
6061
.build()
6162
}
6263

0 commit comments

Comments
 (0)