星期三, 九月 11, 2013

OCF开发者指南 第十章

10 测试资源代理

这一章讨论资源代理的自动测试。测试是开发的非常关键的问题,对开发新的资源代理和修改已经有的资源代理都很重要。

10.1 用ocf_tester测试

资源代理仓库(包括所有的资源代理包)都有一个应用程序叫ocf_tester.这个脚本可以方便地用来测试你的资源代理。

ocf_tester 通常以root用户调用,像这样:

ocf-tester -n <name> [-o  <param>= <value> ... ] <resource agent>
  • 是任意的资源名字
  • 你可以通过 -o 选项设置任何你想设置的参数 = 
  • 是你资源代理的完整路径
调用时,ocf-tester执行所有强制的操作(见第五章 资源代理行为)

也可以测试可选的操作。可选操作必须符合其声明的行为,如果没有实现,ocf-tester会标一个错误标记。

重要:ocf-tester不支持操作的“干运行”,也不产生任何的资源仿制品。其运行都是和实际的资源代理一样,不论其是否打开和关闭了数据库,挂载了文件系统,启动或停止了虚拟机等等。所以,一定要小心。

比如,你可以运行对foobar资源代理使用 ocf-tester,如下:

# ocf-tester -n foobartest \
             -o superfrobnicate=true \
             -o datadir=/tmp \
             /home/johndoe/ra-dev/foobar
Beginning tests for /home/johndoe/ra-dev/foobar...
* Your agent does not support the notify action (optional)
* Your agent does not support the reload action (optional)
/home/johndoe/ra-dev/foobar passed all tests

10.2 用ocft测试

ocft也是一种资源代理测试工具。和ocf-tester不一样的是,ocft可以自动生成复杂的测试环境,包括包的安装和任意的shell脚本。

10.2.1 ocft 组件

ocft包含如下组件:
  • 一个测试用例产生器(/usr/sbin/ocf) --- 从测试用例配置文件产生shell脚本
  • 配置文件(/usr/share/resource-agents/ocft/configs)--- 一个配置文件包含环境变量设置和一个资源代理的配置文件
  • 测试脚本保存在/var/lib/resource-agents/ocft/cases/,但是通常不需要去管它们

10.2.2 定制测试环境

ocft修改资源代理的运行时环境,或则是通过改变环境变量(使用OCF定义的接口)或者运行ad-hoc shell脚本,这种脚本可以改变权限或者卸载一个文件系统。

10.2.3 如何测试

你必须了解你要测试的软件,画一个所有感兴趣的运行场景的草图,标出所有期望和不期望的条件和资源代理应该出现的运行结果。然后,你需要将这些条件和期望运行结果编码成ocft的测试用列。这样运行ocft就简单了:

# ocft make <RA>
# ocft test <RA>

头一个命令产生测试用例脚本,第二个命令运行产生的脚本并检查输出。

10.2.4 ocf配置文件语法

有4个一级选型,每个一级选项下面有一个或多个子选项

CONFIG(一级选项)

这个选项是全局的,而且影响每一个测试用例;
  • AgentRoot (子选项)
AgentRoot /usr/lib/ocf/resource.d/xxx
正常情况下,我们假设资源代理脚本存在于heartbeat提供者的目录。使用AgentRoot来测试代理是否分布于另外的目录。
  • InstallPackage (子选项)
InstallPackage package [package2 [...]]
测试需要用到的包,如果包已经安装了,则不再安装。
  • HangTimeout(子选项)
HangTimeout secs
运行资源代理操作最大的执行时间,如果超过这个时间,操作视为失效。

SETUP-AGENT(一级选项)

SETUP-AGENT
  bash commands

如果资源代理在测试前需要初始化,可以在这里放置bash代码。初始化只完成一次。如果需要再次执行初始化,可以删除/tmp/.[AGENT_NAME]_set 标记文件。

CASE (一级选项)

CASE "description"
这是测试套件的主要构建块。每个测试用列都可以在一个CASE选项中描述。一个用例由跟着RunAgent子选项的若个子选项组成。
  • Var (子选项)
Var VARIABLE=value
这是为资源代理设置环境变量。通常显示为 OCF_RESKEY_xxx,注意赋值符号“=”左右都没有空格。
  • Unvar (子选项)
Unvar VARIABLE [VARIABLE2 [...]]
移除一个环境变量
  •  Include (子选项)
Include macro_name
包含宏 macro_name。参考下文CASE-BLOCK。
  • Bash (子选项)
Bash bash_codes
这个选项设置操作系统环境变量,你可以插入BASH代码来定制系统环境。注意不要导致一些不可恢复的结果。
  • BashAtExit (子选项)
BashAtExit bash_codes
这个选项恢复操作系统环境,这样可以正确运行新的测试用例。当然也可以直接使用Bash选项来恢复。然而, 如果进程发生错误,脚本讲不运行恢复的代码直接退出,这种情况下,应该使用BashAtExit,可以在退出前恢复系统环境。
  • RunAgent (子选项)
RunAgent cmd [ret_value]
这个选项运行资源代理。“cmd” 是资源代理的参数,比如"start,status,stop..."。第二个参数是可选的。可用来比较脚本运行结果的返回值和期望值。如果不同,应该可以找到一些bug。

也可以不是本地执行而是远程执行。使用的协议是ssh,程序在后台运行。只需要增加在子选项后面加上@就可以了。如下:

Bash@192.168.1.100 date
上面的例子会运行date程序。远程命令都是在后台运行的。

NB:这些还需要有多谢说明(这个话是说给编写者的:译者注)

CASE-BLOCK (一级选项)

CASE-BLOCK选项定义可以被包含在CASE中的宏。所有CASE的子选项都可以使用。


没有评论: