github.com/atsaki/terraform@v0.4.3-0.20150919165407-25bba5967654/builtin/providers/google/operation.go (about) 1 package google 2 3 import ( 4 "bytes" 5 "fmt" 6 "log" 7 8 "github.com/hashicorp/terraform/helper/resource" 9 "google.golang.org/api/compute/v1" 10 ) 11 12 // OperationWaitType is an enum specifying what type of operation 13 // we're waiting on. 14 type OperationWaitType byte 15 16 const ( 17 OperationWaitInvalid OperationWaitType = iota 18 OperationWaitGlobal 19 OperationWaitRegion 20 OperationWaitZone 21 ) 22 23 type OperationWaiter struct { 24 Service *compute.Service 25 Op *compute.Operation 26 Project string 27 Region string 28 Type OperationWaitType 29 Zone string 30 } 31 32 func (w *OperationWaiter) RefreshFunc() resource.StateRefreshFunc { 33 return func() (interface{}, string, error) { 34 var op *compute.Operation 35 var err error 36 37 switch w.Type { 38 case OperationWaitGlobal: 39 op, err = w.Service.GlobalOperations.Get( 40 w.Project, w.Op.Name).Do() 41 case OperationWaitRegion: 42 op, err = w.Service.RegionOperations.Get( 43 w.Project, w.Region, w.Op.Name).Do() 44 case OperationWaitZone: 45 op, err = w.Service.ZoneOperations.Get( 46 w.Project, w.Zone, w.Op.Name).Do() 47 default: 48 return nil, "bad-type", fmt.Errorf( 49 "Invalid wait type: %#v", w.Type) 50 } 51 52 if err != nil { 53 return nil, "", err 54 } 55 56 log.Printf("[DEBUG] Got %q when asking for operation %q", op.Status, w.Op.Name) 57 58 return op, op.Status, nil 59 } 60 } 61 62 func (w *OperationWaiter) Conf() *resource.StateChangeConf { 63 return &resource.StateChangeConf{ 64 Pending: []string{"PENDING", "RUNNING"}, 65 Target: "DONE", 66 Refresh: w.RefreshFunc(), 67 } 68 } 69 70 // OperationError wraps compute.OperationError and implements the 71 // error interface so it can be returned. 72 type OperationError compute.OperationError 73 74 func (e OperationError) Error() string { 75 var buf bytes.Buffer 76 77 for _, err := range e.Errors { 78 buf.WriteString(err.Message + "\n") 79 } 80 81 return buf.String() 82 }