@@ -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