Skip to content

Commit d12eff7

Browse files
author
Timon de Groot
committed
brancher: Poll for SSH reachability after delivery
This prevents continuing the process and deploy to a brancher which we cannot reach yet. So essentially this wait for DNS to settle and potentially other things. The SSH polling continues on the same time elapsed and timeout that the initial polling system used. So if a Brancher node is delivered in 1200 seconds, it only has 300 seconds left for SSH to become reachable (given the default 1500 seconds timeout).
1 parent 7d2950d commit d12eff7

File tree

1 file changed

+56
-10
lines changed

1 file changed

+56
-10
lines changed

src/Brancher/BrancherHypernodeManager.php

Lines changed: 56 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Hypernode\Api\Exception\HypernodeApiClientException;
66
use Hypernode\Api\Exception\HypernodeApiServerException;
7+
use Hypernode\Api\Exception\ResponseException;
78
use Hypernode\Api\HypernodeClient;
89
use Hypernode\Api\HypernodeClientFactory;
910
use Hypernode\Api\Resource\Logbook\Flow;
@@ -28,6 +29,7 @@ public function __construct(LoggerInterface $log)
2829
* @param string $hypernode The parent hypernode to query the Brancher instances from
2930
* @param string[] $labels Labels to match against, may be empty
3031
* @return string[] The found Brancher instance names
32+
* @throws ResponseException
3133
*/
3234
public function queryBrancherHypernodes(string $hypernode, array $labels = []): array
3335
{
@@ -66,10 +68,21 @@ public function queryBrancherHypernodes(string $hypernode, array $labels = []):
6668
*/
6769
public function reuseExistingBrancherHypernode(string $hypernode, array $labels = []): ?string
6870
{
69-
$brancherHypernodes = $this->queryBrancherHypernodes($hypernode, $labels);
70-
if (count($brancherHypernodes) > 0) {
71-
// Return the last brancher Hypernode, which is the most recently created one
72-
return $brancherHypernodes[count($brancherHypernodes) - 1];
71+
try {
72+
$brancherHypernodes = $this->queryBrancherHypernodes($hypernode, $labels);
73+
if (count($brancherHypernodes) > 0) {
74+
// Return the last brancher Hypernode, which is the most recently created one
75+
return $brancherHypernodes[count($brancherHypernodes) - 1];
76+
}
77+
} catch (ResponseException $e) {
78+
$this->log->error(
79+
sprintf(
80+
'Got an API exception (code %d) while querying for existing brancher Hypernodes for Hypernode %s with labels (%s).',
81+
$e->getCode(),
82+
$hypernode,
83+
implode(', ', $labels)
84+
)
85+
);
7386
}
7487

7588
return null;
@@ -108,16 +121,16 @@ public function waitForAvailability(string $brancherHypernode, int $timeout = 15
108121
$interval = 3;
109122
$allowedErrorWindow = 3;
110123

111-
while ($timeElapsed < $timeout && !$resolved) {
124+
while ($timeElapsed < $timeout) {
112125
$now = microtime(true);
113126
$timeElapsed += $now - $latest;
114127
$latest = $now;
115128

116129
try {
117130
$flows = $this->hypernodeClient->logbook->getList($brancherHypernode);
118-
$relevantFlows = array_filter($flows, fn (Flow $flow) => $flow->name === 'ensure_app');
119-
$failedFlows = array_filter($flows, fn (Flow $flow) => $flow->isReverted());
120-
$completedFlows = array_filter($flows, fn (Flow $flow) => $flow->isComplete());
131+
$relevantFlows = array_filter($flows, fn(Flow $flow) => $flow->name === 'ensure_app');
132+
$failedFlows = array_filter($flows, fn(Flow $flow) => $flow->isReverted());
133+
$completedFlows = array_filter($flows, fn(Flow $flow) => $flow->isComplete());
121134

122135
if (count($failedFlows) === count($relevantFlows)) {
123136
throw new CreateBrancherHypernodeFailedException();
@@ -142,19 +155,52 @@ public function waitForAvailability(string $brancherHypernode, int $timeout = 15
142155
$brancherHypernode
143156
)
144157
);
145-
;
146158
continue;
147159
}
148160
}
149161

150162
sleep($interval);
151163
}
152164

165+
$this->log->info(
166+
sprintf(
167+
'Brancher Hypernode %s was delivered. Now waiting for node to become reachable...',
168+
$brancherHypernode
169+
)
170+
);
171+
153172
if (!$resolved) {
154173
throw new TimeoutException(
155-
sprintf('Timed out waiting for brancher Hypernode %s to become available', $brancherHypernode)
174+
sprintf('Timed out waiting for brancher Hypernode %s to be delivered', $brancherHypernode)
156175
);
157176
}
177+
178+
$resolved = false;
179+
while ($timeElapsed < $timeout) {
180+
$now = microtime(true);
181+
$timeElapsed += $now - $latest;
182+
$latest = $now;
183+
184+
$connection = @fsockopen(sprintf("%s.hypernode.io", $brancherHypernode), 22);
185+
if ($connection) {
186+
fclose($connection);
187+
$resolved = true;
188+
break;
189+
}
190+
}
191+
192+
if (!$resolved) {
193+
throw new TimeoutException(
194+
sprintf('Timed out waiting for brancher Hypernode %s to become reachable', $brancherHypernode)
195+
);
196+
}
197+
198+
$this->log->info(
199+
sprintf(
200+
'Brancher Hypernode %s became reachable!',
201+
$brancherHypernode
202+
)
203+
);
158204
}
159205

160206
/**

0 commit comments

Comments
 (0)