diff --git a/cmd/sync/main.go b/cmd/sync/main.go index e24379b13e10c115ccad42cfbc26148ba502c56a..5e40681d1651251882c8f22aa8d6057a6a301824 100644 --- a/cmd/sync/main.go +++ b/cmd/sync/main.go @@ -22,7 +22,6 @@ import ( const ( pathSeperator = string(os.PathSeparator) cloneFolder = "temp" - defaultRepoFolder = "policies" policyFilename = "policy.rego" dataFilename = "data.json" dataConfigFilename = "data-config.json" @@ -30,6 +29,7 @@ const ( ) type Policy struct { + Repository string Filename string Name string Group string @@ -87,14 +87,15 @@ func sync(cfg *Config, db *mongo.Client) error { } // clone policy repository - if err := cloneRepo(context.Background(), cfg.Repo.URL, cfg.Repo.User, cfg.Repo.Pass, cfg.Repo.Branch); err != nil { + repo, err := cloneRepo(context.Background(), cfg.Repo.URL, cfg.Repo.User, cfg.Repo.Pass, cfg.Repo.Branch) + if err != nil { return fmt.Errorf("error cloning repo: %v", err) } log.Println("Repository is cloned successfully.") // get all policies from the repository and the given directory - policies, err := iterateRepo(cfg.Repo.Folder) + policies, err := iterateRepo(cfg.Repo.Folder, repo) if err != nil { return fmt.Errorf("error iterating repo: %v", err) } @@ -107,7 +108,7 @@ func sync(cfg *Config, db *mongo.Client) error { } // delete policy repository folder - if err := os.RemoveAll(cfg.Repo.Folder); err != nil { + if err := os.RemoveAll(cloneFolder); err != nil { return fmt.Errorf("error deleting policy repo folder: %v", err) } @@ -117,7 +118,7 @@ func sync(cfg *Config, db *mongo.Client) error { } // cloneRepo clones the Policy repository to repoFolder -func cloneRepo(ctx context.Context, url, user, pass, branch string) error { +func cloneRepo(ctx context.Context, url, user, pass, branch string) (string, error) { log.Println("Cloning repository...") opts := &git.CloneOptions{ @@ -139,12 +140,12 @@ func cloneRepo(ctx context.Context, url, user, pass, branch string) error { _, err := git.PlainCloneContext(ctx, cloneFolder, false, opts) - return err + return getRepoName(url), err } // iterateRepo iterates over the repoFolder and returns a map // of Policy structs -func iterateRepo(repoFolder string) (map[string]*Policy, error) { +func iterateRepo(repoFolder, repository string) (map[string]*Policy, error) { if repoFolder == "" { repoFolder = cloneFolder } else { @@ -159,7 +160,7 @@ func iterateRepo(repoFolder string) (map[string]*Policy, error) { return err } if !d.IsDir() && d.Name() == policyFilename { - policy, err := createPolicy(p) + policy, err := createPolicy(p, repository) if err != nil { return err } @@ -172,7 +173,7 @@ func iterateRepo(repoFolder string) (map[string]*Policy, error) { } // createPolicy instantiates a Policy struct out of a policy file on given path -func createPolicy(p string) (*Policy, error) { +func createPolicy(p, repository string) (*Policy, error) { ex, err := os.Executable() if err != nil { return nil, fmt.Errorf("error getting executable path: %v", err) @@ -216,6 +217,7 @@ func createPolicy(p string) (*Policy, error) { } return &Policy{ + Repository: repository, Filename: dbFilename, Name: name, Group: group, @@ -296,15 +298,16 @@ func compare(currPolicies map[string]*Policy, repoPolicies map[string]*Policy) [ // upsert inserts or updates policies in MongoDB collection // // Decision whether to insert or update is taken based on the composition of -// Policy "group", "name" and "version" fields +// Policy "repository", "group", "name" and "version" fields func upsert(ctx context.Context, policies []*Policy, db *mongo.Collection) error { var ops []mongo.WriteModel for _, policy := range policies { op := mongo.NewUpdateOneModel() op.SetFilter(bson.M{ - "group": policy.Group, - "name": policy.Name, - "version": policy.Version, + "repository": policy.Repository, + "group": policy.Group, + "name": policy.Name, + "version": policy.Version, }) op.SetUpdate(bson.M{ "$set": bson.M{ @@ -341,6 +344,7 @@ func (p1 *Policy) equals(p2 *Policy) bool { if p1.Rego == p2.Rego && p1.Data == p2.Data && p1.DataConfig == p2.DataConfig && + p1.Repository == p2.Repository && p1.Name == p2.Name && p1.Version == p2.Version && p1.Filename == p2.Filename && @@ -351,6 +355,15 @@ func (p1 *Policy) equals(p2 *Policy) bool { return false } +// getRepoName returns the repository name out of a clone url +// +// Example: clone url - `https://gitlab.example.com/policy.git`; repoName - `policy` +func getRepoName(url string) string { + ss := strings.Split(strings.TrimSuffix(url, ".git"), "/") + + return ss[len(ss)-1] +} + func constructKey(p *Policy) string { - return fmt.Sprintf("%s.%s.%s", p.Group, p.Name, p.Version) + return fmt.Sprintf("%s.%s.%s.%s", p.Repository, p.Group, p.Name, p.Version) } diff --git a/design/design.go b/design/design.go index 0acfd5552d7c400383feca7660a12d3ce0012377..691e15fb88d289b6b808eff6ba8dadbf5475c705 100644 --- a/design/design.go +++ b/design/design.go @@ -23,9 +23,9 @@ var _ = Service("policy", func() { Payload(EvaluateRequest) Result(EvaluateResult) HTTP(func() { - GET("/policy/{group}/{policyName}/{version}/evaluation/did.json") - GET("/policy/{group}/{policyName}/{version}/evaluation") - POST("/policy/{group}/{policyName}/{version}/evaluation") + GET("/policy/{repository}/{group}/{policyName}/{version}/evaluation/did.json") + GET("/policy/{repository}/{group}/{policyName}/{version}/evaluation") + POST("/policy/{repository}/{group}/{policyName}/{version}/evaluation") Header("evaluationID:x-evaluation-id", String, "EvaluationID allows overwriting the randomly generated evaluationID", func() { Example("did:web:example.com") }) @@ -45,7 +45,7 @@ var _ = Service("policy", func() { Payload(LockRequest) Result(Empty) HTTP(func() { - POST("/policy/{group}/{policyName}/{version}/lock") + POST("/policy/{repository}/{group}/{policyName}/{version}/lock") Response(StatusOK) }) }) @@ -55,7 +55,7 @@ var _ = Service("policy", func() { Payload(UnlockRequest) Result(Empty) HTTP(func() { - DELETE("/policy/{group}/{policyName}/{version}/lock") + DELETE("/policy/{repository}/{group}/{policyName}/{version}/lock") Response(StatusOK) }) }) diff --git a/design/types.go b/design/types.go index 37730bc9f7c6c6340c0b3816c1d00ca59e9eccc7..d84b6bc3f9146e1032271a71561ab22e600a1686 100644 --- a/design/types.go +++ b/design/types.go @@ -4,19 +4,22 @@ package design import . "goa.design/goa/v3/dsl" var EvaluateRequest = Type("EvaluateRequest", func() { - Field(1, "group", String, "Policy group.", func() { + Field(1, "repository", String, "Policy repository.", func() { + Example("policies") + }) + Field(2, "group", String, "Policy group.", func() { Example("example") }) - Field(2, "policyName", String, "Policy name.", func() { + Field(3, "policyName", String, "Policy name.", func() { Example("example") }) - Field(3, "version", String, "Policy version.", func() { + Field(4, "version", String, "Policy version.", func() { Example("1.0") }) - Field(4, "input", Any, "Input data passed to the policy execution runtime.") - Field(5, "evaluationID", String, "Identifier created by external system and passed as parameter to overwrite the randomly generated evaluationID.") - Field(6, "ttl", Int, "TTL for storing policy result in cache") - Required("group", "policyName", "version") + Field(5, "input", Any, "Input data passed to the policy execution runtime.") + Field(6, "evaluationID", String, "Identifier created by external system and passed as parameter to overwrite the randomly generated evaluationID.") + Field(7, "ttl", Int, "TTL for storing policy result in cache") + Required("repository", "group", "policyName", "version") }) var EvaluateResult = Type("EvaluateResult", func() { @@ -26,29 +29,32 @@ var EvaluateResult = Type("EvaluateResult", func() { }) var LockRequest = Type("LockRequest", func() { - Field(1, "group", String, "Policy group.") - Field(2, "policyName", String, "Policy name.") - Field(3, "version", String, "Policy version.") - Required("group", "policyName", "version") + Field(1, "repository", String, "Policy repository.") + Field(2, "group", String, "Policy group.") + Field(3, "policyName", String, "Policy name.") + Field(4, "version", String, "Policy version.") + Required("repository", "group", "policyName", "version") }) var UnlockRequest = Type("UnlockRequest", func() { - Field(1, "group", String, "Policy group.") - Field(2, "policyName", String, "Policy name.") - Field(3, "version", String, "Policy version.") - Required("group", "policyName", "version") + Field(1, "repository", String, "Policy repository.") + Field(2, "group", String, "Policy group.") + Field(3, "policyName", String, "Policy name.") + Field(4, "version", String, "Policy version.") + Required("repository", "group", "policyName", "version") }) var Policy = Type("Policy", func() { - Field(1, "policyName", String, "Policy name.") - Field(2, "group", String, "Policy group.") - Field(3, "version", String, "Policy version.") - Field(4, "rego", String, "Policy rego source code.") - Field(5, "data", String, "Policy static data.") - Field(6, "dataConfig", String, "Policy static data optional configuration.") - Field(7, "locked", Boolean, "Locked specifies if the policy is locked or allowed to execute.") - Field(8, "lastUpdate", Int64, "Last update (Unix timestamp).") - Required("group", "policyName", "version", "locked", "lastUpdate") + Field(1, "repository", String, "Policy repository.") + Field(2, "policyName", String, "Policy name.") + Field(3, "group", String, "Policy group.") + Field(4, "version", String, "Policy version.") + Field(5, "rego", String, "Policy rego source code.") + Field(6, "data", String, "Policy static data.") + Field(7, "dataConfig", String, "Policy static data optional configuration.") + Field(8, "locked", Boolean, "Locked specifies if the policy is locked or allowed to execute.") + Field(9, "lastUpdate", Int64, "Last update (Unix timestamp).") + Required("repository", "group", "policyName", "version", "locked", "lastUpdate") }) var PoliciesRequest = Type("PoliciesRequest", func() { diff --git a/gen/http/cli/policy/cli.go b/gen/http/cli/policy/cli.go index b901113992ffc452cac13951552044c11b1a7a4d..c3babf308ec3120ebd1cf843c799561ccca586a6 100644 --- a/gen/http/cli/policy/cli.go +++ b/gen/http/cli/policy/cli.go @@ -30,7 +30,7 @@ health (liveness|readiness) // UsageExamples produces an example of a valid invocation of the CLI tool. func UsageExamples() string { - return os.Args[0] + ` policy evaluate --body "At incidunt unde consequatur voluptas dolorem nisi." --group "example" --policy-name "example" --version "1.0" --evaluation-id "Illum est et hic." --ttl 5942762461305129155` + "\n" + + return os.Args[0] + ` policy evaluate --body "Ad omnis quasi aut consequuntur quibusdam." --repository "policies" --group "example" --policy-name "example" --version "1.0" --evaluation-id "Deleniti non nihil dolor aut sed." --ttl 380312255088624933` + "\n" + os.Args[0] + ` health liveness` + "\n" + "" } @@ -49,6 +49,7 @@ func ParseEndpoint( policyEvaluateFlags = flag.NewFlagSet("evaluate", flag.ExitOnError) policyEvaluateBodyFlag = policyEvaluateFlags.String("body", "REQUIRED", "") + policyEvaluateRepositoryFlag = policyEvaluateFlags.String("repository", "REQUIRED", "Policy repository.") policyEvaluateGroupFlag = policyEvaluateFlags.String("group", "REQUIRED", "Policy group.") policyEvaluatePolicyNameFlag = policyEvaluateFlags.String("policy-name", "REQUIRED", "Policy name.") policyEvaluateVersionFlag = policyEvaluateFlags.String("version", "REQUIRED", "Policy version.") @@ -56,11 +57,13 @@ func ParseEndpoint( policyEvaluateTTLFlag = policyEvaluateFlags.String("ttl", "", "") policyLockFlags = flag.NewFlagSet("lock", flag.ExitOnError) + policyLockRepositoryFlag = policyLockFlags.String("repository", "REQUIRED", "Policy repository.") policyLockGroupFlag = policyLockFlags.String("group", "REQUIRED", "Policy group.") policyLockPolicyNameFlag = policyLockFlags.String("policy-name", "REQUIRED", "Policy name.") policyLockVersionFlag = policyLockFlags.String("version", "REQUIRED", "Policy version.") policyUnlockFlags = flag.NewFlagSet("unlock", flag.ExitOnError) + policyUnlockRepositoryFlag = policyUnlockFlags.String("repository", "REQUIRED", "Policy repository.") policyUnlockGroupFlag = policyUnlockFlags.String("group", "REQUIRED", "Policy group.") policyUnlockPolicyNameFlag = policyUnlockFlags.String("policy-name", "REQUIRED", "Policy name.") policyUnlockVersionFlag = policyUnlockFlags.String("version", "REQUIRED", "Policy version.") @@ -172,13 +175,13 @@ func ParseEndpoint( switch epn { case "evaluate": endpoint = c.Evaluate() - data, err = policyc.BuildEvaluatePayload(*policyEvaluateBodyFlag, *policyEvaluateGroupFlag, *policyEvaluatePolicyNameFlag, *policyEvaluateVersionFlag, *policyEvaluateEvaluationIDFlag, *policyEvaluateTTLFlag) + data, err = policyc.BuildEvaluatePayload(*policyEvaluateBodyFlag, *policyEvaluateRepositoryFlag, *policyEvaluateGroupFlag, *policyEvaluatePolicyNameFlag, *policyEvaluateVersionFlag, *policyEvaluateEvaluationIDFlag, *policyEvaluateTTLFlag) case "lock": endpoint = c.Lock() - data, err = policyc.BuildLockPayload(*policyLockGroupFlag, *policyLockPolicyNameFlag, *policyLockVersionFlag) + data, err = policyc.BuildLockPayload(*policyLockRepositoryFlag, *policyLockGroupFlag, *policyLockPolicyNameFlag, *policyLockVersionFlag) case "unlock": endpoint = c.Unlock() - data, err = policyc.BuildUnlockPayload(*policyUnlockGroupFlag, *policyUnlockPolicyNameFlag, *policyUnlockVersionFlag) + data, err = policyc.BuildUnlockPayload(*policyUnlockRepositoryFlag, *policyUnlockGroupFlag, *policyUnlockPolicyNameFlag, *policyUnlockVersionFlag) case "list-policies": endpoint = c.ListPolicies() data, err = policyc.BuildListPoliciesPayload(*policyListPoliciesLockedFlag, *policyListPoliciesRegoFlag, *policyListPoliciesDataFlag, *policyListPoliciesDataConfigFlag) @@ -219,10 +222,11 @@ Additional help: `, os.Args[0]) } func policyEvaluateUsage() { - fmt.Fprintf(os.Stderr, `%[1]s [flags] policy evaluate -body JSON -group STRING -policy-name STRING -version STRING -evaluation-id STRING -ttl INT + fmt.Fprintf(os.Stderr, `%[1]s [flags] policy evaluate -body JSON -repository STRING -group STRING -policy-name STRING -version STRING -evaluation-id STRING -ttl INT Evaluate executes a policy with the given 'data' as input. -body JSON: + -repository STRING: Policy repository. -group STRING: Policy group. -policy-name STRING: Policy name. -version STRING: Policy version. @@ -230,33 +234,35 @@ Evaluate executes a policy with the given 'data' as input. -ttl INT: Example: - %[1]s policy evaluate --body "At incidunt unde consequatur voluptas dolorem nisi." --group "example" --policy-name "example" --version "1.0" --evaluation-id "Illum est et hic." --ttl 5942762461305129155 + %[1]s policy evaluate --body "Ad omnis quasi aut consequuntur quibusdam." --repository "policies" --group "example" --policy-name "example" --version "1.0" --evaluation-id "Deleniti non nihil dolor aut sed." --ttl 380312255088624933 `, os.Args[0]) } func policyLockUsage() { - fmt.Fprintf(os.Stderr, `%[1]s [flags] policy lock -group STRING -policy-name STRING -version STRING + fmt.Fprintf(os.Stderr, `%[1]s [flags] policy lock -repository STRING -group STRING -policy-name STRING -version STRING Lock a policy so that it cannot be evaluated. + -repository STRING: Policy repository. -group STRING: Policy group. -policy-name STRING: Policy name. -version STRING: Policy version. Example: - %[1]s policy lock --group "At eos facilis molestias in voluptas rem." --policy-name "Ab accusantium ut ut aliquid sint animi." --version "Dolorem cumque laborum quis nesciunt." + %[1]s policy lock --repository "Dolorem cumque laborum quis nesciunt." --group "Aut voluptas." --policy-name "Sint nam voluptatem ea consequatur similique et." --version "Non mollitia nesciunt impedit facere." `, os.Args[0]) } func policyUnlockUsage() { - fmt.Fprintf(os.Stderr, `%[1]s [flags] policy unlock -group STRING -policy-name STRING -version STRING + fmt.Fprintf(os.Stderr, `%[1]s [flags] policy unlock -repository STRING -group STRING -policy-name STRING -version STRING Unlock a policy so it can be evaluated again. + -repository STRING: Policy repository. -group STRING: Policy group. -policy-name STRING: Policy name. -version STRING: Policy version. Example: - %[1]s policy unlock --group "Ut commodi perspiciatis corporis." --policy-name "Accusamus autem sequi." --version "Et nulla." + %[1]s policy unlock --repository "Sunt in et quia cum." --group "Commodi nemo fugiat id praesentium accusantium expedita." --policy-name "Qui non quia." --version "Error maxime quasi quia non voluptatibus error." `, os.Args[0]) } @@ -270,7 +276,7 @@ List policies from storage with optional filters. -data-config BOOL: Example: - %[1]s policy list-policies --locked true --rego true --data true --data-config false + %[1]s policy list-policies --locked false --rego false --data false --data-config true `, os.Args[0]) } diff --git a/gen/http/openapi.json b/gen/http/openapi.json index 0c90717db27a6f1e14fca62fdba708f7dde42446..1d133bebf1ce400e47fef786529c841549341476 100644 --- a/gen/http/openapi.json +++ b/gen/http/openapi.json @@ -1 +1 @@ -{"swagger":"2.0","info":{"title":"Policy Service","description":"The policy service exposes HTTP API for executing policies.","version":""},"host":"localhost:8081","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/liveness":{"get":{"tags":["health"],"summary":"Liveness health","operationId":"health#Liveness","responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HealthLivenessResponseBody","required":["service","status","version"]}}},"schemes":["http"]}},"/policy/{group}/{policyName}/{version}/evaluation":{"get":{"tags":["policy"],"summary":"Evaluate policy","description":"Evaluate executes a policy with the given 'data' as input.","operationId":"policy#Evaluate#1","parameters":[{"name":"group","in":"path","description":"Policy group.","required":true,"type":"string"},{"name":"policyName","in":"path","description":"Policy name.","required":true,"type":"string"},{"name":"version","in":"path","description":"Policy version.","required":true,"type":"string"},{"name":"x-evaluation-id","in":"header","description":"EvaluationID allows overwriting the randomly generated evaluationID","required":false,"type":"string"},{"name":"x-cache-ttl","in":"header","description":"Policy result cache TTL in seconds","required":false,"type":"integer"},{"name":"any","in":"body","description":"Input data passed to the policy execution runtime.","required":true,"schema":{"type":"string","format":"binary"}}],"responses":{"200":{"description":"OK response.","schema":{"type":"string","format":"binary"},"headers":{"ETag":{"description":"ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.","type":"string"}}}},"schemes":["http"]},"post":{"tags":["policy"],"summary":"Evaluate policy","description":"Evaluate executes a policy with the given 'data' as input.","operationId":"policy#Evaluate#2","parameters":[{"name":"group","in":"path","description":"Policy group.","required":true,"type":"string"},{"name":"policyName","in":"path","description":"Policy name.","required":true,"type":"string"},{"name":"version","in":"path","description":"Policy version.","required":true,"type":"string"},{"name":"x-evaluation-id","in":"header","description":"EvaluationID allows overwriting the randomly generated evaluationID","required":false,"type":"string"},{"name":"x-cache-ttl","in":"header","description":"Policy result cache TTL in seconds","required":false,"type":"integer"},{"name":"any","in":"body","description":"Input data passed to the policy execution runtime.","required":true,"schema":{"type":"string","format":"binary"}}],"responses":{"200":{"description":"OK response.","schema":{"type":"string","format":"binary"},"headers":{"ETag":{"description":"ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.","type":"string"}}}},"schemes":["http"]}},"/policy/{group}/{policyName}/{version}/evaluation/did.json":{"get":{"tags":["policy"],"summary":"Evaluate policy","description":"Evaluate executes a policy with the given 'data' as input.","operationId":"policy#Evaluate","parameters":[{"name":"group","in":"path","description":"Policy group.","required":true,"type":"string"},{"name":"policyName","in":"path","description":"Policy name.","required":true,"type":"string"},{"name":"version","in":"path","description":"Policy version.","required":true,"type":"string"},{"name":"x-evaluation-id","in":"header","description":"EvaluationID allows overwriting the randomly generated evaluationID","required":false,"type":"string"},{"name":"x-cache-ttl","in":"header","description":"Policy result cache TTL in seconds","required":false,"type":"integer"},{"name":"any","in":"body","description":"Input data passed to the policy execution runtime.","required":true,"schema":{"type":"string","format":"binary"}}],"responses":{"200":{"description":"OK response.","schema":{"type":"string","format":"binary"},"headers":{"ETag":{"description":"ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.","type":"string"}}}},"schemes":["http"]}},"/policy/{group}/{policyName}/{version}/lock":{"post":{"tags":["policy"],"summary":"Lock policy","description":"Lock a policy so that it cannot be evaluated.","operationId":"policy#Lock","parameters":[{"name":"group","in":"path","description":"Policy group.","required":true,"type":"string"},{"name":"policyName","in":"path","description":"Policy name.","required":true,"type":"string"},{"name":"version","in":"path","description":"Policy version.","required":true,"type":"string"}],"responses":{"200":{"description":"OK response."}},"schemes":["http"]},"delete":{"tags":["policy"],"summary":"Unlock policy","description":"Unlock a policy so it can be evaluated again.","operationId":"policy#Unlock","parameters":[{"name":"group","in":"path","description":"Policy group.","required":true,"type":"string"},{"name":"policyName","in":"path","description":"Policy name.","required":true,"type":"string"},{"name":"version","in":"path","description":"Policy version.","required":true,"type":"string"}],"responses":{"200":{"description":"OK response."}},"schemes":["http"]}},"/readiness":{"get":{"tags":["health"],"summary":"Readiness health","operationId":"health#Readiness","responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HealthReadinessResponseBody","required":["service","status","version"]}}},"schemes":["http"]}},"/v1/policies":{"get":{"tags":["policy"],"summary":"ListPolicies policy","description":"List policies from storage with optional filters.","operationId":"policy#ListPolicies","parameters":[{"name":"locked","in":"query","description":"Filter to return locked/unlocked policies (optional).","required":false,"type":"boolean"},{"name":"rego","in":"query","description":"Include policy source code in results (optional).","required":false,"type":"boolean"},{"name":"data","in":"query","description":"Include policy static data in results (optional). ","required":false,"type":"boolean"},{"name":"dataConfig","in":"query","description":"Include static data config (optional).","required":false,"type":"boolean"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/PolicyListPoliciesResponseBody","required":["policies"]}}},"schemes":["http"]}}},"definitions":{"HealthLivenessResponseBody":{"title":"HealthLivenessResponseBody","type":"object","properties":{"service":{"type":"string","description":"Service name.","example":"Quasi delectus debitis consectetur rerum vel sunt."},"status":{"type":"string","description":"Status message.","example":"Ea architecto iure est similique architecto id."},"version":{"type":"string","description":"Service runtime version.","example":"Ut est ut molestias sint ipsam."}},"example":{"service":"At ut dolore.","status":"Aperiam aut odio dolorum.","version":"Quae et et unde."},"required":["service","status","version"]},"HealthReadinessResponseBody":{"title":"HealthReadinessResponseBody","type":"object","properties":{"service":{"type":"string","description":"Service name.","example":"Dolore ducimus accusamus et voluptatibus cupiditate."},"status":{"type":"string","description":"Status message.","example":"Repellat inventore ut doloremque recusandae earum et."},"version":{"type":"string","description":"Service runtime version.","example":"Nisi vitae iure fugiat sed sit dolores."}},"example":{"service":"Ut quibusdam.","status":"Eaque fugiat et.","version":"Vel non quo."},"required":["service","status","version"]},"PolicyListPoliciesResponseBody":{"title":"PolicyListPoliciesResponseBody","type":"object","properties":{"policies":{"type":"array","items":{"$ref":"#/definitions/PolicyResponseBody"},"description":"JSON array of policies.","example":[{"data":"Optio quia et laborum.","dataConfig":"In libero perspiciatis voluptatum ut soluta.","group":"Commodi nemo fugiat id praesentium accusantium expedita.","lastUpdate":9002532952206938167,"locked":false,"policyName":"Et aliquam sunt in et quia cum.","rego":"Error maxime quasi quia non voluptatibus error.","version":"Qui non quia."},{"data":"Optio quia et laborum.","dataConfig":"In libero perspiciatis voluptatum ut soluta.","group":"Commodi nemo fugiat id praesentium accusantium expedita.","lastUpdate":9002532952206938167,"locked":false,"policyName":"Et aliquam sunt in et quia cum.","rego":"Error maxime quasi quia non voluptatibus error.","version":"Qui non quia."}]}},"example":{"policies":[{"data":"Optio quia et laborum.","dataConfig":"In libero perspiciatis voluptatum ut soluta.","group":"Commodi nemo fugiat id praesentium accusantium expedita.","lastUpdate":9002532952206938167,"locked":false,"policyName":"Et aliquam sunt in et quia cum.","rego":"Error maxime quasi quia non voluptatibus error.","version":"Qui non quia."},{"data":"Optio quia et laborum.","dataConfig":"In libero perspiciatis voluptatum ut soluta.","group":"Commodi nemo fugiat id praesentium accusantium expedita.","lastUpdate":9002532952206938167,"locked":false,"policyName":"Et aliquam sunt in et quia cum.","rego":"Error maxime quasi quia non voluptatibus error.","version":"Qui non quia."}]},"required":["policies"]},"PolicyResponseBody":{"title":"PolicyResponseBody","type":"object","properties":{"data":{"type":"string","description":"Policy static data.","example":"Voluptate amet."},"dataConfig":{"type":"string","description":"Policy static data optional configuration.","example":"Aut et."},"group":{"type":"string","description":"Policy group.","example":"Totam officia necessitatibus tempore nulla animi."},"lastUpdate":{"type":"integer","description":"Last update (Unix timestamp).","example":4355437808814429430,"format":"int64"},"locked":{"type":"boolean","description":"Locked specifies if the policy is locked or allowed to execute.","example":true},"policyName":{"type":"string","description":"Policy name.","example":"Corporis est rem."},"rego":{"type":"string","description":"Policy rego source code.","example":"Vitae dolores quas et aperiam dolores reiciendis."},"version":{"type":"string","description":"Policy version.","example":"Consequatur vel rerum rem ipsam nam."}},"example":{"data":"Aut asperiores.","dataConfig":"Vel dolores omnis molestiae tempora sed repellendus.","group":"Et dolores.","lastUpdate":8993739598055578473,"locked":false,"policyName":"Minus fugiat veritatis quam qui nostrum eaque.","rego":"Ipsa ad voluptatum maxime ut.","version":"Delectus rerum molestiae possimus cum laboriosam."},"required":["group","policyName","version","locked","lastUpdate"]}}} \ No newline at end of file +{"swagger":"2.0","info":{"title":"Policy Service","description":"The policy service exposes HTTP API for executing policies.","version":""},"host":"localhost:8081","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/liveness":{"get":{"tags":["health"],"summary":"Liveness health","operationId":"health#Liveness","responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HealthLivenessResponseBody","required":["service","status","version"]}}},"schemes":["http"]}},"/policy/{repository}/{group}/{policyName}/{version}/evaluation":{"get":{"tags":["policy"],"summary":"Evaluate policy","description":"Evaluate executes a policy with the given 'data' as input.","operationId":"policy#Evaluate#1","parameters":[{"name":"repository","in":"path","description":"Policy repository.","required":true,"type":"string"},{"name":"group","in":"path","description":"Policy group.","required":true,"type":"string"},{"name":"policyName","in":"path","description":"Policy name.","required":true,"type":"string"},{"name":"version","in":"path","description":"Policy version.","required":true,"type":"string"},{"name":"x-evaluation-id","in":"header","description":"EvaluationID allows overwriting the randomly generated evaluationID","required":false,"type":"string"},{"name":"x-cache-ttl","in":"header","description":"Policy result cache TTL in seconds","required":false,"type":"integer"},{"name":"any","in":"body","description":"Input data passed to the policy execution runtime.","required":true,"schema":{"type":"string","format":"binary"}}],"responses":{"200":{"description":"OK response.","schema":{"type":"string","format":"binary"},"headers":{"ETag":{"description":"ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.","type":"string"}}}},"schemes":["http"]},"post":{"tags":["policy"],"summary":"Evaluate policy","description":"Evaluate executes a policy with the given 'data' as input.","operationId":"policy#Evaluate#2","parameters":[{"name":"repository","in":"path","description":"Policy repository.","required":true,"type":"string"},{"name":"group","in":"path","description":"Policy group.","required":true,"type":"string"},{"name":"policyName","in":"path","description":"Policy name.","required":true,"type":"string"},{"name":"version","in":"path","description":"Policy version.","required":true,"type":"string"},{"name":"x-evaluation-id","in":"header","description":"EvaluationID allows overwriting the randomly generated evaluationID","required":false,"type":"string"},{"name":"x-cache-ttl","in":"header","description":"Policy result cache TTL in seconds","required":false,"type":"integer"},{"name":"any","in":"body","description":"Input data passed to the policy execution runtime.","required":true,"schema":{"type":"string","format":"binary"}}],"responses":{"200":{"description":"OK response.","schema":{"type":"string","format":"binary"},"headers":{"ETag":{"description":"ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.","type":"string"}}}},"schemes":["http"]}},"/policy/{repository}/{group}/{policyName}/{version}/evaluation/did.json":{"get":{"tags":["policy"],"summary":"Evaluate policy","description":"Evaluate executes a policy with the given 'data' as input.","operationId":"policy#Evaluate","parameters":[{"name":"repository","in":"path","description":"Policy repository.","required":true,"type":"string"},{"name":"group","in":"path","description":"Policy group.","required":true,"type":"string"},{"name":"policyName","in":"path","description":"Policy name.","required":true,"type":"string"},{"name":"version","in":"path","description":"Policy version.","required":true,"type":"string"},{"name":"x-evaluation-id","in":"header","description":"EvaluationID allows overwriting the randomly generated evaluationID","required":false,"type":"string"},{"name":"x-cache-ttl","in":"header","description":"Policy result cache TTL in seconds","required":false,"type":"integer"},{"name":"any","in":"body","description":"Input data passed to the policy execution runtime.","required":true,"schema":{"type":"string","format":"binary"}}],"responses":{"200":{"description":"OK response.","schema":{"type":"string","format":"binary"},"headers":{"ETag":{"description":"ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.","type":"string"}}}},"schemes":["http"]}},"/policy/{repository}/{group}/{policyName}/{version}/lock":{"post":{"tags":["policy"],"summary":"Lock policy","description":"Lock a policy so that it cannot be evaluated.","operationId":"policy#Lock","parameters":[{"name":"repository","in":"path","description":"Policy repository.","required":true,"type":"string"},{"name":"group","in":"path","description":"Policy group.","required":true,"type":"string"},{"name":"policyName","in":"path","description":"Policy name.","required":true,"type":"string"},{"name":"version","in":"path","description":"Policy version.","required":true,"type":"string"}],"responses":{"200":{"description":"OK response."}},"schemes":["http"]},"delete":{"tags":["policy"],"summary":"Unlock policy","description":"Unlock a policy so it can be evaluated again.","operationId":"policy#Unlock","parameters":[{"name":"repository","in":"path","description":"Policy repository.","required":true,"type":"string"},{"name":"group","in":"path","description":"Policy group.","required":true,"type":"string"},{"name":"policyName","in":"path","description":"Policy name.","required":true,"type":"string"},{"name":"version","in":"path","description":"Policy version.","required":true,"type":"string"}],"responses":{"200":{"description":"OK response."}},"schemes":["http"]}},"/readiness":{"get":{"tags":["health"],"summary":"Readiness health","operationId":"health#Readiness","responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/HealthReadinessResponseBody","required":["service","status","version"]}}},"schemes":["http"]}},"/v1/policies":{"get":{"tags":["policy"],"summary":"ListPolicies policy","description":"List policies from storage with optional filters.","operationId":"policy#ListPolicies","parameters":[{"name":"locked","in":"query","description":"Filter to return locked/unlocked policies (optional).","required":false,"type":"boolean"},{"name":"rego","in":"query","description":"Include policy source code in results (optional).","required":false,"type":"boolean"},{"name":"data","in":"query","description":"Include policy static data in results (optional). ","required":false,"type":"boolean"},{"name":"dataConfig","in":"query","description":"Include static data config (optional).","required":false,"type":"boolean"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/PolicyListPoliciesResponseBody","required":["policies"]}}},"schemes":["http"]}}},"definitions":{"HealthLivenessResponseBody":{"title":"HealthLivenessResponseBody","type":"object","properties":{"service":{"type":"string","description":"Service name.","example":"Voluptatibus cupiditate ea repellat inventore."},"status":{"type":"string","description":"Status message.","example":"Doloremque recusandae earum."},"version":{"type":"string","description":"Service runtime version.","example":"Quis nisi."}},"example":{"service":"Iure fugiat sed sit dolores iusto ut.","status":"Et eaque.","version":"Et mollitia."},"required":["service","status","version"]},"HealthReadinessResponseBody":{"title":"HealthReadinessResponseBody","type":"object","properties":{"service":{"type":"string","description":"Service name.","example":"Non quo ut molestias rerum sunt."},"status":{"type":"string","description":"Status message.","example":"Omnis dolores totam voluptatem rerum."},"version":{"type":"string","description":"Service runtime version.","example":"Architecto et enim omnis."}},"example":{"service":"Est impedit.","status":"Consequatur ut suscipit.","version":"Neque et sed modi accusantium."},"required":["service","status","version"]},"PolicyListPoliciesResponseBody":{"title":"PolicyListPoliciesResponseBody","type":"object","properties":{"policies":{"type":"array","items":{"$ref":"#/definitions/PolicyResponseBody"},"description":"JSON array of policies.","example":[{"data":"Voluptas ad corporis adipisci inventore ipsum.","dataConfig":"Recusandae dolorum nisi distinctio vitae ad.","group":"Accusamus enim.","lastUpdate":4303309286764032455,"locked":true,"policyName":"Ut amet.","rego":"Quam dolores architecto itaque.","repository":"Reprehenderit in libero perspiciatis voluptatum ut soluta.","version":"Recusandae est rerum corrupti quia."},{"data":"Voluptas ad corporis adipisci inventore ipsum.","dataConfig":"Recusandae dolorum nisi distinctio vitae ad.","group":"Accusamus enim.","lastUpdate":4303309286764032455,"locked":true,"policyName":"Ut amet.","rego":"Quam dolores architecto itaque.","repository":"Reprehenderit in libero perspiciatis voluptatum ut soluta.","version":"Recusandae est rerum corrupti quia."},{"data":"Voluptas ad corporis adipisci inventore ipsum.","dataConfig":"Recusandae dolorum nisi distinctio vitae ad.","group":"Accusamus enim.","lastUpdate":4303309286764032455,"locked":true,"policyName":"Ut amet.","rego":"Quam dolores architecto itaque.","repository":"Reprehenderit in libero perspiciatis voluptatum ut soluta.","version":"Recusandae est rerum corrupti quia."}]}},"example":{"policies":[{"data":"Voluptas ad corporis adipisci inventore ipsum.","dataConfig":"Recusandae dolorum nisi distinctio vitae ad.","group":"Accusamus enim.","lastUpdate":4303309286764032455,"locked":true,"policyName":"Ut amet.","rego":"Quam dolores architecto itaque.","repository":"Reprehenderit in libero perspiciatis voluptatum ut soluta.","version":"Recusandae est rerum corrupti quia."},{"data":"Voluptas ad corporis adipisci inventore ipsum.","dataConfig":"Recusandae dolorum nisi distinctio vitae ad.","group":"Accusamus enim.","lastUpdate":4303309286764032455,"locked":true,"policyName":"Ut amet.","rego":"Quam dolores architecto itaque.","repository":"Reprehenderit in libero perspiciatis voluptatum ut soluta.","version":"Recusandae est rerum corrupti quia."}]},"required":["policies"]},"PolicyResponseBody":{"title":"PolicyResponseBody","type":"object","properties":{"data":{"type":"string","description":"Policy static data.","example":"Aut asperiores."},"dataConfig":{"type":"string","description":"Policy static data optional configuration.","example":"Vel dolores omnis molestiae tempora sed repellendus."},"group":{"type":"string","description":"Policy group.","example":"Et dolores."},"lastUpdate":{"type":"integer","description":"Last update (Unix timestamp).","example":8993739598055578473,"format":"int64"},"locked":{"type":"boolean","description":"Locked specifies if the policy is locked or allowed to execute.","example":false},"policyName":{"type":"string","description":"Policy name.","example":"Veritatis quam qui nostrum eaque."},"rego":{"type":"string","description":"Policy rego source code.","example":"Ipsa ad voluptatum maxime ut."},"repository":{"type":"string","description":"Policy repository.","example":"Maiores et minus."},"version":{"type":"string","description":"Policy version.","example":"Delectus rerum molestiae possimus cum laboriosam."}},"example":{"data":"Aperiam aut odio dolorum.","dataConfig":"Quae et et unde.","group":"Ea architecto iure est similique architecto id.","lastUpdate":2495518142683426670,"locked":false,"policyName":"Consectetur rerum vel sunt.","rego":"At ut dolore.","repository":"Vel voluptate quasi delectus.","version":"Ut est ut molestias sint ipsam."},"required":["repository","group","policyName","version","locked","lastUpdate"]}}} \ No newline at end of file diff --git a/gen/http/openapi.yaml b/gen/http/openapi.yaml index 0c3ffc8c7d8179ee284133fb671548183308817f..b55558423e73a3215335a5fe32e26b12f6a18e52 100644 --- a/gen/http/openapi.yaml +++ b/gen/http/openapi.yaml @@ -30,7 +30,7 @@ paths: - version schemes: - http - /policy/{group}/{policyName}/{version}/evaluation: + /policy/{repository}/{group}/{policyName}/{version}/evaluation: get: tags: - policy @@ -38,6 +38,11 @@ paths: description: Evaluate executes a policy with the given 'data' as input. operationId: policy#Evaluate#1 parameters: + - name: repository + in: path + description: Policy repository. + required: true + type: string - name: group in: path description: Policy group. @@ -89,6 +94,11 @@ paths: description: Evaluate executes a policy with the given 'data' as input. operationId: policy#Evaluate#2 parameters: + - name: repository + in: path + description: Policy repository. + required: true + type: string - name: group in: path description: Policy group. @@ -133,7 +143,7 @@ paths: type: string schemes: - http - /policy/{group}/{policyName}/{version}/evaluation/did.json: + /policy/{repository}/{group}/{policyName}/{version}/evaluation/did.json: get: tags: - policy @@ -141,6 +151,11 @@ paths: description: Evaluate executes a policy with the given 'data' as input. operationId: policy#Evaluate parameters: + - name: repository + in: path + description: Policy repository. + required: true + type: string - name: group in: path description: Policy group. @@ -185,7 +200,7 @@ paths: type: string schemes: - http - /policy/{group}/{policyName}/{version}/lock: + /policy/{repository}/{group}/{policyName}/{version}/lock: post: tags: - policy @@ -193,6 +208,11 @@ paths: description: Lock a policy so that it cannot be evaluated. operationId: policy#Lock parameters: + - name: repository + in: path + description: Policy repository. + required: true + type: string - name: group in: path description: Policy group. @@ -220,6 +240,11 @@ paths: description: Unlock a policy so it can be evaluated again. operationId: policy#Unlock parameters: + - name: repository + in: path + description: Policy repository. + required: true + type: string - name: group in: path description: Policy group. @@ -302,19 +327,19 @@ definitions: service: type: string description: Service name. - example: Quasi delectus debitis consectetur rerum vel sunt. + example: Voluptatibus cupiditate ea repellat inventore. status: type: string description: Status message. - example: Ea architecto iure est similique architecto id. + example: Doloremque recusandae earum. version: type: string description: Service runtime version. - example: Ut est ut molestias sint ipsam. + example: Quis nisi. example: - service: At ut dolore. - status: Aperiam aut odio dolorum. - version: Quae et et unde. + service: Iure fugiat sed sit dolores iusto ut. + status: Et eaque. + version: Et mollitia. required: - service - status @@ -326,19 +351,19 @@ definitions: service: type: string description: Service name. - example: Dolore ducimus accusamus et voluptatibus cupiditate. + example: Non quo ut molestias rerum sunt. status: type: string description: Status message. - example: Repellat inventore ut doloremque recusandae earum et. + example: Omnis dolores totam voluptatem rerum. version: type: string description: Service runtime version. - example: Nisi vitae iure fugiat sed sit dolores. + example: Architecto et enim omnis. example: - service: Ut quibusdam. - status: Eaque fugiat et. - version: Vel non quo. + service: Est impedit. + status: Consequatur ut suscipit. + version: Neque et sed modi accusantium. required: - service - status @@ -353,40 +378,53 @@ definitions: $ref: '#/definitions/PolicyResponseBody' description: JSON array of policies. example: - - data: Optio quia et laborum. - dataConfig: In libero perspiciatis voluptatum ut soluta. - group: Commodi nemo fugiat id praesentium accusantium expedita. - lastUpdate: 9002532952206938167 - locked: false - policyName: Et aliquam sunt in et quia cum. - rego: Error maxime quasi quia non voluptatibus error. - version: Qui non quia. - - data: Optio quia et laborum. - dataConfig: In libero perspiciatis voluptatum ut soluta. - group: Commodi nemo fugiat id praesentium accusantium expedita. - lastUpdate: 9002532952206938167 - locked: false - policyName: Et aliquam sunt in et quia cum. - rego: Error maxime quasi quia non voluptatibus error. - version: Qui non quia. + - data: Voluptas ad corporis adipisci inventore ipsum. + dataConfig: Recusandae dolorum nisi distinctio vitae ad. + group: Accusamus enim. + lastUpdate: 4303309286764032455 + locked: true + policyName: Ut amet. + rego: Quam dolores architecto itaque. + repository: Reprehenderit in libero perspiciatis voluptatum ut soluta. + version: Recusandae est rerum corrupti quia. + - data: Voluptas ad corporis adipisci inventore ipsum. + dataConfig: Recusandae dolorum nisi distinctio vitae ad. + group: Accusamus enim. + lastUpdate: 4303309286764032455 + locked: true + policyName: Ut amet. + rego: Quam dolores architecto itaque. + repository: Reprehenderit in libero perspiciatis voluptatum ut soluta. + version: Recusandae est rerum corrupti quia. + - data: Voluptas ad corporis adipisci inventore ipsum. + dataConfig: Recusandae dolorum nisi distinctio vitae ad. + group: Accusamus enim. + lastUpdate: 4303309286764032455 + locked: true + policyName: Ut amet. + rego: Quam dolores architecto itaque. + repository: Reprehenderit in libero perspiciatis voluptatum ut soluta. + version: Recusandae est rerum corrupti quia. example: policies: - - data: Optio quia et laborum. - dataConfig: In libero perspiciatis voluptatum ut soluta. - group: Commodi nemo fugiat id praesentium accusantium expedita. - lastUpdate: 9002532952206938167 - locked: false - policyName: Et aliquam sunt in et quia cum. - rego: Error maxime quasi quia non voluptatibus error. - version: Qui non quia. - - data: Optio quia et laborum. - dataConfig: In libero perspiciatis voluptatum ut soluta. - group: Commodi nemo fugiat id praesentium accusantium expedita. - lastUpdate: 9002532952206938167 - locked: false - policyName: Et aliquam sunt in et quia cum. - rego: Error maxime quasi quia non voluptatibus error. - version: Qui non quia. + - data: Voluptas ad corporis adipisci inventore ipsum. + dataConfig: Recusandae dolorum nisi distinctio vitae ad. + group: Accusamus enim. + lastUpdate: 4303309286764032455 + locked: true + policyName: Ut amet. + rego: Quam dolores architecto itaque. + repository: Reprehenderit in libero perspiciatis voluptatum ut soluta. + version: Recusandae est rerum corrupti quia. + - data: Voluptas ad corporis adipisci inventore ipsum. + dataConfig: Recusandae dolorum nisi distinctio vitae ad. + group: Accusamus enim. + lastUpdate: 4303309286764032455 + locked: true + policyName: Ut amet. + rego: Quam dolores architecto itaque. + repository: Reprehenderit in libero perspiciatis voluptatum ut soluta. + version: Recusandae est rerum corrupti quia. required: - policies PolicyResponseBody: @@ -396,46 +434,52 @@ definitions: data: type: string description: Policy static data. - example: Voluptate amet. + example: Aut asperiores. dataConfig: type: string description: Policy static data optional configuration. - example: Aut et. + example: Vel dolores omnis molestiae tempora sed repellendus. group: type: string description: Policy group. - example: Totam officia necessitatibus tempore nulla animi. + example: Et dolores. lastUpdate: type: integer description: Last update (Unix timestamp). - example: 4355437808814429430 + example: 8993739598055578473 format: int64 locked: type: boolean description: Locked specifies if the policy is locked or allowed to execute. - example: true + example: false policyName: type: string description: Policy name. - example: Corporis est rem. + example: Veritatis quam qui nostrum eaque. rego: type: string description: Policy rego source code. - example: Vitae dolores quas et aperiam dolores reiciendis. + example: Ipsa ad voluptatum maxime ut. + repository: + type: string + description: Policy repository. + example: Maiores et minus. version: type: string description: Policy version. - example: Consequatur vel rerum rem ipsam nam. + example: Delectus rerum molestiae possimus cum laboriosam. example: - data: Aut asperiores. - dataConfig: Vel dolores omnis molestiae tempora sed repellendus. - group: Et dolores. - lastUpdate: 8993739598055578473 + data: Aperiam aut odio dolorum. + dataConfig: Quae et et unde. + group: Ea architecto iure est similique architecto id. + lastUpdate: 2495518142683426670 locked: false - policyName: Minus fugiat veritatis quam qui nostrum eaque. - rego: Ipsa ad voluptatum maxime ut. - version: Delectus rerum molestiae possimus cum laboriosam. + policyName: Consectetur rerum vel sunt. + rego: At ut dolore. + repository: Vel voluptate quasi delectus. + version: Ut est ut molestias sint ipsam. required: + - repository - group - policyName - version diff --git a/gen/http/openapi3.json b/gen/http/openapi3.json index d83285dd02cd7021a5a2eb4c985cd34f6c315bdc..9c166a184a5f13cd1e59f6470e614a9b78d7aad6 100644 --- a/gen/http/openapi3.json +++ b/gen/http/openapi3.json @@ -1 +1 @@ -{"openapi":"3.0.3","info":{"title":"Policy Service","description":"The policy service exposes HTTP API for executing policies.","version":"1.0"},"servers":[{"url":"http://localhost:8081","description":"Policy Server"}],"paths":{"/liveness":{"get":{"tags":["health"],"summary":"Liveness health","operationId":"health#Liveness","responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"},"example":{"service":"Accusamus enim.","status":"Recusandae est rerum corrupti quia.","version":"Quam dolores architecto itaque."}}}}}}},"/policy/{group}/{policyName}/{version}/evaluation":{"get":{"tags":["policy"],"summary":"Evaluate policy","description":"Evaluate executes a policy with the given 'data' as input.","operationId":"policy#Evaluate#1","parameters":[{"name":"group","in":"path","description":"Policy group.","required":true,"schema":{"type":"string","description":"Policy group.","example":"example"},"example":"example"},{"name":"policyName","in":"path","description":"Policy name.","required":true,"schema":{"type":"string","description":"Policy name.","example":"example"},"example":"example"},{"name":"version","in":"path","description":"Policy version.","required":true,"schema":{"type":"string","description":"Policy version.","example":"1.0"},"example":"1.0"},{"name":"x-evaluation-id","in":"header","description":"EvaluationID allows overwriting the randomly generated evaluationID","allowEmptyValue":true,"schema":{"type":"string","description":"EvaluationID allows overwriting the randomly generated evaluationID","example":"did:web:example.com"},"example":"did:web:example.com"},{"name":"x-cache-ttl","in":"header","description":"Policy result cache TTL in seconds","allowEmptyValue":true,"schema":{"type":"integer","description":"Policy result cache TTL in seconds","example":60,"format":"int64"},"example":60}],"requestBody":{"description":"Input data passed to the policy execution runtime.","required":true,"content":{"application/json":{"schema":{"type":"string","description":"Input data passed to the policy execution runtime.","example":"Molestias rerum sunt eaque.","format":"binary"},"example":"Dignissimos enim."}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.","required":true,"schema":{"type":"string","description":"ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.","example":"Error et sunt maxime aperiam."},"example":"Et exercitationem perspiciatis quidem accusamus."}},"content":{"application/json":{"schema":{"type":"string","description":"Arbitrary JSON response.","example":"Dolores totam voluptatem.","format":"binary"},"example":"Molestiae fugiat harum quia corporis ullam natus."}}}}},"post":{"tags":["policy"],"summary":"Evaluate policy","description":"Evaluate executes a policy with the given 'data' as input.","operationId":"policy#Evaluate#2","parameters":[{"name":"group","in":"path","description":"Policy group.","required":true,"schema":{"type":"string","description":"Policy group.","example":"example"},"example":"example"},{"name":"policyName","in":"path","description":"Policy name.","required":true,"schema":{"type":"string","description":"Policy name.","example":"example"},"example":"example"},{"name":"version","in":"path","description":"Policy version.","required":true,"schema":{"type":"string","description":"Policy version.","example":"1.0"},"example":"1.0"},{"name":"x-evaluation-id","in":"header","description":"EvaluationID allows overwriting the randomly generated evaluationID","allowEmptyValue":true,"schema":{"type":"string","description":"EvaluationID allows overwriting the randomly generated evaluationID","example":"did:web:example.com"},"example":"did:web:example.com"},{"name":"x-cache-ttl","in":"header","description":"Policy result cache TTL in seconds","allowEmptyValue":true,"schema":{"type":"integer","description":"Policy result cache TTL in seconds","example":60,"format":"int64"},"example":60}],"requestBody":{"description":"Input data passed to the policy execution runtime.","required":true,"content":{"application/json":{"schema":{"type":"string","description":"Input data passed to the policy execution runtime.","example":"Molestias rerum sunt eaque.","format":"binary"},"example":"Animi omnis minima fuga numquam."}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.","required":true,"schema":{"type":"string","description":"ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.","example":"Ipsum explicabo assumenda delectus."},"example":"Rerum saepe dolores laborum odio."}},"content":{"application/json":{"schema":{"type":"string","description":"Arbitrary JSON response.","example":"Dolores totam voluptatem.","format":"binary"},"example":"Eos nemo repudiandae."}}}}}},"/policy/{group}/{policyName}/{version}/evaluation/did.json":{"get":{"tags":["policy"],"summary":"Evaluate policy","description":"Evaluate executes a policy with the given 'data' as input.","operationId":"policy#Evaluate","parameters":[{"name":"group","in":"path","description":"Policy group.","required":true,"schema":{"type":"string","description":"Policy group.","example":"example"},"example":"example"},{"name":"policyName","in":"path","description":"Policy name.","required":true,"schema":{"type":"string","description":"Policy name.","example":"example"},"example":"example"},{"name":"version","in":"path","description":"Policy version.","required":true,"schema":{"type":"string","description":"Policy version.","example":"1.0"},"example":"1.0"},{"name":"x-evaluation-id","in":"header","description":"EvaluationID allows overwriting the randomly generated evaluationID","allowEmptyValue":true,"schema":{"type":"string","description":"EvaluationID allows overwriting the randomly generated evaluationID","example":"did:web:example.com"},"example":"did:web:example.com"},{"name":"x-cache-ttl","in":"header","description":"Policy result cache TTL in seconds","allowEmptyValue":true,"schema":{"type":"integer","description":"Policy result cache TTL in seconds","example":60,"format":"int64"},"example":60}],"requestBody":{"description":"Input data passed to the policy execution runtime.","required":true,"content":{"application/json":{"schema":{"type":"string","description":"Input data passed to the policy execution runtime.","example":"Molestias rerum sunt eaque.","format":"binary"},"example":"Dolorem aut accusantium."}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.","required":true,"schema":{"type":"string","description":"ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.","example":"Dolor culpa."},"example":"Ad omnis possimus."}},"content":{"application/json":{"schema":{"type":"string","description":"Arbitrary JSON response.","example":"Dolores totam voluptatem.","format":"binary"},"example":"Cupiditate qui quo."}}}}}},"/policy/{group}/{policyName}/{version}/lock":{"delete":{"tags":["policy"],"summary":"Unlock policy","description":"Unlock a policy so it can be evaluated again.","operationId":"policy#Unlock","parameters":[{"name":"group","in":"path","description":"Policy group.","required":true,"schema":{"type":"string","description":"Policy group.","example":"Iusto mollitia rerum quis ut et."},"example":"Ipsam est alias officiis."},{"name":"policyName","in":"path","description":"Policy name.","required":true,"schema":{"type":"string","description":"Policy name.","example":"Qui dolores natus qui doloremque voluptatem."},"example":"Omnis aut quas eos qui minima non."},{"name":"version","in":"path","description":"Policy version.","required":true,"schema":{"type":"string","description":"Policy version.","example":"Non consequuntur."},"example":"Aut in."}],"responses":{"200":{"description":"OK response."}}},"post":{"tags":["policy"],"summary":"Lock policy","description":"Lock a policy so that it cannot be evaluated.","operationId":"policy#Lock","parameters":[{"name":"group","in":"path","description":"Policy group.","required":true,"schema":{"type":"string","description":"Policy group.","example":"Eveniet voluptas rerum."},"example":"Facilis tempora dolor consectetur."},{"name":"policyName","in":"path","description":"Policy name.","required":true,"schema":{"type":"string","description":"Policy name.","example":"Consequatur aut ipsam."},"example":"Aut provident ducimus vero adipisci nemo."},{"name":"version","in":"path","description":"Policy version.","required":true,"schema":{"type":"string","description":"Policy version.","example":"Itaque laborum."},"example":"Quos saepe dolorum qui tenetur aut."}],"responses":{"200":{"description":"OK response."}}}},"/readiness":{"get":{"tags":["health"],"summary":"Readiness health","operationId":"health#Readiness","responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"},"example":{"service":"Voluptas ad corporis adipisci inventore ipsum.","status":"Recusandae dolorum nisi distinctio vitae ad.","version":"Perspiciatis voluptatem."}}}}}}},"/v1/policies":{"get":{"tags":["policy"],"summary":"ListPolicies policy","description":"List policies from storage with optional filters.","operationId":"policy#ListPolicies","parameters":[{"name":"locked","in":"query","description":"Filter to return locked/unlocked policies (optional).","allowEmptyValue":true,"schema":{"type":"boolean","description":"Filter to return locked/unlocked policies (optional).","example":true},"example":true},{"name":"rego","in":"query","description":"Include policy source code in results (optional).","allowEmptyValue":true,"schema":{"type":"boolean","description":"Include policy source code in results (optional).","example":true},"example":false},{"name":"data","in":"query","description":"Include policy static data in results (optional). ","allowEmptyValue":true,"schema":{"type":"boolean","description":"Include policy static data in results (optional). ","example":false},"example":true},{"name":"dataConfig","in":"query","description":"Include static data config (optional).","allowEmptyValue":true,"schema":{"type":"boolean","description":"Include static data config (optional).","example":true},"example":true}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PoliciesResult"},"example":{"policies":[{"data":"Optio quia et laborum.","dataConfig":"In libero perspiciatis voluptatum ut soluta.","group":"Commodi nemo fugiat id praesentium accusantium expedita.","lastUpdate":9002532952206938167,"locked":false,"policyName":"Et aliquam sunt in et quia cum.","rego":"Error maxime quasi quia non voluptatibus error.","version":"Qui non quia."},{"data":"Optio quia et laborum.","dataConfig":"In libero perspiciatis voluptatum ut soluta.","group":"Commodi nemo fugiat id praesentium accusantium expedita.","lastUpdate":9002532952206938167,"locked":false,"policyName":"Et aliquam sunt in et quia cum.","rego":"Error maxime quasi quia non voluptatibus error.","version":"Qui non quia."},{"data":"Optio quia et laborum.","dataConfig":"In libero perspiciatis voluptatum ut soluta.","group":"Commodi nemo fugiat id praesentium accusantium expedita.","lastUpdate":9002532952206938167,"locked":false,"policyName":"Et aliquam sunt in et quia cum.","rego":"Error maxime quasi quia non voluptatibus error.","version":"Qui non quia."},{"data":"Optio quia et laborum.","dataConfig":"In libero perspiciatis voluptatum ut soluta.","group":"Commodi nemo fugiat id praesentium accusantium expedita.","lastUpdate":9002532952206938167,"locked":false,"policyName":"Et aliquam sunt in et quia cum.","rego":"Error maxime quasi quia non voluptatibus error.","version":"Qui non quia."}]}}}}}}}},"components":{"schemas":{"HealthResponse":{"type":"object","properties":{"service":{"type":"string","description":"Service name.","example":"Aut officiis veritatis impedit rerum recusandae."},"status":{"type":"string","description":"Status message.","example":"In id quibusdam."},"version":{"type":"string","description":"Service runtime version.","example":"Deserunt officiis ipsa molestiae."}},"example":{"service":"Unde doloremque quae ullam.","status":"Optio nobis iure rerum non.","version":"Sapiente laborum."},"required":["service","status","version"]},"PoliciesResult":{"type":"object","properties":{"policies":{"type":"array","items":{"$ref":"#/components/schemas/Policy"},"description":"JSON array of policies.","example":[{"data":"Optio quia et laborum.","dataConfig":"In libero perspiciatis voluptatum ut soluta.","group":"Commodi nemo fugiat id praesentium accusantium expedita.","lastUpdate":9002532952206938167,"locked":false,"policyName":"Et aliquam sunt in et quia cum.","rego":"Error maxime quasi quia non voluptatibus error.","version":"Qui non quia."},{"data":"Optio quia et laborum.","dataConfig":"In libero perspiciatis voluptatum ut soluta.","group":"Commodi nemo fugiat id praesentium accusantium expedita.","lastUpdate":9002532952206938167,"locked":false,"policyName":"Et aliquam sunt in et quia cum.","rego":"Error maxime quasi quia non voluptatibus error.","version":"Qui non quia."},{"data":"Optio quia et laborum.","dataConfig":"In libero perspiciatis voluptatum ut soluta.","group":"Commodi nemo fugiat id praesentium accusantium expedita.","lastUpdate":9002532952206938167,"locked":false,"policyName":"Et aliquam sunt in et quia cum.","rego":"Error maxime quasi quia non voluptatibus error.","version":"Qui non quia."},{"data":"Optio quia et laborum.","dataConfig":"In libero perspiciatis voluptatum ut soluta.","group":"Commodi nemo fugiat id praesentium accusantium expedita.","lastUpdate":9002532952206938167,"locked":false,"policyName":"Et aliquam sunt in et quia cum.","rego":"Error maxime quasi quia non voluptatibus error.","version":"Qui non quia."}]}},"example":{"policies":[{"data":"Optio quia et laborum.","dataConfig":"In libero perspiciatis voluptatum ut soluta.","group":"Commodi nemo fugiat id praesentium accusantium expedita.","lastUpdate":9002532952206938167,"locked":false,"policyName":"Et aliquam sunt in et quia cum.","rego":"Error maxime quasi quia non voluptatibus error.","version":"Qui non quia."},{"data":"Optio quia et laborum.","dataConfig":"In libero perspiciatis voluptatum ut soluta.","group":"Commodi nemo fugiat id praesentium accusantium expedita.","lastUpdate":9002532952206938167,"locked":false,"policyName":"Et aliquam sunt in et quia cum.","rego":"Error maxime quasi quia non voluptatibus error.","version":"Qui non quia."}]},"required":["policies"]},"Policy":{"type":"object","properties":{"data":{"type":"string","description":"Policy static data.","example":"Rerum asperiores nulla."},"dataConfig":{"type":"string","description":"Policy static data optional configuration.","example":"Tenetur rerum necessitatibus fugit."},"group":{"type":"string","description":"Policy group.","example":"Est impedit."},"lastUpdate":{"type":"integer","description":"Last update (Unix timestamp).","example":2958895584654309878,"format":"int64"},"locked":{"type":"boolean","description":"Locked specifies if the policy is locked or allowed to execute.","example":false},"policyName":{"type":"string","description":"Policy name.","example":"Sapiente architecto et enim omnis."},"rego":{"type":"string","description":"Policy rego source code.","example":"Neque et sed modi accusantium."},"version":{"type":"string","description":"Policy version.","example":"Consequatur ut suscipit."}},"example":{"data":"Vel saepe nisi et.","dataConfig":"Ut reiciendis fugit dolorum cupiditate.","group":"Occaecati quam tempora.","lastUpdate":8725218653039851118,"locked":false,"policyName":"Aut nobis repellendus quis rem.","rego":"Expedita ipsum minus ipsam.","version":"Harum voluptate et ut similique doloremque quis."},"required":["group","policyName","version","locked","lastUpdate"]}}},"tags":[{"name":"policy","description":"Policy Service provides evaluation of policies through Open Policy Agent."},{"name":"health","description":"Health service provides health check endpoints."}]} \ No newline at end of file +{"openapi":"3.0.3","info":{"title":"Policy Service","description":"The policy service exposes HTTP API for executing policies.","version":"1.0"},"servers":[{"url":"http://localhost:8081","description":"Policy Server"}],"paths":{"/liveness":{"get":{"tags":["health"],"summary":"Liveness health","operationId":"health#Liveness","responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"},"example":{"service":"Corporis est rem.","status":"Totam officia necessitatibus tempore nulla animi.","version":"Consequatur vel rerum rem ipsam nam."}}}}}}},"/policy/{repository}/{group}/{policyName}/{version}/evaluation":{"get":{"tags":["policy"],"summary":"Evaluate policy","description":"Evaluate executes a policy with the given 'data' as input.","operationId":"policy#Evaluate#1","parameters":[{"name":"repository","in":"path","description":"Policy repository.","required":true,"schema":{"type":"string","description":"Policy repository.","example":"policies"},"example":"policies"},{"name":"group","in":"path","description":"Policy group.","required":true,"schema":{"type":"string","description":"Policy group.","example":"example"},"example":"example"},{"name":"policyName","in":"path","description":"Policy name.","required":true,"schema":{"type":"string","description":"Policy name.","example":"example"},"example":"example"},{"name":"version","in":"path","description":"Policy version.","required":true,"schema":{"type":"string","description":"Policy version.","example":"1.0"},"example":"1.0"},{"name":"x-evaluation-id","in":"header","description":"EvaluationID allows overwriting the randomly generated evaluationID","allowEmptyValue":true,"schema":{"type":"string","description":"EvaluationID allows overwriting the randomly generated evaluationID","example":"did:web:example.com"},"example":"did:web:example.com"},{"name":"x-cache-ttl","in":"header","description":"Policy result cache TTL in seconds","allowEmptyValue":true,"schema":{"type":"integer","description":"Policy result cache TTL in seconds","example":60,"format":"int64"},"example":60}],"requestBody":{"description":"Input data passed to the policy execution runtime.","required":true,"content":{"application/json":{"schema":{"type":"string","description":"Input data passed to the policy execution runtime.","example":"Rerum asperiores nulla.","format":"binary"},"example":"Eos nemo repudiandae."}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.","required":true,"schema":{"type":"string","description":"ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.","example":"Eveniet voluptas rerum."},"example":"Consequatur aut ipsam."}},"content":{"application/json":{"schema":{"type":"string","description":"Arbitrary JSON response.","example":"Tenetur rerum necessitatibus fugit.","format":"binary"},"example":"Aut provident ducimus vero adipisci nemo."}}}}},"post":{"tags":["policy"],"summary":"Evaluate policy","description":"Evaluate executes a policy with the given 'data' as input.","operationId":"policy#Evaluate#2","parameters":[{"name":"repository","in":"path","description":"Policy repository.","required":true,"schema":{"type":"string","description":"Policy repository.","example":"policies"},"example":"policies"},{"name":"group","in":"path","description":"Policy group.","required":true,"schema":{"type":"string","description":"Policy group.","example":"example"},"example":"example"},{"name":"policyName","in":"path","description":"Policy name.","required":true,"schema":{"type":"string","description":"Policy name.","example":"example"},"example":"example"},{"name":"version","in":"path","description":"Policy version.","required":true,"schema":{"type":"string","description":"Policy version.","example":"1.0"},"example":"1.0"},{"name":"x-evaluation-id","in":"header","description":"EvaluationID allows overwriting the randomly generated evaluationID","allowEmptyValue":true,"schema":{"type":"string","description":"EvaluationID allows overwriting the randomly generated evaluationID","example":"did:web:example.com"},"example":"did:web:example.com"},{"name":"x-cache-ttl","in":"header","description":"Policy result cache TTL in seconds","allowEmptyValue":true,"schema":{"type":"integer","description":"Policy result cache TTL in seconds","example":60,"format":"int64"},"example":60}],"requestBody":{"description":"Input data passed to the policy execution runtime.","required":true,"content":{"application/json":{"schema":{"type":"string","description":"Input data passed to the policy execution runtime.","example":"Rerum asperiores nulla.","format":"binary"},"example":"Itaque laborum."}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.","required":true,"schema":{"type":"string","description":"ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.","example":"Quos saepe dolorum qui tenetur aut."},"example":"Ipsam est alias officiis."}},"content":{"application/json":{"schema":{"type":"string","description":"Arbitrary JSON response.","example":"Tenetur rerum necessitatibus fugit.","format":"binary"},"example":"Qui dolores natus qui doloremque voluptatem."}}}}}},"/policy/{repository}/{group}/{policyName}/{version}/evaluation/did.json":{"get":{"tags":["policy"],"summary":"Evaluate policy","description":"Evaluate executes a policy with the given 'data' as input.","operationId":"policy#Evaluate","parameters":[{"name":"repository","in":"path","description":"Policy repository.","required":true,"schema":{"type":"string","description":"Policy repository.","example":"policies"},"example":"policies"},{"name":"group","in":"path","description":"Policy group.","required":true,"schema":{"type":"string","description":"Policy group.","example":"example"},"example":"example"},{"name":"policyName","in":"path","description":"Policy name.","required":true,"schema":{"type":"string","description":"Policy name.","example":"example"},"example":"example"},{"name":"version","in":"path","description":"Policy version.","required":true,"schema":{"type":"string","description":"Policy version.","example":"1.0"},"example":"1.0"},{"name":"x-evaluation-id","in":"header","description":"EvaluationID allows overwriting the randomly generated evaluationID","allowEmptyValue":true,"schema":{"type":"string","description":"EvaluationID allows overwriting the randomly generated evaluationID","example":"did:web:example.com"},"example":"did:web:example.com"},{"name":"x-cache-ttl","in":"header","description":"Policy result cache TTL in seconds","allowEmptyValue":true,"schema":{"type":"integer","description":"Policy result cache TTL in seconds","example":60,"format":"int64"},"example":60}],"requestBody":{"description":"Input data passed to the policy execution runtime.","required":true,"content":{"application/json":{"schema":{"type":"string","description":"Input data passed to the policy execution runtime.","example":"Rerum asperiores nulla.","format":"binary"},"example":"Molestiae fugiat harum quia corporis ullam natus."}}},"responses":{"200":{"description":"OK response.","headers":{"ETag":{"description":"ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.","required":true,"schema":{"type":"string","description":"ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache.","example":"Animi omnis minima fuga numquam."},"example":"Eius sed."}},"content":{"application/json":{"schema":{"type":"string","description":"Arbitrary JSON response.","example":"Tenetur rerum necessitatibus fugit.","format":"binary"},"example":"Rerum saepe dolores laborum odio."}}}}}},"/policy/{repository}/{group}/{policyName}/{version}/lock":{"delete":{"tags":["policy"],"summary":"Unlock policy","description":"Unlock a policy so it can be evaluated again.","operationId":"policy#Unlock","parameters":[{"name":"repository","in":"path","description":"Policy repository.","required":true,"schema":{"type":"string","description":"Policy repository.","example":"Accusamus dolores non temporibus est magni."},"example":"Earum quis odit eius saepe."},{"name":"group","in":"path","description":"Policy group.","required":true,"schema":{"type":"string","description":"Policy group.","example":"Delectus sit saepe dicta mollitia molestiae."},"example":"Deserunt blanditiis repudiandae quasi."},{"name":"policyName","in":"path","description":"Policy name.","required":true,"schema":{"type":"string","description":"Policy name.","example":"Ut unde pariatur velit esse."},"example":"Veniam repudiandae delectus facere est."},{"name":"version","in":"path","description":"Policy version.","required":true,"schema":{"type":"string","description":"Policy version.","example":"Commodi esse repellendus reiciendis molestias qui."},"example":"Nostrum animi omnis."}],"responses":{"200":{"description":"OK response."}}},"post":{"tags":["policy"],"summary":"Lock policy","description":"Lock a policy so that it cannot be evaluated.","operationId":"policy#Lock","parameters":[{"name":"repository","in":"path","description":"Policy repository.","required":true,"schema":{"type":"string","description":"Policy repository.","example":"Omnis aut quas eos qui minima non."},"example":"Non consequuntur."},{"name":"group","in":"path","description":"Policy group.","required":true,"schema":{"type":"string","description":"Policy group.","example":"Aut in."},"example":"Et qui ut deleniti."},{"name":"policyName","in":"path","description":"Policy name.","required":true,"schema":{"type":"string","description":"Policy name.","example":"Eos cumque asperiores."},"example":"Commodi illo quidem omnis eveniet et."},{"name":"version","in":"path","description":"Policy version.","required":true,"schema":{"type":"string","description":"Policy version.","example":"Adipisci harum."},"example":"Ratione sit numquam non cupiditate sed omnis."}],"responses":{"200":{"description":"OK response."}}}},"/readiness":{"get":{"tags":["health"],"summary":"Readiness health","operationId":"health#Readiness","responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"},"example":{"service":"Vitae dolores quas et aperiam dolores reiciendis.","status":"Voluptate amet.","version":"Aut et."}}}}}}},"/v1/policies":{"get":{"tags":["policy"],"summary":"ListPolicies policy","description":"List policies from storage with optional filters.","operationId":"policy#ListPolicies","parameters":[{"name":"locked","in":"query","description":"Filter to return locked/unlocked policies (optional).","allowEmptyValue":true,"schema":{"type":"boolean","description":"Filter to return locked/unlocked policies (optional).","example":false},"example":false},{"name":"rego","in":"query","description":"Include policy source code in results (optional).","allowEmptyValue":true,"schema":{"type":"boolean","description":"Include policy source code in results (optional).","example":false},"example":true},{"name":"data","in":"query","description":"Include policy static data in results (optional). ","allowEmptyValue":true,"schema":{"type":"boolean","description":"Include policy static data in results (optional). ","example":true},"example":false},{"name":"dataConfig","in":"query","description":"Include static data config (optional).","allowEmptyValue":true,"schema":{"type":"boolean","description":"Include static data config (optional).","example":true},"example":true}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PoliciesResult"},"example":{"policies":[{"data":"Voluptas ad corporis adipisci inventore ipsum.","dataConfig":"Recusandae dolorum nisi distinctio vitae ad.","group":"Accusamus enim.","lastUpdate":4303309286764032455,"locked":true,"policyName":"Ut amet.","rego":"Quam dolores architecto itaque.","repository":"Reprehenderit in libero perspiciatis voluptatum ut soluta.","version":"Recusandae est rerum corrupti quia."},{"data":"Voluptas ad corporis adipisci inventore ipsum.","dataConfig":"Recusandae dolorum nisi distinctio vitae ad.","group":"Accusamus enim.","lastUpdate":4303309286764032455,"locked":true,"policyName":"Ut amet.","rego":"Quam dolores architecto itaque.","repository":"Reprehenderit in libero perspiciatis voluptatum ut soluta.","version":"Recusandae est rerum corrupti quia."},{"data":"Voluptas ad corporis adipisci inventore ipsum.","dataConfig":"Recusandae dolorum nisi distinctio vitae ad.","group":"Accusamus enim.","lastUpdate":4303309286764032455,"locked":true,"policyName":"Ut amet.","rego":"Quam dolores architecto itaque.","repository":"Reprehenderit in libero perspiciatis voluptatum ut soluta.","version":"Recusandae est rerum corrupti quia."},{"data":"Voluptas ad corporis adipisci inventore ipsum.","dataConfig":"Recusandae dolorum nisi distinctio vitae ad.","group":"Accusamus enim.","lastUpdate":4303309286764032455,"locked":true,"policyName":"Ut amet.","rego":"Quam dolores architecto itaque.","repository":"Reprehenderit in libero perspiciatis voluptatum ut soluta.","version":"Recusandae est rerum corrupti quia."}]}}}}}}}},"components":{"schemas":{"HealthResponse":{"type":"object","properties":{"service":{"type":"string","description":"Service name.","example":"Ea et ad omnis."},"status":{"type":"string","description":"Status message.","example":"Eveniet cupiditate qui quo."},"version":{"type":"string","description":"Service runtime version.","example":"Dignissimos enim."}},"example":{"service":"Error et sunt maxime aperiam.","status":"Et sit qui fugit enim labore.","version":"Et exercitationem perspiciatis quidem accusamus."},"required":["service","status","version"]},"PoliciesResult":{"type":"object","properties":{"policies":{"type":"array","items":{"$ref":"#/components/schemas/Policy"},"description":"JSON array of policies.","example":[{"data":"Voluptas ad corporis adipisci inventore ipsum.","dataConfig":"Recusandae dolorum nisi distinctio vitae ad.","group":"Accusamus enim.","lastUpdate":4303309286764032455,"locked":true,"policyName":"Ut amet.","rego":"Quam dolores architecto itaque.","repository":"Reprehenderit in libero perspiciatis voluptatum ut soluta.","version":"Recusandae est rerum corrupti quia."},{"data":"Voluptas ad corporis adipisci inventore ipsum.","dataConfig":"Recusandae dolorum nisi distinctio vitae ad.","group":"Accusamus enim.","lastUpdate":4303309286764032455,"locked":true,"policyName":"Ut amet.","rego":"Quam dolores architecto itaque.","repository":"Reprehenderit in libero perspiciatis voluptatum ut soluta.","version":"Recusandae est rerum corrupti quia."},{"data":"Voluptas ad corporis adipisci inventore ipsum.","dataConfig":"Recusandae dolorum nisi distinctio vitae ad.","group":"Accusamus enim.","lastUpdate":4303309286764032455,"locked":true,"policyName":"Ut amet.","rego":"Quam dolores architecto itaque.","repository":"Reprehenderit in libero perspiciatis voluptatum ut soluta.","version":"Recusandae est rerum corrupti quia."}]}},"example":{"policies":[{"data":"Voluptas ad corporis adipisci inventore ipsum.","dataConfig":"Recusandae dolorum nisi distinctio vitae ad.","group":"Accusamus enim.","lastUpdate":4303309286764032455,"locked":true,"policyName":"Ut amet.","rego":"Quam dolores architecto itaque.","repository":"Reprehenderit in libero perspiciatis voluptatum ut soluta.","version":"Recusandae est rerum corrupti quia."},{"data":"Voluptas ad corporis adipisci inventore ipsum.","dataConfig":"Recusandae dolorum nisi distinctio vitae ad.","group":"Accusamus enim.","lastUpdate":4303309286764032455,"locked":true,"policyName":"Ut amet.","rego":"Quam dolores architecto itaque.","repository":"Reprehenderit in libero perspiciatis voluptatum ut soluta.","version":"Recusandae est rerum corrupti quia."},{"data":"Voluptas ad corporis adipisci inventore ipsum.","dataConfig":"Recusandae dolorum nisi distinctio vitae ad.","group":"Accusamus enim.","lastUpdate":4303309286764032455,"locked":true,"policyName":"Ut amet.","rego":"Quam dolores architecto itaque.","repository":"Reprehenderit in libero perspiciatis voluptatum ut soluta.","version":"Recusandae est rerum corrupti quia."},{"data":"Voluptas ad corporis adipisci inventore ipsum.","dataConfig":"Recusandae dolorum nisi distinctio vitae ad.","group":"Accusamus enim.","lastUpdate":4303309286764032455,"locked":true,"policyName":"Ut amet.","rego":"Quam dolores architecto itaque.","repository":"Reprehenderit in libero perspiciatis voluptatum ut soluta.","version":"Recusandae est rerum corrupti quia."}]},"required":["policies"]},"Policy":{"type":"object","properties":{"data":{"type":"string","description":"Policy static data.","example":"Dolorum cupiditate provident."},"dataConfig":{"type":"string","description":"Policy static data optional configuration.","example":"Dolor dolorem modi aut officiis veritatis impedit."},"group":{"type":"string","description":"Policy group.","example":"Laborum harum voluptate et ut similique doloremque."},"lastUpdate":{"type":"integer","description":"Last update (Unix timestamp).","example":1580298023389806623,"format":"int64"},"locked":{"type":"boolean","description":"Locked specifies if the policy is locked or allowed to execute.","example":false},"policyName":{"type":"string","description":"Policy name.","example":"Rem et occaecati quam."},"rego":{"type":"string","description":"Policy rego source code.","example":"Nisi et praesentium ut reiciendis."},"repository":{"type":"string","description":"Policy repository.","example":"Ut velit aut nobis repellendus."},"version":{"type":"string","description":"Policy version.","example":"Explicabo expedita ipsum minus ipsam at vel."}},"example":{"data":"Dolorem aut accusantium.","dataConfig":"Dolor culpa.","group":"Unde doloremque quae ullam.","lastUpdate":8514723213962082729,"locked":true,"policyName":"Deserunt officiis ipsa molestiae.","rego":"Sapiente laborum.","repository":"In id quibusdam.","version":"Optio nobis iure rerum non."},"required":["repository","group","policyName","version","locked","lastUpdate"]}}},"tags":[{"name":"policy","description":"Policy Service provides evaluation of policies through Open Policy Agent."},{"name":"health","description":"Health service provides health check endpoints."}]} \ No newline at end of file diff --git a/gen/http/openapi3.yaml b/gen/http/openapi3.yaml index aaa659524546346e1ae303bc9b1dd685b83af5e9..2b80fafe02040810b596e99498a65256acb12705 100644 --- a/gen/http/openapi3.yaml +++ b/gen/http/openapi3.yaml @@ -21,10 +21,10 @@ paths: schema: $ref: '#/components/schemas/HealthResponse' example: - service: Accusamus enim. - status: Recusandae est rerum corrupti quia. - version: Quam dolores architecto itaque. - /policy/{group}/{policyName}/{version}/evaluation: + service: Corporis est rem. + status: Totam officia necessitatibus tempore nulla animi. + version: Consequatur vel rerum rem ipsam nam. + /policy/{repository}/{group}/{policyName}/{version}/evaluation: get: tags: - policy @@ -32,6 +32,15 @@ paths: description: Evaluate executes a policy with the given 'data' as input. operationId: policy#Evaluate#1 parameters: + - name: repository + in: path + description: Policy repository. + required: true + schema: + type: string + description: Policy repository. + example: policies + example: policies - name: group in: path description: Policy group. @@ -86,9 +95,9 @@ paths: schema: type: string description: Input data passed to the policy execution runtime. - example: Molestias rerum sunt eaque. + example: Rerum asperiores nulla. format: binary - example: Dignissimos enim. + example: Eos nemo repudiandae. responses: "200": description: OK response. @@ -99,16 +108,16 @@ paths: schema: type: string description: ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache. - example: Error et sunt maxime aperiam. - example: Et exercitationem perspiciatis quidem accusamus. + example: Eveniet voluptas rerum. + example: Consequatur aut ipsam. content: application/json: schema: type: string description: Arbitrary JSON response. - example: Dolores totam voluptatem. + example: Tenetur rerum necessitatibus fugit. format: binary - example: Molestiae fugiat harum quia corporis ullam natus. + example: Aut provident ducimus vero adipisci nemo. post: tags: - policy @@ -116,6 +125,15 @@ paths: description: Evaluate executes a policy with the given 'data' as input. operationId: policy#Evaluate#2 parameters: + - name: repository + in: path + description: Policy repository. + required: true + schema: + type: string + description: Policy repository. + example: policies + example: policies - name: group in: path description: Policy group. @@ -170,9 +188,9 @@ paths: schema: type: string description: Input data passed to the policy execution runtime. - example: Molestias rerum sunt eaque. + example: Rerum asperiores nulla. format: binary - example: Animi omnis minima fuga numquam. + example: Itaque laborum. responses: "200": description: OK response. @@ -183,17 +201,17 @@ paths: schema: type: string description: ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache. - example: Ipsum explicabo assumenda delectus. - example: Rerum saepe dolores laborum odio. + example: Quos saepe dolorum qui tenetur aut. + example: Ipsam est alias officiis. content: application/json: schema: type: string description: Arbitrary JSON response. - example: Dolores totam voluptatem. + example: Tenetur rerum necessitatibus fugit. format: binary - example: Eos nemo repudiandae. - /policy/{group}/{policyName}/{version}/evaluation/did.json: + example: Qui dolores natus qui doloremque voluptatem. + /policy/{repository}/{group}/{policyName}/{version}/evaluation/did.json: get: tags: - policy @@ -201,6 +219,15 @@ paths: description: Evaluate executes a policy with the given 'data' as input. operationId: policy#Evaluate parameters: + - name: repository + in: path + description: Policy repository. + required: true + schema: + type: string + description: Policy repository. + example: policies + example: policies - name: group in: path description: Policy group. @@ -255,9 +282,9 @@ paths: schema: type: string description: Input data passed to the policy execution runtime. - example: Molestias rerum sunt eaque. + example: Rerum asperiores nulla. format: binary - example: Dolorem aut accusantium. + example: Molestiae fugiat harum quia corporis ullam natus. responses: "200": description: OK response. @@ -268,17 +295,17 @@ paths: schema: type: string description: ETag contains unique identifier of the policy evaluation and can be used to later retrieve the results from Cache. - example: Dolor culpa. - example: Ad omnis possimus. + example: Animi omnis minima fuga numquam. + example: Eius sed. content: application/json: schema: type: string description: Arbitrary JSON response. - example: Dolores totam voluptatem. + example: Tenetur rerum necessitatibus fugit. format: binary - example: Cupiditate qui quo. - /policy/{group}/{policyName}/{version}/lock: + example: Rerum saepe dolores laborum odio. + /policy/{repository}/{group}/{policyName}/{version}/lock: delete: tags: - policy @@ -286,6 +313,15 @@ paths: description: Unlock a policy so it can be evaluated again. operationId: policy#Unlock parameters: + - name: repository + in: path + description: Policy repository. + required: true + schema: + type: string + description: Policy repository. + example: Accusamus dolores non temporibus est magni. + example: Earum quis odit eius saepe. - name: group in: path description: Policy group. @@ -293,8 +329,8 @@ paths: schema: type: string description: Policy group. - example: Iusto mollitia rerum quis ut et. - example: Ipsam est alias officiis. + example: Delectus sit saepe dicta mollitia molestiae. + example: Deserunt blanditiis repudiandae quasi. - name: policyName in: path description: Policy name. @@ -302,8 +338,8 @@ paths: schema: type: string description: Policy name. - example: Qui dolores natus qui doloremque voluptatem. - example: Omnis aut quas eos qui minima non. + example: Ut unde pariatur velit esse. + example: Veniam repudiandae delectus facere est. - name: version in: path description: Policy version. @@ -311,8 +347,8 @@ paths: schema: type: string description: Policy version. - example: Non consequuntur. - example: Aut in. + example: Commodi esse repellendus reiciendis molestias qui. + example: Nostrum animi omnis. responses: "200": description: OK response. @@ -323,6 +359,15 @@ paths: description: Lock a policy so that it cannot be evaluated. operationId: policy#Lock parameters: + - name: repository + in: path + description: Policy repository. + required: true + schema: + type: string + description: Policy repository. + example: Omnis aut quas eos qui minima non. + example: Non consequuntur. - name: group in: path description: Policy group. @@ -330,8 +375,8 @@ paths: schema: type: string description: Policy group. - example: Eveniet voluptas rerum. - example: Facilis tempora dolor consectetur. + example: Aut in. + example: Et qui ut deleniti. - name: policyName in: path description: Policy name. @@ -339,8 +384,8 @@ paths: schema: type: string description: Policy name. - example: Consequatur aut ipsam. - example: Aut provident ducimus vero adipisci nemo. + example: Eos cumque asperiores. + example: Commodi illo quidem omnis eveniet et. - name: version in: path description: Policy version. @@ -348,8 +393,8 @@ paths: schema: type: string description: Policy version. - example: Itaque laborum. - example: Quos saepe dolorum qui tenetur aut. + example: Adipisci harum. + example: Ratione sit numquam non cupiditate sed omnis. responses: "200": description: OK response. @@ -367,9 +412,9 @@ paths: schema: $ref: '#/components/schemas/HealthResponse' example: - service: Voluptas ad corporis adipisci inventore ipsum. - status: Recusandae dolorum nisi distinctio vitae ad. - version: Perspiciatis voluptatem. + service: Vitae dolores quas et aperiam dolores reiciendis. + status: Voluptate amet. + version: Aut et. /v1/policies: get: tags: @@ -385,8 +430,8 @@ paths: schema: type: boolean description: Filter to return locked/unlocked policies (optional). - example: true - example: true + example: false + example: false - name: rego in: query description: Include policy source code in results (optional). @@ -394,8 +439,8 @@ paths: schema: type: boolean description: Include policy source code in results (optional). - example: true - example: false + example: false + example: true - name: data in: query description: 'Include policy static data in results (optional). ' @@ -403,8 +448,8 @@ paths: schema: type: boolean description: 'Include policy static data in results (optional). ' - example: false - example: true + example: true + example: false - name: dataConfig in: query description: Include static data config (optional). @@ -423,38 +468,42 @@ paths: $ref: '#/components/schemas/PoliciesResult' example: policies: - - data: Optio quia et laborum. - dataConfig: In libero perspiciatis voluptatum ut soluta. - group: Commodi nemo fugiat id praesentium accusantium expedita. - lastUpdate: 9002532952206938167 - locked: false - policyName: Et aliquam sunt in et quia cum. - rego: Error maxime quasi quia non voluptatibus error. - version: Qui non quia. - - data: Optio quia et laborum. - dataConfig: In libero perspiciatis voluptatum ut soluta. - group: Commodi nemo fugiat id praesentium accusantium expedita. - lastUpdate: 9002532952206938167 - locked: false - policyName: Et aliquam sunt in et quia cum. - rego: Error maxime quasi quia non voluptatibus error. - version: Qui non quia. - - data: Optio quia et laborum. - dataConfig: In libero perspiciatis voluptatum ut soluta. - group: Commodi nemo fugiat id praesentium accusantium expedita. - lastUpdate: 9002532952206938167 - locked: false - policyName: Et aliquam sunt in et quia cum. - rego: Error maxime quasi quia non voluptatibus error. - version: Qui non quia. - - data: Optio quia et laborum. - dataConfig: In libero perspiciatis voluptatum ut soluta. - group: Commodi nemo fugiat id praesentium accusantium expedita. - lastUpdate: 9002532952206938167 - locked: false - policyName: Et aliquam sunt in et quia cum. - rego: Error maxime quasi quia non voluptatibus error. - version: Qui non quia. + - data: Voluptas ad corporis adipisci inventore ipsum. + dataConfig: Recusandae dolorum nisi distinctio vitae ad. + group: Accusamus enim. + lastUpdate: 4303309286764032455 + locked: true + policyName: Ut amet. + rego: Quam dolores architecto itaque. + repository: Reprehenderit in libero perspiciatis voluptatum ut soluta. + version: Recusandae est rerum corrupti quia. + - data: Voluptas ad corporis adipisci inventore ipsum. + dataConfig: Recusandae dolorum nisi distinctio vitae ad. + group: Accusamus enim. + lastUpdate: 4303309286764032455 + locked: true + policyName: Ut amet. + rego: Quam dolores architecto itaque. + repository: Reprehenderit in libero perspiciatis voluptatum ut soluta. + version: Recusandae est rerum corrupti quia. + - data: Voluptas ad corporis adipisci inventore ipsum. + dataConfig: Recusandae dolorum nisi distinctio vitae ad. + group: Accusamus enim. + lastUpdate: 4303309286764032455 + locked: true + policyName: Ut amet. + rego: Quam dolores architecto itaque. + repository: Reprehenderit in libero perspiciatis voluptatum ut soluta. + version: Recusandae est rerum corrupti quia. + - data: Voluptas ad corporis adipisci inventore ipsum. + dataConfig: Recusandae dolorum nisi distinctio vitae ad. + group: Accusamus enim. + lastUpdate: 4303309286764032455 + locked: true + policyName: Ut amet. + rego: Quam dolores architecto itaque. + repository: Reprehenderit in libero perspiciatis voluptatum ut soluta. + version: Recusandae est rerum corrupti quia. components: schemas: HealthResponse: @@ -463,19 +512,19 @@ components: service: type: string description: Service name. - example: Aut officiis veritatis impedit rerum recusandae. + example: Ea et ad omnis. status: type: string description: Status message. - example: In id quibusdam. + example: Eveniet cupiditate qui quo. version: type: string description: Service runtime version. - example: Deserunt officiis ipsa molestiae. + example: Dignissimos enim. example: - service: Unde doloremque quae ullam. - status: Optio nobis iure rerum non. - version: Sapiente laborum. + service: Error et sunt maxime aperiam. + status: Et sit qui fugit enim labore. + version: Et exercitationem perspiciatis quidem accusamus. required: - service - status @@ -489,56 +538,71 @@ components: $ref: '#/components/schemas/Policy' description: JSON array of policies. example: - - data: Optio quia et laborum. - dataConfig: In libero perspiciatis voluptatum ut soluta. - group: Commodi nemo fugiat id praesentium accusantium expedita. - lastUpdate: 9002532952206938167 - locked: false - policyName: Et aliquam sunt in et quia cum. - rego: Error maxime quasi quia non voluptatibus error. - version: Qui non quia. - - data: Optio quia et laborum. - dataConfig: In libero perspiciatis voluptatum ut soluta. - group: Commodi nemo fugiat id praesentium accusantium expedita. - lastUpdate: 9002532952206938167 - locked: false - policyName: Et aliquam sunt in et quia cum. - rego: Error maxime quasi quia non voluptatibus error. - version: Qui non quia. - - data: Optio quia et laborum. - dataConfig: In libero perspiciatis voluptatum ut soluta. - group: Commodi nemo fugiat id praesentium accusantium expedita. - lastUpdate: 9002532952206938167 - locked: false - policyName: Et aliquam sunt in et quia cum. - rego: Error maxime quasi quia non voluptatibus error. - version: Qui non quia. - - data: Optio quia et laborum. - dataConfig: In libero perspiciatis voluptatum ut soluta. - group: Commodi nemo fugiat id praesentium accusantium expedita. - lastUpdate: 9002532952206938167 - locked: false - policyName: Et aliquam sunt in et quia cum. - rego: Error maxime quasi quia non voluptatibus error. - version: Qui non quia. + - data: Voluptas ad corporis adipisci inventore ipsum. + dataConfig: Recusandae dolorum nisi distinctio vitae ad. + group: Accusamus enim. + lastUpdate: 4303309286764032455 + locked: true + policyName: Ut amet. + rego: Quam dolores architecto itaque. + repository: Reprehenderit in libero perspiciatis voluptatum ut soluta. + version: Recusandae est rerum corrupti quia. + - data: Voluptas ad corporis adipisci inventore ipsum. + dataConfig: Recusandae dolorum nisi distinctio vitae ad. + group: Accusamus enim. + lastUpdate: 4303309286764032455 + locked: true + policyName: Ut amet. + rego: Quam dolores architecto itaque. + repository: Reprehenderit in libero perspiciatis voluptatum ut soluta. + version: Recusandae est rerum corrupti quia. + - data: Voluptas ad corporis adipisci inventore ipsum. + dataConfig: Recusandae dolorum nisi distinctio vitae ad. + group: Accusamus enim. + lastUpdate: 4303309286764032455 + locked: true + policyName: Ut amet. + rego: Quam dolores architecto itaque. + repository: Reprehenderit in libero perspiciatis voluptatum ut soluta. + version: Recusandae est rerum corrupti quia. example: policies: - - data: Optio quia et laborum. - dataConfig: In libero perspiciatis voluptatum ut soluta. - group: Commodi nemo fugiat id praesentium accusantium expedita. - lastUpdate: 9002532952206938167 - locked: false - policyName: Et aliquam sunt in et quia cum. - rego: Error maxime quasi quia non voluptatibus error. - version: Qui non quia. - - data: Optio quia et laborum. - dataConfig: In libero perspiciatis voluptatum ut soluta. - group: Commodi nemo fugiat id praesentium accusantium expedita. - lastUpdate: 9002532952206938167 - locked: false - policyName: Et aliquam sunt in et quia cum. - rego: Error maxime quasi quia non voluptatibus error. - version: Qui non quia. + - data: Voluptas ad corporis adipisci inventore ipsum. + dataConfig: Recusandae dolorum nisi distinctio vitae ad. + group: Accusamus enim. + lastUpdate: 4303309286764032455 + locked: true + policyName: Ut amet. + rego: Quam dolores architecto itaque. + repository: Reprehenderit in libero perspiciatis voluptatum ut soluta. + version: Recusandae est rerum corrupti quia. + - data: Voluptas ad corporis adipisci inventore ipsum. + dataConfig: Recusandae dolorum nisi distinctio vitae ad. + group: Accusamus enim. + lastUpdate: 4303309286764032455 + locked: true + policyName: Ut amet. + rego: Quam dolores architecto itaque. + repository: Reprehenderit in libero perspiciatis voluptatum ut soluta. + version: Recusandae est rerum corrupti quia. + - data: Voluptas ad corporis adipisci inventore ipsum. + dataConfig: Recusandae dolorum nisi distinctio vitae ad. + group: Accusamus enim. + lastUpdate: 4303309286764032455 + locked: true + policyName: Ut amet. + rego: Quam dolores architecto itaque. + repository: Reprehenderit in libero perspiciatis voluptatum ut soluta. + version: Recusandae est rerum corrupti quia. + - data: Voluptas ad corporis adipisci inventore ipsum. + dataConfig: Recusandae dolorum nisi distinctio vitae ad. + group: Accusamus enim. + lastUpdate: 4303309286764032455 + locked: true + policyName: Ut amet. + rego: Quam dolores architecto itaque. + repository: Reprehenderit in libero perspiciatis voluptatum ut soluta. + version: Recusandae est rerum corrupti quia. required: - policies Policy: @@ -547,19 +611,19 @@ components: data: type: string description: Policy static data. - example: Rerum asperiores nulla. + example: Dolorum cupiditate provident. dataConfig: type: string description: Policy static data optional configuration. - example: Tenetur rerum necessitatibus fugit. + example: Dolor dolorem modi aut officiis veritatis impedit. group: type: string description: Policy group. - example: Est impedit. + example: Laborum harum voluptate et ut similique doloremque. lastUpdate: type: integer description: Last update (Unix timestamp). - example: 2958895584654309878 + example: 1580298023389806623 format: int64 locked: type: boolean @@ -568,25 +632,31 @@ components: policyName: type: string description: Policy name. - example: Sapiente architecto et enim omnis. + example: Rem et occaecati quam. rego: type: string description: Policy rego source code. - example: Neque et sed modi accusantium. + example: Nisi et praesentium ut reiciendis. + repository: + type: string + description: Policy repository. + example: Ut velit aut nobis repellendus. version: type: string description: Policy version. - example: Consequatur ut suscipit. + example: Explicabo expedita ipsum minus ipsam at vel. example: - data: Vel saepe nisi et. - dataConfig: Ut reiciendis fugit dolorum cupiditate. - group: Occaecati quam tempora. - lastUpdate: 8725218653039851118 - locked: false - policyName: Aut nobis repellendus quis rem. - rego: Expedita ipsum minus ipsam. - version: Harum voluptate et ut similique doloremque quis. + data: Dolorem aut accusantium. + dataConfig: Dolor culpa. + group: Unde doloremque quae ullam. + lastUpdate: 8514723213962082729 + locked: true + policyName: Deserunt officiis ipsa molestiae. + rego: Sapiente laborum. + repository: In id quibusdam. + version: Optio nobis iure rerum non. required: + - repository - group - policyName - version diff --git a/gen/http/policy/client/cli.go b/gen/http/policy/client/cli.go index 7b6988b1174f3aea8b276226a0091af793a91bc6..289bca63e92c83a6c145d8b300a2ba6be9d9accd 100644 --- a/gen/http/policy/client/cli.go +++ b/gen/http/policy/client/cli.go @@ -17,15 +17,19 @@ import ( // BuildEvaluatePayload builds the payload for the policy Evaluate endpoint // from CLI flags. -func BuildEvaluatePayload(policyEvaluateBody string, policyEvaluateGroup string, policyEvaluatePolicyName string, policyEvaluateVersion string, policyEvaluateEvaluationID string, policyEvaluateTTL string) (*policy.EvaluateRequest, error) { +func BuildEvaluatePayload(policyEvaluateBody string, policyEvaluateRepository string, policyEvaluateGroup string, policyEvaluatePolicyName string, policyEvaluateVersion string, policyEvaluateEvaluationID string, policyEvaluateTTL string) (*policy.EvaluateRequest, error) { var err error var body any { err = json.Unmarshal([]byte(policyEvaluateBody), &body) if err != nil { - return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "\"At incidunt unde consequatur voluptas dolorem nisi.\"") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "\"Ad omnis quasi aut consequuntur quibusdam.\"") } } + var repository string + { + repository = policyEvaluateRepository + } var group string { group = policyEvaluateGroup @@ -60,6 +64,7 @@ func BuildEvaluatePayload(policyEvaluateBody string, policyEvaluateGroup string, res := &policy.EvaluateRequest{ Input: &v, } + res.Repository = repository res.Group = group res.PolicyName = policyName res.Version = version @@ -71,7 +76,11 @@ func BuildEvaluatePayload(policyEvaluateBody string, policyEvaluateGroup string, // BuildLockPayload builds the payload for the policy Lock endpoint from CLI // flags. -func BuildLockPayload(policyLockGroup string, policyLockPolicyName string, policyLockVersion string) (*policy.LockRequest, error) { +func BuildLockPayload(policyLockRepository string, policyLockGroup string, policyLockPolicyName string, policyLockVersion string) (*policy.LockRequest, error) { + var repository string + { + repository = policyLockRepository + } var group string { group = policyLockGroup @@ -85,6 +94,7 @@ func BuildLockPayload(policyLockGroup string, policyLockPolicyName string, polic version = policyLockVersion } v := &policy.LockRequest{} + v.Repository = repository v.Group = group v.PolicyName = policyName v.Version = version @@ -94,7 +104,11 @@ func BuildLockPayload(policyLockGroup string, policyLockPolicyName string, polic // BuildUnlockPayload builds the payload for the policy Unlock endpoint from // CLI flags. -func BuildUnlockPayload(policyUnlockGroup string, policyUnlockPolicyName string, policyUnlockVersion string) (*policy.UnlockRequest, error) { +func BuildUnlockPayload(policyUnlockRepository string, policyUnlockGroup string, policyUnlockPolicyName string, policyUnlockVersion string) (*policy.UnlockRequest, error) { + var repository string + { + repository = policyUnlockRepository + } var group string { group = policyUnlockGroup @@ -108,6 +122,7 @@ func BuildUnlockPayload(policyUnlockGroup string, policyUnlockPolicyName string, version = policyUnlockVersion } v := &policy.UnlockRequest{} + v.Repository = repository v.Group = group v.PolicyName = policyName v.Version = version diff --git a/gen/http/policy/client/encode_decode.go b/gen/http/policy/client/encode_decode.go index 417538d82bfd8fffd8819c87b9aab48745cd6445..8b5d9b1cda7065e7945312a6feed2832f6fec05d 100644 --- a/gen/http/policy/client/encode_decode.go +++ b/gen/http/policy/client/encode_decode.go @@ -25,6 +25,7 @@ import ( // set to call the "policy" service "Evaluate" endpoint func (c *Client) BuildEvaluateRequest(ctx context.Context, v any) (*http.Request, error) { var ( + repository string group string policyName string version string @@ -34,11 +35,12 @@ func (c *Client) BuildEvaluateRequest(ctx context.Context, v any) (*http.Request if !ok { return nil, goahttp.ErrInvalidType("policy", "Evaluate", "*policy.EvaluateRequest", v) } + repository = p.Repository group = p.Group policyName = p.PolicyName version = p.Version } - u := &url.URL{Scheme: c.scheme, Host: c.host, Path: EvaluatePolicyPath(group, policyName, version)} + u := &url.URL{Scheme: c.scheme, Host: c.host, Path: EvaluatePolicyPath(repository, group, policyName, version)} req, err := http.NewRequest("GET", u.String(), nil) if err != nil { return nil, goahttp.ErrInvalidURL("policy", "Evaluate", u.String(), err) @@ -126,6 +128,7 @@ func DecodeEvaluateResponse(decoder func(*http.Response) goahttp.Decoder, restor // to call the "policy" service "Lock" endpoint func (c *Client) BuildLockRequest(ctx context.Context, v any) (*http.Request, error) { var ( + repository string group string policyName string version string @@ -135,11 +138,12 @@ func (c *Client) BuildLockRequest(ctx context.Context, v any) (*http.Request, er if !ok { return nil, goahttp.ErrInvalidType("policy", "Lock", "*policy.LockRequest", v) } + repository = p.Repository group = p.Group policyName = p.PolicyName version = p.Version } - u := &url.URL{Scheme: c.scheme, Host: c.host, Path: LockPolicyPath(group, policyName, version)} + u := &url.URL{Scheme: c.scheme, Host: c.host, Path: LockPolicyPath(repository, group, policyName, version)} req, err := http.NewRequest("POST", u.String(), nil) if err != nil { return nil, goahttp.ErrInvalidURL("policy", "Lock", u.String(), err) @@ -182,6 +186,7 @@ func DecodeLockResponse(decoder func(*http.Response) goahttp.Decoder, restoreBod // set to call the "policy" service "Unlock" endpoint func (c *Client) BuildUnlockRequest(ctx context.Context, v any) (*http.Request, error) { var ( + repository string group string policyName string version string @@ -191,11 +196,12 @@ func (c *Client) BuildUnlockRequest(ctx context.Context, v any) (*http.Request, if !ok { return nil, goahttp.ErrInvalidType("policy", "Unlock", "*policy.UnlockRequest", v) } + repository = p.Repository group = p.Group policyName = p.PolicyName version = p.Version } - u := &url.URL{Scheme: c.scheme, Host: c.host, Path: UnlockPolicyPath(group, policyName, version)} + u := &url.URL{Scheme: c.scheme, Host: c.host, Path: UnlockPolicyPath(repository, group, policyName, version)} req, err := http.NewRequest("DELETE", u.String(), nil) if err != nil { return nil, goahttp.ErrInvalidURL("policy", "Unlock", u.String(), err) @@ -319,6 +325,7 @@ func DecodeListPoliciesResponse(decoder func(*http.Response) goahttp.Decoder, re // *policy.Policy from a value of type *PolicyResponseBody. func unmarshalPolicyResponseBodyToPolicyPolicy(v *PolicyResponseBody) *policy.Policy { res := &policy.Policy{ + Repository: *v.Repository, PolicyName: *v.PolicyName, Group: *v.Group, Version: *v.Version, diff --git a/gen/http/policy/client/paths.go b/gen/http/policy/client/paths.go index a5da8845a897c497d06e6dc0ed55e98437560100..e822118a8e095069fd4819f41ec24ad6848c11af 100644 --- a/gen/http/policy/client/paths.go +++ b/gen/http/policy/client/paths.go @@ -12,28 +12,28 @@ import ( ) // EvaluatePolicyPath returns the URL path to the policy service Evaluate HTTP endpoint. -func EvaluatePolicyPath(group string, policyName string, version string) string { - return fmt.Sprintf("/policy/%v/%v/%v/evaluation/did.json", group, policyName, version) +func EvaluatePolicyPath(repository string, group string, policyName string, version string) string { + return fmt.Sprintf("/policy/%v/%v/%v/%v/evaluation/did.json", repository, group, policyName, version) } // EvaluatePolicyPath2 returns the URL path to the policy service Evaluate HTTP endpoint. -func EvaluatePolicyPath2(group string, policyName string, version string) string { - return fmt.Sprintf("/policy/%v/%v/%v/evaluation", group, policyName, version) +func EvaluatePolicyPath2(repository string, group string, policyName string, version string) string { + return fmt.Sprintf("/policy/%v/%v/%v/%v/evaluation", repository, group, policyName, version) } // EvaluatePolicyPath3 returns the URL path to the policy service Evaluate HTTP endpoint. -func EvaluatePolicyPath3(group string, policyName string, version string) string { - return fmt.Sprintf("/policy/%v/%v/%v/evaluation", group, policyName, version) +func EvaluatePolicyPath3(repository string, group string, policyName string, version string) string { + return fmt.Sprintf("/policy/%v/%v/%v/%v/evaluation", repository, group, policyName, version) } // LockPolicyPath returns the URL path to the policy service Lock HTTP endpoint. -func LockPolicyPath(group string, policyName string, version string) string { - return fmt.Sprintf("/policy/%v/%v/%v/lock", group, policyName, version) +func LockPolicyPath(repository string, group string, policyName string, version string) string { + return fmt.Sprintf("/policy/%v/%v/%v/%v/lock", repository, group, policyName, version) } // UnlockPolicyPath returns the URL path to the policy service Unlock HTTP endpoint. -func UnlockPolicyPath(group string, policyName string, version string) string { - return fmt.Sprintf("/policy/%v/%v/%v/lock", group, policyName, version) +func UnlockPolicyPath(repository string, group string, policyName string, version string) string { + return fmt.Sprintf("/policy/%v/%v/%v/%v/lock", repository, group, policyName, version) } // ListPoliciesPolicyPath returns the URL path to the policy service ListPolicies HTTP endpoint. diff --git a/gen/http/policy/client/types.go b/gen/http/policy/client/types.go index 4f9370b3baf08b33de636c9855b34fbb7e16873d..f56f0fb5df16450b64f0a3ae1e7d8220f1fe43d2 100644 --- a/gen/http/policy/client/types.go +++ b/gen/http/policy/client/types.go @@ -21,6 +21,8 @@ type ListPoliciesResponseBody struct { // PolicyResponseBody is used to define fields on response body types. type PolicyResponseBody struct { + // Policy repository. + Repository *string `form:"repository,omitempty" json:"repository,omitempty" xml:"repository,omitempty"` // Policy name. PolicyName *string `form:"policyName,omitempty" json:"policyName,omitempty" xml:"policyName,omitempty"` // Policy group. @@ -81,6 +83,9 @@ func ValidateListPoliciesResponseBody(body *ListPoliciesResponseBody) (err error // ValidatePolicyResponseBody runs the validations defined on PolicyResponseBody func ValidatePolicyResponseBody(body *PolicyResponseBody) (err error) { + if body.Repository == nil { + err = goa.MergeErrors(err, goa.MissingFieldError("repository", "body")) + } if body.Group == nil { err = goa.MergeErrors(err, goa.MissingFieldError("group", "body")) } diff --git a/gen/http/policy/server/encode_decode.go b/gen/http/policy/server/encode_decode.go index 8556a4be5eb12a836422f45341b5a3b9d0cf2cc5..e6c030abb97b55501551cae2eb1149cf27bf5001 100644 --- a/gen/http/policy/server/encode_decode.go +++ b/gen/http/policy/server/encode_decode.go @@ -49,6 +49,7 @@ func DecodeEvaluateRequest(mux goahttp.Muxer, decoder func(*http.Request) goahtt } var ( + repository string group string policyName string version string @@ -57,6 +58,7 @@ func DecodeEvaluateRequest(mux goahttp.Muxer, decoder func(*http.Request) goahtt params = mux.Vars(r) ) + repository = params["repository"] group = params["group"] policyName = params["policyName"] version = params["version"] @@ -78,7 +80,7 @@ func DecodeEvaluateRequest(mux goahttp.Muxer, decoder func(*http.Request) goahtt if err != nil { return nil, err } - payload := NewEvaluateRequest(body, group, policyName, version, evaluationID, ttl) + payload := NewEvaluateRequest(body, repository, group, policyName, version, evaluationID, ttl) return payload, nil } @@ -98,16 +100,18 @@ func EncodeLockResponse(encoder func(context.Context, http.ResponseWriter) goaht func DecodeLockRequest(mux goahttp.Muxer, decoder func(*http.Request) goahttp.Decoder) func(*http.Request) (any, error) { return func(r *http.Request) (any, error) { var ( + repository string group string policyName string version string params = mux.Vars(r) ) + repository = params["repository"] group = params["group"] policyName = params["policyName"] version = params["version"] - payload := NewLockRequest(group, policyName, version) + payload := NewLockRequest(repository, group, policyName, version) return payload, nil } @@ -127,16 +131,18 @@ func EncodeUnlockResponse(encoder func(context.Context, http.ResponseWriter) goa func DecodeUnlockRequest(mux goahttp.Muxer, decoder func(*http.Request) goahttp.Decoder) func(*http.Request) (any, error) { return func(r *http.Request) (any, error) { var ( + repository string group string policyName string version string params = mux.Vars(r) ) + repository = params["repository"] group = params["group"] policyName = params["policyName"] version = params["version"] - payload := NewUnlockRequest(group, policyName, version) + payload := NewUnlockRequest(repository, group, policyName, version) return payload, nil } @@ -218,6 +224,7 @@ func DecodeListPoliciesRequest(mux goahttp.Muxer, decoder func(*http.Request) go // *PolicyResponseBody from a value of type *policy.Policy. func marshalPolicyPolicyToPolicyResponseBody(v *policy.Policy) *PolicyResponseBody { res := &PolicyResponseBody{ + Repository: v.Repository, PolicyName: v.PolicyName, Group: v.Group, Version: v.Version, diff --git a/gen/http/policy/server/paths.go b/gen/http/policy/server/paths.go index f224fbe4c1bc4f5ef5c1d86d22d95f746c08feec..983b69f128e511eca05a71341a9e460d89f8e3c8 100644 --- a/gen/http/policy/server/paths.go +++ b/gen/http/policy/server/paths.go @@ -12,28 +12,28 @@ import ( ) // EvaluatePolicyPath returns the URL path to the policy service Evaluate HTTP endpoint. -func EvaluatePolicyPath(group string, policyName string, version string) string { - return fmt.Sprintf("/policy/%v/%v/%v/evaluation/did.json", group, policyName, version) +func EvaluatePolicyPath(repository string, group string, policyName string, version string) string { + return fmt.Sprintf("/policy/%v/%v/%v/%v/evaluation/did.json", repository, group, policyName, version) } // EvaluatePolicyPath2 returns the URL path to the policy service Evaluate HTTP endpoint. -func EvaluatePolicyPath2(group string, policyName string, version string) string { - return fmt.Sprintf("/policy/%v/%v/%v/evaluation", group, policyName, version) +func EvaluatePolicyPath2(repository string, group string, policyName string, version string) string { + return fmt.Sprintf("/policy/%v/%v/%v/%v/evaluation", repository, group, policyName, version) } // EvaluatePolicyPath3 returns the URL path to the policy service Evaluate HTTP endpoint. -func EvaluatePolicyPath3(group string, policyName string, version string) string { - return fmt.Sprintf("/policy/%v/%v/%v/evaluation", group, policyName, version) +func EvaluatePolicyPath3(repository string, group string, policyName string, version string) string { + return fmt.Sprintf("/policy/%v/%v/%v/%v/evaluation", repository, group, policyName, version) } // LockPolicyPath returns the URL path to the policy service Lock HTTP endpoint. -func LockPolicyPath(group string, policyName string, version string) string { - return fmt.Sprintf("/policy/%v/%v/%v/lock", group, policyName, version) +func LockPolicyPath(repository string, group string, policyName string, version string) string { + return fmt.Sprintf("/policy/%v/%v/%v/%v/lock", repository, group, policyName, version) } // UnlockPolicyPath returns the URL path to the policy service Unlock HTTP endpoint. -func UnlockPolicyPath(group string, policyName string, version string) string { - return fmt.Sprintf("/policy/%v/%v/%v/lock", group, policyName, version) +func UnlockPolicyPath(repository string, group string, policyName string, version string) string { + return fmt.Sprintf("/policy/%v/%v/%v/%v/lock", repository, group, policyName, version) } // ListPoliciesPolicyPath returns the URL path to the policy service ListPolicies HTTP endpoint. diff --git a/gen/http/policy/server/server.go b/gen/http/policy/server/server.go index 2043d7396d4c8ca1b50983eda1b7664ee9e11a2b..33fce435da180a01a74967b941d3cecf486c28d9 100644 --- a/gen/http/policy/server/server.go +++ b/gen/http/policy/server/server.go @@ -52,11 +52,11 @@ func New( ) *Server { return &Server{ Mounts: []*MountPoint{ - {"Evaluate", "GET", "/policy/{group}/{policyName}/{version}/evaluation/did.json"}, - {"Evaluate", "GET", "/policy/{group}/{policyName}/{version}/evaluation"}, - {"Evaluate", "POST", "/policy/{group}/{policyName}/{version}/evaluation"}, - {"Lock", "POST", "/policy/{group}/{policyName}/{version}/lock"}, - {"Unlock", "DELETE", "/policy/{group}/{policyName}/{version}/lock"}, + {"Evaluate", "GET", "/policy/{repository}/{group}/{policyName}/{version}/evaluation/did.json"}, + {"Evaluate", "GET", "/policy/{repository}/{group}/{policyName}/{version}/evaluation"}, + {"Evaluate", "POST", "/policy/{repository}/{group}/{policyName}/{version}/evaluation"}, + {"Lock", "POST", "/policy/{repository}/{group}/{policyName}/{version}/lock"}, + {"Unlock", "DELETE", "/policy/{repository}/{group}/{policyName}/{version}/lock"}, {"ListPolicies", "GET", "/v1/policies"}, }, Evaluate: NewEvaluateHandler(e.Evaluate, mux, decoder, encoder, errhandler, formatter), @@ -102,9 +102,9 @@ func MountEvaluateHandler(mux goahttp.Muxer, h http.Handler) { h.ServeHTTP(w, r) } } - mux.Handle("GET", "/policy/{group}/{policyName}/{version}/evaluation/did.json", f) - mux.Handle("GET", "/policy/{group}/{policyName}/{version}/evaluation", f) - mux.Handle("POST", "/policy/{group}/{policyName}/{version}/evaluation", f) + mux.Handle("GET", "/policy/{repository}/{group}/{policyName}/{version}/evaluation/did.json", f) + mux.Handle("GET", "/policy/{repository}/{group}/{policyName}/{version}/evaluation", f) + mux.Handle("POST", "/policy/{repository}/{group}/{policyName}/{version}/evaluation", f) } // NewEvaluateHandler creates a HTTP handler which loads the HTTP request and @@ -155,7 +155,7 @@ func MountLockHandler(mux goahttp.Muxer, h http.Handler) { h.ServeHTTP(w, r) } } - mux.Handle("POST", "/policy/{group}/{policyName}/{version}/lock", f) + mux.Handle("POST", "/policy/{repository}/{group}/{policyName}/{version}/lock", f) } // NewLockHandler creates a HTTP handler which loads the HTTP request and calls @@ -206,7 +206,7 @@ func MountUnlockHandler(mux goahttp.Muxer, h http.Handler) { h.ServeHTTP(w, r) } } - mux.Handle("DELETE", "/policy/{group}/{policyName}/{version}/lock", f) + mux.Handle("DELETE", "/policy/{repository}/{group}/{policyName}/{version}/lock", f) } // NewUnlockHandler creates a HTTP handler which loads the HTTP request and diff --git a/gen/http/policy/server/types.go b/gen/http/policy/server/types.go index 31b816ef74eb879775e220f44c2da4d73d4df8b4..f487d9380031e867f211e1d9ec7ed8bf98c4e9a9 100644 --- a/gen/http/policy/server/types.go +++ b/gen/http/policy/server/types.go @@ -20,6 +20,8 @@ type ListPoliciesResponseBody struct { // PolicyResponseBody is used to define fields on response body types. type PolicyResponseBody struct { + // Policy repository. + Repository string `form:"repository" json:"repository" xml:"repository"` // Policy name. PolicyName string `form:"policyName" json:"policyName" xml:"policyName"` // Policy group. @@ -54,11 +56,12 @@ func NewListPoliciesResponseBody(res *policy.PoliciesResult) *ListPoliciesRespon } // NewEvaluateRequest builds a policy service Evaluate endpoint payload. -func NewEvaluateRequest(body any, group string, policyName string, version string, evaluationID *string, ttl *int) *policy.EvaluateRequest { +func NewEvaluateRequest(body any, repository string, group string, policyName string, version string, evaluationID *string, ttl *int) *policy.EvaluateRequest { v := body res := &policy.EvaluateRequest{ Input: &v, } + res.Repository = repository res.Group = group res.PolicyName = policyName res.Version = version @@ -69,8 +72,9 @@ func NewEvaluateRequest(body any, group string, policyName string, version strin } // NewLockRequest builds a policy service Lock endpoint payload. -func NewLockRequest(group string, policyName string, version string) *policy.LockRequest { +func NewLockRequest(repository string, group string, policyName string, version string) *policy.LockRequest { v := &policy.LockRequest{} + v.Repository = repository v.Group = group v.PolicyName = policyName v.Version = version @@ -79,8 +83,9 @@ func NewLockRequest(group string, policyName string, version string) *policy.Loc } // NewUnlockRequest builds a policy service Unlock endpoint payload. -func NewUnlockRequest(group string, policyName string, version string) *policy.UnlockRequest { +func NewUnlockRequest(repository string, group string, policyName string, version string) *policy.UnlockRequest { v := &policy.UnlockRequest{} + v.Repository = repository v.Group = group v.PolicyName = policyName v.Version = version diff --git a/gen/policy/service.go b/gen/policy/service.go index 2ca613b9186fc1be5c01ab16a0671819c7c90dc7..a8bec54a7be9f794b6fb8e5fabed30240854dd25 100644 --- a/gen/policy/service.go +++ b/gen/policy/service.go @@ -35,6 +35,8 @@ var MethodNames = [4]string{"Evaluate", "Lock", "Unlock", "ListPolicies"} // EvaluateRequest is the payload type of the policy service Evaluate method. type EvaluateRequest struct { + // Policy repository. + Repository string // Policy group. Group string // Policy name. @@ -61,6 +63,8 @@ type EvaluateResult struct { // LockRequest is the payload type of the policy service Lock method. type LockRequest struct { + // Policy repository. + Repository string // Policy group. Group string // Policy name. @@ -85,6 +89,8 @@ type PoliciesResult struct { } type Policy struct { + // Policy repository. + Repository string // Policy name. PolicyName string // Policy group. @@ -105,6 +111,8 @@ type Policy struct { // UnlockRequest is the payload type of the policy service Unlock method. type UnlockRequest struct { + // Policy repository. + Repository string // Policy group. Group string // Policy name. diff --git a/internal/notify/notify.go b/internal/notify/notify.go index 4f52c85eb87523dec1dd28241a8991937999b519..c2c80a18b49ac139634d92c56e21e45c970fcc97 100644 --- a/internal/notify/notify.go +++ b/internal/notify/notify.go @@ -15,9 +15,10 @@ type Notifier struct { } type EventPolicyChange struct { - Name string `json:"name"` - Version string `json:"version"` - Group string `json:"group"` + Repository string `json:"repository"` + Name string `json:"name"` + Version string `json:"version"` + Group string `json:"group"` } // New creates a policy change notifier for interested subscribers. diff --git a/internal/service/policy/policydata/refresher.go b/internal/service/policy/policydata/refresher.go index 9b48847d9bc6175584762055b50caa7a1015e618..7000d441b8aa5c9767b1da6b68e3d5d8aea80882 100644 --- a/internal/service/policy/policydata/refresher.go +++ b/internal/service/policy/policydata/refresher.go @@ -72,6 +72,7 @@ loop: func (e *Refresher) Execute(ctx context.Context, p *storage.Policy) { logger := e.logger.With( + zap.String("policyRepository", p.Repository), zap.String("policyName", p.Name), zap.String("policyGroup", p.Group), zap.String("policyVersion", p.Version), diff --git a/internal/service/policy/policyfakes/fake_storage.go b/internal/service/policy/policyfakes/fake_storage.go index acf20f5ae889e77e6fbc799dccdfa87270d15293..cd52a7c153cf12ac241c3b058fe3a3f40ef4074f 100644 --- a/internal/service/policy/policyfakes/fake_storage.go +++ b/internal/service/policy/policyfakes/fake_storage.go @@ -24,13 +24,14 @@ type FakeStorage struct { result1 []*storage.Policy result2 error } - PolicyStub func(context.Context, string, string, string) (*storage.Policy, error) + PolicyStub func(context.Context, string, string, string, string) (*storage.Policy, error) policyMutex sync.RWMutex policyArgsForCall []struct { arg1 context.Context arg2 string arg3 string arg4 string + arg5 string } policyReturns struct { result1 *storage.Policy @@ -40,14 +41,15 @@ type FakeStorage struct { result1 *storage.Policy result2 error } - SetPolicyLockStub func(context.Context, string, string, string, bool) error + SetPolicyLockStub func(context.Context, string, string, string, string, bool) error setPolicyLockMutex sync.RWMutex setPolicyLockArgsForCall []struct { arg1 context.Context arg2 string arg3 string arg4 string - arg5 bool + arg5 string + arg6 bool } setPolicyLockReturns struct { result1 error @@ -124,7 +126,7 @@ func (fake *FakeStorage) GetPoliciesReturnsOnCall(i int, result1 []*storage.Poli }{result1, result2} } -func (fake *FakeStorage) Policy(arg1 context.Context, arg2 string, arg3 string, arg4 string) (*storage.Policy, error) { +func (fake *FakeStorage) Policy(arg1 context.Context, arg2 string, arg3 string, arg4 string, arg5 string) (*storage.Policy, error) { fake.policyMutex.Lock() ret, specificReturn := fake.policyReturnsOnCall[len(fake.policyArgsForCall)] fake.policyArgsForCall = append(fake.policyArgsForCall, struct { @@ -132,13 +134,14 @@ func (fake *FakeStorage) Policy(arg1 context.Context, arg2 string, arg3 string, arg2 string arg3 string arg4 string - }{arg1, arg2, arg3, arg4}) + arg5 string + }{arg1, arg2, arg3, arg4, arg5}) stub := fake.PolicyStub fakeReturns := fake.policyReturns - fake.recordInvocation("Policy", []interface{}{arg1, arg2, arg3, arg4}) + fake.recordInvocation("Policy", []interface{}{arg1, arg2, arg3, arg4, arg5}) fake.policyMutex.Unlock() if stub != nil { - return stub(arg1, arg2, arg3, arg4) + return stub(arg1, arg2, arg3, arg4, arg5) } if specificReturn { return ret.result1, ret.result2 @@ -152,17 +155,17 @@ func (fake *FakeStorage) PolicyCallCount() int { return len(fake.policyArgsForCall) } -func (fake *FakeStorage) PolicyCalls(stub func(context.Context, string, string, string) (*storage.Policy, error)) { +func (fake *FakeStorage) PolicyCalls(stub func(context.Context, string, string, string, string) (*storage.Policy, error)) { fake.policyMutex.Lock() defer fake.policyMutex.Unlock() fake.PolicyStub = stub } -func (fake *FakeStorage) PolicyArgsForCall(i int) (context.Context, string, string, string) { +func (fake *FakeStorage) PolicyArgsForCall(i int) (context.Context, string, string, string, string) { fake.policyMutex.RLock() defer fake.policyMutex.RUnlock() argsForCall := fake.policyArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4 + return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4, argsForCall.arg5 } func (fake *FakeStorage) PolicyReturns(result1 *storage.Policy, result2 error) { @@ -191,7 +194,7 @@ func (fake *FakeStorage) PolicyReturnsOnCall(i int, result1 *storage.Policy, res }{result1, result2} } -func (fake *FakeStorage) SetPolicyLock(arg1 context.Context, arg2 string, arg3 string, arg4 string, arg5 bool) error { +func (fake *FakeStorage) SetPolicyLock(arg1 context.Context, arg2 string, arg3 string, arg4 string, arg5 string, arg6 bool) error { fake.setPolicyLockMutex.Lock() ret, specificReturn := fake.setPolicyLockReturnsOnCall[len(fake.setPolicyLockArgsForCall)] fake.setPolicyLockArgsForCall = append(fake.setPolicyLockArgsForCall, struct { @@ -199,14 +202,15 @@ func (fake *FakeStorage) SetPolicyLock(arg1 context.Context, arg2 string, arg3 s arg2 string arg3 string arg4 string - arg5 bool - }{arg1, arg2, arg3, arg4, arg5}) + arg5 string + arg6 bool + }{arg1, arg2, arg3, arg4, arg5, arg6}) stub := fake.SetPolicyLockStub fakeReturns := fake.setPolicyLockReturns - fake.recordInvocation("SetPolicyLock", []interface{}{arg1, arg2, arg3, arg4, arg5}) + fake.recordInvocation("SetPolicyLock", []interface{}{arg1, arg2, arg3, arg4, arg5, arg6}) fake.setPolicyLockMutex.Unlock() if stub != nil { - return stub(arg1, arg2, arg3, arg4, arg5) + return stub(arg1, arg2, arg3, arg4, arg5, arg6) } if specificReturn { return ret.result1 @@ -220,17 +224,17 @@ func (fake *FakeStorage) SetPolicyLockCallCount() int { return len(fake.setPolicyLockArgsForCall) } -func (fake *FakeStorage) SetPolicyLockCalls(stub func(context.Context, string, string, string, bool) error) { +func (fake *FakeStorage) SetPolicyLockCalls(stub func(context.Context, string, string, string, string, bool) error) { fake.setPolicyLockMutex.Lock() defer fake.setPolicyLockMutex.Unlock() fake.SetPolicyLockStub = stub } -func (fake *FakeStorage) SetPolicyLockArgsForCall(i int) (context.Context, string, string, string, bool) { +func (fake *FakeStorage) SetPolicyLockArgsForCall(i int) (context.Context, string, string, string, string, bool) { fake.setPolicyLockMutex.RLock() defer fake.setPolicyLockMutex.RUnlock() argsForCall := fake.setPolicyLockArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4, argsForCall.arg5 + return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4, argsForCall.arg5, argsForCall.arg6 } func (fake *FakeStorage) SetPolicyLockReturns(result1 error) { diff --git a/internal/service/policy/service.go b/internal/service/policy/service.go index 819c997cb8391c8dc54716ce302e945f8c56fff0..dc9df440a83a67a281cc54b18e099af17becbeed 100644 --- a/internal/service/policy/service.go +++ b/internal/service/policy/service.go @@ -27,8 +27,8 @@ type Cache interface { } type Storage interface { - Policy(ctx context.Context, group, name, version string) (*storage.Policy, error) - SetPolicyLock(ctx context.Context, group, name, version string, lock bool) error + Policy(ctx context.Context, repository, group, name, version string) (*storage.Policy, error) + SetPolicyLock(ctx context.Context, repository, group, name, version string, lock bool) error GetPolicies(ctx context.Context, locked *bool) ([]*storage.Policy, error) } @@ -70,6 +70,7 @@ func (s *Service) Evaluate(ctx context.Context, req *policy.EvaluateRequest) (*p } logger := s.logger.With( + zap.String("repository", req.Repository), zap.String("group", req.Group), zap.String("name", req.PolicyName), zap.String("version", req.Version), @@ -77,7 +78,7 @@ func (s *Service) Evaluate(ctx context.Context, req *policy.EvaluateRequest) (*p ) headers, _ := header.FromContext(ctx) - query, err := s.prepareQuery(ctx, req.Group, req.PolicyName, req.Version, headers) + query, err := s.prepareQuery(ctx, req.Repository, req.Group, req.PolicyName, req.Version, headers) if err != nil { logger.Error("error getting prepared query", zap.Error(err)) return nil, errors.New("error evaluating policy", err) @@ -142,12 +143,13 @@ func (s *Service) Evaluate(ctx context.Context, req *policy.EvaluateRequest) (*p // Lock a policy so that it cannot be evaluated. func (s *Service) Lock(ctx context.Context, req *policy.LockRequest) error { logger := s.logger.With( + zap.String("repository", req.Repository), zap.String("group", req.Group), zap.String("name", req.PolicyName), zap.String("version", req.Version), ) - pol, err := s.storage.Policy(ctx, req.Group, req.PolicyName, req.Version) + pol, err := s.storage.Policy(ctx, req.Repository, req.Group, req.PolicyName, req.Version) if err != nil { logger.Error("error getting policy from storage", zap.Error(err)) if errors.Is(errors.NotFound, err) { @@ -160,7 +162,7 @@ func (s *Service) Lock(ctx context.Context, req *policy.LockRequest) error { return errors.New(errors.Forbidden, "policy is already locked") } - if err := s.storage.SetPolicyLock(ctx, req.Group, req.PolicyName, req.Version, true); err != nil { + if err := s.storage.SetPolicyLock(ctx, req.Repository, req.Group, req.PolicyName, req.Version, true); err != nil { logger.Error("error locking policy", zap.Error(err)) return errors.New("error locking policy", err) } @@ -173,12 +175,13 @@ func (s *Service) Lock(ctx context.Context, req *policy.LockRequest) error { // Unlock a policy so it can be evaluated again. func (s *Service) Unlock(ctx context.Context, req *policy.UnlockRequest) error { logger := s.logger.With( + zap.String("repository", req.Repository), zap.String("group", req.Group), zap.String("name", req.PolicyName), zap.String("version", req.Version), ) - pol, err := s.storage.Policy(ctx, req.Group, req.PolicyName, req.Version) + pol, err := s.storage.Policy(ctx, req.Repository, req.Group, req.PolicyName, req.Version) if err != nil { logger.Error("error getting policy from storage", zap.Error(err)) if errors.Is(errors.NotFound, err) { @@ -191,7 +194,7 @@ func (s *Service) Unlock(ctx context.Context, req *policy.UnlockRequest) error { return errors.New(errors.Forbidden, "policy is unlocked") } - if err := s.storage.SetPolicyLock(ctx, req.Group, req.PolicyName, req.Version, false); err != nil { + if err := s.storage.SetPolicyLock(ctx, req.Repository, req.Group, req.PolicyName, req.Version, false); err != nil { logger.Error("error unlocking policy", zap.Error(err)) return errors.New("error unlocking policy", err) } @@ -216,6 +219,7 @@ func (s *Service) ListPolicies(ctx context.Context, req *policy.PoliciesRequest) for _, p := range policies { policy := &policy.Policy{ + Repository: p.Repository, PolicyName: p.Name, Group: p.Group, Version: p.Version, @@ -244,14 +248,14 @@ func (s *Service) ListPolicies(ctx context.Context, req *policy.PoliciesRequest) // prepareQuery tries to get a prepared query from the regocache. // If the policyCache entry is not found, it will try to prepare a new // query and will set it into the policyCache for future use. -func (s *Service) prepareQuery(ctx context.Context, group, policyName, version string, headers map[string]string) (*rego.PreparedEvalQuery, error) { +func (s *Service) prepareQuery(ctx context.Context, repository, group, policyName, version string, headers map[string]string) (*rego.PreparedEvalQuery, error) { // retrieve policy from cache - key := s.queryCacheKey(group, policyName, version) + key := s.queryCacheKey(repository, group, policyName, version) pol, ok := s.policyCache.Get(key) if !ok { // retrieve policy from database storage var err error - pol, err = s.storage.Policy(ctx, group, policyName, version) + pol, err = s.storage.Policy(ctx, repository, group, policyName, version) if err != nil { if errors.Is(errors.NotFound, err) { return nil, err @@ -315,6 +319,6 @@ func (s *Service) buildRegoArgs(filename, regoPolicy, regoQuery, regoData string return availableFuncs, nil } -func (s *Service) queryCacheKey(group, policyName, version string) string { - return fmt.Sprintf("%s,%s,%s", group, policyName, version) +func (s *Service) queryCacheKey(repository, group, policyName, version string) string { + return fmt.Sprintf("%s,%s,%s,%s", repository, group, policyName, version) } diff --git a/internal/service/policy/service_test.go b/internal/service/policy/service_test.go index dbfcc966e957daa1cc09e69808a8955f2dfffa75..76e121fa29eec14657dad0c60e27b7719e39cdfa 100644 --- a/internal/service/policy/service_test.go +++ b/internal/service/policy/service_test.go @@ -27,6 +27,7 @@ func TestNew(t *testing.T) { func TestService_Evaluate(t *testing.T) { testPolicy := &storage.Policy{ + Repository: "policies", Filename: "policy.rego", Name: "example", Group: "testgroup", @@ -52,6 +53,7 @@ func TestService_Evaluate(t *testing.T) { var body interface{} = input return &goapolicy.EvaluateRequest{ + Repository: "policies", Group: "testgroup", PolicyName: "example", Version: "1.0", @@ -65,6 +67,7 @@ func TestService_Evaluate(t *testing.T) { var body interface{} return &goapolicy.EvaluateRequest{ + Repository: "policies", Group: "testgroup", PolicyName: "example", Version: "1.0", @@ -126,7 +129,7 @@ func TestService_Evaluate(t *testing.T) { }, }, storage: &policyfakes.FakeStorage{ - PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) { + PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) { return nil, errors.New(errors.NotFound) }, }, @@ -143,7 +146,7 @@ func TestService_Evaluate(t *testing.T) { }, }, storage: &policyfakes.FakeStorage{ - PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) { + PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) { return nil, errors.New("some error") }, }, @@ -160,7 +163,7 @@ func TestService_Evaluate(t *testing.T) { }, }, storage: &policyfakes.FakeStorage{ - PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) { + PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) { return &storage.Policy{Locked: true}, nil }, }, @@ -178,7 +181,7 @@ func TestService_Evaluate(t *testing.T) { }, }, storage: &policyfakes.FakeStorage{ - PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) { + PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) { return testPolicy, nil }, }, @@ -201,7 +204,7 @@ func TestService_Evaluate(t *testing.T) { }, }, storage: &policyfakes.FakeStorage{ - PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) { + PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) { return testPolicy, nil }, }, @@ -223,8 +226,9 @@ func TestService_Evaluate(t *testing.T) { }, }, storage: &policyfakes.FakeStorage{ - PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) { + PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) { return &storage.Policy{ + Repository: "policies", Name: "example", Group: "testgroup", Version: "1.0", @@ -253,8 +257,9 @@ func TestService_Evaluate(t *testing.T) { }, }, storage: &policyfakes.FakeStorage{ - PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) { + PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) { return &storage.Policy{ + Repository: "policies", Name: "example", Group: "testgroup", Version: "1.0", @@ -283,8 +288,9 @@ func TestService_Evaluate(t *testing.T) { }, }, storage: &policyfakes.FakeStorage{ - PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) { + PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) { return &storage.Policy{ + Repository: "policies", Name: "example", Group: "testgroup", Version: "1.0", @@ -314,8 +320,9 @@ func TestService_Evaluate(t *testing.T) { }, }, storage: &policyfakes.FakeStorage{ - PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) { + PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) { return &storage.Policy{ + Repository: "policies", Name: "example", Group: "testgroup", Version: "1.0", @@ -344,7 +351,7 @@ func TestService_Evaluate(t *testing.T) { }, }, storage: &policyfakes.FakeStorage{ - PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) { + PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) { return testPolicy, nil }, }, @@ -407,7 +414,7 @@ func TestService_Lock(t *testing.T) { name: "policy is not found", req: testReq(), storage: &policyfakes.FakeStorage{ - PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) { + PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) { return nil, errors.New(errors.NotFound) }, }, @@ -418,7 +425,7 @@ func TestService_Lock(t *testing.T) { name: "error getting policy from storage", req: testReq(), storage: &policyfakes.FakeStorage{ - PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) { + PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) { return nil, errors.New("some error") }, }, @@ -429,7 +436,7 @@ func TestService_Lock(t *testing.T) { name: "policy is already locked", req: testReq(), storage: &policyfakes.FakeStorage{ - PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) { + PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) { return &storage.Policy{Locked: true}, nil }, }, @@ -440,10 +447,10 @@ func TestService_Lock(t *testing.T) { name: "fail to lock policy", req: testReq(), storage: &policyfakes.FakeStorage{ - PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) { + PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) { return &storage.Policy{Locked: false}, nil }, - SetPolicyLockStub: func(ctx context.Context, name, group, version string, lock bool) error { + SetPolicyLockStub: func(ctx context.Context, repository, name, group, version string, lock bool) error { return errors.New(errors.Internal, "error locking policy") }, }, @@ -454,10 +461,10 @@ func TestService_Lock(t *testing.T) { name: "policy is locked successfully", req: testReq(), storage: &policyfakes.FakeStorage{ - PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) { + PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) { return &storage.Policy{Locked: false}, nil }, - SetPolicyLockStub: func(ctx context.Context, name, group, version string, lock bool) error { + SetPolicyLockStub: func(ctx context.Context, repository, name, group, version string, lock bool) error { return nil }, }, @@ -486,6 +493,7 @@ func TestService_Unlock(t *testing.T) { // prepare test request to be used in tests testReq := func() *goapolicy.UnlockRequest { return &goapolicy.UnlockRequest{ + Repository: "policies", Group: "testgroup", PolicyName: "example", Version: "1.0", @@ -504,7 +512,7 @@ func TestService_Unlock(t *testing.T) { name: "policy is not found", req: testReq(), storage: &policyfakes.FakeStorage{ - PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) { + PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) { return nil, errors.New(errors.NotFound) }, }, @@ -515,7 +523,7 @@ func TestService_Unlock(t *testing.T) { name: "error getting policy from storage", req: testReq(), storage: &policyfakes.FakeStorage{ - PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) { + PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) { return nil, errors.New("some error") }, }, @@ -526,7 +534,7 @@ func TestService_Unlock(t *testing.T) { name: "policy is unlocked", req: testReq(), storage: &policyfakes.FakeStorage{ - PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) { + PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) { return &storage.Policy{Locked: false}, nil }, }, @@ -537,10 +545,10 @@ func TestService_Unlock(t *testing.T) { name: "fail to unlock policy", req: testReq(), storage: &policyfakes.FakeStorage{ - PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) { + PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) { return &storage.Policy{Locked: true}, nil }, - SetPolicyLockStub: func(ctx context.Context, name, group, version string, lock bool) error { + SetPolicyLockStub: func(ctx context.Context, repository, name, group, version string, lock bool) error { return errors.New(errors.Internal, "error unlocking policy") }, }, @@ -551,10 +559,10 @@ func TestService_Unlock(t *testing.T) { name: "policy is unlocked successfully", req: testReq(), storage: &policyfakes.FakeStorage{ - PolicyStub: func(ctx context.Context, s string, s2 string, s3 string) (*storage.Policy, error) { + PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) { return &storage.Policy{Locked: true}, nil }, - SetPolicyLockStub: func(ctx context.Context, name, group, version string, lock bool) error { + SetPolicyLockStub: func(ctx context.Context, repository, name, group, version string, lock bool) error { return nil }, }, @@ -611,6 +619,7 @@ func TestService_ListPolicies(t *testing.T) { name: "request without errors and any additional request parameter return all policies", storage: &policyfakes.FakeStorage{GetPoliciesStub: func(ctx context.Context, b *bool) ([]*storage.Policy, error) { return []*storage.Policy{{ + Repository: "policies", Name: "example", Group: "example", Version: "example", @@ -620,6 +629,7 @@ func TestService_ListPolicies(t *testing.T) { Locked: false, LastUpdate: time.Time{}, }, { + Repository: "policies", Name: "example", Group: "example", Version: "example", @@ -635,6 +645,7 @@ func TestService_ListPolicies(t *testing.T) { response: &goapolicy.PoliciesResult{ Policies: []*goapolicy.Policy{ { + Repository: "policies", PolicyName: "example", Group: "example", Version: "example", @@ -642,6 +653,7 @@ func TestService_ListPolicies(t *testing.T) { LastUpdate: time.Time{}.Unix(), }, { + Repository: "policies", PolicyName: "example", Group: "example", Version: "example", @@ -655,6 +667,7 @@ func TestService_ListPolicies(t *testing.T) { name: "request with only locked parameter equal to true returns only locked policies", storage: &policyfakes.FakeStorage{GetPoliciesStub: func(ctx context.Context, b *bool) ([]*storage.Policy, error) { return []*storage.Policy{{ + Repository: "policies", Name: "example", Group: "example", Version: "example", @@ -672,6 +685,7 @@ func TestService_ListPolicies(t *testing.T) { response: &goapolicy.PoliciesResult{ Policies: []*goapolicy.Policy{ { + Repository: "policies", PolicyName: "example", Group: "example", Version: "example", @@ -685,6 +699,7 @@ func TestService_ListPolicies(t *testing.T) { name: "request with only locked parameter equal to false returns only unlocked policies", storage: &policyfakes.FakeStorage{GetPoliciesStub: func(ctx context.Context, b *bool) ([]*storage.Policy, error) { return []*storage.Policy{{ + Repository: "policies", Name: "example", Group: "example", Version: "example", @@ -702,6 +717,7 @@ func TestService_ListPolicies(t *testing.T) { response: &goapolicy.PoliciesResult{ Policies: []*goapolicy.Policy{ { + Repository: "policies", PolicyName: "example", Group: "example", Version: "example", @@ -715,6 +731,7 @@ func TestService_ListPolicies(t *testing.T) { name: "request with all additional params set to true", storage: &policyfakes.FakeStorage{GetPoliciesStub: func(ctx context.Context, b *bool) ([]*storage.Policy, error) { return []*storage.Policy{{ + Repository: "policies", Name: "example", Group: "example", Version: "example", @@ -735,6 +752,7 @@ func TestService_ListPolicies(t *testing.T) { response: &goapolicy.PoliciesResult{ Policies: []*goapolicy.Policy{ { + Repository: "policies", PolicyName: "example", Group: "example", Version: "example", @@ -751,6 +769,7 @@ func TestService_ListPolicies(t *testing.T) { name: "request with all additional params set to false", storage: &policyfakes.FakeStorage{GetPoliciesStub: func(ctx context.Context, b *bool) ([]*storage.Policy, error) { return []*storage.Policy{{ + Repository: "policies", Name: "example", Group: "example", Version: "example", @@ -771,6 +790,7 @@ func TestService_ListPolicies(t *testing.T) { response: &goapolicy.PoliciesResult{ Policies: []*goapolicy.Policy{ { + Repository: "policies", PolicyName: "example", Group: "example", Version: "example", diff --git a/internal/storage/storage.go b/internal/storage/storage.go index 81c1dd83116bfae8bde0250213aff9d868d2beb4..3f50796badc989966e4af2226de130f4641b2b4c 100644 --- a/internal/storage/storage.go +++ b/internal/storage/storage.go @@ -29,6 +29,7 @@ type PolicyChangeSubscriber interface { type Policy struct { ID primitive.ObjectID `bson:"_id"` Filename string + Repository string Name string Group string Version string @@ -59,17 +60,19 @@ func New(db *mongo.Client, dbname, collection string, logger *zap.Logger) (*Stor }, nil } -func (s *Storage) Policy(ctx context.Context, group, name, version string) (*Policy, error) { +func (s *Storage) Policy(ctx context.Context, repository, group, name, version string) (*Policy, error) { s.logger.Debug("get policy from storage", + zap.String("repository", repository), zap.String("group", group), zap.String("policy", name), zap.String("version", version), ) result := s.policy.FindOne(ctx, bson.M{ - "group": group, - "name": name, - "version": version, + "repository": repository, + "group": group, + "name": name, + "version": version, }) if result.Err() != nil { @@ -87,13 +90,14 @@ func (s *Storage) Policy(ctx context.Context, group, name, version string) (*Pol return &policy, nil } -func (s *Storage) SetPolicyLock(ctx context.Context, group, name, version string, lock bool) error { +func (s *Storage) SetPolicyLock(ctx context.Context, repository, group, name, version string, lock bool) error { _, err := s.policy.UpdateOne( ctx, bson.M{ - "group": group, - "name": name, - "version": version, + "repository": repository, + "group": group, + "name": name, + "version": version, }, bson.M{ "$set": bson.M{ @@ -130,7 +134,7 @@ func (s *Storage) ListenPolicyDataChanges(ctx context.Context) error { for _, subscriber := range s.subscribers { err := subscriber.PolicyDataChange( ctx, - ¬ify.EventPolicyChange{Name: policy.Name, Version: policy.Version, Group: policy.Group}, + ¬ify.EventPolicyChange{Repository: policy.Repository, Name: policy.Name, Version: policy.Version, Group: policy.Group}, ) if err != nil { return err