Skip to content

Commit 1805b99

Browse files
authored
Ignore empty namespaces when comparing policies (#2226)
1 parent 769dc4a commit 1805b99

File tree

2 files changed

+48
-11
lines changed

2 files changed

+48
-11
lines changed

internal/testrunner/runners/policy/policy.go

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ type policyEntryFilter struct {
9797
name string
9898
elementsEntries []policyEntryFilter
9999
memberReplace *policyEntryReplace
100+
onlyIfEmpty bool
100101
}
101102

102103
type policyEntryReplace struct {
@@ -148,6 +149,9 @@ var policyEntryFilters = []policyEntryFilter{
148149
regexp: regexp.MustCompile(`^[a-z0-9]{4,}(-[a-z0-9]{4,})+$`),
149150
replace: "uuid-for-permissions-on-related-indices",
150151
}},
152+
153+
// Namespaces may not be present in older versions of the stack.
154+
{name: "namespaces", onlyIfEmpty: true},
151155
}
152156

153157
// cleanPolicy prepares a policy YAML as returned by the download API to be compared with other
@@ -170,15 +174,16 @@ func cleanPolicy(policy []byte, entriesToClean []policyEntryFilter) ([]byte, err
170174

171175
func cleanPolicyMap(policyMap common.MapStr, entries []policyEntryFilter) (common.MapStr, error) {
172176
for _, entry := range entries {
177+
v, err := policyMap.GetValue(entry.name)
178+
if errors.Is(err, common.ErrKeyNotFound) {
179+
continue
180+
}
181+
if err != nil {
182+
return nil, err
183+
}
184+
173185
switch {
174186
case len(entry.elementsEntries) > 0:
175-
v, err := policyMap.GetValue(entry.name)
176-
if errors.Is(err, common.ErrKeyNotFound) {
177-
continue
178-
}
179-
if err != nil {
180-
return nil, err
181-
}
182187
list, err := common.ToMapStrSlice(v)
183188
if err != nil {
184189
return nil, err
@@ -197,10 +202,6 @@ func cleanPolicyMap(policyMap common.MapStr, entries []policyEntryFilter) (commo
197202
return nil, err
198203
}
199204
case entry.memberReplace != nil:
200-
v, err := policyMap.GetValue(entry.name)
201-
if errors.Is(err, common.ErrKeyNotFound) {
202-
continue
203-
}
204205
m, ok := v.(common.MapStr)
205206
if !ok {
206207
return nil, fmt.Errorf("expected map, found %T", v)
@@ -212,6 +213,9 @@ func cleanPolicyMap(policyMap common.MapStr, entries []policyEntryFilter) (commo
212213
}
213214
}
214215
default:
216+
if entry.onlyIfEmpty && !isEmpty(v) {
217+
continue
218+
}
215219
err := policyMap.Delete(entry.name)
216220
if errors.Is(err, common.ErrKeyNotFound) {
217221
continue
@@ -224,3 +228,16 @@ func cleanPolicyMap(policyMap common.MapStr, entries []policyEntryFilter) (commo
224228

225229
return policyMap, nil
226230
}
231+
232+
func isEmpty(v any) bool {
233+
switch v := v.(type) {
234+
case nil:
235+
return true
236+
case []any:
237+
return len(v) == 0
238+
case map[string]any:
239+
return len(v) == 0
240+
}
241+
242+
return false
243+
}

internal/testrunner/runners/policy/policy_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,25 @@ id: "2e19c1c4-185b-11ef-a7fc-43855f39047f"
5858
`,
5959
fail: true,
6060
},
61+
{
62+
title: "clean namespaces if empty",
63+
expected: `
64+
`,
65+
found: `
66+
namespaces: []
67+
`,
68+
equal: true,
69+
},
70+
{
71+
title: "clean namespaces only if empty",
72+
expected: `
73+
namespaces: []
74+
`,
75+
found: `
76+
namespaces: [foo]
77+
`,
78+
equal: false,
79+
},
6180
{
6281
title: "clean expected",
6382
expected: `
@@ -138,6 +157,7 @@ inputs:
138157
password: ${SECRET_0}
139158
type: sql/metrics
140159
use_output: default
160+
namespaces: []
141161
output_permissions:
142162
default:
143163
_elastic_agent_checks:

0 commit comments

Comments
 (0)