storage: allow interleave in pool XML

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>
This commit is contained in:
Eric Blake 2013-10-15 16:59:48 -06:00
parent 59dce8d278
commit caf516db51
3 changed files with 211 additions and 163 deletions

View File

@ -29,192 +29,224 @@
<attribute name='type'> <attribute name='type'>
<value>dir</value> <value>dir</value>
</attribute> </attribute>
<ref name='commonmetadata'/> <interleave>
<ref name='sizing'/> <ref name='commonmetadata'/>
<ref name='sourcedir'/> <ref name='sizing'/>
<ref name='target'/> <ref name='sourcedir'/>
<ref name='target'/>
</interleave>
</define> </define>
<define name='poolfs'> <define name='poolfs'>
<attribute name='type'> <attribute name='type'>
<value>fs</value> <value>fs</value>
</attribute> </attribute>
<ref name='commonmetadata'/> <interleave>
<ref name='sizing'/> <ref name='commonmetadata'/>
<ref name='sourcefs'/> <ref name='sizing'/>
<ref name='target'/> <ref name='sourcefs'/>
<ref name='target'/>
</interleave>
</define> </define>
<define name='poolnetfs'> <define name='poolnetfs'>
<attribute name='type'> <attribute name='type'>
<value>netfs</value> <value>netfs</value>
</attribute> </attribute>
<ref name='commonmetadata'/> <interleave>
<ref name='sizing'/> <ref name='commonmetadata'/>
<ref name='sourcenetfs'/> <ref name='sizing'/>
<ref name='target'/> <ref name='sourcenetfs'/>
<ref name='target'/>
</interleave>
</define> </define>
<define name='poollogical'> <define name='poollogical'>
<attribute name='type'> <attribute name='type'>
<value>logical</value> <value>logical</value>
</attribute> </attribute>
<ref name='commonmetadata'/> <interleave>
<ref name='sizing'/> <ref name='commonmetadata'/>
<ref name='sourcelogical'/> <ref name='sizing'/>
<ref name='targetlogical'/> <ref name='sourcelogical'/>
<ref name='targetlogical'/>
</interleave>
</define> </define>
<define name='pooldisk'> <define name='pooldisk'>
<attribute name='type'> <attribute name='type'>
<value>disk</value> <value>disk</value>
</attribute> </attribute>
<ref name='commonmetadata'/> <interleave>
<ref name='sizing'/> <ref name='commonmetadata'/>
<ref name='sourcedisk'/> <ref name='sizing'/>
<ref name='target'/> <ref name='sourcedisk'/>
<ref name='target'/>
</interleave>
</define> </define>
<define name='pooliscsi'> <define name='pooliscsi'>
<attribute name='type'> <attribute name='type'>
<value>iscsi</value> <value>iscsi</value>
</attribute> </attribute>
<ref name='commonmetadata'/> <interleave>
<ref name='sizing'/> <ref name='commonmetadata'/>
<ref name='sourceiscsi'/> <ref name='sizing'/>
<ref name='target'/> <ref name='sourceiscsi'/>
<ref name='target'/>
</interleave>
</define> </define>
<define name='poolscsi'> <define name='poolscsi'>
<attribute name='type'> <attribute name='type'>
<value>scsi</value> <value>scsi</value>
</attribute> </attribute>
<ref name='commonmetadata'/> <interleave>
<ref name='sizing'/> <ref name='commonmetadata'/>
<ref name='sourcescsi'/> <ref name='sizing'/>
<ref name='target'/> <ref name='sourcescsi'/>
<ref name='target'/>
</interleave>
</define> </define>
<define name='poolmpath'> <define name='poolmpath'>
<attribute name='type'> <attribute name='type'>
<value>mpath</value> <value>mpath</value>
</attribute> </attribute>
<ref name='commonmetadata'/> <interleave>
<ref name='sizing'/> <ref name='commonmetadata'/>
<optional> <ref name='sizing'/>
<ref name='sourcempath'/> <optional>
</optional> <ref name='sourcempath'/>
<ref name='target'/> </optional>
<ref name='target'/>
</interleave>
</define> </define>
<define name='poolrbd'> <define name='poolrbd'>
<attribute name='type'> <attribute name='type'>
<value>rbd</value> <value>rbd</value>
</attribute> </attribute>
<ref name='commonmetadata'/> <interleave>
<ref name='sizing'/> <ref name='commonmetadata'/>
<ref name='sourcerbd'/> <ref name='sizing'/>
<ref name='sourcerbd'/>
</interleave>
</define> </define>
<define name='poolsheepdog'> <define name='poolsheepdog'>
<attribute name='type'> <attribute name='type'>
<value>sheepdog</value> <value>sheepdog</value>
</attribute> </attribute>
<ref name='commonmetadata'/> <interleave>
<ref name='sizing'/> <ref name='commonmetadata'/>
<ref name='sourcesheepdog'/> <ref name='sizing'/>
<ref name='sourcesheepdog'/>
</interleave>
</define> </define>
<define name='sourceinfovendor'> <define name='sourceinfovendor'>
<optional> <interleave>
<element name='vendor'> <optional>
<attribute name='name'> <element name='vendor'>
<text/> <attribute name='name'>
</attribute> <text/>
</element> </attribute>
</optional> </element>
<optional> </optional>
<element name='product'> <optional>
<attribute name='name'> <element name='product'>
<text/> <attribute name='name'>
</attribute> <text/>
</element> </attribute>
</optional> </element>
</optional>
</interleave>
</define> </define>
<define name='commonmetadata'> <define name='commonmetadata'>
<element name='name'> <interleave>
<ref name='genericName'/> <element name='name'>
</element> <ref name='genericName'/>
<optional>
<element name='uuid'>
<ref name='UUID'/>
</element> </element>
</optional> <optional>
<element name='uuid'>
<ref name='UUID'/>
</element>
</optional>
</interleave>
</define> </define>
<define name='sizing'> <define name='sizing'>
<optional> <interleave>
<element name='capacity'> <optional>
<ref name='scaledInteger'/> <element name='capacity'>
</element> <ref name='scaledInteger'/>
</optional> </element>
<optional> </optional>
<element name='allocation'> <optional>
<ref name='scaledInteger'/> <element name='allocation'>
</element> <ref name='scaledInteger'/>
</optional> </element>
<optional> </optional>
<element name='available'> <optional>
<ref name='scaledInteger'/> <element name='available'>
</element> <ref name='scaledInteger'/>
</optional> </element>
</optional>
</interleave>
</define> </define>
<define name='permissions'> <define name='permissions'>
<optional> <optional>
<element name='permissions'> <element name='permissions'>
<element name='mode'> <interleave>
<ref name='octalMode'/> <element name='mode'>
</element> <ref name='octalMode'/>
<element name='owner'> </element>
<choice> <element name='owner'>
<ref name='unsignedInt'/> <choice>
<value>-1</value> <ref name='unsignedInt'/>
</choice> <value>-1</value>
</element> </choice>
<element name='group'> </element>
<choice> <element name='group'>
<ref name='unsignedInt'/> <choice>
<value>-1</value> <ref name='unsignedInt'/>
</choice> <value>-1</value>
</element> </choice>
<optional> </element>
<element name='label'> <optional>
<text/> <element name='label'>
</element> <text/>
</optional> </element>
</optional>
</interleave>
</element> </element>
</optional> </optional>
</define> </define>
<define name='target'> <define name='target'>
<element name='target'> <element name='target'>
<element name='path'> <interleave>
<ref name='absFilePath'/> <element name='path'>
</element> <ref name='absFilePath'/>
<ref name='permissions'/> </element>
<ref name='permissions'/>
</interleave>
</element> </element>
</define> </define>
<define name='targetlogical'> <define name='targetlogical'>
<element name='target'> <element name='target'>
<optional> <interleave>
<element name='path'> <optional>
<ref name='absFilePath'/> <element name='path'>
</element> <ref name='absFilePath'/>
</optional> </element>
<ref name='permissions'/> </optional>
<ref name='permissions'/>
</interleave>
</element> </element>
</define> </define>
@ -413,74 +445,86 @@
<define name='sourcefs'> <define name='sourcefs'>
<element name='source'> <element name='source'>
<ref name='sourceinfodev'/> <interleave>
<ref name='sourcefmtfs'/> <ref name='sourceinfodev'/>
<optional> <ref name='sourcefmtfs'/>
<ref name='sourceinfovendor'/> <optional>
</optional> <ref name='sourceinfovendor'/>
</optional>
</interleave>
</element> </element>
</define> </define>
<define name='sourcenetfs'> <define name='sourcenetfs'>
<element name='source'> <element name='source'>
<ref name='sourceinfohost'/> <interleave>
<ref name='sourceinfodir'/> <ref name='sourceinfohost'/>
<ref name='sourcefmtnetfs'/> <ref name='sourceinfodir'/>
<optional> <ref name='sourcefmtnetfs'/>
<ref name='sourceinfovendor'/> <optional>
</optional> <ref name='sourceinfovendor'/>
</optional>
</interleave>
</element> </element>
</define> </define>
<define name='sourcelogical'> <define name='sourcelogical'>
<element name='source'> <element name='source'>
<oneOrMore> <interleave>
<oneOrMore>
<optional>
<ref name='sourceinfoname'/>
</optional>
<optional>
<ref name='sourceinfodev'/>
</optional>
</oneOrMore>
<ref name='sourcefmtlogical'/>
<optional> <optional>
<ref name='sourceinfoname'/> <ref name='sourceinfovendor'/>
</optional> </optional>
<optional> </interleave>
<ref name='sourceinfodev'/>
</optional>
</oneOrMore>
<ref name='sourcefmtlogical'/>
<optional>
<ref name='sourceinfovendor'/>
</optional>
</element> </element>
</define> </define>
<define name='sourcedisk'> <define name='sourcedisk'>
<element name='source'> <element name='source'>
<ref name='sourceinfodev'/> <interleave>
<ref name='sourcefmtdisk'/> <ref name='sourceinfodev'/>
<optional> <ref name='sourcefmtdisk'/>
<ref name='sourceinfovendor'/> <optional>
</optional> <ref name='sourceinfovendor'/>
</optional>
</interleave>
</element> </element>
</define> </define>
<define name='sourceiscsi'> <define name='sourceiscsi'>
<element name='source'> <element name='source'>
<ref name='sourceinfohost'/> <interleave>
<ref name='sourceinfodev'/> <ref name='sourceinfohost'/>
<optional> <ref name='sourceinfodev'/>
<ref name='initiatorinfo'/> <optional>
</optional> <ref name='initiatorinfo'/>
<optional> </optional>
<ref name='sourceinfoauth'/> <optional>
</optional> <ref name='sourceinfoauth'/>
<optional> </optional>
<ref name='sourceinfovendor'/> <optional>
</optional> <ref name='sourceinfovendor'/>
</optional>
</interleave>
</element> </element>
</define> </define>
<define name='sourcescsi'> <define name='sourcescsi'>
<element name='source'> <element name='source'>
<ref name='sourceinfoadapter'/> <interleave>
<optional> <ref name='sourceinfoadapter'/>
<ref name='sourceinfovendor'/> <optional>
</optional> <ref name='sourceinfovendor'/>
</optional>
</interleave>
</element> </element>
</define> </define>
@ -492,18 +536,22 @@
<define name='sourcerbd'> <define name='sourcerbd'>
<element name='source'> <element name='source'>
<ref name='sourceinfoname'/> <interleave>
<ref name='sourceinfohost'/> <ref name='sourceinfoname'/>
<optional> <ref name='sourceinfohost'/>
<ref name='sourceinfoauth'/> <optional>
</optional> <ref name='sourceinfoauth'/>
</optional>
</interleave>
</element> </element>
</define> </define>
<define name='sourcesheepdog'> <define name='sourcesheepdog'>
<element name='source'> <element name='source'>
<ref name='sourceinfohost'/> <interleave>
<ref name='sourceinfoname'/> <ref name='sourceinfohost'/>
<ref name='sourceinfoname'/>
</interleave>
</element> </element>
</define> </define>

View File

@ -1,19 +1,19 @@
<pool type='iscsi'> <pool type='iscsi'>
<name>virtimages</name>
<uuid>e9392370-2917-565e-692b-d057f46512d6</uuid>
<source> <source>
<host name="iscsi.example.com"/>
<device path="demo-target"/>
<auth type='chap' username='admin'> <auth type='chap' username='admin'>
<secret uuid='2ec115d7-3a88-3ceb-bc12-0ac909a6fd87'/> <secret uuid='2ec115d7-3a88-3ceb-bc12-0ac909a6fd87'/>
</auth> </auth>
<device path="demo-target"/>
<host name="iscsi.example.com"/>
</source> </source>
<uuid>e9392370-2917-565e-692b-d057f46512d6</uuid>
<target> <target>
<path>/dev/disk/by-path</path>
<permissions> <permissions>
<mode>0700</mode>
<owner>0</owner> <owner>0</owner>
<mode>0700</mode>
<group>0</group> <group>0</group>
</permissions> </permissions>
<path>/dev/disk/by-path</path>
</target> </target>
<name>virtimages</name>
</pool> </pool>

View File

@ -1,8 +1,8 @@
<pool type='sheepdog'> <pool type='sheepdog'>
<name>sheepdog</name>
<uuid>65fcba04-5b13-bd93-cff3-52ce48e11ad7</uuid>
<source> <source>
<host name='localhost' port='7000'/>
<name>sheepdog</name> <name>sheepdog</name>
<host name='localhost' port='7000'/>
</source> </source>
<uuid>65fcba04-5b13-bd93-cff3-52ce48e11ad7</uuid>
<name>sheepdog</name>
</pool> </pool>