env_check扩展开发实战:创建自定义系统命令检查actor的完整指南
【免费下载链接】env_checkA tool for "health checking" after operating system upgrade项目地址: https://gitcode.com/openeuler/env_check
前往项目官网免费下载:https://ar.openeuler.org/ar/
env_check是openEuler社区开发的一款系统健康检查工具,专门用于操作系统升级后的环境验证。本文将详细介绍如何为env_check创建自定义系统命令检查actor,帮助开发者快速上手扩展开发。😊
什么是env_check?
env_check是一个强大的系统健康检查框架,它通过actor模式来执行各种系统命令和配置检查。在操作系统升级后,使用env_check可以快速验证系统功能是否正常,确保升级过程的可靠性。
该工具的核心思想是将每个检查任务封装为一个独立的actor,每个actor负责特定的系统命令或功能验证。这种模块化设计使得扩展非常灵活,开发者可以根据需要轻松添加新的检查项。
env_check架构解析
env_check采用分层架构设计,主要包含以下几个核心部分:
1. 基础actor类
所有检查actor都继承自基础类BaseCheckActor,位于sut/env_check/check_actor/base_check_actor.py。这个基类定义了actor的基本属性和接口:
class BaseCheckActor(object): SUCCESS = True FAIL = False task_type = TaskType name = "" description = "" level = "" priority = "" @staticmethod def run(node): result = ReturnMessage(result=True, solution="", message={}, failed_reason="") return result2. 系统命令检查基类
对于系统命令检查,env_check提供了专门的基类OeBaseActor,位于sut/env_check/check_actor/oe_base_actor.py。这个类封装了执行Shell脚本的标准流程:
class OeBaseActor(BaseCheckActor): name = "OeBaseActor" description = "this is openEuler base test actor." level = "low" priority = "unnecessary" task_type = (BaseCheckActor.task_type.SYSTEM_UPGRADE,) sh_dir = os.path.join(os.path.abspath(os.path.dirname( os.path.dirname(os.path.abspath(__file__)))), 'smoke_test/local_sh') sh_file = ''3. 测试脚本目录
所有的系统命令测试脚本都位于sut/env_check/smoke_test/local_sh/目录下,按功能分类组织。
创建自定义系统命令检查actor的步骤
步骤1:创建测试脚本
首先,在相应的测试脚本目录中创建Shell测试脚本。以创建一个检查ls命令的actor为例:
#!/usr/bin/bash -x # Create: 2024-01-01 OET_PATH=$( cd "$(dirname "$0")" || exit 1 pwd ) source "$OET_PATH/../../common/common_lib.sh" # 环境准备 function pre_test() { LOG_INFO "开始准备测试环境" OLD_LANG=$LANG export LANG=en_US.UTF-8 LOG_INFO "测试环境准备完成" } # 用例执行 function run_test() { LOG_INFO "开始测试ls命令..." # 测试基本ls功能 ls /tmp CHECK_RESULT $? # 测试长格式显示 ls -l /tmp CHECK_RESULT $? # 测试显示隐藏文件 ls -a /tmp CHECK_RESULT $? # 测试帮助信息 ls --help | grep -E "Usage|用法" CHECK_RESULT $? LOG_INFO "ls命令测试完成!" } # 环境清理 function post_test() { LOG_INFO "开始恢复测试环境" export LANG=${OLD_LANG} LOG_INFO "测试环境恢复完成" } main $@将脚本保存为sut/env_check/smoke_test/local_sh/01_files_directories/oe_test_ls.sh
步骤2:创建对应的actor类
在sut/env_check/check_actor/目录下创建新的actor文件,或者添加到现有的actor文件中。以添加到basic_commands_actor.py为例:
# -*- coding: utf-8 -*- from sut.env_check.check_actor.oe_base_actor import OeBaseActor class OeLsActor(OeBaseActor): name = "OeLsActor" description = "检查ls命令功能是否正常" level = "High" priority = "mandatory" task_type = (OeBaseActor.task_type.SYSTEM_UPGRADE,) sh_file = '01_files_directories/oe_test_ls.sh'步骤3:理解actor属性配置
每个actor需要配置以下关键属性:
- name: actor的唯一标识符,建议使用描述性名称
- description: actor的功能描述,会在检查结果中显示
- level: 检查级别,可以是High/Medium/Low
- priority: 优先级,mandatory表示必须通过,optional表示可选
- task_type: 任务类型,可以是系统升级、配置迁移等
- sh_file: 对应的测试脚本路径(相对于smoke_test/local_sh)
步骤4:测试脚本编写规范
测试脚本需要遵循统一的格式:
- 环境准备函数 (pre_test): 设置测试环境,如语言环境、临时文件等
- 测试执行函数 (run_test): 执行具体的命令测试
- 环境清理函数 (post_test): 恢复测试环境
- 结果检查: 使用
CHECK_RESULT $?检查命令执行结果
实战案例:创建网络配置检查actor
让我们通过一个实际案例来演示如何创建一个检查网络配置的actor。
1. 创建网络测试脚本
在sut/env_check/smoke_test/local_sh/04_network/目录下创建oe_test_network_config.sh:
#!/usr/bin/bash -x # Create: 2024-01-01 OET_PATH=$( cd "$(dirname "$0")" || exit 1 pwd ) source "$OET_PATH/../../common/common_lib.sh" # 环境准备 function pre_test() { LOG_INFO "开始准备网络测试环境" OLD_LANG=$LANG export LANG=en_US.UTF-8 LOG_INFO "网络测试环境准备完成" } # 用例执行 function run_test() { LOG_INFO "开始网络配置检查..." # 检查网络接口 ip link show CHECK_RESULT $? # 检查IP地址配置 ip addr show CHECK_RESULT $? # 检查路由表 ip route show CHECK_RESULT $? # 检查DNS配置 cat /etc/resolv.conf CHECK_RESULT $? # 测试网络连通性 ping -c 3 8.8.8.8 CHECK_RESULT $? LOG_INFO "网络配置检查完成!" } # 环境清理 function post_test() { LOG_INFO "开始恢复测试环境" export LANG=${OLD_LANG} LOG_INFO "测试环境恢复完成" } main $@2. 创建网络检查actor
在sut/env_check/check_actor/目录下创建network_config_actor.py:
# -*- coding: utf-8 -*- from sut.env_check.check_actor.oe_base_actor import OeBaseActor class OeNetworkConfigActor(OeBaseActor): name = "OeNetworkConfigActor" description = "检查系统网络配置是否正常" level = "High" priority = "mandatory" task_type = (OeBaseActor.task_type.SYSTEM_UPGRADE,) sh_file = '04_network/oe_test_network_config.sh' class OePingActor(OeBaseActor): name = "OePingActor" description = "检查ping命令和网络连通性" level = "Medium" priority = "mandatory" task_type = (OeBaseActor.task_type.SYSTEM_UPGRADE,) sh_file = '04_network/oe_test_ping.sh' class OeNetstatActor(OeBaseActor): name = "OeNetstatActor" description = "检查网络连接状态" level = "Medium" priority = "optional" task_type = (OeBaseActor.task_type.SYSTEM_UPGRADE,) sh_file = '04_network/oe_test_netstat.sh'高级扩展技巧
1. 自定义检查逻辑
如果需要更复杂的检查逻辑,可以直接继承BaseCheckActor而不是OeBaseActor:
# -*- coding: utf-8 -*- import subprocess import json from sut.env_check.check_actor.base_check_actor import BaseCheckActor, ReturnMessage class CustomServiceActor(BaseCheckActor): name = "CustomServiceActor" description = "自定义服务状态检查" level = "High" priority = "mandatory" task_type = (BaseCheckActor.task_type.SYSTEM_UPGRADE,) @staticmethod def run(node): solution = "" message = {} failed_reason = "" try: # 检查系统服务状态 result = subprocess.run(['systemctl', 'is-active', 'sshd'], capture_output=True, text=True) if result.returncode == 0 and result.stdout.strip() == 'active': message['sshd_status'] = 'active' return ReturnMessage(BaseCheckActor.SUCCESS, solution, message, failed_reason) else: failed_reason = f"SSH服务状态异常: {result.stdout.strip()}" solution = "请检查sshd服务配置并重启服务" return ReturnMessage(BaseCheckActor.FAIL, solution, message, failed_reason) except Exception as e: failed_reason = f"检查服务状态时发生异常: {str(e)}" solution = "请检查系统服务管理工具是否可用" return ReturnMessage(BaseCheckActor.FAIL, solution, message, failed_reason)2. 参数化检查
可以通过node参数传递配置信息,实现参数化检查:
class ParametricCheckActor(BaseCheckActor): name = "ParametricCheckActor" description = "参数化系统检查" level = "Medium" priority = "mandatory" task_type = (BaseCheckActor.task_type.SYSTEM_UPGRADE,) @staticmethod def run(node): solution = "" message = {} failed_reason = "" # 从node参数获取配置 check_items = node.get('check_items', []) threshold = node.get('threshold', 80) for item in check_items: # 根据配置执行相应的检查 pass return ReturnMessage(BaseCheckActor.SUCCESS, solution, message, failed_reason)3. 批量检查多个命令
可以创建一个actor来批量检查多个相关命令:
class MultipleCommandsActor(BaseCheckActor): name = "MultipleCommandsActor" description = "批量检查文件操作命令" level = "Medium" priority = "mandatory" task_type = (BaseCheckActor.task_type.SYSTEM_UPGRADE,) @staticmethod def run(node): solution = "" message = {} failed_commands = [] commands_to_check = ['ls', 'cp', 'mv', 'rm', 'mkdir'] for cmd in commands_to_check: try: result = subprocess.run(['which', cmd], capture_output=True, text=True) if result.returncode != 0: failed_commands.append(cmd) message[f'{cmd}_status'] = 'not found' else: message[f'{cmd}_status'] = 'available' message[f'{cmd}_path'] = result.stdout.strip() except Exception as e: failed_commands.append(cmd) message[f'{cmd}_status'] = 'error' if failed_commands: failed_reason = f"以下命令检查失败: {', '.join(failed_commands)}" solution = "请安装缺失的命令或检查PATH环境变量" return ReturnMessage(BaseCheckActor.FAIL, solution, message, failed_reason) else: return ReturnMessage(BaseCheckActor.SUCCESS, solution, message, "")调试和测试技巧
1. 本地测试actor
在开发过程中,可以单独测试actor的功能:
# test_actor.py import sys sys.path.append('/path/to/env_check') from sut.env_check.check_actor.your_new_actor import YourNewActor # 创建测试节点 test_node = { 'hostname': 'test-host', 'config': {} } # 执行检查 result = YourNewActor.run(test_node) print(f"检查结果: {result.result}") print(f"解决方案: {result.solution}") print(f"失败原因: {result.failed_reason}") print(f"详细信息: {result.message}")2. 查看执行日志
env_check会生成详细的执行日志,位于当前目录的env_check.log文件中。通过查看日志可以了解actor的执行过程和问题:
# 查看最近的日志 tail -f env_check.log # 查看特定actor的日志 grep "OeLsActor" env_check.log3. 验证测试脚本
在集成到actor之前,先单独运行测试脚本:
# 给脚本添加执行权限 chmod +x sut/env_check/smoke_test/local_sh/01_files_directories/oe_test_ls.sh # 执行测试脚本 bash -x sut/env_check/smoke_test/local_sh/01_files_directories/oe_test_ls.sh最佳实践建议
1. 命名规范
- actor类名使用
Oe[功能]Actor格式 - 测试脚本使用
oe_test_[功能].sh格式 - 保持命名一致性和可读性
2. 错误处理
- 在测试脚本中做好错误检查和清理
- 在actor中捕获异常并提供有意义的错误信息
- 区分警告和错误,合理设置priority
3. 性能考虑
- 避免长时间运行的检查
- 对于耗时操作,考虑设置超时机制
- 合理使用缓存,避免重复检查
4. 文档化
- 为每个actor编写清晰的描述
- 在测试脚本中添加必要的注释
- 记录检查项的预期行为和失败处理方案
总结
通过env_check的actor扩展机制,我们可以轻松地为系统健康检查添加新的检查项。无论是简单的命令检查还是复杂的配置验证,都可以通过创建相应的actor来实现。
关键要点:
- 继承合适的基类:系统命令检查使用
OeBaseActor,复杂逻辑使用BaseCheckActor - 遵循测试脚本规范:统一的三段式结构(准备-执行-清理)
- 合理配置actor属性:正确设置name、description、level和priority
- 完善的错误处理:提供清晰的错误信息和解决方案
- 充分的测试验证:在集成前充分测试actor和测试脚本
env_check的扩展开发不仅简单高效,而且具有良好的可维护性。通过模块化的设计,我们可以持续为系统健康检查添加新的能力,确保openEuler系统升级后的稳定性和可靠性。
现在,你已经掌握了env_check扩展开发的核心技能,可以开始创建自己的自定义检查actor了!🚀
【免费下载链接】env_checkA tool for "health checking" after operating system upgrade项目地址: https://gitcode.com/openeuler/env_check
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考