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>
This commit is contained in:
@@ -118,6 +118,7 @@ func runEval(ctx context.Context, dockerCli command.Cli, source string, opts eva
|
||||
var lastUnknowns []string
|
||||
var trimmedUnknowns []string
|
||||
var invalidFields []string
|
||||
reloadedFields := map[string]struct{}{}
|
||||
for {
|
||||
maxAttempts--
|
||||
if maxAttempts <= 0 {
|
||||
@@ -133,6 +134,9 @@ func runEval(ctx context.Context, dockerCli command.Cli, source string, opts eva
|
||||
}
|
||||
lastUnknowns = slices.Clone(trimmedUnknowns)
|
||||
toReload, invalid := selectReloadFields(opts.fields, trimmedUnknowns)
|
||||
for _, f := range toReload {
|
||||
reloadedFields[f] = struct{}{}
|
||||
}
|
||||
invalidFields = invalid
|
||||
if len(toReload) > 0 {
|
||||
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
|
||||
}
|
||||
break
|
||||
}
|
||||
invalidFields = filterInvalidFields(invalidFields, reloadedFields)
|
||||
|
||||
if len(invalidFields) > 0 {
|
||||
logrus.Warnf("invalid fields: %v", strings.Join(invalidFields, ", "))
|
||||
@@ -292,6 +297,20 @@ func selectReloadFields(fields []string, unknowns []string) ([]string, []string)
|
||||
return slices.Collect(maps.Keys(reload)), invalid
|
||||
}
|
||||
|
||||
func filterInvalidFields(invalid []string, reloadedFields map[string]struct{}) []string {
|
||||
if len(invalid) == 0 {
|
||||
return nil
|
||||
}
|
||||
out := make([]string, 0, len(invalid))
|
||||
for _, field := range invalid {
|
||||
if _, ok := reloadedFields[field]; ok {
|
||||
continue
|
||||
}
|
||||
out = append(out, field)
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
func findUnknownAncestor(field string, unknowns []string) string {
|
||||
var best string
|
||||
for _, unknown := range unknowns {
|
||||
|
||||
@@ -127,6 +127,19 @@ func TestSelectReloadFields(t *testing.T) {
|
||||
})
|
||||
}
|
||||
|
||||
func TestFilterInvalidFields(t *testing.T) {
|
||||
out := filterInvalidFields([]string{
|
||||
"git.tag",
|
||||
"image.checksum",
|
||||
}, map[string]struct{}{
|
||||
"git.tag": {},
|
||||
})
|
||||
require.Equal(t, []string{"image.checksum"}, out)
|
||||
|
||||
out = filterInvalidFields([]string{"foo.bar"}, nil)
|
||||
require.Equal(t, []string{"foo.bar"}, out)
|
||||
}
|
||||
|
||||
func TestMaterialFieldPrerequisites(t *testing.T) {
|
||||
t.Run("non material field", func(t *testing.T) {
|
||||
prereq, ok := materialFieldPrerequisites("image.provenance")
|
||||
|
||||
Reference in New Issue
Block a user