From 8845a0d5d365cc8c87c2fdb577f5f15f738c74e7 Mon Sep 17 00:00:00 2001
Message-Id: <8845a0d5d365cc8c87c2fdb577f5f15f738c74e7@dist-git>
From: Eric Blake <eblake@redhat.com>
Date: Wed, 26 Feb 2014 14:54:39 +0100
Subject: [PATCH] storage: allow interleave in pool XML
https://bugzilla.redhat.com/show_bug.cgi?id=1032370
The RNG grammar did not allow arbitrary interleaving, which makes
it harder than necessary to create a new pool from handwritten XML.
* docs/schemas/storagepool.rng: Allow interleaving.
* tests/storagepoolxml2xmlin/pool-sheepdog.xml: Test interleave.
* tests/storagepoolxml2xmlin/pool-iscsi-auth.xml: Likewise.
Signed-off-by: Eric Blake <eblake@redhat.com>
(cherry picked from commit caf516db518ce01b97314932929fbe34deafac78)
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
---
docs/schemas/storagepool.rng | 356 ++++++++++++++-----------
tests/storagepoolxml2xmlin/pool-iscsi-auth.xml | 12 +-
tests/storagepoolxml2xmlin/pool-sheepdog.xml | 6 +-
3 files changed, 211 insertions(+), 163 deletions(-)
diff --git a/docs/schemas/storagepool.rng b/docs/schemas/storagepool.rng
index d1e8f36..8d7a94d 100644
--- a/docs/schemas/storagepool.rng
+++ b/docs/schemas/storagepool.rng
@@ -30,100 +30,120 @@
<attribute name='type'>
<value>dir</value>
</attribute>
- <ref name='commonmetadata'/>
- <ref name='sizing'/>
- <ref name='sourcedir'/>
- <ref name='target'/>
+ <interleave>
+ <ref name='commonmetadata'/>
+ <ref name='sizing'/>
+ <ref name='sourcedir'/>
+ <ref name='target'/>
+ </interleave>
</define>
<define name='poolfs'>
<attribute name='type'>
<value>fs</value>
</attribute>
- <ref name='commonmetadata'/>
- <ref name='sizing'/>
- <ref name='sourcefs'/>
- <ref name='target'/>
+ <interleave>
+ <ref name='commonmetadata'/>
+ <ref name='sizing'/>
+ <ref name='sourcefs'/>
+ <ref name='target'/>
+ </interleave>
</define>
<define name='poolnetfs'>
<attribute name='type'>
<value>netfs</value>
</attribute>
- <ref name='commonmetadata'/>
- <ref name='sizing'/>
- <ref name='sourcenetfs'/>
- <ref name='target'/>
+ <interleave>
+ <ref name='commonmetadata'/>
+ <ref name='sizing'/>
+ <ref name='sourcenetfs'/>
+ <ref name='target'/>
+ </interleave>
</define>
<define name='poollogical'>
<attribute name='type'>
<value>logical</value>
</attribute>
- <ref name='commonmetadata'/>
- <ref name='sizing'/>
- <ref name='sourcelogical'/>
- <ref name='targetlogical'/>
+ <interleave>
+ <ref name='commonmetadata'/>
+ <ref name='sizing'/>
+ <ref name='sourcelogical'/>
+ <ref name='targetlogical'/>
+ </interleave>
</define>
<define name='pooldisk'>
<attribute name='type'>
<value>disk</value>
</attribute>
- <ref name='commonmetadata'/>
- <ref name='sizing'/>
- <ref name='sourcedisk'/>
- <ref name='target'/>
+ <interleave>
+ <ref name='commonmetadata'/>
+ <ref name='sizing'/>
+ <ref name='sourcedisk'/>
+ <ref name='target'/>
+ </interleave>
</define>
<define name='pooliscsi'>
<attribute name='type'>
<value>iscsi</value>
</attribute>
- <ref name='commonmetadata'/>
- <ref name='sizing'/>
- <ref name='sourceiscsi'/>
- <ref name='target'/>
+ <interleave>
+ <ref name='commonmetadata'/>
+ <ref name='sizing'/>
+ <ref name='sourceiscsi'/>
+ <ref name='target'/>
+ </interleave>
</define>
<define name='poolscsi'>
<attribute name='type'>
<value>scsi</value>
</attribute>
- <ref name='commonmetadata'/>
- <ref name='sizing'/>
- <ref name='sourcescsi'/>
- <ref name='target'/>
+ <interleave>
+ <ref name='commonmetadata'/>
+ <ref name='sizing'/>
+ <ref name='sourcescsi'/>
+ <ref name='target'/>
+ </interleave>
</define>
<define name='poolmpath'>
<attribute name='type'>
<value>mpath</value>
</attribute>
- <ref name='commonmetadata'/>
- <ref name='sizing'/>
- <optional>
- <ref name='sourcempath'/>
- </optional>
- <ref name='target'/>
+ <interleave>
+ <ref name='commonmetadata'/>
+ <ref name='sizing'/>
+ <optional>
+ <ref name='sourcempath'/>
+ </optional>
+ <ref name='target'/>
+ </interleave>
</define>
<define name='poolrbd'>
<attribute name='type'>
<value>rbd</value>
</attribute>
- <ref name='commonmetadata'/>
- <ref name='sizing'/>
- <ref name='sourcerbd'/>
+ <interleave>
+ <ref name='commonmetadata'/>
+ <ref name='sizing'/>
+ <ref name='sourcerbd'/>
+ </interleave>
</define>
<define name='poolsheepdog'>
<attribute name='type'>
<value>sheepdog</value>
</attribute>
- <ref name='commonmetadata'/>
- <ref name='sizing'/>
- <ref name='sourcesheepdog'/>
+ <interleave>
+ <ref name='commonmetadata'/>
+ <ref name='sizing'/>
+ <ref name='sourcesheepdog'/>
+ </interleave>
</define>
<define name='poolgluster'>
@@ -138,95 +158,107 @@
</define>
<define name='sourceinfovendor'>
- <optional>
- <element name='vendor'>
- <attribute name='name'>
- <text/>
- </attribute>
- </element>
- </optional>
- <optional>
- <element name='product'>
- <attribute name='name'>
- <text/>
- </attribute>
- </element>
- </optional>
+ <interleave>
+ <optional>
+ <element name='vendor'>
+ <attribute name='name'>
+ <text/>
+ </attribute>
+ </element>
+ </optional>
+ <optional>
+ <element name='product'>
+ <attribute name='name'>
+ <text/>
+ </attribute>
+ </element>
+ </optional>
+ </interleave>
</define>
<define name='commonmetadata'>
- <element name='name'>
- <ref name='genericName'/>
- </element>
- <optional>
- <element name='uuid'>
- <ref name='UUID'/>
+ <interleave>
+ <element name='name'>
+ <ref name='genericName'/>
</element>
- </optional>
+ <optional>
+ <element name='uuid'>
+ <ref name='UUID'/>
+ </element>
+ </optional>
+ </interleave>
</define>
<define name='sizing'>
- <optional>
- <element name='capacity'>
- <ref name='scaledInteger'/>
- </element>
- </optional>
- <optional>
- <element name='allocation'>
- <ref name='scaledInteger'/>
- </element>
- </optional>
- <optional>
- <element name='available'>
- <ref name='scaledInteger'/>
- </element>
- </optional>
+ <interleave>
+ <optional>
+ <element name='capacity'>
+ <ref name='scaledInteger'/>
+ </element>
+ </optional>
+ <optional>
+ <element name='allocation'>
+ <ref name='scaledInteger'/>
+ </element>
+ </optional>
+ <optional>
+ <element name='available'>
+ <ref name='scaledInteger'/>
+ </element>
+ </optional>
+ </interleave>
</define>
<define name='permissions'>
<optional>
<element name='permissions'>
- <element name='mode'>
- <ref name='octalMode'/>
- </element>
- <element name='owner'>
- <choice>
- <ref name='unsignedInt'/>
- <value>-1</value>
- </choice>
- </element>
- <element name='group'>
- <choice>
- <ref name='unsignedInt'/>
- <value>-1</value>
- </choice>
- </element>
- <optional>
- <element name='label'>
- <text/>
- </element>
- </optional>
+ <interleave>
+ <element name='mode'>
+ <ref name='octalMode'/>
+ </element>
+ <element name='owner'>
+ <choice>
+ <ref name='unsignedInt'/>
+ <value>-1</value>
+ </choice>
+ </element>
+ <element name='group'>
+ <choice>
+ <ref name='unsignedInt'/>
+ <value>-1</value>
+ </choice>
+ </element>
+ <optional>
+ <element name='label'>
+ <text/>
+ </element>
+ </optional>
+ </interleave>
</element>
</optional>
</define>
<define name='target'>
<element name='target'>
- <element name='path'>
- <ref name='absFilePath'/>
- </element>
- <ref name='permissions'/>
+ <interleave>
+ <element name='path'>
+ <ref name='absFilePath'/>
+ </element>
+ <ref name='permissions'/>
+ </interleave>
</element>
</define>
<define name='targetlogical'>
<element name='target'>
- <optional>
- <element name='path'>
- <ref name='absFilePath'/>
- </element>
- </optional>
- <ref name='permissions'/>
+ <interleave>
+ <optional>
+ <element name='path'>
+ <ref name='absFilePath'/>
+ </element>
+ </optional>
+ <ref name='permissions'/>
+ </interleave>
</element>
</define>
@@ -424,74 +456,86 @@
<define name='sourcefs'>
<element name='source'>
- <ref name='sourceinfodev'/>
- <ref name='sourcefmtfs'/>
- <optional>
- <ref name='sourceinfovendor'/>
- </optional>
+ <interleave>
+ <ref name='sourceinfodev'/>
+ <ref name='sourcefmtfs'/>
+ <optional>
+ <ref name='sourceinfovendor'/>
+ </optional>
+ </interleave>
</element>
</define>
<define name='sourcenetfs'>
<element name='source'>
- <ref name='sourceinfohost'/>
- <ref name='sourceinfodir'/>
- <ref name='sourcefmtnetfs'/>
- <optional>
- <ref name='sourceinfovendor'/>
- </optional>
+ <interleave>
+ <ref name='sourceinfohost'/>
+ <ref name='sourceinfodir'/>
+ <ref name='sourcefmtnetfs'/>
+ <optional>
+ <ref name='sourceinfovendor'/>
+ </optional>
+ </interleave>
</element>
</define>
<define name='sourcelogical'>
<element name='source'>
- <oneOrMore>
- <optional>
- <ref name='sourceinfoname'/>
- </optional>
+ <interleave>
+ <oneOrMore>
+ <optional>
+ <ref name='sourceinfoname'/>
+ </optional>
+ <optional>
+ <ref name='sourceinfodev'/>
+ </optional>
+ </oneOrMore>
+ <ref name='sourcefmtlogical'/>
<optional>
- <ref name='sourceinfodev'/>
+ <ref name='sourceinfovendor'/>
</optional>
- </oneOrMore>
- <ref name='sourcefmtlogical'/>
- <optional>
- <ref name='sourceinfovendor'/>
- </optional>
+ </interleave>
</element>
</define>
<define name='sourcedisk'>
<element name='source'>
- <ref name='sourceinfodev'/>
- <ref name='sourcefmtdisk'/>
- <optional>
- <ref name='sourceinfovendor'/>
- </optional>
+ <interleave>
+ <ref name='sourceinfodev'/>
+ <ref name='sourcefmtdisk'/>
+ <optional>
+ <ref name='sourceinfovendor'/>
+ </optional>
+ </interleave>
</element>
</define>
<define name='sourceiscsi'>
<element name='source'>
- <ref name='sourceinfohost'/>
- <ref name='sourceinfodev'/>
- <optional>
- <ref name='initiatorinfo'/>
- </optional>
- <optional>
- <ref name='sourceinfoauth'/>
- </optional>
- <optional>
- <ref name='sourceinfovendor'/>
- </optional>
+ <interleave>
+ <ref name='sourceinfohost'/>
+ <ref name='sourceinfodev'/>
+ <optional>
+ <ref name='initiatorinfo'/>
+ </optional>
+ <optional>
+ <ref name='sourceinfoauth'/>
+ </optional>
+ <optional>
+ <ref name='sourceinfovendor'/>
+ </optional>
+ </interleave>
</element>
</define>
<define name='sourcescsi'>
<element name='source'>
- <ref name='sourceinfoadapter'/>
- <optional>
- <ref name='sourceinfovendor'/>
- </optional>
+ <interleave>
+ <ref name='sourceinfoadapter'/>
+ <optional>
+ <ref name='sourceinfovendor'/>
+ </optional>
+ </interleave>
</element>
</define>
@@ -503,18 +547,22 @@
<define name='sourcerbd'>
<element name='source'>
- <ref name='sourceinfoname'/>
- <ref name='sourceinfohost'/>
- <optional>
- <ref name='sourceinfoauth'/>
- </optional>
+ <interleave>
+ <ref name='sourceinfoname'/>
+ <ref name='sourceinfohost'/>
+ <optional>
+ <ref name='sourceinfoauth'/>
+ </optional>
+ </interleave>
</element>
</define>
<define name='sourcesheepdog'>
<element name='source'>
- <ref name='sourceinfohost'/>
- <ref name='sourceinfoname'/>
+ <interleave>
+ <ref name='sourceinfohost'/>
+ <ref name='sourceinfoname'/>
+ </interleave>
</element>
</define>
diff --git a/tests/storagepoolxml2xmlin/pool-iscsi-auth.xml b/tests/storagepoolxml2xmlin/pool-iscsi-auth.xml
index c81eb60..5e5d336 100644
--- a/tests/storagepoolxml2xmlin/pool-iscsi-auth.xml
+++ b/tests/storagepoolxml2xmlin/pool-iscsi-auth.xml
@@ -1,19 +1,19 @@
<pool type='iscsi'>
- <name>virtimages</name>
- <uuid>e9392370-2917-565e-692b-d057f46512d6</uuid>
<source>
- <host name="iscsi.example.com"/>
- <device path="demo-target"/>
<auth type='chap' username='admin'>
<secret uuid='2ec115d7-3a88-3ceb-bc12-0ac909a6fd87'/>
</auth>
+ <device path="demo-target"/>
+ <host name="iscsi.example.com"/>
</source>
+ <uuid>e9392370-2917-565e-692b-d057f46512d6</uuid>
<target>
- <path>/dev/disk/by-path</path>
<permissions>
- <mode>0700</mode>
<owner>0</owner>
+ <mode>0700</mode>
<group>0</group>
</permissions>
+ <path>/dev/disk/by-path</path>
</target>
+ <name>virtimages</name>
</pool>
diff --git a/tests/storagepoolxml2xmlin/pool-sheepdog.xml b/tests/storagepoolxml2xmlin/pool-sheepdog.xml
index 1287047..49b6baf 100644
--- a/tests/storagepoolxml2xmlin/pool-sheepdog.xml
+++ b/tests/storagepoolxml2xmlin/pool-sheepdog.xml
@@ -1,8 +1,8 @@
<pool type='sheepdog'>
- <name>sheepdog</name>
- <uuid>65fcba04-5b13-bd93-cff3-52ce48e11ad7</uuid>
<source>
- <host name='localhost' port='7000'/>
<name>sheepdog</name>
+ <host name='localhost' port='7000'/>
</source>
+ <uuid>65fcba04-5b13-bd93-cff3-52ce48e11ad7</uuid>
+ <name>sheepdog</name>
</pool>
--
1.9.0