一.为什么要用Tempest Docker
笔者,从事基于OpenStack产品的QA测试工作半年多来,一直对相关测试环境的构建记忆深刻,尤其是测试环境的安装和部署。举个很简单的例子,当测试A环境的OpenStack时,需要构建好一个诸如Tempest在内的测试平台;当测试B环境的OpenStack时,又需要构建好一个同样的测试平台;亦或者要运行诸如社区那样的分布式大规模异步测试任务等。
通常,为了构建这样的一个测试平台,即便是熟练者往往也需要花费30多分钟时间。通过使用Docker容器化,将Tempest独立于宿主机OS,而单独运行在容器中,可以做到系统隔离,平台复用和简单分化等高效作用。
社区对OpenStack的集成测试工具采用Tempest,性能测试采用Rally。Tempest的实现基于Python的unittest2测试框架和nose测试框架。Tempest对Openstack终端发起一系列API请求,并且对终端的响应进行验证。Tempest通过config文件来描述整个测试环境,包括compute 、Keystone、Glance、Neutron等OpenStack相关服务。
二.安装Docker
备注:
这里,我的测试环境是Tempest docker和OpenStack环境均构建在同一个CentOS 7中。
1)Docker 软件包已经包含在默认的 CentOS-Extras 软件源里,安装命令如下:
$ sudo yum install docker
2)当 Docker 安装完成之后,你需要启动 docker 进程:
$ sudo service docker start
3)如果我们希望 Docker 默认开机启动,如下操作:
$ sudo chkconfig docker on
4)配置Docker加速器。这里我们使用daocloud提供的docker镜像加速服务:
$sudo sed -i 's|other_args="|other_args="--registry-mirror=http://768e1313.m.daocloud.io |g' /etc/sysconfig/docker
$sudo sed -i "s|OPTIONS='|OPTIONS='--registry-mirror=http://768e1313.m.daocloud.io |g" /etc/sysconfig/docker
$sudo sed -i 'N;s|\[Service\]\n|\[Service\]\nEnvironmentFile=-/etc/sysconfig/docker\n|g' /usr/lib/systemd/system/docker.service
$ sudo sed -i 's|fd://|fd:// $other_args |g' /usr/lib/systemd/system/docker.service
5)重启服务:
sudo systemctl daemon-reload
sudo service docker restart
6)现在,我们来验证 Docker 是否正常工作以及为下一步安装Tempest做足准备。为此,我们需要下载centos 7镜像。
$ sudo docker pull centos:7
7)下一步,我们运行下边的命令来查看镜像,确认镜像是否存在:
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
docker.io/centos 7 bb3d629a7cbc Less than a second ago 196.6 MB
OK,事已至此,Docker和CentOS7镜像现在已经build好了。我们继续进行下一步。
三.安装Tempest
1)首先,我们需要进入到CentOS 7这个Docker镜像中,执行安装和配置任务等。
$ sudo docker run -i -t centos:7 /bin/bash
2)安装相关的依赖关系
# yum -y install epel-release
# yum clean all && yum list && yum repolist all
#yum install -y gcc git libxslt-devel openssl-devel libffi-devel python-devel python-pip python-virtualenv
# pip install junitxml
3)下载和安装Tempest
# git clone https://github.com/openstack/tempest.git
# cd tempest && python setup.py install
# pip install -r requirements.txt
4)生成Tempest配置文件
# pip install tox
# tox -egenconfig
# cp etc/{tempest.conf.sample,tempest.conf}
5)查看,是否成功生成配置文件
6)编辑Tempest文件
由于,这里我们只测试OpenStack identity服务(Keystone)。所以,我们只针对了[identity]部分进行了相关的配置和运行Tempest测试,以此来验证我们的整个环节是否都是成功的。如果,你需要配置和测试诸如Compute、network、volume等服务,只需要按照注释配置相关选项即可。
如下,OpenStack identity服务配置:
# egrep "^[^#]" etc/tempest.conf
[DEFAULT]
[alarming]
[auth]
tempest_roles = Member #为tempest role设置的角色
admin_username = admin #管理员用户名
admin_tenant_name = admin #管理员租户名
admin_password = admin #管理员用户密码
[baremetal]
[compute]
[compute-feature-enabled]
[dashboard]
[data-processing]
[data-processing-feature-enabled]
[database]
[debug]
[identity]
catalog_type = identity #测试的类型
uri = http://10.10.10.129:5000/v2.0 #keystone服务的endpoint,用来与openstack环境镜进行交互
auth_version = v2 #keystone服务的测试版本
region = RegionOne #keystone服务的region
v2_admin_endpoint_type = adminURL #keystone服务的admin endpoint
v2_public_endpoint_type = publicURL #keystone服务的public endpoint
username = demo #一个测试用户
tenant_name = demo #一个测试租户
admin_role = admin #一个测试角色
password = 123456 #测试用户的密码
[identity-feature-enabled]
api_v2 = true #这里只测试v2版本的keystone
api_v3 = false #不测试v3版本的keystone
[image]
[image-feature-enabled]
[input-scenario]
[negative]
[network]
[network-feature-enabled]
[object-storage]
[object-storage-feature-enabled]
[orchestration]
[oslo_concurrency]
[scenario]
[service_available]
[stress]
[telemetry]
[telemetry-feature-enabled]
[validation]
[volume]
[volume-feature-enabled]
7)执行Tempest测试
这里,我们测试的对象是Keystone服务v2版本中的test_list_tenants_returns_only_authorized_tenants测试用例。
命令如下,所示:
# testr run tempest.api.identity.v2.test_tenants
通过,观察测试结果信息,我们已经知道该测试用例已经执行成功了。
8)测试用例分析
# vim tempest/api/identity/v2/test_tenants.py
16 from tempest.api.identity import base
17 from tempest.lib import exceptions as lib_exc
18 from tempest import test
19
20
21 class IdentityTenantsTest(base.BaseIdentityV2Test):
22
23 credentials = ['primary', 'alt']
24
25 @test.idempotent_id('ecae2459-243d-4ba1-ad02-65f15dc82b78')
26 def test_list_tenants_returns_only_authorized_tenants(self):
27 alt_tenant_name = self.alt_manager.credentials.credentials.tenant_name
28 resp = self.non_admin_tenants_client.list_tenants()
该测试用例的主要测试内容是:检查用户只可以看见他所属租户下的用户;成功验证用户所使用的credentials和租户名;最后就是检查用户不能登录alt用户的租户。主要是调用assertEqual、assertRaises等断言方法来判断程序的执行结果和预期值是否相符。
四.保存Tempest Docker镜像
1)保存Tempest Docker镜像
当我们制作好了Tempest镜像之后,如果不做commit保存起来,那么container停止以后再启动,这些更改就消失了。在完成操作之后,输入 exit命令来退出这个容器。
# exit
Exit
现在,我们可以使用 docker commit 来保存镜像。
# docker commit -m="Install OpenStack for Tempest" -a="Xu chao" 00223cd24218 tempest/centos:v1
cea1cdc35096bf80be700f0a0b863426d5a443715779fc9a668866b37e50c9c5
这里的-m标识我们指定提交的信息,-a标识来指定一个作者,tempest/centos是一个新的镜像名,v1是版本号。
现在,我们可以使用 docker images 命令来查看我们的新镜像tempest/centos。
# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
tempest/centos v1 cea1cdc35096 17 minutes ago 757.8 MB
2)使用我们的新镜像来运行Tempest docker
# docker run -i -t tempest/centos:v1 /bin/bash
[root@108f70f3f92e /]#
3)最后,我们使用docker save 命令将镜像导出到本地文件,默认目录为执行docker命令的用户家目录下。
# docker save -o tempest_centos7.tar tempest/centos:v1
4)当我们把自己做好的镜像push到Docker Hub公共库或内部私有库中后,别人可以直接导入镜像或者pull(这将导入镜像以及其相关的元数据信息,包括标签等)。
# docker load < tempest_centos7.tar
作者简介:徐超。专注于工作和研究基于OpenStack产品研发测试过程的持续集成、持续测试和持续部署/交付领域,曾参与创建国内一OpenStack服务提供商从0到1+的测试体系。