From f2125d587b45d46e056b9e80efe2e6cfbf119414 Mon Sep 17 00:00:00 2001 From: blackwood821 Date: Tue, 26 Apr 2022 15:55:31 -0500 Subject: [PATCH 1/9] Made machine driver compatible with Rancher by adding the ability to pass in the private SSH key as a base64 encoded string --- driver.go | 134 +++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 118 insertions(+), 16 deletions(-) diff --git a/driver.go b/driver.go index 0845210..a969ace 100644 --- a/driver.go +++ b/driver.go @@ -2,7 +2,9 @@ package main import ( "context" + "encoding/base64" "encoding/pem" + "errors" "fmt" "io/ioutil" "os" @@ -13,6 +15,7 @@ import ( "github.com/docker/machine/libmachine/engine" "github.com/docker/machine/libmachine/log" "github.com/docker/machine/libmachine/mcnflag" + "github.com/docker/machine/libmachine/mcnutils" "github.com/docker/machine/libmachine/state" "github.com/joyent/triton-go" @@ -28,10 +31,11 @@ const ( ) var ( - defaultTritonAccount = "" - defaultTritonKeyPath = "" // os.Getenv("HOME") + "/.ssh/id_rsa" - defaultTritonKeyId = "" - defaultTritonUrl = "https://us-east-1.api.joyent.com" + defaultTritonAccount = "" + defaultTritonKeyPath = "" // os.Getenv("HOME") + "/.ssh/id_rsa" + defaultTritonKeyId = "" + defaultTritonKeyMaterial = "" + defaultTritonUrl = "https://us-east-1.api.joyent.com" // https://docs.joyent.com/public-cloud/instances/virtual-machines/images/linux/debian#debian-8 defaultTritonImage = "debian-8" @@ -43,10 +47,12 @@ type Driver struct { *drivers.BaseDriver // authentication/access parameters - TritonAccount string - TritonKeyPath string - TritonKeyId string - TritonUrl string + TritonAccount string + TritonKeyPath string + TritonKeyMaterial string + TritonKeyMaterialDecoded string + TritonKeyId string + TritonUrl string // machine creation parameters TritonImage string @@ -60,6 +66,20 @@ type Driver struct { func (d *Driver) SetConfigFromFlags(opts drivers.DriverOptions) error { d.TritonAccount = opts.String(flagPrefix + "account") d.TritonKeyPath = opts.String(flagPrefix + "key-path") + + d.TritonKeyMaterial = opts.String(flagPrefix + "key-material") + + // the --triton-key-material argument has to be base-64 encoded since the raw private SSH key content + // contains new lines and the Rancher node template UI doesn't allow multi-line strings + if d.TritonKeyMaterial != "" { + decodedKey, err := base64.StdEncoding.DecodeString(d.TritonKeyMaterial) + if err != nil { + return fmt.Errorf("%s driver failed to base64 decode %skey-material", driverName, flagPrefix) + } + + d.TritonKeyMaterialDecoded = string(decodedKey) + } + d.TritonKeyId = opts.String(flagPrefix + "key-id") d.TritonUrl = opts.String(flagPrefix + "url") @@ -121,6 +141,11 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag { Value: defaultTritonKeyPath, }, + mcnflag.StringFlag{ + Name: flagPrefix + "key-material", + Usage: fmt.Sprintf("The SSH private key file content (base64 encoded) that has been added to $%sACCOUNT", envPrefix), + Value: defaultTritonKeyMaterial, + }, mcnflag.StringFlag{ Name: flagPrefix + "image", Usage: `VM image to provision ("debian-8", "debian-8@20150527", "ca291f66", etc)`, @@ -144,7 +169,12 @@ func (d Driver) client() (*compute.ComputeClient, error) { var signer auth.Signer var err error - if d.TritonKeyPath == "" { + if d.TritonKeyMaterialDecoded != "" { + signer, err = auth.NewPrivateKeySigner(d.TritonKeyId, []byte(d.TritonKeyMaterialDecoded), d.TritonAccount) + if err != nil { + return nil, fmt.Errorf("error creating SSH private key signer: %s", err) + } + } else if d.TritonKeyPath == "" { signer, err = auth.NewSSHAgentSigner(d.TritonKeyId, d.TritonAccount) if err != nil { return nil, fmt.Errorf("error Creating SSH Agent Signer: %s", err) @@ -208,12 +238,13 @@ func (d *Driver) getMachine() (*compute.Instance, error) { return machine, nil } -func NewDriver(hostName, storePath string) Driver { - return Driver{ - TritonAccount: defaultTritonAccount, - TritonKeyPath: defaultTritonKeyPath, - TritonKeyId: defaultTritonKeyId, - TritonUrl: defaultTritonUrl, +func NewDriver(hostName, storePath string) *Driver { + return &Driver{ + TritonAccount: defaultTritonAccount, + TritonKeyPath: defaultTritonKeyPath, + TritonKeyMaterial: defaultTritonKeyMaterial, + TritonKeyId: defaultTritonKeyId, + TritonUrl: defaultTritonUrl, BaseDriver: &drivers.BaseDriver{ MachineName: hostName, @@ -233,6 +264,18 @@ func (d *Driver) Create() error { return err } + /* If a base64 encoded private key was supplied rather than a path to a key + * then write the decoded key to a file so that Rancher can use it to + * connect to the node after it's been provisioned + */ + if d.TritonKeyMaterialDecoded != "" { + log.Infof("creating SSH key...") + + if err := d.createSSHKey(); err != nil { + return err + } + } + input := &compute.CreateInstanceInput{ Name: d.MachineName, Image: d.TritonImage, @@ -245,6 +288,38 @@ func (d *Driver) Create() error { d.TritonMachineId = machine.ID + // assign IPAddress property so that Rancher can SSH to the new instance + log.Info("waiting for ip address to become available") + if err := mcnutils.WaitFor(d.instanceIpAvailable); err != nil { + return err + } + + return nil +} + +func (d *Driver) createSSHKey() error { + + // set SSHKeyPath because rancher accesses the property directly + d.SSHKeyPath = d.GetSSHKeyPath() + + // don't do anything if the key was already written to file + if _, err := os.Stat(d.GetSSHKeyPath()); errors.Is(err, os.ErrNotExist) { + file, err := os.OpenFile(d.GetSSHKeyPath(), os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0600) + if err != nil { + return err + } + + defer file.Close() + + if _, err := file.Write([]byte(d.TritonKeyMaterialDecoded)); err != nil { + return err + } + + if _, err := file.WriteString("\n"); err != nil { + return err + } + } + return nil } @@ -358,6 +433,19 @@ func (d *Driver) GetIP() (string, error) { return machine.PrimaryIP, nil } +func (d *Driver) instanceIpAvailable() bool { + ip, err := d.GetIP() + if err != nil { + log.Debug(err) + } + if ip != "" { + d.IPAddress = ip + log.Infof("got the IP Address: %q", d.IPAddress) + return true + } + return false +} + // GetSSHHostname returns hostname for use with ssh func (d *Driver) GetSSHHostname() (string, error) { return d.GetIP() @@ -379,7 +467,21 @@ func (d *Driver) GetURL() (string, error) { } func (d *Driver) GetSSHKeyPath() string { - return d.TritonKeyPath + var keyPath = d.SSHKeyPath + + if keyPath != "" { + return keyPath + } + + if d.TritonKeyMaterialDecoded != "" { + keyPath = d.ResolveStorePath(fmt.Sprintf("id_rsa_triton_%s", d.TritonAccount)) + } else { + keyPath = d.TritonKeyPath + } + + d.SSHKeyPath = keyPath + + return keyPath } // GetState returns the state that the host is in (running, stopped, etc) From 65d1f77856092cdb9cf111de1965d8098497bc18 Mon Sep 17 00:00:00 2001 From: blackwood821 Date: Mon, 20 Jun 2022 11:45:47 -0500 Subject: [PATCH 2/9] Removed default CloudAPI URL --- driver.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/driver.go b/driver.go index a969ace..dbb6c94 100644 --- a/driver.go +++ b/driver.go @@ -35,7 +35,7 @@ var ( defaultTritonKeyPath = "" // os.Getenv("HOME") + "/.ssh/id_rsa" defaultTritonKeyId = "" defaultTritonKeyMaterial = "" - defaultTritonUrl = "https://us-east-1.api.joyent.com" + defaultTritonUrl = "" // https://docs.joyent.com/public-cloud/instances/virtual-machines/images/linux/debian#debian-8 defaultTritonImage = "debian-8" From 625a5ce702dcc2d73a277706893a115b72033b6a Mon Sep 17 00:00:00 2001 From: blackwood821 Date: Fri, 8 Jul 2022 16:15:32 -0500 Subject: [PATCH 3/9] Adding new optional --triton-tls-insecure argument to provide the option not to validate the CloudAPI SSL certificate in development setups. --- driver.go | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/driver.go b/driver.go index dbb6c94..4cfa970 100644 --- a/driver.go +++ b/driver.go @@ -38,9 +38,10 @@ var ( defaultTritonUrl = "" // https://docs.joyent.com/public-cloud/instances/virtual-machines/images/linux/debian#debian-8 - defaultTritonImage = "debian-8" - defaultTritonPackage = "k4-highcpu-kvm-250M" - defaultSSHUser = "root" + defaultTritonImage = "debian-8" + defaultTritonPackage = "k4-highcpu-kvm-250M" + defaultSSHUser = "root" + defaultTritonTLSInsecure = "false" ) type Driver struct { @@ -53,6 +54,7 @@ type Driver struct { TritonKeyMaterialDecoded string TritonKeyId string TritonUrl string + TritonTLSInsecure string // machine creation parameters TritonImage string @@ -162,6 +164,12 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag { Usage: "Triton SSH user", Value: defaultSSHUser, }, + mcnflag.StringFlag{ + EnvVar: envPrefix + "TLS_INSECURE", + Name: flagPrefix + "tls-insecure", + Usage: "Do not validate the CloudAPI SSL certificate", + Value: defaultTritonTLSInsecure, + }, } } @@ -215,7 +223,18 @@ func (d Driver) client() (*compute.ComputeClient, error) { Signers: []auth.Signer{signer}, } - return compute.NewClient(config) + var client *compute.ComputeClient + client, err = compute.NewClient(config) + + if err != nil { + return nil, fmt.Errorf("error creating ComputeClient: %s", err) + } + + if d.TritonTLSInsecure == "true" { + client.Client.InsecureSkipTLSVerify() + } + + return client, nil } func (d *Driver) getMachine() (*compute.Instance, error) { @@ -245,6 +264,7 @@ func NewDriver(hostName, storePath string) *Driver { TritonKeyMaterial: defaultTritonKeyMaterial, TritonKeyId: defaultTritonKeyId, TritonUrl: defaultTritonUrl, + TritonTLSInsecure: defaultTritonTLSInsecure, BaseDriver: &drivers.BaseDriver{ MachineName: hostName, From c511adb63eb851d82ae685def60fb548508f20c1 Mon Sep 17 00:00:00 2001 From: blackwood821 Date: Mon, 11 Jul 2022 17:24:12 -0500 Subject: [PATCH 4/9] Fixed bug where the TritonTLSInsecure field was not getting set from the argument --- driver.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/driver.go b/driver.go index 4cfa970..fa937ff 100644 --- a/driver.go +++ b/driver.go @@ -90,6 +90,8 @@ func (d *Driver) SetConfigFromFlags(opts drivers.DriverOptions) error { d.SSHUser = opts.String(flagPrefix + "ssh-user") + d.TritonTLSInsecure = opts.String(flagPrefix + "tls-insecure") + d.SetSwarmConfigFromFlags(opts) if d.TritonAccount == "" { @@ -230,6 +232,8 @@ func (d Driver) client() (*compute.ComputeClient, error) { return nil, fmt.Errorf("error creating ComputeClient: %s", err) } + log.Debugf("TritonTLSInsecure=%s", d.TritonTLSInsecure) + if d.TritonTLSInsecure == "true" { client.Client.InsecureSkipTLSVerify() } From 8fc62300b8607bf0769680db7523e80f742cacda Mon Sep 17 00:00:00 2001 From: blackwood821 Date: Mon, 11 Jul 2022 17:24:38 -0500 Subject: [PATCH 5/9] Modified ping so that it doesn't hide the error --- vendor/github.com/joyent/triton-go/compute/ping.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/github.com/joyent/triton-go/compute/ping.go b/vendor/github.com/joyent/triton-go/compute/ping.go index c0f62df..d43e894 100644 --- a/vendor/github.com/joyent/triton-go/compute/ping.go +++ b/vendor/github.com/joyent/triton-go/compute/ping.go @@ -30,7 +30,7 @@ func (c *ComputeClient) Ping(ctx context.Context) (*PingOutput, error) { } response, err := c.Client.ExecuteRequestRaw(ctx, reqInputs) if response == nil { - return nil, fmt.Errorf("Ping request has empty response") + return nil, fmt.Errorf("Ping request has empty response: %s", err) } if response.Body != nil { defer response.Body.Close() From ea2c35c1695e39f4b29782cb448a858d6a491170 Mon Sep 17 00:00:00 2001 From: blackwood821 Date: Thu, 11 Aug 2022 08:33:40 -0500 Subject: [PATCH 6/9] Added support for --act-as= just like node-triton --- driver.go | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/driver.go b/driver.go index fa937ff..48ba9b4 100644 --- a/driver.go +++ b/driver.go @@ -31,11 +31,12 @@ const ( ) var ( - defaultTritonAccount = "" - defaultTritonKeyPath = "" // os.Getenv("HOME") + "/.ssh/id_rsa" - defaultTritonKeyId = "" - defaultTritonKeyMaterial = "" - defaultTritonUrl = "" + defaultTritonAccount = "" + defaultTritonActAsAccount = "" + defaultTritonKeyPath = "" // os.Getenv("HOME") + "/.ssh/id_rsa" + defaultTritonKeyId = "" + defaultTritonKeyMaterial = "" + defaultTritonUrl = "" // https://docs.joyent.com/public-cloud/instances/virtual-machines/images/linux/debian#debian-8 defaultTritonImage = "debian-8" @@ -49,6 +50,7 @@ type Driver struct { // authentication/access parameters TritonAccount string + TritonActAsAccount string TritonKeyPath string TritonKeyMaterial string TritonKeyMaterialDecoded string @@ -67,6 +69,7 @@ type Driver struct { // SetConfigFromFlags configures the driver with the object that was returned by RegisterCreateFlags func (d *Driver) SetConfigFromFlags(opts drivers.DriverOptions) error { d.TritonAccount = opts.String(flagPrefix + "account") + d.TritonActAsAccount = opts.String(flagPrefix + "act-as") d.TritonKeyPath = opts.String(flagPrefix + "key-path") d.TritonKeyMaterial = opts.String(flagPrefix + "key-material") @@ -132,6 +135,12 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag { Usage: "Login name/username", Value: defaultTritonAccount, }, + mcnflag.StringFlag{ + EnvVar: envPrefix + "ACT_AS", + Name: flagPrefix + "act-as", + Usage: "Masquerade as the given account login name.", + Value: defaultTritonActAsAccount, + }, mcnflag.StringFlag{ EnvVar: envPrefix + "KEY_ID", Name: flagPrefix + "key-id", @@ -219,9 +228,14 @@ func (d Driver) client() (*compute.ComputeClient, error) { } } + var authAccount = d.TritonActAsAccount + if authAccount == "" { + authAccount = d.TritonAccount + } + config := &triton.ClientConfig{ TritonURL: d.TritonUrl, - AccountName: d.TritonAccount, + AccountName: authAccount, Signers: []auth.Signer{signer}, } @@ -263,12 +277,13 @@ func (d *Driver) getMachine() (*compute.Instance, error) { func NewDriver(hostName, storePath string) *Driver { return &Driver{ - TritonAccount: defaultTritonAccount, - TritonKeyPath: defaultTritonKeyPath, - TritonKeyMaterial: defaultTritonKeyMaterial, - TritonKeyId: defaultTritonKeyId, - TritonUrl: defaultTritonUrl, - TritonTLSInsecure: defaultTritonTLSInsecure, + TritonAccount: defaultTritonAccount, + TritonActAsAccount: defaultTritonActAsAccount, + TritonKeyPath: defaultTritonKeyPath, + TritonKeyMaterial: defaultTritonKeyMaterial, + TritonKeyId: defaultTritonKeyId, + TritonUrl: defaultTritonUrl, + TritonTLSInsecure: defaultTritonTLSInsecure, BaseDriver: &drivers.BaseDriver{ MachineName: hostName, From f0afe75bd697fab151b64fc9b410fecb8e55689f Mon Sep 17 00:00:00 2001 From: nmvrc Date: Wed, 31 Jan 2024 16:31:55 -0800 Subject: [PATCH 7/9] Added support for specifying VM tags with --tags Specifying a single tag is functionally the same as node-triton's `-t` argument, Multiple tags can be specified in a comma-delimited format, such as `=,=`. --- driver.go | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/driver.go b/driver.go index 48ba9b4..a568f40 100644 --- a/driver.go +++ b/driver.go @@ -37,6 +37,7 @@ var ( defaultTritonKeyId = "" defaultTritonKeyMaterial = "" defaultTritonUrl = "" + defaultTritonTags = "" // https://docs.joyent.com/public-cloud/instances/virtual-machines/images/linux/debian#debian-8 defaultTritonImage = "debian-8" @@ -56,6 +57,7 @@ type Driver struct { TritonKeyMaterialDecoded string TritonKeyId string TritonUrl string + TritonTags string TritonTLSInsecure string // machine creation parameters @@ -87,6 +89,7 @@ func (d *Driver) SetConfigFromFlags(opts drivers.DriverOptions) error { d.TritonKeyId = opts.String(flagPrefix + "key-id") d.TritonUrl = opts.String(flagPrefix + "url") + d.TritonTags = opts.String(flagPrefix + "tags") d.TritonImage = opts.String(flagPrefix + "image") d.TritonPackage = opts.String(flagPrefix + "package") @@ -181,6 +184,12 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag { Usage: "Do not validate the CloudAPI SSL certificate", Value: defaultTritonTLSInsecure, }, + mcnflag.StringFlag{ + EnvVar: envPrefix + "TAGS", + Name: flagPrefix + "tags", + Usage: "Tags assigned to the VM", + Value: defaultTritonTags, + }, } } @@ -283,6 +292,7 @@ func NewDriver(hostName, storePath string) *Driver { TritonKeyMaterial: defaultTritonKeyMaterial, TritonKeyId: defaultTritonKeyId, TritonUrl: defaultTritonUrl, + TritonTags: defaultTritonTags, TritonTLSInsecure: defaultTritonTLSInsecure, BaseDriver: &drivers.BaseDriver{ @@ -315,10 +325,25 @@ func (d *Driver) Create() error { } } + // parse out tags into a map + var tags map[string]string + if d.TritonTags != "" { + tags = make(map[string]string) + splitTags := strings.Split(d.TritonTags, ",") + for _, tagDefinition := range splitTags { + definitionSplit := strings.Split(tagDefinition, "=") + if len(definitionSplit) == 2 { + // remove leading and trailing whitespace from tag key and value + tags[strings.TrimSpace(definitionSplit[0])] = strings.TrimSpace(definitionSplit[1]) + } + } + } + input := &compute.CreateInstanceInput{ Name: d.MachineName, Image: d.TritonImage, Package: d.TritonPackage, + Tags: tags, } machine, err := c.Instances().Create(context.Background(), input) if err != nil { From 331743f575b73d4616159995c49b001881c8bbda Mon Sep 17 00:00:00 2001 From: blackwood821 <36967614+blackwood821@users.noreply.github.com> Date: Fri, 12 Apr 2024 16:13:24 -0500 Subject: [PATCH 8/9] Added support for specifying metadata via --metadata --- driver.go | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/driver.go b/driver.go index a568f40..4654c2b 100644 --- a/driver.go +++ b/driver.go @@ -38,6 +38,7 @@ var ( defaultTritonKeyMaterial = "" defaultTritonUrl = "" defaultTritonTags = "" + defaultTritonMetadata = "" // https://docs.joyent.com/public-cloud/instances/virtual-machines/images/linux/debian#debian-8 defaultTritonImage = "debian-8" @@ -58,6 +59,7 @@ type Driver struct { TritonKeyId string TritonUrl string TritonTags string + TritonMetadata string TritonTLSInsecure string // machine creation parameters @@ -90,6 +92,7 @@ func (d *Driver) SetConfigFromFlags(opts drivers.DriverOptions) error { d.TritonKeyId = opts.String(flagPrefix + "key-id") d.TritonUrl = opts.String(flagPrefix + "url") d.TritonTags = opts.String(flagPrefix + "tags") + d.TritonMetadata = opts.String(flagPrefix + "metadata") d.TritonImage = opts.String(flagPrefix + "image") d.TritonPackage = opts.String(flagPrefix + "package") @@ -190,6 +193,12 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag { Usage: "Tags assigned to the VM", Value: defaultTritonTags, }, + mcnflag.StringFlag{ + EnvVar: envPrefix + "METADATA", + Name: flagPrefix + "metadata", + Usage: "Metadata assigned to the VM", + Value: defaultTritonMetadata, + }, } } @@ -293,6 +302,7 @@ func NewDriver(hostName, storePath string) *Driver { TritonKeyId: defaultTritonKeyId, TritonUrl: defaultTritonUrl, TritonTags: defaultTritonTags, + TritonMetadata: defaultTritonMetadata, TritonTLSInsecure: defaultTritonTLSInsecure, BaseDriver: &drivers.BaseDriver{ @@ -339,11 +349,26 @@ func (d *Driver) Create() error { } } + // parse out metadata into a map + var metadata map[string]string + if d.TritonMetadata != "" { + metadata = make(map[string]string) + splitMetadata := strings.Split(d.TritonMetadata, ",") + for _, metadataDefinition := range splitMetadata { + definitionSplit := strings.Split(metadataDefinition, "=") + if len(definitionSplit) == 2 { + // remove leading and trailing whitespace from tag key and value + metadata[strings.TrimSpace(definitionSplit[0])] = strings.TrimSpace(definitionSplit[1]) + } + } + } + input := &compute.CreateInstanceInput{ - Name: d.MachineName, - Image: d.TritonImage, - Package: d.TritonPackage, - Tags: tags, + Name: d.MachineName, + Image: d.TritonImage, + Package: d.TritonPackage, + Tags: tags, + Metadata: metadata, } machine, err := c.Instances().Create(context.Background(), input) if err != nil { From cf4f3751777ed6599d897b371ef1df68350a36ae Mon Sep 17 00:00:00 2001 From: blackwood821 <36967614+blackwood821@users.noreply.github.com> Date: Thu, 7 Nov 2024 12:34:35 -0600 Subject: [PATCH 9/9] Changed "metadata" to "mdata" since the former is a reserved field name in RKE2. --- driver.go | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/driver.go b/driver.go index 4654c2b..25bd6f3 100644 --- a/driver.go +++ b/driver.go @@ -38,7 +38,7 @@ var ( defaultTritonKeyMaterial = "" defaultTritonUrl = "" defaultTritonTags = "" - defaultTritonMetadata = "" + defaultTritonMdata = "" // https://docs.joyent.com/public-cloud/instances/virtual-machines/images/linux/debian#debian-8 defaultTritonImage = "debian-8" @@ -59,7 +59,7 @@ type Driver struct { TritonKeyId string TritonUrl string TritonTags string - TritonMetadata string + TritonMdata string TritonTLSInsecure string // machine creation parameters @@ -92,7 +92,7 @@ func (d *Driver) SetConfigFromFlags(opts drivers.DriverOptions) error { d.TritonKeyId = opts.String(flagPrefix + "key-id") d.TritonUrl = opts.String(flagPrefix + "url") d.TritonTags = opts.String(flagPrefix + "tags") - d.TritonMetadata = opts.String(flagPrefix + "metadata") + d.TritonMdata = opts.String(flagPrefix + "mdata") d.TritonImage = opts.String(flagPrefix + "image") d.TritonPackage = opts.String(flagPrefix + "package") @@ -194,10 +194,10 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag { Value: defaultTritonTags, }, mcnflag.StringFlag{ - EnvVar: envPrefix + "METADATA", - Name: flagPrefix + "metadata", + EnvVar: envPrefix + "MDATA", + Name: flagPrefix + "mdata", Usage: "Metadata assigned to the VM", - Value: defaultTritonMetadata, + Value: defaultTritonMdata, }, } } @@ -302,7 +302,7 @@ func NewDriver(hostName, storePath string) *Driver { TritonKeyId: defaultTritonKeyId, TritonUrl: defaultTritonUrl, TritonTags: defaultTritonTags, - TritonMetadata: defaultTritonMetadata, + TritonMdata: defaultTritonMdata, TritonTLSInsecure: defaultTritonTLSInsecure, BaseDriver: &drivers.BaseDriver{ @@ -341,7 +341,7 @@ func (d *Driver) Create() error { tags = make(map[string]string) splitTags := strings.Split(d.TritonTags, ",") for _, tagDefinition := range splitTags { - definitionSplit := strings.Split(tagDefinition, "=") + definitionSplit := strings.SplitN(tagDefinition, "=", 2) if len(definitionSplit) == 2 { // remove leading and trailing whitespace from tag key and value tags[strings.TrimSpace(definitionSplit[0])] = strings.TrimSpace(definitionSplit[1]) @@ -351,11 +351,11 @@ func (d *Driver) Create() error { // parse out metadata into a map var metadata map[string]string - if d.TritonMetadata != "" { + if d.TritonMdata != "" { metadata = make(map[string]string) - splitMetadata := strings.Split(d.TritonMetadata, ",") + splitMetadata := strings.Split(d.TritonMdata, ",") for _, metadataDefinition := range splitMetadata { - definitionSplit := strings.Split(metadataDefinition, "=") + definitionSplit := strings.SplitN(metadataDefinition, "=", 2) if len(definitionSplit) == 2 { // remove leading and trailing whitespace from tag key and value metadata[strings.TrimSpace(definitionSplit[0])] = strings.TrimSpace(definitionSplit[1])