diff --git a/.gitignore b/.gitignore index 13bbe5b9112f9828a4f0eae28e0eb34e5fdb58d1..9f11b755a17d8192c60f61cb17b8902dffbd9f23 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1 @@ .idea/ - diff --git a/design/design.go b/design/design.go index 109dc62bdde2af20ef3b5ee3628027ed979823e5..abce41007ea0e4a0f318f53ea93c190092d77992 100644 --- a/design/design.go +++ b/design/design.go @@ -24,6 +24,9 @@ var _ = Service("policy", func() { Result(Any) HTTP(func() { POST("/policy/{group}/{policyName}/{version}/evaluation") + Header("evaluationID:x-evaluation-id", String, "EvaluationID allows overwriting the randomly generated evaluationID", func() { + Example("did:web:example.com") + }) Body("input") Response(StatusOK) }) diff --git a/design/types.go b/design/types.go index 26996205e55069980fe530a538f7b7f0e66f86c6..ca2d039047465aec00835e953f49b0b2d25adf86 100644 --- a/design/types.go +++ b/design/types.go @@ -14,6 +14,7 @@ var EvaluateRequest = Type("EvaluateRequest", 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.") Required("group", "policyName", "version", "input") }) diff --git a/gen/http/cli/policy/cli.go b/gen/http/cli/policy/cli.go index 431940373d2895bc45f21758efb31617747abb04..91de667a21a728f23092a956ff5f4f5255a262b8 100644 --- a/gen/http/cli/policy/cli.go +++ b/gen/http/cli/policy/cli.go @@ -32,7 +32,7 @@ policy (evaluate|lock|unlock) // UsageExamples produces an example of a valid invocation of the CLI tool. func UsageExamples() string { return os.Args[0] + ` health liveness` + "\n" + - os.Args[0] + ` policy evaluate --body "Ab accusamus voluptatem et est." --group "example" --policy-name "example" --version "1.0"` + "\n" + + os.Args[0] + ` policy evaluate --body "Illum ad assumenda consectetur minima voluptatibus." --group "example" --policy-name "example" --version "1.0" --evaluation-id "Ab accusamus voluptatem et est."` + "\n" + "" } @@ -54,11 +54,12 @@ func ParseEndpoint( policyFlags = flag.NewFlagSet("policy", flag.ContinueOnError) - policyEvaluateFlags = flag.NewFlagSet("evaluate", flag.ExitOnError) - policyEvaluateBodyFlag = policyEvaluateFlags.String("body", "REQUIRED", "") - policyEvaluateGroupFlag = policyEvaluateFlags.String("group", "REQUIRED", "Policy group.") - policyEvaluatePolicyNameFlag = policyEvaluateFlags.String("policy-name", "REQUIRED", "Policy name.") - policyEvaluateVersionFlag = policyEvaluateFlags.String("version", "REQUIRED", "Policy version.") + policyEvaluateFlags = flag.NewFlagSet("evaluate", flag.ExitOnError) + policyEvaluateBodyFlag = policyEvaluateFlags.String("body", "REQUIRED", "") + policyEvaluateGroupFlag = policyEvaluateFlags.String("group", "REQUIRED", "Policy group.") + policyEvaluatePolicyNameFlag = policyEvaluateFlags.String("policy-name", "REQUIRED", "Policy name.") + policyEvaluateVersionFlag = policyEvaluateFlags.String("version", "REQUIRED", "Policy version.") + policyEvaluateEvaluationIDFlag = policyEvaluateFlags.String("evaluation-id", "", "") policyLockFlags = flag.NewFlagSet("lock", flag.ExitOnError) policyLockGroupFlag = policyLockFlags.String("group", "REQUIRED", "Policy group.") @@ -171,7 +172,7 @@ func ParseEndpoint( switch epn { case "evaluate": endpoint = c.Evaluate() - data, err = policyc.BuildEvaluatePayload(*policyEvaluateBodyFlag, *policyEvaluateGroupFlag, *policyEvaluatePolicyNameFlag, *policyEvaluateVersionFlag) + data, err = policyc.BuildEvaluatePayload(*policyEvaluateBodyFlag, *policyEvaluateGroupFlag, *policyEvaluatePolicyNameFlag, *policyEvaluateVersionFlag, *policyEvaluateEvaluationIDFlag) case "lock": endpoint = c.Lock() data, err = policyc.BuildLockPayload(*policyLockGroupFlag, *policyLockPolicyNameFlag, *policyLockVersionFlag) @@ -238,16 +239,17 @@ 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 + fmt.Fprintf(os.Stderr, `%[1]s [flags] policy evaluate -body JSON -group STRING -policy-name STRING -version STRING -evaluation-id STRING Evaluate executes a policy with the given 'data' as input. -body JSON: -group STRING: Policy group. -policy-name STRING: Policy name. -version STRING: Policy version. + -evaluation-id STRING: Example: - %[1]s policy evaluate --body "Ab accusamus voluptatem et est." --group "example" --policy-name "example" --version "1.0" + %[1]s policy evaluate --body "Illum ad assumenda consectetur minima voluptatibus." --group "example" --policy-name "example" --version "1.0" --evaluation-id "Ab accusamus voluptatem et est." `, os.Args[0]) } @@ -260,7 +262,7 @@ Lock a policy so that it cannot be evaluated. -version STRING: Policy version. Example: - %[1]s policy lock --group "Vitae qui." --policy-name "Provident fugiat at cupiditate." --version "Commodi vitae voluptatem." + %[1]s policy lock --group "Commodi vitae voluptatem." --policy-name "Similique quisquam optio." --version "Explicabo beatae quisquam officiis libero voluptatibus." `, os.Args[0]) } @@ -273,6 +275,6 @@ Unlock a policy so it can be evaluated again. -version STRING: Policy version. Example: - %[1]s policy unlock --group "Aut ut fuga quae eius minus." --policy-name "Architecto quibusdam ab." --version "In illum est et hic." + %[1]s policy unlock --group "In illum est et hic." --policy-name "Deleniti non nihil dolor aut sed." --version "Incidunt unde consequatur voluptas dolorem nisi temporibus." `, os.Args[0]) } diff --git a/gen/http/openapi.json b/gen/http/openapi.json index e45394a13bd6d5c554dec72c55245d7e1f09fcae..b87425d258c3be0080a5d16b598585dcfe870853 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."}},"schemes":["http"]}},"/policy/{group}/{policyName}/{version}/evaluation":{"post":{"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":"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"}}},"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."}},"schemes":["http"]}}}} \ 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."}},"schemes":["http"]}},"/policy/{group}/{policyName}/{version}/evaluation":{"post":{"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":"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"}}},"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."}},"schemes":["http"]}}}} \ No newline at end of file diff --git a/gen/http/openapi.yaml b/gen/http/openapi.yaml index e8bcb485a33fadf93c1fd3cc62f9d1273a2a89d5..3552e210a9053c6309155fb89bafad26270d441b 100644 --- a/gen/http/openapi.yaml +++ b/gen/http/openapi.yaml @@ -47,6 +47,11 @@ paths: 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: any in: body description: Input data passed to the policy execution runtime. diff --git a/gen/http/openapi3.json b/gen/http/openapi3.json index 87f8be3859ea0679e8151b3d3e9cd10c22973d63..ab7d6bd20a75a405353148b5eadf480c81cb12b1 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."}}}},"/policy/{group}/{policyName}/{version}/evaluation":{"post":{"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"}],"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":"Deleniti non nihil dolor aut sed.","format":"binary"},"example":"Omnis quasi aut consequuntur."}}},"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"type":"string","example":"Incidunt unde consequatur voluptas dolorem nisi temporibus.","format":"binary"},"example":"Tempore minus."}}}}}},"/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":"Dolorem cumque laborum quis nesciunt."},"example":"Aut voluptas."},{"name":"policyName","in":"path","description":"Policy name.","required":true,"schema":{"type":"string","description":"Policy name.","example":"Sint nam voluptatem ea consequatur similique et."},"example":"Non mollitia nesciunt impedit facere."},{"name":"version","in":"path","description":"Policy version.","required":true,"schema":{"type":"string","description":"Policy version.","example":"Ut commodi perspiciatis corporis."},"example":"Accusamus autem sequi."}],"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":"Quis quos qui earum velit illum."},"example":"Aliquam atque voluptatum ut dolorem."},{"name":"policyName","in":"path","description":"Policy name.","required":true,"schema":{"type":"string","description":"Policy name.","example":"Aut facere veniam repudiandae id."},"example":"Aut minus alias."},{"name":"version","in":"path","description":"Policy version.","required":true,"schema":{"type":"string","description":"Policy version.","example":"At eos facilis molestias in voluptas rem."},"example":"Ab accusantium ut ut aliquid sint animi."}],"responses":{"200":{"description":"OK response."}}}},"/readiness":{"get":{"tags":["health"],"summary":"Readiness health","operationId":"health#Readiness","responses":{"200":{"description":"OK response."}}}}},"components":{},"tags":[{"name":"health","description":"Health service provides health check endpoints."},{"name":"policy","description":"Policy Service provides evaluation of policies through Open Policy Agent."}]} \ 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."}}}},"/policy/{group}/{policyName}/{version}/evaluation":{"post":{"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"}],"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":"Omnis quasi aut consequuntur.","format":"binary"},"example":"Quis quos qui earum velit illum."}}},"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"type":"string","example":"Tempore minus.","format":"binary"},"example":"Aliquam atque voluptatum ut dolorem."}}}}}},"/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":"Sint nam voluptatem ea consequatur similique et."},"example":"Non mollitia nesciunt impedit facere."},{"name":"policyName","in":"path","description":"Policy name.","required":true,"schema":{"type":"string","description":"Policy name.","example":"Ut commodi perspiciatis corporis."},"example":"Accusamus autem sequi."},{"name":"version","in":"path","description":"Policy version.","required":true,"schema":{"type":"string","description":"Policy version.","example":"Et nulla."},"example":"In quis nesciunt autem et."}],"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":"Aut facere veniam repudiandae id."},"example":"Aut minus alias."},{"name":"policyName","in":"path","description":"Policy name.","required":true,"schema":{"type":"string","description":"Policy name.","example":"At eos facilis molestias in voluptas rem."},"example":"Ab accusantium ut ut aliquid sint animi."},{"name":"version","in":"path","description":"Policy version.","required":true,"schema":{"type":"string","description":"Policy version.","example":"Dolorem cumque laborum quis nesciunt."},"example":"Aut voluptas."}],"responses":{"200":{"description":"OK response."}}}},"/readiness":{"get":{"tags":["health"],"summary":"Readiness health","operationId":"health#Readiness","responses":{"200":{"description":"OK response."}}}}},"components":{},"tags":[{"name":"health","description":"Health service provides health check endpoints."},{"name":"policy","description":"Policy Service provides evaluation of policies through Open Policy Agent."}]} \ No newline at end of file diff --git a/gen/http/openapi3.yaml b/gen/http/openapi3.yaml index f5a2f231aada97499f8271846caddaf3886f66c1..db303ce37efc518726e4239ffdc17e45c41e86ac 100644 --- a/gen/http/openapi3.yaml +++ b/gen/http/openapi3.yaml @@ -51,6 +51,15 @@ paths: 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 requestBody: description: Input data passed to the policy execution runtime. required: true @@ -59,9 +68,9 @@ paths: schema: type: string description: Input data passed to the policy execution runtime. - example: Deleniti non nihil dolor aut sed. + example: Omnis quasi aut consequuntur. format: binary - example: Omnis quasi aut consequuntur. + example: Quis quos qui earum velit illum. responses: "200": description: OK response. @@ -69,9 +78,9 @@ paths: application/json: schema: type: string - example: Incidunt unde consequatur voluptas dolorem nisi temporibus. + example: Tempore minus. format: binary - example: Tempore minus. + example: Aliquam atque voluptatum ut dolorem. /policy/{group}/{policyName}/{version}/lock: delete: tags: @@ -87,8 +96,8 @@ paths: schema: type: string description: Policy group. - example: Dolorem cumque laborum quis nesciunt. - example: Aut voluptas. + example: Sint nam voluptatem ea consequatur similique et. + example: Non mollitia nesciunt impedit facere. - name: policyName in: path description: Policy name. @@ -96,8 +105,8 @@ paths: schema: type: string description: Policy name. - example: Sint nam voluptatem ea consequatur similique et. - example: Non mollitia nesciunt impedit facere. + example: Ut commodi perspiciatis corporis. + example: Accusamus autem sequi. - name: version in: path description: Policy version. @@ -105,8 +114,8 @@ paths: schema: type: string description: Policy version. - example: Ut commodi perspiciatis corporis. - example: Accusamus autem sequi. + example: Et nulla. + example: In quis nesciunt autem et. responses: "200": description: OK response. @@ -124,8 +133,8 @@ paths: schema: type: string description: Policy group. - example: Quis quos qui earum velit illum. - example: Aliquam atque voluptatum ut dolorem. + example: Aut facere veniam repudiandae id. + example: Aut minus alias. - name: policyName in: path description: Policy name. @@ -133,8 +142,8 @@ paths: schema: type: string description: Policy name. - example: Aut facere veniam repudiandae id. - example: Aut minus alias. + example: At eos facilis molestias in voluptas rem. + example: Ab accusantium ut ut aliquid sint animi. - name: version in: path description: Policy version. @@ -142,8 +151,8 @@ paths: schema: type: string description: Policy version. - example: At eos facilis molestias in voluptas rem. - example: Ab accusantium ut ut aliquid sint animi. + example: Dolorem cumque laborum quis nesciunt. + example: Aut voluptas. responses: "200": description: OK response. diff --git a/gen/http/policy/client/cli.go b/gen/http/policy/client/cli.go index 931cc1ad0c56cd7647ed6924e700826f5f6b0c10..0f885b7a30e6878583c5f23773188cc47a17405b 100644 --- a/gen/http/policy/client/cli.go +++ b/gen/http/policy/client/cli.go @@ -16,13 +16,13 @@ import ( // BuildEvaluatePayload builds the payload for the policy Evaluate endpoint // from CLI flags. -func BuildEvaluatePayload(policyEvaluateBody string, policyEvaluateGroup string, policyEvaluatePolicyName string, policyEvaluateVersion string) (*policy.EvaluateRequest, error) { +func BuildEvaluatePayload(policyEvaluateBody string, policyEvaluateGroup string, policyEvaluatePolicyName string, policyEvaluateVersion string, policyEvaluateEvaluationID string) (*policy.EvaluateRequest, error) { var err error var body interface{} { 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, "\"Ab accusamus voluptatem et est.\"") + return nil, fmt.Errorf("invalid JSON for body, \nerror: %s, \nexample of valid JSON:\n%s", err, "\"Illum ad assumenda consectetur minima voluptatibus.\"") } } var group string @@ -37,6 +37,12 @@ func BuildEvaluatePayload(policyEvaluateBody string, policyEvaluateGroup string, { version = policyEvaluateVersion } + var evaluationID *string + { + if policyEvaluateEvaluationID != "" { + evaluationID = &policyEvaluateEvaluationID + } + } v := body res := &policy.EvaluateRequest{ Input: v, @@ -44,6 +50,7 @@ func BuildEvaluatePayload(policyEvaluateBody string, policyEvaluateGroup string, res.Group = group res.PolicyName = policyName res.Version = version + res.EvaluationID = evaluationID return res, nil } diff --git a/gen/http/policy/client/encode_decode.go b/gen/http/policy/client/encode_decode.go index d4a2a5f74eef5f02bf3ef2314eb8caadb28fc280..309e2fd62787e93acf767008b248386215d26901 100644 --- a/gen/http/policy/client/encode_decode.go +++ b/gen/http/policy/client/encode_decode.go @@ -55,6 +55,10 @@ func EncodeEvaluateRequest(encoder func(*http.Request) goahttp.Encoder) func(*ht if !ok { return goahttp.ErrInvalidType("policy", "Evaluate", "*policy.EvaluateRequest", v) } + if p.EvaluationID != nil { + head := *p.EvaluationID + req.Header.Set("x-evaluation-id", head) + } body := p.Input if err := encoder(req).Encode(&body); err != nil { return goahttp.ErrEncodingError("policy", "Evaluate", err) diff --git a/gen/http/policy/server/encode_decode.go b/gen/http/policy/server/encode_decode.go index 6d676cb40ded28d66368dfa9bdb89fbd11d7984c..3bb6113290c5725c435938692e6489b635e2955b 100644 --- a/gen/http/policy/server/encode_decode.go +++ b/gen/http/policy/server/encode_decode.go @@ -45,16 +45,21 @@ func DecodeEvaluateRequest(mux goahttp.Muxer, decoder func(*http.Request) goahtt } var ( - group string - policyName string - version string + group string + policyName string + version string + evaluationID *string params = mux.Vars(r) ) group = params["group"] policyName = params["policyName"] version = params["version"] - payload := NewEvaluateRequest(body, group, policyName, version) + evaluationIDRaw := r.Header.Get("x-evaluation-id") + if evaluationIDRaw != "" { + evaluationID = &evaluationIDRaw + } + payload := NewEvaluateRequest(body, group, policyName, version, evaluationID) return payload, nil } diff --git a/gen/http/policy/server/types.go b/gen/http/policy/server/types.go index e39296d9694ab5be167b84d4e5311b5c8b1036bc..1a20ddf5006e4abaeb11d5a67889b0551e49b405 100644 --- a/gen/http/policy/server/types.go +++ b/gen/http/policy/server/types.go @@ -12,7 +12,7 @@ import ( ) // NewEvaluateRequest builds a policy service Evaluate endpoint payload. -func NewEvaluateRequest(body interface{}, group string, policyName string, version string) *policy.EvaluateRequest { +func NewEvaluateRequest(body interface{}, group string, policyName string, version string, evaluationID *string) *policy.EvaluateRequest { v := body res := &policy.EvaluateRequest{ Input: v, @@ -20,6 +20,7 @@ func NewEvaluateRequest(body interface{}, group string, policyName string, versi res.Group = group res.PolicyName = policyName res.Version = version + res.EvaluationID = evaluationID return res } diff --git a/gen/policy/service.go b/gen/policy/service.go index 3895194865fa885d9569cde5e97c02e2b7ae33ec..4abb1bcdcde12ad0b54ddfbc412308a536c131f4 100644 --- a/gen/policy/service.go +++ b/gen/policy/service.go @@ -41,6 +41,9 @@ type EvaluateRequest struct { Version string // Input data passed to the policy execution runtime. Input interface{} + // Identifier created by external system and passed as parameter to overwrite + // the randomly generated evaluationID. + EvaluationID *string } // LockRequest is the payload type of the policy service Lock method. diff --git a/internal/service/policy/service.go b/internal/service/policy/service.go index bf01650102a1934b4dc268b2a6c2eb666627faa7..b8f6e76d2a281d3d9295b42415713f9200b8d9e8 100644 --- a/internal/service/policy/service.go +++ b/internal/service/policy/service.go @@ -59,7 +59,13 @@ func New(storage Storage, queryCache RegoCache, cache Cache, logger *zap.Logger) // return results correctly, only if the package declaration inside the policy is: // `package mygroup.example`. func (s *Service) Evaluate(ctx context.Context, req *policy.EvaluateRequest) (interface{}, error) { - evaluationID := uuid.NewString() + var evaluationID string + if req.EvaluationID != nil && *req.EvaluationID != "" { + evaluationID = *req.EvaluationID + } else { + evaluationID = uuid.NewString() + } + logger := s.logger.With( zap.String("group", req.Group), zap.String("name", req.PolicyName),