blockjob: don't remove older-style mirror XML

Commit 7c6fc39 introduced a regression in the XML produced for older
clients.  The argument at the time was that clients shouldn't be
depending on output-only data for something that is only going to
be triggered for a transient guest; but John Ferlan reported that
the automated testsuite was such a client.  It's better to be safe
than sorry by guaranteeing back-compat cruft.  Note that later
patches will be using <mirror> for active block commit, but there
we don't have to worry about back-compat.

* src/conf/domain_conf.c (virDomainDiskDefFormat): Restore old
style output when necessary.
* docs/schemas/domaincommon.rng: Validate back-compat style.
* docs/formatdomain.html.in: Update the documentation.
* tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-mirror-old.xml:
Update tests.
* tests/qemuxml2argvdata/qemuxml2argv-disk-mirror.xml: Likewise.

Signed-off-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
Eric Blake 2014-06-16 13:34:36 -06:00
parent cfe087a211
commit b50e104923
5 changed files with 34 additions and 17 deletions

View File

@ -1891,11 +1891,13 @@
attribute <code>ready</code> is present, then it is known the
disk is ready to pivot; otherwise, the disk is probably still
copying. For now, this element only valid in output; it is
ignored on input. <span class="since">Since 1.2.6</span>
(Older libvirt <span class="since">since 0.9.12</span> allowed
only mirroring to a file, with the information reported
in <code>file</code> and <code>format</code> attributes
of <code>mirror</code> rather than subelements.)
ignored on input. The <code>source</code> sub-element exists
for all two-phase jobs <span class="since">since 1.2.6</span>.
Older libvirt supported only block copy to a
file, <span class="since">since 0.9.12</span>; for
compatibility with older clients, such jobs include redundant
information in the attributes <code>file</code>
and <code>format</code> in the <code>mirror</code> element.
</dd>
<dt><code>target</code></dt>
<dd>The <code>target</code> element controls the bus / device

View File

@ -4176,7 +4176,7 @@
<define name='diskMirror'>
<element name='mirror'>
<choice>
<group>
<group> <!-- old format, for block copy back-compat -->
<attribute name='file'>
<ref name='absFilePath'/>
</attribute>
@ -4185,8 +4185,16 @@
<ref name='storageFormat'/>
</attribute>
</optional>
<optional>
<interleave>
<ref name='diskSourceFile'/>
<optional>
<ref name="diskFormat"/>
</optional>
</interleave>
</optional>
</group>
<group>
<group> <!-- preferred format -->
<interleave>
<ref name="diskSource"/>
<optional>

View File

@ -15187,19 +15187,26 @@ virDomainDiskDefFormat(virBufferPtr buf,
/* For now, mirroring is currently output-only: we only output it
* for live domains, therefore we ignore it on input except for
* the internal parse on libvirtd restart. We only output the
* new style similar to backingStore, even though the parser
* code still accepts old style across libvirtd upgrades. */
* the internal parse on libvirtd restart. We prefer to output
* the new style similar to backingStore, but for back-compat on
* blockcopy files we also have to output old style attributes.
* The parser accepts either style across libvirtd upgrades. */
if (def->mirror && !(flags & VIR_DOMAIN_XML_INACTIVE)) {
const char *formatStr = NULL;
if (def->mirror->format)
formatStr = virStorageFileFormatTypeToString(def->mirror->format);
virBufferAsprintf(buf, "<mirror type='%s'",
virStorageTypeToString(def->mirror->type));
if (def->mirror->type == VIR_STORAGE_TYPE_FILE) {
virBufferEscapeString(buf, " file='%s'", def->mirror->path);
virBufferEscapeString(buf, " format='%s'", formatStr);
}
if (def->mirroring)
virBufferAddLit(buf, " ready='yes'");
virBufferAddLit(buf, ">\n");
virBufferAdjustIndent(buf, 2);
if (def->mirror->format)
virBufferEscapeString(buf, "<format type='%s'/>\n",
virStorageFileFormatTypeToString(def->mirror->format));
virBufferEscapeString(buf, "<format type='%s'/>\n", formatStr);
if (virDomainDiskSourceFormat(buf, def->mirror, 0, 0) < 0)
return -1;
virBufferAdjustIndent(buf, -2);

View File

@ -17,7 +17,7 @@
<disk type='block' device='disk'>
<source dev='/dev/HostVG/QEMUGuest1'/>
<backingStore/>
<mirror type='file' ready='yes'>
<mirror type='file' file='/dev/HostVG/QEMUGuest1Copy' ready='yes'>
<source file='/dev/HostVG/QEMUGuest1Copy'/>
</mirror>
<target dev='hda' bus='ide'/>
@ -33,7 +33,7 @@
<disk type='file' device='disk'>
<source file='/tmp/data.img'/>
<backingStore/>
<mirror type='file'>
<mirror type='file' file='/tmp/copy.img' format='qcow2'>
<format type='qcow2'/>
<source file='/tmp/copy.img'/>
</mirror>

View File

@ -17,7 +17,7 @@
<disk type='block' device='disk'>
<source dev='/dev/HostVG/QEMUGuest1'/>
<backingStore/>
<mirror type='file' ready='yes'>
<mirror type='file' file='/dev/HostVG/QEMUGuest1Copy' ready='yes'>
<source file='/dev/HostVG/QEMUGuest1Copy'/>
</mirror>
<target dev='hda' bus='ide'/>
@ -33,7 +33,7 @@
<disk type='file' device='disk'>
<source file='/tmp/data.img'/>
<backingStore/>
<mirror type='file'>
<mirror type='file' file='/tmp/copy.img' format='qcow2'>
<format type='qcow2'/>
<source file='/tmp/copy.img'/>
</mirror>