libvirt/docs/schemas/storagepool.rng
John Ferlan 5d7659027f docs,rng: Adjust storage pool name grammar checks
https://bugzilla.redhat.com/show_bug.cgi?id=1475250

It's possible to define and start a pool with a '.' in the
name; however, when trying to add a volume to a domain using
the storage pool source with a '.' in the storage pool name,
the domain RNG validation fails because RNG uses 'genericName'
which does not allow a '.' in the name.

Domain XML def parsing has a virXMLValidateAgainstSchema which
generates the error. The Storage Pool XML def parsing has no
call to virXMLValidateAgainstSchema. The only Storage Pool name
validation occurs in virStoragePoolDefParseXML to ensure the
name doesn't have a '/' in it and in storagePoolDefineXML to
call virXMLCheckIllegalChars using the same parameter "\n" as
qemuDomainDefineXMLFlags would check after the RNG check
could be succesful.

In order to resolve this, create a poolName definition in
storagecommon.rng that will mimic the domain name regex that
disallows a newline character, but add the "/" in the exclude
list. Then modify the pool and volume source name definitions
to key off that poolName.
2017-10-05 08:10:46 -04:00

655 lines
15 KiB
XML

<?xml version="1.0"?>
<!-- A Relax NG schema for the libvirt storage pool XML format -->
<grammar xmlns="http://relaxng.org/ns/structure/1.0"
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
<include href='basictypes.rng'/>
<include href='storagecommon.rng'/>
<start>
<ref name='pool'/>
</start>
<define name='pool'>
<element name='pool'>
<choice>
<ref name='pooldir'/>
<ref name='poolfs'/>
<ref name='poolnetfs'/>
<ref name='poollogical'/>
<ref name='pooldisk'/>
<ref name='pooliscsi'/>
<ref name='poolscsi'/>
<ref name='poolmpath'/>
<ref name='poolrbd'/>
<ref name='poolsheepdog'/>
<ref name='poolgluster'/>
<ref name='poolzfs'/>
<ref name='poolvstorage'/>
</choice>
</element>
</define>
<define name='pooldir'>
<attribute name='type'>
<value>dir</value>
</attribute>
<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>
<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>
<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>
<interleave>
<ref name='commonMetadataNameOptional'/>
<ref name='sizing'/>
<ref name='sourcelogical'/>
<ref name='targetlogical'/>
</interleave>
</define>
<define name='pooldisk'>
<attribute name='type'>
<value>disk</value>
</attribute>
<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>
<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>
<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>
<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>
<interleave>
<ref name='commonMetadataNameOptional'/>
<ref name='sizing'/>
<ref name='sourcerbd'/>
</interleave>
</define>
<define name='poolsheepdog'>
<attribute name='type'>
<value>sheepdog</value>
</attribute>
<interleave>
<ref name='commonMetadataNameOptional'/>
<ref name='sizing'/>
<ref name='sourcesheepdog'/>
</interleave>
</define>
<define name='poolgluster'>
<attribute name='type'>
<value>gluster</value>
</attribute>
<interleave>
<ref name='commonMetadataNameOptional'/>
<ref name='sizing'/>
<ref name='sourcegluster'/>
</interleave>
</define>
<define name='poolzfs'>
<attribute name='type'>
<value>zfs</value>
</attribute>
<interleave>
<ref name='commonMetadataNameOptional'/>
<ref name='sizing'/>
<ref name='sourcezfs'/>
<optional>
<ref name='target'/>
</optional>
</interleave>
</define>
<define name='poolvstorage'>
<attribute name='type'>
<value>vstorage</value>
</attribute>
<interleave>
<ref name='commonMetadataNameOptional'/>
<ref name='sizing'/>
<ref name='sourcevstorage'/>
<ref name='target'/>
</interleave>
</define>
<define name='sourceinfovendor'>
<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='commonMetadataNameOptional'>
<interleave>
<optional>
<element name='name'>
<ref name='poolName'/>
</element>
</optional>
<optional>
<element name='uuid'>
<ref name='UUID'/>
</element>
</optional>
</interleave>
</define>
<define name='commonmetadata'>
<interleave>
<element name='name'>
<ref name='poolName'/>
</element>
<optional>
<element name='uuid'>
<ref name='UUID'/>
</element>
</optional>
</interleave>
</define>
<define name='sizing'>
<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='target'>
<element name='target'>
<interleave>
<element name='path'>
<ref name='absFilePath'/>
</element>
<ref name='permissions'/>
</interleave>
</element>
</define>
<define name='targetlogical'>
<element name='target'>
<interleave>
<optional>
<element name='path'>
<ref name='absFilePath'/>
</element>
</optional>
<ref name='permissions'/>
</interleave>
</element>
</define>
<define name='sourceinfohost'>
<oneOrMore>
<element name='host'>
<attribute name='name'>
<text/>
</attribute>
<optional>
<attribute name='port'>
<ref name="PortNumber"/>
</attribute>
</optional>
<empty/>
</element>
</oneOrMore>
</define>
<define name='sourceinfodev'>
<element name='device'>
<attribute name='path'>
<choice>
<ref name='absFilePath'/>
<ref name='genericName'/>
<ref name='IscsiQualifiedName'/>
</choice>
</attribute>
<choice>
<empty/>
<ref name='devextents'/>
</choice>
<optional>
<attribute name="part_separator">
<ref name="virYesNo"/>
</attribute>
</optional>
</element>
</define>
<define name='initiatorinfo'>
<element name='initiator'>
<element name='iqn'>
<attribute name='name'>
<text/>
</attribute>
<empty/>
</element>
</element>
</define>
<define name='devextents'>
<oneOrMore>
<element name='freeExtent'>
<attribute name='start'>
<ref name='unsignedLong'/>
</attribute>
<attribute name='end'>
<ref name='unsignedLong'/>
</attribute>
</element>
</oneOrMore>
</define>
<define name='sourceinfodir'>
<element name='dir'>
<attribute name='path'>
<ref name='absDirPath'/>
</attribute>
<empty/>
</element>
</define>
<define name='sourceinfonetrelativepath'>
<element name='dir'>
<attribute name='path'>
<ref name='dirPath'/>
</attribute>
<empty/>
</element>
</define>
<define name='sourceinfoname'>
<element name='name'>
<text/>
</element>
</define>
<define name='sourceinfoauth'>
<element name='auth'>
<attribute name='type'>
<choice>
<value>chap</value>
<value>ceph</value>
</choice>
</attribute>
<attribute name='username'>
<text/>
</attribute>
<ref name='sourceinfoauthsecret'/>
</element>
</define>
<define name='sourceinfoauthsecret'>
<element name='secret'>
<choice>
<attribute name='uuid'>
<text/>
</attribute>
<attribute name='usage'>
<text/>
</attribute>
</choice>
</element>
</define>
<define name='sourcezfs'>
<element name='source'>
<interleave>
<ref name='sourceinfoname'/>
<optional>
<ref name='sourceinfodev'/>
</optional>
</interleave>
</element>
</define>
<define name='sourcevstorage'>
<element name='source'>
<interleave>
<ref name='sourceinfoname'/>
</interleave>
</element>
</define>
<define name='sourcefmtfs'>
<optional>
<element name='format'>
<attribute name='type'>
<choice>
<value>auto</value>
<value>ext2</value>
<value>ext3</value>
<value>ext4</value>
<value>ufs</value>
<value>iso9660</value>
<value>udf</value>
<value>gfs</value>
<value>gfs2</value>
<value>vfat</value>
<value>hfs+</value>
<value>xfs</value>
<value>ocfs2</value>
</choice>
</attribute>
</element>
</optional>
</define>
<define name='sourcefmtnetfs'>
<optional>
<element name='format'>
<attribute name='type'>
<choice>
<value>auto</value>
<value>nfs</value>
</choice>
</attribute>
</element>
</optional>
</define>
<define name='sourcefmtdisk'>
<optional>
<element name='format'>
<attribute name='type'>
<choice>
<value>unknown</value>
<value>dos</value>
<value>dvh</value>
<value>gpt</value>
<value>mac</value>
<value>bsd</value>
<value>pc98</value>
<value>sun</value>
<value>lvm2</value>
</choice>
</attribute>
<optional>
<ref name='sourceinfovendor'/>
</optional>
</element>
</optional>
</define>
<define name='sourcefmtlogical'>
<optional>
<element name='format'>
<attribute name='type'>
<choice>
<value>unknown</value> <!-- back-compat requires keeping 'unknown' not 'auto' -->
<value>lvm2</value>
</choice>
</attribute>
<optional>
<ref name='sourceinfovendor'/>
</optional>
</element>
</optional>
</define>
<define name='sourcedir'>
<optional>
<element name='source'>
<empty/>
<optional>
<ref name='sourceinfovendor'/>
</optional>
</element>
</optional>
</define>
<define name='sourcefs'>
<element name='source'>
<interleave>
<ref name='sourceinfodev'/>
<ref name='sourcefmtfs'/>
<optional>
<ref name='sourceinfovendor'/>
</optional>
</interleave>
</element>
</define>
<define name='sourcenetfs'>
<element name='source'>
<choice>
<group>
<interleave>
<ref name='sourceinfohost'/>
<ref name='sourceinfodir'/>
<ref name='sourcefmtnetfs'/>
<optional>
<ref name='sourceinfovendor'/>
</optional>
</interleave>
</group>
<group>
<interleave>
<ref name='sourceinfohost'/>
<ref name='sourceinfonetrelativepath'/>
<element name='format'>
<attribute name='type'>
<choice>
<value>cifs</value>
<value>glusterfs</value>
</choice>
</attribute>
</element>
<optional>
<ref name='sourceinfovendor'/>
</optional>
</interleave>
</group>
</choice>
</element>
</define>
<define name='sourcelogical'>
<element name='source'>
<interleave>
<oneOrMore>
<optional>
<ref name='sourceinfoname'/>
</optional>
<optional>
<ref name='sourceinfodev'/>
</optional>
</oneOrMore>
<ref name='sourcefmtlogical'/>
<optional>
<ref name='sourceinfovendor'/>
</optional>
</interleave>
</element>
</define>
<define name='sourcedisk'>
<element name='source'>
<interleave>
<ref name='sourceinfodev'/>
<ref name='sourcefmtdisk'/>
<optional>
<ref name='sourceinfovendor'/>
</optional>
</interleave>
</element>
</define>
<define name='sourceiscsi'>
<element name='source'>
<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'>
<interleave>
<ref name='sourceinfoadapter'/>
<optional>
<ref name='sourceinfovendor'/>
</optional>
</interleave>
</element>
</define>
<define name='sourcempath'>
<element name='source'>
<empty/>
</element>
</define>
<define name='sourcerbd'>
<element name='source'>
<interleave>
<ref name='sourceinfoname'/>
<ref name='sourceinfohost'/>
<optional>
<ref name='sourceinfoauth'/>
</optional>
</interleave>
</element>
</define>
<define name='sourcesheepdog'>
<element name='source'>
<interleave>
<ref name='sourceinfohost'/>
<ref name='sourceinfoname'/>
</interleave>
</element>
</define>
<define name='sourcegluster'>
<element name='source'>
<interleave>
<ref name='sourceinfohost'/>
<ref name='sourceinfoname'/>
<optional>
<ref name='sourceinfodir'/>
</optional>
</interleave>
</element>
</define>
<define name='IscsiQualifiedName'>
<data type='string'>
<param name="pattern">iqn\.[0-9]{4}-(0[1-9]|1[0-2])\.[a-zA-Z0-9\.\-]+(:.+)?</param>
</data>
</define>
</grammar>