78 lines
1.6 KiB
Go
78 lines
1.6 KiB
Go
![]() |
/*
|
||
|
* Copyright 2014 VMware, Inc. All rights reserved. Licensed under the Apache v2 License.
|
||
|
*/
|
||
|
|
||
|
package govcd
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"net/url"
|
||
|
"time"
|
||
|
|
||
|
types "github.com/hmrc/vmware-govcd/types/v56"
|
||
|
)
|
||
|
|
||
|
type Task struct {
|
||
|
Task *types.Task
|
||
|
c *Client
|
||
|
}
|
||
|
|
||
|
func NewTask(c *Client) *Task {
|
||
|
return &Task{
|
||
|
Task: new(types.Task),
|
||
|
c: c,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (t *Task) Refresh() error {
|
||
|
|
||
|
if t.Task == nil {
|
||
|
return fmt.Errorf("cannot refresh, Object is empty")
|
||
|
}
|
||
|
|
||
|
u, _ := url.ParseRequestURI(t.Task.HREF)
|
||
|
|
||
|
req := t.c.NewRequest(map[string]string{}, "GET", *u, nil)
|
||
|
|
||
|
resp, err := checkResp(t.c.Http.Do(req))
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("error retrieving task: %s", err)
|
||
|
}
|
||
|
|
||
|
// Empty struct before a new unmarshal, otherwise we end up with duplicate
|
||
|
// elements in slices.
|
||
|
t.Task = &types.Task{}
|
||
|
|
||
|
if err = decodeBody(resp, t.Task); err != nil {
|
||
|
return fmt.Errorf("error decoding task response: %s", err)
|
||
|
}
|
||
|
|
||
|
// The request was successful
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (t *Task) WaitTaskCompletion() error {
|
||
|
|
||
|
if t.Task == nil {
|
||
|
return fmt.Errorf("cannot refresh, Object is empty")
|
||
|
}
|
||
|
|
||
|
for {
|
||
|
err := t.Refresh()
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("error retreiving task: %s", err)
|
||
|
}
|
||
|
|
||
|
// If task is not in a waiting status we're done, check if there's an error and return it.
|
||
|
if t.Task.Status != "queued" && t.Task.Status != "preRunning" && t.Task.Status != "running" {
|
||
|
if t.Task.Status == "error" {
|
||
|
return fmt.Errorf("task did not complete succesfully: %s", t.Task.Description)
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// Sleep for 3 seconds and try again.
|
||
|
time.Sleep(3 * time.Second)
|
||
|
}
|
||
|
}
|