7.0 KiB
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:
-
pkholkin
- Other contributors:
-
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
History
Release Name | Description |
---|---|
Mitaka | Approved. |
Newton | Re-introduced. |