aboutsummaryrefslogtreecommitdiffhomepage
path: root/vendor/github.com/hashicorp/terraform/terraform/transform_resource_count.go
blob: c70a3c14484ffce26bb3d0f91e379f492230eece (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package terraform

import (
	"github.com/hashicorp/terraform/addrs"
	"github.com/hashicorp/terraform/configs/configschema"
	"github.com/hashicorp/terraform/dag"
	"github.com/zclconf/go-cty/cty"
)

// ResourceCountTransformer is a GraphTransformer that expands the count
// out for a specific resource.
//
// This assumes that the count is already interpolated.
type ResourceCountTransformer struct {
	Concrete ConcreteResourceInstanceNodeFunc
	Schema   *configschema.Block

	// Count is either the number of indexed instances to create, or -1 to
	// indicate that count is not set at all and thus a no-key instance should
	// be created.
	Count   int
	ForEach map[string]cty.Value
	Addr    addrs.AbsResource
}

func (t *ResourceCountTransformer) Transform(g *Graph) error {
	if t.Count < 0 && t.ForEach == nil {
		// Negative count indicates that count is not set at all.
		addr := t.Addr.Instance(addrs.NoKey)

		abstract := NewNodeAbstractResourceInstance(addr)
		abstract.Schema = t.Schema
		var node dag.Vertex = abstract
		if f := t.Concrete; f != nil {
			node = f(abstract)
		}

		g.Add(node)
		return nil
	}

	// Add nodes related to the for_each expression
	for key := range t.ForEach {
		addr := t.Addr.Instance(addrs.StringKey(key))
		abstract := NewNodeAbstractResourceInstance(addr)
		abstract.Schema = t.Schema
		var node dag.Vertex = abstract
		if f := t.Concrete; f != nil {
			node = f(abstract)
		}

		g.Add(node)
	}

	// For each count, build and add the node
	for i := 0; i < t.Count; i++ {
		key := addrs.IntKey(i)
		addr := t.Addr.Instance(key)

		abstract := NewNodeAbstractResourceInstance(addr)
		abstract.Schema = t.Schema
		var node dag.Vertex = abstract
		if f := t.Concrete; f != nil {
			node = f(abstract)
		}

		g.Add(node)
	}

	return nil
}