Merge "Add libvirt-dev-alias spec"
This commit is contained in:
commit
f1ec291df7
|
@ -0,0 +1,207 @@
|
||||||
|
..
|
||||||
|
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||||
|
License.
|
||||||
|
|
||||||
|
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||||
|
|
||||||
|
====================================
|
||||||
|
Move to using Libvirt device aliases
|
||||||
|
====================================
|
||||||
|
|
||||||
|
https://blueprints.launchpad.net/nova/+spec/libvirt-dev-alias
|
||||||
|
|
||||||
|
Currently we identify devices in Libvirt guest XML by a variety of methods,
|
||||||
|
which differs based on the device type (at least). Libvirt now provides a
|
||||||
|
device alias mechanism by which we can tie virtual guest devices to an
|
||||||
|
identifier we can use to look them up in a stable and generic way. Nova
|
||||||
|
should move to using that, which will increase consistency, decrease some
|
||||||
|
complexity, and also work around some issues with our current strategy.
|
||||||
|
|
||||||
|
Problem description
|
||||||
|
===================
|
||||||
|
|
||||||
|
Nova currently looks up guest devices in XML for attach/detach and other
|
||||||
|
modifications using a variety of methods. For example, disk devices use
|
||||||
|
the ``serial`` property to identify them uniquely. However, libvirt and
|
||||||
|
qemu do not support setting this property on all disk device types, which
|
||||||
|
means Nova cannot use that to look up disk devices in a generic way. Further,
|
||||||
|
if we have multiple network interfaces with the same MAC address, using that
|
||||||
|
as a unique identifier is not sufficient.
|
||||||
|
|
||||||
|
Example volume attachment::
|
||||||
|
|
||||||
|
<disk type='block' device='disk'>
|
||||||
|
<driver name='qemu' type='raw' cache='none' io='native'/>
|
||||||
|
<source dev='/dev/sda' index='5'/>
|
||||||
|
<backingStore/>
|
||||||
|
<target dev='vdb' bus='virtio'/>
|
||||||
|
<serial>ada5af06-300e-4d07-931d-3cc2bff8a8a9</serial>
|
||||||
|
<alias name='virtio-disk1'>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
|
||||||
|
</disk>
|
||||||
|
|
||||||
|
Use Cases
|
||||||
|
---------
|
||||||
|
|
||||||
|
As a developer, I want Nova to be able to manage libvirt guest devices in a
|
||||||
|
stable and consistent way.
|
||||||
|
|
||||||
|
As a deployer, I want Nova to support things like SCSI LUN passthrough, which
|
||||||
|
does not support setting the device serial in libvirt.
|
||||||
|
|
||||||
|
Proposed change
|
||||||
|
===============
|
||||||
|
|
||||||
|
Nova's libvirt driver should move to using the device alias mechanism
|
||||||
|
[1]_ for identifying all types of devices that are attach- or
|
||||||
|
detach-able. For devices like volumes and network interfaces, the
|
||||||
|
volume or port UUID should be used. For other devices, some other
|
||||||
|
stable identifier that correlates to something in Nova or another
|
||||||
|
service's database is required. Libvirt has specific requirements for
|
||||||
|
the format of the alias, which must be followed. However, for most
|
||||||
|
devices that use a UUID as the primary identifier, we should be able
|
||||||
|
to embed that within the alias.
|
||||||
|
|
||||||
|
This is what the above disk example would look like with a
|
||||||
|
nova-specified alias::
|
||||||
|
|
||||||
|
<disk type='block' device='disk'>
|
||||||
|
<driver name='qemu' type='raw' cache='none' io='native'/>
|
||||||
|
<source dev='/dev/sda' index='5'/>
|
||||||
|
<backingStore/>
|
||||||
|
<target dev='vdb' bus='virtio'/>
|
||||||
|
<serial>ada5af06-300e-4d07-931d-3cc2bff8a8a9</serial>
|
||||||
|
<alias name='ua-ada5af06-300e-4d07-931d-3cc2bff8a8a9'/>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
|
||||||
|
</disk>
|
||||||
|
|
||||||
|
Alternatives
|
||||||
|
------------
|
||||||
|
|
||||||
|
We could keep what we have and continue to not support disk devices that do not
|
||||||
|
support using ``serial``.
|
||||||
|
|
||||||
|
We could maintain our own mapping in our database for those device types.
|
||||||
|
|
||||||
|
Data model impact
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
Nova's own data model is not affected by this and this is limited to
|
||||||
|
nova-compute and the libvirt driver. However, the libvirt XML data that we
|
||||||
|
currently maintain will need to change (and existing instances migrated) to
|
||||||
|
set the device aliases accordingly.
|
||||||
|
|
||||||
|
REST API impact
|
||||||
|
---------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
Security impact
|
||||||
|
---------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
Notifications impact
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
Other end user impact
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
End users can currently request SCSI LUN-based disk device mapping, but it does
|
||||||
|
not work because we are unable to specify the device serial in that
|
||||||
|
configuration. After this change, that existing mechanism will begin to work.
|
||||||
|
|
||||||
|
Performance Impact
|
||||||
|
------------------
|
||||||
|
|
||||||
|
No major performance impact to Nova itself, although looking up
|
||||||
|
devices by alias will be easier and less computationally
|
||||||
|
intense. Further a detach-by-alias routine [2]_ is provided by
|
||||||
|
libvirt which may be significantly easier than what we currently need
|
||||||
|
to do by generating and providing an XML blob for detach.
|
||||||
|
|
||||||
|
Other deployer impact
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
Developer impact
|
||||||
|
----------------
|
||||||
|
|
||||||
|
The libvirt driver will ultimately be simpler after this change.
|
||||||
|
|
||||||
|
Upgrade impact
|
||||||
|
--------------
|
||||||
|
|
||||||
|
The only upgrade impact comes from migrating existing instance XML documents
|
||||||
|
to specify the device alias. Because we may be migrating instances to/from
|
||||||
|
older nodes, we should retain compatibility with alias-less XMLs for some time
|
||||||
|
to come.
|
||||||
|
|
||||||
|
Implementation
|
||||||
|
==============
|
||||||
|
|
||||||
|
Assignee(s)
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Primary assignee:
|
||||||
|
dansmith
|
||||||
|
|
||||||
|
Other contributors:
|
||||||
|
- kashyap
|
||||||
|
- sean-k-mooney
|
||||||
|
|
||||||
|
Feature Liaison
|
||||||
|
---------------
|
||||||
|
|
||||||
|
dansmith
|
||||||
|
|
||||||
|
Work Items
|
||||||
|
----------
|
||||||
|
|
||||||
|
- Enable setting and parsing the device alias on disk, interface, and pci
|
||||||
|
devices
|
||||||
|
- Actually set those device aliases in the various parts of the driver that
|
||||||
|
create those configs
|
||||||
|
- Make the code that looks up devices by device-specific identifiers prefer the
|
||||||
|
alias and fall back to the old way
|
||||||
|
- Migrate existing instance XMLs on startup when device aliases are missing
|
||||||
|
|
||||||
|
Dependencies
|
||||||
|
============
|
||||||
|
|
||||||
|
* Libvirt 3.9.0: https://libvirt.org/formatdomain.html#devices
|
||||||
|
|
||||||
|
Testing
|
||||||
|
=======
|
||||||
|
|
||||||
|
Existing devstack jobs should provide sufficient coverage other than the unit
|
||||||
|
and functional coverage that will be added. Potentially enabling (and using)
|
||||||
|
the LUN passthrough attachment mechanism would be beneficial, but that is
|
||||||
|
somewhat beyond the scope of this effort which is just changing the enumeration
|
||||||
|
behavior.
|
||||||
|
|
||||||
|
Documentation Impact
|
||||||
|
====================
|
||||||
|
|
||||||
|
There really is not much in the way of documentation impact because this
|
||||||
|
should be transparent to the operators and users.
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
|
||||||
|
.. [1] Libvirt's device XML specification: https://libvirt.org/formatdomain.html#devices
|
||||||
|
.. [2] Libvirt's detach-by-alias function: https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainDetachDeviceAlias
|
||||||
|
|
||||||
|
History
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. list-table:: Revisions
|
||||||
|
:header-rows: 1
|
||||||
|
|
||||||
|
* - Release Name
|
||||||
|
- Description
|
||||||
|
* - 2024.1
|
||||||
|
- Introduced
|
Loading…
Reference in New Issue