Skip to content

Commit 3cef722

Browse files
chore: int64 ID support (#108)
- update hcloud-go to v2 - use int64 for ID flags in driver - work around lack of int64 in mcnflag
1 parent 711d027 commit 3cef722

File tree

12 files changed

+113
-52
lines changed

12 files changed

+113
-52
lines changed

README.md

Lines changed: 15 additions & 4 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/4.1.2/docker-machine-driver-hetzner_4.1.2_linux_amd64.tar.gz
19-
$ tar -xvf docker-machine-driver-hetzner_4.1.2_linux_amd64.tar.gz
18+
$ wget https://github.com/JonasProgrammer/docker-machine-driver-hetzner/releases/download/5.0.0/docker-machine-driver-hetzner_5.0.0_linux_amd64.tar.gz
19+
$ tar -xvf docker-machine-driver-hetzner_5.0.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
@@ -259,16 +259,27 @@ $ docker-machine create --driver hetzner
259259

260260
### 4.0.0
261261

262-
* **check log output for BREAKING-V5**
262+
* **check log output for BREAKING-V6** (previously *BREAKING-V5*)
263263
* `--hetzner-user-data-from-file` will be fully deprecated and its flag description will only read 'DEPRECATED, legacy'; current fallback behaviour will be retained. `--hetzner-flag-user-data-file` should be used instead.
264264
* `--hetzner-disable-public-4`/`--hetzner-disable-public-6` will be fully deprecated and its flag description will only read 'DEPRECATED, legacy'; current fallback behaviour will be retained. `--hetzner-disable-public-ipv4`/`--hetzner-disable-public-ipv6` should be used instead.
265265

266266
### 5.0.0
267267

268+
* major update due to #108 ([hetznercloud/hcloud-go#263](https://github.com/hetznercloud/hcloud-go/v2/issues/263))
269+
* new `hcloud-go` v2 requiring int64 IDs is used for interaction with Hetzner cloud
270+
* old configs should be forward-compatible
271+
* newly created machines may now use 64-bit integers in all stored and transmitted data, potentially breaking existing tools supporting 32-bit only
272+
- this includes anything interacting with the flags CLI via RPC, as `mcnflags` lacks an int64 flag type, so `StringFlag` and parsing are used now
273+
* previous changes were moved one version (i.e. 5 -> 6, 6 -> 7)
274+
275+
### 6.0.0
276+
277+
* *moved from 5.0.0*
268278
* `--hetzner-user-data-from-file` will be removed entirely, including its fallback behavior
269279
* `--hetzner-disable-public-4`/`--hetzner-disable-public-6` ill be removed entirely, including their fallback behavior
270280
* not specifying `--hetzner-image` will generate a warning stating 'use of default image is DEPRECATED'
271281

272-
### 6.0.0
282+
### 7.0.0
273283

284+
* *moved from 6.0.0*
274285
* specifying `--hetzner-image` will be mandatory, and a default image will no longer be provided

driver/cleanup.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import (
44
"context"
55
"fmt"
66
"github.com/docker/machine/libmachine/log"
7-
"github.com/hetznercloud/hcloud-go/hcloud"
7+
"github.com/hetznercloud/hcloud-go/v2/hcloud"
88
"github.com/pkg/errors"
99
)
1010

driver/driver.go

Lines changed: 36 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@ import (
44
"context"
55
"fmt"
66
"net"
7+
"strconv"
78
"time"
89

910
"github.com/docker/machine/libmachine/drivers"
1011
"github.com/docker/machine/libmachine/log"
1112
"github.com/docker/machine/libmachine/mcnflag"
1213
"github.com/docker/machine/libmachine/state"
13-
"github.com/hetznercloud/hcloud-go/hcloud"
14+
"github.com/hetznercloud/hcloud-go/v2/hcloud"
1415
"github.com/pkg/errors"
1516
)
1617

@@ -20,19 +21,19 @@ type Driver struct {
2021

2122
AccessToken string
2223
Image string
23-
ImageID int
24+
ImageID int64
2425
ImageArch hcloud.Architecture
2526
cachedImage *hcloud.Image
2627
Type string
2728
cachedType *hcloud.ServerType
2829
Location string
2930
cachedLocation *hcloud.Location
30-
KeyID int
31+
KeyID int64
3132
cachedKey *hcloud.SSHKey
3233
IsExistingKey bool
3334
originalKey string
3435
dangling []func()
35-
ServerID int
36+
ServerID int64
3637
cachedServer *hcloud.Server
3738
userData string
3839
userDataFile string
@@ -52,7 +53,7 @@ type Driver struct {
5253
cachedPGrp *hcloud.PlacementGroup
5354

5455
AdditionalKeys []string
55-
AdditionalKeyIDs []int
56+
AdditionalKeyIDs []int64
5657
cachedAdditionalKeys []*hcloud.SSHKey
5758

5859
WaitOnError int
@@ -146,7 +147,7 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag {
146147
Usage: "Image to use for server creation",
147148
Value: "",
148149
},
149-
mcnflag.IntFlag{
150+
mcnflag.StringFlag{
150151
EnvVar: "HETZNER_IMAGE_ID",
151152
Name: flagImageID,
152153
Usage: "Image to use for server creation",
@@ -168,11 +169,11 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag {
168169
Usage: "Location to create machine at",
169170
Value: "",
170171
},
171-
mcnflag.IntFlag{
172+
mcnflag.StringFlag{
172173
EnvVar: "HETZNER_EXISTING_KEY_ID",
173174
Name: flagExKeyID,
174175
Usage: "Existing key ID to use for server; requires --hetzner-existing-key-path",
175-
Value: 0,
176+
Value: "0",
176177
},
177178
mcnflag.StringFlag{
178179
EnvVar: "HETZNER_EXISTING_KEY_PATH",
@@ -319,23 +320,45 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag {
319320
}
320321
}
321322

323+
func flagI64(opts drivers.DriverOptions, key string) (int64, error) {
324+
raw := opts.String(key)
325+
if raw == "" {
326+
return 0, nil
327+
}
328+
329+
ret, err := strconv.ParseInt(raw, 10, 64)
330+
if err != nil {
331+
return 0, errors.Wrapf(err, "could not parse int64 for %v", key)
332+
}
333+
334+
return ret, nil
335+
}
336+
322337
// SetConfigFromFlags handles additional driver arguments as retrieved by [Driver.GetCreateFlags];
323338
// see [drivers.Driver.SetConfigFromFlags]
324339
func (d *Driver) SetConfigFromFlags(opts drivers.DriverOptions) error {
325340
return d.setConfigFromFlags(opts)
326341
}
327342

328343
func (d *Driver) setConfigFromFlagsImpl(opts drivers.DriverOptions) error {
344+
var err error
345+
329346
d.AccessToken = opts.String(flagAPIToken)
330347
d.Image = opts.String(flagImage)
331-
d.ImageID = opts.Int(flagImageID)
332-
err := d.setImageArch(opts.String(flagImageArch))
348+
d.ImageID, err = flagI64(opts, flagImageID)
349+
if err != nil {
350+
return err
351+
}
352+
err = d.setImageArch(opts.String(flagImageArch))
333353
if err != nil {
334354
return err
335355
}
336356
d.Location = opts.String(flagLocation)
337357
d.Type = opts.String(flagType)
338-
d.KeyID = opts.Int(flagExKeyID)
358+
d.KeyID, err = flagI64(opts, flagExKeyID)
359+
if err != nil {
360+
return err
361+
}
339362
d.IsExistingKey = d.KeyID != 0
340363
d.originalKey = opts.String(flagExKeyPath)
341364
err = d.setUserDataFlags(opts)
@@ -390,10 +413,10 @@ func (d *Driver) setConfigFromFlagsImpl(opts drivers.DriverOptions) error {
390413
instrumented(d)
391414

392415
if d.usesDfr {
393-
log.Warn("!!!! BREAKING-V5 !!!!")
416+
log.Warn("!!!! BREAKING-V6 !!!!")
394417
log.Warn("your configuration uses deprecated flags and will stop working as-is from v5 onwards")
395418
log.Warn("check preceding output for 'DEPRECATED' log statements")
396-
log.Warn("!!!! /BREAKING-V5 !!!!")
419+
log.Warn("!!!! /BREAKING-V6 !!!!")
397420
}
398421

399422
return nil

driver/driver_test.go

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@ package driver
33
import (
44
"github.com/docker/machine/commands/commandstest"
55
"github.com/docker/machine/libmachine/drivers"
6-
"github.com/hetznercloud/hcloud-go/hcloud"
6+
"github.com/hetznercloud/hcloud-go/v2/hcloud"
77
"os"
8+
"strconv"
89
"strings"
910
"testing"
1011
)
@@ -212,15 +213,15 @@ func TestImageFlagExclusions(t *testing.T) {
212213
// both id and name given
213214
d := NewDriver("test")
214215
err := d.setConfigFromFlagsImpl(makeFlags(map[string]interface{}{
215-
flagImageID: 42,
216+
flagImageID: "42",
216217
flagImage: "answer",
217218
}))
218219
assertMutualExclusion(t, err, flagImageID, flagImage)
219220

220221
// both id and arch given
221222
d = NewDriver("test")
222223
err = d.setConfigFromFlagsImpl(makeFlags(map[string]interface{}{
223-
flagImageID: 42,
224+
flagImageID: "42",
224225
flagImageArch: string(hcloud.ArchitectureX86),
225226
}))
226227
assertMutualExclusion(t, err, flagImageID, flagImageArch)
@@ -255,6 +256,32 @@ func TestImageArch(t *testing.T) {
255256
}
256257
}
257258

259+
func TestBogusId(t *testing.T) {
260+
d := NewDriver("test")
261+
err := d.setConfigFromFlagsImpl(makeFlags(map[string]interface{}{
262+
flagImageID: "answer",
263+
}))
264+
if err == nil {
265+
t.Fatal("expected error, but invalid arch was accepted")
266+
}
267+
}
268+
269+
func TestLongId(t *testing.T) {
270+
var testId int64 = 79871865169581
271+
272+
d := NewDriver("test")
273+
err := d.setConfigFromFlagsImpl(makeFlags(map[string]interface{}{
274+
flagImageID: strconv.FormatInt(testId, 10),
275+
}))
276+
if err != nil {
277+
t.Fatalf("unexpected error, %v", err)
278+
}
279+
280+
if d.ImageID != testId {
281+
t.Errorf("expected %v id, but got %v", testId, d.ImageArch)
282+
}
283+
}
284+
258285
func testArchFlag(t *testing.T, arch hcloud.Architecture) {
259286
d := NewDriver("test")
260287
err := d.setConfigFromFlagsImpl(makeFlags(map[string]interface{}{

driver/flag_processing.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package driver
33
import (
44
"github.com/docker/machine/libmachine/drivers"
55
"github.com/docker/machine/libmachine/log"
6-
"github.com/hetznercloud/hcloud-go/hcloud"
6+
"github.com/hetznercloud/hcloud-go/v2/hcloud"
77
"github.com/pkg/errors"
88
"strings"
99
)

driver/hetzner_query.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import (
44
"context"
55
"fmt"
66
"github.com/docker/machine/libmachine/log"
7-
"github.com/hetznercloud/hcloud-go/hcloud"
7+
"github.com/hetznercloud/hcloud-go/v2/hcloud"
88
"github.com/pkg/errors"
99
"golang.org/x/crypto/ssh"
1010
"time"

driver/networking.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import (
44
"context"
55
"fmt"
66
"github.com/docker/machine/libmachine/log"
7-
"github.com/hetznercloud/hcloud-go/hcloud"
7+
"github.com/hetznercloud/hcloud-go/v2/hcloud"
88
"github.com/pkg/errors"
99
"net"
1010
"time"

driver/placement_groups.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import (
44
"context"
55
"fmt"
66
"github.com/docker/machine/libmachine/log"
7-
"github.com/hetznercloud/hcloud-go/hcloud"
7+
"github.com/hetznercloud/hcloud-go/v2/hcloud"
88
)
99

1010
const (

driver/setup.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package driver
33
import (
44
"context"
55
"github.com/docker/machine/libmachine/state"
6-
"github.com/hetznercloud/hcloud-go/hcloud"
6+
"github.com/hetznercloud/hcloud-go/v2/hcloud"
77
"github.com/pkg/errors"
88
"os"
99
"time"

driver/ssh_keys.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import (
66
"github.com/docker/machine/libmachine/log"
77
"github.com/docker/machine/libmachine/mcnutils"
88
mcnssh "github.com/docker/machine/libmachine/ssh"
9-
"github.com/hetznercloud/hcloud-go/hcloud"
9+
"github.com/hetznercloud/hcloud-go/v2/hcloud"
1010
"github.com/pkg/errors"
1111
"golang.org/x/crypto/ssh"
1212
"os"

0 commit comments

Comments
 (0)