Reverse-specification of Nova flavors — branch stable/2026.2
Branch
stable/2026.2@8df1922926dd(34.0.0+ 7 commits) — repository https://opendev.org/openstack/nova — analysed on 2026-10-28 KubeVirt reference for the mapping:v1.9.1@c3d19093f9c7(sparse clone ofstaging/src/kubevirt.io/apiinkubevirt/)
- Scope: flavors only:
- the flavor, extra-spec and access-list APIs;
- the API database tables;
- extra-spec validation;
- how a flavor feeds boot, resize and Placement;
- the server's frozen copy;
- the mapping to KubeVirt instancetypes and preferences. The rest of Nova is not covered:
_inventory/inventory_stable-2026.2.*covers the whole repository and can start a full reverse-spec later.
- References are
file:linerelative to the Nova repository root;kubevirt:points to the KubeVirt clone. [inferred] marks what was not followed to the end.
Files
| File | Content |
|---|---|
| 01-flavors-api_stable-2026.2.md | 14 endpoints, policies, visibility, document per microversion, create/update/delete/list, extra-spec validation (≥ 2.86) and consumers, the server's copy, resize |
| 02-flavors-errors_stable-2026.2.md | errors of the flavor, extra-spec and access APIs, and flavor errors at boot and resize |
| 03-flavors-interactions_stable-2026.2.md | API DB tables and queries, instance_extra.flavor, notifications, Placement request |
| 04-flavors-scenarios_stable-2026.2.md | 4 diagrams: private flavor publication, boot, resize, deletion while in use |
| 05-flavors-async-processing_stable-2026.2.md | none |
| 06-flavors-change-history_stable-2026.2.md | branch range: nothing on flavors; 2026.2 cycle: SEV-SNP, TDX, private-flavor hardening |
| 07-flavors-kubevirt-mapping_stable-2026.2.md | flavor ↔ instancetype/preference, field by field and for every extra spec (525/525 validators covered), vectors, gaps, checklist |
_rewrite/:
| File | Content |
|---|---|
extra-spec-validators_stable-2026.2.json | Nova's 525 extra-spec validators: name, regex, type, allowed values, description, definition |
flavor-kubevirt-mapping_stable-2026.2.json | the mapping rules and the validator → rule coverage |
flavor-to-kubevirt_stable-2026.2.py | reference converter (standard library only) |
flavor-kubevirt-vectors_stable-2026.2.json | 6 reference flavors with their KubeVirt objects and per-key report |
Overview
A flavor sets vCPUs, RAM (MiB), root disk, ephemeral disk (GiB) and swap (MiB). Its extra specs drive scheduling (Placement resources and traits, filters) and the guest configuration (pinning, huge pages, NUMA, devices, encryption, QoS).
- Who can do what: only administrators create flavors, delete them, set extra specs or manage the access list. Users see public flavors and the private ones shared with their project.
- Mutability: only the description can change.
- The server's copy: each server keeps a copy of its flavor, so changing or deleting the flavor never affects existing servers.
In KubeVirt:
- the closest object is the instancetype, cluster-wide for public flavors and namespaced for private ones;
- hints shared with the image go into a preference;
- the frozen copy is the instancetype ControllerRevision.
Key figures
14 endpoints; 3 tables; 525 extra-spec validators in 12 namespaces; maximum microversion 2.104; mapping: 8 exact, 458 partial, 9 approximate, 10 node-level, 18 without equivalent, 22 not applicable.
Points of attention
- Extra specs are only validated from 2.86. Values written earlier fail at boot (400), or at scheduling (
NoValidHost). - Status codes are not what REST would suggest: create returns 200, delete returns 202, and deleting an extra spec returns 200.
- **The
namefilter (≥ 2.102) is a database regular expression**: a rewrite must reproduce regex semantics, not equality. - **
disabledexists but has no API since 2.102.** It still blocks boots and resizes to that flavor. - KubeVirt has no equivalent for:
- mixed CPU policy, explicit NUMA layouts, swap;
- per-VM thread policy;
- per-flavor disk and VIF QoS;
- several devices. Traits and aggregates only work through node labels that OpenKeel must maintain (07 § 7).
- Quotas must keep counting the flavor's vCPUs, not the pod's CPU requests, which are divided by KubeVirt's CPU allocation ratio.
Blind spots
- The libvirt driver's use of each extra spec was not read; the meanings come from the validator descriptions and
nova/virt/hardware.py. - Resize confirm and revert in the compute manager, and the scheduler filters, were not read.
- KubeVirt behaviour comes from its API types (v1.9.1) and their comments, not from running KubeVirt. The cluster-level CPU allocation ratio is outside the sparse clone.
Source: reverse-spec-nova/00-flavors-summary_stable-2026.2.md. The _rewrite/ and _inventory/ files are not published on the site.