Skip to content

Commit 8c12ea0

Browse files
committed
allow all attributes for identity
1 parent 69247da commit 8c12ea0

File tree

5 files changed

+181
-75
lines changed

5 files changed

+181
-75
lines changed

internal/genconfig/generate_config.go

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ func GenerateResourceContents(addr addrs.AbsResourceInstance,
4545
diags = diags.Append(writeConfigAttributes(addr, &buf, schema.Attributes, 2))
4646
diags = diags.Append(writeConfigBlocks(addr, &buf, schema.BlockTypes, 2))
4747
} else {
48-
diags = diags.Append(writeConfigAttributesFromExisting(addr, &buf, stateVal, schema.Attributes, 2))
48+
diags = diags.Append(writeConfigAttributesFromExisting(addr, &buf, stateVal, schema.Attributes, 2, optionalOrRequiredProcessor))
4949
diags = diags.Append(writeConfigBlocksFromExisting(addr, &buf, stateVal, schema.BlockTypes, 2))
5050
}
5151

@@ -71,7 +71,6 @@ func GenerateListResourceContents(addr addrs.AbsResourceInstance,
7171
idSchema *configschema.Object,
7272
pc addrs.LocalProviderConfig,
7373
stateVal cty.Value,
74-
id cty.Value,
7574
) (string, tfdiags.Diagnostics) {
7675
var buf strings.Builder
7776
var diags tfdiags.Diagnostics
@@ -84,19 +83,9 @@ func GenerateListResourceContents(addr addrs.AbsResourceInstance,
8483
})
8584
return "", diags
8685
}
87-
if !id.CanIterateElements() {
88-
diags = diags.Append(
89-
hcl.Diagnostic{
90-
Severity: hcl.DiagError,
91-
Summary: "Invalid resource instance identity value",
92-
Detail: fmt.Sprintf("Resource instance %s has nil or non-iterable identity value", addr),
93-
})
94-
return "", diags
95-
}
9686

9787
iter := stateVal.ElementIterator()
98-
idIter := id.ElementIterator()
99-
for idx := 0; iter.Next() && idIter.Next(); idx++ {
88+
for idx := 0; iter.Next(); idx++ {
10089
// Generate a unique resource name for each instance in the list.
10190
resAddr := addrs.AbsResourceInstance{
10291
Module: addr.Module,
@@ -110,7 +99,8 @@ func GenerateListResourceContents(addr addrs.AbsResourceInstance,
11099
},
111100
}
112101
_, val := iter.Element()
113-
content, gDiags := GenerateResourceContents(resAddr, schema, pc, val)
102+
stateVal := val.GetAttr("state")
103+
content, gDiags := GenerateResourceContents(resAddr, schema, pc, stateVal)
114104
if gDiags.HasErrors() {
115105
diags = diags.Append(gDiags)
116106
continue
@@ -119,7 +109,7 @@ func GenerateListResourceContents(addr addrs.AbsResourceInstance,
119109
buf.WriteString(content)
120110
buf.WriteString("\n")
121111

122-
_, idVal := idIter.Element()
112+
idVal := val.GetAttr("identity")
123113
importContent, gDiags := generateImportBlock(resAddr, idSchema, pc, idVal)
124114
if gDiags.HasErrors() {
125115
diags = diags.Append(gDiags)
@@ -143,8 +133,8 @@ func generateImportBlock(addr addrs.AbsResourceInstance, idSchema *configschema.
143133
buf.WriteString("import {\n")
144134
buf.WriteString(fmt.Sprintf(" to = %s\n", addr.String()))
145135
buf.WriteString(fmt.Sprintf(" provider = %s\n", pc.StringCompact()))
146-
buf.WriteString(fmt.Sprintf(" identity = {\n"))
147-
diags = diags.Append(writeConfigAttributesFromExisting(addr, &buf, identity, idSchema.Attributes, 3))
136+
buf.WriteString(" identity = {\n")
137+
diags = diags.Append(writeConfigAttributesFromExisting(addr, &buf, identity, idSchema.Attributes, 2, allowAllAttributesProcessor))
148138
buf.WriteString(strings.Repeat(" ", 2))
149139
buf.WriteString("}\n}\n")
150140

@@ -199,7 +189,16 @@ func writeConfigAttributes(addr addrs.AbsResourceInstance, buf *strings.Builder,
199189
return diags
200190
}
201191

202-
func writeConfigAttributesFromExisting(addr addrs.AbsResourceInstance, buf *strings.Builder, stateVal cty.Value, attrs map[string]*configschema.Attribute, indent int) tfdiags.Diagnostics {
192+
func optionalOrRequiredProcessor(attr *configschema.Attribute) bool {
193+
// Exclude computed-only attributes
194+
return attr.Optional || attr.Required
195+
}
196+
197+
func allowAllAttributesProcessor(attr *configschema.Attribute) bool {
198+
return true
199+
}
200+
201+
func writeConfigAttributesFromExisting(addr addrs.AbsResourceInstance, buf *strings.Builder, stateVal cty.Value, attrs map[string]*configschema.Attribute, indent int, processAttr func(*configschema.Attribute) bool) tfdiags.Diagnostics {
203202
var diags tfdiags.Diagnostics
204203
if len(attrs) == 0 {
205204
return diags
@@ -213,8 +212,7 @@ func writeConfigAttributesFromExisting(addr addrs.AbsResourceInstance, buf *stri
213212
continue
214213
}
215214

216-
// Exclude computed-only attributes
217-
if attrS.Required || attrS.Optional {
215+
if processAttr != nil && processAttr(attrS) {
218216
buf.WriteString(strings.Repeat(" ", indent))
219217
buf.WriteString(fmt.Sprintf("%s = ", name))
220218

@@ -414,6 +412,7 @@ func writeConfigBlocksFromExisting(addr addrs.AbsResourceInstance, buf *strings.
414412

415413
func writeConfigNestedTypeAttributeFromExisting(addr addrs.AbsResourceInstance, buf *strings.Builder, name string, schema *configschema.Attribute, stateVal cty.Value, indent int) tfdiags.Diagnostics {
416414
var diags tfdiags.Diagnostics
415+
processor := optionalOrRequiredProcessor
417416

418417
switch schema.NestedType.Nesting {
419418
case configschema.NestingSingle:
@@ -441,7 +440,7 @@ func writeConfigNestedTypeAttributeFromExisting(addr addrs.AbsResourceInstance,
441440

442441
buf.WriteString(strings.Repeat(" ", indent))
443442
buf.WriteString(fmt.Sprintf("%s = {\n", name))
444-
diags = diags.Append(writeConfigAttributesFromExisting(addr, buf, nestedVal, schema.NestedType.Attributes, indent+2))
443+
diags = diags.Append(writeConfigAttributesFromExisting(addr, buf, nestedVal, schema.NestedType.Attributes, indent+2, processor))
445444
buf.WriteString("}\n")
446445
return diags
447446

@@ -473,7 +472,7 @@ func writeConfigNestedTypeAttributeFromExisting(addr addrs.AbsResourceInstance,
473472
}
474473

475474
buf.WriteString("{\n")
476-
diags = diags.Append(writeConfigAttributesFromExisting(addr, buf, listVals[i], schema.NestedType.Attributes, indent+4))
475+
diags = diags.Append(writeConfigAttributesFromExisting(addr, buf, listVals[i], schema.NestedType.Attributes, indent+4, processor))
477476
buf.WriteString(strings.Repeat(" ", indent+2))
478477
buf.WriteString("},\n")
479478
}
@@ -511,7 +510,7 @@ func writeConfigNestedTypeAttributeFromExisting(addr addrs.AbsResourceInstance,
511510
}
512511

513512
buf.WriteString("\n")
514-
diags = diags.Append(writeConfigAttributesFromExisting(addr, buf, vals[key], schema.NestedType.Attributes, indent+4))
513+
diags = diags.Append(writeConfigAttributesFromExisting(addr, buf, vals[key], schema.NestedType.Attributes, indent+4, processor))
515514
buf.WriteString(strings.Repeat(" ", indent+2))
516515
buf.WriteString("}\n")
517516
}
@@ -527,6 +526,7 @@ func writeConfigNestedTypeAttributeFromExisting(addr addrs.AbsResourceInstance,
527526

528527
func writeConfigNestedBlockFromExisting(addr addrs.AbsResourceInstance, buf *strings.Builder, name string, schema *configschema.NestedBlock, stateVal cty.Value, indent int) tfdiags.Diagnostics {
529528
var diags tfdiags.Diagnostics
529+
processAttr := optionalOrRequiredProcessor
530530

531531
switch schema.Nesting {
532532
case configschema.NestingSingle, configschema.NestingGroup:
@@ -542,7 +542,7 @@ func writeConfigNestedBlockFromExisting(addr addrs.AbsResourceInstance, buf *str
542542
return diags
543543
}
544544
buf.WriteString("\n")
545-
diags = diags.Append(writeConfigAttributesFromExisting(addr, buf, stateVal, schema.Attributes, indent+2))
545+
diags = diags.Append(writeConfigAttributesFromExisting(addr, buf, stateVal, schema.Attributes, indent+2, processAttr))
546546
diags = diags.Append(writeConfigBlocksFromExisting(addr, buf, stateVal, schema.BlockTypes, indent+2))
547547
buf.WriteString("}\n")
548548
return diags
@@ -556,7 +556,7 @@ func writeConfigNestedBlockFromExisting(addr addrs.AbsResourceInstance, buf *str
556556
for i := range listVals {
557557
buf.WriteString(strings.Repeat(" ", indent))
558558
buf.WriteString(fmt.Sprintf("%s {\n", name))
559-
diags = diags.Append(writeConfigAttributesFromExisting(addr, buf, listVals[i], schema.Attributes, indent+2))
559+
diags = diags.Append(writeConfigAttributesFromExisting(addr, buf, listVals[i], schema.Attributes, indent+2, processAttr))
560560
diags = diags.Append(writeConfigBlocksFromExisting(addr, buf, listVals[i], schema.BlockTypes, indent+2))
561561
buf.WriteString("}\n")
562562
}
@@ -578,7 +578,7 @@ func writeConfigNestedBlockFromExisting(addr addrs.AbsResourceInstance, buf *str
578578
return diags
579579
}
580580
buf.WriteString("\n")
581-
diags = diags.Append(writeConfigAttributesFromExisting(addr, buf, vals[key], schema.Attributes, indent+2))
581+
diags = diags.Append(writeConfigAttributesFromExisting(addr, buf, vals[key], schema.Attributes, indent+2, processAttr))
582582
diags = diags.Append(writeConfigBlocksFromExisting(addr, buf, vals[key], schema.BlockTypes, indent+2))
583583
buf.WriteString(strings.Repeat(" ", indent))
584584
buf.WriteString("}\n")

internal/genconfig/generate_config_test.go

Lines changed: 32 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -848,7 +848,6 @@ func sensitiveAttribute(t cty.Type) *configschema.Attribute {
848848
}
849849

850850
func TestGenerateResourceAndIDContents(t *testing.T) {
851-
// Define a simple schema with some attributes
852851
schema := &configschema.Block{
853852
Attributes: map[string]*configschema.Attribute{
854853
"name": {
@@ -895,44 +894,44 @@ func TestGenerateResourceAndIDContents(t *testing.T) {
895894
}
896895

897896
// Create mock resource instance values
898-
resourceVal := cty.ListVal([]cty.Value{
897+
value := cty.TupleVal([]cty.Value{
899898
cty.ObjectVal(map[string]cty.Value{
900-
"name": cty.StringVal("instance-1"),
901-
"id": cty.StringVal("i-abcdef"),
902-
"tags": cty.MapVal(map[string]cty.Value{
903-
"Environment": cty.StringVal("Dev"),
904-
"Owner": cty.StringVal("Team1"),
905-
}),
906-
"network_interface": cty.ListVal([]cty.Value{
907-
cty.ObjectVal(map[string]cty.Value{
908-
"subnet_id": cty.StringVal("subnet-123"),
909-
"ip_address": cty.StringVal("10.0.0.1"),
899+
"state": cty.ObjectVal(map[string]cty.Value{
900+
"name": cty.StringVal("instance-1"),
901+
"id": cty.StringVal("i-abcdef"),
902+
"tags": cty.MapVal(map[string]cty.Value{
903+
"Environment": cty.StringVal("Dev"),
904+
"Owner": cty.StringVal("Team1"),
905+
}),
906+
"network_interface": cty.ListVal([]cty.Value{
907+
cty.ObjectVal(map[string]cty.Value{
908+
"subnet_id": cty.StringVal("subnet-123"),
909+
"ip_address": cty.StringVal("10.0.0.1"),
910+
}),
910911
}),
911912
}),
913+
"identity": cty.ObjectVal(map[string]cty.Value{
914+
"id": cty.StringVal("i-abcdef"),
915+
}),
912916
}),
913917
cty.ObjectVal(map[string]cty.Value{
914-
"name": cty.StringVal("instance-2"),
915-
"id": cty.StringVal("i-123456"),
916-
"tags": cty.MapVal(map[string]cty.Value{
917-
"Environment": cty.StringVal("Prod"),
918-
"Owner": cty.StringVal("Team2"),
919-
}),
920-
"network_interface": cty.ListVal([]cty.Value{
921-
cty.ObjectVal(map[string]cty.Value{
922-
"subnet_id": cty.StringVal("subnet-456"),
923-
"ip_address": cty.StringVal("10.0.0.2"),
918+
"state": cty.ObjectVal(map[string]cty.Value{
919+
"name": cty.StringVal("instance-2"),
920+
"id": cty.StringVal("i-123456"),
921+
"tags": cty.MapVal(map[string]cty.Value{
922+
"Environment": cty.StringVal("Prod"),
923+
"Owner": cty.StringVal("Team2"),
924+
}),
925+
"network_interface": cty.ListVal([]cty.Value{
926+
cty.ObjectVal(map[string]cty.Value{
927+
"subnet_id": cty.StringVal("subnet-456"),
928+
"ip_address": cty.StringVal("10.0.0.2"),
929+
}),
924930
}),
925931
}),
926-
}),
927-
})
928-
929-
// Create mock identity values
930-
identityVal := cty.ListVal([]cty.Value{
931-
cty.ObjectVal(map[string]cty.Value{
932-
"id": cty.StringVal("i-abcdef"),
933-
}),
934-
cty.ObjectVal(map[string]cty.Value{
935-
"id": cty.StringVal("i-123456"),
932+
"identity": cty.ObjectVal(map[string]cty.Value{
933+
"id": cty.StringVal("i-123456"),
934+
}),
936935
}),
937936
})
938937

@@ -955,7 +954,7 @@ func TestGenerateResourceAndIDContents(t *testing.T) {
955954
}
956955

957956
// Generate content
958-
content, diags := GenerateListResourceContents(instAddr1, schema, idSchema, pc, resourceVal, identityVal)
957+
content, diags := GenerateListResourceContents(instAddr1, schema, idSchema, pc, value)
959958
// Check for diagnostics
960959
if diags.HasErrors() {
961960
t.Fatalf("unexpected diagnostics: %s", diags.Err())

0 commit comments

Comments
 (0)