Skip to content

Commit 20acf36

Browse files
authored
Merge pull request #79 from ovotech/dependencies
Added dependencies without links
2 parents b619d6c + c39bc69 commit 20acf36

File tree

3 files changed

+82
-35
lines changed

3 files changed

+82
-35
lines changed

core/src/main/scala/com/whisk/docker/DockerContainer.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ case class DockerContainer(image: String,
1717
tty: Boolean = false,
1818
stdinOpen: Boolean = false,
1919
links: Seq[ContainerLink] = Seq.empty,
20+
unlinkedDependencies: Seq[DockerContainer] = Seq.empty,
2021
env: Seq[String] = Seq.empty,
2122
networkMode: Option[String] = None,
2223
readyChecker: DockerReadyChecker = DockerReadyChecker.Always,
@@ -34,6 +35,11 @@ case class DockerContainer(image: String,
3435

3536
def withLinks(links: ContainerLink*) = copy(links = links.toSeq)
3637

38+
def withUnlinkedDependencies(unlinkedDependencies: DockerContainer*) =
39+
copy(unlinkedDependencies = unlinkedDependencies.toSeq)
40+
41+
def dependencies: Seq[DockerContainer] = links.map(_.container) ++ unlinkedDependencies
42+
3743
def withReadyChecker(checker: DockerReadyChecker) = copy(readyChecker = checker)
3844

3945
def withEnv(env: String*) = copy(env = env)

core/src/main/scala/com/whisk/docker/DockerContainerManager.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,19 +84,19 @@ object DockerContainerManager {
8484
@tailrec def buildDependencyGraph(graph: ContainerDependencyGraph): ContainerDependencyGraph =
8585
graph match {
8686
case ContainerDependencyGraph(containers, dependants) =>
87-
containers.partition(_.links.isEmpty) match {
87+
containers.partition(_.dependencies.isEmpty) match {
8888
case (containersWithoutLinks, Nil) => graph
8989
case (containersWithoutLinks, containersWithLinks) =>
9090
val linkedContainers = containers.foldLeft(Seq[DockerContainer]()) {
91-
case (links, container) => (links ++ container.links.map(_.container))
91+
case (links, container) => (links ++ container.dependencies)
9292
}
9393
val (containersWithLinksAndLinked, containersWithLinksNotLinked) =
9494
containersWithLinks.partition(linkedContainers.contains)
9595
val (containersToBeLeftAtCurrentPosition, containersToBeMovedUpALevel) = dependants
9696
.map(_.containers)
9797
.getOrElse(List.empty)
9898
.partition(
99-
_.links.map(_.container).exists(containersWithLinksNotLinked.contains)
99+
_.dependencies.exists(containersWithLinksNotLinked.contains)
100100
)
101101

102102
buildDependencyGraph(
Lines changed: 73 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,92 @@
11
package com.whisk.docker
22

3-
import com.whisk.docker.scalatest.DockerTestKit
3+
import com.whisk.docker.DockerContainerManager._
44
import com.whisk.docker.impl.dockerjava._
55
import org.scalatest._
6-
import org.scalatest.concurrent.ScalaFutures
7-
import org.scalatest.time._
8-
import DockerContainerManager._
96

107
class DockerContainerManagerSpec extends WordSpecLike with Matchers {
118

12-
val container1 = DockerContainer("nginx:1.7.11", name = Some("container1"))
13-
val container2a = DockerContainer("nginx:1.7.11", name = Some("container2a")).withLinks(ContainerLink(container1, "container1"))
14-
val container2b = DockerContainer("nginx:1.7.11", name = Some("container2b")).withLinks(ContainerLink(container1, "container1"))
15-
val container3 = DockerContainer("nginx:1.7.11", name = Some("container3")).withLinks(ContainerLink(container2a, "container2a"))
16-
val container4 = DockerContainer("nginx:1.7.11", name = Some("container4")).withLinks(ContainerLink(container3, "container4"))
17-
val container5 = DockerContainer("nginx:1.7.11", name = Some("container5"))
18-
val containers = List(container1, container2a, container2b, container3, container4, container5)
19-
9+
2010
"The DockerContainerManager" should {
21-
"build a dependency graph from a list of containers" in {
22-
buildDependencyGraph(containers) shouldBe ContainerDependencyGraph(
23-
containers = Seq(container1, container5),
24-
dependants = Some(ContainerDependencyGraph(
25-
containers = Seq(container2a, container2b),
11+
"a list of containers with dependencies" should {
12+
val linkedContainer1 = DockerContainer("nginx:1.7.11", name = Some("linkedContainer1"))
13+
val linkedContainer2a = DockerContainer("nginx:1.7.11", name = Some("linkedContainer2a")).withLinks(ContainerLink(linkedContainer1, "linkedContainer1"))
14+
val linkedContainer2b = DockerContainer("nginx:1.7.11", name = Some("linkedContainer2b")).withLinks(ContainerLink(linkedContainer1, "linkedContainer1"))
15+
val linkedContainer3 = DockerContainer("nginx:1.7.11", name = Some("linkedContainer3")).withLinks(ContainerLink(linkedContainer2a, "linkedContainer2a"))
16+
val linkedContainer4 = DockerContainer("nginx:1.7.11", name = Some("linkedContainer4")).withLinks(ContainerLink(linkedContainer3, "linkedContainer4"))
17+
val linkedContainer5 = DockerContainer("nginx:1.7.11", name = Some("linkedContainer5"))
18+
val linkedContainers = List(linkedContainer1, linkedContainer2a, linkedContainer2b, linkedContainer3, linkedContainer4, linkedContainer5)
19+
20+
"build a dependency graph from a list of containers with dependencies" in {
21+
buildDependencyGraph(linkedContainers) shouldBe ContainerDependencyGraph(
22+
containers = Seq(linkedContainer1, linkedContainer5),
2623
dependants = Some(ContainerDependencyGraph(
27-
containers = Seq(container3),
24+
containers = Seq(linkedContainer2a, linkedContainer2b),
2825
dependants = Some(ContainerDependencyGraph(
29-
containers = Seq(container4)
26+
containers = Seq(linkedContainer3),
27+
dependants = Some(ContainerDependencyGraph(
28+
containers = Seq(linkedContainer4)
29+
))
3030
))
3131
))
32-
))
33-
)
34-
}
32+
)
33+
}
3534

36-
"build the dependency graph from an empty list of containers" in {
37-
buildDependencyGraph(Seq.empty) shouldBe ContainerDependencyGraph(
38-
containers = Seq.empty,
39-
dependants = None
40-
)
35+
"build the dependency graph from an empty list of containers" in {
36+
buildDependencyGraph(Seq.empty) shouldBe ContainerDependencyGraph(
37+
containers = Seq.empty,
38+
dependants = None
39+
)
40+
}
41+
42+
"initialize all containers taking into account their dependencies" in {
43+
val dockerKit = new DockerKit with DockerKitDockerJava {
44+
override def dockerContainers = linkedContainers ++ super.dockerContainers
45+
}
46+
dockerKit.startAllOrFail()
47+
dockerKit.stopAllQuietly()
48+
}
4149
}
4250

43-
"initialize all containers taking into account their dependencies" in {
44-
val dockerKit = new DockerKit with DockerKitDockerJava {
45-
override def dockerContainers = containers ++ super.dockerContainers
51+
"a list of containers with links" should {
52+
53+
val unlinkedContainer1 = DockerContainer("nginx:1.7.11", name = Some("unlinkedContainer1"))
54+
val unlinkedContainer2a = DockerContainer("nginx:1.7.11", name = Some("unlinkedContainer2a")).withUnlinkedDependencies(unlinkedContainer1)
55+
val unlinkedContainer2b = DockerContainer("nginx:1.7.11", name = Some("unlinkedContainer2b")).withUnlinkedDependencies(unlinkedContainer1)
56+
val unlinkedContainer3 = DockerContainer("nginx:1.7.11", name = Some("unlinkedContainer3")).withUnlinkedDependencies(unlinkedContainer2a)
57+
val unlinkedContainer4 = DockerContainer("nginx:1.7.11", name = Some("unlinkedContainer4")).withUnlinkedDependencies(unlinkedContainer3)
58+
val unlinkedContainer5 = DockerContainer("nginx:1.7.11", name = Some("unlinkedContainer5"))
59+
val unlinkedContainers = List(unlinkedContainer1, unlinkedContainer2a, unlinkedContainer2b, unlinkedContainer3, unlinkedContainer4, unlinkedContainer5)
60+
61+
"build a dependency graph from a list of containers" in {
62+
buildDependencyGraph(unlinkedContainers) shouldBe ContainerDependencyGraph(
63+
containers = Seq(unlinkedContainer1, unlinkedContainer5),
64+
dependants = Some(ContainerDependencyGraph(
65+
containers = Seq(unlinkedContainer2a, unlinkedContainer2b),
66+
dependants = Some(ContainerDependencyGraph(
67+
containers = Seq(unlinkedContainer3),
68+
dependants = Some(ContainerDependencyGraph(
69+
containers = Seq(unlinkedContainer4)
70+
))
71+
))
72+
))
73+
)
74+
}
75+
76+
"build the dependency graph from an empty list of containers" in {
77+
buildDependencyGraph(Seq.empty) shouldBe ContainerDependencyGraph(
78+
containers = Seq.empty,
79+
dependants = None
80+
)
81+
}
82+
83+
"initialize all containers taking into account their dependencies" in {
84+
val dockerKit = new DockerKit with DockerKitDockerJava {
85+
override def dockerContainers = unlinkedContainers ++ super.dockerContainers
86+
}
87+
dockerKit.startAllOrFail()
88+
dockerKit.stopAllQuietly()
4689
}
47-
dockerKit.startAllOrFail()
48-
dockerKit.stopAllQuietly()
4990
}
5091
}
5192
}

0 commit comments

Comments
 (0)