diff options
Diffstat (limited to 'vendor/github.com/hashicorp/terraform/terraform/graph_builder.go')
-rw-r--r-- | vendor/github.com/hashicorp/terraform/terraform/graph_builder.go | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/vendor/github.com/hashicorp/terraform/terraform/graph_builder.go b/vendor/github.com/hashicorp/terraform/terraform/graph_builder.go new file mode 100644 index 0000000..6374bb9 --- /dev/null +++ b/vendor/github.com/hashicorp/terraform/terraform/graph_builder.go | |||
@@ -0,0 +1,77 @@ | |||
1 | package terraform | ||
2 | |||
3 | import ( | ||
4 | "fmt" | ||
5 | "log" | ||
6 | "strings" | ||
7 | ) | ||
8 | |||
9 | // GraphBuilder is an interface that can be implemented and used with | ||
10 | // Terraform to build the graph that Terraform walks. | ||
11 | type GraphBuilder interface { | ||
12 | // Build builds the graph for the given module path. It is up to | ||
13 | // the interface implementation whether this build should expand | ||
14 | // the graph or not. | ||
15 | Build(path []string) (*Graph, error) | ||
16 | } | ||
17 | |||
18 | // BasicGraphBuilder is a GraphBuilder that builds a graph out of a | ||
19 | // series of transforms and (optionally) validates the graph is a valid | ||
20 | // structure. | ||
21 | type BasicGraphBuilder struct { | ||
22 | Steps []GraphTransformer | ||
23 | Validate bool | ||
24 | // Optional name to add to the graph debug log | ||
25 | Name string | ||
26 | } | ||
27 | |||
28 | func (b *BasicGraphBuilder) Build(path []string) (*Graph, error) { | ||
29 | g := &Graph{Path: path} | ||
30 | |||
31 | debugName := "graph.json" | ||
32 | if b.Name != "" { | ||
33 | debugName = b.Name + "-" + debugName | ||
34 | } | ||
35 | debugBuf := dbug.NewFileWriter(debugName) | ||
36 | g.SetDebugWriter(debugBuf) | ||
37 | defer debugBuf.Close() | ||
38 | |||
39 | for _, step := range b.Steps { | ||
40 | if step == nil { | ||
41 | continue | ||
42 | } | ||
43 | |||
44 | stepName := fmt.Sprintf("%T", step) | ||
45 | dot := strings.LastIndex(stepName, ".") | ||
46 | if dot >= 0 { | ||
47 | stepName = stepName[dot+1:] | ||
48 | } | ||
49 | |||
50 | debugOp := g.DebugOperation(stepName, "") | ||
51 | err := step.Transform(g) | ||
52 | |||
53 | errMsg := "" | ||
54 | if err != nil { | ||
55 | errMsg = err.Error() | ||
56 | } | ||
57 | debugOp.End(errMsg) | ||
58 | |||
59 | log.Printf( | ||
60 | "[TRACE] Graph after step %T:\n\n%s", | ||
61 | step, g.StringWithNodeTypes()) | ||
62 | |||
63 | if err != nil { | ||
64 | return g, err | ||
65 | } | ||
66 | } | ||
67 | |||
68 | // Validate the graph structure | ||
69 | if b.Validate { | ||
70 | if err := g.Validate(); err != nil { | ||
71 | log.Printf("[ERROR] Graph validation failed. Graph:\n\n%s", g.String()) | ||
72 | return nil, err | ||
73 | } | ||
74 | } | ||
75 | |||
76 | return g, nil | ||
77 | } | ||