]>
Commit | Line | Data |
---|---|---|
bae9f6d2 JC |
1 | package terraform |
2 | ||
3 | import ( | |
4 | "fmt" | |
5 | ||
6 | "github.com/hashicorp/terraform/dag" | |
7 | ) | |
8 | ||
9 | // ResourceCountTransformer is a GraphTransformer that expands the count | |
10 | // out for a specific resource. | |
11 | // | |
12 | // This assumes that the count is already interpolated. | |
13 | type ResourceCountTransformer struct { | |
14 | Concrete ConcreteResourceNodeFunc | |
15 | ||
16 | Count int | |
17 | Addr *ResourceAddress | |
18 | } | |
19 | ||
20 | func (t *ResourceCountTransformer) Transform(g *Graph) error { | |
21 | // Don't allow the count to be negative | |
22 | if t.Count < 0 { | |
23 | return fmt.Errorf("negative count: %d", t.Count) | |
24 | } | |
25 | ||
26 | // For each count, build and add the node | |
27 | for i := 0; i < t.Count; i++ { | |
28 | // Set the index. If our count is 1 we special case it so that | |
29 | // we handle the "resource.0" and "resource" boundary properly. | |
30 | index := i | |
31 | if t.Count == 1 { | |
32 | index = -1 | |
33 | } | |
34 | ||
35 | // Build the resource address | |
36 | addr := t.Addr.Copy() | |
37 | addr.Index = index | |
38 | ||
39 | // Build the abstract node and the concrete one | |
15c0b25d AP |
40 | abstract := &NodeAbstractResource{ |
41 | Addr: addr, | |
42 | } | |
bae9f6d2 JC |
43 | var node dag.Vertex = abstract |
44 | if f := t.Concrete; f != nil { | |
45 | node = f(abstract) | |
46 | } | |
47 | ||
48 | // Add it to the graph | |
49 | g.Add(node) | |
50 | } | |
51 | ||
52 | return nil | |
53 | } |