From 2d25f56ff7f7a85580684f8cfdf5305ef16f3abc Mon Sep 17 00:00:00 2001 From: Vincent Bernat Date: Fri, 29 May 2015 10:14:10 +0200 Subject: [PATCH] exoscale: use the new `utils.WaitForSpecificOrError` function to wait for job to finish Instead of using a custom loop, use the newly introduced `utils.WaitForSpecificOrError` function. Beware that on success, we use the successful response to get the VM object (outside the loop). Signed-off-by: Vincent Bernat --- drivers/exoscale/exoscale.go | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/drivers/exoscale/exoscale.go b/drivers/exoscale/exoscale.go index c190cb1f12..c8987472d9 100644 --- a/drivers/exoscale/exoscale.go +++ b/drivers/exoscale/exoscale.go @@ -13,6 +13,7 @@ import ( "github.com/docker/machine/drivers" "github.com/docker/machine/log" "github.com/docker/machine/state" + "github.com/docker/machine/utils" "github.com/pyr/egoscale/src/egoscale" ) @@ -421,28 +422,24 @@ func (d *Driver) Kill() error { func (d *Driver) waitForVM(client *egoscale.Client, jobid string) (*egoscale.DeployVirtualMachineResponse, error) { log.Infof("Waiting for VM...") - maxRepeats := 60 - i := 0 var resp *egoscale.QueryAsyncJobResultResponse var err error -WaitLoop: - for ; i < maxRepeats; i++ { + if err = utils.WaitForSpecificOrError(func() (bool, error) { resp, err = client.PollAsyncJob(jobid) if err != nil { - return nil, err + return true, err } switch resp.Jobstatus { case 0: // Job is still in progress case 1: // Job has successfully completed - break WaitLoop + return true, nil case 2: // Job has failed to complete - return nil, fmt.Errorf("Operation failed to complete") + return true, fmt.Errorf("Operation failed to complete") default: // Some other code } - time.Sleep(2 * time.Second) - } - if i == maxRepeats { - return nil, fmt.Errorf("Timeout while waiting for VM") + return false, nil + }, 60, 2*time.Second); err != nil { + return nil, err } vm, err := client.AsyncToVirtualMachine(*resp) if err != nil {