创建私有hook
功能介绍
创建私有hook(CreatePrivateHook)
创建一个带有初始默认版本的私有hook,创建私有hook的时候需要同时创建一个初始化的默认版本,不允许空私有hook的创建。
设置配置(Configuration)后的私有hook才会在触发资源栈部署时生效,资源栈使用私有hook的默认版本。若创建私有hook时未指定配置项,则该私有hook在资源栈部署时不生效,后续可通过UpdatePrivateHook API更新配置。
-
支持hook策略模板检验的资源栈服务API:
CreateExecutionPlan
ApplyExecutionPlan
CreateStack
DeployStack
ContinueDeployStack
DeleteStack
DeleteStackEnhanced
-
创建私有hook时指定的版本为初始默认版本。
-
如果同名的私有hook在当前domain_id+region下已经存在,则会返回409。
-
私有hook版本号遵循语义化版本号(Semantic Version),为用户自定义。
-
资源编排服务会对私有hook进行校验,如文件大小,策略文件语法校验等。若存在错误,则会创建失败。
-
当前仅支持部署资源前的检测,不支持部署资源过程中的检测。如果通过了部署资源前的检测,资源栈则会继续部署资源。反之会停止部署资源,并记录资源栈事件(stack events)。
-
仅支持OPA开源引擎识别的,以Rego(https://www.openpolicyagent.org/docs/latest/policy-language/)语言编写的策略模板(用户可以通过policy_uri或policy_body给予策略文件内容)。
-
策略模板中的决策结果使用object类型的hook_result,hook_result所在包的包名必须使用policy。hook_result格式如下:
hook_result := { "is_passed": Bool, "err_msg": String, }
其中is_passed必选,err_msg可选。RFS通过查询policy.hook_result[is_passed]判断是否通过策略校验。
-
如果policy.hook_result[is_passed]的结果是true,则表示通过策略校验,资源编排服务会继续部署资源。
-
如果policy.hook_result[is_passed]的结果是false,则表示没有通过策略校验,资源编排服务会停止部署资源。并记录资源栈事件信息,信息的内容为policy.hook_result[err_msg]。如果没有设置err_msg,则资源栈事件信息内容为默认错误信息(校验私有hook失败)。
-
如果没有使用policy.hook_result,则该策略不会生效,资源编排服务会继续部署资源。
-
-
策略模板中不支持调用其他服务API等方式获取数据、不支持任何形式的网络访问、不支持以任何形式的自定义函数或者方法等、不支持读取本地文件以及系统操作。
私有hook的策略模板语法如下:
package policy import rego.v1 hook_result := { "is_passed": input.message == "world", "err_msg": "The error msg when private hook is not passed the validation", }
URI
POST /v1/private-hooks
请求参数
参数 |
是否必选 |
参数类型 |
描述 |
---|---|---|---|
Client-Request-Id |
是 |
String |
用户指定的,对于此请求的唯一Id,用于定位某个请求,推荐使用UUID |
参数 |
是否必选 |
参数类型 |
描述 |
---|---|---|---|
hook_name |
是 |
String |
私有hook的名字。此名字在domain_id+region下应唯一,可以使用中文、大小写英文、数字、下划线、中划线。首字符需为中文或者英文,区分大小写。 推荐用户使用三段命名空间:{自定义hook名称}-{hook应用场景}-hook。 |
hook_version |
是 |
String |
私有hook的版本号。版本号必须遵循语义化版本号(Semantic Version),为用户自定义。 |
hook_description |
否 |
String |
私有hook的描述。可用于客户识别创建的私有hook。可通过UpdatePrivateHook API更新私有hook的描述。 |
hook_version_description |
否 |
String |
私有hook版本的描述。可用于客户识别创建私有hook的版本。注意:hook版本为不可更新(immutable),所以该字段不可更新,如果需要更新,请删除后重建。 |
configuration |
否 |
configuration object |
私有hook配置项,可以指定私有hook生效的目标资源栈以及私有hook校验失败后资源栈的行为。可通过UpdatePrivateHook API更新私有hook配置项。 |
policy_uri |
否 |
String |
策略文件的OBS地址。内容仅支持OPA开源引擎识别的,以Rego(https://www.openpolicyagent.org/docs/latest/policy-language/)语言编写的策略模板。 请确保OBS地址所在局点与使用RFS服务局点一致。 策略文件当前支持单文件或zip压缩包,单文件需要以".rego"结尾,压缩包当前只支持zip格式,文件需要以.zip结尾。 关于策略文件的校验要求如下:
policy_uri和policy_body必须有且只有一个存在 |
policy_body |
否 |
String |
策略内容。仅支持OPA开源引擎识别的,以Rego(https://www.openpolicyagent.org/docs/latest/policy-language/)语言编写的策略模板。 policy_body和policy_uri 必须有且只有一个存在 |
响应参数
状态码: 201
参数 |
参数类型 |
描述 |
---|---|---|
hook_id |
String |
私有hook(private-hook)的唯一Id。 此Id由资源编排服务在生成私有hook的时候生成,为UUID。 由于私有hook名称仅仅在同一时间下唯一,即用户允许先生成一个叫HelloWorld的私有hook,删除,再重新创建一个同名私有hook。 对于团队并行开发,用户可能希望确保,当前我操作的私有hook就是我认为的那个,而不是其他队友删除后创建的同名私有hook。因此,使用Id就可以做到强匹配。 资源编排服务保证每次创建的私有hook所对应的Id都不相同,更新不会影响Id。如果给予的hook_id和当前hook的Id不一致,则返回400。 |
状态码: 400
参数 |
参数类型 |
描述 |
---|---|---|
error_code |
String |
响应码 |
error_msg |
String |
响应消息 |
encoded_authorization_message |
String |
包含有关未经授权请求的信息。 |
details |
Array of Detail objects |
权限拒绝时服务返回的详细错误信息。 |
状态码: 401
参数 |
参数类型 |
描述 |
---|---|---|
error_code |
String |
响应码 |
error_msg |
String |
响应消息 |
encoded_authorization_message |
String |
包含有关未经授权请求的信息。 |
details |
Array of Detail objects |
权限拒绝时服务返回的详细错误信息。 |
状态码: 403
参数 |
参数类型 |
描述 |
---|---|---|
error_code |
String |
响应码 |
error_msg |
String |
响应消息 |
encoded_authorization_message |
String |
包含有关未经授权请求的信息。 |
details |
Array of Detail objects |
权限拒绝时服务返回的详细错误信息。 |
状态码: 409
参数 |
参数类型 |
描述 |
---|---|---|
error_code |
String |
响应码 |
error_msg |
String |
响应消息 |
encoded_authorization_message |
String |
包含有关未经授权请求的信息。 |
details |
Array of Detail objects |
权限拒绝时服务返回的详细错误信息。 |
状态码: 429
参数 |
参数类型 |
描述 |
---|---|---|
error_code |
String |
响应码 |
error_msg |
String |
响应消息 |
encoded_authorization_message |
String |
包含有关未经授权请求的信息。 |
details |
Array of Detail objects |
权限拒绝时服务返回的详细错误信息。 |
状态码: 500
参数 |
参数类型 |
描述 |
---|---|---|
error_code |
String |
响应码 |
error_msg |
String |
响应消息 |
encoded_authorization_message |
String |
包含有关未经授权请求的信息。 |
details |
Array of Detail objects |
权限拒绝时服务返回的详细错误信息。 |
请求示例
创建一个带有初始默认版本的私有hook
POST https://{endpoint}/v1/private-hooks { "hook_name" : "my-hello-world-hook-name", "hook_version" : "0.0.1", "policy_uri" : "https://my_hello_world_bucket.{region}.myhuaweicloud.com/policy.rego", "configuration" : { "target_stacks" : "NONE", "failure_mode" : "WARN" }, "hook_description" : "my first private hook", "hook_version_description" : "my first private hook version" }
响应示例
状态码: 201
创建成功
{ "hook_id" : "1b15e005-bdbb-4bd7-8f9a-a09b6774b4b3" }
状态码
状态码 |
描述 |
---|---|
201 |
创建成功 |
400 |
用户请求非法 |
401 |
用户身份认证失败 |
403 |
|
409 |
创建冲突,同名的私有hook已经存在 |
429 |
请求数量过多 |
500 |
服务器内部错误 |