[libvirt] [PATCH 3/6] conf: tighten <domainsnapshot> schema

Eric Blake eblake at redhat.com
Sun Apr 13 02:27:06 UTC 2014


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.

One way to test this patch: s/qed/raw/ in the file
tests/domainsnapshotxml2xmlin/disk_snapshot.xml, then run
make -C tests check TESTS=domainsnapshotschematest.  Pre-patch,
the file will pass the schema, even though attempts to use that
description with virDomainSnapshotCreateXML will fail because
raw files cannot have a backing store.  Post-patch, the file
will fail virt-xml-validate.

* docs/schemas/domainsnapshot.rng (domain): Use nested grammar
to avoid restricting <domain>.
(storageFormat): Override for tighter usage.
* docs/schemas/storagecommon.rng (startupPolicy): Create a no-op
default.
* docs/schemas/domaincommon.rng (storageFormat): Cross-reference.
(startupPolicy): Move the non-trivial define...
* docs/schemas/domain.rng (startupPolicy): ...here.

Signed-off-by: Eric Blake <eblake at redhat.com>
---
 docs/schemas/domain.rng         | 15 ++++++++++++++-
 docs/schemas/domaincommon.rng   | 12 ++----------
 docs/schemas/domainsnapshot.rng | 21 +++++++++++++++++++--
 docs/schemas/storagecommon.rng  |  5 +++++
 4 files changed, 40 insertions(+), 13 deletions(-)

diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng
index cf0be68..41bd95b 100644
--- a/docs/schemas/domain.rng
+++ b/docs/schemas/domain.rng
@@ -1,9 +1,22 @@
 <?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="startupPolicy" combine='choice'>
+    <!-- overrides the no-op version in storagecommon.rng -->
+    <attribute name="startupPolicy">
+      <choice>
+        <value>mandatory</value>
+        <value>requisite</value>
+        <value>optional</value>
+      </choice>
+    </attribute>
+  </define>
+
 </grammar>
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 7fc0cff..6c92848 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -1140,16 +1140,6 @@
     </element>
   </define>

-  <define name="startupPolicy">
-    <attribute name="startupPolicy">
-      <choice>
-        <value>mandatory</value>
-        <value>requisite</value>
-        <value>optional</value>
-      </choice>
-    </attribute>
-  </define>
-
   <!--
       A disk description can be either of type file or block
       The name of the attribute on the source element depends on the type
@@ -1501,6 +1491,8 @@
     </optional>
   </define>
   <define name='storageFormat'>
+    <!-- See also domainsnapshot.rng which overrides this for a
+         smaller set of choices in snapshots -->
     <choice>
       <value>raw</value>
       <value>dir</value>
diff --git a/docs/schemas/domainsnapshot.rng b/docs/schemas/domainsnapshot.rng
index 824a186..b0ac854 100644
--- a/docs/schemas/domainsnapshot.rng
+++ b/docs/schemas/domainsnapshot.rng
@@ -5,7 +5,19 @@
     <ref name='domainsnapshot'/>
   </start>

-  <include href='domaincommon.rng'/>
+  <include href='domaincommon.rng'>
+    <!-- override storageFormat to limit to just those formats known
+         to have backing file -->
+    <define name='storageFormat'>
+      <choice>
+        <value>cow</value>
+        <value>qcow</value>
+        <value>qcow2</value>
+        <value>qed</value>
+        <value>vmdk</value>
+      </choice>
+    </define>
+  </include>

   <define name='domainsnapshot'>
     <element name='domainsnapshot'>
@@ -75,7 +87,12 @@
                 <ref name="UUID"/>
               </element>
             </element>
-            <ref name='domain'/>
+            <!-- Nested grammar ensures that any of our overrides of
+                 domaincommon defines do not impact the domain.rng
+                 usage of domaincommon.  -->
+            <grammar>
+              <include href='domain.rng'/>
+            </grammar>
           </choice>
         </optional>
         <optional>
diff --git a/docs/schemas/storagecommon.rng b/docs/schemas/storagecommon.rng
index 54cf6b4..0fa90b8 100644
--- a/docs/schemas/storagecommon.rng
+++ b/docs/schemas/storagecommon.rng
@@ -52,4 +52,9 @@
     </element>
   </define>

+  <!-- overridden in domain.rng to allow non-empty use -->
+  <define name='startupPolicy'>
+    <notAllowed/>
+  </define>
+
 </grammar>
-- 
1.9.0




More information about the libvir-list mailing list