一.为什么要用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)查看,是否成功生成配置文件

openstack测试工具 openstack tempest_docker

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

openstack测试工具 openstack tempest_openstack_02


通过,观察测试结果信息,我们已经知道该测试用例已经执行成功了。

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+的测试体系。