Skip to content

Commit c9e0ca0

Browse files
committed
Add timeout setting for waiting servers to be up
Sometimes some machines are stuck on starting, and need to be manually deleted. Create new `--hetzner-wait-for-running-timeout` flag to define a time limit until the servers are running. Signed-off-by: Iñaki Malerba <[email protected]>
1 parent 107e272 commit c9e0ca0

File tree

3 files changed

+21
-4
lines changed

3 files changed

+21
-4
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ $ docker-machine create \
116116
- `--hetzner-primary-ipv4/6`: Sets an existing primary IP (v4 or v6 respectively) for the server, as documented in [Networking](#networking)
117117
- `--hetzner-wait-on-error`: Amount of seconds to wait on server creation failure (0/no wait by default)
118118
- `--hetzner-wait-on-polling`: Amount of seconds to wait between requests when waiting for some state to change. (Default: 1 second)
119+
- `--hetzner-wait-for-running-timeout`: Max amount of seconds to wait until a machine is running. (Default: 0/no timeout)
119120

120121
#### Image selection
121122

driver/driver.go

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ type Driver struct {
5757

5858
WaitOnError int
5959
WaitOnPolling int
60+
WaitForRunningTimeout int
6061

6162
// internal housekeeping
6263
version string
@@ -98,10 +99,12 @@ const (
9899
defaultSSHPort = 22
99100
defaultSSHUser = "root"
100101

101-
flagWaitOnError = "hetzner-wait-on-error"
102-
defaultWaitOnError = 0
103-
flagWaitOnPolling = "hetzner-wait-on-polling"
104-
defaultWaitOnPolling = 1
102+
flagWaitOnError = "hetzner-wait-on-error"
103+
defaultWaitOnError = 0
104+
flagWaitOnPolling = "hetzner-wait-on-polling"
105+
defaultWaitOnPolling = 1
106+
flagWaitForRunningTimeout = "hetzner-wait-for-running-timeout"
107+
defaultWaitForRunningTimeout = 0
105108

106109
legacyFlagUserDataFromFile = "hetzner-user-data-from-file"
107110
legacyFlagDisablePublic4 = "hetzner-disable-public-4"
@@ -307,6 +310,12 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag {
307310
Usage: "Period for waiting between requests when waiting for some state to change",
308311
Value: defaultWaitOnPolling,
309312
},
313+
mcnflag.IntFlag{
314+
EnvVar: "HETZNER_WAIT_FOR_RUNNING_TIMEOUT",
315+
Name: flagWaitForRunningTimeout,
316+
Usage: "Period for waiting for a machine to be running before failing",
317+
Value: defaultWaitForRunningTimeout,
318+
},
310319
}
311320
}
312321

@@ -349,6 +358,7 @@ func (d *Driver) setConfigFromFlagsImpl(opts drivers.DriverOptions) error {
349358

350359
d.WaitOnError = opts.Int(flagWaitOnError)
351360
d.WaitOnPolling = opts.Int(flagWaitOnPolling)
361+
d.WaitForRunningTimeout = opts.Int(flagWaitForRunningTimeout)
352362

353363
d.placementGroup = opts.String(flagPlacementGroup)
354364
if opts.Bool(flagAutoSpread) {

driver/setup.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
)
1111

1212
func (d *Driver) waitForRunningServer() error {
13+
start_time := time.Now()
1314
for {
1415
srvstate, err := d.GetState()
1516
if err != nil {
@@ -20,6 +21,11 @@ func (d *Driver) waitForRunningServer() error {
2021
break
2122
}
2223

24+
elapsed_time := time.Since(start_time).Seconds()
25+
if d.WaitForRunningTimeout > 0 && int(elapsed_time) > d.WaitForRunningTimeout {
26+
return errors.Errorf("server exceeded wait-for-running-timeout.")
27+
}
28+
2329
time.Sleep(time.Duration(d.WaitOnPolling) * time.Second)
2430
}
2531
return nil

0 commit comments

Comments
 (0)