10 测试资源代理


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


10.1 ocf_tester测试


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


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


1

ocf-tester -n <name> [-o  <param>=  <value> ... ] <resource agent>


  • 是任意的资源名字

  • 你可以通过 -o 选项设置任何你想设置的参数 =

  • 是你资源代理的完整路径


调用时,ocf-tester执行所有强制的操作(见第五章资源代理行为)


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


重要:

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


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


1

2

3

4

5

6

7

8

# 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就简单了:


1

2

# ocft make <RA>

# ocft test <RA>


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


10.2.4 ocf配置文件语法


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


CONFIG(一级选项)


这个选项是全局的,而且影响每一个测试用例;


  • AgentRoot (子选项)


1

AgentRoot /usr/lib/ocf/resource.d/xxx


正常情况下,我们假设资源代理脚本存在于heartbeat提供者的目录。使用AgentRoot来测试代理是否分布于另外的目录。


  • InstallPackage (子选项)


1

InstallPackage package [package2 [...]]

测试需要用到的包,如果包已经安装了,则不再安装。

  • HangTimeout(子选项)


1

HangTimeout secs

运行资源代理操作最大的执行时间,如果超过这个时间,操作视为失效。


SETUP-AGENT(一级选项)


1

2

SETUP-AGENT

 bash commands


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


CASE (一级选项)


1

CASE "description"


这是测试套件的主要构建块。每个测试用列都可以在一个CASE选项中描述。一个用例由跟着RunAgent子选项的若个子选项组成。


  • Var (子选项)


1

Var VARIABLE=value


这是为资源代理设置环境变量。通常显示为OCF_RESKEY_xxx,注意赋值符号“=”左右都没有空格。


  • Unvar (子选项)


1

Unvar VARIABLE [VARIABLE2 [...]]


移除一个环境变量


  • Include (子选项)


1

Include macro_name

包含宏 macro_name。参考下文CASE-BLOCK


  • Bash (子选项)


1

Bash bash_codes


这个选项设置操作系统环境变量,你可以插入BASH代码来定制系统环境。注意不要导致一些不可恢复的结果。


  • BashAtExit (子选项)


1

BashAtExit bash_codes


这个选项恢复操作系统环境,这样可以正确运行新的测试用例。当然也可以直接使用Bash选项来恢复。然而,如果进程发生错误,脚本讲不运行恢复的代码直接退出,这种情况下,应该使用BashAtExit,可以在退出前恢复系统环境。


  • RunAgent (子选项)


1

RunAgent cmd [ret_value]


这个选项运行资源代理。“cmd” 是资源代理的参数,比如"startstatusstop..."。第二个参数是可选的。可用来比较脚本运行结果的返回值和期望值。如果不同,应该可以找到一些bug


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


1

Bash@192.168.1.100 date


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


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


CASE-BLOCK (一级选项)


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