diff --git a/README.md b/README.md index 94cebcedc3f75effd7b9934915a1d830b14c7272..9277e8dfb9df940fc65cf08f5b68c4cb175e6ba5 100644 --- a/README.md +++ b/README.md @@ -116,6 +116,7 @@ $ docker-machine create \ - `--hetzner-primary-ipv4/6`: Sets an existing primary IP (v4 or v6 respectively) for the server, as documented in [Networking](#networking) - `--hetzner-wait-on-error`: Amount of seconds to wait on server creation failure (0/no wait by default) - `--hetzner-wait-on-polling`: Amount of seconds to wait between requests when waiting for some state to change. (Default: 1 second) +- `--hetzner-wait-for-running-timeout`: Max amount of seconds to wait until a machine is running. (Default: 0/no timeout) #### Image selection diff --git a/driver/driver.go b/driver/driver.go index 8ff0e97403f13ebfa2834e3582520ce0e31cca87..14180fd16f2c3f3591651f958963ce21f6df72b0 100644 --- a/driver/driver.go +++ b/driver/driver.go @@ -57,6 +57,7 @@ type Driver struct { WaitOnError int WaitOnPolling int + WaitForRunningTimeout int // internal housekeeping version string @@ -98,10 +99,12 @@ const ( defaultSSHPort = 22 defaultSSHUser = "root" - flagWaitOnError = "hetzner-wait-on-error" - defaultWaitOnError = 0 - flagWaitOnPolling = "hetzner-wait-on-polling" - defaultWaitOnPolling = 1 + flagWaitOnError = "hetzner-wait-on-error" + defaultWaitOnError = 0 + flagWaitOnPolling = "hetzner-wait-on-polling" + defaultWaitOnPolling = 1 + flagWaitForRunningTimeout = "hetzner-wait-for-running-timeout" + defaultWaitForRunningTimeout = 0 legacyFlagUserDataFromFile = "hetzner-user-data-from-file" legacyFlagDisablePublic4 = "hetzner-disable-public-4" @@ -307,6 +310,12 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag { Usage: "Period for waiting between requests when waiting for some state to change", Value: defaultWaitOnPolling, }, + mcnflag.IntFlag{ + EnvVar: "HETZNER_WAIT_FOR_RUNNING_TIMEOUT", + Name: flagWaitForRunningTimeout, + Usage: "Period for waiting for a machine to be running before failing", + Value: defaultWaitForRunningTimeout, + }, } } @@ -349,6 +358,7 @@ func (d *Driver) setConfigFromFlagsImpl(opts drivers.DriverOptions) error { d.WaitOnError = opts.Int(flagWaitOnError) d.WaitOnPolling = opts.Int(flagWaitOnPolling) + d.WaitForRunningTimeout = opts.Int(flagWaitForRunningTimeout) d.placementGroup = opts.String(flagPlacementGroup) if opts.Bool(flagAutoSpread) { diff --git a/driver/setup.go b/driver/setup.go index 24362e4980111c70daed4ffda55e0374c3861811..cabfa00f167a1d4bccf1d1f131df852e86020e90 100644 --- a/driver/setup.go +++ b/driver/setup.go @@ -10,6 +10,7 @@ import ( ) func (d *Driver) waitForRunningServer() error { + start_time := time.Now() for { srvstate, err := d.GetState() if err != nil { @@ -20,6 +21,11 @@ func (d *Driver) waitForRunningServer() error { break } + elapsed_time := time.Since(start_time).Seconds() + if d.WaitForRunningTimeout > 0 && int(elapsed_time) > d.WaitForRunningTimeout { + return errors.Errorf("server exceeded wait-for-running-timeout.") + } + time.Sleep(time.Duration(d.WaitOnPolling) * time.Second) } return nil