github.com/trawler/terraform@v0.10.8-0.20171106022149-4b1c7a1d9b48/terraform/transform_config_flat.go (about)

     1  package terraform
     2  
     3  import (
     4  	"errors"
     5  
     6  	"github.com/hashicorp/terraform/config/module"
     7  	"github.com/hashicorp/terraform/dag"
     8  )
     9  
    10  // FlatConfigTransformer is a GraphTransformer that adds the configuration
    11  // to the graph. The module used to configure this transformer must be
    12  // the root module.
    13  //
    14  // This transform adds the nodes but doesn't connect any of the references.
    15  // The ReferenceTransformer should be used for that.
    16  //
    17  // NOTE: In relation to ConfigTransformer: this is a newer generation config
    18  // transformer. It puts the _entire_ config into the graph (there is no
    19  // "flattening" step as before).
    20  type FlatConfigTransformer struct {
    21  	Concrete ConcreteResourceNodeFunc // What to turn resources into
    22  
    23  	Module *module.Tree
    24  }
    25  
    26  func (t *FlatConfigTransformer) Transform(g *Graph) error {
    27  	// If no module, we do nothing
    28  	if t.Module == nil {
    29  		return nil
    30  	}
    31  
    32  	// If the module is not loaded, that is an error
    33  	if !t.Module.Loaded() {
    34  		return errors.New("module must be loaded")
    35  	}
    36  
    37  	return t.transform(g, t.Module)
    38  }
    39  
    40  func (t *FlatConfigTransformer) transform(g *Graph, m *module.Tree) error {
    41  	// If no module, no problem
    42  	if m == nil {
    43  		return nil
    44  	}
    45  
    46  	// Transform all the children.
    47  	for _, c := range m.Children() {
    48  		if err := t.transform(g, c); err != nil {
    49  			return err
    50  		}
    51  	}
    52  
    53  	// Get the configuration for this module
    54  	config := m.Config()
    55  
    56  	// Write all the resources out
    57  	for _, r := range config.Resources {
    58  		// Grab the address for this resource
    59  		addr, err := parseResourceAddressConfig(r)
    60  		if err != nil {
    61  			return err
    62  		}
    63  		addr.Path = m.Path()
    64  
    65  		// Build the abstract resource. We have the config already so
    66  		// we'll just pre-populate that.
    67  		abstract := &NodeAbstractResource{
    68  			Addr:   addr,
    69  			Config: r,
    70  		}
    71  		var node dag.Vertex = abstract
    72  		if f := t.Concrete; f != nil {
    73  			node = f(abstract)
    74  		}
    75  
    76  		g.Add(node)
    77  	}
    78  
    79  	return nil
    80  }