From 17c6578583e61b144eb6071a900b589a3a9d26eb Mon Sep 17 00:00:00 2001 From: Bilal Amarni Date: Thu, 3 Mar 2016 10:35:32 +0100 Subject: [PATCH] [DigitalOcean] Allow to use an existing SSH key (closes #1445) Signed-off-by: Bilal Amarni --- docs/drivers/digital-ocean.md | 2 ++ drivers/digitalocean/digitalocean.go | 27 ++++++++++++++++++++++----- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/docs/drivers/digital-ocean.md b/docs/drivers/digital-ocean.md index c18bb08468..491c4e95d4 100644 --- a/docs/drivers/digital-ocean.md +++ b/docs/drivers/digital-ocean.md @@ -29,6 +29,7 @@ Options: - `--digitalocean-userdata`: Path to file containing User Data for the droplet. - `--digitalocean-ssh-user`: SSH username. - `--digitalocean-ssh-port`: SSH port. +- `--digitalocean-ssh-key-fingerprint`: Use an existing SSH key instead of creating a new one, see [SSH keys](https://developers.digitalocean.com/documentation/v2/#ssh-keys). The DigitalOcean driver will use `ubuntu-15-10-x64` as the default image. @@ -46,3 +47,4 @@ Environment variables and default values: | `--digitalocean-userdata` | `DIGITALOCEAN_USERDATA` | - | | `--digitalocean-ssh-user` | `DIGITALOCEAN_SSH_USER` | `root` | | `--digitalocean-ssh-port` | `DIGITALOCEAN_SSH_PORT` | 22 | +| `--digitalocean-ssh-key-fingerprint`| `DIGITALOCEAN_SSH_KEY_FINGERPRINT`| - | diff --git a/drivers/digitalocean/digitalocean.go b/drivers/digitalocean/digitalocean.go index 4b6a7293ec..58aa8603c5 100644 --- a/drivers/digitalocean/digitalocean.go +++ b/drivers/digitalocean/digitalocean.go @@ -24,6 +24,7 @@ type Driver struct { Image string Region string SSHKeyID int + SSHKeyFingerprint string Size string IPv6 bool Backups bool @@ -54,6 +55,11 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag { Usage: "SSH username", Value: defaultSSHUser, }, + mcnflag.StringFlag{ + EnvVar: "DIGITALOCEAN_SSH_KEY_FINGERPRINT", + Name: "digitalocean-ssh-key-fingerprint", + Usage: "SSH key fingerprint", + }, mcnflag.IntFlag{ EnvVar: "DIGITALOCEAN_SSH_PORT", Name: "digitalocean-ssh-port", @@ -133,6 +139,7 @@ func (d *Driver) SetConfigFromFlags(flags drivers.DriverOptions) error { d.UserDataFile = flags.String("digitalocean-userdata") d.SSHUser = flags.String("digitalocean-ssh-user") d.SSHPort = flags.Int("digitalocean-ssh-port") + d.SSHKeyFingerprint = flags.String("digitalocean-ssh-key-fingerprint") d.SetSwarmConfigFromFlags(flags) if d.AccessToken == "" { @@ -232,6 +239,14 @@ func (d *Driver) Create() error { } func (d *Driver) createSSHKey() (*godo.Key, error) { + if d.SSHKeyFingerprint != "" { + key, resp, err := d.getClient().Keys.GetByFingerprint(d.SSHKeyFingerprint) + if err != nil && resp.StatusCode == 404 { + return nil, fmt.Errorf("Digital Ocean SSH key with fingerprint %s doesn't exist", d.SSHKeyFingerprint) + } + return key, err + } + if err := ssh.GenerateSSHKey(d.GetSSHKeyPath()); err != nil { return nil, err } @@ -305,11 +320,13 @@ func (d *Driver) Kill() error { func (d *Driver) Remove() error { client := d.getClient() - if resp, err := client.Keys.DeleteByID(d.SSHKeyID); err != nil { - if resp.StatusCode == 404 { - log.Infof("Digital Ocean SSH key doesn't exist, assuming it is already deleted") - } else { - return err + if d.SSHKeyFingerprint == "" { + if resp, err := client.Keys.DeleteByID(d.SSHKeyID); err != nil { + if resp.StatusCode == 404 { + log.Infof("Digital Ocean SSH key doesn't exist, assuming it is already deleted") + } else { + return err + } } } if resp, err := client.Droplets.Delete(d.DropletID); err != nil {