Skip to content

Commit 32908bb

Browse files
feat: Reduce API calls when creating server
- add `--hetzner-wait-on-polling` and `--hetzner-wait-for-running-timeout` flags (#107, thanks @inakimalerba for providing a PR)
2 parents 5c67918 + 1eb6edd commit 32908bb

File tree

5 files changed

+66
-36
lines changed

5 files changed

+66
-36
lines changed

README.md

Lines changed: 35 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ You can find sources and pre-compiled binaries [here](https://github.com/JonasPr
1515

1616
```bash
1717
# Download the binary (this example downloads the binary for linux amd64)
18-
$ wget https://github.com/JonasProgrammer/docker-machine-driver-hetzner/releases/download/3.13.0/docker-machine-driver-hetzner_3.13.0_linux_amd64.tar.gz
19-
$ tar -xvf docker-machine-driver-hetzner_3.13.0_linux_amd64.tar.gz
18+
$ wget https://github.com/JonasProgrammer/docker-machine-driver-hetzner/releases/download/4.1.0/docker-machine-driver-hetzner_4.1.0_linux_amd64.tar.gz
19+
$ tar -xvf docker-machine-driver-hetzner_4.1.0_linux_amd64.tar.gz
2020

2121
# Make it executable and copy the binary in a directory accessible with your $PATH
2222
$ chmod +x docker-machine-driver-hetzner
@@ -115,6 +115,8 @@ $ docker-machine create \
115115
- `--hetzner-ssh-port`: Change the default SSH-Port
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)
118+
- `--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)
118120

119121
#### Image selection
120122

@@ -145,35 +147,37 @@ was used during creation.
145147

146148
#### Environment variables and default values
147149

148-
| CLI option | Environment variable | Default |
149-
|---------------------------------|-------------------------------|----------------------------|
150-
| **`--hetzner-api-token`** | `HETZNER_API_TOKEN` | |
151-
| `--hetzner-image` | `HETZNER_IMAGE` | `ubuntu-20.04` as fallback |
152-
| `--hetzner-image-arch` | `HETZNER_IMAGE_ARCH` | *(infer from server)* |
153-
| `--hetzner-image-id` | `HETZNER_IMAGE_ID` | |
154-
| `--hetzner-server-type` | `HETZNER_TYPE` | `cx11` |
155-
| `--hetzner-server-location` | `HETZNER_LOCATION` | *(let Hetzner choose)* |
156-
| `--hetzner-existing-key-path` | `HETZNER_EXISTING_KEY_PATH` | *(generate new keypair)* |
157-
| `--hetzner-existing-key-id` | `HETZNER_EXISTING_KEY_ID` | 0 *(upload new key)* |
158-
| `--hetzner-additional-key` | `HETZNER_ADDITIONAL_KEYS` | |
159-
| `--hetzner-user-data` | `HETZNER_USER_DATA` | |
160-
| `--hetzner-user-data-file` | `HETZNER_USER_DATA_FILE` | |
161-
| `--hetzner-networks` | `HETZNER_NETWORKS` | |
162-
| `--hetzner-firewalls` | `HETZNER_FIREWALLS` | |
163-
| `--hetzner-volumes` | `HETZNER_VOLUMES` | |
164-
| `--hetzner-use-private-network` | `HETZNER_USE_PRIVATE_NETWORK` | false |
165-
| `--hetzner-disable-public-ipv4` | `HETZNER_DISABLE_PUBLIC_IPV4` | false |
166-
| `--hetzner-disable-public-ipv6` | `HETZNER_DISABLE_PUBLIC_IPV6` | false |
167-
| `--hetzner-disable-public` | `HETZNER_DISABLE_PUBLIC` | false |
168-
| `--hetzner-server-label` | (inoperative) | `[]` |
169-
| `--hetzner-key-label` | (inoperative) | `[]` |
170-
| `--hetzner-placement-group` | `HETZNER_PLACEMENT_GROUP` | |
171-
| `--hetzner-auto-spread` | `HETZNER_AUTO_SPREAD` | false |
172-
| `--hetzner-ssh-user` | `HETZNER_SSH_USER` | root |
173-
| `--hetzner-ssh-port` | `HETZNER_SSH_PORT` | 22 |
174-
| `--hetzner-primary-ipv4` | `HETZNER_PRIMARY_IPV4` | |
175-
| `--hetzner-primary-ipv6` | `HETZNER_PRIMARY_IPV6` | |
176-
| `--hetzner-wait-on-error` | `HETZNER_WAIT_ON_ERROR` | 0 |
150+
| CLI option | Environment variable | Default |
151+
|--------------------------------------|------------------------------------|----------------------------|
152+
| **`--hetzner-api-token`** | `HETZNER_API_TOKEN` | |
153+
| `--hetzner-image` | `HETZNER_IMAGE` | `ubuntu-20.04` as fallback |
154+
| `--hetzner-image-arch` | `HETZNER_IMAGE_ARCH` | *(infer from server)* |
155+
| `--hetzner-image-id` | `HETZNER_IMAGE_ID` | |
156+
| `--hetzner-server-type` | `HETZNER_TYPE` | `cx11` |
157+
| `--hetzner-server-location` | `HETZNER_LOCATION` | *(let Hetzner choose)* |
158+
| `--hetzner-existing-key-path` | `HETZNER_EXISTING_KEY_PATH` | *(generate new keypair)* |
159+
| `--hetzner-existing-key-id` | `HETZNER_EXISTING_KEY_ID` | 0 *(upload new key)* |
160+
| `--hetzner-additional-key` | `HETZNER_ADDITIONAL_KEYS` | |
161+
| `--hetzner-user-data` | `HETZNER_USER_DATA` | |
162+
| `--hetzner-user-data-file` | `HETZNER_USER_DATA_FILE` | |
163+
| `--hetzner-networks` | `HETZNER_NETWORKS` | |
164+
| `--hetzner-firewalls` | `HETZNER_FIREWALLS` | |
165+
| `--hetzner-volumes` | `HETZNER_VOLUMES` | |
166+
| `--hetzner-use-private-network` | `HETZNER_USE_PRIVATE_NETWORK` | false |
167+
| `--hetzner-disable-public-ipv4` | `HETZNER_DISABLE_PUBLIC_IPV4` | false |
168+
| `--hetzner-disable-public-ipv6` | `HETZNER_DISABLE_PUBLIC_IPV6` | false |
169+
| `--hetzner-disable-public` | `HETZNER_DISABLE_PUBLIC` | false |
170+
| `--hetzner-server-label` | (inoperative) | `[]` |
171+
| `--hetzner-key-label` | (inoperative) | `[]` |
172+
| `--hetzner-placement-group` | `HETZNER_PLACEMENT_GROUP` | |
173+
| `--hetzner-auto-spread` | `HETZNER_AUTO_SPREAD` | false |
174+
| `--hetzner-ssh-user` | `HETZNER_SSH_USER` | root |
175+
| `--hetzner-ssh-port` | `HETZNER_SSH_PORT` | 22 |
176+
| `--hetzner-primary-ipv4` | `HETZNER_PRIMARY_IPV4` | |
177+
| `--hetzner-primary-ipv6` | `HETZNER_PRIMARY_IPV6` | |
178+
| `--hetzner-wait-on-error` | `HETZNER_WAIT_ON_ERROR` | 0 |
179+
| `--hetzner-wait-on-polling` | `HETZNER_WAIT_ON_POLLING` | 1 |
180+
| `--hetzner-wait-for-running-timeout` | `HETZNER_WAIT_FOR_RUNNING_TIMEOUT` | 0 |
177181

178182
#### Networking
179183

driver/driver.go

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ type Driver struct {
5656
cachedAdditionalKeys []*hcloud.SSHKey
5757

5858
WaitOnError int
59+
WaitOnPolling int
60+
WaitForRunningTimeout int
5961

6062
// internal housekeeping
6163
version string
@@ -97,8 +99,12 @@ const (
9799
defaultSSHPort = 22
98100
defaultSSHUser = "root"
99101

100-
flagWaitOnError = "hetzner-wait-on-error"
101-
defaultWaitOnError = 0
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
102108

103109
legacyFlagUserDataFromFile = "hetzner-user-data-from-file"
104110
legacyFlagDisablePublic4 = "hetzner-disable-public-4"
@@ -298,6 +304,18 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag {
298304
Usage: "Wait if an error happens while creating the server",
299305
Value: defaultWaitOnError,
300306
},
307+
mcnflag.IntFlag{
308+
EnvVar: "HETZNER_WAIT_ON_POLLING",
309+
Name: flagWaitOnPolling,
310+
Usage: "Period for waiting between requests when waiting for some state to change",
311+
Value: defaultWaitOnPolling,
312+
},
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+
},
301319
}
302320
}
303321

@@ -339,6 +357,8 @@ func (d *Driver) setConfigFromFlagsImpl(opts drivers.DriverOptions) error {
339357
d.SSHPort = opts.Int(flagSshPort)
340358

341359
d.WaitOnError = opts.Int(flagWaitOnError)
360+
d.WaitOnPolling = opts.Int(flagWaitOnPolling)
361+
d.WaitForRunningTimeout = opts.Int(flagWaitForRunningTimeout)
342362

343363
d.placementGroup = opts.String(flagPlacementGroup)
344364
if opts.Bool(flagAutoSpread) {

driver/hetzner_query.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ func (d *Driver) waitForAction(a *hcloud.Action) error {
144144
return act.Error()
145145
}
146146

147-
time.Sleep(1 * time.Second)
147+
time.Sleep(time.Duration(d.WaitOnPolling) * time.Second)
148148
}
149149
return nil
150150
}

driver/networking.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ func (d *Driver) configureNetworkAccess(srv hcloud.ServerCreateResult) error {
9393
d.IPAddress = server.PrivateNet[0].IP.String()
9494
break
9595
}
96-
time.Sleep(1 * time.Second)
96+
time.Sleep(time.Duration(d.WaitOnPolling) * time.Second)
9797
}
9898
} else if d.DisablePublic4 {
9999
log.Infof("Using public IPv6 network ...")

driver/setup.go

Lines changed: 7 additions & 1 deletion
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,7 +21,12 @@ func (d *Driver) waitForRunningServer() error {
2021
break
2122
}
2223

23-
time.Sleep(1 * time.Second)
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+
29+
time.Sleep(time.Duration(d.WaitOnPolling) * time.Second)
2430
}
2531
return nil
2632
}

0 commit comments

Comments
 (0)