Skip to content

Commit de2ed8c

Browse files
committed
Ignore diff when using empty json object {}.
1 parent 91894d0 commit de2ed8c

File tree

2 files changed

+54
-2
lines changed

2 files changed

+54
-2
lines changed

internal/fleet/integration_policy/models.go

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ func (model *integrationPolicyModel) populateFromAPI(ctx context.Context, data *
5050
model.Enabled = types.BoolValue(data.Enabled)
5151
model.IntegrationName = types.StringValue(data.Package.Name)
5252
model.IntegrationVersion = types.StringValue(data.Package.Version)
53-
model.VarsJson = utils.MapToNormalizedType(utils.Deref(data.Vars), path.Root("vars_json"), &diags)
53+
model.VarsJson = normalizeVarsJson(model.VarsJson, utils.MapToNormalizedType(utils.Deref(data.Vars), path.Root("vars_json"), &diags))
5454

5555
model.populateInputFromAPI(ctx, data.Inputs, &diags)
5656

@@ -64,7 +64,7 @@ func (model *integrationPolicyModel) populateInputFromAPI(ctx context.Context, i
6464
InputID: types.StringValue(meta.Key),
6565
Enabled: types.BoolPointerValue(inputData.Enabled),
6666
StreamsJson: utils.MapToNormalizedType(utils.Deref(inputData.Streams), meta.Path.AtName("streams_json"), diags),
67-
VarsJson: utils.MapToNormalizedType(utils.Deref(inputData.Vars), meta.Path.AtName("vars_json"), diags),
67+
VarsJson: normalizeVarsJson(model.VarsJson, utils.MapToNormalizedType(utils.Deref(inputData.Vars), meta.Path.AtName("vars_json"), diags)),
6868
}
6969
})
7070
if newInputs == nil {
@@ -147,3 +147,16 @@ func sortInputs(incoming []integrationPolicyInputModel, existing []integrationPo
147147
return iIdx < jIdx
148148
})
149149
}
150+
151+
// normalizeVarsJson handles the case where both nil (from API) and "{}" (from config)
152+
// represent an empty JSON object. If the existing value is "{}" and the incoming
153+
// value is null (from API returning nil), preserve the "{}" to avoid unwanted diffs.
154+
func normalizeVarsJson(existing jsontypes.Normalized, incoming jsontypes.Normalized) jsontypes.Normalized {
155+
if incoming.IsNull() && !existing.IsNull() && !existing.IsUnknown() {
156+
existingValue := existing.ValueString()
157+
if existingValue == "{}" {
158+
return jsontypes.NewNormalizedValue("{}")
159+
}
160+
}
161+
return incoming
162+
}

internal/fleet/integration_policy/models_test.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package integration_policy
33
import (
44
"testing"
55

6+
"github.com/hashicorp/terraform-plugin-framework-jsontypes/jsontypes"
67
"github.com/hashicorp/terraform-plugin-framework/types"
78
"github.com/stretchr/testify/require"
89
)
@@ -62,3 +63,41 @@ func Test_SortInputs(t *testing.T) {
6263
require.Equal(t, want, incoming)
6364
})
6465
}
66+
67+
func TestNormalizeVarsJson(t *testing.T) {
68+
t.Parallel()
69+
70+
tests := []struct {
71+
name string
72+
existing jsontypes.Normalized
73+
api jsontypes.Normalized
74+
want jsontypes.Normalized
75+
}{
76+
{
77+
name: "plan defines empty object, but api returns null -> preserve empty object",
78+
existing: jsontypes.NewNormalizedValue("{}"),
79+
api: jsontypes.NewNormalizedNull(),
80+
want: jsontypes.NewNormalizedValue("{}"),
81+
},
82+
{
83+
name: "plan does not define value, api returns null -> preserve null",
84+
existing: jsontypes.NewNormalizedUnknown(),
85+
api: jsontypes.NewNormalizedNull(),
86+
want: jsontypes.NewNormalizedNull(),
87+
},
88+
}
89+
90+
for _, tt := range tests {
91+
t.Run(tt.name, func(t *testing.T) {
92+
result := normalizeVarsJson(tt.existing, tt.api)
93+
94+
// Compare the states and values
95+
require.Equal(t, tt.want.IsNull(), result.IsNull(), "IsNull() should match")
96+
require.Equal(t, tt.want.IsUnknown(), result.IsUnknown(), "IsUnknown() should match")
97+
98+
if !tt.want.IsNull() && !tt.want.IsUnknown() {
99+
require.Equal(t, tt.want.ValueString(), result.ValueString(), "ValueString() should match")
100+
}
101+
})
102+
}
103+
}

0 commit comments

Comments
 (0)