libivrt machine types are case sensitive but we do not validate them in nova

Bug #1933097 reported by sean mooney
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
OpenStack Compute (nova)
Fix Released
Low
Amit Uniyal

Bug Description

as seen in http://paste.openstack.org/show/806818/ if we use machine type "Q35" instead of "q35" we fail to boot the vm. This is because the machine type name in libvirt are case sensitvie.
however due to the way libvirt validates the xml it retruns a "No PCI buses available" error instead of a "incorrect machine type error" or similar that would be more intunitve.

021-06-20 02:37:39.795 7 ERROR nova.virt.libvirt.guest [req-04cb6169-bee4-407d-aef1-2e22abfccf97 329bf2535969456cb83fbc8e338ecb4c 5f3ea501afce4858b43186166d4d7afb - default default] Error defining a guest with XML: <domain type="kvm">
  <uuid>e2f47fae-7684-4f23-9f3e-39a6b133f929</uuid>
  <name>instance-00000006</name>
  <memory>4194304</memory>
  <vcpu>4</vcpu>
  <metadata>
    <nova:instance xmlns:nova="http://openstack.org/xmlns/libvirt/nova/1.1">
      <nova:package version="23.0.2"/>
      <nova:name>test</nova:name>
      <nova:creationTime>2021-06-20 02:37:39</nova:creationTime>
      <nova:flavor name="test">
        <nova:memory>4096</nova:memory>
        <nova:disk>10</nova:disk>
        <nova:swap>0</nova:swap>
        <nova:ephemeral>0</nova:ephemeral>
        <nova:vcpus>4</nova:vcpus>
      </nova:flavor>
      <nova:owner>
        <nova:user uuid="329bf2535969456cb83fbc8e338ecb4c">sean</nova:user>
        <nova:project uuid="5f3ea501afce4858b43186166d4d7afb">sean</nova:project>
      </nova:owner>
      <nova:root type="image" uuid="33269e7a-5bec-48cb-aab6-a84f3bbb2155"/>
      <nova:ports>
        <nova:port uuid="48be4df9-d089-4a10-93ac-ea1113c88331">
          <nova:ip type="fixed" address="172.20.1.152" ipVersion="4"/>
        </nova:port>
      </nova:ports>
    </nova:instance>
  </metadata>
  <sysinfo type="smbios">
    <system>
      <entry name="manufacturer">OpenStack Foundation</entry>
      <entry name="product">OpenStack Nova</entry>
      <entry name="version">23.0.2</entry>
      <entry name="serial">e2f47fae-7684-4f23-9f3e-39a6b133f929</entry>
      <entry name="uuid">e2f47fae-7684-4f23-9f3e-39a6b133f929</entry>
      <entry name="family">Virtual Machine</entry>
    </system>
  </sysinfo>
  <os>
    <type machine="Q35">hvm</type>
    <boot dev="hd"/>
    <smbios mode="sysinfo"/>
  </os>
  <features>
    <acpi/>
    <apic/>
  </features>
  <cputune>
    <shares>4096</shares>
  </cputune>
  <clock offset="utc">
    <timer name="pit" tickpolicy="delay"/>
    <timer name="rtc" tickpolicy="catchup"/>
    <timer name="hpet" present="no"/>
  </clock>
  <cpu mode="host-model" match="exact">
    <topology sockets="4" cores="1" threads="1"/>
  </cpu>
  <devices>
    <disk type="network" device="disk">
      <driver type="raw" cache="writeback" discard="unmap"/>
      <source protocol="rbd" name="vms/e2f47fae-7684-4f23-9f3e-39a6b133f929_disk">
        <host name="192.168.1.10" port="6789"/>
      </source>
      <auth username="nova">
        <secret type="ceph" uuid="d580b7e4-db45-4f97-a140-098200428934"/>
      </auth>
      <target dev="sda" bus="scsi"/>
      <address type="drive" controller="0" unit="0"/>
    </disk>
    <controller type="scsi" index="0" model="virtio-scsi"/>
    <interface type="bridge">
      <mac address="fa:16:3e:79:b5:12"/>
      <model type="virtio"/>
      <source bridge="br-int"/>
      <mtu size="2018"/>
      <target dev="tap48be4df9-d0"/>
      <virtualport type="openvswitch">
        <parameters interfaceid="48be4df9-d089-4a10-93ac-ea1113c88331"/>
      </virtualport>
    </interface>
    <serial type="pty">
      <log file="/var/lib/nova/instances/e2f47fae-7684-4f23-9f3e-39a6b133f929/console.log" append="off"/>
    </serial>
    <graphics type="vnc" autoport="yes" listen="192.168.1.250"/>
    <video>
      <model type="virtio"/>
    </video>
    <input type="tablet" bus="usb"/>
    <rng model="virtio">
      <backend model="random">/dev/urandom</backend>
    </rng>
    <controller type="usb" index="0"/>
    <memballoon model="virtio">
      <stats period="10"/>
    </memballoon>
  </devices>
</domain>
: libvirt.libvirtError: XML error: No PCI buses available

since the libvirt machine types are case sensitive we cannot assume we can just lowercase teh users input but we should still be able to normalise the machine types in the following way.

on startup we call virsh capablites to retrive info from libvirt regarding the capablities of the host.from that api we can retrieve the set of supported machine types.
we can then construct a dictionary of lower-case machine type name to correct case machine type names.

when booting a vm we should lowercase the user input and lookup the correct case form this dictonary. this will allow nova to continue to treat the input as case insensitive but still pass the correct value to libvirt.

Revision history for this message
sean mooney (sean-k-mooney) wrote :

note if we dont find the machine type in the dict we shoudl raise an excption and fail the spawn with a error noting that it is not supportred.

long term it might be nice if we could schedule based on machine types using custom traits in placment but that is a feature not a bugfix and should be handeled seperatly.

tags: added: low-hanging-fruit
Amit Uniyal (auniyal)
Changed in nova:
assignee: nobody → Amit Uniyal (auniyal)
Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Fix proposed to nova (master)

Fix proposed to branch: master
Review: https://review.opendev.org/c/openstack/nova/+/847126

Changed in nova:
status: Triaged → In Progress
Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Fix merged to nova (master)

Reviewed: https://review.opendev.org/c/openstack/nova/+/847126
Committed: https://opendev.org/openstack/nova/commit/7b9312ef8e3064932107daec8b823d7031a89ae6
Submitter: "Zuul (22348)"
Branch: master

commit 7b9312ef8e3064932107daec8b823d7031a89ae6
Author: Amit Uniyal <email address hidden>
Date: Tue Jun 21 20:23:47 2022 +0000

    Adds validation for hw machine type in host caps

    Added function '_check_machine_type' which accept host
    capabilities (caps) and machine type as param and look
    for machine type in host caps object, if machine type
    is not found raises exception InvalidMachineType

    Closes-Bug: #1933097
    Change-Id: I59d22c0342d6b0f3c0398ce62ec177dae39b5677

Changed in nova:
status: In Progress → Fix Released
Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Fix included in openstack/nova 26.0.0.0rc1

This issue was fixed in the openstack/nova 26.0.0.0rc1 release candidate.

To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.