diff --git a/drivers/google/google.go b/drivers/google/google.go index 0d1837a5..8de00670 100644 --- a/drivers/google/google.go +++ b/drivers/google/google.go @@ -342,6 +342,11 @@ func (d *Driver) Remove() error { return c.deleteDisk() } +// Restart restarts a machine which is known to be running. func (d *Driver) Restart() error { - return nil + if err := d.Stop(); err != nil { + return err + } + + return d.Start() } diff --git a/drivers/virtualbox/virtualbox.go b/drivers/virtualbox/virtualbox.go index fa14a1a9..a0370306 100644 --- a/drivers/virtualbox/virtualbox.go +++ b/drivers/virtualbox/virtualbox.go @@ -500,6 +500,10 @@ func (d *Driver) Start() error { return ErrMustEnableVTX } + 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 @@ -510,6 +514,7 @@ func (d *Driver) Start() error { return err } + var err error d.IPAddress, err = d.GetIP() return err @@ -572,18 +577,16 @@ 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 { - s, err := d.GetState() - if err != nil { + log.Infof("Restarting VM...") + if err := d.vbm("controlvm", d.MachineName, "reset"); err != nil { return err } - if s == state.Running { - if err := d.Stop(); err != nil { - return err - } - } - return d.Start() + d.IPAddress = "" + + return d.waitForIP() } func (d *Driver) Kill() error { diff --git a/libmachine/host/host.go b/libmachine/host/host.go index 7179819c..b9cfb8fa 100644 --- a/libmachine/host/host.go +++ b/libmachine/host/host.go @@ -122,24 +122,15 @@ func (h *Host) Kill() error { } func (h *Host) Restart() error { + if drivers.MachineInState(h.Driver, state.Stopped)() { + return h.Start() + } if drivers.MachineInState(h.Driver, state.Running)() { - if err := h.Stop(); err != nil { - return err - } - - if err := mcnutils.WaitFor(drivers.MachineInState(h.Driver, state.Stopped)); err != nil { + if err := h.Driver.Restart(); err != nil { return err } + return mcnutils.WaitFor(drivers.MachineInState(h.Driver, state.Running)) } - - if err := h.Start(); err != nil { - return err - } - - if err := mcnutils.WaitFor(drivers.MachineInState(h.Driver, state.Running)); err != nil { - return err - } - return nil }