From 107e2729b497cc82db29dda17b4d96d47e08dad3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?I=C3=B1aki=20Malerba?= <inaki@malerba.space>
Date: Wed, 14 Jun 2023 20:08:57 +0200
Subject: [PATCH] Allow customizing polling period
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

When having several machines trying to start at the same time, polling
every one second consumes the API requests limit fairly easily.

Add a new `--hetzner-wait-on-polling` flag, similar to `--wait-on-error`
to change the time between requests.

Default value is left at 1 second to keep the current behaviour.

Signed-off-by: IƱaki Malerba <inaki@malerba.space>
---
 README.md               |  1 +
 driver/driver.go        | 14 ++++++++++++--
 driver/hetzner_query.go |  2 +-
 driver/networking.go    |  2 +-
 driver/setup.go         |  2 +-
 5 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/README.md b/README.md
index f02ee1b..94cebce 100644
--- a/README.md
+++ b/README.md
@@ -115,6 +115,7 @@ $ docker-machine create \
 - `--hetzner-ssh-port`: Change the default SSH-Port
 - `--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)
 
 #### Image selection
 
diff --git a/driver/driver.go b/driver/driver.go
index 9a074b4..8ff0e97 100644
--- a/driver/driver.go
+++ b/driver/driver.go
@@ -56,6 +56,7 @@ type Driver struct {
 	cachedAdditionalKeys []*hcloud.SSHKey
 
 	WaitOnError int
+	WaitOnPolling int
 
 	// internal housekeeping
 	version string
@@ -97,8 +98,10 @@ const (
 	defaultSSHPort = 22
 	defaultSSHUser = "root"
 
-	flagWaitOnError    = "hetzner-wait-on-error"
-	defaultWaitOnError = 0
+	flagWaitOnError      = "hetzner-wait-on-error"
+	defaultWaitOnError   = 0
+	flagWaitOnPolling    = "hetzner-wait-on-polling"
+	defaultWaitOnPolling = 1
 
 	legacyFlagUserDataFromFile = "hetzner-user-data-from-file"
 	legacyFlagDisablePublic4   = "hetzner-disable-public-4"
@@ -298,6 +301,12 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag {
 			Usage:  "Wait if an error happens while creating the server",
 			Value:  defaultWaitOnError,
 		},
+		mcnflag.IntFlag{
+			EnvVar: "HETZNER_WAIT_ON_POLLING",
+			Name:   flagWaitOnPolling,
+			Usage:  "Period for waiting between requests when waiting for some state to change",
+			Value:  defaultWaitOnPolling,
+		},
 	}
 }
 
@@ -339,6 +348,7 @@ func (d *Driver) setConfigFromFlagsImpl(opts drivers.DriverOptions) error {
 	d.SSHPort = opts.Int(flagSshPort)
 
 	d.WaitOnError = opts.Int(flagWaitOnError)
+	d.WaitOnPolling = opts.Int(flagWaitOnPolling)
 
 	d.placementGroup = opts.String(flagPlacementGroup)
 	if opts.Bool(flagAutoSpread) {
diff --git a/driver/hetzner_query.go b/driver/hetzner_query.go
index 1064574..4b2b87b 100644
--- a/driver/hetzner_query.go
+++ b/driver/hetzner_query.go
@@ -144,7 +144,7 @@ func (d *Driver) waitForAction(a *hcloud.Action) error {
 			return act.Error()
 		}
 
-		time.Sleep(1 * time.Second)
+		time.Sleep(time.Duration(d.WaitOnPolling) * time.Second)
 	}
 	return nil
 }
diff --git a/driver/networking.go b/driver/networking.go
index 41777b8..acc4e06 100644
--- a/driver/networking.go
+++ b/driver/networking.go
@@ -93,7 +93,7 @@ func (d *Driver) configureNetworkAccess(srv hcloud.ServerCreateResult) error {
 				d.IPAddress = server.PrivateNet[0].IP.String()
 				break
 			}
-			time.Sleep(1 * time.Second)
+			time.Sleep(time.Duration(d.WaitOnPolling) * time.Second)
 		}
 	} else if d.DisablePublic4 {
 		log.Infof("Using public IPv6 network ...")
diff --git a/driver/setup.go b/driver/setup.go
index f66e2c2..24362e4 100644
--- a/driver/setup.go
+++ b/driver/setup.go
@@ -20,7 +20,7 @@ func (d *Driver) waitForRunningServer() error {
 			break
 		}
 
-		time.Sleep(1 * time.Second)
+		time.Sleep(time.Duration(d.WaitOnPolling) * time.Second)
 	}
 	return nil
 }
-- 
GitLab