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

https://blueprints.launchpad.net/nova/+spec/nova-api-hypervsor-cpu-info

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": {
     "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 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

None

Proposed change

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

Alternatives

As alternative api could provide enum for cpu_info.model, cpu_info.vendor, and cpu_info.features.name. 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

None

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": "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
   }
}

Security impact

None

Notifications impact

None

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

None

Other deployer impact

None

Developer impact

None

Implementation

Assignee(s)

Primary assignee:

tdurakov

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.

Dependencies

None

Testing

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

References

None