Skip to content

Commit 028ff65

Browse files
author
Johannes Duesing
committed
Changed instance model: Traefik configuration is now attributte
Host will hold docker IP, traefikConfiguration.hostName will hold Traefik host name
1 parent f18e822 commit 028ff65

File tree

7 files changed

+67
-23
lines changed

7 files changed

+67
-23
lines changed

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

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -178,10 +178,17 @@ class ContainerCommands(connection: DockerConnection) extends JsonSupport with C
178178
response.status match {
179179
case StatusCodes.OK =>
180180
Unmarshal(response.entity).to[String].map { json =>
181-
val out = json.parseJson.asJsObject.getFields("NetworkSettings")
182-
out match {
183-
case Seq(network) => Networks(network.asJsObject.fields("IPAddress").toString())
184-
case _ => throw DeserializationException("Cannot find required field NetworkSettings/IPAddress")
181+
182+
Try[Networks]{
183+
val ip = json.parseJson.asJsObject.fields("NetworkSettings")
184+
.asJsObject.fields("Networks")
185+
.asJsObject.fields(Registry.configuration.traefikDockerNetwork)
186+
.asJsObject.getFields("IPAddress").head.toString.replace("\"", "")
187+
Networks(ip)
188+
} match {
189+
case Success(network) => network
190+
case Failure(ex) =>
191+
throw DeserializationException(s"Failed to extract IPAddress from docker with message ${ex.getMessage}")
185192
}
186193

187194
}

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,12 @@ class DockerActor(connection: DockerConnection) extends Actor with ActorLogging
6565
case Failure(ex) => sender ! Failure(ex)
6666
case Success(containerResult) =>
6767
Await.ready(container.start(containerResult.Id), Duration.Inf)
68-
log.info(s"Docker Instance created and started, host is $traefikHostUrl")
69-
sender ! Success(containerResult.Id, traefikHostUrl, instancePort)
68+
69+
val containerInfo = Await.result(container.get(containerResult.Id), Duration.Inf)
70+
71+
log.info(s"Docker Instance created and started, ip is ${containerInfo.IPAddress}, host is $traefikHostUrl")
72+
73+
sender ! Success(containerResult.Id, containerInfo.IPAddress, instancePort, traefikHostUrl)
7074
}
7175

7276
case stop(containerId) =>

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -269,16 +269,18 @@ class RequestHandler(configuration: Configuration, instanceDao: InstanceDAO, con
269269
implicit val timeout: Timeout = configuration.dockerOperationTimeout
270270

271271
val future: Future[Any] = dockerActor ? create(componentType, id)
272-
val deployResult = Await.result(future, timeout.duration).asInstanceOf[Try[(String, String, Int)]]
272+
val deployResult = Await.result(future, timeout.duration).asInstanceOf[Try[(String, String, Int, String)]]
273273

274274
deployResult match {
275275
case Failure(ex) =>
276276
log.error(s"Failed to deploy container, docker host not reachable.")
277277
instanceDao.removeInstance(id)
278278
fireDockerOperationErrorEvent(None, s"Deploy failed with message: ${ex.getMessage}")
279279
Failure(new RuntimeException(s"Failed to deploy container, docker host not reachable (${ex.getMessage})."))
280-
case Success((dockerId, host, port)) =>
281-
log.info(s"Deployed new container with id $dockerId, host $host and port $port.")
280+
case Success((dockerId, host, port, traefikHost)) =>
281+
log.info(s"Deployed new container with id $dockerId, host $host, port $port and Traefik host $traefikHost.")
282+
283+
val traefikConfig = TraefikConfiguration(traefikHost, configuration.traefikUri)
282284

283285
val newInstance = Instance(Some(id),
284286
host,
@@ -289,7 +291,8 @@ class RequestHandler(configuration: Configuration, instanceDao: InstanceDAO, con
289291
InstanceState.Deploying,
290292
List.empty[String],
291293
List.empty[InstanceLink],
292-
List.empty[InstanceLink]
294+
List.empty[InstanceLink],
295+
Some(traefikConfig)
293296
)
294297

295298
instanceDao.updateInstance(newInstance) match {

src/main/scala/de/upb/cs/swt/delphi/instanceregistry/daos/DatabaseInstanceDAO.scala

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,9 @@ class DatabaseInstanceDAO (configuration : Configuration) extends InstanceDAO wi
4242
val dockerId = instance.dockerId
4343
val instanceState = instance.instanceState.toString
4444
val labels = getListAsString(instance.labels)
45+
val traefikHost = instance.traefikConfiguration.map(conf => conf.hostName)
4546

46-
val addFuture: Future[Long] = db.run((instances returning instances.map(_.id)) += (id, host, port, name, componentType, dockerId, instanceState, labels))
47+
val addFuture: Future[Long] = db.run((instances returning instances.map(_.id)) += (id, host, port, name, componentType, dockerId, instanceState, labels, traefikHost))
4748
val instanceId = Await.result(addFuture, Duration.Inf)
4849

4950
log.info(s"Added instance ${instance.name} with id $instanceId to database.")
@@ -83,9 +84,10 @@ class DatabaseInstanceDAO (configuration : Configuration) extends InstanceDAO wi
8384
val port = instance.portNumber
8485
val dockerId = instance.dockerId
8586
val instanceState = instance.instanceState.toString
87+
val traefikHost = instance.traefikConfiguration.map(_.hostName)
8688

87-
val q = for {i <- instances if i.id === instance.id.get} yield (i.host, i.portNumber, i.dockerId, i.instanceState)
88-
Await.result(db.run(q.update(host, port, dockerId, instanceState)), Duration.Inf)
89+
val q = for {i <- instances if i.id === instance.id.get} yield (i.host, i.portNumber, i.dockerId, i.instanceState, i.traefikHostName)
90+
Await.result(db.run(q.update(host, port, dockerId, instanceState, traefikHost)), Duration.Inf)
8991
Success()
9092
} else {
9193
Failure(new RuntimeException(s"Id ${instance.id.get} not found."))
@@ -390,14 +392,27 @@ class DatabaseInstanceDAO (configuration : Configuration) extends InstanceDAO wi
390392
listItems.split(",").toList
391393
}
392394

393-
private def dataToObjectInstance(options : Option[(Long, String, Long, String, String, Option[String], String, String)]): Instance = {
395+
private def dataToObjectInstance(options : Option[(Long, String, Long, String, String, Option[String], String, String, Option[String])]): Instance = {
394396
val optionValue = options.get
395397
val componentTypeObj = getComponentTypeFromString(optionValue._5)
396398
val instanceStateObj = getInstanceStateFromString(optionValue._7)
397399
val labelsList = getListFromString(optionValue._8)
398400
val linksTo = getLinksTo(optionValue._1)
399401
val LinksFrom = getLinksFrom(optionValue._1)
400-
Instance.apply(Option(optionValue._1), optionValue._2, optionValue._3, optionValue._4, componentTypeObj, optionValue._6, instanceStateObj, labelsList, linksTo, LinksFrom)
402+
403+
val traefikConfig = optionValue._9.map(host => TraefikConfiguration(host, configuration.traefikUri))
404+
405+
Instance(Option(optionValue._1),
406+
optionValue._2,
407+
optionValue._3,
408+
optionValue._4,
409+
componentTypeObj,
410+
optionValue._6,
411+
instanceStateObj,
412+
labelsList,
413+
linksTo,
414+
LinksFrom,
415+
traefikConfig)
401416
}
402417

403418
private def removeInstancesWithId(id: Long): Unit ={

src/main/scala/de/upb/cs/swt/delphi/instanceregistry/daos/DynamicInstanceDAO.scala

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ class DynamicInstanceDAO (configuration : Configuration) extends InstanceDAO wit
3636
val id = nextId()
3737

3838
val newInstance = Instance(Some(id), instance.host, instance.portNumber, instance.name, instance.componentType,
39-
instance.dockerId, instance.instanceState,instance.labels, instance.linksTo, instance.linksFrom)
39+
instance.dockerId, instance.instanceState,instance.labels, instance.linksTo, instance.linksFrom, instance.traefikConfiguration)
4040
instances.add(newInstance)
4141
instanceMatchingResults.put(newInstance.id.get, mutable.MutableList())
4242
instanceEvents.put(newInstance.id.get, mutable.MutableList())
@@ -164,7 +164,8 @@ class DynamicInstanceDAO (configuration : Configuration) extends InstanceDAO wit
164164
state,
165165
instance.labels,
166166
instance.linksTo,
167-
instance.linksFrom)
167+
instance.linksFrom,
168+
instance.traefikConfiguration)
168169
instances filter {i => i.id == instance.id} map instances.remove
169170
instances.add(newInstance)
170171
Success()
@@ -193,7 +194,8 @@ class DynamicInstanceDAO (configuration : Configuration) extends InstanceDAO wit
193194
instance.instanceState,
194195
instance.labels ++ List[String](label),
195196
instance.linksTo,
196-
instance.linksFrom)
197+
instance.linksFrom,
198+
instance.traefikConfiguration)
197199
instances filter {i => i.id == instance.id} map instances.remove
198200
instances.add(newInstance)
199201
Success()
@@ -292,7 +294,8 @@ class DynamicInstanceDAO (configuration : Configuration) extends InstanceDAO wit
292294
instance.instanceState,
293295
instance.labels,
294296
linksTo,
295-
linksFrom
297+
linksFrom,
298+
instance.traefikConfiguration
296299
)
297300
}
298301

src/main/scala/de/upb/cs/swt/delphi/instanceregistry/daos/Tables.scala

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import slick.jdbc.MySQLProfile
66
import slick.jdbc.MySQLProfile.api._
77
import slick.sql.SqlProfile.ColumnOption.{NotNull, SqlType}
88

9-
class Instances(tag: Tag) extends Table[(Long, String, Long, String, String, Option[String], String, String)](tag, "instances") {
9+
class Instances(tag: Tag) extends Table[(Long, String, Long, String, String, Option[String], String, String, Option[String])](tag, "instances") {
1010
def id = column[Long]("id", O.PrimaryKey, O.AutoInc) // This is the primary key column
1111
def host = column[String]("host", O.Length(255), NotNull)
1212
def portNumber = column[Long]("portNumber", NotNull)
@@ -17,7 +17,9 @@ class Instances(tag: Tag) extends Table[(Long, String, Long, String, String, Opt
1717
def instanceState = column[String]("instanceState", O.Length(50), NotNull)
1818
def labels = column[String]("labels", O.Length(255), NotNull)
1919

20-
def * = (id, host, portNumber, name, componentType, dockerId, instanceState, labels)
20+
def traefikHostName = column[Option[String]]("traefikHostName", O.Length(255), O.Default(None))
21+
22+
def * = (id, host, portNumber, name, componentType, dockerId, instanceState, labels, traefikHostName)
2123
}
2224

2325
class InstanceMatchingResults(tag: Tag) extends Table[(Long, Long, Boolean)](tag, "instance_matching_results") {

src/main/scala/de/upb/cs/swt/delphi/instanceregistry/io/swagger/client/model/Instance.scala

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,10 @@ trait InstanceJsonSupport extends SprayJsonSupport with DefaultJsonProtocol with
6868
}
6969
}
7070

71+
//JSON format for traefik config information
72+
implicit val traefikConfigFormat : JsonFormat[TraefikConfiguration] = jsonFormat2(TraefikConfiguration)
7173
//JSON format for Instances
72-
implicit val instanceFormat : JsonFormat[Instance] = jsonFormat10(Instance)
74+
implicit val instanceFormat : JsonFormat[Instance] = jsonFormat11(Instance)
7375
}
7476

7577
/**
@@ -92,9 +94,17 @@ final case class Instance (
9294
instanceState: InstanceState,
9395
labels: List[String],
9496
linksTo: List[InstanceLink],
95-
linksFrom: List[InstanceLink]
97+
linksFrom: List[InstanceLink],
98+
traefikConfiguration: Option[TraefikConfiguration] = None
9699
)
97100

101+
/**
102+
* The connection information regarding the Traefik reverse-proxy setup
103+
* @param hostName DNS host name that has been assigned to this instance
104+
* @param proxyUri URI that the Traefik reverse-proxy is running at
105+
*/
106+
final case class TraefikConfiguration (hostName: String, proxyUri: String)
107+
98108
/**
99109
* Enumerations concerning instances
100110
*/

0 commit comments

Comments
 (0)