This patch is my first experience playing with nested grammars,
as documented in
http://relaxng.org/tutorial-20011203.html#IDA3PZR.
I plan on doing more overrides in order to make the RelaxNG
grammar mirror the C code refactoring into a common
virStorageSource, but where different clients of that source do
not support the same subset of functionality. By starting with
something fairly easy to validate, I can make sure my later
patches will be possible.
This patch adds a use of the no-op <ref
name='sourceStartupPolicy'/> to the disksnapshot definition, so
that the snapshot version of a type='file' <source> more closely
resembles the version in domaincommon. A future patch will merge
the two files into using a common define, but this patch is
sufficient for testing that adding <source
startupPolicy='optional'/> in any of the
tests/domainsnapshotxml2xmlin/*.xml files still gets rejected
unless it occurs within the <domain> subelement, because the
definition of startupPolicy is empty outside of domain.rng.
* docs/schemas/storagecommon.rng (storageStartupPolicy)
(storageSourceExtra): Create no-op defaults.
* docs/schemas/domainsnapshot.rng (domain): Use nested grammar
to avoid restricting <domain>.
(storageSourceExtra): Create new override.
(disksnapshot): Access overrides through common names.
* docs/schemas/domaincommon.rng (disk): Access overrides through
common names.
* docs/schemas/domain.rng (storageStartupPolicy)
(storageSourceExtra): Create new overrides.
Signed-off-by: Eric Blake <eblake(a)redhat.com>
---
docs/schemas/domain.rng | 14 +++++++++++++-
docs/schemas/domaincommon.rng | 11 ++++++-----
docs/schemas/domainsnapshot.rng | 21 +++++++++++++++++----
docs/schemas/storagecommon.rng | 14 ++++++++++++++
4 files changed, 50 insertions(+), 10 deletions(-)
diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng
index cf0be68..114b87e 100644
--- a/docs/schemas/domain.rng
+++ b/docs/schemas/domain.rng
@@ -1,9 +1,21 @@
<?xml version="1.0"?>
<grammar
xmlns="http://relaxng.org/ns/structure/1.0"
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
- <!-- We handle only document defining a domain -->
+ <!-- Grammar for accepting a domain element, both as top level, and
+ also suitable for inclusion in domainsnapshot.rng -->
<start>
<ref name="domain"/>
</start>
<include href='domaincommon.rng'/>
+
+ <define name='storageStartupPolicy' combine='choice'>
+ <!-- overrides the no-op version in storagecommon.rng -->
+ <ref name='startupPolicy'/>
+ </define>
+
+ <define name='storageSourceExtra' combine='choice'>
+ <!-- overrides the no-op version in storagecommon.rng -->
+ <ref name='diskspec'/>
+ </define>
+
</grammar>
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 59f3fdd..df2c839 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -1213,7 +1213,7 @@
</attribute>
</optional>
<optional>
- <ref name="startupPolicy"/>
+ <ref name="storageStartupPolicy"/>
</optional>
<optional>
<ref name='devSeclabel'/>
@@ -1235,7 +1235,7 @@
</attribute>
</optional>
<optional>
- <ref name="startupPolicy"/>
+ <ref name="storageStartupPolicy"/>
</optional>
<optional>
<ref name='devSeclabel'/>
@@ -1255,7 +1255,7 @@
<ref name="absFilePath"/>
</attribute>
<optional>
- <ref name="startupPolicy"/>
+ <ref name="storageStartupPolicy"/>
</optional>
<empty/>
</element>
@@ -1296,7 +1296,7 @@
</attribute>
</optional>
<optional>
- <ref name="startupPolicy"/>
+ <ref name="storageStartupPolicy"/>
</optional>
<optional>
<ref name='devSeclabel'/>
@@ -1306,10 +1306,11 @@
</interleave>
</group>
</choice>
- <ref name="diskspec"/>
+ <ref name="storageSourceExtra"/>
</interleave>
</element>
</define>
+
<define name="diskSourceNetwork">
<attribute name="protocol">
<choice>
diff --git a/docs/schemas/domainsnapshot.rng b/docs/schemas/domainsnapshot.rng
index 644da90..bec12db 100644
--- a/docs/schemas/domainsnapshot.rng
+++ b/docs/schemas/domainsnapshot.rng
@@ -75,7 +75,12 @@
<ref name="UUID"/>
</element>
</element>
- <ref name='domain'/>
+ <!-- Nested grammar ensures that any of our overrides of
+ storagecommon/domaincommon defines do not conflict
+ with any domain.rng overrides. -->
+ <grammar>
+ <include href='domain.rng'/>
+ </grammar>
</choice>
</optional>
<optional>
@@ -102,6 +107,11 @@
</choice>
</define>
+ <define name='storageSourceExtra' combine='choice'>
+ <!-- overrides the no-op version in storagecommon.rng -->
+ <ref name='disksnapshotdriver'/>
+ </define>
+
<define name='disksnapshot'>
<element name='disk'>
<attribute name='name'>
@@ -138,10 +148,13 @@
<ref name='absFilePath'/>
</attribute>
</optional>
+ <optional>
+ <ref name='storageStartupPolicy'/>
+ </optional>
<empty/>
</element>
</optional>
- <ref name='disksnapshotdriver'/>
+ <ref name='storageSourceExtra'/>
</interleave>
</group>
<group>
@@ -157,7 +170,7 @@
<empty/>
</element>
</optional>
- <ref name='disksnapshotdriver'/>
+ <ref name='storageSourceExtra'/>
</interleave>
</group>
<group>
@@ -170,7 +183,7 @@
<ref name='diskSourceNetwork'/>
</element>
</optional>
- <ref name='disksnapshotdriver'/>
+ <ref name='storageSourceExtra'/>
</interleave>
</group>
</choice>
diff --git a/docs/schemas/storagecommon.rng b/docs/schemas/storagecommon.rng
index 2d61abc..372832d 100644
--- a/docs/schemas/storagecommon.rng
+++ b/docs/schemas/storagecommon.rng
@@ -79,4 +79,18 @@
</choice>
</define>
+ <define name='storageStartupPolicy'>
+ <!-- Use a combine='choice' override in client files that want to
+ add additional attributes to a <source> sub-element
+ associated with a storage source -->
+ <notAllowed/>
+ </define>
+
+ <define name='storageSourceExtra'>
+ <!-- Use a combine='choice' override in client files that want to
+ add additional elements as siblings of a <source> sub-element
+ associated with a storage source -->
+ <notAllowed/>
+ </define>
+
</grammar>
--
1.9.0