本页记录ECP平台hook的使用方法,用于指导现有云产品增加hook脚本以及foundation服务迁移为云产品时增加hook脚本。hook脚本在部署时独立运行, 不会侵入项目本身的hook操作。
hook 名词解析
1、install: 安装。
2、upgrade: 升级。
3、delete: 删除。
4、check: 检查,执行具体操作前、后检查环境状态。
5、job: 工作, 执行具体的操作前、后做相关的调整操作。
6、post: 后置, 动作完成后执行。
7、pre: 前置, 动作完成前执行。
hook 定义方法
1、创建目录
在云产品的ark项目(如ark-murano)下创建 hook目录。
2、创建执行路径
在 hook下按需创建install | upgrade | delete目录, 然后分别按需创建check| job, 在此层目录下按需创建post | pre目录, 完成三级目录, 对应着操作为 install 下的 check 下的 pre 时执行,以此类推。
3、创建脚本
在 pre 目录下, 以001_abc.sh, 命名, 001, 002 代表该文件在此处执行顺序, abc 为该文件名称。里面为要执行的脚本, 该脚本文件会在busybox里执行。
4、验证
文件脚本经busybox 里验证后, 提交到云产品对应的ark项目,将云产品重新打包后到环境中执行安装、升级或者删除, 会在ems命名空间的云产品对应的cloudproduct cr中看到hook的相关状态信息。hook状态包括undefined、unexecuted、executing、successful、failed。
hook目录结构示例:
hook 执行流程
以安装流程为例:
升级过程和删除过程中hook的执行流程与安装流程基本相同。
ECP 6.0.2 版本开放了基础云产品删除能力,需要基础云产品基于平台hook规范定义了 delete/check/pre 前置删除检查脚本后才可进行删除操作。
foundation云产品必须基于平台hook规范定义delete/check/pre脚本才能删除, 非foundation云产品只能定义delete/check/pre脚本。删除过程中的hook检查:
- 前置检查
- 云产品基于平台hook规范定义了delete/check/pre脚本
- 是否存在依赖的云产品
- 删除云产品CR
- 触发operator完成删除操作
- 执行delete/check/pre删除前检查脚本
- 成功则继续后续删除流程
- 失败则记录错误信息, 云产品状态重置为已安装状态
- operator常规删除流程
删除前置检查定义
云产品可以通过定义delete/check/pre
进行云产品的删除前置检查,检查不通过时,禁止删除云产品。
由于很多基础云产品包中附带了一个默认的 delete/check/pre 脚本,不具备实际的检查能力,当云产品存在前置删除检查脚本时,同时会检查此目录下任一脚本中是否包含如下语句,当其中一个脚本存在此语句才可判断为一个有效的脚本:**echo '{name} delete pre check pass'**
** **({name}为云产品名)
- 执行delete/check/pre删除前检查脚本
示例:
echo ‘cinder delete pre check pass’
注意:ECP检查会完整匹配此段代码, ‘{name} delete pre check pass’ 必须用单引号包裹.
自定义错误检查提示
安装、升级,删除前置检查脚本中,可通过注释定义此脚本执行失败时的提示信息,支持如下注释信息,当有多条同名注释时,只会取第一条注释,可以编写多个脚本来完成不同的检查。
- fail_zh_hans: 中文错误提示
- fail_en: 英文错误提示
当未定义错误提示信息时,提示信息为:
- 中文: 云产品删除失败
- 英文: Cloud product deletion failed
示例:
001_placehold.sh 此脚本执行失败时,中文界面下会弹出存在异常数据的提示信息。
#!/bin/bash
# fail_zh_hans: 存在异常数据
# fail_en: Has exception data
set -ex
function placehold() {
echo 'cinder delete pre check pass'
}
main() {
placehold
}
main
注意事项
- 在脚本中通过 kubectl 操作自定义资源相关的命令,必须使用自定义资源全称,原生资源不受影响 。