From c17f42fab510c5b553ea4e44cd46be411119a400 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 791a66f..83a5739 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 3b31e8a..89ce20c 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()