mirror of
https://github.com/opentofu/opentofu.git
synced 2024-12-26 17:01:04 -06:00
72 lines
1.7 KiB
Go
72 lines
1.7 KiB
Go
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
|
|
}
|