We forgot to document several pool types. Furthermore, the
RNG grammar did not allow arbitrary interleaving, which makes
it harder than necessary to create a new pool from XML.
* docs/formatstorage.html.in: Add docs for scsi, mpath, rbd, and
sheepdog.
* 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(a)redhat.com>
---
docs/formatstorage.html.in | 44 +--
docs/schemas/storagepool.rng | 356 ++++++++++++++-----------
tests/storagepoolxml2xmlin/pool-iscsi-auth.xml | 12 +-
tests/storagepoolxml2xmlin/pool-sheepdog.xml | 6 +-
4 files changed, 238 insertions(+), 180 deletions(-)
diff --git a/docs/formatstorage.html.in b/docs/formatstorage.html.in
index 3300d67..6f79b0c 100644
--- a/docs/formatstorage.html.in
+++ b/docs/formatstorage.html.in
@@ -18,9 +18,12 @@
The top level tag for a storage pool document is 'pool'. It has
a single attribute <code>type</code>, which is one of
<code>dir</code>,
<code>fs</code>, <code>netfs</code>,
<code>disk</code>,
- <code>iscsi</code>, <code>logical</code>. This corresponds
to the
+ <code>iscsi</code>, <code>logical</code>,
<code>scsi</code>
+ (all <span class="since">since 0.4.1</span>),
<code>mpath</code>
+ (<span class="since">since 0.7.1</span>),
<code>rbd</code>
+ (<span class="since">since 0.9.13</span>), or
<code>sheepdog</code>
+ (<span class="since">since 0.10.0</span>). This corresponds
to the
storage backend drivers listed further along in this document.
- The storage pool XML format is available <span class="since">since
0.4.1</span>
</p>
<h3><a name="StoragePoolFirst">General
metadata</a></h3>
@@ -64,7 +67,8 @@
<p>
A single <code>source</code> element is contained within the top level
<code>pool</code> element. This tag is used to describe the source of
- the storage pool. It can contain the following child elements:
+ the storage pool. The set of child elements that it will contain
+ depend on the pool type, but come from the following child elements:
</p>
<pre>
@@ -89,17 +93,18 @@
<dl>
<dt><code>device</code></dt>
- <dd>Provides the source for pools backed by physical devices.
+ <dd>Provides the source for pools backed by physical devices
+ (fs, logical, disk, iscsi).
May be repeated multiple times depending on backend driver. Contains
a single attribute <code>path</code> which is the fully qualified
path to the block device node. <span class="since">Since
0.4.1</span></dd>
- <dt><code>directory</code></dt>
- <dd>Provides the source for pools backed by directories. May
+ <dt><code>dir</code></dt>
+ <dd>Provides the source for pools backed by directories (dir). May
only occur once. Contains a single attribute <code>path</code>
which is the fully qualified path to the backing directory.
<span class="since">Since 0.4.1</span></dd>
<dt><code>adapter</code></dt>
- <dd>Provides the source for pools backed by SCSI adapters. May
+ <dd>Provides the source for pools backed by SCSI adapters (scsi). May
only occur once. Attribute <code>name</code> is the SCSI adapter
name (ex. "scsi_host1". NB, although a name such as "host1"
is
still supported for backwards compatibility, it is not recommended).
@@ -120,7 +125,8 @@
<span class="since">Since 0.6.2</span></dd>
<dt><code>host</code></dt>
<dd>Provides the source for pools backed by storage from a
- remote server. Will be used in combination with a
<code>directory</code>
+ remote server (netfs, iscsi, rbd, sheepdog). Will be
+ used in combination with a <code>directory</code>
or <code>device</code> element. Contains an attribute
<code>name</code>
which is the hostname or IP address of the server. May optionally
contain a <code>port</code> attribute for the protocol specific
@@ -128,18 +134,19 @@
<dt><code>auth</code></dt>
<dd>If present, the <code>auth</code> element provides the
authentication credentials needed to access the source by the
- setting of the <code>type</code> attribute. The
<code>type</code>
- must be either "chap" or "ceph". Additionally a mandatory
attribute
+ setting of the <code>type</code> attribute (iscsi,
+ rbd). The <code>type</code>
+ must be either "chap" or "ceph". Use "ceph" for
+ Ceph RBD (Rados Block Device) network sources and use "iscsi" for CHAP
+ (Challenge-Handshake Authentication Protocol) iSCSI
+ targets. Additionally a mandatory attribute
<code>username</code> identifies the username to use during
authentication as well as a sub-element <code>secret</code> with
a mandatory attribute <code>type</code>, to tie back to a
<a href="formatsecret.html">libvirt secret object</a> that
holds the actual password or other credentials. The domain XML
intentionally does not expose the password, only the reference
- to the object that manages the password. The secret element
- <code>type</code> must be either "ceph" or
"iscsi". Use "ceph" for
- Ceph RBD (Rados Block Device) network sources and use "iscsi" for CHAP
- (Challenge-Handshake Authentication Protocol) iSCSI targets.
+ to the object that manages the password.
The <code>secret</code> element requires either a
<code>uuid</code>
attribute with the UUID of the secret object or a <code>usage</code>
attribute matching the key that was specified in the
@@ -148,11 +155,12 @@
</dd>
<dt><code>name</code></dt>
<dd>Provides the source for pools backed by storage from a
- named element (e.g., a logical volume group name).
+ named element (logical, rbd, sheepdog).
Contains a string identifier.
<span class="since">Since 0.4.5</span></dd>
<dt><code>format</code></dt>
- <dd>Provides information about the format of the pool. This
+ <dd>Provides information about the format of the pool (fs,
+ netfs, disk, logical). This
contains a single attribute <code>type</code> whose value is
backend specific. This is typically used to indicate filesystem
type, or network filesystem type, or partition table type, or
@@ -174,7 +182,9 @@
<p>
A single <code>target</code> element is contained within the top level
- <code>pool</code> element. This tag is used to describe the mapping of
+ <code>pool</code> element for some types of pools (dir, fs,
+ netfs, logical, disk, iscsi, scsi, mpath). This tag is used to
+ describe the mapping of
the storage pool into the host filesystem. It can contain the following
child elements:
</p>
diff --git a/docs/schemas/storagepool.rng b/docs/schemas/storagepool.rng
index a4ef5af..66d3c22 100644
--- a/docs/schemas/storagepool.rng
+++ b/docs/schemas/storagepool.rng
@@ -29,192 +29,224 @@
<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='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>
@@ -413,74 +445,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>
+ <interleave>
+ <oneOrMore>
+ <optional>
+ <ref name='sourceinfoname'/>
+ </optional>
+ <optional>
+ <ref name='sourceinfodev'/>
+ </optional>
+ </oneOrMore>
+ <ref name='sourcefmtlogical'/>
<optional>
- <ref name='sourceinfoname'/>
- </optional>
- <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>
@@ -492,18 +536,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.8.3.1