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(a)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>