Skip to content

Commit 55e4cc7

Browse files
authored
Merge pull request #294 from port-labs/PORT-16658-sort-rules
SCAB - scorecard rules change detection fix
2 parents b9732b4 + 9885d10 commit 55e4cc7

File tree

2 files changed

+18
-4
lines changed

2 files changed

+18
-4
lines changed

port/scorecard/refreshScorecardState.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,12 @@ package scorecard
33
import (
44
"context"
55
"fmt"
6-
7-
"github.com/port-labs/terraform-provider-port-labs/v2/internal/utils"
8-
96
"reflect"
7+
"sort"
108

119
"github.com/hashicorp/terraform-plugin-framework/types"
1210
"github.com/port-labs/terraform-provider-port-labs/v2/internal/cli"
11+
"github.com/port-labs/terraform-provider-port-labs/v2/internal/utils"
1312
)
1413

1514
func shouldRefreshLevels(stateLevels []Level, cliLevels []cli.Level) bool {
@@ -117,6 +116,12 @@ func (r *ScorecardResource) refreshScorecardState(ctx context.Context, state *Sc
117116
stateRules = append(stateRules, *stateRule)
118117
}
119118

119+
// Sort rules by identifier to prevent Terraform from detecting false-positive changes
120+
// due to API returning rules in different order
121+
sort.Slice(stateRules, func(i, j int) bool {
122+
return stateRules[i].Identifier.ValueString() < stateRules[j].Identifier.ValueString()
123+
})
124+
120125
state.Rules = stateRules
121126
if shouldRefreshLevels(state.Levels, s.Levels) {
122127
state.Levels = fromCliLevelsToTerraformLevels(s.Levels)

port/scorecard/scorecardResourceToPortBody.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package scorecard
33
import (
44
"context"
55
"encoding/json"
6+
"sort"
67

78
"github.com/port-labs/terraform-provider-port-labs/v2/internal/cli"
89
)
@@ -45,9 +46,17 @@ func scorecardResourceToPortBody(ctx context.Context, state *ScorecardModel) (*c
4546
s.Filter = filter
4647
}
4748

49+
// Sort rules by identifier to ensure consistent ordering
50+
sortedStateRules := make([]Rule, len(state.Rules))
51+
copy(sortedStateRules, state.Rules)
52+
53+
sort.Slice(sortedStateRules, func(i, j int) bool {
54+
return sortedStateRules[i].Identifier.ValueString() < sortedStateRules[j].Identifier.ValueString()
55+
})
56+
4857
var rules []cli.Rule
4958

50-
for _, stateRule := range state.Rules {
59+
for _, stateRule := range sortedStateRules {
5160
rule := &cli.Rule{
5261
Level: stateRule.Level.ValueString(),
5362
Identifier: stateRule.Identifier.ValueString(),

0 commit comments

Comments
 (0)