From 85653447e7737e93c08c3cb1e4887823f88578ce Mon Sep 17 00:00:00 2001
From: JonasS <jonass@dev.jsje.de>
Date: Fri, 1 Jan 2021 15:04:02 +0100
Subject: [PATCH] 3.2.0 - added --hetzner-server-label option, closes #56

---
 README.md |  6 ++++--
 driver.go | 27 +++++++++++++++++++++++++++
 2 files changed, 31 insertions(+), 2 deletions(-)

diff --git a/README.md b/README.md
index f1d83ac..9e88066 100644
--- a/README.md
+++ b/README.md
@@ -15,8 +15,8 @@ You can find sources and pre-compiled binaries [here](https://github.com/JonasPr
 
 ```bash
 # Download the binary (this example downloads the binary for linux amd64)
-$ wget https://github.com/JonasProgrammer/docker-machine-driver-hetzner/releases/download/3.1.1/docker-machine-driver-hetzner_3.1.1_linux_amd64.tar.gz
-$ tar -xvf docker-machine-driver-hetzner_3.1.1_linux_amd64.tar.gz
+$ wget https://github.com/JonasProgrammer/docker-machine-driver-hetzner/releases/download/3.2.0/docker-machine-driver-hetzner_3.2.0_linux_amd64.tar.gz
+$ tar -xvf docker-machine-driver-hetzner_3.2.0_linux_amd64.tar.gz
 
 # Make it executable and copy the binary in a directory accessible with your $PATH
 $ chmod +x docker-machine-driver-hetzner
@@ -103,6 +103,7 @@ $ docker-machine create \
 - `--hetzner-volumes`: Volume IDs or names which should be attached to the server
 - `--hetzner-networks`: Network IDs or names which should be attached to the server private network interface
 - `--hetzner-use-private-network`: Use private network
+- `--hetzner-server-label`: `key=value` pairs of additional metadata to assign to the server.
 
 #### Existing SSH keys
 
@@ -135,6 +136,7 @@ was used during creation.
 | `--hetzner-networks`                | `HETZNER_NETWORKS`                | -                          |
 | `--hetzner-volumes`                 | `HETZNER_VOLUMES`                 | -                          |
 | `--hetzner-use-private-network`     | `HETZNER_USE_PRIVATE_NETWORK`     | false                      |
+| `--hetzner-server-label`            | `HETZNER_SERVER_LABELS`           | `[]`                       |
 
 
 ## Building from source
diff --git a/driver.go b/driver.go
index d4d975e..48cd509 100644
--- a/driver.go
+++ b/driver.go
@@ -6,6 +6,7 @@ import (
 	"io/ioutil"
 	"net"
 	"os"
+	"strings"
 	"time"
 
 	"github.com/docker/machine/libmachine/drivers"
@@ -41,6 +42,7 @@ type Driver struct {
 	networks          []string
 	UsePrivateNetwork bool
 	cachedServer      *hcloud.Server
+	serverLabels      map[string]string
 
 	additionalKeys       []string
 	AdditionalKeyIDs     []int
@@ -63,6 +65,7 @@ const (
 	flagNetworks          = "hetzner-networks"
 	flagUsePrivateNetwork = "hetzner-use-private-network"
 	flagAdditionalKeys    = "hetzner-additional-key"
+	flagServerLabel       = "hetzner-server-label"
 )
 
 func NewDriver() *Driver {
@@ -154,6 +157,12 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag {
 			Usage:  "Additional public keys to be attached to the server",
 			Value:  []string{},
 		},
+		mcnflag.StringSliceFlag{
+			EnvVar: "HETZNER_SERVER_LABELS",
+			Name:   flagServerLabel,
+			Usage:  "Key value pairs of additional labels to assign to the server",
+			Value:  []string{},
+		},
 	}
 }
 
@@ -172,6 +181,11 @@ func (d *Driver) SetConfigFromFlags(opts drivers.DriverOptions) error {
 	d.UsePrivateNetwork = opts.Bool(flagUsePrivateNetwork)
 	d.additionalKeys = opts.StringSlice(flagAdditionalKeys)
 
+	err := d.setLabelsFromFlags(opts)
+	if err != nil {
+		return err
+	}
+
 	d.SetSwarmConfigFromFlags(opts)
 
 	if d.AccessToken == "" {
@@ -185,6 +199,18 @@ func (d *Driver) SetConfigFromFlags(opts drivers.DriverOptions) error {
 	return nil
 }
 
+func (d *Driver) setLabelsFromFlags(opts drivers.DriverOptions) error {
+	d.serverLabels = make(map[string]string)
+	for _, label := range opts.StringSlice(flagServerLabel) {
+		split := strings.SplitN(label, "=", 2)
+		if len(split) != 2 {
+			return errors.Errorf("server label %v is not in key=value format", label)
+		}
+		d.serverLabels[split[0]] = split[1]
+	}
+	return nil
+}
+
 func (d *Driver) PreCreateCheck() error {
 	if d.IsExistingKey {
 		if d.originalKey == "" {
@@ -299,6 +325,7 @@ func (d *Driver) Create() error {
 	srvopts := hcloud.ServerCreateOpts{
 		Name:     d.GetMachineName(),
 		UserData: d.userData,
+		Labels:   d.serverLabels,
 	}
 	networks := []*hcloud.Network{}
 	for _, networkIDorName := range d.networks {
-- 
GitLab