nova-api 应该返回 hypervisor.cpu_info 作为 json 对象,而不是字符串¶
https://blueprints.launchpad.net/nova/+spec/nova-api-hypervsor-cpu-info
将 nova-api 中 hypervisor.cpu_info 字段从字符串更改为常规 JSON 对象。
问题描述¶
nova-api 以字符串形式返回 hypervisor 的 cpu_info,而不是常规 JSON 对象
{
"hypervisor": {
"status":"enabled",
"service":{
"host":"host1",
"disabled_reason":null,
"id":5
},
"vcpus_used":1,
"hypervisor_type":"QEMU",
"local_gb_used":0,
"vcpus":1,
"hypervisor_hostname":"host1",
"memory_mb_used":576,
"memory_mb":3010,
"current_workload":0,
"state":"up",
"host_ip":"192.168.122.121",
"cpu_info":"{\"vendor\": \"Intel\", \"model\": \"cpu64-rhel6\",
\"arch\": \"x86_64\", \"features\": [\"pge\",
\"clflush\", \"sep\", \"syscall\", \"tsc\", \"vmx\",
\"cmov\", \"fpu\", \"pat\", \"lm\", \"msr\", \"nx\",
\"fxsr\", \"pae\", \"mmx\", \"cx8\", \"mce\", \"de\",
\"mca\", \"pse\", \"pni\", \"abm\", \"popcnt\", \"apic\",
\"sse\", \"lahf_lm\", \"sse2\", \"hypervisor\", \"cx16\",
\"pse36\", \"mtrr\", \"x2apic\"], \"topology\":
{\"cores\": 1, \"threads\": 1, \"sockets\": 1}}",
"running_vms":1,
"free_disk_gb":21,
"hypervisor_version":2000000,
"disk_available_least":14,
"local_gb":21,
"free_ram_mb":2434,
"id":1
}
}
cpu_info 存储在数据库中是字符串,这没问题。但在 API 中,这种字符串是不可接受的,应该更改为对象。python-novaclient 中存在完全冗余的逻辑,仅仅是因为 cpu_info 字段而存在。
用例¶
此更改有助于改进 API,该 API 被许多模块/系统使用。 此外,重构还可以帮助提高 nova 中的单元测试质量。
项目优先级¶
无
提议的变更¶
添加逻辑,在从数据库加载对象后,将 cpu_info 字段从字符串反序列化为对象 VirtCPUModel。
备选方案¶
作为替代方案,API 可以为 cpu_info.model、cpu_info.vendor 和 cpu_info.features.name 提供枚举。 这种方法将在实际的 hypervisor 值与 API 响应中返回的值之间添加新的数据层。 此外,在 hypervisor 中添加新的模型和供应商每次都会导致 API 升级。
数据模型影响¶
无
REST API 影响¶
更改应添加到新的 API 微版本中
GET /v2.1/os-hypervisors/{hypervisor_id}
显示 hypervisor 详情 显示指定 hypervisor 的详细信息。
响应数据中的更改
cpu_info = {
'type': 'object',
'properties': {
'vendor': {
'type': 'string',
'minLength': 1,
'maxLength': 255
},
'model': {
'type': 'string',
'minLength': 1,
'maxLength': 255
},
'features': {
'type': 'array',
'items': {
'type': 'string',
}
},
'topology': {
'type': 'object',
'properties': {
'cores': {
'type': 'int',
'minimum': 1
},
'threads': {
'type': 'int',
'minimum': 1
},
'sockets': {
'type': 'int',
'minimum': 1
}
}
},
'arch': {
'type': 'string', 'enum': ['alpha', 'armv6', 'armv7l',
'armv7b', 'aarch64', 'cris',
'i686', 'ia64', 'lm32', 'm68k',
'microblaze', 'microblazeel',
'mips', 'mipsel', 'mips64',
'mips64el', 'openrisc', 'parisc',
'parisc64', 'ppc', 'ppcle', 'ppc64',
'ppc64le', 'ppcemb', 's390',
's390x', 'sh4', 'sh4eb', 'sparc',
'sparc64', 'unicore32', 'x86_64',
'xtensa', 'xtensaeb']
'minLength': 1,
'maxLength': 255
}
},
'additionalProperties': False
}
响应示例
{
"hypervisor": {
"status": "enabled",
"service": {
"host": "host1",
"disabled_reason": null,
"id": 5
},
"vcpus_used": 1,
"hypervisor_type": "QEMU",
"local_gb_used": 0,
"vcpus": 1,
"hypervisor_hostname": "host1",
"memory_mb_used": 576,
"memory_mb": 3010,
"current_workload": 0,
"state": "up",
"host_ip": "192.168.122.121",
"cpu_info": {
"vendor": "Intel",
"model": "cpu64-rhel6",
"arch": "x86_64",
"features": ["sse2",
"cx16",
"pse36",
"mtrr",
"x2apic"],
"topology": {
"cores": 1,
"threads": 1,
"sockets": 1
}
},
"running_vms": 1,
"free_disk_gb": 21,
"hypervisor_version": 2000000,
"disk_available_least": 14,
"local_gb": 21,
"free_ram_mb": 2434,
"id": 1
}
}
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
如果 API 微版本包含此更改,python-novaclient 应实现逻辑以处理新的 API 微版本,则不应尝试反序列化 python-novaclient 中的 cpu_info。
性能影响¶
无
其他部署者影响¶
无
开发人员影响¶
无
实现¶
负责人¶
- 主要负责人
tdurakov
工作项¶
将 nova-api 中 cpu_info 字段从字符串更改为常规 JSON 对象。
根据 API 微版本更改 python-novaclient 中的解析逻辑。
依赖项¶
无
测试¶
应更改现有测试,使其符合上述模式。
文档影响¶
应根据规范中提供的模式更新 REST-API 文档
参考资料¶
无