From bbe76b5a2650e2817b29f0ebb478e706c65c3773 Mon Sep 17 00:00:00 2001 From: David Gageot Date: Wed, 30 Dec 2015 11:44:53 +0100 Subject: [PATCH 1/4] Logs for Stop Signed-off-by: David Gageot --- drivers/amazonec2/amazonec2.go | 1 - drivers/azure/azure.go | 9 --------- drivers/exoscale/exoscale.go | 16 +++------------- drivers/google/compute_util.go | 1 - drivers/openstack/openstack.go | 1 - drivers/virtualbox/virtualbox.go | 1 - drivers/vmwarefusion/fusion_darwin.go | 6 ++---- drivers/vmwarevcloudair/vcloudair.go | 1 - drivers/vmwarevsphere/vsphere.go | 2 +- libmachine/host/host.go | 1 + 10 files changed, 7 insertions(+), 32 deletions(-) diff --git a/drivers/amazonec2/amazonec2.go b/drivers/amazonec2/amazonec2.go index b0f268e6d7..26734ee355 100644 --- a/drivers/amazonec2/amazonec2.go +++ b/drivers/amazonec2/amazonec2.go @@ -630,7 +630,6 @@ func (d *Driver) Stop() error { } func (d *Driver) Remove() error { - if err := d.terminate(); err != nil { return fmt.Errorf("unable to terminate instance: %s", err) } diff --git a/drivers/azure/azure.go b/drivers/azure/azure.go index f898425888..fae0f0255d 100644 --- a/drivers/azure/azure.go +++ b/drivers/azure/azure.go @@ -304,15 +304,6 @@ func (d *Driver) Stop() error { return err } - if vmState, err := d.GetState(); err != nil { - return err - } else if vmState == state.Stopped { - log.Infof("Host is already stopped") - return nil - } - - log.Debugf("stopping %s", d.MachineName) - if err := vmClient.ShutdownRole(d.MachineName, d.MachineName, d.MachineName); err != nil { return err } diff --git a/drivers/exoscale/exoscale.go b/drivers/exoscale/exoscale.go index cdc069f2d6..297c71349f 100644 --- a/drivers/exoscale/exoscale.go +++ b/drivers/exoscale/exoscale.go @@ -343,24 +343,14 @@ func (d *Driver) Start() error { } func (d *Driver) Stop() error { - vmstate, err := d.GetState() - if err != nil { - return err - } - if vmstate == state.Stopped { - log.Infof("Host is already stopped") - return nil - } - client := egoscale.NewClient(d.URL, d.APIKey, d.APISecretKey) + svmresp, err := client.StopVirtualMachine(d.ID) if err != nil { return err } - if err = d.waitForJob(client, svmresp); err != nil { - return err - } - return nil + + return d.waitForJob(client, svmresp) } func (d *Driver) Remove() error { diff --git a/drivers/google/compute_util.go b/drivers/google/compute_util.go index 846b9deae4..729bbffb43 100644 --- a/drivers/google/compute_util.go +++ b/drivers/google/compute_util.go @@ -340,7 +340,6 @@ func (c *ComputeUtil) deleteInstance() error { // stopInstance stops the instance. func (c *ComputeUtil) stopInstance() error { - log.Infof("Stopping instance.") op, err := c.service.Instances.Stop(c.project, c.zone, c.instanceName).Do() if err != nil { return err diff --git a/drivers/openstack/openstack.go b/drivers/openstack/openstack.go index d2dd0d58c9..a74eba18cd 100644 --- a/drivers/openstack/openstack.go +++ b/drivers/openstack/openstack.go @@ -396,7 +396,6 @@ func (d *Driver) Start() error { } func (d *Driver) Stop() error { - log.Debug("Stopping OpenStack instance...", map[string]string{"MachineId": d.MachineId}) if err := d.initCompute(); err != nil { return err } diff --git a/drivers/virtualbox/virtualbox.go b/drivers/virtualbox/virtualbox.go index 15d89e2615..c311a014a2 100644 --- a/drivers/virtualbox/virtualbox.go +++ b/drivers/virtualbox/virtualbox.go @@ -548,7 +548,6 @@ func (d *Driver) Stop() error { break } } - log.Infof("Stopping VM...") d.IPAddress = "" diff --git a/drivers/vmwarefusion/fusion_darwin.go b/drivers/vmwarefusion/fusion_darwin.go index 8d17660ddf..190ab4d432 100644 --- a/drivers/vmwarefusion/fusion_darwin.go +++ b/drivers/vmwarefusion/fusion_darwin.go @@ -408,13 +408,11 @@ func (d *Driver) Start() error { } func (d *Driver) Stop() error { - log.Infof("Gracefully shutting down %s...", d.MachineName) - vmrun("stop", d.vmxPath(), "nogui") - return nil + _, _, err := vmrun("stop", d.vmxPath(), "nogui") + return err } func (d *Driver) Remove() error { - s, _ := d.GetState() if s == state.Running { if err := d.Kill(); err != nil { diff --git a/drivers/vmwarevcloudair/vcloudair.go b/drivers/vmwarevcloudair/vcloudair.go index d90287485e..5a003ac057 100644 --- a/drivers/vmwarevcloudair/vcloudair.go +++ b/drivers/vmwarevcloudair/vcloudair.go @@ -498,7 +498,6 @@ func (d *Driver) Start() error { } func (d *Driver) Stop() error { - p, err := govcloudair.NewClient() if err != nil { return err diff --git a/drivers/vmwarevsphere/vsphere.go b/drivers/vmwarevsphere/vsphere.go index 83f36f34a8..ef51f47acd 100644 --- a/drivers/vmwarevsphere/vsphere.go +++ b/drivers/vmwarevsphere/vsphere.go @@ -597,7 +597,7 @@ func (d *Driver) Stop() error { if err != nil { return err } - log.Infof("Powering off VM...") + if err := vm.ShutdownGuest(ctx); err != nil { return err } diff --git a/libmachine/host/host.go b/libmachine/host/host.go index f2778ac0af..363e79fc13 100644 --- a/libmachine/host/host.go +++ b/libmachine/host/host.go @@ -103,6 +103,7 @@ func (h *Host) Start() error { } func (h *Host) Stop() error { + log.Infof("Stopping %q...", h.Name) if err := h.runActionForState(h.Driver.Stop, state.Stopped); err != nil { return err } From 783d2b124e718cba39390c047c0928c7f3e84d21 Mon Sep 17 00:00:00 2001 From: David Gageot Date: Wed, 30 Dec 2015 11:50:39 +0100 Subject: [PATCH 2/4] Logs for Start Signed-off-by: David Gageot --- drivers/amazonec2/amazonec2.go | 6 +----- drivers/azure/azure.go | 2 -- drivers/exoscale/exoscale.go | 16 +++------------- drivers/google/compute_util.go | 1 - drivers/openstack/openstack.go | 12 +++--------- drivers/softlayer/driver.go | 3 +++ drivers/virtualbox/virtualbox.go | 1 - drivers/vmwarefusion/fusion_darwin.go | 1 - drivers/vmwarevcloudair/vcloudair.go | 2 -- drivers/vmwarevsphere/vsphere.go | 2 +- libmachine/host/host.go | 1 + 11 files changed, 12 insertions(+), 35 deletions(-) diff --git a/drivers/amazonec2/amazonec2.go b/drivers/amazonec2/amazonec2.go index 26734ee355..0e006fc7c1 100644 --- a/drivers/amazonec2/amazonec2.go +++ b/drivers/amazonec2/amazonec2.go @@ -614,11 +614,7 @@ func (d *Driver) Start() error { return err } - if err := d.waitForInstance(); err != nil { - return err - } - - return nil + return d.waitForInstance() } func (d *Driver) Stop() error { diff --git a/drivers/azure/azure.go b/drivers/azure/azure.go index fae0f0255d..b4b05c814a 100644 --- a/drivers/azure/azure.go +++ b/drivers/azure/azure.go @@ -288,8 +288,6 @@ func (d *Driver) Start() error { return nil } - log.Debugf("starting %s", d.MachineName) - if err := vmClient.StartRole(d.MachineName, d.MachineName, d.MachineName); err != nil { return err } diff --git a/drivers/exoscale/exoscale.go b/drivers/exoscale/exoscale.go index 297c71349f..05709982d1 100644 --- a/drivers/exoscale/exoscale.go +++ b/drivers/exoscale/exoscale.go @@ -322,24 +322,14 @@ func (d *Driver) Create() error { } func (d *Driver) Start() error { - vmstate, err := d.GetState() - if err != nil { - return err - } - if vmstate == state.Running || vmstate == state.Starting { - log.Infof("Host is already running or starting") - return nil - } - client := egoscale.NewClient(d.URL, d.APIKey, d.APISecretKey) + svmresp, err := client.StartVirtualMachine(d.ID) if err != nil { return err } - if err = d.waitForJob(client, svmresp); err != nil { - return err - } - return nil + + return d.waitForJob(client, svmresp) } func (d *Driver) Stop() error { diff --git a/drivers/google/compute_util.go b/drivers/google/compute_util.go index 729bbffb43..87a4768d0c 100644 --- a/drivers/google/compute_util.go +++ b/drivers/google/compute_util.go @@ -351,7 +351,6 @@ func (c *ComputeUtil) stopInstance() error { // startInstance starts the instance. func (c *ComputeUtil) startInstance() error { - log.Infof("Starting instance.") op, err := c.service.Instances.Start(c.project, c.zone, c.instanceName).Do() if err != nil { return err diff --git a/drivers/openstack/openstack.go b/drivers/openstack/openstack.go index a74eba18cd..0ecc3471b3 100644 --- a/drivers/openstack/openstack.go +++ b/drivers/openstack/openstack.go @@ -385,25 +385,19 @@ func (d *Driver) Create() error { } func (d *Driver) Start() error { - log.Debug("Starting OpenStack instance...", map[string]string{"MachineId": d.MachineId}) if err := d.initCompute(); err != nil { return err } - if err := d.client.StartInstance(d); err != nil { - return err - } - return nil + + return d.client.StartInstance(d) } func (d *Driver) Stop() error { if err := d.initCompute(); err != nil { return err } - if err := d.client.StopInstance(d); err != nil { - return err - } - return nil + return d.client.StopInstance(d) } func (d *Driver) Remove() error { diff --git a/drivers/softlayer/driver.go b/drivers/softlayer/driver.go index 58a0eea819..57e45311f0 100644 --- a/drivers/softlayer/driver.go +++ b/drivers/softlayer/driver.go @@ -481,12 +481,15 @@ func (d *Driver) Remove() error { return nil } + func (d *Driver) Restart() error { return d.getClient().VirtualGuest().Reboot(d.Id) } + func (d *Driver) Start() error { return d.getClient().VirtualGuest().PowerOn(d.Id) } + func (d *Driver) Stop() error { return d.getClient().VirtualGuest().PowerOff(d.Id) } diff --git a/drivers/virtualbox/virtualbox.go b/drivers/virtualbox/virtualbox.go index c311a014a2..e43c9abbcb 100644 --- a/drivers/virtualbox/virtualbox.go +++ b/drivers/virtualbox/virtualbox.go @@ -481,7 +481,6 @@ func (d *Driver) Start() error { if err := d.vbm("startvm", d.MachineName, "--type", "headless"); err != nil { return err } - log.Infof("Starting VM...") case state.Paused: if err := d.vbm("controlvm", d.MachineName, "resume", "--type", "headless"); err != nil { return err diff --git a/drivers/vmwarefusion/fusion_darwin.go b/drivers/vmwarefusion/fusion_darwin.go index 190ab4d432..99ea5e4a54 100644 --- a/drivers/vmwarefusion/fusion_darwin.go +++ b/drivers/vmwarefusion/fusion_darwin.go @@ -376,7 +376,6 @@ func (d *Driver) Create() error { } func (d *Driver) Start() error { - log.Infof("Starting %s...", d.MachineName) vmrun("start", d.vmxPath(), "nogui") // Do not execute the rest of boot2docker specific configuration, exit here diff --git a/drivers/vmwarevcloudair/vcloudair.go b/drivers/vmwarevcloudair/vcloudair.go index 5a003ac057..25c6092b01 100644 --- a/drivers/vmwarevcloudair/vcloudair.go +++ b/drivers/vmwarevcloudair/vcloudair.go @@ -454,7 +454,6 @@ func (d *Driver) Remove() error { } func (d *Driver) Start() error { - p, err := govcloudair.NewClient() if err != nil { return err @@ -542,7 +541,6 @@ func (d *Driver) Stop() error { } func (d *Driver) Restart() error { - p, err := govcloudair.NewClient() if err != nil { return err diff --git a/drivers/vmwarevsphere/vsphere.go b/drivers/vmwarevsphere/vsphere.go index ef51f47acd..4b5aa8efe2 100644 --- a/drivers/vmwarevsphere/vsphere.go +++ b/drivers/vmwarevsphere/vsphere.go @@ -565,7 +565,7 @@ func (d *Driver) Start() error { if err != nil { return err } - log.Infof("Powering on VM...") + task, err := vm.PowerOn(ctx) if err != nil { return err diff --git a/libmachine/host/host.go b/libmachine/host/host.go index 363e79fc13..8808d0e0d5 100644 --- a/libmachine/host/host.go +++ b/libmachine/host/host.go @@ -94,6 +94,7 @@ func (h *Host) runActionForState(action func() error, desiredState state.State) } func (h *Host) Start() error { + log.Infof("Starting %q...", h.Name) if err := h.runActionForState(h.Driver.Start, state.Running); err != nil { return err } From e9aa75f021b4c6c115c21b7179ee9d65598ad4a6 Mon Sep 17 00:00:00 2001 From: David Gageot Date: Wed, 30 Dec 2015 11:57:37 +0100 Subject: [PATCH 3/4] Logs for Restart Signed-off-by: David Gageot --- drivers/amazonec2/amazonec2.go | 14 +++--- drivers/azure/azure.go | 45 +++++++------------ drivers/digitalocean/digitalocean.go | 10 ++--- drivers/exoscale/exoscale.go | 32 +++++--------- drivers/generic/generic.go | 9 ++-- drivers/google/google.go | 18 ++++---- drivers/openstack/openstack.go | 19 ++++---- drivers/softlayer/driver.go | 8 ++-- drivers/virtualbox/virtualbox.go | 57 ++++++++++++------------ drivers/vmwarefusion/fusion_darwin.go | 11 +++-- drivers/vmwarevcloudair/vcloudair.go | 45 +++---------------- drivers/vmwarevsphere/vsphere.go | 63 ++++++++++++++------------- libmachine/host/host.go | 3 ++ 13 files changed, 138 insertions(+), 196 deletions(-) diff --git a/drivers/amazonec2/amazonec2.go b/drivers/amazonec2/amazonec2.go index 0e006fc7c1..3610f39085 100644 --- a/drivers/amazonec2/amazonec2.go +++ b/drivers/amazonec2/amazonec2.go @@ -625,6 +625,13 @@ func (d *Driver) Stop() error { return err } +func (d *Driver) Restart() error { + _, err := d.getClient().RebootInstances(&ec2.RebootInstancesInput{ + InstanceIds: []*string{&d.InstanceId}, + }) + return err +} + func (d *Driver) Remove() error { if err := d.terminate(); err != nil { return fmt.Errorf("unable to terminate instance: %s", err) @@ -638,13 +645,6 @@ func (d *Driver) Remove() error { return nil } -func (d *Driver) Restart() error { - _, err := d.getClient().RebootInstances(&ec2.RebootInstancesInput{ - InstanceIds: []*string{&d.InstanceId}, - }) - return err -} - func (d *Driver) Kill() error { _, err := d.getClient().StopInstances(&ec2.StopInstancesInput{ InstanceIds: []*string{&d.InstanceId}, diff --git a/drivers/azure/azure.go b/drivers/azure/azure.go index b4b05c814a..e89a937242 100644 --- a/drivers/azure/azure.go +++ b/drivers/azure/azure.go @@ -13,7 +13,6 @@ import ( "github.com/docker/machine/libmachine/drivers" "github.com/docker/machine/libmachine/log" "github.com/docker/machine/libmachine/mcnflag" - "github.com/docker/machine/libmachine/mcnutils" "github.com/docker/machine/libmachine/ssh" "github.com/docker/machine/libmachine/state" ) @@ -310,42 +309,35 @@ func (d *Driver) Stop() error { return nil } +func (d *Driver) Restart() error { + err := d.setUserSubscription() + if err != nil { + return err + } + + if err := vmClient.RestartRole(d.MachineName, d.MachineName, d.MachineName); err != nil { + return err + } + + var err error + d.IPAddress, err = d.GetIP() + return err +} + func (d *Driver) Remove() error { if err := d.setUserSubscription(); err != nil { return err } + if available, _, err := vmClient.CheckHostedServiceNameAvailability(d.MachineName); err != nil { return err } else if available { return nil } - log.Debugf("removing %s", d.MachineName) - return vmClient.DeleteHostedService(d.MachineName) } -func (d *Driver) Restart() error { - err := d.setUserSubscription() - if err != nil { - return err - } - if vmState, err := d.GetState(); err != nil { - return err - } else if vmState == state.Stopped { - return errors.New("Host is already stopped, use start command to run it") - } - - log.Debugf("restarting %s", d.MachineName) - - if err := vmClient.RestartRole(d.MachineName, d.MachineName, d.MachineName); err != nil { - return err - } - - d.IPAddress, err = d.GetIP() - return err -} - func (d *Driver) Kill() error { if err := d.setUserSubscription(); err != nil { return err @@ -368,11 +360,6 @@ func (d *Driver) Kill() error { return nil } -func generateVMName() string { - randomID := mcnutils.TruncateID(mcnutils.GenerateRandomID()) - return fmt.Sprintf("docker-host-%s", randomID) -} - func (d *Driver) setUserSubscription() error { if d.PublishSettingsFilePath != "" { return azure.ImportPublishSettingsFile(d.PublishSettingsFilePath) diff --git a/drivers/digitalocean/digitalocean.go b/drivers/digitalocean/digitalocean.go index eeb66b3123..0586505c15 100644 --- a/drivers/digitalocean/digitalocean.go +++ b/drivers/digitalocean/digitalocean.go @@ -290,6 +290,11 @@ func (d *Driver) Stop() error { return err } +func (d *Driver) Restart() error { + _, _, err := d.getClient().DropletActions.Reboot(d.DropletID) + return err +} + func (d *Driver) Remove() error { client := d.getClient() if resp, err := client.Keys.DeleteByID(d.SSHKeyID); err != nil { @@ -309,11 +314,6 @@ func (d *Driver) Remove() error { return nil } -func (d *Driver) Restart() error { - _, _, err := d.getClient().DropletActions.Reboot(d.DropletID) - return err -} - func (d *Driver) Kill() error { _, _, err := d.getClient().DropletActions.PowerOff(d.DropletID) return err diff --git a/drivers/exoscale/exoscale.go b/drivers/exoscale/exoscale.go index 05709982d1..eb397d7cb7 100644 --- a/drivers/exoscale/exoscale.go +++ b/drivers/exoscale/exoscale.go @@ -343,6 +343,17 @@ func (d *Driver) Stop() error { return d.waitForJob(client, svmresp) } +func (d *Driver) Restart() error { + client := egoscale.NewClient(d.URL, d.APIKey, d.APISecretKey) + + svmresp, err := client.RebootVirtualMachine(d.ID) + if err != nil { + return err + } + + return d.waitForJob(client, svmresp) +} + func (d *Driver) Remove() error { client := egoscale.NewClient(d.URL, d.APIKey, d.APISecretKey) @@ -362,27 +373,6 @@ func (d *Driver) Remove() error { return nil } -func (d *Driver) Restart() error { - vmstate, err := d.GetState() - if err != nil { - return err - } - if vmstate == state.Stopped { - return fmt.Errorf("Host is stopped, use start command to start it") - } - - client := egoscale.NewClient(d.URL, d.APIKey, d.APISecretKey) - svmresp, err := client.RebootVirtualMachine(d.ID) - if err != nil { - return err - } - if err = d.waitForJob(client, svmresp); err != nil { - return err - } - - return nil -} - func (d *Driver) Kill() error { return d.Stop() } diff --git a/drivers/generic/generic.go b/drivers/generic/generic.go index 7bfd27b91a..9532827716 100644 --- a/drivers/generic/generic.go +++ b/drivers/generic/generic.go @@ -159,16 +159,15 @@ func (d *Driver) Stop() error { return errors.New("generic driver does not support stop") } -func (d *Driver) Remove() error { - return nil -} - func (d *Driver) Restart() error { - log.Debug("Restarting...") _, err := drivers.RunSSHCommandFromDriver(d, "sudo shutdown -r now") return err } +func (d *Driver) Remove() error { + return nil +} + func (d *Driver) Kill() error { return errors.New("generic driver does not support kill") } diff --git a/drivers/google/google.go b/drivers/google/google.go index 8de00670f2..005994ab59 100644 --- a/drivers/google/google.go +++ b/drivers/google/google.go @@ -318,6 +318,15 @@ func (d *Driver) Stop() error { return nil } +// Restart restarts a machine which is known to be running. +func (d *Driver) Restart() error { + if err := d.Stop(); err != nil { + return err + } + + return d.Start() +} + // Kill stops an existing GCE instance. func (d *Driver) Kill() error { return d.Stop() @@ -341,12 +350,3 @@ func (d *Driver) Remove() error { } return c.deleteDisk() } - -// Restart restarts a machine which is known to be running. -func (d *Driver) Restart() error { - if err := d.Stop(); err != nil { - return err - } - - return d.Start() -} diff --git a/drivers/openstack/openstack.go b/drivers/openstack/openstack.go index 0ecc3471b3..b4140bba3f 100644 --- a/drivers/openstack/openstack.go +++ b/drivers/openstack/openstack.go @@ -400,6 +400,14 @@ func (d *Driver) Stop() error { return d.client.StopInstance(d) } +func (d *Driver) Restart() error { + if err := d.initCompute(); err != nil { + return err + } + + return d.client.RestartInstance(d) +} + func (d *Driver) Remove() error { log.Debug("deleting instance...", map[string]string{"MachineId": d.MachineId}) log.Info("Deleting OpenStack instance...") @@ -417,17 +425,6 @@ func (d *Driver) Remove() error { return nil } -func (d *Driver) Restart() error { - log.Info("Restarting OpenStack instance...", map[string]string{"MachineId": d.MachineId}) - if err := d.initCompute(); err != nil { - return err - } - if err := d.client.RestartInstance(d); err != nil { - return err - } - return nil -} - func (d *Driver) Kill() error { return d.Stop() } diff --git a/drivers/softlayer/driver.go b/drivers/softlayer/driver.go index 57e45311f0..8ab7972367 100644 --- a/drivers/softlayer/driver.go +++ b/drivers/softlayer/driver.go @@ -482,10 +482,6 @@ func (d *Driver) Remove() error { return nil } -func (d *Driver) Restart() error { - return d.getClient().VirtualGuest().Reboot(d.Id) -} - func (d *Driver) Start() error { return d.getClient().VirtualGuest().PowerOn(d.Id) } @@ -493,3 +489,7 @@ func (d *Driver) Start() error { func (d *Driver) Stop() error { return d.getClient().VirtualGuest().PowerOff(d.Id) } + +func (d *Driver) Restart() error { + return d.getClient().VirtualGuest().Reboot(d.Id) +} diff --git a/drivers/virtualbox/virtualbox.go b/drivers/virtualbox/virtualbox.go index e43c9abbcb..c8bad6067f 100644 --- a/drivers/virtualbox/virtualbox.go +++ b/drivers/virtualbox/virtualbox.go @@ -503,23 +503,6 @@ func (d *Driver) Start() error { return d.waitForIP() } -func (d *Driver) waitForIP() error { - // Wait for SSH over NAT to be available before returning to user - if err := drivers.WaitForSSH(d); err != nil { - return err - } - - // Bail if we don't get an IP from DHCP after a given number of seconds. - if err := mcnutils.WaitForSpecific(d.hostOnlyIPAvailable, 5, 4*time.Second); err != nil { - return err - } - - var err error - d.IPAddress, err = d.GetIP() - - return err -} - func (d *Driver) Stop() error { currentState, err := d.GetState() if err != nil { @@ -553,6 +536,34 @@ func (d *Driver) Stop() error { return nil } +// Restart restarts a machine which is known to be running. +func (d *Driver) Restart() error { + if err := d.vbm("controlvm", d.MachineName, "reset"); err != nil { + return err + } + + d.IPAddress = "" + + return d.waitForIP() +} + +func (d *Driver) waitForIP() error { + // Wait for SSH over NAT to be available before returning to user + if err := drivers.WaitForSSH(d); err != nil { + return err + } + + // Bail if we don't get an IP from DHCP after a given number of seconds. + if err := mcnutils.WaitForSpecific(d.hostOnlyIPAvailable, 5, 4*time.Second); err != nil { + return err + } + + var err error + d.IPAddress, err = d.GetIP() + + return err +} + func (d *Driver) Remove() error { s, err := d.GetState() if err != nil { @@ -576,18 +587,6 @@ func (d *Driver) Remove() error { return d.vbm("unregistervm", "--delete", d.MachineName) } -// Restart restarts a machine which is known to be running. -func (d *Driver) Restart() error { - log.Infof("Restarting VM...") - if err := d.vbm("controlvm", d.MachineName, "reset"); err != nil { - return err - } - - d.IPAddress = "" - - return d.waitForIP() -} - func (d *Driver) Kill() error { return d.vbm("controlvm", d.MachineName, "poweroff") } diff --git a/drivers/vmwarefusion/fusion_darwin.go b/drivers/vmwarefusion/fusion_darwin.go index 99ea5e4a54..e6970baff8 100644 --- a/drivers/vmwarefusion/fusion_darwin.go +++ b/drivers/vmwarefusion/fusion_darwin.go @@ -411,6 +411,11 @@ func (d *Driver) Stop() error { return err } +func (d *Driver) Restart() error { + _, _, err := vmrun("reset", d.vmxPath(), "nogui") + return err +} + func (d *Driver) Remove() error { s, _ := d.GetState() if s == state.Running { @@ -423,12 +428,6 @@ func (d *Driver) Remove() error { return nil } -func (d *Driver) Restart() error { - log.Infof("Gracefully restarting %s...", d.MachineName) - vmrun("reset", d.vmxPath(), "nogui") - return nil -} - func (d *Driver) Kill() error { log.Infof("Forcibly halting %s...", d.MachineName) vmrun("stop", d.vmxPath(), "hard nogui") diff --git a/drivers/vmwarevcloudair/vcloudair.go b/drivers/vmwarevcloudair/vcloudair.go index 25c6092b01..6489be1478 100644 --- a/drivers/vmwarevcloudair/vcloudair.go +++ b/drivers/vmwarevcloudair/vcloudair.go @@ -206,7 +206,6 @@ func (d *Driver) GetIP() (string, error) { } func (d *Driver) GetState() (state.State, error) { - p, err := govcloudair.NewClient() if err != nil { return state.Error, err @@ -240,11 +239,9 @@ func (d *Driver) GetState() (state.State, error) { return state.Stopped, nil } return state.None, nil - } func (d *Driver) Create() error { - key, err := d.createSSHKey() if err != nil { return err @@ -514,21 +511,12 @@ func (d *Driver) Stop() error { return err } - status, err := vapp.GetStatus() + task, err := vapp.Shutdown() if err != nil { return err } - - if status == "POWERED_ON" { - log.Infof("Shutting down %s...", d.MachineName) - task, err := vapp.Shutdown() - if err != nil { - return err - } - if err = task.WaitTaskCompletion(); err != nil { - return err - } - + if err = task.WaitTaskCompletion(); err != nil { + return err } if err = p.Disconnect(); err != nil { @@ -558,33 +546,12 @@ func (d *Driver) Restart() error { return err } - status, err := vapp.GetStatus() + task, err := vapp.Reset() if err != nil { return err } - - if status == "POWERED_ON" { - // If it's powered on, restart the machine - log.Infof("Restarting %s...", d.MachineName) - task, err := vapp.Reset() - if err != nil { - return err - } - if err = task.WaitTaskCompletion(); err != nil { - return err - } - - } else { - // If it's not powered on, start it. - log.Infof("Docker host %s is powered off, powering it back on...", d.MachineName) - task, err := vapp.PowerOn() - if err != nil { - return err - } - if err = task.WaitTaskCompletion(); err != nil { - return err - } - + if err = task.WaitTaskCompletion(); err != nil { + return err } if err = p.Disconnect(); err != nil { diff --git a/drivers/vmwarevsphere/vsphere.go b/drivers/vmwarevsphere/vsphere.go index 4b5aa8efe2..dbd5b34093 100644 --- a/drivers/vmwarevsphere/vsphere.go +++ b/drivers/vmwarevsphere/vsphere.go @@ -607,6 +607,38 @@ func (d *Driver) Stop() error { return nil } +func (d *Driver) Restart() error { + if err := d.Stop(); err != nil { + return err + } + + // Check for 120 seconds for the machine to stop + for i := 1; i <= 60; i++ { + machineState, err := d.GetState() + if err != nil { + return err + } + if machineState == state.Running { + log.Debugf("Not there yet %d/%d", i, 60) + time.Sleep(2 * time.Second) + continue + } + if machineState == state.Stopped { + break + } + } + + machineState, err := d.GetState() + // If the VM is still running after 120 seconds just kill it. + if machineState == state.Running { + if err = d.Kill(); err != nil { + return fmt.Errorf("can't stop VM: %s", err) + } + } + + return d.Start() +} + func (d *Driver) Remove() error { machineState, err := d.GetState() if err != nil { @@ -672,37 +704,6 @@ func (d *Driver) Remove() error { return nil } -func (d *Driver) Restart() error { - if err := d.Stop(); err != nil { - return err - } - // Check for 120 seconds for the machine to stop - for i := 1; i <= 60; i++ { - machineState, err := d.GetState() - if err != nil { - return err - } - if machineState == state.Running { - log.Debugf("Not there yet %d/%d", i, 60) - time.Sleep(2 * time.Second) - continue - } - if machineState == state.Stopped { - break - } - } - - machineState, err := d.GetState() - // If the VM is still running after 120 seconds just kill it. - if machineState == state.Running { - if err = d.Kill(); err != nil { - return fmt.Errorf("can't stop VM: %s", err) - } - } - - return d.Start() -} - func (d *Driver) Kill() error { ctx, cancel := context.WithCancel(context.Background()) defer cancel() diff --git a/libmachine/host/host.go b/libmachine/host/host.go index 8808d0e0d5..2003e03cc4 100644 --- a/libmachine/host/host.go +++ b/libmachine/host/host.go @@ -123,15 +123,18 @@ func (h *Host) Kill() error { } func (h *Host) Restart() error { + log.Infof("Restarting %q...", h.Name) if drivers.MachineInState(h.Driver, state.Stopped)() { return h.Start() } + if drivers.MachineInState(h.Driver, state.Running)() { if err := h.Driver.Restart(); err != nil { return err } return mcnutils.WaitFor(drivers.MachineInState(h.Driver, state.Running)) } + return nil } From 855de0741a12b3ef1941694ccaebd5f0daa84215 Mon Sep 17 00:00:00 2001 From: David Gageot Date: Wed, 30 Dec 2015 12:05:12 +0100 Subject: [PATCH 4/4] Logs for Kill Signed-off-by: David Gageot --- drivers/amazonec2/amazonec2.go | 16 ++++---- drivers/azure/azure.go | 29 +++----------- drivers/digitalocean/digitalocean.go | 10 ++--- drivers/exoscale/exoscale.go | 8 ++-- drivers/fakedriver/fakedriver.go | 8 ++-- drivers/generic/generic.go | 8 ++-- drivers/openstack/openstack.go | 8 ++-- drivers/softlayer/driver.go | 8 ++-- drivers/virtualbox/virtualbox.go | 8 ++-- drivers/vmwarefusion/fusion_darwin.go | 11 +++-- drivers/vmwarevcloudair/vcloudair.go | 15 ++----- drivers/vmwarevsphere/vsphere.go | 58 +++++++++++++-------------- libmachine/host/host.go | 1 + 13 files changed, 80 insertions(+), 108 deletions(-) diff --git a/drivers/amazonec2/amazonec2.go b/drivers/amazonec2/amazonec2.go index 3610f39085..c215196ddd 100644 --- a/drivers/amazonec2/amazonec2.go +++ b/drivers/amazonec2/amazonec2.go @@ -632,6 +632,14 @@ func (d *Driver) Restart() error { return err } +func (d *Driver) Kill() error { + _, err := d.getClient().StopInstances(&ec2.StopInstancesInput{ + InstanceIds: []*string{&d.InstanceId}, + Force: aws.Bool(true), + }) + return err +} + func (d *Driver) Remove() error { if err := d.terminate(); err != nil { return fmt.Errorf("unable to terminate instance: %s", err) @@ -645,14 +653,6 @@ func (d *Driver) Remove() error { return nil } -func (d *Driver) Kill() error { - _, err := d.getClient().StopInstances(&ec2.StopInstancesInput{ - InstanceIds: []*string{&d.InstanceId}, - Force: aws.Bool(true), - }) - return err -} - func (d *Driver) getClient() *ec2.EC2 { config := aws.NewConfig() config = config.WithRegion(d.Region) diff --git a/drivers/azure/azure.go b/drivers/azure/azure.go index e89a937242..d2c137933b 100644 --- a/drivers/azure/azure.go +++ b/drivers/azure/azure.go @@ -310,8 +310,7 @@ func (d *Driver) Stop() error { } func (d *Driver) Restart() error { - err := d.setUserSubscription() - if err != nil { + if err := d.setUserSubscription(); err != nil { return err } @@ -324,6 +323,10 @@ func (d *Driver) Restart() error { return err } +func (d *Driver) Kill() error { + return d.Stop() +} + func (d *Driver) Remove() error { if err := d.setUserSubscription(); err != nil { return err @@ -338,28 +341,6 @@ func (d *Driver) Remove() error { return vmClient.DeleteHostedService(d.MachineName) } -func (d *Driver) Kill() error { - if err := d.setUserSubscription(); err != nil { - return err - } - - if vmState, err := d.GetState(); err != nil { - return err - } else if vmState == state.Stopped { - log.Infof("Host is already stopped") - return nil - } - - log.Debugf("killing %s", d.MachineName) - - if err := vmClient.ShutdownRole(d.MachineName, d.MachineName, d.MachineName); err != nil { - return err - } - - d.IPAddress = "" - return nil -} - func (d *Driver) setUserSubscription() error { if d.PublishSettingsFilePath != "" { return azure.ImportPublishSettingsFile(d.PublishSettingsFilePath) diff --git a/drivers/digitalocean/digitalocean.go b/drivers/digitalocean/digitalocean.go index 0586505c15..548896319f 100644 --- a/drivers/digitalocean/digitalocean.go +++ b/drivers/digitalocean/digitalocean.go @@ -295,6 +295,11 @@ func (d *Driver) Restart() error { return err } +func (d *Driver) Kill() error { + _, _, err := d.getClient().DropletActions.PowerOff(d.DropletID) + return err +} + func (d *Driver) Remove() error { client := d.getClient() if resp, err := client.Keys.DeleteByID(d.SSHKeyID); err != nil { @@ -314,11 +319,6 @@ func (d *Driver) Remove() error { return nil } -func (d *Driver) Kill() error { - _, _, err := d.getClient().DropletActions.PowerOff(d.DropletID) - return err -} - func (d *Driver) getClient() *godo.Client { token := &oauth2.Token{AccessToken: d.AccessToken} tokenSource := oauth2.StaticTokenSource(token) diff --git a/drivers/exoscale/exoscale.go b/drivers/exoscale/exoscale.go index eb397d7cb7..53297753ce 100644 --- a/drivers/exoscale/exoscale.go +++ b/drivers/exoscale/exoscale.go @@ -354,6 +354,10 @@ func (d *Driver) Restart() error { return d.waitForJob(client, svmresp) } +func (d *Driver) Kill() error { + return d.Stop() +} + func (d *Driver) Remove() error { client := egoscale.NewClient(d.URL, d.APIKey, d.APISecretKey) @@ -373,10 +377,6 @@ func (d *Driver) Remove() error { return nil } -func (d *Driver) Kill() error { - return d.Stop() -} - func (d *Driver) jobIsDone(client *egoscale.Client, jobid string) (bool, error) { resp, err := client.PollAsyncJob(jobid) if err != nil { diff --git a/drivers/fakedriver/fakedriver.go b/drivers/fakedriver/fakedriver.go index 34caa78599..953db88df2 100644 --- a/drivers/fakedriver/fakedriver.go +++ b/drivers/fakedriver/fakedriver.go @@ -80,10 +80,6 @@ func (d *Driver) Create() error { return nil } -func (d *Driver) Remove() error { - return nil -} - func (d *Driver) Start() error { d.MockState = state.Running return nil @@ -104,6 +100,10 @@ func (d *Driver) Kill() error { return nil } +func (d *Driver) Remove() error { + return nil +} + func (d *Driver) Upgrade() error { return nil } diff --git a/drivers/generic/generic.go b/drivers/generic/generic.go index 9532827716..918ea9d45b 100644 --- a/drivers/generic/generic.go +++ b/drivers/generic/generic.go @@ -164,10 +164,10 @@ func (d *Driver) Restart() error { return err } -func (d *Driver) Remove() error { - return nil -} - func (d *Driver) Kill() error { return errors.New("generic driver does not support kill") } + +func (d *Driver) Remove() error { + return nil +} diff --git a/drivers/openstack/openstack.go b/drivers/openstack/openstack.go index b4140bba3f..0cd8d3bac4 100644 --- a/drivers/openstack/openstack.go +++ b/drivers/openstack/openstack.go @@ -408,6 +408,10 @@ func (d *Driver) Restart() error { return d.client.RestartInstance(d) } +func (d *Driver) Kill() error { + return d.Stop() +} + func (d *Driver) Remove() error { log.Debug("deleting instance...", map[string]string{"MachineId": d.MachineId}) log.Info("Deleting OpenStack instance...") @@ -425,10 +429,6 @@ func (d *Driver) Remove() error { return nil } -func (d *Driver) Kill() error { - return d.Stop() -} - const ( errorMandatoryEnvOrOption string = "%s must be specified either using the environment variable %s or the CLI option %s" errorMandatoryOption string = "%s must be specified using the CLI option %s" diff --git a/drivers/softlayer/driver.go b/drivers/softlayer/driver.go index 8ab7972367..d45cc0967d 100644 --- a/drivers/softlayer/driver.go +++ b/drivers/softlayer/driver.go @@ -456,10 +456,6 @@ func (d *Driver) publicSSHKeyPath() string { return d.GetSSHKeyPath() + ".pub" } -func (d *Driver) Kill() error { - return d.getClient().VirtualGuest().PowerOff(d.Id) -} - func (d *Driver) Remove() error { log.Infof("Canceling SoftLayer instance %d...", d.Id) var err error @@ -493,3 +489,7 @@ func (d *Driver) Stop() error { func (d *Driver) Restart() error { return d.getClient().VirtualGuest().Reboot(d.Id) } + +func (d *Driver) Kill() error { + return d.Stop() +} diff --git a/drivers/virtualbox/virtualbox.go b/drivers/virtualbox/virtualbox.go index c8bad6067f..9e89563f73 100644 --- a/drivers/virtualbox/virtualbox.go +++ b/drivers/virtualbox/virtualbox.go @@ -547,6 +547,10 @@ func (d *Driver) Restart() error { return d.waitForIP() } +func (d *Driver) Kill() error { + return d.vbm("controlvm", d.MachineName, "poweroff") +} + func (d *Driver) waitForIP() error { // Wait for SSH over NAT to be available before returning to user if err := drivers.WaitForSSH(d); err != nil { @@ -587,10 +591,6 @@ func (d *Driver) Remove() error { return d.vbm("unregistervm", "--delete", d.MachineName) } -func (d *Driver) Kill() error { - return d.vbm("controlvm", d.MachineName, "poweroff") -} - func (d *Driver) GetState() (state.State, error) { stdout, stderr, err := d.vbmOutErr("showvminfo", d.MachineName, "--machinereadable") diff --git a/drivers/vmwarefusion/fusion_darwin.go b/drivers/vmwarefusion/fusion_darwin.go index e6970baff8..733cd399b4 100644 --- a/drivers/vmwarefusion/fusion_darwin.go +++ b/drivers/vmwarefusion/fusion_darwin.go @@ -416,6 +416,11 @@ func (d *Driver) Restart() error { return err } +func (d *Driver) Kill() error { + _, _, err := vmrun("stop", d.vmxPath(), "hard nogui") + return err +} + func (d *Driver) Remove() error { s, _ := d.GetState() if s == state.Running { @@ -428,12 +433,6 @@ func (d *Driver) Remove() error { return nil } -func (d *Driver) Kill() error { - log.Infof("Forcibly halting %s...", d.MachineName) - vmrun("stop", d.vmxPath(), "hard nogui") - return nil -} - func (d *Driver) Upgrade() error { return fmt.Errorf("VMware Fusion does not currently support the upgrade operation") } diff --git a/drivers/vmwarevcloudair/vcloudair.go b/drivers/vmwarevcloudair/vcloudair.go index 6489be1478..7ff168b8f5 100644 --- a/drivers/vmwarevcloudair/vcloudair.go +++ b/drivers/vmwarevcloudair/vcloudair.go @@ -580,21 +580,12 @@ func (d *Driver) Kill() error { return err } - status, err := vapp.GetStatus() + task, err := vapp.PowerOff() if err != nil { return err } - - if status == "POWERED_ON" { - log.Infof("Stopping %s...", d.MachineName) - task, err := vapp.PowerOff() - if err != nil { - return err - } - if err = task.WaitTaskCompletion(); err != nil { - return err - } - + if err = task.WaitTaskCompletion(); err != nil { + return err } if err = p.Disconnect(); err != nil { diff --git a/drivers/vmwarevsphere/vsphere.go b/drivers/vmwarevsphere/vsphere.go index dbd5b34093..cec6df5077 100644 --- a/drivers/vmwarevsphere/vsphere.go +++ b/drivers/vmwarevsphere/vsphere.go @@ -639,6 +639,35 @@ func (d *Driver) Restart() error { return d.Start() } +func (d *Driver) Kill() error { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + c, err := d.vsphereLogin(ctx) + if err != nil { + return err + } + + vm, err := d.fetchVM(c, ctx, d.MachineName) + if err != nil { + return err + } + + task, err := vm.PowerOff(ctx) + if err != nil { + return err + } + + _, err = task.WaitForResult(ctx, nil) + if err != nil { + return err + } + + d.IPAddress = "" + + return nil +} + func (d *Driver) Remove() error { machineState, err := d.GetState() if err != nil { @@ -704,35 +733,6 @@ func (d *Driver) Remove() error { return nil } -func (d *Driver) Kill() error { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - c, err := d.vsphereLogin(ctx) - if err != nil { - return err - } - - vm, err := d.fetchVM(c, ctx, d.MachineName) - if err != nil { - return err - } - log.Infof("Powering off VM forcibly...") - task, err := vm.PowerOff(ctx) - if err != nil { - return err - } - - _, err = task.WaitForResult(ctx, nil) - if err != nil { - return err - } - - d.IPAddress = "" - - return nil -} - func (d *Driver) Upgrade() error { return fmt.Errorf("upgrade is not supported for vsphere driver at this moment") } diff --git a/libmachine/host/host.go b/libmachine/host/host.go index 2003e03cc4..2319eb5aa8 100644 --- a/libmachine/host/host.go +++ b/libmachine/host/host.go @@ -114,6 +114,7 @@ func (h *Host) Stop() error { } func (h *Host) Kill() error { + log.Infof("Killing %q...", h.Name) if err := h.runActionForState(h.Driver.Kill, state.Stopped); err != nil { return err }