Enhances Digitalocean driver to support creating Droplets with user-data

Signed-off-by: Jan Broer <janeczku@yahoo.de>
This commit is contained in:
Jan Broer 2015-11-02 17:02:10 +01:00
parent 98777f6774
commit 59d7c3ca61
2 changed files with 26 additions and 0 deletions

View File

@ -26,6 +26,7 @@ Options:
- `--digitalocean-ipv6`: Enable IPv6 support for the droplet. - `--digitalocean-ipv6`: Enable IPv6 support for the droplet.
- `--digitalocean-private-networking`: Enable private networking support for the droplet. - `--digitalocean-private-networking`: Enable private networking support for the droplet.
- `--digitalocean-backups`: Enable Digital Oceans backups for the droplet. - `--digitalocean-backups`: Enable Digital Oceans backups for the droplet.
- `--digitalocean-userdata`: Path to file containing User Data for the droplet.
The DigitalOcean driver will use `ubuntu-14-04-x64` as the default image. The DigitalOcean driver will use `ubuntu-14-04-x64` as the default image.
@ -40,3 +41,4 @@ Environment variables and default values:
| `--digitalocean-ipv6` | `DIGITALOCEAN_IPV6` | `false` | | `--digitalocean-ipv6` | `DIGITALOCEAN_IPV6` | `false` |
| `--digitalocean-private-networking` | `DIGITALOCEAN_PRIVATE_NETWORKING` | `false` | | `--digitalocean-private-networking` | `DIGITALOCEAN_PRIVATE_NETWORKING` | `false` |
| `--digitalocean-backups` | `DIGITALOCEAN_BACKUPS` | `false` | | `--digitalocean-backups` | `DIGITALOCEAN_BACKUPS` | `false` |
| `--digitalocean-userdata` | `DIGITALOCEAN_USERDATA` | - |

View File

@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"net" "net"
"os"
"time" "time"
"github.com/digitalocean/godo" "github.com/digitalocean/godo"
@ -27,6 +28,7 @@ type Driver struct {
IPv6 bool IPv6 bool
Backups bool Backups bool
PrivateNetworking bool PrivateNetworking bool
UserDataFile string
} }
const ( const (
@ -83,6 +85,11 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag {
Name: "digitalocean-backups", Name: "digitalocean-backups",
Usage: "enable backups for droplet", Usage: "enable backups for droplet",
}, },
mcnflag.StringFlag{
EnvVar: "DIGITALOCEAN_USERDATA",
Name: "digitalocean-userdata",
Usage: "path to file with cloud-init user-data",
},
} }
} }
@ -115,6 +122,7 @@ func (d *Driver) SetConfigFromFlags(flags drivers.DriverOptions) error {
d.IPv6 = flags.Bool("digitalocean-ipv6") d.IPv6 = flags.Bool("digitalocean-ipv6")
d.PrivateNetworking = flags.Bool("digitalocean-private-networking") d.PrivateNetworking = flags.Bool("digitalocean-private-networking")
d.Backups = flags.Bool("digitalocean-backups") d.Backups = flags.Bool("digitalocean-backups")
d.UserDataFile = flags.String("digitalocean-userdata")
d.SwarmMaster = flags.Bool("swarm-master") d.SwarmMaster = flags.Bool("swarm-master")
d.SwarmHost = flags.String("swarm-host") d.SwarmHost = flags.String("swarm-host")
d.SwarmDiscovery = flags.String("swarm-discovery") d.SwarmDiscovery = flags.String("swarm-discovery")
@ -129,6 +137,12 @@ func (d *Driver) SetConfigFromFlags(flags drivers.DriverOptions) error {
} }
func (d *Driver) PreCreateCheck() error { func (d *Driver) PreCreateCheck() error {
if d.UserDataFile != "" {
if _, err := os.Stat(d.UserDataFile); os.IsNotExist(err) {
return fmt.Errorf("user-data file %s could not be found", d.UserDataFile)
}
}
client := d.getClient() client := d.getClient()
regions, _, err := client.Regions.List(nil) regions, _, err := client.Regions.List(nil)
if err != nil { if err != nil {
@ -144,6 +158,15 @@ func (d *Driver) PreCreateCheck() error {
} }
func (d *Driver) Create() error { func (d *Driver) Create() error {
var userdata string
if d.UserDataFile != "" {
buf, err := ioutil.ReadFile(d.UserDataFile)
if err != nil {
return err
}
userdata = string(buf)
}
log.Infof("Creating SSH key...") log.Infof("Creating SSH key...")
key, err := d.createSSHKey() key, err := d.createSSHKey()
@ -165,6 +188,7 @@ func (d *Driver) Create() error {
IPv6: d.IPv6, IPv6: d.IPv6,
PrivateNetworking: d.PrivateNetworking, PrivateNetworking: d.PrivateNetworking,
Backups: d.Backups, Backups: d.Backups,
UserData: userdata,
SSHKeys: []godo.DropletCreateSSHKey{{ID: d.SSHKeyID}}, SSHKeys: []godo.DropletCreateSSHKey{{ID: d.SSHKeyID}},
} }