跳到主要内容

codingBak

腾讯coding.net备份文档

hpctest

http://hpctest.cs.tsinghua.edu.cn/programs.html

FIO参考:

https://blog.csdn.net/don_chiang709/article/details/92628623

https://www.cnblogs.com/halberd-lee/p/8650737.html

sysbench参考:

https://www.colabug.com/2017/0207/1368128/

stream参考:

https://blog.csdn.net/liudong124521/article/details/101205119

mlc参考:

https://software.intel.com/content/www/us/en/develop/articles/intelr-memory-latency-checker.html

http://blog.sina.com.cn/s/blog_413d250e0102yc9p.html

Netperf参考:

https://www.huaweicloud.com/kunpeng/software/netperf.html

https://www.jianshu.com/p/42e0fa6bf79c

rpm包下载地址:

http://rpmfind.net/linux/rpm2html/search.php?query=gcc&submit=Search+...&system=centos&arch=

离线安装gcc:

https://www.cnblogs.com/hanlaomo/p/10904672.html

性能测试

1、CPU

sysbench cpu--cpu-max-prime=20000 --threads=8 --time=50 run

2、MEM

带宽

参数意义参考:http://www.voidcn.com/article/p-fasnwtmo-pd.html

# gcc -mtune=native -march=native -O -mcmodel=medium -DSTREAM_ARRAY_SIZE=100000000 -fopenmp -DNTIME=20 stream.c -o stream.o

# ./stream.o

时延

./mlc --latency_matrix

3、STO

参数意义参考:https://cloud.tencent.com/developer/article/1766787?from=information.detail.linux%20fio%20%E5%8F%82%E6%95%B0%E8%AF%A6%E8%A7%A3

fio -bs=128k -ioengine=libaio -iodepth=32 -direct=1 -rw=read -time_based -runtime=10  -refill_buffers -norandommap -randrepeat=0 -group_reporting -name=fio-read-throughput --size=10G -numjobs=4 -filename=/dev/vda
  • -rw=rw 顺序混合读写
  • -rw=randrw 随机混合读写
  • -numjobs=4 线程数为4
  • -iodepth=32 队列深度为32

4、NET

服务端

netperf server

客户端

netperf -H 10.238.158.84 -t UDP_RR -l 60 -- -m 1

数据观察:在server端,使用 sar -n DEV 1 来观察网卡收包数。

Rally安装

0、前期准备

Linux测试机(和测试环境互通) 测试机上安装Docker 拉取CentOS7的测试镜像

1、创建Rally沙盒环境

docker run -it --name rally-centos centos:7 bash

2、安装Rally基础依赖

# yum -y install epel-release
# yum install gcc-c++ python-pip git which

3、安装python3的环境

yum install python3

删除原来的python软链接,重新创建python软链接指向python3

删除原来的pip软链接,重新创建pip软链接指向pip3

创建~/.pip/pip.conf,添加国内镜像源

4、下载Rally源码

将rally项目从github复制到gitee,然后拉下来
git clone https://xxx.git

5、安装Rally的python依赖

修改pip源为阿里源

cd rally
pip3 install -r requirements.txt

6、安装rally-openstack软件包

pip3 install rally-openstack

pip install setuptools==40.3.0 setuptools的版本有要求

7、创建openrc文件

从openstack上拷贝过来

source openrc

8、安装rally

rally依赖python3

cd rally

python setup.py build

python setup.py install

查看命令帮助:python setup.py --help

9、初始化rally

rally db create
rally deployment create --fromenv --name=existing 记得source openrc

10、加载openrc,创建deployment

source openrc
rally deployment create --fromenv --name=openstack

11、查看deployment

rally deployment list    查看
rally deployment check 检查

参考文档

https://rally.readthedocs.io/en/latest/index.html
https://opendev.org/openstack/rally/src/branch/master
https://gitee.com/phygerr/rally
https://blog.csdn.net/qq_34043421/article/details/80122796

Q&A-1

rally对setuptools版本有要求

解决办法:

pip install setuptools==40.3.0

Q&A-2-容器使用ovs

rally容器在主机使用ovs网络之后,使用docker0无法与测试环境互通。

需要给容器挂载ovsport,具体操作如下:

1、下载ovs-docker脚本到host

wget https://github.com/openvswitch/ovs/raw/master/utilities/ovs-docker

2、给脚本执行权限,给rally容器挂载脚本

启动rally容器:

docker run -it --privileged=true --name rally-centos rally-centos:v3 bash

给rally容器挂载端口:(由于容器已经有eth0口,所以本次挂载口名称为eth1)

./ovs-docker add-port br-mgmt eth1 5fbf5107cc17

在容器中ifconfig eth1 xx.xx.xx.x/24 配置eth1口的ip

然后测试互通即可

tempest的使用

1、修改rally的代码,使得在创建verify的时候不用在虚拟环境重复下载包

路径:/usr/local/lib/python3.6/site-packages/rally/verification/manager.py

打开后搜索:install_venv

增加:--system-site-packages 参数

def install_venv(self):
"""Install a virtual environment for a verifier."""
if os.path.exists(self.venv_dir):
# NOTE(andreykurilin): It is necessary to remove the old env while
# performing update action.
LOG.info("Deleting old virtual environment.")
shutil.rmtree(self.venv_dir)

LOG.info("Creating virtual environment. It may take a few minutes.")

LOG.debug("Initializing virtual environment in %s directory."
% self.venv_dir)
utils.check_output(["virtualenv","--system-site-packages" ,"-p", sys.executable, self.venv_dir],
cwd=self.repo_dir,
msg_on_err="Failed to initialize virtual env "
"in %s directory." % self.venv_dir)

LOG.debug("Installing verifier in virtual environment.")
# NOTE(ylobankov): Use 'develop mode' installation to provide an
# ability to advanced users to change tests or
# develop new ones in verifier repo on the fly.
utils.check_output(["pip", "install", "-e", "./"],
cwd=self.repo_dir, env=self.environ)

2、创建verifier

先加载上网代理,如果安装机器可以上网则忽略

source /etc/profile

从github同步到gitee后再拉取

[root@5fbf5107cc17 home]# rally verify create-verifier  --name tempest-verifier --type tempest  --platform  openstack   --source https://gitee.com/phygerr/tempest.git
2020-07-27 06:34:56.029 66 INFO rally.api [-] Creating verifier 'tempest-verifier'.
2020-07-27 06:34:56.094 66 INFO rally.verification.manager [-] Cloning verifier repo from https://gitee.com/phygerr/tempest.git.
2020-07-27 06:35:20.269 66 INFO rally.verification.manager [-] Creating virtual environment. It may take a few minutes.
2020-07-27 06:35:29.485 66 INFO rally.api [-] Verifier 'tempest-verifier' (UUID=0b00f015-bf00-4d69-8a91-343b74d3fd67) has been successfully created!
Using verifier 'tempest-verifier' (UUID=0b00f015-bf00-4d69-8a91-343b74d3fd67) as the default verifier for the future CLI operations.
[root@5fbf5107cc17 home]#

3、验证验证环境

[root@5fbf5107cc17 home]# rally verify list-verifiers
+--------------------------------------+------------------+---------+-----------+---------------------+---------------------+-----------+---------+-------------+--------+
| UUID | Name | Type | Platform | Created at | Updated at | Status | Version | System-wide | Active |
+--------------------------------------+------------------+---------+-----------+---------------------+---------------------+-----------+---------+-------------+--------+
| 0b00f015-bf00-4d69-8a91-343b74d3fd67 | tempest-verifier | tempest | openstack | 2020-07-27T06:34:56 | 2020-07-27T06:35:29 | installed | master | False | :-) |
+--------------------------------------+------------------+---------+-----------+---------------------+---------------------+-----------+---------+-------------+--------+
[root@5fbf5107cc17 home]#

4、配置创建的verifier

[root@5fbf5107cc17 home]# rally verify configure-verifier
2020-07-27 06:37:21.327 147 INFO rally.api [-] Configuring verifier 'tempest-verifier' (UUID=0b00f015-bf00-4d69-8a91-343b74d3fd67) for deployment 'openstack' (UUID=17ed272a-4f0b-4af6-a593-973ac0a4f700).
Failed to authenticate to http://172.29.236.200:5000/v3 for user 'admin' in project 'admin': [ServiceUnavailable] Service Unavailable (HTTP 503)

参考文档

https://gitee.com/phygerr/tempest/tree/master

https://cloud.tencent.com/developer/article/1158765

https://www.cnblogs.com/mrwuzs/p/11925070.html

https://www.jianshu.com/p/b3e601c3f71c

Rally执行测试

tempest代码仓库:`https://gitee.com/phygerr/tempest`

PATH:`tempest/api/XXX`

规则:`tempest.api.<compent>.admin.<测试集:文件名OR文件夹名>.<测试类>`

1、测试identity

rally verify start --pattern tempest.api.identity.admin.v3

2、测试flavor

rally verify start --pattern tempest.api.compute.admin.test_flavors.FlavorsAdminTestJSON

3、verify导出测试报告

rally verify report --uuid 8a8ce3db-9ff0-4abc-ac39-26c80bbfbb2f --type html --to test-flavor.html

Rally容器化教程

安装部署

镜像下载

前往dockerhub搜索gwee/rally,然后docker pull最新版本的rally镜像

docker pull gwee/rally:latest

启动容器

docker run -it gwee/rally:latest bash

此时会进入到rally的交互式控制台

创建RC文件

将openstack环境的rc文件内容复制,然后新建一个openrc文件,将内容贴进来

前提是容器所在宿主机要和环境网络互通,所有endpoint端口都放开

openrc内容如下:

# Ansible managed

# COMMON CINDER ENVS
export CINDER_ENDPOINT_TYPE=internalURL

# COMMON NOVA ENVS
export NOVA_ENDPOINT_TYPE=internalURL

# COMMON OPENSTACK ENVS
export OS_ENDPOINT_TYPE=internalURL
export OS_INTERFACE=internalURL
export OS_USERNAME=admin
export OS_PASSWORD='panyun@123'
export OS_PROJECT_NAME=admin
export OS_TENANT_NAME=admin
export OS_AUTH_TYPE=password
export OS_AUTH_URL=http://12.1.1.30:5000/v3
export OS_NO_CACHE=1
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_DOMAIN_NAME=Default
export OS_REGION_NAME=RegionOne
export OS_PLACEMENT_API_VERSION=1.17
export MANILA_ENDPOINT_TYPE=internalURL

# For openstackclient
export OS_IDENTITY_API_VERSION=3
export OS_AUTH_VERSION=3

创建rally的deployment

首先使用命令source openrc加载openrc,然后创建deployment

rally deployment create --fromenv --name=mycloud

然后执行命令rally deployment check检查环境,如果成功将会输出如下内容:

rally@323fd0a14563:/$ rally deployment check
--------------------------------------------------------------------------------
Platform openstack:
--------------------------------------------------------------------------------

Available services:
+-------------+-------------------------+-----------+
| Service | Service Type | Status |
+-------------+-------------------------+-----------+
| __unknown__ | baremetal-introspection | Available |
| __unknown__ | compute_ha | Available |
| __unknown__ | placement | Available |
| __unknown__ | prometheus | Available |
| __unknown__ | sharev2 | Available |
| __unknown__ | volumev2_k8s | Available |
| barbican | key-manager | Available |
| cinder | volumev2 | Available |
| cinder | volumev3 | Available |
| designate | dns | Available |
| glance | image | Available |
| ironic | baremetal | Available |
| keystone | identity | Available |
| manila | share | Available |
| neutron | network | Available |
| nova | compute | Available |
| octavia | load-balancer | Available |
| trove | database | Available |
+-------------+-------------------------+-----------+

到此,证明环境对接成功。

第一个脚本

脚本开发

参考:https://github.com/openstack/rally-openstack/tree/master/samples/tasks/scenarios

首先我们进入/rally/目录,然后创建一个名为boot-and-delete.json的文件,向其中输入以下内容:

{
"NovaServers.boot_and_delete_server": [
{
"args": {
"flavor": {
"name": "s1.medium.2"
},
"image": {
"name": "CentOS 7.6 64bit 1228"
},
"force_delete": false
},
"runner": {
"type": "constant",
"times": 10,
"concurrency": 2
},
"context": {
"users": {
"tenants": 3,
"users_per_tenant": 2
},
"network": {
"start_cidr": "10.2.0.0/24",
"networks_per_tenant": 2
}
}
}
]
}

脚本释义

{
"NovaServers.boot_and_delete_server": [ # 这是rally中定义好的用例
{
"args": {
"flavor": {
"name": "s1.medium.2" # 规格的名称
},
"image": {
"name": "CentOS 7.6 64bit 1228" # 镜像的名称
},
"force_delete": false # 是否强制删除
},
"runner": {
"type": "constant", # 常量
"times": 10, # 测试次数
"concurrency": 2 # 并发量
},
"context": {
"users": {
"tenants": 3, # 租户数目
"users_per_tenant": 2 # 每个租户的用户数
},
"network": {
"start_cidr": "10.2.0.0/24", # 测试租户中的网段
"networks_per_tenant": 2 # 每个租户的网络数
}
}
}
]
}

执行测试

测试脚本的路径为:/rally/boot-and-delete.json

测试命令:rally task start /rally/boot-and-delete.json

当然,你也可以在容器启动的时候将一个宿主机路径/home/rally/挂载到容器的/rally/下,这样就可以将x写好的测试脚本放到宿主机的/home/rally/下,容器内也能使用了。

测试产生的项目和网络用户等信息不会自动清理。

测试成功的结果格式如下:

...
--------------------------------------------------------------------------------
Task 612dd386-885f-473d-b75d-4c6f8441cddf has 0 error(s)
--------------------------------------------------------------------------------

+-----------------------------------------------------------------------------------------------------------------------+
| Response Times (sec) |
+--------------------+-----------+--------------+--------------+--------------+-----------+-----------+---------+-------+
| Action | Min (sec) | Median (sec) | 90%ile (sec) | 95%ile (sec) | Max (sec) | Avg (sec) | Success | Count |
+--------------------+-----------+--------------+--------------+--------------+-----------+-----------+---------+-------+
| nova.boot_server | 19.944 | 22.85 | 24.672 | 26.573 | 28.474 | 23.165 | 100.0% | 10 |
| nova.delete_server | 3.048 | 7.63 | 10.023 | 10.059 | 10.096 | 6.941 | 100.0% | 10 |
| total | 25.004 | 31.459 | 32.876 | 32.909 | 32.943 | 30.107 | 100.0% | 10 |
| -> duration | 24.004 | 30.459 | 31.876 | 31.909 | 31.943 | 29.107 | 100.0% | 10 |
| -> idle_duration | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 100.0% | 10 |
+--------------------+-----------+--------------+--------------+--------------+-----------+-----------+---------+-------+

Load duration: 149.933956
Full duration: 273.86164
...

使用tempest进行测试

tempest是一个rally支持的针对openstack的测试用例库,我们可以使用其现成的用例模块对环境进行全面的测试。

tempest文件路径

rally@2db8dfcbff99:~$ rally verify show-verifier 51551059-802e-4262-93f8-80a54db4fbf5
+------------------------------------------------------------------------------------------------------+
| Verifier |
+----------------+-------------------------------------------------------------------------------------+
| UUID | 51551059-802e-4262-93f8-80a54db4fbf5 |
| Status | installed |
| Created at | 2022-06-28 08:28:04 |
| Updated at | 2022-06-28 08:29:27 |
| Active | :-) |
| Name | default |
| Description | - |
| Type | tempest |
| Platform | openstack |
| Source | https://github.com/openstack/tempest |
| Version | master |
| System-wide | False |
| Extra settings | - |
| Location | /home/rally/.rally/verification/verifier-51551059-802e-4262-93f8-80a54db4fbf5/repo |
| Venv location | /home/rally/.rally/verification/verifier-51551059-802e-4262-93f8-80a54db4fbf5/.venv |
+----------------+-------------------------------------------------------------------------------------+
Attention! All you do in the verifier repository or verifier virtual environment, you do it at your own risk!

配置verify

rally verify configure-verifier

查看verify的配置

rally verify configure-verifier --show

如果被测环境使用的是https,那么我们就需要打开verify的禁用ssl的配置。

verify的配置文件路径在:/home/rally/.rally/verification/verifier-51551059-802e-4262-93f8-80a54db4fbf5/for-deployment-e9df6cbf-378c-495a-a28e-f312af6e76f3/下面,名为tempest.conf

禁用https的ssl证书校验的配置为:disable_ssl_certificate_validation,我们将其设置为True即可。

执行测试

如果提示下载镜像失败,我们可以手动将镜像上传到/home/rally/.rally/verification/verifier-51551059-802e-4262-93f8-80a54db4fbf5/for-deployment-e9df6cbf-378c-495a-a28e-f312af6e76f3/路径下面,镜像名为tempest-image,继续尝试启动测试。

我们以对flavor的测试为例,测试命令:rally verify start --pattern tempest.api.compute.admin.test_flavors.FlavorsAdminTestJSON

rally@2db8dfcbff99:~$ rally verify start --pattern tempest.api.compute.admin.test_flavors.FlavorsAdminTestJSON
2023-02-22 06:29:49.924 60 INFO rally.api [-] Starting verification (UUID=a6fd367e-ec54-4a6e-b61d-81aa0aca6e93) for deployment 'mycloud' (UUID=e9df6cbf-378c-495a-a28e-f312af6e76f3) by verifier 'default' (UUID=51551059-802e-4262-93f8-80a54db4fbf5).
2023-02-22 06:30:03.590 60 INFO rally.task.context [-] Verification 51551059-802e-4262-93f8-80a54db4fbf5 | Context tempest@default setup() finished in 13.13 sec
2023-02-22 06:30:03.591 60 INFO rally.task.context [-] Verification 51551059-802e-4262-93f8-80a54db4fbf5 | Context testr@default setup() finished in 0.08 msec
2023-02-22 06:30:13.992 60 INFO default [-] {0} tempest.api.compute.admin.test_flavors.FlavorsAdminTestJSON.test_create_flavor_using_string_ram ... success [0.478s]
2023-02-22 06:30:14.368 60 INFO default [-] {0} tempest.api.compute.admin.test_flavors.FlavorsAdminTestJSON.test_create_flavor_verify_entry_in_list_details ... success [0.376s]
2023-02-22 06:30:15.072 60 INFO default [-] {0} tempest.api.compute.admin.test_flavors.FlavorsAdminTestJSON.test_create_flavor_with_int_id ... success [0.703s]
2023-02-22 06:30:15.325 60 INFO default [-] {0} tempest.api.compute.admin.test_flavors.FlavorsAdminTestJSON.test_create_flavor_with_none_id ... success [0.252s]
2023-02-22 06:30:15.558 60 INFO default [-] {0} tempest.api.compute.admin.test_flavors.FlavorsAdminTestJSON.test_create_flavor_with_uuid_id ... success [0.232s]
2023-02-22 06:30:16.253 60 INFO default [-] {0} tempest.api.compute.admin.test_flavors.FlavorsAdminTestJSON.test_create_list_flavor_without_extra_data ... success [0.694s]
2023-02-22 06:30:16.585 60 INFO default [-] {0} tempest.api.compute.admin.test_flavors.FlavorsAdminTestJSON.test_create_server_with_non_public_flavor ... success [0.332s]
2023-02-22 06:30:18.125 60 INFO default [-] {0} tempest.api.compute.admin.test_flavors.FlavorsAdminTestJSON.test_is_public_string_variations ... success [1.536s]
2023-02-22 06:30:18.636 60 INFO default [-] {0} tempest.api.compute.admin.test_flavors.FlavorsAdminTestJSON.test_list_non_public_flavor ... success [0.512s]
2023-02-22 06:30:19.003 60 INFO default [-] {0} tempest.api.compute.admin.test_flavors.FlavorsAdminTestJSON.test_list_public_flavor_with_other_user ... success [0.367s]
2023-02-22 06:30:21.837 60 INFO rally.task.context [-] Verification 51551059-802e-4262-93f8-80a54db4fbf5 | Context testr@default cleanup() started
2023-02-22 06:30:21.838 60 INFO rally.task.context [-] Verification 51551059-802e-4262-93f8-80a54db4fbf5 | Context testr@default cleanup() finished in 0.41 msec
2023-02-22 06:30:21.838 60 INFO rally.task.context [-] Verification 51551059-802e-4262-93f8-80a54db4fbf5 | Context tempest@default cleanup() started
2023-02-22 06:30:38.076 60 INFO rally.task.context [-] Verification 51551059-802e-4262-93f8-80a54db4fbf5 | Context tempest@default cleanup() finished in 16.24 sec
2023-02-22 06:30:38.086 60 INFO rally.api [-] Verification (UUID=a6fd367e-ec54-4a6e-b61d-81aa0aca6e93) has been successfully finished for deployment 'mycloud' (UUID=e9df6cbf-378c-495a-a28e-f312af6e76f3)!

======
Totals
======

Ran: 10 tests in 9.232 sec.
- Success: 10
- Skipped: 0
- Expected failures: 0
- Unexpected success: 0
- Failures: 0

Using verification (UUID=a6fd367e-ec54-4a6e-b61d-81aa0aca6e93) as the default verification for the future operations.

生成HTML测试报告

首先查看verify

rally@2db8dfcbff99:~$ rally verify list
+--------------------------------------+------+---------------+-----------------+---------------------+---------------------+----------+----------+
| UUID | Tags | Verifier name | Deployment name | Started at | Finished at | Duration | Status |
+--------------------------------------+------+---------------+-----------------+---------------------+---------------------+----------+----------+
| 54abac7d-d8d6-4136-b31c-60d4ef372dca | - | default | mycloud | 2023-02-22T06:26:19 | 2023-02-22T06:26:59 | 0:00:40 | failed |
| e6ee8631-28ea-4a0b-9610-a645504080e6 | - | default | mycloud | 2023-02-22T06:28:21 | 2023-02-22T06:29:02 | 0:00:41 | finished |
| a6fd367e-ec54-4a6e-b61d-81aa0aca6e93 | - | default | mycloud | 2023-02-22T06:29:49 | 2023-02-22T06:30:38 | 0:00:49 | finished |
+--------------------------------------+------+---------------+-----------------+---------------------+---------------------+----------+----------+

然后根据verify的id来生成测试报告

rally verify report --uuid a6fd367e-ec54-4a6e-b61d-81aa0aca6e93 --type html --to test-flavor.html

退出容器,使用命令docker cp 2db8dfcbff99:/home/rally/test-flavor.html /opt/将容器内的文件拷贝出来。【如果你挂载了宿主机文件路径则不需要】

将test-flavor.html下载到本地。将文件中的ajax.googleapis.com修改为ajax.loli.net保存即可。

使用浏览器打开修改完的html报告文件,你会看到这样的内容:

rally-report

常用的tempest测试模块

计算相关

如 --pattern set=compute 选项,只会执行compute相关的测试。当前可供选择的测试内容有 full, smoke, compute, identity, image, network, object_storage, orchestration, volume, scenario

其余精确的测试用例参考:https://gitee.com/phygerr/tempest

tempest.api.compute.下面的内容

│  api_microversion_fixture.py
│ base.py
│ test_extensions.py
│ test_networks.py
│ test_quotas.py
│ test_tenant_networks.py
│ test_versions.py
│ __init__.py

├─admin
│ test_agents.py
│ test_aggregates.py
│ test_aggregates_negative.py
│ test_auto_allocate_network.py
│ test_availability_zone.py
│ test_availability_zone_negative.py
│ test_create_server.py
│ test_delete_server.py
│ test_fixed_ips.py
│ test_fixed_ips_negative.py
│ test_flavors.py
│ test_flavors_access.py
│ test_flavors_access_negative.py
│ test_flavors_extra_specs.py
│ test_flavors_extra_specs_negative.py
│ test_flavors_microversions.py
│ test_floating_ips_bulk.py
│ test_hosts.py
│ test_hosts_negative.py
│ test_hypervisor.py
│ test_hypervisor_negative.py
│ test_instance_usage_audit_log.py
│ test_instance_usage_audit_log_negative.py
│ test_keypairs_v210.py
│ test_live_migration.py
│ test_live_migration_negative.py
│ test_migrations.py
│ test_networks.py
│ test_quotas.py
│ test_quotas_negative.py
│ test_security_groups.py
│ test_servers.py
│ test_servers_negative.py
│ test_servers_on_multinodes.py
│ test_server_diagnostics.py
│ test_server_diagnostics_negative.py
│ test_services.py
│ test_services_negative.py
│ test_simple_tenant_usage.py
│ test_simple_tenant_usage_negative.py
│ test_volumes_negative.py
│ test_volume_swap.py
│ __init__.py

├─certificates
│ test_certificates.py
│ __init__.py

├─flavors
│ test_flavors.py
│ test_flavors_negative.py
│ __init__.py

├─floating_ips
│ base.py
│ test_floating_ips_actions.py
│ test_floating_ips_actions_negative.py
│ test_list_floating_ips.py
│ test_list_floating_ips_negative.py
│ __init__.py

├─images
│ test_images.py
│ test_images_negative.py
│ test_images_oneserver.py
│ test_images_oneserver_negative.py
│ test_image_metadata.py
│ test_image_metadata_negative.py
│ test_list_images.py
│ test_list_image_filters.py
│ test_list_image_filters_negative.py
│ __init__.py

├─keypairs
│ base.py
│ test_keypairs.py
│ test_keypairs_negative.py
│ test_keypairs_v22.py
│ __init__.py

├─limits
│ test_absolute_limits.py
│ test_absolute_limits_negative.py
│ __init__.py

├─security_groups
│ base.py
│ test_security_groups.py
│ test_security_groups_negative.py
│ test_security_group_rules.py
│ test_security_group_rules_negative.py
│ __init__.py

├─servers
│ test_attach_interfaces.py
│ test_availability_zone.py
│ test_create_server.py
│ test_create_server_multi_nic.py
│ test_delete_server.py
│ test_device_tagging.py
│ test_disk_config.py
│ test_instance_actions.py
│ test_instance_actions_negative.py
│ test_list_servers_negative.py
│ test_list_server_filters.py
│ test_multiple_create.py
│ test_multiple_create_negative.py
│ test_novnc.py
│ test_servers.py
│ test_servers_microversions.py
│ test_servers_negative.py
│ test_server_actions.py
│ test_server_addresses.py
│ test_server_addresses_negative.py
│ test_server_group.py
│ test_server_metadata.py
│ test_server_metadata_negative.py
│ test_server_password.py
│ test_server_personality.py
│ test_server_rescue.py
│ test_server_rescue_negative.py
│ test_server_tags.py
│ test_virtual_interfaces.py
│ test_virtual_interfaces_negative.py
│ __init__.py

└─volumes
test_attach_volume.py
test_attach_volume_negative.py
test_volumes_get.py
test_volumes_list.py
test_volumes_negative.py
test_volume_snapshots.py
__init__.py

网络相关

│  base.py
│ base_security_groups.py
│ test_agent_management_negative.py
│ test_allowed_address_pair.py
│ test_dhcp_ipv6.py
│ test_extensions.py
│ test_extra_dhcp_options.py
│ test_floating_ips.py
│ test_floating_ips_negative.py
│ test_networks.py
│ test_networks_negative.py
│ test_ports.py
│ test_routers.py
│ test_routers_negative.py
│ test_security_groups.py
│ test_security_groups_negative.py
│ test_service_providers.py
│ test_subnetpools_extensions.py
│ test_tags.py
│ test_versions.py
│ __init__.py

└─admin
test_dhcp_agent_scheduler.py
test_external_networks_negative.py
test_external_network_extension.py
test_floating_ips_admin_actions.py
test_metering_extensions.py
test_negative_quotas.py
test_ports.py
test_quotas.py
test_routers.py
test_routers_dvr.py
test_routers_negative.py
__init__.py