diff --git a/drivers/amazonec2/amazonec2.go b/drivers/amazonec2/amazonec2.go index 72dd69e82f..c9ef04932b 100644 --- a/drivers/amazonec2/amazonec2.go +++ b/drivers/amazonec2/amazonec2.go @@ -150,7 +150,7 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag { Usage: "AWS spot instance bid price (in dollar)", Value: defaultSpotPrice, }, - mcnflag.StringFlag{ + mcnflag.BoolFlag{ Name: "amazonec2-private-address-only", Usage: "Only use a private IP address", }, diff --git a/drivers/amazonec2/amazonec2_test.go b/drivers/amazonec2/amazonec2_test.go index d243348706..bebc9cdbea 100644 --- a/drivers/amazonec2/amazonec2_test.go +++ b/drivers/amazonec2/amazonec2_test.go @@ -7,6 +7,8 @@ import ( "github.com/docker/machine/commands/mcndirs" "github.com/docker/machine/drivers/amazonec2/amz" + "github.com/docker/machine/libmachine/drivers" + "github.com/stretchr/testify/assert" ) const ( @@ -235,3 +237,22 @@ func TestValidateAwsRegionInvalid(t *testing.T) { } } } + +func TestSetConfigFromFlags(t *testing.T) { + driver, err := getTestDriver() + if err != nil { + t.Fatal(err) + } + + checkFlags := &drivers.CheckDriverOptions{ + FlagsValues: map[string]interface{}{ + "amazonec2-region": "us-west-2", + }, + CreateFlags: driver.GetCreateFlags(), + } + + driver.SetConfigFromFlags(checkFlags) + + assert.NoError(t, err) + assert.Empty(t, checkFlags.InvalidFlags) +} diff --git a/drivers/digitalocean/digitalocean_test.go b/drivers/digitalocean/digitalocean_test.go new file mode 100644 index 0000000000..16ad63bf57 --- /dev/null +++ b/drivers/digitalocean/digitalocean_test.go @@ -0,0 +1,24 @@ +package digitalocean + +import ( + "testing" + + "github.com/docker/machine/libmachine/drivers" + "github.com/stretchr/testify/assert" +) + +func TestSetConfigFromFlags(t *testing.T) { + driver := NewDriver("default", "path") + + checkFlags := &drivers.CheckDriverOptions{ + FlagsValues: map[string]interface{}{ + "digitalocean-access-token": "TOKEN", + }, + CreateFlags: driver.GetCreateFlags(), + } + + err := driver.SetConfigFromFlags(checkFlags) + + assert.NoError(t, err) + assert.Empty(t, checkFlags.InvalidFlags) +} diff --git a/drivers/exoscale/exoscale_test.go b/drivers/exoscale/exoscale_test.go new file mode 100644 index 0000000000..0638f3cc0c --- /dev/null +++ b/drivers/exoscale/exoscale_test.go @@ -0,0 +1,25 @@ +package exoscale + +import ( + "testing" + + "github.com/docker/machine/libmachine/drivers" + "github.com/stretchr/testify/assert" +) + +func TestSetConfigFromFlags(t *testing.T) { + driver := NewDriver("default", "path") + + checkFlags := &drivers.CheckDriverOptions{ + FlagsValues: map[string]interface{}{ + "exoscale-api-key": "API_KEY", + "exoscale-api-secret-key": "API_SECRET_KEY", + }, + CreateFlags: driver.GetCreateFlags(), + } + + err := driver.SetConfigFromFlags(checkFlags) + + assert.NoError(t, err) + assert.Empty(t, checkFlags.InvalidFlags) +} diff --git a/drivers/generic/generic_test.go b/drivers/generic/generic_test.go new file mode 100644 index 0000000000..d57552a037 --- /dev/null +++ b/drivers/generic/generic_test.go @@ -0,0 +1,25 @@ +package generic + +import ( + "testing" + + "github.com/docker/machine/libmachine/drivers" + "github.com/stretchr/testify/assert" +) + +func TestSetConfigFromFlags(t *testing.T) { + driver := NewDriver("default", "path") + + checkFlags := &drivers.CheckDriverOptions{ + FlagsValues: map[string]interface{}{ + "generic-ip-address": "localhost", + "generic-ssh-key": "path", + }, + CreateFlags: driver.GetCreateFlags(), + } + + err := driver.SetConfigFromFlags(checkFlags) + + assert.NoError(t, err) + assert.Empty(t, checkFlags.InvalidFlags) +} diff --git a/drivers/google/google_test.go b/drivers/google/google_test.go new file mode 100644 index 0000000000..27594e1234 --- /dev/null +++ b/drivers/google/google_test.go @@ -0,0 +1,24 @@ +package google + +import ( + "testing" + + "github.com/docker/machine/libmachine/drivers" + "github.com/stretchr/testify/assert" +) + +func TestSetConfigFromFlags(t *testing.T) { + driver := NewDriver("default", "path") + + checkFlags := &drivers.CheckDriverOptions{ + FlagsValues: map[string]interface{}{ + "google-project": "PROJECT", + }, + CreateFlags: driver.GetCreateFlags(), + } + + err := driver.SetConfigFromFlags(checkFlags) + + assert.NoError(t, err) + assert.Empty(t, checkFlags.InvalidFlags) +} diff --git a/drivers/hyperv/hyperv_test.go b/drivers/hyperv/hyperv_test.go new file mode 100644 index 0000000000..13777fb8ac --- /dev/null +++ b/drivers/hyperv/hyperv_test.go @@ -0,0 +1,22 @@ +package hyperv + +import ( + "testing" + + "github.com/docker/machine/libmachine/drivers" + "github.com/stretchr/testify/assert" +) + +func TestSetConfigFromFlags(t *testing.T) { + driver := NewDriver("default", "path") + + checkFlags := &drivers.CheckDriverOptions{ + FlagsValues: map[string]interface{}{}, + CreateFlags: driver.GetCreateFlags(), + } + + err := driver.SetConfigFromFlags(checkFlags) + + assert.NoError(t, err) + assert.Empty(t, checkFlags.InvalidFlags) +} diff --git a/drivers/openstack/openstack_test.go b/drivers/openstack/openstack_test.go new file mode 100644 index 0000000000..49134c0855 --- /dev/null +++ b/drivers/openstack/openstack_test.go @@ -0,0 +1,29 @@ +package openstack + +import ( + "testing" + + "github.com/docker/machine/libmachine/drivers" + "github.com/stretchr/testify/assert" +) + +func TestSetConfigFromFlags(t *testing.T) { + driver := NewDriver("default", "path") + + checkFlags := &drivers.CheckDriverOptions{ + FlagsValues: map[string]interface{}{ + "openstack-auth-url": "http://url", + "openstack-username": "user", + "openstack-password": "pwd", + "openstack-tenant-id": "ID", + "openstack-flavor-id": "ID", + "openstack-image-id": "ID", + }, + CreateFlags: driver.GetCreateFlags(), + } + + err := driver.SetConfigFromFlags(checkFlags) + + assert.NoError(t, err) + assert.Empty(t, checkFlags.InvalidFlags) +} diff --git a/drivers/rackspace/rackspace_test.go b/drivers/rackspace/rackspace_test.go new file mode 100644 index 0000000000..79241538e4 --- /dev/null +++ b/drivers/rackspace/rackspace_test.go @@ -0,0 +1,27 @@ +package rackspace + +import ( + "testing" + + "github.com/docker/machine/libmachine/drivers" + "github.com/stretchr/testify/assert" +) + +func TestSetConfigFromFlags(t *testing.T) { + driver := NewDriver("default", "path") + + checkFlags := &drivers.CheckDriverOptions{ + FlagsValues: map[string]interface{}{ + "rackspace-region": "REGION", + "rackspace-username": "user", + "rackspace-api-key": "KEY", + "rackspace-endpoint-type": "publicURL", + }, + CreateFlags: driver.GetCreateFlags(), + } + + err := driver.SetConfigFromFlags(checkFlags) + + assert.NoError(t, err) + assert.Empty(t, checkFlags.InvalidFlags) +} diff --git a/drivers/softlayer/driver_test.go b/drivers/softlayer/driver_test.go index 8875397662..46b4be10ea 100644 --- a/drivers/softlayer/driver_test.go +++ b/drivers/softlayer/driver_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/docker/machine/commands/mcndirs" + "github.com/docker/machine/libmachine/drivers" "github.com/stretchr/testify/assert" ) @@ -101,3 +102,23 @@ func TestHostnameDefaultsToMachineName(t *testing.T) { assert.Equal(t, machineTestName, d.deviceConfig.Hostname) } } + +func TestSetConfigFromFlags(t *testing.T) { + driver := NewDriver("default", "path") + + checkFlags := &drivers.CheckDriverOptions{ + FlagsValues: map[string]interface{}{ + "softlayer-api-key": "KEY", + "softlayer-user": "user", + "softlayer-api-endpoint": "ENDPOINT", + "softlayer-domain": "DOMAIN", + "softlayer-region": "REGION", + }, + CreateFlags: driver.GetCreateFlags(), + } + + err := driver.SetConfigFromFlags(checkFlags) + + assert.NoError(t, err) + assert.Empty(t, checkFlags.InvalidFlags) +} diff --git a/drivers/virtualbox/virtualbox_test.go b/drivers/virtualbox/virtualbox_test.go index eb42fa0079..d580b7b49d 100644 --- a/drivers/virtualbox/virtualbox_test.go +++ b/drivers/virtualbox/virtualbox_test.go @@ -6,6 +6,7 @@ import ( "strings" "testing" + "github.com/docker/machine/libmachine/drivers" "github.com/docker/machine/libmachine/state" "github.com/stretchr/testify/assert" ) @@ -180,3 +181,17 @@ func TestInvalidNetworkIpCIDR(t *testing.T) { func newTestDriver(name string) *Driver { return NewDriver(name, "") } + +func TestSetConfigFromFlags(t *testing.T) { + driver := NewDriver("default", "path") + + checkFlags := &drivers.CheckDriverOptions{ + FlagsValues: map[string]interface{}{}, + CreateFlags: driver.GetCreateFlags(), + } + + err := driver.SetConfigFromFlags(checkFlags) + + assert.NoError(t, err) + assert.Empty(t, checkFlags.InvalidFlags) +} diff --git a/drivers/vmwarefusion/fusion_test.go b/drivers/vmwarefusion/fusion_test.go new file mode 100644 index 0000000000..da58950fab --- /dev/null +++ b/drivers/vmwarefusion/fusion_test.go @@ -0,0 +1,22 @@ +package vmwarefusion + +import ( + "testing" + + "github.com/docker/machine/libmachine/drivers" + "github.com/stretchr/testify/assert" +) + +func TestSetConfigFromFlags(t *testing.T) { + driver := NewDriver("default", "path") + + checkFlags := &drivers.CheckDriverOptions{ + FlagsValues: map[string]interface{}{}, + CreateFlags: driver.GetCreateFlags(), + } + + err := driver.SetConfigFromFlags(checkFlags) + + assert.NoError(t, err) + assert.Empty(t, checkFlags.InvalidFlags) +} diff --git a/drivers/vmwarevcloudair/vcloudlair_test.go b/drivers/vmwarevcloudair/vcloudlair_test.go new file mode 100644 index 0000000000..e92ee55809 --- /dev/null +++ b/drivers/vmwarevcloudair/vcloudlair_test.go @@ -0,0 +1,27 @@ +package vmwarevcloudair + +import ( + "testing" + + "github.com/docker/machine/libmachine/drivers" + "github.com/stretchr/testify/assert" +) + +func TestSetConfigFromFlags(t *testing.T) { + driver := NewDriver("default", "path") + + checkFlags := &drivers.CheckDriverOptions{ + FlagsValues: map[string]interface{}{ + "vmwarevcloudair-username": "root", + "vmwarevcloudair-password": "pwd", + "vmwarevcloudair-vdcid": "ID", + "vmwarevcloudair-publicip": "IP", + }, + CreateFlags: driver.GetCreateFlags(), + } + + err := driver.SetConfigFromFlags(checkFlags) + + assert.NoError(t, err) + assert.Empty(t, checkFlags.InvalidFlags) +} diff --git a/drivers/vmwarevsphere/vsphere_test.go b/drivers/vmwarevsphere/vsphere_test.go new file mode 100644 index 0000000000..d3d7af3aeb --- /dev/null +++ b/drivers/vmwarevsphere/vsphere_test.go @@ -0,0 +1,22 @@ +package vmwarevsphere + +import ( + "testing" + + "github.com/docker/machine/libmachine/drivers" + "github.com/stretchr/testify/assert" +) + +func TestSetConfigFromFlags(t *testing.T) { + driver := NewDriver("default", "path") + + checkFlags := &drivers.CheckDriverOptions{ + FlagsValues: map[string]interface{}{}, + CreateFlags: driver.GetCreateFlags(), + } + + err := driver.SetConfigFromFlags(checkFlags) + + assert.NoError(t, err) + assert.Empty(t, checkFlags.InvalidFlags) +} diff --git a/libmachine/drivers/check.go b/libmachine/drivers/check.go new file mode 100644 index 0000000000..7f027817d3 --- /dev/null +++ b/libmachine/drivers/check.go @@ -0,0 +1,78 @@ +package drivers + +import "github.com/docker/machine/libmachine/mcnflag" + +// CheckDriverOptions implements DriverOptions and is used to validate flag parsing +type CheckDriverOptions struct { + FlagsValues map[string]interface{} + CreateFlags []mcnflag.Flag + InvalidFlags []string +} + +func (o *CheckDriverOptions) String(key string) string { + for _, flag := range o.CreateFlags { + if flag.String() == key { + _, ok := flag.(mcnflag.StringFlag) + if !ok { + o.InvalidFlags = append(o.InvalidFlags, flag.String()) + } + } + } + + value, present := o.FlagsValues[key].(string) + if present { + return value + } + return "" +} + +func (o *CheckDriverOptions) StringSlice(key string) []string { + for _, flag := range o.CreateFlags { + if flag.String() == key { + _, ok := flag.(mcnflag.StringSliceFlag) + if !ok { + o.InvalidFlags = append(o.InvalidFlags, flag.String()) + } + } + } + + value, present := o.FlagsValues[key].([]string) + if present { + return value + } + return nil +} + +func (o *CheckDriverOptions) Int(key string) int { + for _, flag := range o.CreateFlags { + if flag.String() == key { + _, ok := flag.(mcnflag.IntFlag) + if !ok { + o.InvalidFlags = append(o.InvalidFlags, flag.String()) + } + } + } + + value, present := o.FlagsValues[key].(int) + if present { + return value + } + return 42 +} + +func (o *CheckDriverOptions) Bool(key string) bool { + for _, flag := range o.CreateFlags { + if flag.String() == key { + _, ok := flag.(mcnflag.BoolFlag) + if !ok { + o.InvalidFlags = append(o.InvalidFlags, flag.String()) + } + } + } + + value, present := o.FlagsValues[key].(bool) + if present { + return value + } + return false +}