Skip to content

Commit 364f395

Browse files
committed
get enum directly from expander
1 parent b1b712e commit 364f395

File tree

6 files changed

+21
-22
lines changed

6 files changed

+21
-22
lines changed

internal/genconfig/generate_config.go

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -138,18 +138,12 @@ type ResourceListElement struct {
138138
Config cty.Value
139139

140140
Identity cty.Value
141-
}
142-
143-
// UniqueAddr is a unique address for each resource instance
144-
type UniqueAddr struct {
145-
// Addr is the address of the resource instance.
146-
Addr addrs.AbsResourceInstance
147141

148-
// ExpansionEnum is the enumeration of the address during expansion.
142+
// ExpansionEnum is a unique enumeration of the list resource address relative to its expanded siblings.
149143
ExpansionEnum int
150144
}
151145

152-
func GenerateListResourceContents(uniqAddr UniqueAddr,
146+
func GenerateListResourceContents(addr addrs.AbsResourceInstance,
153147
schema *configschema.Block,
154148
idSchema *configschema.Object,
155149
pc addrs.LocalProviderConfig,
@@ -159,8 +153,6 @@ func GenerateListResourceContents(uniqAddr UniqueAddr,
159153
var diags tfdiags.Diagnostics
160154
ret := ImportGroup{}
161155

162-
addr := uniqAddr.Addr
163-
164156
for idx, res := range resources {
165157
// Generate a unique resource name for each instance in the list.
166158
resAddr := addrs.AbsResourceInstance{
@@ -178,7 +170,7 @@ func GenerateListResourceContents(uniqAddr UniqueAddr,
178170
if addr.Resource.Key == addrs.NoKey {
179171
resAddr.Resource.Resource.Name = fmt.Sprintf("%s_%d", addr.Resource.Resource.Name, idx)
180172
} else {
181-
resAddr.Resource.Resource.Name = fmt.Sprintf("%s_%d_%d", addr.Resource.Resource.Name, uniqAddr.ExpansionEnum, idx)
173+
resAddr.Resource.Resource.Name = fmt.Sprintf("%s_%d_%d", addr.Resource.Resource.Name, res.ExpansionEnum, idx)
182174
}
183175

184176
content, gDiags := GenerateResourceContents(resAddr, schema, pc, res.Config, true)

internal/genconfig/generate_config_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -983,7 +983,7 @@ func TestGenerateResourceAndIDContents(t *testing.T) {
983983
}
984984

985985
// Generate content
986-
content, diags := GenerateListResourceContents(UniqueAddr{Addr: instAddr1, ExpansionEnum: 0}, schema, idSchema, pc, listElements)
986+
content, diags := GenerateListResourceContents(instAddr1, schema, idSchema, pc, listElements)
987987
// Check for diagnostics
988988
if diags.HasErrors() {
989989
t.Fatalf("unexpected diagnostics: %s", diags.Err())

internal/instances/expander.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package instances
55

66
import (
77
"fmt"
8+
"slices"
89
"sort"
910
"sync"
1011

@@ -338,6 +339,16 @@ func (e *Expander) ExpandResource(resourceAddr addrs.AbsResource) []addrs.AbsRes
338339
return ret
339340
}
340341

342+
// ResourceExpansionEnum returns the expansion enum for the given resource instance address
343+
// within the sorted list of resource instances belonging to the same resource config within
344+
// the same module instance.
345+
func (e *Expander) ResourceExpansionEnum(resourceAddr addrs.AbsResourceInstance) int {
346+
res := e.ExpandResource(resourceAddr.ContainingResource())
347+
return slices.IndexFunc(res, func(addr addrs.AbsResourceInstance) bool {
348+
return addr.Equal(resourceAddr)
349+
})
350+
}
351+
341352
// UnknownResourceInstances finds a set of patterns that collectively cover
342353
// all of the possible resource instance addresses that could appear for the
343354
// given static resource once all of the intermediate module expansions are

internal/terraform/node_resource_abstract_instance.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,6 @@ type NodeAbstractResourceInstance struct {
5252

5353
// override is set by the graph itself, just before this node executes.
5454
override *configs.Override
55-
56-
// expansionEnum tracks the index of the resource instance within the resource.
57-
// While the index is an enumerated value, it does not represent the evaluation order
58-
// of the instances. It is currently used to generate unique hcl identifiers, because
59-
// for_each keys are not guaranteed to be valid identifiers.
60-
expansionEnum int
6155
}
6256

6357
// NewNodeAbstractResourceInstance creates an abstract resource instance graph

internal/terraform/node_resource_plan_instance.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -938,6 +938,9 @@ func (n *NodePlannableResourceInstance) generateHCLListResourceDef(ctx EvalConte
938938

939939
var listElements []genconfig.ResourceListElement
940940

941+
expander := ctx.InstanceExpander()
942+
enum := expander.ResourceExpansionEnum(addr)
943+
941944
iter := state.ElementIterator()
942945
for iter.Next() {
943946
_, val := iter.Element()
@@ -955,10 +958,10 @@ func (n *NodePlannableResourceInstance) generateHCLListResourceDef(ctx EvalConte
955958
}
956959
idVal := val.GetAttr("identity")
957960

958-
listElements = append(listElements, genconfig.ResourceListElement{Config: config, Identity: idVal})
961+
listElements = append(listElements, genconfig.ResourceListElement{Config: config, Identity: idVal, ExpansionEnum: enum})
959962
}
960963

961-
return genconfig.GenerateListResourceContents(genconfig.UniqueAddr{Addr: addr, ExpansionEnum: n.expansionEnum}, schema.Body, schema.Identity, providerAddr, listElements)
964+
return genconfig.GenerateListResourceContents(addr, schema.Body, schema.Identity, providerAddr, listElements)
962965
}
963966

964967
func (n *NodePlannableResourceInstance) generateResourceConfig(ctx EvalContext, state cty.Value) (cty.Value, tfdiags.Diagnostics) {

internal/terraform/transform_resource_count.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,9 @@ type ResourceCountTransformer struct {
2424
}
2525

2626
func (t *ResourceCountTransformer) Transform(g *Graph) error {
27-
for idx, addr := range t.InstanceAddrs {
27+
for _, addr := range t.InstanceAddrs {
2828
abstract := NewNodeAbstractResourceInstance(addr)
2929
abstract.Schema = t.Schema
30-
abstract.expansionEnum = idx
3130
var node dag.Vertex = abstract
3231
if f := t.Concrete; f != nil {
3332
node = f(abstract)

0 commit comments

Comments
 (0)