1 OpenStack API microversion
Openstack Release | Nova API | Cinder API | Glance API |
---|---|---|---|
Stein | 2.66~2.72 | 3.56~ | |
Rocky | 2.61~2.65 | 3.51~3.55 | 2.7 |
Queens | 2.54~2.60 | 3.44~3.50 | 2.6 |
Pike | 2.43~2.53 | 3.28~3.43 | |
Ocata | 2.39~2.42 | 3.16~3.27 | 2.4~2.5 |
Nova采用小版本号,开发tempest时可通过查询小版本号确定tempest客户端与后端API是否匹配。
版本号采用X.Y的格式,新的版本采用单调递增X或Y形成新的版本号。X的增加代表较大的改动,破坏了向下兼容,Y的增加代表新功能的添加,不破坏向下兼容。
客户端可通过发送……/的方式查询API支持的版本,通过……/{api_version}/查询某个版本的具体信息。
客户端可规定请求的API版本,需要在HTTP请求的头部加入:
X-OpenStack-Nova-API-Version: 2.4
或:
OpenStack-API-Version: compute 2.4
2 microversion与schema
在Tempest学习笔记 004:Tempest源码阅读—客户端发送与接收报文中提到了tempest客户端检查报文格式的流程。tempest通过检查报文与schema是否一致来检查报文是否正确。
新开发的计算模块功能往往在已有API的基础上添加新字段来满足新的功能。如果tempest的schema不加以修改或添加,涉及相应接口的测试用例会报错。
2.1 修改旧版本的schema
以Nova中get_keypair API中添加type字段为例,2.2版本的Nova API加入了新的字段,需新建2.2版的keypair资源的schema:
- 在tempest/lib/api_schema/response/compute/下新建名为v2_2的文件夹
- 在v2_2文件夹中添加keypairs.py文件。
文件中部分内容如下:
import copy
from tempest.lib.api_schema.response.compute.v2_1 import keypairs
get_keypair = copy.deepcopy(keypairs.get_keypair)
get_keypair['response_body']['properties']['keypair'][
'properties'].update({'type': {'type': 'string'}})
get_keypair['response_body']['properties']['keypair'][
'required'].append('type')
上一次对get_keypair API的修改在v2_1中,因此先将v2_1的keypairs导入并使用copy.deepcopy进行深拷贝。在拷贝结果的基础上添加新字段type。
- 对应的tempest 客户端中需要导入schema,并添加至schema_versions_info:
from tempest.lib.api_schema.response.compute.v2_2 import keypairs as schemav22
class KeyPairsClient(base_compute_client.BaseComputeClient):
schema_versions_info = [{'min': None, 'max': '2.1', 'schema': schemav21},
{'min': '2.2', 'max': None, 'schema': schemav22}]
2.2 新增schema
2.1节的第二步中新建文件中的内容需自行添加,其余步骤与2.1节一致。
这里以microversion 2.1的keypair为例:
get_keypair = {
'status_code': [200],
'response_body': {
'type': 'object',
'properties': {
'keypair': {
'type': 'object',
'properties': {
'public_key': {'type': 'string'},
'name': {'type': 'string'},
'fingerprint': {'type': 'string'},
'user_id': {'type': 'string'},
'deleted': {'type': 'boolean'},
'created_at': parameter_types.date_time,
'updated_at': parameter_types.date_time_or_null,
'deleted_at': parameter_types.date_time_or_null,
'id': {'type': 'integer'}
},
'additionalProperties': False,
'required': ['public_key', 'name', 'fingerprint', 'user_id',
'deleted', 'created_at', 'updated_at',
'deleted_at', 'id']
}
},
'additionalProperties': False,
'required': ['keypair']
}
}
status_code为接口返回正确时的状态码,状态码可不唯一,如[200, 202]也是可以的。
response_body中为报文的具体格式,返回字典格式可设置type为object,其中的键值写在properties中。
常用的几种类型为:
- object—字典
- list—列表
- string—字符串
- boolean—布尔型
- integer—整数
- number—浮点数
一些常用的如日期格式等均在/tempest/lib/api_schema/response/compute.v2_1的parameter_type中,可直接导入使用。
2.3 测试用例中规定microverson
一般Tempest根据配置文件的规定采用2.1版的API(默认值2.1).若测试用例无法工作在旧的API版本,则需新建类,在类中规定API的最小版本和最高版本,如:
class ServerShowV257Test(base.BaseV2ComputeTest):
min_microversion = '2.57'
max_microversion = 'latest'
@decorators.idempotent_id('803df848-080a-4261-8f11-b020cd9b6f60')
def test_rebuild_server(self):
server = self.create_test_server(wait_until='ACTIVE')
user_data = "ZWNobyAiaGVsbG8gd29ybGQi"
# Checking rebuild API response schema
self.servers_client.rebuild_server(server['id'], self.image_ref_alt,
user_data=user_data)
waiters.wait_for_server_status(self.servers_client,
server['id'], 'ACTIVE')
参考资料:
Openstack CLI 版本 https://docs.openstack.org/releasenotes/python-openstackclient/
Nova API 版本 https://docs.openstack.org/nova/latest/reference/api-microversion-history.html
Cinder API 版本 https://docs.openstack.org/cinder/queens/contributor/api_microversion_history.html
Glance API 版本 https://docs.openstack.org/api-ref/image/versions/index.html#version-history
小版本号规范 http://specs.openstack.org/openstack/api-wg/guidelines/microversion_specification.html
Nova 小版本号规范 https://opendev.org/openstack/nova-specs/src/branch/master/specs/kilo/implemented/api-microversions.rst