]> xenbits.xensource.com Git - libvirt.git/commitdiff
conf: Allow formatting and parsing of 'index' for disk source image
authorPeter Krempa <pkrempa@redhat.com>
Tue, 19 Jun 2018 11:03:30 +0000 (13:03 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Tue, 21 Aug 2018 13:46:06 +0000 (15:46 +0200)
Similarly to backing store indexes which will become stable eventually
we need also to be able to format and store in the status XML for later
use the index for the top level of the backing chain.

Add XML formatter, parser, schema and docs.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
docs/formatdomain.html.in
docs/schemas/domaincommon.rng
src/conf/domain_conf.c
tests/qemuxml2argvdata/disk-backing-chains-index.xml
tests/qemuxml2xmloutdata/disk-backing-chains-index-active.xml

index e68223329c927bfbe4c6ac82661821346572cf4f..0cbf570a138a3c31630d771deefaf389c5237616 100644 (file)
         is only valid when the specified storage volume is of 'file' or
         'block' type).
         <p>
+        The <code>source</code> element may also have the <code>index</code>
+        attribute with same semantics the <a href='#elementsDiskBackingStoreIndex'>
+        <code>index</code></a> attribute of <code>backingStore</code>
+        </p>
+        <p>
         The <code>source</code> element may contain the following sub elements:
         </p>
 
             by the backing store, see disk type attribute above for more
             details and possible values.
           </dd>
-          <dt><code>index</code></dt>
+          <dt><code><a id="elementsDiskBackingStoreIndex">index</a></code></dt>
           <dd>
             This attribute is only valid in output (and ignored on input) and
             it can be used to refer to a specific part of the disk chain when
index 385fa8666ce73637baf1af3cdb3cb87e5539d51e..f176538195c98e1b04f0cad45ffae5f28595622f 100644 (file)
     </optional>
   </define>
 
+  <define name="diskSourceCommon">
+    <optional>
+      <attribute name="index">
+        <ref name="positiveInteger"/>
+      </attribute>
+    </optional>
+  </define>
+
   <define name="diskSource">
     <choice>
       <ref name="diskSourceFile"/>
             <ref name="absFilePath"/>
           </attribute>
         </optional>
+        <ref name="diskSourceCommon"/>
         <optional>
           <ref name="storageStartupPolicy"/>
         </optional>
             <ref name="absFilePath"/>
           </attribute>
         </optional>
+        <ref name="diskSourceCommon"/>
         <optional>
           <ref name="storageStartupPolicy"/>
         </optional>
         <attribute name="dir">
           <ref name="absFilePath"/>
         </attribute>
+        <ref name="diskSourceCommon"/>
         <optional>
           <ref name="storageStartupPolicy"/>
         </optional>
         <attribute name="protocol">
           <value>rbd</value>
         </attribute>
+        <ref name="diskSourceCommon"/>
         <optional>
           <attribute name="name"/>
         </optional>
         <value>iscsi</value>
       </attribute>
       <attribute name="name"/>
+      <ref name="diskSourceCommon"/>
       <ref name="diskSourceNetworkHost"/>
       <optional>
         <ref name="diskAuth"/>
         </choice>
       </attribute>
       <attribute name="name"/>
+      <ref name="diskSourceCommon"/>
       <ref name="diskSourceNetworkHost"/>
       <optional>
         <ref name="encryption"/>
         </choice>
       </attribute>
       <attribute name="name"/>
+      <ref name="diskSourceCommon"/>
       <ref name="diskSourceNetworkHost"/>
       <optional>
         <ref name="encryption"/>
           <ref name="virYesNo"/>
         </attribute>
       </optional>
+      <ref name="diskSourceCommon"/>
       <ref name="diskSourceNetworkHost"/>
       <optional>
         <ref name="encryption"/>
         <value>gluster</value>
       </attribute>
       <attribute name="name"/>
+      <ref name="diskSourceCommon"/>
       <oneOrMore>
         <ref name="diskSourceNetworkHost"/>
       </oneOrMore>
         </choice>
       </attribute>
       <attribute name="name"/>
+      <ref name="diskSourceCommon"/>
       <optional>
         <attribute name="tls">
           <ref name="virYesNo"/>
             </choice>
           </attribute>
         </optional>
+        <ref name="diskSourceCommon"/>
         <optional>
           <ref name="storageStartupPolicy"/>
         </optional>
index 6b43c78ca4556a91273ca68ca6652d0f9fa19228..bde9fef9148237a8aa89bc892bfd18ad6faba9b5 100644 (file)
@@ -9811,6 +9811,13 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt,
 
             startupPolicy = virXMLPropString(cur, "startupPolicy");
 
+            if (!(flags & VIR_DOMAIN_DEF_PARSE_INACTIVE) &&
+                (tmp = virXMLPropString(cur, "index")) &&
+                virStrToLong_uip(tmp, NULL, 10, &def->src->id) < 0) {
+                virReportError(VIR_ERR_XML_ERROR, _("invalid disk index '%s'"), tmp);
+                goto error;
+            }
+            VIR_FREE(tmp);
         } else if (!target &&
                    virXMLNodeNameEqual(cur, "target")) {
             target = virXMLPropString(cur, "dev");
@@ -23979,6 +23986,7 @@ virDomainDiskSourceFormatInternal(virBufferPtr buf,
                                   int policy,
                                   unsigned int flags,
                                   bool skipSeclabels,
+                                  bool attrIndex,
                                   virDomainXMLOptionPtr xmlopt)
 {
     virBuffer attrBuf = VIR_BUFFER_INITIALIZER;
@@ -23995,6 +24003,9 @@ virDomainDiskSourceFormatInternal(virBufferPtr buf,
         virBufferEscapeString(&attrBuf, " startupPolicy='%s'",
                               virDomainStartupPolicyTypeToString(policy));
 
+    if (attrIndex && src->id != 0)
+        virBufferAsprintf(&attrBuf, " index='%u'", src->id);
+
     if (virDomainDiskSourceFormatPrivateData(&childBuf, src, flags, xmlopt) < 0)
         goto cleanup;
 
@@ -24017,7 +24028,8 @@ virDomainDiskSourceFormat(virBufferPtr buf,
                           unsigned int flags,
                           virDomainXMLOptionPtr xmlopt)
 {
-    return virDomainDiskSourceFormatInternal(buf, src, policy, flags, false, xmlopt);
+    return virDomainDiskSourceFormatInternal(buf, src, policy, flags, false,
+                                             false, xmlopt);
 }
 
 
@@ -24059,7 +24071,8 @@ virDomainDiskBackingStoreFormat(virBufferPtr buf,
 
     virBufferAsprintf(buf, "<format type='%s'/>\n", format);
     /* We currently don't output seclabels for backing chain element */
-    if (virDomainDiskSourceFormatInternal(buf, backingStore, 0, flags, true, xmlopt) < 0 ||
+    if (virDomainDiskSourceFormatInternal(buf, backingStore, 0, flags, true,
+                                          false, xmlopt) < 0 ||
         virDomainDiskBackingStoreFormat(buf, backingStore->backingStore,
                                         xmlopt, flags) < 0)
         return -1;
@@ -24325,8 +24338,8 @@ virDomainDiskDefFormat(virBufferPtr buf,
     if (def->src->auth && !def->src->authInherited)
         virStorageAuthDefFormat(buf, def->src->auth);
 
-    if (virDomainDiskSourceFormat(buf, def->src, def->startupPolicy,
-                                  flags, xmlopt) < 0)
+    if (virDomainDiskSourceFormatInternal(buf, def->src, def->startupPolicy,
+                                          flags, false, true, xmlopt) < 0)
         return -1;
 
     /* Don't format backingStore to inactive XMLs until the code for
index 95b8a64cf8aff71471b5807e9728d8ada82cec15..5e0a03fbc4b02efef76d52fb4757de01299bf78e 100644 (file)
@@ -16,7 +16,7 @@
     <emulator>/usr/bin/qemu-system-i686</emulator>
     <disk type='network' device='disk'>
       <driver name='qemu' type='qcow2'/>
-      <source protocol='gluster' name='Volume2/Image'>
+      <source protocol='gluster' name='Volume2/Image' index='2'>
         <host transport='unix' socket='/path/to/sock'/>
       </source>
       <backingStore type='file' index='1'>
@@ -27,7 +27,7 @@
     </disk>
     <disk type='network' device='disk'>
       <driver name='qemu' type='qcow2'/>
-      <source protocol='nbd' name='bar'>
+      <source protocol='nbd' name='bar' index='9'>
         <host transport='unix' socket='/var/run/nbdsock'/>
       </source>
       <backingStore type='block' index='8'>
@@ -61,7 +61,7 @@
     <disk type='network' device='disk'>
       <driver name='qemu' type='raw'/>
       <backingStore/>
-      <source protocol='gluster' name='Volume1/Image'>
+      <source protocol='gluster' name='Volume1/Image' index='10'>
         <host name='example.org' port='6000'/>
       </source>
       <target dev='vdc' bus='virtio'/>
@@ -71,7 +71,7 @@
       <auth username='myname'>
         <secret type='ceph' usage='mycluster_myname'/>
       </auth>
-      <source protocol='rbd' name='pool/image'>
+      <source protocol='rbd' name='pool/image' index='12'>
         <host name='mon1.example.org' port='6321'/>
         <host name='mon2.example.org' port='6322'/>
         <host name='mon3.example.org' port='6322'/>
     </disk>
     <disk type='block' device='disk'>
       <driver name='qemu' type='qcow2'/>
-      <source dev='/dev/HostVG/QEMUGuest11'/>
+      <source dev='/dev/HostVG/QEMUGuest11' index='13'/>
       <target dev='vde' bus='virtio'/>
     </disk>
     <disk type='file' device='disk'>
       <driver name='qemu' type='qcow2'/>
-      <source file='/var/lib/libvirt/images/rhel7.1484071880'/>
+      <source file='/var/lib/libvirt/images/rhel7.1484071880' index='25'/>
       <backingStore type='file' index='24'>
         <format type='qcow2'/>
         <source file='/var/lib/libvirt/images/rhel7.1484071877'/>
index 724afa4e8311919c7b00474f29408f437ff283a3..2b5bc9e1b41876bc184ca16d967eafeab709505f 100644 (file)
@@ -16,7 +16,7 @@
     <emulator>/usr/bin/qemu-system-i686</emulator>
     <disk type='network' device='disk'>
       <driver name='qemu' type='qcow2'/>
-      <source protocol='gluster' name='Volume2/Image'>
+      <source protocol='gluster' name='Volume2/Image' index='2'>
         <host transport='unix' socket='/path/to/sock'/>
       </source>
       <backingStore type='file' index='1'>
@@ -28,7 +28,7 @@
     </disk>
     <disk type='network' device='disk'>
       <driver name='qemu' type='qcow2'/>
-      <source protocol='nbd' name='bar'>
+      <source protocol='nbd' name='bar' index='9'>
         <host transport='unix' socket='/var/run/nbdsock'/>
       </source>
       <backingStore type='block' index='8'>
@@ -61,7 +61,7 @@
     </disk>
     <disk type='network' device='disk'>
       <driver name='qemu' type='raw'/>
-      <source protocol='gluster' name='Volume1/Image'>
+      <source protocol='gluster' name='Volume1/Image' index='10'>
         <host name='example.org' port='6000'/>
       </source>
       <backingStore/>
@@ -73,7 +73,7 @@
       <auth username='myname'>
         <secret type='ceph' usage='mycluster_myname'/>
       </auth>
-      <source protocol='rbd' name='pool/image'>
+      <source protocol='rbd' name='pool/image' index='12'>
         <host name='mon1.example.org' port='6321'/>
         <host name='mon2.example.org' port='6322'/>
         <host name='mon3.example.org' port='6322'/>
     </disk>
     <disk type='block' device='disk'>
       <driver name='qemu' type='qcow2'/>
-      <source dev='/dev/HostVG/QEMUGuest11'/>
+      <source dev='/dev/HostVG/QEMUGuest11' index='13'/>
       <target dev='vde' bus='virtio'/>
       <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
     </disk>
     <disk type='file' device='disk'>
       <driver name='qemu' type='qcow2'/>
-      <source file='/var/lib/libvirt/images/rhel7.1484071880'/>
+      <source file='/var/lib/libvirt/images/rhel7.1484071880' index='25'/>
       <backingStore type='file' index='24'>
         <format type='qcow2'/>
         <source file='/var/lib/libvirt/images/rhel7.1484071877'/>