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 文档

参考资料