(原文)
在 Ubuntu precise 开发周期中,Canonical Platform Server 团队一直在致力于自动化在 Ubuntu 上测试 Openstack。
这项工作的范围是
- 对 Openstack trunk 进行提交时的测试,以评估上游代码库的当前状态与 Ubuntu precise 中的当前打包以及部署 Openstack 的当前 Juju charms 的兼容性。
- 对 Openstack Diablo 在 Ubuntu 11.10 上进行 SRU 测试。
Openstack 通过使用 gerrit 与 Jenkins 进行大量的预提交测试;我们希望通过 Ubuntu 重点测试来补充这一点,从而为已经完成的上游测试提供另一个维度。
所以喝杯咖啡,坐稳,这不是一篇短文……
实验室设置
Ubuntu Openstack QA 实验室由 12 台服务器组成;该解决方案的主要服务器是安装了 Ubuntu 11.10 的服务器,提供以下功能
- Juju – 用于在实验室中部署 Openstack charms
- Cobbler 支持服务器配置(使用 Oneiric 中的 Ubuntu Orchestra 包)
- Jenkins CI – 提供基于上游提交到 github 存储库的触发以及常规作业控制和报告。
- Schroots 用于 Oneiric 和 Precise 以本地构建包
- 一个 reprepro 管理的本地存档用于 Oneiric 和 Precise
- 基于 Squid 的存档缓存,以减少实验室中的安装时间
此服务器还充当进出实验室的网关(它设置为 NAT 路由器)。
其他 11 台服务器在 Cobbler 中注册;所有服务器都连接到 Sentry CDU(Cabinet Distribution Unit),允许从 Cobbler 完全控制电源 – 感谢 Andres Rodriguez 开发 Cobbler 支持这种类型 CDU 所需的围栏组件。
预先播种的 LVM 快照安装
启动新的集成测试运行需要关闭所有机器并从头开始重新配置。 重要的是我们的部署和测试运行能够应对上游提交的频率,特别是随着 Openstack 接近里程碑和发布时,频率会增加。 在初步设置好实验室后,我们能够在 ~30 分钟内拆除所有机器、重新配置和部署 Openstack。
重要的是我们能够最大限度地减少完成测试周期所需的时间。 为此,我们采用了 LVM 快照和根分区恢复的使用,在 netboot 安装期间。 过程如下
- 测试运行开始
- Juju 部署服务(例如 nova-compute)
- 机器通过 netboot 启动,并使用预先播种的 LVM 安装到 /dev/qalab/root
- 在安装结束时,根文件系统移动到 /dev/qalab/pristine-[release]-root,并在 /dev/qalab/root 创建快照
- 机器重新启动,运行 Juju 并部署 nova-compute 作为 Openstack 部署的一部分。 这将进行烟雾测试。
- 下一个测试运行开始。 所有机器都终止。 Juju 重新部署 nova-compute,机器通过 netboot 启动,Ubuntu 安装启动。
- 安装检查 /dev/qalab/pristine-[release]-root 是否存在逻辑卷。 如果存在,则在 /dev/qalab/root 创建新的快照并重新启动。 如果不存在,则继续安装并转到步骤 4。
- 系统重新启动,Juju 安装并重新部署 nova-compute 到新的 Ubuntu 安装。
此过程在所有节点上并行进行。 这样,我们能够将拆除和重新配置节点所需的时间从 ~30 分钟减少到 10 到 15 分钟,具体取决于正在部署的服务。
通过这种方法,我们还最大限度地减少了节点在安装期间遇到存档不一致的几率。 这是一个已知问题,如果在任何节点遇到此问题,将导致整个部署失败。
所有这些都嵌入在 debian-installer 预播种中,通过 Cobbler 片段。 片段和启动脚本可在 lp:~openstack-ubuntu-testing/+junk/cobbler-lvm-snapshot 中找到。
将来,我们将研究使用 kexec 作为快照恢复后的替代方案,以减少等待服务器启动的时间。 这应该进一步缩短测试周期。 感谢 James Blair 的想法(请参阅 http://amo-probos.org/post/11)。
Jenkins 管理
Jenkins 中的所有项目都使用 Jinja2 XML 模板与 python-jenkins (python-jenkins) 结合管理;这使得在实验室中设置新作业和根据需要重新配置现有作业变得非常容易(同时也提供了出色的备份!)。
模板和管理脚本可在 lp:~openstack-ubuntu-testing/+junk/jenkins-qa-lab 中找到
在 Ubuntu Precise 上测试 Openstack Essex
这是在实验室中设置的第一个测试。 Jenkins(使用 git 插件)监视上游 github.com 存储库中的 master 分支的提交。 当检测到更改时,将触发以下过程
构建
目标:验证上游 trunk 是否仍然可以与 Ubuntu 的当前打包一起构建。
- 基于最新提交到上游组件生成新的快照上游 tarball。
- 从 lp:~ubuntu-server-dev/<COMPONENT>/essex 拉取最新的存档打包。
- 将来自 lp:~openstack-ubuntu-testing/<COMPONENT>/essex 的测试打包中的任何更改合并。
- 自动为新的上游提交创建新的 changelog 条目。
- 使用 sbuild 在干净的 schroot 中生成源包。
假设包已在本地构建
- 源包上传到测试 PPA(ppa:openstack-ubuntu-testing/testing)
- 将测试打包分支推回 lp:~openstack-ubuntu-testing/<COMPONENT>/essex。
- 将 sbuild 的二进制包安装到本地 reprepro 管理的存档中。
此过程由单个脚本 (tarball.sh) 管理;感谢 Chuck Short 基于 Openstack 上游的工作完成了这部分过程。
对于 nova 项目的更改,然后执行部署阶段。
部署
目标:验证包是否可以安装、配置并达到已知良好状态,然后再执行测试。
此测试阶段使用 Juju 与 Cobbler 将 Openstack 部署到 QA 实验室基础设施;它使用支持使用本地存档的 Openstack charms 的分支以及由 Adam Gandelman 编写的围绕 Juju 的部署程序,该部署程序使用 Juju 执行实际部署并监视错误。
部署程序配置为知道 Openstack charms 的正确代码库在哪里、要部署哪些服务以及要在服务之间建立哪些关系。 正如上图所示,这并非易事,但 charms 和 Juju 完成了大部分艰巨的工作。
Openstack 部署成功后,将执行测试阶段。
测试
目标:验证实验室中部署的 Openstack 实际上是否有效!
此时,我们可以对新部署的云运行任何集成测试。 此测试可以帮助我们实现多个目标
- 尽早发现破坏 Openstack 功能的上游错误
- 验证 Ubuntu 开发版本中的打包分支与上游 trunk 兼容。
- 使用这些包,验证我们的 Juju charms 是否正在部署功能正常的 Openstack 云,并且是否已更新到上游的任何部署相关配置更改。
目前,这看起来像这样
- 配置 Openstack 部署(Adams 部署程序脚本提供了一些用于在环境中定位特定服务的实用程序函数)
- 为 Nova 创建网络配置,用于私有实例网络以及公共浮动 IP 池。
- 将图像上传到 Glance 服务器以供测试使用
- 在 Keystone 服务器中创建 EC2 凭据以供测试使用。
- 运行 devstack 练习测试脚本,这些脚本可确保部署的基本功能。 目前,这包括
- 基本的 euca-tools EC2 API,用于启动和停止实例
- EC2 AMI 包上传
- 浮动 IP 分配、关联和与实例的连接
- 卷创建和附加到实例
注意:这些是当前在 gerrit 上游对提交的更改运行的相同测试集。
从长远来看,我们计划在实验室中使用 Openstack Tempest 测试套件;Adam 目前正在使其启动并运行。
报告
QA 实验室中的 Jenkins 实例不可公开访问;但是,实验室中运行的所有作业都发布到 http://jenkins.qa.ubuntu.com,以便人们可以看到 Ubuntu precise 中测试打包的当前状态。
我们还在努力设置电子邮件通知。
迄今为止的成功
Juju charms 部署 Openstack 组件,其配置与 Ubuntu 打包中的上游 trunk 兼容,然后再更新打包。 以前,包首先更新到存档中,而 Juju charm 更新滞后,因为在更新后发现了不兼容性。
我们在第三个 Essex 里程碑发布前 2 天启用了自动化测试。 我们能够发现并帮助修复上游中的一些错误,包括关键错误,例如 921784。 在过去,这些错误通常在发布后被发现(上游和 Ubuntu 中)。
自 E3 以来,通过此测试发现了更多关键错误并已在上游修复,其中一些仅适用于 Ubuntu 特定的配置(未在上游测试),并且将在代码命中 Ubuntu 存档后被用户发现(请参阅 922232)。
实验室的进一步计划
对稳定分支进行预提交测试; Ubuntu Server 团队正在上游致力于维护已发布版本的 OpenStack 的稳定分支 – 这项工作将验证 review.openstack.org 中提出的补丁与 Ubuntu 中发布的版本的当前打包的兼容性。 最初,这将针对 Ubuntu 11.10 上的 Diablo,但在 Ubuntu 12.04 发布后也将支持 Essex。
参考文献
Jenkins 作业配置:lp:~openstack-ubuntu-testing/+junk/jenkins-qa-lab
支持实验室的脚本:lp:~openstack-ubuntu-testing/+junk/jenkins-scripts
LVM 快照预播种和 Cobbler 片段:lp:~openstack-ubuntu-testing/+junk/cobbler-lvm-snapshot
所有其他相关脚本、charm 分支等:https://code.launchpad.net/~openstack-ubuntu-testing/
鸣谢
整体管理交付和一般鞭策:Dave Walker
实验室安装和基本配置:Pete Graner、Tim Gardner、Brad Figg、James Page
服务器网络电源围栏代理:Andres Rodriguez
源包创建和构建过程:Chuck Short 和 James Page
使用 Juju 进行部署测试:Adam Gandelman
OpenStack 测试:Adam Gandelman
Jenkins 打包、配置和管理:James Page
Gerrit 插件用于提交前测试以及其他很棒的想法:Monty Taylor 和 James Blair
撰写和审查本文:Adam Gandelman, Chuck Short 和 Dave Walker。