https://bugzilla.redhat.com/show_bug.cgi?id=1434451
Users might want to uniquely identify devices even before the
domain is started. Therefore we must generate device aliases
right at the define time.
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
src/qemu/qemu_domain.c | 24 ++++++++++++++++++++++
tests/qemuxml2argvtest.c | 9 ++++++++
.../qemuxml2xmlout-channel-virtio-state-active.xml | 20 +++++++++++++++---
.../qemuxml2xmlout-disk-active-commit.xml | 16 ++++++++++++---
.../qemuxml2xmlout-disk-backing-chains-active.xml | 19 ++++++++++++++---
.../qemuxml2xmlout-disk-mirror-active.xml | 19 ++++++++++++++---
.../qemuxml2xmlout-disk-mirror-old.xml | 19 ++++++++++++++---
.../qemuxml2xmlout-seclabel-static-labelskip.xml | 16 ++++++++++++---
8 files changed, 124 insertions(+), 18 deletions(-)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index ee6641847..15fd88dcc 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -3936,6 +3936,29 @@ qemuDomainDefAssignAddresses(virDomainDef *def,
}
+static int
+qemuDomainDefAssignAliases(virDomainDef *def,
+ virCapsPtr caps ATTRIBUTE_UNUSED,
+ unsigned int parseFlags ATTRIBUTE_UNUSED,
+ void *opaque ATTRIBUTE_UNUSED,
+ void *parseOpaque)
+{
+ /* Note that qemuCaps may be NULL when this function is called. This
+ * function shall not fail in that case. It will be re-run on VM startup
+ * with the capabilities populated. */
+ virQEMUCapsPtr qemuCaps = parseOpaque;
+
+ /* Skip address assignment if @qemuCaps is not present. In such case devices
+ * which are automatically added may be missing. Additionally @qemuCaps should
+ * only be missing when reloading configs, thus aliases were already
+ * assigned. */
+ if (!qemuCaps)
+ return 1;
+
+ return qemuAssignDeviceAliases(def, qemuCaps, true);
+}
+
+
static int
qemuDomainPostParseDataAlloc(const virDomainDef *def,
virCapsPtr caps ATTRIBUTE_UNUSED,
@@ -3969,6 +3992,7 @@ virDomainDefParserConfig virQEMUDriverDomainDefParserConfig = {
.devicesPostParseCallback = qemuDomainDeviceDefPostParse,
.domainPostParseCallback = qemuDomainDefPostParse,
.assignAddressesCallback = qemuDomainDefAssignAddresses,
+ .assignAliasesCallback = qemuDomainDefAssignAliases,
.domainValidateCallback = qemuDomainDefValidate,
.deviceValidateCallback = qemuDomainDeviceDefValidate,
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index 70be0c32d..5c2a45fd3 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -485,6 +485,15 @@ testCompareXMLToArgv(const void *data)
if (testUpdateQEMUCaps(info, vm, driver.caps) < 0)
goto cleanup;
+ /* Forcibly regenerate device aliases. They are generated in
+ * virDomainDefParseFile(), however, qemuCaps are filled out
+ * just partially therefore the generated aliases might be
+ * wrong. It's only after testUpdateQEMUCaps() call that we
+ * have full set of caps. However, we can't move the call any
+ * sooner because it needs vm->def. */
+ if (qemuAssignDeviceAliases(vm->def, info->qemuCaps, true) < 0)
+ goto cleanup;
+
log = virTestLogContentAndReset();
VIR_FREE(log);
virResetLastError();
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-channel-virtio-state-active.xml
b/tests/qemuxml2xmloutdata/qemuxml2xmlout-channel-virtio-state-active.xml
index 8cddbeff7..326e285cb 100644
--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-channel-virtio-state-active.xml
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-channel-virtio-state-active.xml
@@ -18,33 +18,47 @@
<source dev='/dev/HostVG/QEMUGuest1'/>
<backingStore/>
<target dev='hda' bus='ide'/>
+ <alias name='ide0-0-0'/>
<address type='drive' controller='0' bus='0'
target='0' unit='0'/>
</disk>
<controller type='usb' index='0'>
+ <alias name='usb'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x01' function='0x2'/>
</controller>
<controller type='ide' index='0'>
+ <alias name='ide'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x01' function='0x1'/>
</controller>
<controller type='virtio-serial' index='1'>
+ <alias name='virtio-serial1'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x0a' function='0x0'/>
</controller>
- <controller type='pci' index='0' model='pci-root'/>
+ <controller type='pci' index='0' model='pci-root'>
+ <alias name='pci'/>
+ </controller>
<channel type='pty'>
<target type='virtio' name='org.linux-kvm.port.foo'
state='connected'/>
+ <alias name='channel0'/>
<address type='virtio-serial' controller='1' bus='0'
port='3'/>
</channel>
<channel type='pty'>
<target type='virtio' name='org.linux-kvm.port.foo1'
state='disconnected'/>
+ <alias name='channel1'/>
<address type='virtio-serial' controller='1' bus='0'
port='4'/>
</channel>
<channel type='pty'>
<target type='virtio' name='org.linux-kvm.port.foo2'/>
+ <alias name='channel2'/>
<address type='virtio-serial' controller='1' bus='0'
port='5'/>
</channel>
- <input type='mouse' bus='ps2'/>
- <input type='keyboard' bus='ps2'/>
+ <input type='mouse' bus='ps2'>
+ <alias name='input0'/>
+ </input>
+ <input type='keyboard' bus='ps2'>
+ <alias name='input1'/>
+ </input>
<memballoon model='virtio'>
+ <alias name='balloon0'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x03' function='0x0'/>
</memballoon>
</devices>
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-active-commit.xml
b/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-active-commit.xml
index cc26af109..f63e8c3b7 100644
--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-active-commit.xml
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-active-commit.xml
@@ -27,18 +27,28 @@
<source dev='/dev/HostVG/QEMUGuest1'/>
</mirror>
<target dev='hda' bus='ide'/>
+ <alias name='ide0-0-0'/>
<address type='drive' controller='0' bus='0'
target='0' unit='0'/>
</disk>
<controller type='usb' index='0'>
+ <alias name='usb'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x01' function='0x2'/>
</controller>
<controller type='ide' index='0'>
+ <alias name='ide'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x01' function='0x1'/>
</controller>
- <controller type='pci' index='0' model='pci-root'/>
- <input type='mouse' bus='ps2'/>
- <input type='keyboard' bus='ps2'/>
+ <controller type='pci' index='0' model='pci-root'>
+ <alias name='pci'/>
+ </controller>
+ <input type='mouse' bus='ps2'>
+ <alias name='input0'/>
+ </input>
+ <input type='keyboard' bus='ps2'>
+ <alias name='input1'/>
+ </input>
<memballoon model='virtio'>
+ <alias name='balloon0'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x03' function='0x0'/>
</memballoon>
</devices>
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-backing-chains-active.xml
b/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-backing-chains-active.xml
index 83d47df56..5abe21270 100644
--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-backing-chains-active.xml
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-backing-chains-active.xml
@@ -25,6 +25,7 @@
<backingStore/>
</backingStore>
<target dev='vda' bus='virtio'/>
+ <alias name='virtio-disk0'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x03' function='0x0'/>
</disk>
<disk type='network' device='disk'>
@@ -58,6 +59,7 @@
</backingStore>
</backingStore>
<target dev='vdb' bus='virtio'/>
+ <alias name='virtio-disk1'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x04' function='0x0'/>
</disk>
<disk type='network' device='disk'>
@@ -67,6 +69,7 @@
</source>
<backingStore/>
<target dev='vdc' bus='virtio'/>
+ <alias name='virtio-disk2'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x05' function='0x0'/>
</disk>
<disk type='network' device='disk'>
@@ -85,6 +88,7 @@
<backingStore/>
</backingStore>
<target dev='vdd' bus='virtio'/>
+ <alias name='virtio-disk3'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x06' function='0x0'/>
</disk>
<disk type='block' device='disk'>
@@ -92,15 +96,24 @@
<source dev='/dev/HostVG/QEMUGuest11'/>
<backingStore/>
<target dev='vde' bus='virtio'/>
+ <alias name='virtio-disk4'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x07' function='0x0'/>
</disk>
<controller type='usb' index='0'>
+ <alias name='usb'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x01' function='0x2'/>
</controller>
- <controller type='pci' index='0' model='pci-root'/>
- <input type='mouse' bus='ps2'/>
- <input type='keyboard' bus='ps2'/>
+ <controller type='pci' index='0' model='pci-root'>
+ <alias name='pci'/>
+ </controller>
+ <input type='mouse' bus='ps2'>
+ <alias name='input0'/>
+ </input>
+ <input type='keyboard' bus='ps2'>
+ <alias name='input1'/>
+ </input>
<memballoon model='virtio'>
+ <alias name='balloon0'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x08' function='0x0'/>
</memballoon>
</devices>
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-mirror-active.xml
b/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-mirror-active.xml
index c1e8a33ec..ebe6e4471 100644
--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-mirror-active.xml
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-mirror-active.xml
@@ -21,6 +21,7 @@
<source dev='/dev/HostVG/QEMUGuest1Copy'/>
</mirror>
<target dev='hda' bus='ide'/>
+ <alias name='ide0-0-0'/>
<address type='drive' controller='0' bus='0'
target='0' unit='0'/>
</disk>
<disk type='block' device='cdrom'>
@@ -28,6 +29,7 @@
<backingStore/>
<target dev='hdc' bus='ide'/>
<readonly/>
+ <alias name='ide0-1-0'/>
<address type='drive' controller='0' bus='1'
target='0' unit='0'/>
</disk>
<disk type='file' device='disk'>
@@ -38,6 +40,7 @@
<source file='/tmp/copy.img'/>
</mirror>
<target dev='vda' bus='virtio'/>
+ <alias name='virtio-disk0'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x03' function='0x0'/>
</disk>
<disk type='file' device='disk'>
@@ -48,18 +51,28 @@
<source file='/tmp/logcopy.img'/>
</mirror>
<target dev='vdb' bus='virtio'/>
+ <alias name='virtio-disk1'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x04' function='0x0'/>
</disk>
<controller type='usb' index='0'>
+ <alias name='usb'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x01' function='0x2'/>
</controller>
<controller type='ide' index='0'>
+ <alias name='ide'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x01' function='0x1'/>
</controller>
- <controller type='pci' index='0' model='pci-root'/>
- <input type='mouse' bus='ps2'/>
- <input type='keyboard' bus='ps2'/>
+ <controller type='pci' index='0' model='pci-root'>
+ <alias name='pci'/>
+ </controller>
+ <input type='mouse' bus='ps2'>
+ <alias name='input0'/>
+ </input>
+ <input type='keyboard' bus='ps2'>
+ <alias name='input1'/>
+ </input>
<memballoon model='virtio'>
+ <alias name='balloon0'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x05' function='0x0'/>
</memballoon>
</devices>
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-mirror-old.xml
b/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-mirror-old.xml
index e390bc02f..451737621 100644
--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-mirror-old.xml
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-mirror-old.xml
@@ -21,6 +21,7 @@
<source file='/dev/HostVG/QEMUGuest1Copy'/>
</mirror>
<target dev='hda' bus='ide'/>
+ <alias name='ide0-0-0'/>
<address type='drive' controller='0' bus='0'
target='0' unit='0'/>
</disk>
<disk type='block' device='cdrom'>
@@ -28,6 +29,7 @@
<backingStore/>
<target dev='hdc' bus='ide'/>
<readonly/>
+ <alias name='ide0-1-0'/>
<address type='drive' controller='0' bus='1'
target='0' unit='0'/>
</disk>
<disk type='file' device='disk'>
@@ -38,24 +40,35 @@
<source file='/tmp/copy.img'/>
</mirror>
<target dev='vda' bus='virtio'/>
+ <alias name='virtio-disk0'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x03' function='0x0'/>
</disk>
<disk type='file' device='disk'>
<source file='/tmp/logs.img'/>
<backingStore/>
<target dev='vdb' bus='virtio'/>
+ <alias name='virtio-disk1'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x04' function='0x0'/>
</disk>
<controller type='usb' index='0'>
+ <alias name='usb'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x01' function='0x2'/>
</controller>
<controller type='ide' index='0'>
+ <alias name='ide'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x01' function='0x1'/>
</controller>
- <controller type='pci' index='0' model='pci-root'/>
- <input type='mouse' bus='ps2'/>
- <input type='keyboard' bus='ps2'/>
+ <controller type='pci' index='0' model='pci-root'>
+ <alias name='pci'/>
+ </controller>
+ <input type='mouse' bus='ps2'>
+ <alias name='input0'/>
+ </input>
+ <input type='keyboard' bus='ps2'>
+ <alias name='input1'/>
+ </input>
<memballoon model='virtio'>
+ <alias name='balloon0'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x05' function='0x0'/>
</memballoon>
</devices>
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-seclabel-static-labelskip.xml
b/tests/qemuxml2xmloutdata/qemuxml2xmlout-seclabel-static-labelskip.xml
index d37b950cb..8ea5a29d7 100644
--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-seclabel-static-labelskip.xml
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-seclabel-static-labelskip.xml
@@ -20,18 +20,28 @@
</source>
<backingStore/>
<target dev='hda' bus='ide'/>
+ <alias name='ide0-0-0'/>
<address type='drive' controller='0' bus='0'
target='0' unit='0'/>
</disk>
<controller type='usb' index='0'>
+ <alias name='usb'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x01' function='0x2'/>
</controller>
<controller type='ide' index='0'>
+ <alias name='ide'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x01' function='0x1'/>
</controller>
- <controller type='pci' index='0' model='pci-root'/>
- <input type='mouse' bus='ps2'/>
- <input type='keyboard' bus='ps2'/>
+ <controller type='pci' index='0' model='pci-root'>
+ <alias name='pci'/>
+ </controller>
+ <input type='mouse' bus='ps2'>
+ <alias name='input0'/>
+ </input>
+ <input type='keyboard' bus='ps2'>
+ <alias name='input1'/>
+ </input>
<memballoon model='virtio'>
+ <alias name='balloon0'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x03' function='0x0'/>
</memballoon>
</devices>
--
2.13.5