Skip to content

Commit 1ca6111

Browse files
author
Johannes Duesing
committed
Basic traefik integration
1 parent 404ecbe commit 1ca6111

File tree

5 files changed

+43
-20
lines changed

5 files changed

+43
-20
lines changed

src/main/scala/de/upb/cs/swt/delphi/instanceregistry/Configuration.scala

+4
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ class Configuration( ) {
99
val bindHost: String = "0.0.0.0"
1010
val bindPort: Int = 8087
1111

12+
//Traefik data
13+
val traefikBaseHost: String = "delphi.cs.upb.de"
14+
val traefikDockerNetwork: String = "web"
15+
1216

1317
val recoveryFileName : String = "dump.temp"
1418

src/main/scala/de/upb/cs/swt/delphi/instanceregistry/Docker/Container.scala

+8-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,14 @@ case class ContainerConfig(
2525
Image: String,
2626
Entrypoint: Option[Seq[String]] = None,
2727
Cmd: Seq[String] = Seq.empty,
28-
Env: Seq[String] = Seq.empty)
28+
Env: Seq[String] = Seq.empty,
29+
Labels: Map[String, String] = Map.empty[String,String],
30+
ExposedPorts: Map[String, EmptyExposedPortConfig] = Map.empty,
31+
NetworkingConfig: NetworkConfig = NetworkConfig(Map.empty))
32+
33+
case class NetworkConfig(EndpointsConfig: Map[String, EmptyEndpointConfig])
34+
case class EmptyEndpointConfig()
35+
case class EmptyExposedPortConfig()
2936

3037
case class Networks(
3138
IPAddress: String

src/main/scala/de/upb/cs/swt/delphi/instanceregistry/Docker/DockerActor.scala

+25-15
Original file line numberDiff line numberDiff line change
@@ -36,27 +36,37 @@ class DockerActor(connection: DockerConnection) extends Actor with ActorLogging
3636
}
3737

3838
case create(componentType, instanceId, containerName) =>
39-
val containerConfig = ContainerConfig(Image = DockerImage.getImageName(componentType),
40-
Env = Seq(s"INSTANCE_ID=$instanceId", s"DELPHI_IR_URI=${Registry.configuration.uriInLocalNetwork}",
41-
s"DELPHI_JWT_SECRET=${Registry.configuration.jwtSecretKey}"))
39+
40+
val instancePort = componentType match {
41+
case ComponentType.Crawler => Registry.configuration.defaultCrawlerPort
42+
case ComponentType.WebApi => Registry.configuration.defaultWebApiPort
43+
case ComponentType.WebApp => Registry.configuration.defaultWepAppPort
44+
case t => throw new RuntimeException(s"Invalid component type $t, cannot deploy container.")
45+
}
46+
47+
val networkConfig = NetworkConfig(Map(Registry.configuration.traefikDockerNetwork -> EmptyEndpointConfig()))
48+
49+
val traefikHostUrl = componentType.toString.toLowerCase + instanceId.toString + "." + Registry.configuration.traefikBaseHost
50+
51+
val containerConfig = ContainerConfig(
52+
Image = DockerImage.getImageName(componentType),
53+
Env = Seq(
54+
s"INSTANCE_ID=$instanceId",
55+
s"DELPHI_IR_URI=${Registry.configuration.uriInLocalNetwork}",
56+
s"DELPHI_JWT_SECRET=${Registry.configuration.jwtSecretKey}"
57+
),
58+
Labels = Map("traefik.frontend.rule" -> s"Host:$traefikHostUrl"),
59+
ExposedPorts = Map(s"$instancePort/tcp" -> EmptyExposedPortConfig()),
60+
NetworkingConfig = networkConfig
61+
)
4262

4363
val createCommand = Try(Await.result(container.create(containerConfig, containerName), Duration.Inf))
4464
createCommand match {
4565
case Failure(ex) => sender ! Failure(ex)
4666
case Success(containerResult) =>
4767
Await.ready(container.start(containerResult.Id), Duration.Inf)
48-
log.info(s"Docker Instance created and started")
49-
val containerInfo = Await.result(container.get(containerResult.Id), Duration.Inf)
50-
51-
val instancePort = componentType match {
52-
case ComponentType.Crawler => Registry.configuration.defaultCrawlerPort
53-
case ComponentType.WebApi => Registry.configuration.defaultWebApiPort
54-
case ComponentType.WebApp => Registry.configuration.defaultWepAppPort
55-
case t => throw new RuntimeException(s"Invalid component type $t, cannot deploy container.")
56-
}
57-
58-
log.info("ip address is " + containerInfo.IPAddress)
59-
sender ! Success(containerResult.Id, containerInfo.IPAddress, instancePort)
68+
log.info(s"Docker Instance created and started, host is $traefikHostUrl")
69+
sender ! Success(containerResult.Id, traefikHostUrl, instancePort)
6070
}
6171

6272
case stop(containerId) =>

src/main/scala/de/upb/cs/swt/delphi/instanceregistry/Docker/JsonSupport.scala

+4-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,10 @@ trait JsonSupport extends SprayJsonSupport with DefaultJsonProtocol {
6969
}
7070
implicit val StatusFormat = jsonFormat6(ContainerStatus)
7171
implicit val ResponseFormat = jsonFormat2(CreateContainerResponse)
72-
implicit val ConfigFormat = jsonFormat4(ContainerConfig)
72+
implicit val ExposedPortConfigFormat = jsonFormat0(EmptyExposedPortConfig)
73+
implicit val EndpointsConfigFormat = jsonFormat0(EmptyEndpointConfig)
74+
implicit val NetworkConfigFormat = jsonFormat1(NetworkConfig)
75+
implicit val ConfigFormat = jsonFormat7(ContainerConfig)
7376
implicit val NetworkFormat = jsonFormat1(Networks)
7477
}
7578

src/main/scala/de/upb/cs/swt/delphi/instanceregistry/RequestHandler.scala

+2-3
Original file line numberDiff line numberDiff line change
@@ -274,11 +274,10 @@ class RequestHandler(configuration: Configuration, instanceDao: InstanceDAO, con
274274
fireDockerOperationErrorEvent(None, s"Deploy failed with message: ${ex.getMessage}")
275275
Failure(new RuntimeException(s"Failed to deploy container, docker host not reachable (${ex.getMessage})."))
276276
case Success((dockerId, host, port)) =>
277-
val normalizedHost = host.substring(1, host.length - 1)
278-
log.info(s"Deployed new container with id $dockerId, host $normalizedHost and port $port.")
277+
log.info(s"Deployed new container with id $dockerId, host $host and port $port.")
279278

280279
val newInstance = Instance(Some(id),
281-
normalizedHost,
280+
host,
282281
port,
283282
name.getOrElse(s"Generic $componentType"),
284283
componentType,

0 commit comments

Comments
 (0)