diff --git a/drivers/amazonec2/amazonec2.go b/drivers/amazonec2/amazonec2.go index 26353957ae..75d4ae9b55 100644 --- a/drivers/amazonec2/amazonec2.go +++ b/drivers/amazonec2/amazonec2.go @@ -304,6 +304,10 @@ func (d *Driver) PreCreateCheck() error { return d.checkPrereqs() } +func (d *Driver) PostCreateCheck() error { + return nil +} + func (d *Driver) instanceIpAvailable() bool { ip, err := d.GetIP() if err != nil { diff --git a/drivers/azure/azure.go b/drivers/azure/azure.go index 6e10b051b7..b016df7be3 100644 --- a/drivers/azure/azure.go +++ b/drivers/azure/azure.go @@ -229,6 +229,10 @@ func (d *Driver) PreCreateCheck() error { return nil } +func (d *Driver) PostCreateCheck() error { + return nil +} + func (d *Driver) Create() error { if err := d.setUserSubscription(); err != nil { return err diff --git a/drivers/digitalocean/digitalocean.go b/drivers/digitalocean/digitalocean.go index 634706e58e..0832a8166e 100644 --- a/drivers/digitalocean/digitalocean.go +++ b/drivers/digitalocean/digitalocean.go @@ -180,6 +180,10 @@ func (d *Driver) PreCreateCheck() error { return fmt.Errorf("digitalocean requires a valid region") } +func (d *Driver) PostCreateCheck() error { + return nil +} + func (d *Driver) Create() error { log.Infof("Creating SSH key...") diff --git a/drivers/drivers.go b/drivers/drivers.go index 46ad7eacdb..0989ebc04a 100644 --- a/drivers/drivers.go +++ b/drivers/drivers.go @@ -68,6 +68,9 @@ type Driver interface { // PreCreateCheck allows for pre-create operations to make sure a driver is ready for creation PreCreateCheck() error + // PostCreateCheck allows for checking the creation of driver met the configuration we specified + PostCreateCheck() error + // Remove a host Remove() error diff --git a/drivers/fakedriver/fakedriver.go b/drivers/fakedriver/fakedriver.go index 3a5fc02e0e..f23f0d41f2 100644 --- a/drivers/fakedriver/fakedriver.go +++ b/drivers/fakedriver/fakedriver.go @@ -68,6 +68,10 @@ func (d *FakeDriver) PreCreateCheck() error { return nil } +func (d *FakeDriver) PostCreateCheck() error { + return nil +} + func (d *FakeDriver) Create() error { return nil } diff --git a/drivers/google/google.go b/drivers/google/google.go index 832276d14f..019b3e8ca9 100644 --- a/drivers/google/google.go +++ b/drivers/google/google.go @@ -180,6 +180,10 @@ func (d *Driver) PreCreateCheck() error { return nil } +func (d *Driver) PostCreateCheck() error { + return nil +} + // Create creates a GCE VM instance acting as a docker host. func (d *Driver) Create() error { c, err := newComputeUtil(d) diff --git a/drivers/hyperv/hyperv_windows.go b/drivers/hyperv/hyperv_windows.go index 26bdd95c57..083483c854 100644 --- a/drivers/hyperv/hyperv_windows.go +++ b/drivers/hyperv/hyperv_windows.go @@ -142,6 +142,10 @@ func (d *Driver) PreCreateCheck() error { return nil } +func (d *Driver) PostCreateCheck() error { + return nil +} + func (d *Driver) GetURL() (string, error) { ip, err := d.GetIP() if err != nil { diff --git a/drivers/none/none.go b/drivers/none/none.go index 1b8a275fb3..8e3f6bef0a 100644 --- a/drivers/none/none.go +++ b/drivers/none/none.go @@ -98,6 +98,10 @@ func (d *Driver) PreCreateCheck() error { return nil } +func (d *Driver) PostCreateCheck() error { + return nil +} + func (d *Driver) Remove() error { return nil } diff --git a/drivers/openstack/openstack.go b/drivers/openstack/openstack.go index f433a6a8cd..2a64e2d921 100644 --- a/drivers/openstack/openstack.go +++ b/drivers/openstack/openstack.go @@ -355,6 +355,10 @@ func (d *Driver) PreCreateCheck() error { return nil } +func (d *Driver) PostCreateCheck() error { + return nil +} + func (d *Driver) Create() error { d.KeyPairName = fmt.Sprintf("%s-%s", d.MachineName, utils.GenerateRandomID()) diff --git a/drivers/softlayer/driver.go b/drivers/softlayer/driver.go index 5f5bc3ce65..957e36acdb 100644 --- a/drivers/softlayer/driver.go +++ b/drivers/softlayer/driver.go @@ -307,6 +307,10 @@ func (d *Driver) PreCreateCheck() error { return nil } +func (d *Driver) PostCreateCheck() error { + return nil +} + func (d *Driver) waitForStart() { log.Infof("Waiting for host to become available") for { diff --git a/drivers/virtualbox/virtualbox.go b/drivers/virtualbox/virtualbox.go index d2bbb75a5f..cd2a51b12b 100644 --- a/drivers/virtualbox/virtualbox.go +++ b/drivers/virtualbox/virtualbox.go @@ -158,6 +158,53 @@ func (d *Driver) SetConfigFromFlags(flags drivers.DriverOptions) error { } func (d *Driver) PreCreateCheck() error { + + return nil +} + +func (d *Driver) PostCreateCheck() error { + // check the settings for configuration + log.Infof("Comparing Memory Size ...") + vminfostdout, vminfostderr, vminfoerr := vbmOutErr("showvminfo", d.MachineName, + "--machinereadable") + if vminfoerr != nil { + if reMachineNotFound.FindString(vminfostderr) != "" { + return ErrMachineNotExist + } + return vminfoerr + } + + reMemorySize := regexp.MustCompile(`(?m)^memory=(\w+)`) + realMemorySize := reMemorySize.FindStringSubmatch(vminfostdout) + log.Infof("Real Memory Size: %s", realMemorySize[1]) + memSize, e := strconv.Atoi(realMemorySize[1]) + if e != nil { + return e + } + + if memSize != d.Memory { + log.Warnf("Mismatched Memory Size.") + } + + log.Infof("Comparing Disk Size ...") + hdinfostdout, hdinfostderr, hdinfoerr := vbmOutErr("showhdinfo", d.diskPath()) + if hdinfoerr != nil { + if reMachineNotFound.FindString(hdinfostderr) != "" { + return ErrMachineNotExist + } + return hdinfoerr + } + + reDiskSize := regexp.MustCompile(`(?m)^Capacity:(.*)MBytes`) + realDiskSize := reDiskSize.FindStringSubmatch(hdinfostdout) + log.Infof("Real HD Disk Size: %s", strings.TrimSpace(realDiskSize[1])) + diskSize, e := strconv.Atoi(strings.TrimSpace(realDiskSize[1])) + if e != nil { + return e + } + if diskSize != d.DiskSize { + log.Warnf("Mismatched Disk Size.") + } return nil } diff --git a/drivers/vmwarefusion/fusion_darwin.go b/drivers/vmwarefusion/fusion_darwin.go index 92aaa7b82b..8f197c0563 100644 --- a/drivers/vmwarefusion/fusion_darwin.go +++ b/drivers/vmwarefusion/fusion_darwin.go @@ -195,6 +195,10 @@ func (d *Driver) PreCreateCheck() error { return nil } +func (d *Driver) PostCreateCheck() error { + return nil +} + func (d *Driver) Create() error { var ( diff --git a/drivers/vmwarevcloudair/vcloudair.go b/drivers/vmwarevcloudair/vcloudair.go index 2560cc0510..6639c442f8 100644 --- a/drivers/vmwarevcloudair/vcloudair.go +++ b/drivers/vmwarevcloudair/vcloudair.go @@ -312,6 +312,10 @@ func (d *Driver) PreCreateCheck() error { return nil } +func (d *Driver) PostCreateCheck() error { + return nil +} + func (d *Driver) Create() error { key, err := d.createSSHKey() diff --git a/drivers/vmwarevsphere/vsphere.go b/drivers/vmwarevsphere/vsphere.go index 9e1fda05ed..ba30ebee2c 100644 --- a/drivers/vmwarevsphere/vsphere.go +++ b/drivers/vmwarevsphere/vsphere.go @@ -272,6 +272,10 @@ func (d *Driver) PreCreateCheck() error { return nil } +func (d *Driver) PostCreateCheck() error { + return nil +} + // the current implementation does the following: // 1. check whether the docker directory contains the boot2docker ISO // 2. generate an SSH keypair and bundle it in a tar. diff --git a/libmachine/machine.go b/libmachine/machine.go index c3f71c5ba1..c4b80250e3 100644 --- a/libmachine/machine.go +++ b/libmachine/machine.go @@ -64,6 +64,10 @@ func (m *Machine) Create(name string, driverName string, hostOptions *HostOption return nil, err } + if err := host.Driver.PostCreateCheck(); err != nil { + return nil, err + } + return host, nil }