github.com/blacked/terraform@v0.6.2-0.20150806163846-669c4ad71586/terraform/eval_refresh.go (about)

     1  package terraform
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  )
     7  
     8  // EvalRefresh is an EvalNode implementation that does a refresh for
     9  // a resource.
    10  type EvalRefresh struct {
    11  	Provider *ResourceProvider
    12  	State    **InstanceState
    13  	Info     *InstanceInfo
    14  	Output   **InstanceState
    15  }
    16  
    17  // TODO: test
    18  func (n *EvalRefresh) Eval(ctx EvalContext) (interface{}, error) {
    19  	provider := *n.Provider
    20  	state := *n.State
    21  
    22  	// If we have no state, we don't do any refreshing
    23  	if state == nil {
    24  		log.Printf("[DEBUG] refresh: %s: no state, not refreshing", n.Info.Id)
    25  		return nil, nil
    26  	}
    27  
    28  	// Call pre-refresh hook
    29  	err := ctx.Hook(func(h Hook) (HookAction, error) {
    30  		return h.PreRefresh(n.Info, state)
    31  	})
    32  	if err != nil {
    33  		return nil, err
    34  	}
    35  
    36  	// Refresh!
    37  	state, err = provider.Refresh(n.Info, state)
    38  	if err != nil {
    39  		return nil, fmt.Errorf("%s: %s", n.Info.Id, err.Error())
    40  	}
    41  
    42  	// Call post-refresh hook
    43  	err = ctx.Hook(func(h Hook) (HookAction, error) {
    44  		return h.PostRefresh(n.Info, state)
    45  	})
    46  	if err != nil {
    47  		return nil, err
    48  	}
    49  
    50  	if n.Output != nil {
    51  		*n.Output = state
    52  	}
    53  
    54  	return nil, nil
    55  }