github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/builtin/providers/google/resourcemanager_operation.go (about)

     1  package google
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"time"
     7  
     8  	"github.com/hashicorp/terraform/helper/resource"
     9  	"google.golang.org/api/cloudresourcemanager/v1"
    10  )
    11  
    12  type ResourceManagerOperationWaiter struct {
    13  	Service *cloudresourcemanager.Service
    14  	Op      *cloudresourcemanager.Operation
    15  }
    16  
    17  func (w *ResourceManagerOperationWaiter) RefreshFunc() resource.StateRefreshFunc {
    18  	return func() (interface{}, string, error) {
    19  		op, err := w.Service.Operations.Get(w.Op.Name).Do()
    20  
    21  		if err != nil {
    22  			return nil, "", err
    23  		}
    24  
    25  		log.Printf("[DEBUG] Got %v while polling for operation %s's 'done' status", op.Done, w.Op.Name)
    26  
    27  		return op, fmt.Sprint(op.Done), nil
    28  	}
    29  }
    30  
    31  func (w *ResourceManagerOperationWaiter) Conf() *resource.StateChangeConf {
    32  	return &resource.StateChangeConf{
    33  		Pending: []string{"false"},
    34  		Target:  []string{"true"},
    35  		Refresh: w.RefreshFunc(),
    36  	}
    37  }
    38  
    39  func resourceManagerOperationWait(config *Config, op *cloudresourcemanager.Operation, activity string) error {
    40  	return resourceManagerOperationWaitTime(config, op, activity, 4)
    41  }
    42  
    43  func resourceManagerOperationWaitTime(config *Config, op *cloudresourcemanager.Operation, activity string, timeoutMin int) error {
    44  	w := &ResourceManagerOperationWaiter{
    45  		Service: config.clientResourceManager,
    46  		Op:      op,
    47  	}
    48  
    49  	state := w.Conf()
    50  	state.Delay = 10 * time.Second
    51  	state.Timeout = time.Duration(timeoutMin) * time.Minute
    52  	state.MinTimeout = 2 * time.Second
    53  	opRaw, err := state.WaitForState()
    54  	if err != nil {
    55  		return fmt.Errorf("Error waiting for %s: %s", activity, err)
    56  	}
    57  
    58  	op = opRaw.(*cloudresourcemanager.Operation)
    59  	if op.Error != nil {
    60  		return fmt.Errorf("Error code %v, message: %s", op.Error.Code, op.Error.Message)
    61  	}
    62  
    63  	return nil
    64  }