Skip to content

Commit 2f76b1f

Browse files
author
Krystian Panek
committed
Multi-container impr
1 parent 951d344 commit 2f76b1f

File tree

5 files changed

+74
-50
lines changed

5 files changed

+74
-50
lines changed

build.gradle.kts

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -186,21 +186,25 @@ githubRelease {
186186
releaseName(project.version.toString())
187187
releaseAssets(tasks["jar"], tasks["sourcesJar"], tasks["javadocJar"])
188188
draft((project.findProperty("github.draft") ?: "false").toString().toBoolean())
189-
prerelease((project.findProperty("github.prerelease") ?: "false").toString().toBoolean())
190189
overwrite((project.findProperty("github.override") ?: "true").toString().toBoolean())
191190

192-
body { """
193-
|# What's new
194-
|
195-
|TBD
196-
|
197-
|# Upgrade notes
198-
|
199-
|Nothing to do.
200-
|
201-
|# Contributions
202-
|
203-
|None.
204-
""".trimMargin()
191+
val prerelease = (project.findProperty("github.prerelease") ?: "true").toString().toBoolean()
192+
if (prerelease) {
193+
prerelease(true)
194+
} else {
195+
body { """
196+
|# What's new
197+
|
198+
|TBD
199+
|
200+
|# Upgrade notes
201+
|
202+
|Nothing to do.
203+
|
204+
|# Contributions
205+
|
206+
|None.
207+
""".trimMargin()
208+
}
205209
}
206210
}

src/main/kotlin/com/cognifide/gradle/environment/docker/Container.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class Container(val docker: Docker, val name: String) {
1616

1717
private val logger = common.logger
1818

19-
val internalName = "${docker.stack.internalName}_$name"
19+
val internalName get() = "${docker.stack.internalName.get()}_$name"
2020

2121
val host = HostFileManager(this)
2222

@@ -91,8 +91,7 @@ class Container(val docker: Docker, val name: String) {
9191
}
9292
}
9393

94-
val up: Boolean
95-
get() = running && isLocked(LOCK_UP)
94+
val up: Boolean get() = running && isLocked(LOCK_UP)
9695

9796
private val lockRequired = mutableSetOf<String>()
9897

@@ -114,7 +113,7 @@ class Container(val docker: Docker, val name: String) {
114113
}
115114

116115
add("Consider troubleshooting:")
117-
add("* using command: 'docker stack ps ${docker.stack.internalName} --no-trunc'")
116+
add("* using command: 'docker stack ps ${docker.stack.internalName.get()} --no-trunc'")
118117
add("* restarting Docker")
119118

120119
throw ContainerException(joinToString("\n"))

src/main/kotlin/com/cognifide/gradle/environment/docker/ContainerManager.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ class ContainerManager(private val docker: Docker) {
1818
return Container(docker, name).apply { definition(); defined.add(this) }
1919
}
2020

21+
fun define(vararg names: String) = define(names.asIterable())
22+
23+
fun define(names: Iterable<String>) = names.forEach { define(it) {} }
24+
2125
/**
2226
* Shorthand for defining container by string invocation.
2327
*/

src/main/kotlin/com/cognifide/gradle/environment/docker/Docker.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ class Docker(val environment: EnvironmentExtension) {
173173
}
174174
}
175175
if (name == null) {
176-
name = "${stack.internalName}_$id"
176+
name = "${stack.internalName.get()}_$id"
177177
}
178178
}
179179

src/main/kotlin/com/cognifide/gradle/environment/docker/Stack.kt

Lines changed: 48 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,42 @@ class Stack(val environment: EnvironmentExtension) {
1212

1313
private val common = environment.common
1414

15-
val internalName = common.prop.string("environment.docker.stack.name") ?: common.project.rootProject.name
15+
val internalName = common.obj.string {
16+
convention(common.project.rootProject.name)
17+
common.prop.string("environment.docker.stack.name")?.let { set(it) }
18+
}
19+
20+
val networkSuffix = common.obj.string {
21+
convention("docker-net")
22+
common.prop.string("environment.docker.networkSuffix")?.let { set(it) }
23+
}
24+
25+
val networkName = common.obj.string {
26+
convention(internalName.map { "${it}_${networkSuffix.get()}" })
27+
}
1628

17-
var initTimeout = common.prop.long("environment.docker.stack.initTimeout") ?: 30_000L
29+
val networkTimeout = common.obj.long {
30+
convention(30_000L)
31+
common.prop.long("environment.docker.stack.networkTimeout")?.let { set(it) }
32+
}
33+
34+
val networkAvailable: Boolean
35+
get() {
36+
val result = DockerProcess.execQuietly {
37+
withTimeoutMillis(networkTimeout.get())
38+
withArgs("network", "inspect", networkName.get())
39+
}
40+
return when {
41+
result.exitValue == 0 -> true
42+
result.errorString.contains("Error: No such network") -> false
43+
else -> throw StackException("Unable to determine Docker stack '${internalName.get()}' status. Error: '${result.errorString}'")
44+
}
45+
}
46+
47+
val initTimeout = common.obj.long {
48+
convention(30_000L)
49+
common.prop.long("environment.docker.stack.initTimeout")?.let { set(it) }
50+
}
1851

1952
val initialized: Boolean by lazy {
2053
var error: Exception? = null
@@ -38,7 +71,7 @@ class Stack(val environment: EnvironmentExtension) {
3871

3972
private fun initSwarm() {
4073
val result = DockerProcess.execQuietly {
41-
withTimeoutMillis(initTimeout)
74+
withTimeoutMillis(initTimeout.get())
4275
withArgs("swarm", "init")
4376

4477
if (environment.docker.runtime is Toolbox) {
@@ -54,20 +87,20 @@ class Stack(val environment: EnvironmentExtension) {
5487

5588
fun deploy() {
5689
common.progressIndicator {
57-
message = "Starting stack '$internalName'"
90+
message = "Starting stack '${internalName.get()}'"
5891

5992
try {
6093
val composeFilePath = environment.docker.composeFile.get().asFile.path
61-
DockerProcess.exec { withArgs("stack", "deploy", "-c", composeFilePath, internalName) }
94+
DockerProcess.exec { withArgs("stack", "deploy", "-c", composeFilePath, internalName.get()) }
6295
} catch (e: DockerException) {
63-
throw StackException("Failed to deploy Docker stack '$internalName'!", e)
96+
throw StackException("Failed to deploy Docker stack '${internalName.get()}'!", e)
6497
}
6598

66-
message = "Awaiting started stack '$internalName'"
99+
message = "Awaiting started stack '${internalName.get()}'"
67100
Behaviors.waitUntil(deployRetry.delay) { timer ->
68101
val running = networkAvailable
69102
if (timer.ticks == deployRetry.times && !running) {
70-
throw EnvironmentException("Failed to start stack named '$internalName'!")
103+
throw EnvironmentException("Failed to start stack named '${internalName.get()}'!")
71104
}
72105

73106
!running
@@ -79,44 +112,28 @@ class Stack(val environment: EnvironmentExtension) {
79112

80113
fun undeploy() {
81114
common.progressIndicator {
82-
message = "Stopping stack '$internalName'"
115+
message = "Stopping stack '${internalName.get()}'"
83116

84117
try {
85-
DockerProcess.exec { withArgs("stack", "rm", internalName) }
118+
DockerProcess.exec { withArgs("stack", "rm", internalName.get()) }
86119
} catch (e: DockerException) {
87-
throw StackException("Failed to remove Docker stack '$internalName'!", e)
120+
throw StackException("Failed to remove Docker stack '${internalName.get()}'!", e)
88121
}
89122

90-
message = "Awaiting stopped stack '$internalName'"
123+
message = "Awaiting stopped stack '${internalName.get()}'"
91124
Behaviors.waitUntil(undeployRetry.delay) { timer ->
92125
val running = networkAvailable
93126
if (timer.ticks == undeployRetry.times && running) {
94-
throw EnvironmentException("Failed to stop stack named '$internalName'!" +
95-
" Try to stop manually using Docker command: 'docker stack rm $internalName'")
127+
throw EnvironmentException("Failed to stop stack named '${internalName.get()}'!" +
128+
" Try to stop manually using Docker command: 'docker stack rm ${internalName.get()}'")
96129
}
97130

98131
running
99132
}
100133
}
101134
}
102135

103-
var networkTimeout = common.prop.long("environment.docker.stack.networkTimeout") ?: 30_000L
104-
105-
val networkAvailable: Boolean
106-
get() {
107-
val result = DockerProcess.execQuietly {
108-
withTimeoutMillis(networkTimeout)
109-
withArgs("network", "inspect", "${internalName}_docker-net")
110-
}
111-
return when {
112-
result.exitValue == 0 -> true
113-
result.errorString.contains("Error: No such network") -> false
114-
else -> throw StackException("Unable to determine Docker stack '$internalName' status. Error: '${result.errorString}'")
115-
}
116-
}
117-
118-
val running: Boolean
119-
get() = initialized && networkAvailable
136+
val running: Boolean get() = initialized && networkAvailable
120137

121138
fun reset() {
122139
undeploy()

0 commit comments

Comments
 (0)