[libvirt] [PATCHv2] storage: allow interleave in volume XML

Eric Blake eblake at redhat.com
Fri Nov 22 19:54:30 UTC 2013


The RNG grammar did not allow arbitrary interleaving, which makes
it harder than necessary to create a new volume from handwritten XML.
(Compare also to commit caf516db for pools).

* docs/schemas/storagevol.rng: Support interleaving.
* tests/storagevolxml2xmlin/vol-file-backing.xml: Test it.

Signed-off-by: Eric Blake <eblake at redhat.com>
---

v2: correct version (actually applies to libvirt.git, rather
than depending on unpublished intermediate commits)

reviewer's note: see bottom for easier-to-review schema change

 docs/schemas/storagevol.rng                    | 138 +++++++++++++------------
 tests/storagevolxml2xmlin/vol-file-backing.xml |  15 +--
 2 files changed, 82 insertions(+), 71 deletions(-)

diff --git a/docs/schemas/storagevol.rng b/docs/schemas/storagevol.rng
index 5da8e1f..e79bc35 100644
--- a/docs/schemas/storagevol.rng
+++ b/docs/schemas/storagevol.rng
@@ -13,55 +13,61 @@

   <define name='vol'>
     <element name='volume'>
-      <element name='name'>
-        <ref name='volName'/>
-      </element>
-      <optional>
-        <element name='key'>
-          <text/>
+      <interleave>
+        <element name='name'>
+          <ref name='volName'/>
         </element>
-      </optional>
-      <optional>
-        <ref name='source'/>
-      </optional>
-      <ref name='sizing'/>
-      <ref name='target'/>
-      <optional>
-        <ref name='backingStore'/>
-      </optional>
+        <optional>
+          <element name='key'>
+            <text/>
+          </element>
+        </optional>
+        <optional>
+          <ref name='source'/>
+        </optional>
+        <ref name='sizing'/>
+        <ref name='target'/>
+        <optional>
+          <ref name='backingStore'/>
+        </optional>
+      </interleave>
     </element>
   </define>

   <define name='sizing'>
-    <optional>
-      <element name='capacity'>
-        <ref name='scaledInteger'/>
-      </element>
-    </optional>
-    <optional>
-      <element name='allocation'>
-        <ref name='scaledInteger'/>
-      </element>
-    </optional>
+    <interleave>
+      <optional>
+        <element name='capacity'>
+          <ref name='scaledInteger'/>
+        </element>
+      </optional>
+      <optional>
+        <element name='allocation'>
+          <ref name='scaledInteger'/>
+        </element>
+      </optional>
+    </interleave>
   </define>

   <define name='permissions'>
     <optional>
       <element name='permissions'>
-        <element name='mode'>
-          <ref name='octalMode'/>
-        </element>
-        <element name='owner'>
-          <ref name='unsignedInt'/>
-        </element>
-        <element name='group'>
-          <ref name='unsignedInt'/>
-        </element>
-        <optional>
-          <element name='label'>
-            <text/>
-        </element>
-        </optional>
+        <interleave>
+          <element name='mode'>
+            <ref name='octalMode'/>
+          </element>
+          <element name='owner'>
+            <ref name='unsignedInt'/>
+          </element>
+          <element name='group'>
+            <ref name='unsignedInt'/>
+          </element>
+          <optional>
+            <element name='label'>
+              <text/>
+            </element>
+          </optional>
+        </interleave>
       </element>
     </optional>
   </define>
@@ -103,36 +109,40 @@

   <define name='target'>
     <element name='target'>
-      <optional>
-        <element name='path'>
-          <choice>
-            <data type='anyURI'/>
-            <ref name='absFilePath'/>
-          </choice>
-        </element>
-      </optional>
-      <ref name='format'/>
-      <ref name='permissions'/>
-      <ref name='timestamps'/>
-      <optional>
-        <ref name='encryption'/>
-      </optional>
-      <optional>
-        <ref name='compat'/>
-      </optional>
-      <optional>
-        <ref name='fileFormatFeatures'/>
-      </optional>
+      <interleave>
+        <optional>
+          <element name='path'>
+            <choice>
+              <data type='anyURI'/>
+              <ref name='absFilePath'/>
+            </choice>
+          </element>
+        </optional>
+        <ref name='format'/>
+        <ref name='permissions'/>
+        <ref name='timestamps'/>
+        <optional>
+          <ref name='encryption'/>
+        </optional>
+        <optional>
+          <ref name='compat'/>
+        </optional>
+        <optional>
+          <ref name='fileFormatFeatures'/>
+        </optional>
+      </interleave>
     </element>
   </define>

   <define name='backingStore'>
     <element name='backingStore'>
-      <element name='path'>
-        <ref name='absFilePath'/>
-      </element>
-      <ref name='format'/>
-      <ref name='permissions'/>
+      <interleave>
+        <element name='path'>
+          <ref name='absFilePath'/>
+        </element>
+        <ref name='format'/>
+        <ref name='permissions'/>
+      </interleave>
     </element>
   </define>

diff --git a/tests/storagevolxml2xmlin/vol-file-backing.xml b/tests/storagevolxml2xmlin/vol-file-backing.xml
index 73e7f28..8610ea4 100644
--- a/tests/storagevolxml2xmlin/vol-file-backing.xml
+++ b/tests/storagevolxml2xmlin/vol-file-backing.xml
@@ -1,25 +1,26 @@
 <volume>
-  <name>sparse.img</name>
+  <!-- lines scrambled to test interleaves -->
   <key>/var/lib/libvirt/images/sparse.img</key>
-  <source/>
   <capacity unit='GB'>10</capacity>
-  <allocation unit='MiB'>0</allocation>
+  <source/>
   <target>
-    <path>/var/lib/libvirt/images/sparse.img</path>
     <permissions>
-      <mode>0</mode>
       <owner>0744</owner>
+      <mode>0</mode>
       <group>0</group>
     </permissions>
+    <path>/var/lib/libvirt/images/sparse.img</path>
   </target>
+  <allocation unit='MiB'>0</allocation>
   <backingStore>
-    <path>/var/lib/virt/images/master.img</path>
     <format type='vmdk'/>
+    <path>/var/lib/virt/images/master.img</path>
     <permissions>
       <mode>0744</mode>
+      <label>virt_image_t</label>
       <owner>1</owner>
       <group>1</group>
-      <label>virt_image_t</label>
     </permissions>
   </backingStore>
+  <name>sparse.img</name>
 </volume>
-- 
1.8.3.1


As promised, the easier rng change view:

diff --git c/docs/schemas/storagevol.rng w/docs/schemas/storagevol.rng
index 5da8e1f..e79bc35 100644
--- c/docs/schemas/storagevol.rng
+++ w/docs/schemas/storagevol.rng
@@ -13,6 +13,7 @@

   <define name='vol'>
     <element name='volume'>
+      <interleave>
         <element name='name'>
           <ref name='volName'/>
         </element>
@@ -29,10 +30,12 @@
         <optional>
           <ref name='backingStore'/>
         </optional>
+      </interleave>
     </element>
   </define>

   <define name='sizing'>
+    <interleave>
       <optional>
         <element name='capacity'>
           <ref name='scaledInteger'/>
@@ -43,11 +46,13 @@
           <ref name='scaledInteger'/>
         </element>
       </optional>
+    </interleave>
   </define>

   <define name='permissions'>
     <optional>
       <element name='permissions'>
+        <interleave>
           <element name='mode'>
             <ref name='octalMode'/>
           </element>
@@ -62,6 +67,7 @@
               <text/>
             </element>
           </optional>
+        </interleave>
       </element>
     </optional>
   </define>
@@ -103,6 +109,7 @@

   <define name='target'>
     <element name='target'>
+      <interleave>
         <optional>
           <element name='path'>
             <choice>
@@ -123,16 +130,19 @@
         <optional>
           <ref name='fileFormatFeatures'/>
         </optional>
+      </interleave>
     </element>
   </define>

   <define name='backingStore'>
     <element name='backingStore'>
+      <interleave>
         <element name='path'>
           <ref name='absFilePath'/>
         </element>
         <ref name='format'/>
         <ref name='permissions'/>
+      </interleave>
     </element>
   </define>




More information about the libvir-list mailing list