@@ -17,6 +17,7 @@ class InstanceActions(val project: Project) {
1717
1818 progressLogger.started()
1919
20+ // Check if delay is configured
2021 if (config.awaitDelay > 0 ) {
2122 logger.info(" Delaying due to pending operations on instance(s)." )
2223
@@ -31,7 +32,11 @@ class InstanceActions(val project: Project) {
3132 logger.info(" Checking stability of instance(s)." )
3233
3334 var lastInstanceStates = - 1
35+ var sinceStableTicks = - 1L
36+ var sinceStableElapsed = 0L
37+
3438 Behaviors .waitUntil(config.awaitInterval, { timer ->
39+ // Gather all instance states and update checksum on any particular state change
3540 val instanceStates = instances.map { InstanceState (project, it) }
3641 if (instanceStates.hashCode() != lastInstanceStates) {
3742 lastInstanceStates = instanceStates.hashCode()
@@ -40,14 +45,35 @@ class InstanceActions(val project: Project) {
4045
4146 progressLogger.progress(progressFor(instanceStates, config, timer))
4247
48+ // Detect timeout when same checksum is not being updated so long
4349 if (config.awaitTimes > 0 && timer.ticks > config.awaitTimes) {
44- logger.warn(" Instance(s) are not stable. Timeout reached after ${Formats .duration(timer.elapsed)} " )
45- return @waitUntil false
50+ val message = " Instance(s) are not stable. Timeout reached after ${Formats .duration(timer.elapsed)} ."
51+ if (config.awaitFail) {
52+ throw InstanceException (message)
53+ } else {
54+ logger.warn(message)
55+ return @waitUntil false
56+ }
4657 }
4758
48- if (instanceStates.all { it.stable }) {
49- logger.info(" Instance(s) are stable after ${Formats .duration(timer.elapsed)} " )
50- return @waitUntil false
59+ // Verify gathered instance states
60+ if (instanceStates.all(config.awaitCondition)) {
61+ // Assure that expected moment is not accidental, remember it
62+ if (config.awaitAssurances > 0 && sinceStableTicks == - 1L ) {
63+ logger.info(" Instance(s) seems to be stable. Assuring." )
64+ sinceStableTicks = timer.ticks
65+ sinceStableElapsed = timer.elapsed
66+ }
67+
68+ // End if assurance is not configured or this moment remains a little longer
69+ if (config.awaitAssurances <= 0 || (sinceStableTicks >= 0 && (timer.ticks - sinceStableTicks) >= config.awaitAssurances)) {
70+ logger.info(" Instance(s) are stable after ${Formats .duration(sinceStableElapsed)} ." )
71+ return @waitUntil false
72+ }
73+ } else {
74+ // Reset assurance, because no longer verified
75+ sinceStableTicks = - 1L
76+ sinceStableElapsed = 0L
5177 }
5278
5379 true
@@ -56,27 +82,37 @@ class InstanceActions(val project: Project) {
5682 progressLogger.completed()
5783 }
5884
59- private fun progressFor (instanceStates : List <InstanceState >, timer : Behaviors .Timer ) =
60- instanceStates. joinToString(" | " ) { progressFor(it, timer.ticks, 0 ) }
85+ private fun progressFor (states : List <InstanceState >, timer : Behaviors .Timer ) =
86+ (progressTicks(timer.ticks, 0 ) + " " + states. joinToString(" | " ) { progressFor(it, timer.ticks) }).trim()
6187
62- private fun progressFor (instanceStates : List <InstanceState >, config : AemConfig , timer : Behaviors .Timer ) =
63- instanceStates. joinToString(" | " ) { progressFor(it, timer.ticks, config.awaitTimes ) }
88+ private fun progressFor (states : List <InstanceState >, config : AemConfig , timer : Behaviors .Timer ) =
89+ (progressTicks(timer.ticks, config.awaitTimes) + " " + states. joinToString(" | " ) { progressFor(it, timer.ticks) }).trim()
6490
65- private fun progressFor (it : InstanceState , tick : Long , maxTicks : Long ): String {
66- return " ${it .instance.name} : ${progressIndicator(it , tick, maxTicks )} ${it .bundleState.statsWithLabels} [${it .bundleState.stablePercent} ]"
91+ private fun progressFor (state : InstanceState , tick : Long ): String {
92+ return " ${state .instance.name} : ${progressIndicator(state , tick)} ${state .bundleState.statsWithLabels} [${state .bundleState.stablePercent} ]"
6793 }
6894
69- private fun progressIndicator ( state : InstanceState , tick : Long , maxTicks : Long ): String {
70- var indicator = if (state.stable || tick.rem( 2 ) == 0L ) {
71- " * "
95+ private fun progressTicks ( tick : Long , maxTicks : Long ): String {
96+ return if (maxTicks > 0 && (tick.toDouble() / maxTicks.toDouble() > 0.1 ) ) {
97+ " [ $tick / $maxTicks tt] "
7298 } else {
73- " "
99+ " "
74100 }
101+ }
75102
76- if (maxTicks > 0 && (tick.toDouble() / maxTicks.toDouble() > 0.1 )) {
77- indicator + = " [$tick /$maxTicks tt]"
103+ private fun progressIndicator (state : InstanceState , tick : Long ): String {
104+ var indicator = if (tick.rem(2 ) == 0L ) {
105+ if (state.config.awaitCondition(state)) {
106+ " +"
107+ } else {
108+ " -"
109+ }
110+ } else {
111+ " "
78112 }
79113
114+
115+
80116 return indicator
81117 }
82118
0 commit comments