Skip to content

Commit

Permalink
Add entity properties to rego evaluation context.
Browse files Browse the repository at this point in the history
This change adds the entity's properties as defined by the provider to
the REGO evaluation context, making it possible to use them as
arguments to e.g. data sources.
  • Loading branch information
blkt committed Dec 17, 2024
1 parent 739607f commit acbab12
Showing 1 changed file with 23 additions and 2 deletions.
25 changes: 23 additions & 2 deletions internal/engine/eval/rego/eval.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
"github.com/open-policy-agent/opa/rego"
"github.com/open-policy-agent/opa/topdown/print"
"google.golang.org/protobuf/reflect/protoreflect"
"google.golang.org/protobuf/types/known/structpb"

eoptions "github.com/mindersec/minder/internal/engine/options"
minderv1 "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1"
Expand Down Expand Up @@ -49,6 +50,9 @@ type Input struct {
Profile map[string]any `json:"profile"`
// Ingested is the values set for the ingested data
Ingested any `json:"ingested"`
// Properties contains the entity's properties as defined by
// the provider
Properties map[string]any `json:"properties"`
// OutputFormat is the format to output violations in
OutputFormat ConstraintsViolationsFormat `json:"output_format"`
}
Expand Down Expand Up @@ -134,14 +138,31 @@ func (e *Evaluator) Eval(
return nil, fmt.Errorf("could not prepare Rego: %w", err)
}

rs, err := pq.Eval(ctx, rego.EvalInput(&Input{
input := &Input{
Profile: pol,
Ingested: obj,
OutputFormat: e.cfg.ViolationFormat,
}))
}

enrichInputWithEntityProps(input, entity)
rs, err := pq.Eval(ctx, rego.EvalInput(input))
if err != nil {
return nil, fmt.Errorf("error evaluating profile. Might be wrong input: %w", err)
}

return e.reseval.parseResult(rs, entity)
}

type propertiesFetcher interface {
GetProperties() *structpb.Struct
}

func enrichInputWithEntityProps(
input *Input,
entity protoreflect.ProtoMessage,
) {
switch entity := entity.(type) {

Check failure on line 164 in internal/engine/eval/rego/eval.go

View workflow job for this annotation

GitHub Actions / lint / Run golangci-lint

unnecessary-stmt: switch with only one case can be replaced by an if-then (revive)
case propertiesFetcher:
input.Properties = entity.GetProperties().AsMap()
}
}

0 comments on commit acbab12

Please sign in to comment.