Loading
close

云产品自定义hook脚本

time 更新时间:2022-11-25 19:48:02

本页记录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。

./images/hook_status.png

hook目录结构示例:
./images/hook_dirs.png

hook 执行流程

以安装流程为例:
./images/hook_flow.png
升级过程和删除过程中hook的执行流程与安装流程基本相同。
ECP 6.0.2 版本开放了基础云产品删除能力,需要基础云产品基于平台hook规范定义了 delete/check/pre 前置删除检查脚本后才可进行删除操作。
foundation云产品必须基于平台hook规范定义delete/check/pre脚本才能删除, 非foundation云产品只能定义delete/check/pre脚本。删除过程中的hook检查:

  1. 前置检查
    1. 云产品基于平台hook规范定义了delete/check/pre脚本
    2. 是否存在依赖的云产品
  2. 删除云产品CR
  3. 触发operator完成删除操作
    1. 执行delete/check/pre删除前检查脚本
      1. 成功则继续后续删除流程
      2. 失败则记录错误信息, 云产品状态重置为已安装状态
    2. operator常规删除流程

      删除前置检查定义

      云产品可以通过定义 delete/check/pre 进行云产品的删除前置检查,检查不通过时,禁止删除云产品。
      由于很多基础云产品包中附带了一个默认的 delete/check/pre 脚本,不具备实际的检查能力,当云产品存在前置删除检查脚本时,同时会检查此目录下任一脚本中是否包含如下语句,当其中一个脚本存在此语句才可判断为一个有效的脚本:
      **echo '{name} delete pre check pass'**** **({name}为云产品名)

示例:

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 操作自定义资源相关的命令,必须使用自定义资源全称,原生资源不受影响 。
此篇文章对你是否有帮助?
没帮助
locked-file

您暂无权限访问该产品