From b2e3d81537270e63b3cb49246cda97c62d3deacb Mon Sep 17 00:00:00 2001 From: Wade Tandy Date: Fri, 22 Apr 2016 17:40:22 -0400 Subject: [PATCH] Expose OpenStack driver's userdata param This allows a user to pass a script or cloud-config file that can be used to initialize the server before the server starts up. This is particularly useful in enterprise cloud environments where the available images on openstack might not be fully compatible with the docker-machine provisioners. Signed-off-by: Wade Tandy --- drivers/openstack/client.go | 1 + drivers/openstack/openstack.go | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/drivers/openstack/client.go b/drivers/openstack/client.go index 791a66f45e..83a57390aa 100644 --- a/drivers/openstack/client.go +++ b/drivers/openstack/client.go @@ -63,6 +63,7 @@ func (c *GenericClient) CreateInstance(d *Driver) (string, error) { Name: d.MachineName, FlavorRef: d.FlavorId, ImageRef: d.ImageId, + UserData: d.UserData, SecurityGroups: d.SecurityGroups, AvailabilityZone: d.AvailabilityZone, } diff --git a/drivers/openstack/openstack.go b/drivers/openstack/openstack.go index 3b31e8a3f7..89ce20cf47 100644 --- a/drivers/openstack/openstack.go +++ b/drivers/openstack/openstack.go @@ -37,6 +37,7 @@ type Driver struct { KeyPairName string NetworkName string NetworkId string + UserData []byte PrivateKeyFile string SecurityGroups []string FloatingIpPool string @@ -161,6 +162,12 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag { Usage: "Private keyfile to use for SSH (absolute path)", Value: "", }, + mcnflag.StringFlag{ + EnvVar: "OS_USER_DATA_FILE", + Name: "openstack-user-data-file", + Usage: "File containing an openstack userdata script", + Value: "", + }, mcnflag.StringFlag{ EnvVar: "OS_NETWORK_NAME", Name: "openstack-net-name", @@ -270,6 +277,16 @@ func (d *Driver) SetConfigFromFlags(flags drivers.DriverOptions) error { d.SSHPort = flags.Int("openstack-ssh-port") d.KeyPairName = flags.String("openstack-keypair-name") d.PrivateKeyFile = flags.String("openstack-private-key-file") + + if flags.String("openstack-user-data-file") != "" { + userData, err := ioutil.ReadFile(flags.String("openstack-user-data-file")) + if err == nil { + d.UserData = userData + } else { + return err + } + } + d.SetSwarmConfigFromFlags(flags) return d.checkConfig()