vet/docs/policy-dev.md
Abhisek Datta 3eb501c72b
feat: Add Support for Filter v2 - Spec Based Policy Engine (#560)
* feat: Add support for filter v2

* Add filter v2 support

* Add test for filter v2 evaluator

* fix: CEL v2 query engine

* chore: Add sample policy-v2

* chore: Remove deprecated API use

* fix: Remove deprecated API

* fix: Misc linter fixes

* fix: Linter fixes

* fix: Policy v2 sample

* refactor: Extract filter match rendering into common concern

* test: Update test case

* fix: JSON round trip problem by using PB messages for filter eval

* Improve DX by declaring enum constants in CEL env

* fix: Code generator for enum type names

* docs: Add policy dev enumgen docs

* chore: Add example policy

* test: Add test for CEL filter suite v2 analyser

* Code review fixes

* fix: Code review comments

* chore: Add CI check to ensure generated code is updated

* fix: Add nil guards during init
2025-10-02 09:01:50 +05:30

1.5 KiB

Policy Engine Development

The policy engine is implemented using Common Expressions Languages. This development document is ONLY for Policy v2, internally represented as Filter V2 for naming consistency.

Enum Constants

Protobuf enums are exposed as integer values in CEL. To improve policy readability, we generate enum constant maps that allow using symbolic names instead of integers.

Example usage in policies:

// Instead of: p.project.type == 1
p.project.type == ProjectSourceType.GITHUB

// Instead of: pkg.ecosystem == 2
pkg.ecosystem == Ecosystem.NPM

How it works:

  • pkg/analyzer/filterv2/enums.go registers enums via RegisteredEnums by referencing protobuf-generated Type_value maps
  • pkg/analyzer/filterv2/enumgen/ generates enums_generated.go with constant maps
  • Run go generate ./pkg/analyzer/filterv2/ to regenerate after adding new enums

Adding new enums:

  1. Add entry to RegisteredEnums in pkg/analyzer/filterv2/enums.go:

    {
        Name:     "SeverityRisk",
        Prefix:   "RISK_",
        ValueMap: vulnerabilityv1.Severity_Risk_value,
    }
    
  2. Declare the enum variable in pkg/analyzer/filterv2/eval.go NewEvaluator():

    cel.Variable("SeverityRisk", cel.MapType(cel.StringType, cel.IntType))
    
  3. Run go generate ./pkg/analyzer/filterv2/

The generator automatically strips prefixes (e.g., RISK_CRITICALCRITICAL) and keeps enums synchronized with protobuf definitions.