From bb45f83319bb26bff1382bd2d86293da26b43d5d Mon Sep 17 00:00:00 2001 From: David Gageot Date: Sat, 1 Aug 2015 10:12:20 +0200 Subject: [PATCH] FIX #676 - Support Start/Stop GCE instance Signed-off-by: David Gageot --- drivers/google/compute_util.go | 25 +++++++++++++++++ drivers/google/google.go | 49 ++++++++++++++++++++-------------- 2 files changed, 54 insertions(+), 20 deletions(-) diff --git a/drivers/google/compute_util.go b/drivers/google/compute_util.go index 32fe58e502..563113be9a 100644 --- a/drivers/google/compute_util.go +++ b/drivers/google/compute_util.go @@ -284,10 +284,35 @@ func (c *ComputeUtil) deleteInstance() error { if err != nil { return err } + log.Infof("Waiting for instance to delete.") return c.waitForRegionalOp(op.Name) } +// 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 + } + + log.Infof("Waiting for instance to stop.") + return c.waitForRegionalOp(op.Name) +} + +// 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 + } + + log.Infof("Waiting for instance to start.") + return c.waitForRegionalOp(op.Name) +} + func (c *ComputeUtil) executeCommands(commands []string, ip, sshKeyPath string) error { for _, command := range commands { auth := &ssh.Auth{ diff --git a/drivers/google/google.go b/drivers/google/google.go index cd936014bc..67e5484ca0 100644 --- a/drivers/google/google.go +++ b/drivers/google/google.go @@ -2,6 +2,7 @@ package google import ( "fmt" + "strings" "github.com/codegangsta/cli" "github.com/docker/machine/drivers" @@ -216,32 +217,54 @@ func (d *Driver) GetState() (state.State, error) { return state.None, nil } -// Start creates a GCE instance and attaches it to the existing disk. +// Start starts an existing GCE instance or create an instance with an existing disk. func (d *Driver) Start() error { c, err := newComputeUtil(d) if err != nil { return err } - if err = c.createInstance(d); err != nil { - return err + + instance, err := c.instance() + if err != nil { + if !strings.Contains(err.Error(), "notFound") { + return err + } } + + if instance == nil { + if err = c.createInstance(d); err != nil { + return err + } + } else { + if err := c.startInstance(); err != nil { + return err + } + } + d.IPAddress, err = d.GetIP() return err } -// Stop deletes the GCE instance, but keeps the disk. +// Stop stops an existing GCE instance. func (d *Driver) Stop() error { c, err := newComputeUtil(d) if err != nil { return err } - if err = c.deleteInstance(); err != nil { + + if err := c.stopInstance(); err != nil { return err } + d.IPAddress = "" return nil } +// Kill stops an existing GCE instance. +func (d *Driver) Kill() error { + return d.Stop() +} + // Remove deletes the GCE instance and the disk. func (d *Driver) Remove() error { c, err := newComputeUtil(d) @@ -260,20 +283,6 @@ func (d *Driver) Remove() error { return c.deleteDisk() } -// Restart deletes and recreates the GCE instance, keeping the disk. func (d *Driver) Restart() error { - c, err := newComputeUtil(d) - if err != nil { - return err - } - if err := c.deleteInstance(); err != nil { - return err - } - - return c.createInstance(d) -} - -// Kill deletes the GCE instance, but keeps the disk. -func (d *Driver) Kill() error { - return d.Stop() + return nil }