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 a4dc5db
Showing 1 changed file with 22 additions and 2 deletions.
24 changes: 22 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,30 @@ 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,
) {
if inner, ok := entity.(propertiesFetcher); ok {
input.Properties = inner.GetProperties().AsMap()
}
}

0 comments on commit a4dc5db

Please sign in to comment.