Skip to content

Commit 9bd1da7

Browse files
authored
Bugfix inconsistent applies of ListAttributes (#328)
* sort the list of ACLs for MongoDBFlex * Fix and test other cases of ListAttribute ordering * fix linting * revert sorting changes, introduce new reconcilestrlist function * merge main * Fix rabbitmq * fix segmentation fault * Improve testing * pass context to mapfields, minor name fixes
1 parent 18d3f4d commit 9bd1da7

26 files changed

Lines changed: 1010 additions & 145 deletions

File tree

stackit/internal/services/dns/recordset/datasource.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ func (d *recordSetDataSource) Read(ctx context.Context, req datasource.ReadReque
164164
return
165165
}
166166

167-
err = mapFields(zoneResp, &model)
167+
err = mapFields(ctx, zoneResp, &model)
168168
if err != nil {
169169
core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading record set", fmt.Sprintf("Processing API payload: %v", err))
170170
return

stackit/internal/services/dns/recordset/resource.go

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
"github.com/hashicorp/terraform-plugin-framework-validators/int64validator"
99
"github.com/hashicorp/terraform-plugin-framework-validators/listvalidator"
1010
"github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator"
11-
"github.com/hashicorp/terraform-plugin-framework/attr"
1211
"github.com/hashicorp/terraform-plugin-framework/path"
1312
"github.com/hashicorp/terraform-plugin-framework/resource"
1413
"github.com/hashicorp/terraform-plugin-framework/resource/schema"
@@ -23,6 +22,7 @@ import (
2322
"github.com/stackitcloud/stackit-sdk-go/services/dns/wait"
2423
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion"
2524
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core"
25+
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils"
2626
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate"
2727
)
2828

@@ -249,7 +249,7 @@ func (r *recordSetResource) Create(ctx context.Context, req resource.CreateReque
249249
}
250250

251251
// Map response body to schema
252-
err = mapFields(waitResp, &model)
252+
err = mapFields(ctx, waitResp, &model)
253253
if err != nil {
254254
core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating record set", fmt.Sprintf("Processing API payload: %v", err))
255255
return
@@ -285,7 +285,7 @@ func (r *recordSetResource) Read(ctx context.Context, req resource.ReadRequest,
285285
}
286286

287287
// Map response body to schema
288-
err = mapFields(recordSetResp, &model)
288+
err = mapFields(ctx, recordSetResp, &model)
289289
if err != nil {
290290
core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading record set", fmt.Sprintf("Processing API payload: %v", err))
291291
return
@@ -335,7 +335,7 @@ func (r *recordSetResource) Update(ctx context.Context, req resource.UpdateReque
335335
return
336336
}
337337

338-
err = mapFields(waitResp, &model)
338+
err = mapFields(ctx, waitResp, &model)
339339
if err != nil {
340340
core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating record set", fmt.Sprintf("Processing API payload: %v", err))
341341
return
@@ -396,7 +396,7 @@ func (r *recordSetResource) ImportState(ctx context.Context, req resource.Import
396396
tflog.Info(ctx, "DNS record set state imported")
397397
}
398398

399-
func mapFields(recordSetResp *dns.RecordSetResponse, model *Model) error {
399+
func mapFields(ctx context.Context, recordSetResp *dns.RecordSetResponse, model *Model) error {
400400
if recordSetResp == nil || recordSetResp.Rrset == nil {
401401
return fmt.Errorf("response input is nil")
402402
}
@@ -417,15 +417,25 @@ func mapFields(recordSetResp *dns.RecordSetResponse, model *Model) error {
417417
if recordSet.Records == nil {
418418
model.Records = types.ListNull(types.StringType)
419419
} else {
420-
records := []attr.Value{}
420+
respRecords := []string{}
421+
421422
for _, record := range *recordSet.Records {
422-
records = append(records, types.StringPointerValue(record.Content))
423+
respRecords = append(respRecords, *record.Content)
424+
}
425+
426+
modelRecords, err := utils.ListValuetoStringSlice(model.Records)
427+
if err != nil {
428+
return err
423429
}
424-
recordsList, diags := types.ListValue(types.StringType, records)
430+
431+
reconciledRecords := utils.ReconcileStringSlices(modelRecords, respRecords)
432+
433+
recordsTF, diags := types.ListValueFrom(ctx, types.StringType, reconciledRecords)
425434
if diags.HasError() {
426435
return fmt.Errorf("failed to map records: %w", core.DiagsToError(diags))
427436
}
428-
model.Records = recordsList
437+
438+
model.Records = recordsTF
429439
}
430440
idParts := []string{
431441
model.ProjectId.ValueString(),

stackit/internal/services/dns/recordset/resource_test.go

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package dns
22

33
import (
4+
"context"
45
"testing"
56

67
"github.com/google/go-cmp/cmp"
@@ -88,6 +89,52 @@ func TestMapFields(t *testing.T) {
8889
},
8990
true,
9091
},
92+
{
93+
"unordered_records",
94+
Model{
95+
ProjectId: types.StringValue("pid"),
96+
ZoneId: types.StringValue("zid"),
97+
Records: types.ListValueMust(types.StringType, []attr.Value{
98+
types.StringValue("record_2"),
99+
types.StringValue("record_1"),
100+
}),
101+
},
102+
&dns.RecordSetResponse{
103+
Rrset: &dns.RecordSet{
104+
Id: utils.Ptr("rid"),
105+
Active: utils.Ptr(true),
106+
Comment: utils.Ptr("comment"),
107+
Error: utils.Ptr("error"),
108+
Name: utils.Ptr("name"),
109+
Records: &[]dns.Record{
110+
{Content: utils.Ptr("record_1")},
111+
{Content: utils.Ptr("record_2")},
112+
},
113+
State: utils.Ptr("state"),
114+
Ttl: utils.Ptr(int64(1)),
115+
Type: utils.Ptr("type"),
116+
},
117+
},
118+
Model{
119+
Id: types.StringValue("pid,zid,rid"),
120+
RecordSetId: types.StringValue("rid"),
121+
ZoneId: types.StringValue("zid"),
122+
ProjectId: types.StringValue("pid"),
123+
Active: types.BoolValue(true),
124+
Comment: types.StringValue("comment"),
125+
Error: types.StringValue("error"),
126+
Name: types.StringValue("name"),
127+
FQDN: types.StringValue("name"),
128+
Records: types.ListValueMust(types.StringType, []attr.Value{
129+
types.StringValue("record_2"),
130+
types.StringValue("record_1"),
131+
}),
132+
State: types.StringValue("state"),
133+
TTL: types.Int64Value(1),
134+
Type: types.StringValue("type"),
135+
},
136+
true,
137+
},
91138
{
92139
"null_fields_and_int_conversions",
93140
Model{
@@ -148,7 +195,7 @@ func TestMapFields(t *testing.T) {
148195
}
149196
for _, tt := range tests {
150197
t.Run(tt.description, func(t *testing.T) {
151-
err := mapFields(tt.input, &tt.state)
198+
err := mapFields(context.Background(), tt.input, &tt.state)
152199
if !tt.isValid && err == nil {
153200
t.Fatalf("Should have failed")
154201
}

stackit/internal/services/dns/zone/datasource.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ func (d *zoneDataSource) Read(ctx context.Context, req datasource.ReadRequest, r
194194
return
195195
}
196196

197-
err = mapFields(zoneResp, &model)
197+
err = mapFields(ctx, zoneResp, &model)
198198
if err != nil {
199199
core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading zone", fmt.Sprintf("Processing API payload: %v", err))
200200
return

stackit/internal/services/dns/zone/resource.go

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import (
99
"github.com/hashicorp/terraform-plugin-framework-validators/int64validator"
1010
"github.com/hashicorp/terraform-plugin-framework-validators/listvalidator"
1111
"github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator"
12-
"github.com/hashicorp/terraform-plugin-framework/attr"
1312
"github.com/hashicorp/terraform-plugin-framework/path"
1413
"github.com/hashicorp/terraform-plugin-framework/resource"
1514
"github.com/hashicorp/terraform-plugin-framework/resource/schema"
@@ -26,6 +25,7 @@ import (
2625
"github.com/stackitcloud/stackit-sdk-go/services/dns/wait"
2726
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion"
2827
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core"
28+
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils"
2929
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate"
3030
)
3131

@@ -329,7 +329,7 @@ func (r *zoneResource) Create(ctx context.Context, req resource.CreateRequest, r
329329
}
330330

331331
// Map response body to schema
332-
err = mapFields(waitResp, &model)
332+
err = mapFields(ctx, waitResp, &model)
333333
if err != nil {
334334
core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating zone", fmt.Sprintf("Processing API payload: %v", err))
335335
return
@@ -363,7 +363,7 @@ func (r *zoneResource) Read(ctx context.Context, req resource.ReadRequest, resp
363363
}
364364

365365
// Map response body to schema
366-
err = mapFields(zoneResp, &model)
366+
err = mapFields(ctx, zoneResp, &model)
367367
if err != nil {
368368
core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading zone", fmt.Sprintf("Processing API payload: %v", err))
369369
return
@@ -409,7 +409,7 @@ func (r *zoneResource) Update(ctx context.Context, req resource.UpdateRequest, r
409409
return
410410
}
411411

412-
err = mapFields(waitResp, &model)
412+
err = mapFields(ctx, waitResp, &model)
413413
if err != nil {
414414
core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating zone", fmt.Sprintf("Processing API payload: %v", err))
415415
return
@@ -475,7 +475,7 @@ func (r *zoneResource) ImportState(ctx context.Context, req resource.ImportState
475475
tflog.Info(ctx, "DNS zone state imported")
476476
}
477477

478-
func mapFields(zoneResp *dns.ZoneResponse, model *Model) error {
478+
func mapFields(ctx context.Context, zoneResp *dns.ZoneResponse, model *Model) error {
479479
if zoneResp == nil || zoneResp.Zone == nil {
480480
return fmt.Errorf("response input is nil")
481481
}
@@ -512,15 +512,20 @@ func mapFields(zoneResp *dns.ZoneResponse, model *Model) error {
512512
if z.Primaries == nil {
513513
model.Primaries = types.ListNull(types.StringType)
514514
} else {
515-
respZonePrimaries := []attr.Value{}
516-
for _, primary := range *z.Primaries {
517-
respZonePrimaries = append(respZonePrimaries, types.StringValue(primary))
518-
respZonePrimariesList, diags := types.ListValue(types.StringType, respZonePrimaries)
519-
if diags.HasError() {
520-
return fmt.Errorf("creating primaries list: %w", core.DiagsToError(diags))
521-
}
522-
model.Primaries = respZonePrimariesList
515+
respPrimaries := *z.Primaries
516+
modelPrimaries, err := utils.ListValuetoStringSlice(model.Primaries)
517+
if err != nil {
518+
return err
523519
}
520+
521+
reconciledPrimaries := utils.ReconcileStringSlices(modelPrimaries, respPrimaries)
522+
523+
primariesTF, diags := types.ListValueFrom(ctx, types.StringType, reconciledPrimaries)
524+
if diags.HasError() {
525+
return fmt.Errorf("failed to map zone primaries: %w", core.DiagsToError(diags))
526+
}
527+
528+
model.Primaries = primariesTF
524529
}
525530
model.ZoneId = types.StringValue(zoneId)
526531
model.Description = types.StringPointerValue(z.Description)

0 commit comments

Comments
 (0)