nova-api should return hypervisor.cpu_info as json object, not string

Change hypervisor.cpu_info field in nova-api from string to regular JSON object.

Problem description

nova-api returns hypervisor’s cpu_info in string, instead of regular JSON-object:

  "hypervisor": {
     "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}}",

cpu_info is stored in DB as string, and that’s OK. But in API such string is unacceptable and should be changed to object. There is completely redundant logic in python-novaclient, which exists only because of cpu_info field.

Use Cases

This change helps to improve api, which is used by many modules/systems. also refactoring could help to improve unit-tests quality in nova.

Project Priority


Proposed change

Add logic to deserialize cpu_info field from string to objects.VirtCPUModel after object is loaded from db.


As alternative api could provide enum for cpu_info.model, cpu_info.vendor, and This approach will add new data layer between actual values from hypervisor and values returned with api response. Also addition of new model and vendors into hypervisor causes API bump every time.

Data model impact


REST API impact

Change in should be added in a new API microversion:

GET /v2.1/os-hypervisors/{hypervisor_id}

Show hypervisor details Shows details for a specified hypervisor.

Change in response data:

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

Response example:

   "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": "",
      "cpu_info": {
         "vendor": "Intel",
         "model": "cpu64-rhel6",
         "arch": "x86_64",
         "features": ["sse2",
         "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

Security impact


Notifications impact


Other end user impact

python-novaclient should implement logic to work with new api microversion If API microversion contains this change no attempts to deserialize cpu_info in python-novaclient should happen.

Performance Impact


Other deployer impact


Developer impact




Primary assignee:


Work Items

  • Change cpu_info field in nova-api from string to regular JSON object.

  • Change parsing logic in python-novaclient with respect to API microversion.




Existing tests should be changed so they fits schema, provided above.

Documentation Impact

REST-API documentation should be updated according to schema provided in spec