From d82c21c9d360799c6f0baad89b1fef1266cb9d02 Mon Sep 17 00:00:00 2001 From: Sebastian Spaink <3441183+sspaink@users.noreply.github.com> Date: Tue, 25 Nov 2025 03:33:29 -0600 Subject: [PATCH] cmd: Support --ignore in eval cmd when using bundle flag (-b) (#8062) Signed-off-by: Sebastian Spaink Co-authored-by: Ronnie-personal <76408835+Ronnie-personal@users.noreply.github.com> --- cmd/eval.go | 1 + cmd/eval_test.go | 30 ++++++++++++++++++++++++++++++ v1/rego/rego.go | 9 +++++++++ 3 files changed, 40 insertions(+) diff --git a/cmd/eval.go b/cmd/eval.go index 5b70495d2b..662ef42e99 100644 --- a/cmd/eval.go +++ b/cmd/eval.go @@ -610,6 +610,7 @@ func setupEval(args []string, params evalCommandParams) (*evalContext, error) { for _, bundleDir := range params.bundlePaths.v { regoArgs = append(regoArgs, rego.LoadBundle(bundleDir)) } + regoArgs = append(regoArgs, rego.WithFilter(buildCommandLoaderFilter(true, params.ignore))) } else { b, err := generateOptimizedBundle(params, true, buildCommandLoaderFilter(true, params.ignore), params.bundlePaths.v) if err != nil { diff --git a/cmd/eval_test.go b/cmd/eval_test.go index 43eab64361..063075f06a 100755 --- a/cmd/eval_test.go +++ b/cmd/eval_test.go @@ -1019,6 +1019,36 @@ func TestEvalReturnsRegoError(t *testing.T) { } } +func TestEvalBundlePathWithIgnoreFlag(t *testing.T) { + files := map[string]string{ + "good_policy.rego": ` + package example + p1 if { data.foo }`, + "bad_policy.rego": ` + package example + var `, + "data.json": ` + {"foo": true, "bar": false}`, + } + + test.WithTempFS(files, func(path string) { + params := newEvalCommandParams() + if err := params.bundlePaths.Set(path); err != nil { + t.Fatalf("Unable to set bundle path: %v", err) + } + params.ignore = []string{"bad_policy.rego"} + + var buf bytes.Buffer + + // Evaluate policies + defined, err := eval([]string{"data.example.p1"}, params, &buf, &buf) + + if !defined || err != nil { + t.Fatalf("Unexpected undefined or error for p1: %v", err) + } + }) +} + func TestEvalWithBundleData(t *testing.T) { files := map[string]string{ "x/x.rego": "package x\np = 1", diff --git a/v1/rego/rego.go b/v1/rego/rego.go index 13465fc81c..f524f2b1bc 100644 --- a/v1/rego/rego.go +++ b/v1/rego/rego.go @@ -25,6 +25,7 @@ import ( "github.com/open-policy-agent/opa/v1/bundle" "github.com/open-policy-agent/opa/v1/ir" "github.com/open-policy-agent/opa/v1/loader" + "github.com/open-policy-agent/opa/v1/loader/filter" "github.com/open-policy-agent/opa/v1/metrics" "github.com/open-policy-agent/opa/v1/plugins" "github.com/open-policy-agent/opa/v1/resolver" @@ -671,6 +672,7 @@ type Rego struct { regoVersion ast.RegoVersion compilerHook func(*ast.Compiler) evalMode *ast.CompilerEvalMode + filter filter.LoaderFilter } func (r *Rego) RegoVersion() ast.RegoVersion { @@ -1047,6 +1049,12 @@ func LoadBundle(path string) func(r *Rego) { } } +func WithFilter(f filter.LoaderFilter) func(r *Rego) { + return func(r *Rego) { + r.filter = f + } +} + // ParsedBundle returns an argument that adds a bundle to be loaded. func ParsedBundle(name string, b *bundle.Bundle) func(r *Rego) { return func(r *Rego) { @@ -2046,6 +2054,7 @@ func (r *Rego) loadBundles(_ context.Context, _ storage.Transaction, m metrics.M WithSkipBundleVerification(r.skipBundleVerification). WithRegoVersion(r.regoVersion). WithCapabilities(r.capabilities). + WithFilter(r.filter). AsBundle(path) if err != nil { return fmt.Errorf("loading error: %s", err)