From 1115659f16bd30fa5064118a04fdcebfafbbeb66 Mon Sep 17 00:00:00 2001 From: Anton Kachurin Date: Wed, 8 Apr 2020 10:06:10 +0300 Subject: [PATCH] Add support of -otc-user-data-file flag --- Makefile | 2 +- driver/opentelekomcloud.go | 15 ++++++++++++++- driver/opentelekomcloud_test.go | 23 +++++++++++++++++++++++ driver/services/compute.go | 1 + 4 files changed, 39 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 99c676e..1c9f275 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ export PATH:=/usr/local/go/bin:$(PATH) exec_path := /usr/local/bin/ exec_name := docker-machine-driver-otc -VERSION := 0.2.2b4 +VERSION := 0.2.2b5 default: test build diff --git a/driver/opentelekomcloud.go b/driver/opentelekomcloud.go index 05ad383..5845603 100644 --- a/driver/opentelekomcloud.go +++ b/driver/opentelekomcloud.go @@ -107,6 +107,7 @@ type Driver struct { FloatingIP managedSting `json:"floating_ip"` Token string `json:"token,omitempty"` RootVolumeOpts *services.DiskOpts `json:"-"` + UserDataFile string `json:"-"` IPVersion int `json:"-"` skipEIPCreation bool eipConfig *services.ElasticIPOpts @@ -357,12 +358,22 @@ func (d *Driver) createInstance() error { if d.K8sSecurityGroupID != "" { secGroups = append(secGroups, d.K8sSecurityGroupID) } + serverOpts := &servers.CreateOpts{ Name: d.MachineName, FlavorRef: d.FlavorID, SecurityGroups: secGroups, AvailabilityZone: d.AvailabilityZone, } + + if d.UserDataFile != "" { + userData, err := ioutil.ReadFile(d.UserDataFile) + if err != nil { + return err + } + serverOpts.UserData = userData + } + instance, err := d.client.CreateInstance(serverOpts, d.SubnetID.Value, d.KeyPairName.Value, d.RootVolumeOpts) if err != nil { return err @@ -522,7 +533,8 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag { mcnflag.StringFlag{ Name: "otc-user-data-file", EnvVar: "OS_USER_DATA_FILE", - Usage: "File containing an otc userdata script", + Usage: "File containing an userdata script", + Value: "", }, mcnflag.StringFlag{ Name: "otc-token", @@ -926,6 +938,7 @@ func (d *Driver) SetConfigFromFlags(flags drivers.DriverOptions) error { d.KeyPairName = managedSting{Value: flags.String("otc-keypair-name")} d.PrivateKeyFile = flags.String("otc-private-key-file") d.Token = flags.String("otc-token") + d.UserDataFile = flags.String("otc-user-data-file") d.AccessKey = services.AccessKey{ AccessKey: flags.String("otc-access-key-id"), SecretKey: flags.String("otc-access-key-key"), diff --git a/driver/opentelekomcloud_test.go b/driver/opentelekomcloud_test.go index f93273f..4103088 100644 --- a/driver/opentelekomcloud_test.go +++ b/driver/opentelekomcloud_test.go @@ -355,5 +355,28 @@ func TestDriver_SetConfigFromFlagsDeprecated(t *testing.T) { assert.Equal(t, eipType, driverNew.eipConfig.IPType) assert.Equal(t, driverNew.skipEIPCreation, driverDeprecated.skipEIPCreation) assert.Equal(t, true, driverNew.skipEIPCreation) +} + +// This test won't check anything really, it exists only for debug purposes +func TestDriver_CreateWithUserData(t *testing.T) { + fileName := "tmp.sh" + userData := []byte("#!/usr/bin/bash\necho touch > /tmp/my") + require.NoError(t, ioutil.WriteFile(fileName, userData, os.ModePerm)) + defer func() { + _ = os.Remove(fileName) + }() + driver, err := newDriverFromFlags( + map[string]interface{}{ + "otc-cloud": "otc", + "otc-user-data-file": fileName, + }) + require.NoError(t, err) + require.NoError(t, driver.initCompute()) + require.NoError(t, driver.initNetwork()) + defer func() { + assert.NoError(t, cleanupResources(driver)) + }() + assert.NoError(t, driver.Create()) + assert.NoError(t, driver.Remove()) } diff --git a/driver/services/compute.go b/driver/services/compute.go index 7c2579b..43de2dd 100644 --- a/driver/services/compute.go +++ b/driver/services/compute.go @@ -81,6 +81,7 @@ func (c *Client) CreateInstance(opts *servers.CreateOpts, subnetID string, keyPa FlavorRef: opts.FlavorRef, FlavorName: opts.FlavorName, SecurityGroups: opts.SecurityGroups, + UserData: opts.UserData, AvailabilityZone: opts.AvailabilityZone, Networks: []servers.Network{{UUID: subnetID}}, ServiceClient: c.ComputeV2,