OpenKeel: the sovereign French Cloud solution of the inherent group, with a European reach Discover inherent

Reverse-spec · Services

nova — Flavors: summary

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 of staging/src/kubevirt.io/api in kubevirt/)

  • 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:line relative to the Nova repository root; kubevirt: points to the KubeVirt clone. [inferred] marks what was not followed to the end.

Files

FileContent
01-flavors-api_stable-2026.2.md14 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.mderrors of the flavor, extra-spec and access APIs, and flavor errors at boot and resize
03-flavors-interactions_stable-2026.2.mdAPI DB tables and queries, instance_extra.flavor, notifications, Placement request
04-flavors-scenarios_stable-2026.2.md4 diagrams: private flavor publication, boot, resize, deletion while in use
05-flavors-async-processing_stable-2026.2.mdnone
06-flavors-change-history_stable-2026.2.mdbranch range: nothing on flavors; 2026.2 cycle: SEV-SNP, TDX, private-flavor hardening
07-flavors-kubevirt-mapping_stable-2026.2.mdflavor ↔ instancetype/preference, field by field and for every extra spec (525/525 validators covered), vectors, gaps, checklist

_rewrite/:

FileContent
extra-spec-validators_stable-2026.2.jsonNova's 525 extra-spec validators: name, regex, type, allowed values, description, definition
flavor-kubevirt-mapping_stable-2026.2.jsonthe mapping rules and the validator → rule coverage
flavor-to-kubevirt_stable-2026.2.pyreference converter (standard library only)
flavor-kubevirt-vectors_stable-2026.2.json6 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

  1. Extra specs are only validated from 2.86. Values written earlier fail at boot (400), or at scheduling (NoValidHost).
  2. Status codes are not what REST would suggest: create returns 200, delete returns 202, and deleting an extra spec returns 200.
  3. **The name filter (≥ 2.102) is a database regular expression**: a rewrite must reproduce regex semantics, not equality.
  4. **disabled exists but has no API since 2.102.** It still blocks boots and resizes to that flavor.
  5. 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).
  6. 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.