Skip to content

Commit 88cba2c

Browse files
committed
policy: avoid stale invalid field warnings in eval
Track fields reloaded during eval --print resolution loops and filter final invalid-field warnings against that set. Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
1 parent 4880756 commit 88cba2c

File tree

2 files changed

+32
-0
lines changed

2 files changed

+32
-0
lines changed

commands/policy/eval.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ func runEval(ctx context.Context, dockerCli command.Cli, source string, opts eva
118118
var lastUnknowns []string
119119
var trimmedUnknowns []string
120120
var invalidFields []string
121+
reloadedFields := map[string]struct{}{}
121122
for {
122123
maxAttempts--
123124
if maxAttempts <= 0 {
@@ -133,6 +134,9 @@ func runEval(ctx context.Context, dockerCli command.Cli, source string, opts eva
133134
}
134135
lastUnknowns = slices.Clone(trimmedUnknowns)
135136
toReload, invalid := selectReloadFields(opts.fields, trimmedUnknowns)
137+
for _, f := range toReload {
138+
reloadedFields[f] = struct{}{}
139+
}
136140
invalidFields = invalid
137141
if len(toReload) > 0 {
138142
retry, next, err := policy.ResolveInputUnknowns(ctx, &input, srcReq.Source, toReload, platform, &p, metaResolver, verifier, nil)
@@ -157,6 +161,7 @@ func runEval(ctx context.Context, dockerCli command.Cli, source string, opts eva
157161
}
158162
break
159163
}
164+
invalidFields = filterInvalidFields(invalidFields, reloadedFields)
160165

161166
if len(invalidFields) > 0 {
162167
logrus.Warnf("invalid fields: %v", strings.Join(invalidFields, ", "))
@@ -292,6 +297,20 @@ func selectReloadFields(fields []string, unknowns []string) ([]string, []string)
292297
return slices.Collect(maps.Keys(reload)), invalid
293298
}
294299

300+
func filterInvalidFields(invalid []string, reloadedFields map[string]struct{}) []string {
301+
if len(invalid) == 0 {
302+
return nil
303+
}
304+
out := make([]string, 0, len(invalid))
305+
for _, field := range invalid {
306+
if _, ok := reloadedFields[field]; ok {
307+
continue
308+
}
309+
out = append(out, field)
310+
}
311+
return out
312+
}
313+
295314
func findUnknownAncestor(field string, unknowns []string) string {
296315
var best string
297316
for _, unknown := range unknowns {

commands/policy/eval_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,19 @@ func TestSelectReloadFields(t *testing.T) {
127127
})
128128
}
129129

130+
func TestFilterInvalidFields(t *testing.T) {
131+
out := filterInvalidFields([]string{
132+
"git.tag",
133+
"image.checksum",
134+
}, map[string]struct{}{
135+
"git.tag": {},
136+
})
137+
require.Equal(t, []string{"image.checksum"}, out)
138+
139+
out = filterInvalidFields([]string{"foo.bar"}, nil)
140+
require.Equal(t, []string{"foo.bar"}, out)
141+
}
142+
130143
func TestMaterialFieldPrerequisites(t *testing.T) {
131144
t.Run("non material field", func(t *testing.T) {
132145
prereq, ok := materialFieldPrerequisites("image.provenance")

0 commit comments

Comments
 (0)