github.com/federicobaldo/terraform@v0.6.15-0.20160323222747-b20f680cbf05/terraform/eval_output.go (about)

     1  package terraform
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/hashicorp/terraform/config"
     7  )
     8  
     9  // EvalDeleteOutput is an EvalNode implementation that deletes an output
    10  // from the state.
    11  type EvalDeleteOutput struct {
    12  	Name string
    13  }
    14  
    15  // TODO: test
    16  func (n *EvalDeleteOutput) Eval(ctx EvalContext) (interface{}, error) {
    17  	state, lock := ctx.State()
    18  	if state == nil {
    19  		return nil, nil
    20  	}
    21  
    22  	// Get a write lock so we can access this instance
    23  	lock.Lock()
    24  	defer lock.Unlock()
    25  
    26  	// Look for the module state. If we don't have one, create it.
    27  	mod := state.ModuleByPath(ctx.Path())
    28  	if mod == nil {
    29  		return nil, nil
    30  	}
    31  
    32  	delete(mod.Outputs, n.Name)
    33  
    34  	return nil, nil
    35  }
    36  
    37  // EvalWriteOutput is an EvalNode implementation that writes the output
    38  // for the given name to the current state.
    39  type EvalWriteOutput struct {
    40  	Name  string
    41  	Value *config.RawConfig
    42  }
    43  
    44  // TODO: test
    45  func (n *EvalWriteOutput) Eval(ctx EvalContext) (interface{}, error) {
    46  	cfg, err := ctx.Interpolate(n.Value, nil)
    47  	if err != nil {
    48  		// Ignore it
    49  	}
    50  
    51  	state, lock := ctx.State()
    52  	if state == nil {
    53  		return nil, fmt.Errorf("cannot write state to nil state")
    54  	}
    55  
    56  	// Get a write lock so we can access this instance
    57  	lock.Lock()
    58  	defer lock.Unlock()
    59  
    60  	// Look for the module state. If we don't have one, create it.
    61  	mod := state.ModuleByPath(ctx.Path())
    62  	if mod == nil {
    63  		mod = state.AddModule(ctx.Path())
    64  	}
    65  
    66  	// Get the value from the config
    67  	var valueRaw interface{} = config.UnknownVariableValue
    68  	if cfg != nil {
    69  		var ok bool
    70  		valueRaw, ok = cfg.Get("value")
    71  		if !ok {
    72  			valueRaw = ""
    73  		}
    74  		if cfg.IsComputed("value") {
    75  			valueRaw = config.UnknownVariableValue
    76  		}
    77  	}
    78  
    79  	// If it is a list of values, get the first one
    80  	if list, ok := valueRaw.([]interface{}); ok {
    81  		valueRaw = list[0]
    82  	}
    83  	if _, ok := valueRaw.(string); !ok {
    84  		return nil, fmt.Errorf("output %s is not a string", n.Name)
    85  	}
    86  
    87  	// Write the output
    88  	mod.Outputs[n.Name] = valueRaw.(string)
    89  
    90  	return nil, nil
    91  }