Skip to content

Commit f9b2cb2

Browse files
Added --hetzner-image-id flag as suggested in #14
1 parent 9527f68 commit f9b2cb2

File tree

2 files changed

+42
-5
lines changed

2 files changed

+42
-5
lines changed

README.md

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,22 @@ $ docker-machine create \
7777
some-machine
7878
```
7979

80+
### Using a snapshot
81+
82+
Assuming your snapshot ID is `424242`:
83+
```bash
84+
$ docker-machine create \
85+
--driver hetzner \
86+
--hetzner-api-token=QJhoRT38JfAUO037PWJ5Zt9iAABIxdxdh4gPqNkUGKIrUMd6I3cPIsfKozI513sy \
87+
--hetzner-image-id=424242 \
88+
some-machine
89+
```
90+
8091
## Options
8192

8293
- `--hetzner-api-token`: **required**. Your project-specific access token for the Hetzner Cloud API.
83-
- `--hetzner-image`: The name of the Hetzner Cloud image to use, see [Images API](https://docs.hetzner.cloud/#resources-images-get) for how to get a list (defaults to `ubuntu-16.04`).
94+
- `--hetzner-image`: The name of the Hetzner Cloud image to use, see [Images API](https://docs.hetzner.cloud/#resources-images-get) for how to get a list (defaults to `ubuntu-16.04`).
95+
- `--hetzner-image-id`: The id of the Hetzner cloud image (or snapshot) to use, see [Images API](https://docs.hetzner.cloud/#resources-images-get) for how to get a list (mutually excludes `--hetzner-image`).
8496
- `--hetzner-server-type`: The type of the Hetzner Cloud server, see [Server Types API](https://docs.hetzner.cloud/#resources-server-types-get) for how to get a list (defaults to `cx11`).
8597
- `--hetzner-server-location`: The location to create the server in, see [Locations API](https://docs.hetzner.cloud/#resources-locations-get) for how to get a list.
8698
**NOTICE: Beware that Hetzner does not reject invalid location names at the time of writing this; instead, a seemingly random location is chosen. Double check both the option value's
@@ -110,7 +122,8 @@ was used during creation.
110122
| CLI option | Environment variable | Default |
111123
| ----------------------------------- | --------------------------------- | -------------------------- |
112124
| **`--hetzner-api-token`** | `HETZNER_API_TOKEN` | - |
113-
| `--hetzner-image ` | `HETZNER_IMAGE_IMAGE` | `ubuntu-16.04` |
125+
| `--hetzner-image` | `HETZNER_IMAGE_IMAGE` | `ubuntu-16.04` |
126+
| `--hetzner-image-id` | `HETZNER_IMAGE_IMAGE_ID` | - |
114127
| `--hetzner-server-type` | `HETZNER_TYPE` | `cx11` |
115128
| `--hetzner-server-location` | `HETZNER_LOCATION` | - *(let Hetzner choose)* |
116129
| `--hetzner-existing-key-path` | `HETZNER_EXISTING_KEY_PATH` | - *(generate new keypair)* |

driver.go

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ type Driver struct {
2424

2525
AccessToken string
2626
Image string
27+
ImageID int
2728
cachedImage *hcloud.Image
2829
Type string
2930
cachedType *hcloud.ServerType
@@ -45,6 +46,7 @@ const (
4546

4647
flagAPIToken = "hetzner-api-token"
4748
flagImage = "hetzner-image"
49+
flagImageID = "hetzner-image-id"
4850
flagType = "hetzner-server-type"
4951
flagLocation = "hetzner-server-location"
5052
flagExKeyID = "hetzner-existing-key-id"
@@ -83,6 +85,11 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag {
8385
Usage: "Image to use for server creation",
8486
Value: defaultImage,
8587
},
88+
mcnflag.IntFlag{
89+
EnvVar: "HETZNER_IMAGE_ID",
90+
Name: flagImageID,
91+
Usage: "Image to use for server creation",
92+
},
8693
mcnflag.StringFlag{
8794
EnvVar: "HETZNER_TYPE",
8895
Name: flagType,
@@ -119,6 +126,7 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag {
119126
func (d *Driver) SetConfigFromFlags(opts drivers.DriverOptions) error {
120127
d.AccessToken = opts.String(flagAPIToken)
121128
d.Image = opts.String(flagImage)
129+
d.ImageID = opts.Int(flagImageID)
122130
d.Location = opts.String(flagLocation)
123131
d.Type = opts.String(flagType)
124132
d.KeyID = opts.Int(flagExKeyID)
@@ -131,6 +139,11 @@ func (d *Driver) SetConfigFromFlags(opts drivers.DriverOptions) error {
131139
if d.AccessToken == "" {
132140
return errors.Errorf("hetzner requires --%v to be set", flagAPIToken)
133141
}
142+
143+
if d.ImageID != 0 && d.Image != defaultImage {
144+
return errors.Errorf("--%v and --%v are mutually exclusive", flagImage, flagImageID)
145+
}
146+
134147
return nil
135148
}
136149

@@ -466,10 +479,21 @@ func (d *Driver) getImage() (*hcloud.Image, error) {
466479
return d.cachedImage, nil
467480
}
468481

469-
image, _, err := d.getClient().Image.GetByName(context.Background(), d.Image)
470-
if err != nil {
471-
return image, errors.Wrap(err, "could not get image by name")
482+
var image *hcloud.Image
483+
var err error
484+
485+
if d.ImageID != 0 {
486+
image, _, err = d.getClient().Image.GetByID(context.Background(), d.ImageID)
487+
if err != nil {
488+
return image, errors.Wrap(err, fmt.Sprintf("could not get image by id %v", d.ImageID))
489+
}
490+
} else {
491+
image, _, err = d.getClient().Image.GetByName(context.Background(), d.Image)
492+
if err != nil {
493+
return image, errors.Wrap(err, fmt.Sprintf("could not get image by name %v", d.Image))
494+
}
472495
}
496+
473497
d.cachedImage = image
474498
return image, nil
475499
}

0 commit comments

Comments
 (0)