详细测试配置¶
测试配置¶
一次集成测试运行需要三个配置项
targets: 在哪些主机上运行;这是一个将主机映射到 ssh 主机密钥的字典,例如:“username@hostname.example.com: ssh-rsa long_hostkey_here”roles: 如何使用这些主机;这是一个列表的列表,其中每个条目列出了要在单个主机上运行的所有角色。例如,单个条目可能是[mon.1, osd.1]。tasks: 如何设置集群以及运行哪些测试;参见下面的示例
此配置的格式是 YAML,一种结构化数据格式,既可读又可编辑。
例如,一个完整的测试运行配置,用于设置一个三机集群,通过 ceph-fuse 挂载 Ceph,并让您停留在交互式 Python 提示符下进行手动探索(并使您能够通过 SSH 连接到节点并临时使用实时集群),可能如下所示
roles:
- [mon.0, mds.0, osd.0]
- [mon.1, osd.1]
- [mon.2, client.0]
targets:
ubuntu@host07.example.com: ssh-rsa host07_ssh_key
ubuntu@host08.example.com: ssh-rsa host08_ssh_key
ubuntu@host09.example.com: ssh-rsa host09_ssh_key
tasks:
- install:
- ceph:
- ceph-fuse: [client.0]
- interactive:
repo: git://git.ceph.com/ceph.git
roles 和 targets 下的条目数必须匹配。
请注意 tasks 部分中每个任务名称后面的冒号。还要注意每个任务前面的破折号。这是 YAML 中有序列表的语法,用于指定任务的执行顺序。
install 任务需要排在所有其他任务之前。
列出的目标需要可解析的主机名。如果您没有运行 DNS 服务器,可以将条目添加到 /etc/hosts。您还需要能够无需密码即可通过 SSH 连接到列出的目标,并且远程用户需要具有无密码的 sudo 访问权限。请注意,targets 条目末尾的 ssh 密钥是主机上的公共 ssh 密钥。这些位于 /etc/ssh/ssh_host_rsa_key.pub
如果您将上述文件保存为 example.yaml,您可以像这样运行 teuthology
./virtualenv/bin/teuthology example.yaml
可以配置安装,从而可以省略指定目标和主机密钥。Teuthology 使用 --lock 选项运行,该选项根据 YAML 中的 roles 锁定目标。Teuthology 从可用的测试机器池中获取机器;但由于大多数时候机器都很忙,您可能需要等待它们空闲,否则命令会因缺乏可用机器而失败。为避免这种情况,您可以将 --block 与 --lock 一起指定,这将使 teuthology 重试直到找到并锁定所需的机器。
您也可以传递 -v 选项以获得更详细的执行。有关更多选项,请参阅 teuthology --help。
多个配置文件¶
您可以将多个文件作为参数传递给 teuthology。每个文件都将作为配置文件读取,并且其内容将被合并。这允许您共享“简单 3 节点集群”的定义。源代码树附带 roles/3-simple.yaml,因此我们可以跳过上面 example.yaml 中的 roles 部分,然后运行
./virtualenv/bin/teuthology roles/3-simple.yaml example.yaml
预留目标机器¶
如果您指定 --lock 选项,Teuthology 会自动为您锁定节点。如果没有此选项,您必须在 targets.yaml 文件中指定要运行的机器,并使用 teuthology-lock 锁定它们。
请注意,机器的默认所有者形式为:USER@HOST,其中 USER 是发出锁定命令的用户,HOST 是运行锁定命令的机器。
您可以在运行 teuthology 或 teuthology-lock 时使用 --owner 选项覆盖此设置。
使用 teuthology-lock,您还可以添加描述,以便记住您正在运行哪些测试。这可以在锁定或解锁机器时完成,也可以作为使用 --update 选项的单独操作完成。要锁定 3 台机器并设置描述,请运行
./virtualenv/bin/teuthology-lock --lock-many 3 --desc 'test foo'
如果机器因某种原因无法使用,您可以将其标记为停机
./virtualenv/bin/teuthology-lock --update --status down machine1 machine2
要查看所有机器的状态,请使用 --list 选项。这也可以限制为特定的机器
./virtualenv/bin/teuthology-lock --list machine1 machine2
为作业选择机器¶
可以针对一台或多台 machine_type 值运行作业。还可以告诉 teuthology 只选择那些与作业 YAML 中指定的以下条件匹配的机器
os_type(例如“rhel”、“ubuntu”)os_version(例如“7.0”、“14.04”)arch(例如“x86_64”)
任务¶
任务是 teuthology.task 包中的一个 Python 模块,其中包含一个名为 task 的可调用对象。它接收以下参数
ctx: 在测试运行期间可用的上下文,具有有用的属性,例如cluster,允许任务访问远程主机。任务也可以将它们的内部状态存储在这里。(TODO 警惕命名空间冲突。)config: 配置文件中冒号后面的数据结构,例如,对于上面的ceph-fuse示例,它将是一个列表,如["client.0"]。
任务可以是简单的函数,按照它们在 tasks 中列出的顺序调用一次。但有时任务能够清理自身是有意义的:例如,在测试运行后卸载文件系统。返回 Python context manager 的任务可调用对象会将管理器添加到堆栈中,并且堆栈将在运行结束时展开。这意味着清理操作将按相反的顺序运行,无论成功还是失败。编写上下文管理器的一种好方法是 contextlib.contextmanager 装饰器;在现有任务中查找该字符串以查看示例,并注意它们使用 yield 的位置。
有关一些更复杂的任务(例如 install 或 workunit)的更多详细信息,可以通过 python help 获取。例如
>>> import teuthology.task.workunit
>>> help(teuthology.task.workunit)
显示一页更多文档和更具体的示例。
一些更重要/常用的任务包括
ansible: 运行 ansible 任务。install: 默认情况下,安装任务会转到 gitbuilder 并安装最新构建的结果。但是,您可以向测试配置添加其他参数,使其安装任何分支、SHA、存档或 URL。以下是有效参数。branch: 指定一个分支 (firefly, giant...)。flavor: 指定一个 flavor (next, unstable...)。flavor 可以被认为是分支的子集。有时(例如 unstable),它们可能具有预定义的含义。project: 指定一个项目 (ceph, samba...)。sha1: 安装具有此 sha1 值的构建。tag: 指定此构建的标签/标识文本 (v47.2, v48.1...)。
ceph: 启动 Cephoverrides: 覆盖行为。通常,这包括被覆盖的子任务。从技术上讲,Overrides 不是一个任务(overrides.py 文件中没有 'def task'),但从用户的角度来看,可以描述为像任务一样运行。子任务可以嵌套更多信息。例如,安装任务的覆盖是项目特定的,因此 yaml 文件的以下部分将导致所有 ceph 安装默认为使用 jewel 分支overrides: install: ceph: branch: jewel
workunit: workunit 是一种在目标上对任务和行为进行分组的方法。sequential: 将子任务分组为一个单元,其中子任务按列出的顺序依次运行。parallel: 将子任务分组为一个单元,其中所有子任务并行运行。
顺序任务和并行任务可以嵌套。除非另有指定,否则任务按顺序运行。
上述列表只是对 teuthology 中可用任务的不完整描述。teuthology/task 子目录包含实现任务的 teuthology 特定 python 文件。
teuthology 使用的额外任务可以在 ceph-qa-suite/tasks 中找到。teuthology 运行不需要这些任务,但它们会测试特定的独立功能。想要为新功能定义测试的用户可以在此目录中实现新任务。
其中许多任务用于运行 ceph/ceph-qa-suite 中定义的 python 脚本。
故障排除¶
事后调试¶
测试完成后,archive 子目录会在相应的 remote 子目录下归档。我们可以使用顶级配置禁用此行为,例如
archive-on-error: true
如果 archive-on-error 为 true,则 archive 子目录仅针对失败的测试进行归档。
如果存档文件的大小超过 128MB,文件将使用 GZip 压缩。可以使用名为 log-compress-min-size 的顶级选项配置此阈值,例如
log-compress-min-size: 256GB
还支持其他大小单位后缀,有关详细信息,请参阅 humanfriendly 文档。
现场调试¶
有时当一个错误触发时,您希望探索系统现状,而不是自动清理。在 teuthology 配置文件中添加一个顶级
interactive-on-error: true
将使这成为可能。使用该选项,任何失败的*任务*之后都会调用 interactive 任务。这意味着在进行任何清理之前,您有机会检查系统——既可以通过 Teuthology,也可以通过额外的 SSH 连接——并且只有在您选择时才完成清理。只需退出交互式 Python 会话即可继续清理。
您可以使用 teuthology 命令选项 --interactive-on-error 启用交互式错误处理
交互式任务设施¶
interactive 任务提供一个提示符,供您与 teuthology 配置进行交互。可以使用 ctx 变量进行探索,并且为了方便起见添加了一个 pprint.PrettyPrinter().pprint 对象作为 pp,这样您就可以执行 pp(dict-of-interest) 之类的操作来查看字典的格式化视图。
这对于在两个任务之间暂停执行测试也很有用,无论是为了执行临时操作,还是为了检查集群的状态。完成后按 control-D 继续。
您需要将 interactive 嵌套在配置中的 tasks 下。您可以在任务列表中包含任意数量的 interactive 任务。
一个例子
tasks:
- ceph:
- interactive:
测试沙盒目录¶
Teuthology 目前将大多数测试文件和挂载点放在一个沙盒目录中,默认为 /home/$USER/cephtest。要更改沙盒目录的位置,可以在 $HOME/.teuthology.yaml 中指定以下选项
test_path: <directory>
Shaman 选项¶
Shaman 是一个帮助程序类,可用于根据“shaman_host”: 'shaman.ceph.com' 构建指定包的 uri。
选项
use_shaman: True # Enable to use Shaman, False as default
shaman:
force_noarch: True # Force to use "noarch" to build the uri