Skip to content

Commit

Permalink
Merge pull request #347 from meshery/revert-345-rego
Browse files Browse the repository at this point in the history
Revert "[Policy] init rego instance"
  • Loading branch information
MUzairS15 authored Aug 11, 2023
2 parents a17215c + 79ff779 commit 6d7e3da
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 87 deletions.
2 changes: 1 addition & 1 deletion helpers/component_info.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"name": "meshkit",
"type": "library",
"next_error_code": 11100
"next_error_code": 11097
}
16 changes: 0 additions & 16 deletions models/meshmodel/core/policies/error.go

This file was deleted.

80 changes: 10 additions & 70 deletions models/meshmodel/core/policies/rego_policy_relationship.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,99 +2,39 @@ package policies

import (
"context"
"encoding/json"
"io/fs"
"os"
"path/filepath"
"strings"
"fmt"

"github.com/layer5io/meshkit/models/meshmodel/core/v1alpha1"
"github.com/layer5io/meshkit/utils"
"github.com/open-policy-agent/opa/rego"
"github.com/open-policy-agent/opa/storage"
"github.com/open-policy-agent/opa/storage/inmem"
"github.com/sirupsen/logrus"
"gopkg.in/yaml.v3"
)

type Rego struct {
store storage.Store
ctx context.Context
transaction storage.Transaction
policyDir string
}

func NewRegoInstance(policyDir string, relationshipDir string) (*Rego, error) {
var relationships []v1alpha1.RelationshipDefinition
ctx := context.Background()

err := filepath.Walk(relationshipDir, func(path string, info fs.FileInfo, err error) error {
var relationship v1alpha1.RelationshipDefinition
if !info.IsDir() {
byt, err := os.ReadFile(path)
if err != nil {
return utils.ErrReadingLocalFile(err)
}
err = json.Unmarshal(byt, &relationship)
if err != nil {
return utils.ErrUnmarshal(err)
}
relationships = append(relationships, relationship)
}
return nil
})

if err != nil {
return nil, err
}

data := mapRelationshipsWithSubType(&relationships)
store := inmem.NewFromObject(data)
txn, _ := store.NewTransaction(ctx, storage.WriteParams)

return &Rego{
store: store,
ctx: ctx,
transaction: txn,
policyDir: policyDir,
}, nil
}

func mapRelationshipsWithSubType(relationships *[]v1alpha1.RelationshipDefinition) map[string]interface{} {
relMap := make(map[string]interface{}, len(*relationships))
for _, relationship := range *relationships {
relMap[strings.ToLower(relationship.SubType)] = relationship
}
return relMap
}

// RegoPolicyHandler takes the required inputs and run the query against all the policy files provided
func (r *Rego) RegoPolicyHandler(regoQueryString string, designFile []byte) (map[string]interface{}, error) {
func RegoPolicyHandler(ctx context.Context, policyDir []string, regoQueryString string, designFile []byte) (map[string]interface{}, error) {
regoPolicyLoader := rego.Load(policyDir, nil)

regoEngine, err := rego.New(
rego.Query(regoQueryString),
rego.Load([]string{r.policyDir}, nil),
rego.Store(r.store),
rego.Transaction(r.transaction),
).PrepareForEval(r.ctx)
regoPolicyLoader,
).PrepareForEval(ctx)
if err != nil {
logrus.Error("error preparing for evaluation", err)
return nil, ErrPrepareForEval(err)
}

var input map[string]interface{}
err = yaml.Unmarshal((designFile), &input)
if err != nil {
return nil, utils.ErrUnmarshal(err)
return nil, err
}

eval_result, err := regoEngine.Eval(r.ctx, rego.EvalInput(input))
eval_result, err := regoEngine.Eval(ctx, rego.EvalInput(input))
if err != nil {
return nil, ErrEval(err)
return nil, err
}

if !eval_result.Allowed() {
return eval_result[0].Expressions[0].Value.(map[string]interface{}), nil
}

return nil, ErrEval(err)
return nil, fmt.Errorf("error evaluation rego response, the result is not returning the expressions, The policy query is invalid, see: github.com/open-policy-agent/opa@v0.52.0/rego/resultset.go (Allowed func)")
}

0 comments on commit 6d7e3da

Please sign in to comment.