]> xenbits.xensource.com Git - libvirt.git/commitdiff
Added complete set of RNG schemas for all XML formats
authorDaniel P. Berrange <berrange@redhat.com>
Tue, 27 Jan 2009 15:29:53 +0000 (15:29 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Tue, 27 Jan 2009 15:29:53 +0000 (15:29 +0000)
45 files changed:
ChangeLog
configure.in
docs/Makefile.am
docs/libvirt.rng [deleted file]
docs/network.rng [deleted file]
docs/schemas/.cvsignore [new file with mode: 0644]
docs/schemas/Makefile.am [new file with mode: 0644]
docs/schemas/capability.rng [new file with mode: 0644]
docs/schemas/domain.rng [new file with mode: 0644]
docs/schemas/network.rng [new file with mode: 0644]
docs/schemas/nodedev.rng [new file with mode: 0644]
docs/schemas/storagepool.rng [new file with mode: 0644]
docs/schemas/storagevol.rng [new file with mode: 0644]
libvirt.spec.in
mingw32-libvirt.spec.in
tests/Makefile.am
tests/capabilityschemadata/caps-qemu-kvm.xml [new file with mode: 0644]
tests/capabilityschemadata/caps-test.xml [new file with mode: 0644]
tests/capabilityschematest [new file with mode: 0755]
tests/domainschematest
tests/networkschematest [new file with mode: 0755]
tests/nodedevschemadata/DVD_GCC_4247N.xml [new file with mode: 0644]
tests/nodedevschemadata/computer.xml [new file with mode: 0644]
tests/nodedevschemadata/net_00_13_02_b9_f9_d3.xml [new file with mode: 0644]
tests/nodedevschemadata/net_00_15_58_2f_e9_55.xml [new file with mode: 0644]
tests/nodedevschemadata/pci_1002_71c4.xml [new file with mode: 0644]
tests/nodedevschemadata/pci_8086_27c5_scsi_host.xml [new file with mode: 0644]
tests/nodedevschemadata/pci_8086_27c5_scsi_host_0.xml [new file with mode: 0644]
tests/nodedevschemadata/pci_8086_27c5_scsi_host_scsi_device_lun0.xml [new file with mode: 0644]
tests/nodedevschemadata/pci_8086_27c5_scsi_host_scsi_host.xml [new file with mode: 0644]
tests/nodedevschemadata/storage_serial_SATA_HTS721010G9SA00_MPCZ12Y0GNGWSE.xml [new file with mode: 0644]
tests/nodedevschemadata/usb_device_1d6b_1_0000_00_1d_0.xml [new file with mode: 0644]
tests/nodedevschemadata/usb_device_1d6b_1_0000_00_1d_0_if0.xml [new file with mode: 0644]
tests/nodedevschematest [new file with mode: 0755]
tests/storagepoolschemadata/pool-dir.xml [new file with mode: 0644]
tests/storagepoolschemadata/pool-disk.xml [new file with mode: 0644]
tests/storagepoolschemadata/pool-fs.xml [new file with mode: 0644]
tests/storagepoolschemadata/pool-iscsi.xml [new file with mode: 0644]
tests/storagepoolschemadata/pool-logical.xml [new file with mode: 0644]
tests/storagepoolschemadata/pool-netfs.xml [new file with mode: 0644]
tests/storagepoolschematest [new file with mode: 0755]
tests/storagevolschemadata/vol-logical.xml [new file with mode: 0644]
tests/storagevolschemadata/vol-partition.xml [new file with mode: 0644]
tests/storagevolschemadata/vol-qcow2.xml [new file with mode: 0644]
tests/storagevolschematest [new file with mode: 0755]

index ece493c0bcc167d93cc8f76057b731d7a913b158..476159ccd34ea3ac9e366d75941cea1e3d3b8aa1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,25 @@
+Tue Jan 27 15:18:16 GMT 2009 Daniel P. Berrange <berrange@redhat.com>
+
+       Add RNG schemas for all XML file formats used in API.
+       * configure.in: Add docs/schema/Makefile.in to output files
+       * libvirt.spec.in, mingw32-libvirt.spec.in: Package RNG schemas
+       from $datadir/libvirt/schemas
+       * docs/Makefile.am, docs/libvirt.rng, docs/network.rng: Remove
+       RNGs schemas
+       * docs/schemas/Makefile.am: Install RNG schemas to $datadir/libvirt
+       * docs/schemas/capability.rng: Schema for host capability XML
+       * docs/schemas/domain.rng: Schema for host capability XML
+       * docs/schemas/network.rng: Schema for guest domain XML
+       * docs/schemas/nodedev.rng: Schema for virtual network XML
+       * docs/schemas/storagepool.rng: Schema for storage pool XML
+       * docs/schemas/storagevol.rng: Schema for storage volume XML
+       * tests/Makefile.am, capabilityschematest, networkschematest,
+       nodedevschematest, storagepoolschematest, storagevolschematest:
+       New test cases to validate example XML files against schemeas.
+       * tests/capabilityschemadata/*.xml, tests/nodedevschemadata/*.xml,
+       tests/storagepoolschemadata/*.xml, tests/storagevolschemadata/*.xml:
+       New datafiles for schema validation tests.
+
 Tue Jan 27 14:28:16 GMT 2009 Daniel P. Berrange <berrange@redhat.com>
 
        * docs/index.html.in: Add link to libvirt-qpid & UML driver info
index dab68358a7fddd932708e9bc56cbdc0be72dda45..7efe26219c21b2fdd2c40cd2dad10ae81127c198 100644 (file)
@@ -1272,6 +1272,7 @@ cp -f COPYING.LIB COPYING
 AC_OUTPUT(Makefile src/Makefile include/Makefile docs/Makefile \
           docs/examples/Makefile docs/devhelp/Makefile \
          docs/examples/python/Makefile \
+         docs/schemas/Makefile \
          gnulib/lib/Makefile \
          gnulib/tests/Makefile \
           libvirt.pc libvirt.spec mingw32-libvirt.spec \
index bacf7b84a17f7538cb8cf2de598cbbda0c804eec..abb05291528de1bee0984cc06d96f24a73e574c4 100644 (file)
@@ -1,5 +1,5 @@
 ## Process this file with automake to produce Makefile.in
-SUBDIRS= . examples devhelp
+SUBDIRS= schemas examples devhelp
 
 # The directory containing the source code (if it contains documentation).
 DOC_SOURCE_DIR=../src
@@ -52,10 +52,6 @@ xml = \
   testnetpriv.xml \
   testnode.xml
 
-rng = \
-  libvirt.rng \
-  network.rng
-
 fig = \
   libvirt-net-logical.fig \
   libvirt-net-physical.fig
@@ -64,7 +60,7 @@ EXTRA_DIST=                                   \
   libvirt-api.xml libvirt-refs.xml apibuild.py \
   site.xsl newapi.xsl news.xsl page.xsl        ChangeLog.xsl   \
   $(dot_html) $(dot_html_in) $(gif) $(apihtml) $(apipng) \
-  $(xml) $(rng) $(fig) $(png) \
+  $(xml) $(fig) $(png) \
   virsh.pod ChangeLog.awk
 
 all: web $(top_builddir)/NEWS $(man_MANS)
diff --git a/docs/libvirt.rng b/docs/libvirt.rng
deleted file mode 100644 (file)
index 6acdbec..0000000
+++ /dev/null
@@ -1,1111 +0,0 @@
-<?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 -->
-  <start>
-    <ref name='domain'/>
-  </start>
-
-  <!--
-      We handle only document defining a domain
-    -->
-  <define name='domain'>
-    <element name="domain">
-      <ref name='hvs'/>
-      <ref name='ids'/>
-      <interleave>
-        <ref name='os'/>
-        <ref name='clock'/>
-        <ref name='resources'/>
-        <ref name='features'/>
-        <ref name='termination'/>
-       <optional>
-          <ref name='devices'/>
-       </optional>
-      </interleave>
-    </element>
-  </define>
-
-  <define name='hvs'>
-    <attribute name='type'>
-      <choice>
-       <value>xen</value>
-       <value>kvm</value>
-       <value>kqemu</value>
-       <value>qemu</value>
-       <value>lxc</value>
-       <value>openvz</value>
-       <value>test</value>
-      </choice>
-    </attribute>
-  </define>
-
-  <define name='os'>
-    <choice>
-      <ref name='osxen'/>
-      <ref name='oshvm'/>
-      <ref name='osexe'/>
-    </choice>
-  </define>
-
-  <define name='osxen'>
-    <choice>
-      <group>
-       <optional>
-          <ref name='bootloader'/>
-       </optional>
-       <element name='os'>
-         <ref name='ostypexen'/>
-          <ref name='osbootkernel'/>
-       </element>
-      </group>
-      <group>
-       <ref name='bootloader'/>
-       <optional>
-         <element name='os'>
-           <ref name='ostypexen'/>
-           <optional>
-              <ref name='osbootkernel'/>
-           </optional>
-         </element>
-       </optional>
-      </group>
-    </choice>
-  </define>
-
-
-  <define name='oshvm'>
-    <element name='os'>
-      <ref name='ostypehvm'/>
-      <interleave>
-       <optional>
-         <element name='loader'>
-           <ref name='absFilePath'/>
-         </element>
-       </optional>
-       <choice>
-          <ref name='osbootkernel'/>
-          <ref name='osbootdev'/>
-       </choice>
-      </interleave>
-    </element>
-  </define>
-
-
-  <define name='ostypexen'>
-    <element name='type'>
-      <optional>
-       <attribute name='arch'>
-         <choice>
-           <value>i686</value>
-           <value>x86_64</value>
-           <value>ia64</value>
-         </choice>
-       </attribute>
-      </optional>
-      <optional>
-       <attribute name='machine'>
-         <choice>
-           <value>xenpv</value>
-           <value>xenner</value>
-         </choice>
-       </attribute>
-      </optional>
-      <choice>
-       <value>xen</value>
-       <value>linux</value>
-      </choice>
-    </element>
-  </define>
-
-  <define name='ostypehvm'>
-    <element name='type'>
-      <optional>
-       <choice>
-         <ref name='hvmx86'/>
-         <ref name='hvmmips'/>
-         <ref name='hvmsparc'/>
-         <ref name='hvmppc'/>
-       </choice>
-      </optional>
-      <value>hvm</value>
-    </element>
-  </define>
-
-  <define name='hvmx86'>
-    <group>
-      <attribute name='arch'>
-       <choice>
-         <value>i686</value>
-         <value>x86_64</value>
-       </choice>
-      </attribute>
-      <attribute name='machine'>
-       <choice>
-         <value>xenfv</value>
-         <value>pc</value>
-         <value>isapc</value>
-       </choice>
-      </attribute>
-    </group>
-  </define>
-
-  <define name='hvmmips'>
-    <group>
-      <attribute name='arch'>
-        <value>mips</value>
-      </attribute>
-      <attribute name='machine'>
-        <value>mips</value>
-      </attribute>
-    </group>
-  </define>
-
-  <define name='hvmsparc'>
-    <group>
-      <attribute name='arch'>
-       <value>sparc</value>
-      </attribute>
-      <attribute name='machine'>
-       <value>sun4m</value>
-      </attribute>
-    </group>
-  </define>
-
-  <define name='hvmppc'>
-    <group>
-      <attribute name='arch'>
-       <value>ppc</value>
-      </attribute>
-      <attribute name='machine'>
-       <choice>
-         <value>g3bw</value>
-         <value>mac99</value>
-         <value>prep</value>
-       </choice>
-      </attribute>
-    </group>
-  </define>
-
-
-  <define name='osexe'>
-    <element name='os'>
-      <element name='type'>
-       <value>exe</value>
-      </element>
-      <interleave>
-       <optional>
-         <element name='init'>
-           <ref name='absFilePath'/>
-         </element>
-       </optional>
-      </interleave>
-    </element>
-  </define>
-
-
-
-  <!--
-      The Identifiers can be:
-      - an optional id attribute with a number on the domain element
-      - a mandatory name
-      - an optional uuid
-    -->
-  <define name='ids'>
-    <optional>
-      <attribute name='id'>
-        <ref name='unsignedInt'/>
-      </attribute>
-    </optional>
-    <interleave>
-      <element name="name">
-        <ref name='domainName'/>
-      </element>
-      <optional>
-        <element name="uuid">
-          <ref name='UUID'/>
-        </element>
-      </optional>
-    </interleave>
-  </define>
-
-  <!--
-      Resources usage defines the amount of memory (maximum and possibly
-      current usage) and number of virtual CPUs used by that domain.
-      We can't check here the rule that currentMemory <= memory
-    -->
-
-  <define name='resources'>
-    <interleave>
-      <element name='memory'>
-        <ref name='memoryKB'/>
-      </element>
-      <optional>
-        <element name='currentMemory'>
-          <ref name='memoryKB'/>
-        </element>
-      </optional>
-      <optional>
-        <element name='vcpu'>
-          <optional>
-            <attribute name='cpuset' />
-          </optional>
-          <ref name='countCPU'/>
-        </element>
-      </optional>
-    </interleave>
-  </define>
-
-  <define name='clock'>
-    <optional>
-      <element name='clock'>
-        <attribute name='offset'>
-          <choice>
-            <value>localtime</value>
-            <value>utc</value>
-          </choice>
-        </attribute>
-        <empty/>
-      </element>
-    </optional>
-  </define>
-
-  <!--
-      A bootloader may be used to extract the OS information instead of
-      defining the OS parameter in the instance. It points just to the
-      binary or script used to extract the data from the first disk device.
-    -->
-  <define name='bootloader'>
-    <interleave>
-      <element name='bootloader'>
-       <choice>
-         <ref name='absFilePath'/>
-         <empty/>
-       </choice>
-      </element>
-      <optional>
-       <element name='bootloader_args'>
-         <text/>
-       </element>
-      </optional>
-    </interleave>
-  </define>
-
-  <define name='osbootkernel'>
-    <interleave>
-      <element name='kernel'>
-        <ref name='absFilePath'/>
-      </element>
-      <optional>
-        <element name='initrd'>
-         <ref name='absFilePath'/>
-       </element>
-      </optional>
-      <optional>
-        <element name='root'>
-          <ref name='devicePath'/>
-        </element>
-      </optional>
-      <optional>
-        <element name='cmdline'>
-         <text/>
-       </element>
-      </optional>
-    </interleave>
-  </define>
-
-  <define name='osbootdev'>
-    <element name='boot'>
-      <attribute name='dev'>
-        <choice>
-          <value>hd</value>
-          <value>fd</value>
-          <value>cdrom</value>
-          <value>network</value>
-        </choice>
-      </attribute>
-      <empty/>
-    </element>
-  </define>
-
-
-  <define name='diskspec'>
-    <optional>
-      <ref name='driver'/>
-    </optional>
-    <ref name='target'/>
-    <optional>
-      <element name='readonly'>
-        <empty/>
-      </element>
-    </optional>
-    <optional>
-      <element name='shareable'>
-        <empty/>
-      </element>
-    </optional>
-  </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
-
-    -->
-  <define name='disk'>
-    <element name='disk'>
-      <optional>
-       <attribute name='device'>
-         <choice>
-           <value>floppy</value>
-           <value>disk</value>
-           <value>cdrom</value>
-         </choice>
-       </attribute>
-      </optional>
-      <choice>
-        <group>
-          <attribute name='type'>
-           <value>file</value>
-          </attribute>
-         <interleave>
-           <optional>
-             <element name='source'>
-               <attribute name='file'>
-                 <ref name='absFilePath'/>
-               </attribute>
-               <empty/>
-             </element>
-           </optional>
-            <ref name='diskspec'/>
-         </interleave>
-        </group>
-        <group>
-          <attribute name='type'>
-           <value>block</value>
-         </attribute>
-         <interleave>
-           <optional>
-             <element name='source'>
-               <attribute name='dev'>
-                 <ref name='deviceName'/>
-               </attribute>
-               <empty/>
-             </element>
-           </optional>
-            <ref name='diskspec'/>
-         </interleave>
-        </group>
-        <ref name='diskspec'/>
-      </choice>
-    </element>
-  </define>
-
-  <define name='target'>
-    <element name='target'>
-      <attribute name='dev'>
-       <ref name='deviceName'/>
-      </attribute>
-      <optional>
-         <attribute name='bus'>
-           <choice>
-             <value>ide</value>
-             <value>virtio</value>
-             <value>fdc</value>
-             <value>xen</value>
-             <value>usb</value>
-           </choice>
-         </attribute>
-      </optional>
-    </element>
-  </define>
-
-  <!--
-      Disk may use a special driver for access. Currently this is
-      only defined for Xen for tap/aio and file, but will certainly be
-      extended in the future, and libvirt doesn't look for specific values.
-    -->
-  <define name='driver'>
-    <element name='driver'>
-      <attribute name='name'>
-       <ref name='genericName'/>
-      </attribute>
-      <optional>
-        <attribute name='type'>
-         <ref name='genericName'/>
-       </attribute>
-      </optional>
-      <empty/>
-    </element>
-  </define>
-
-  <define name='filesystem'>
-    <element name='filesystem'>
-      <choice>
-        <group>
-          <attribute name='type'>
-           <value>file</value>
-          </attribute>
-         <interleave>
-           <element name='source'>
-             <attribute name='file'>
-               <ref name='absFilePath'/>
-             </attribute>
-             <empty/>
-           </element>
-            <ref name='filesystemtgt'/>
-         </interleave>
-        </group>
-        <group>
-          <attribute name='type'>
-           <value>block</value>
-         </attribute>
-         <interleave>
-           <element name='source'>
-             <attribute name='dev'>
-               <ref name='deviceName'/>
-             </attribute>
-             <empty/>
-           </element>
-            <ref name='filesystemtgt'/>
-         </interleave>
-        </group>
-        <group>
-          <attribute name='type'>
-           <value>mount</value>
-         </attribute>
-         <interleave>
-           <element name='source'>
-             <attribute name='dir'>
-               <ref name='absFilePath'/>
-             </attribute>
-             <empty/>
-           </element>
-            <ref name='filesystemtgt'/>
-         </interleave>
-        </group>
-        <group>
-          <attribute name='type'>
-           <value>template</value>
-         </attribute>
-         <interleave>
-           <element name='source'>
-             <attribute name='name'>
-               <ref name='genericName'/>
-             </attribute>
-             <empty/>
-           </element>
-            <ref name='filesystemtgt'/>
-         </interleave>
-        </group>
-      </choice>
-    </element>
-  </define>
-
-  <define name='filesystemtgt'>
-    <element name='target'>
-      <attribute name='dir'>
-       <ref name='absDirPath'/>
-      </attribute>
-      <empty/>
-    </element>
-  </define>
-
-  <!--
-      An interface description can either be of type bridge in which case
-      it will use a bridging source, or of type ethernet which uses a device
-      source and a device target instead. They both share a set of interface
-      options. FIXME
-    -->
-  <define name='interface'>
-    <element name='interface'>
-      <choice>
-        <group>
-          <attribute name='type'>
-            <value>bridge</value>
-          </attribute>
-         <interleave>
-            <optional>
-             <element name='source'>
-               <attribute name='bridge'>
-                 <ref name='deviceName'/>
-               </attribute>
-               <empty/>
-             </element>
-            </optional>
-           <ref name='interface-options'/>
-         </interleave>
-       </group>
-        <group>
-          <attribute name='type'>
-            <value>ethernet</value>
-          </attribute>
-         <interleave>
-            <optional>
-             <element name='source'>
-               <attribute name='dev'>
-                 <ref name='deviceName'/>
-               </attribute>
-               <empty/>
-             </element>
-            </optional>
-           <ref name='interface-options'/>
-         </interleave>
-       </group>
-        <group>
-          <attribute name='type'>
-            <value>network</value>
-          </attribute>
-         <interleave>
-           <element name='source'>
-             <attribute name='network'>
-               <ref name='deviceName'/>
-             </attribute>
-             <empty/>
-           </element>
-           <ref name='interface-options'/>
-         </interleave>
-       </group>
-        <group>
-          <attribute name='type'>
-            <value>user</value>
-          </attribute>
-         <interleave>
-           <ref name='interface-options'/>
-         </interleave>
-       </group>
-      </choice>
-    </element>
-  </define>
-
-  <!--
-      The interface options possible are:
-        - the MAC address
-       - the IP address bound to the interface
-       - the name of the script used to set up the binding
-       - the target device used
-    -->
-  <define name='interface-options'>
-    <interleave>
-      <optional>
-       <element name='target'>
-         <attribute name='dev'>
-           <ref name='deviceName'/>
-         </attribute>
-         <empty/>
-       </element>
-      </optional>
-      <optional>
-       <element name='mac'>
-         <attribute name='address'>
-           <ref name='addrMAC'/>
-           </attribute>
-         <empty/>
-       </element>
-      </optional>
-      <optional>
-       <element name='ip'>
-         <attribute name='address'>
-           <ref name='addrIP'/>
-         </attribute>
-         <empty/>
-       </element>
-      </optional>
-      <optional>
-       <element name='script'>
-         <attribute name='path'>
-           <ref name='filePath'/>
-         </attribute>
-         <empty/>
-       </element>
-      </optional>
-      <optional>
-       <element name='model'>
-         <attribute name='type' />
-         <empty/>
-       </element>
-      </optional>
-    </interleave>
-  </define>
-
-  <!--
-      An emulator description is just a path to the binary used for the task
-    -->
-  <define name='emulator'>
-    <element name='emulator'>
-      <ref name='absFilePath'/>
-    </element>
-  </define>
-
-  <!--
-      A graphic description, currently in Xen only 2 types are supported:
-        - sdl with optional display, xauth and fullscreen
-       - vnc with a required port and optional listen IP address, password
-          and keymap
-    -->
-  <define name='graphic'>
-    <element name='graphics'>
-      <choice>
-       <group>
-          <attribute name='type'>
-           <value>sdl</value>
-         </attribute>
-         <optional>
-           <attribute name='display'>
-             <text/>
-           </attribute>
-         </optional>
-         <optional>
-           <attribute name='xauth'>
-             <text/>
-           </attribute>
-         </optional>
-         <optional>
-           <attribute name='fullscreen'>
-             <choice>
-               <value>yes</value>
-               <value>no</value>
-             </choice>
-           </attribute>
-         </optional>
-       </group>
-       <group>
-          <attribute name='type'>
-           <value>vnc</value>
-         </attribute>
-         <optional>
-            <attribute name='port'>
-             <ref name='PortNumber'/>
-           </attribute>
-         </optional>
-         <optional>
-           <attribute name='autoport'>
-             <choice>
-               <value>yes</value>
-               <value>no</value>
-             </choice>
-           </attribute>
-         </optional>
-         <optional>
-           <attribute name='listen'>
-             <ref name='addrIP'/>
-           </attribute>
-         </optional>
-         <optional>
-           <attribute name='passwd'>
-             <text/>
-           </attribute>
-         </optional>
-          <optional>
-            <attribute name='keymap'>
-              <text/>
-            </attribute>
-          </optional>
-       </group>
-      </choice>
-    </element>
-  </define>
-
-  <!--
-      When a domain terminates multiple policies can be applied depending
-      on how it ended:
-    -->
-  <define name='termination'>
-    <interleave>
-      <optional>
-        <element name='on_reboot'>
-         <ref name='offOptions'/>
-       </element>
-      </optional>
-      <optional>
-        <element name='on_poweroff'>
-         <ref name='offOptions'/>
-       </element>
-      </optional>
-      <optional>
-        <element name='on_crash'>
-         <ref name='offOptions'/>
-       </element>
-      </optional>
-    </interleave>
-  </define>
-
-  <!--
-      Options when a domain terminates:
-      destroy: The domain is cleaned up
-      restart: A new domain is started in place of the old one
-      preserve: The domain will remain in memory until it is destroyed manually
-      rename-restart: a variant of the previous one but where the old domain is
-                      renamed before being saved to allow a restart
-    -->
-  <define name='offOptions'>
-    <choice>
-      <value>destroy</value>
-      <value>restart</value>
-      <value>preserve</value>
-      <value>rename-restart</value>
-    </choice>
-  </define>
-
-  <!--
-      Specific setup for a qemu emulated character device.  Note: this
-      definition doesn't fully specify the constraints on this node.
-    -->
-  <define name='qemucdev'>
-    <attribute name='type'>
-      <choice>
-        <value>dev</value>
-        <value>file</value>
-        <value>pipe</value>
-        <value>unix</value>
-        <value>tcp</value>
-        <value>udp</value>
-        <value>null</value>
-        <value>stdio</value>
-        <value>vc</value>
-        <value>pty</value>
-      </choice>
-    </attribute>
-    
-    <interleave>
-      <optional>
-        <oneOrMore>
-          <element name='source'>
-            <optional>
-              <attribute name='mode' />
-            </optional>
-            <optional>
-              <attribute name='path' />
-            </optional>
-            <optional>
-              <attribute name='host' />
-            </optional>
-            <optional>
-              <attribute name='service' />
-            </optional>
-            <optional>
-              <attribute name='wiremode' />
-            </optional>
-          </element>
-        </oneOrMore>
-      </optional>
-      <optional>
-        <element name='protocol'>
-          <optional>
-            <attribute name='type' />
-          </optional>
-        </element>
-      </optional>
-      <optional>
-        <element name='target'>
-          <optional>
-            <attribute name='port' />
-          </optional>
-        </element>
-      </optional>
-    </interleave>
-  </define>
-
-  <!--
-      The description for a console
-      just a tty device
-    -->
-  <define name='console'>
-    <element name='console'>
-      <choice>
-        <group>
-          <optional>
-            <attribute name='tty'>
-              <ref name='devicePath'/>
-            </attribute>
-          </optional>
-          <empty/>
-        </group>
-        <ref name='qemucdev' />
-      </choice>
-    </element>
-  </define>
-
-  <define name='sound'>
-    <element name='sound'>
-      <attribute name='model'>
-        <choice>
-          <value>sb16</value>
-          <value>es1370</value>
-          <value>pcspk</value>
-        </choice>
-      </attribute>
-    </element>
-  </define>
-
-  <define name='parallel'>
-    <element name='parallel'>
-      <ref name='qemucdev' />
-    </element>
-  </define>
-
-  <define name='serial'>
-    <element name='serial'>
-      <ref name='qemucdev' />
-    </element>
-  </define>
-
-  <define name='input'>
-    <element name='input'>
-      <attribute name='type'>
-        <choice>
-          <value>tablet</value>
-          <value>mouse</value>
-        </choice>
-      </attribute>
-      <optional>
-        <attribute name='bus'>
-          <choice>
-            <value>ps2</value>
-            <value>usb</value>
-            <value>xen</value>
-          </choice>
-        </attribute>
-      </optional>
-    </element>
-  </define>
-
-  <define name='hostdev'>
-    <element name='hostdev'>
-      <optional>
-       <attribute name='mode'>
-         <choice>
-           <value>subsystem</value>
-           <value>capabilities</value>
-         </choice>
-       </attribute>
-        <attribute name='type'>
-          <choice>
-           <value>usb</value>
-           <value>pci</value>
-          </choice>
-        </attribute>
-      </optional>
-      <group>
-          <element name='source'>
-            <choice>
-              <ref name="usbproduct"/>
-              <ref name="usbaddress"/>
-              <ref name="pciaddress"/>
-            </choice>
-          </element>
-      </group>
-    </element>
-  </define>
-
-  <define name="usbproduct">
-    <element name="vendor">
-      <attribute name="id">
-          <ref name="usbId"/>
-      </attribute>
-    </element>
-    <element name="product">
-      <attribute name="id">
-          <ref name="usbId"/>
-      </attribute>
-    </element>
-  </define>
-  
-  <define name="usbaddress">
-    <element name="address">
-      <attribute name="bus">
-        <ref name="usbAddr"/>
-      </attribute>
-      <attribute name="device">
-        <ref name="usbAddr"/>
-      </attribute>
-    </element>
-  </define>
-
-  <define name="pciaddress">
-    <element name="address">
-      <optional>
-        <attribute name="domain">
-          <ref name="pciDomain"/>
-        </attribute>
-      </optional>
-      <attribute name="bus">
-        <ref name="pciBus"/>
-      </attribute>
-      <attribute name="slot">
-        <ref name="pciSlot"/>
-      </attribute>
-      <attribute name="function">
-        <ref name="pciFunc"/>
-      </attribute>
-    </element>
-  </define>
-  <!--
-      Devices attached to a domain.
-    -->
-  <define name='devices'>
-    <element name='devices'>
-      <interleave>
-       <optional>
-         <ref name='emulator'/>
-       </optional>
-       <zeroOrMore>
-         <choice>
-           <ref name='graphic'/>
-           <ref name='disk'/>
-           <ref name='filesystem'/>
-           <ref name='interface'/>
-           <ref name='console'/>
-            <ref name='sound'/>
-            <ref name='parallel'/>
-            <ref name='serial'/>
-            <ref name='input'/>
-            <ref name='hostdev'/>
-         </choice>
-       </zeroOrMore>
-      </interleave>
-    </element>
-  </define>
-
-  <!--
-      A set of optional features: PAE, APIC and ACPI support
-    -->
-  <define name='features'>
-    <optional>
-      <element name="features">
-        <interleave>
-         <optional>
-           <element name="pae">
-             <empty/>
-           </element>
-         </optional>
-         <optional>
-           <element name="apic">
-             <empty/>
-           </element>
-         </optional>
-         <optional>
-           <element name="acpi">
-             <empty/>
-           </element>
-         </optional>
-       </interleave>
-      </element>
-    </optional>
-  </define>
-
-  <!--
-       Type library
-
-       Our unsignedInt doesn't allow a leading '+' in its lexical form
-       A domain name shoul be made of ascii, numbers, _-+ and is non-empty
-       UUID currently allows only the 32 characters strict syntax
-       memoryKB request at least 4Mbytes though Xen will grow bigger if too low
-    -->
-  <define name='unsignedInt'>
-    <data type='unsignedInt'>
-      <param name="pattern">[0-9]+</param>
-    </data>
-  </define>
-  <define name='countCPU'>
-    <data type='unsignedShort'>
-      <param name="pattern">[0-9]+</param>
-      <param name="minInclusive">1</param>
-    </data>
-  </define>
-  <define name='PortNumber'>
-    <data type='short'>
-      <param name="minInclusive">-1</param>
-    </data>
-  </define>
-  <define name='memoryKB'>
-    <data type='unsignedInt'>
-      <param name="pattern">[0-9]+</param>
-      <param name="minInclusive">4000</param>
-    </data>
-  </define>
-  <define name='domainName'>
-    <data type='string'>
-      <param name="pattern">[A-Za-z0-9_\.\+\-&amp;:/]+</param>
-    </data>
-  </define>
-  <define name='genericName'>
-    <data type='string'>
-      <param name="pattern">[a-zA-Z0-9_\+\-]+</param>
-    </data>
-  </define>
-  <define name='UUID'>
-    <choice>
-      <data type='string'>
-        <param name="pattern">[a-fA-F0-9]{32}</param>
-      </data>
-      <data type='string'>
-        <param name="pattern">[a-fA-F0-9]{8}\-([a-fA-F0-9]{4}\-){3}[a-fA-F0-9]{12}</param>
-      </data>
-    </choice>
-  </define>
-  <define name='filePath'>
-    <data type='string'>
-      <param name="pattern">[a-zA-Z0-9_\.\+\-&amp;/%]+</param>
-    </data>
-  </define>
-  <define name='absFilePath'>
-    <data type='string'>
-      <param name="pattern">/[a-zA-Z0-9_\.\+\-&amp;/%]+</param>
-    </data>
-  </define>
-  <define name='absDirPath'>
-    <data type='string'>
-      <param name="pattern">/[a-zA-Z0-9_\.\+\-&amp;/%]*</param>
-    </data>
-  </define>
-  <define name='devicePath'>
-    <data type='string'>
-      <param name="pattern">/[a-zA-Z0-9_\+\-/%]+</param>
-    </data>
-  </define>
-  <define name='deviceName'>
-    <data type='string'>
-      <param name="pattern">[a-zA-Z0-9_\.\-:/]+</param>
-    </data>
-  </define>
-  <define name='addrMAC'>
-    <data type='string'>
-      <param name="pattern">([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}</param>
-    </data>
-  </define>
-  <define name='addrIP'>
-    <data type='string'>
-      <param name="pattern">([0-2]?[0-9]?[0-9]\.){3}[0-2]?[0-9]?[0-9]</param>
-    </data>
-  </define>
-  <define name='usbId'>
-    <data type='string'>
-      <param name="pattern">(0x)?[0-9a-fA-F]{1,4}</param>
-    </data>
-  </define>
-  <define name='usbAddr'>
-    <data type='string'>
-      <param name="pattern">(0x)?[0-9a-fA-F]{1,3}</param>
-    </data>
-  </define>
-  <define name='pciDomain'>
-    <data type='string'>
-      <param name="pattern">(0x)?[0-9a-fA-F]{1,4}</param>
-    </data>
-  </define>
-  <define name='pciBus'>
-    <data type='string'>
-      <param name="pattern">(0x)?[0-9a-fA-F]{1,2}</param>
-    </data>
-  </define>
-  <define name='pciSlot'>
-    <data type='string'>
-      <param name="pattern">(0x)?[0-1]?[0-9a-fA-F]</param>
-    </data>
-  </define>
-  <define name='pciFunc'>
-    <data type='string'>
-      <param name="pattern">(0x)?[0-7]</param>
-    </data>
-  </define>
-</grammar>
diff --git a/docs/network.rng b/docs/network.rng
deleted file mode 100644 (file)
index d84bb2d..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-<!-- A Relax NG schema for the libvirt network XML format -->
-<element name="network" xmlns="http://relaxng.org/ns/structure/1.0"
-         datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
-  <!-- The name of the network, used to refer to it through the API
-       and in virsh -->
-  <element name="name"><text/></element>
-  <optional>
-    <element name="uuid"><text/></element>
-  </optional>
-  <optional>
-    <!-- The name of the network to be set up; this will back
-         the network on the host -->
-    <element name="bridge">
-      <optional>
-        <attribute name="name"><text/></attribute>
-      </optional>
-      <optional>
-        <attribute name="stp">
-          <choice>
-            <value>on</value>
-            <value>off</value>
-          </choice>
-        </attribute>
-      </optional>
-      <optional>
-        <attribute name="delay"><data type="integer"/></attribute>
-      </optional>
-    </element>
-  </optional>
-  <optional>
-    <!-- The IP element sets up NAT'ing and an optional DHCP server
-         local to the host. -->
-    <!-- FIXME: address, netmask and the start and end of the ranges
-         are IP addresses, and should be validated as such in the scheme -->
-    <element name="ip">
-      <optional>
-        <attribute name="address"><text/></attribute>
-      </optional>
-      <optional>
-        <attribute name="netmask"><text/></attribute>
-      </optional>
-      <!-- Define the range(s) of IP addresses that the DHCP
-           server should hand out -->
-      <element name="dhcp">
-        <zeroOrMore>
-          <element name="range">
-            <attribute name="start"><text/></attribute>
-            <attribute name="end"><text/></attribute>
-          </element>
-        </zeroOrMore>
-      </element>
-    </element>
-  </optional>
-  <optional>
-    <!-- The device through which the bridge is connected to the
-         rest of the network -->
-    <element name="forward">
-      <optional><attribute name="dev"><text/></attribute></optional>
-      <optional>
-        <attribute name="mode">
-          <choice>
-            <value>nat</value>
-            <value>routed</value>
-          </choice>
-        </attribute>
-      </optional>
-    </element>
-  </optional>
-</element>
diff --git a/docs/schemas/.cvsignore b/docs/schemas/.cvsignore
new file mode 100644 (file)
index 0000000..282522d
--- /dev/null
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in
diff --git a/docs/schemas/Makefile.am b/docs/schemas/Makefile.am
new file mode 100644 (file)
index 0000000..c4ef0b1
--- /dev/null
@@ -0,0 +1,12 @@
+
+
+schemadir = $(pkgdatadir)/schemas
+schema_DATA = \
+       domain.rng \
+       network.rng \
+       storagepool.rng \
+       storagevol.rng \
+       nodedev.rng \
+       capability.rng
+
+EXTRA_DIST = $(schema_DATA)
diff --git a/docs/schemas/capability.rng b/docs/schemas/capability.rng
new file mode 100644 (file)
index 0000000..f848da2
--- /dev/null
@@ -0,0 +1,287 @@
+<!-- A Relax NG schema for the libvirt node device XML format -->
+<grammar xmlns="http://relaxng.org/ns/structure/1.0"
+    datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
+  <!-- We handle only document defining a domain -->
+  <start>
+    <ref name='capabilities'/>
+  </start>
+
+
+  <define name='capabilities'>
+    <element name='capabilities'>
+      <ref name='hostcaps'/>
+
+      <zeroOrMore>
+       <ref name='guestcaps'/>
+      </zeroOrMore>
+    </element>
+  </define>
+
+  <define name='hostcaps'>
+    <element name='host'>
+      <element name='cpu'>
+       <element name='arch'>
+         <ref name='archnames'/>
+       </element>
+       <optional>
+         <ref name='cpufeatures'/>
+       </optional>
+      </element>
+      <optional>
+       <ref name='migration'/>
+      </optional>
+      <optional>
+       <ref name='topology'/>
+      </optional>
+    </element>
+  </define>
+
+  <define name='cpufeatures'>
+    <element name='features'>
+      <optional>
+       <element name='pae'><empty/></element>
+      </optional>
+      <optional>
+       <element name='nonpae'><empty/></element>
+      </optional>
+      <optional>
+       <element name='vmx'><empty/></element>
+      </optional>
+      <optional>
+       <element name='svm'><empty/></element>
+      </optional>
+    </element>
+  </define>
+
+  <define name='migration'>
+    <element name='migration_features'>
+      <optional>
+       <element name='live'>
+         <empty/>
+       </element>
+      </optional>
+      <optional>
+       <element name='uri_transports'>
+         <oneOrMore>
+           <element name='uri_transport'>
+             <choice>
+               <value>xenmigr</value>
+             </choice>
+           </element>
+         </oneOrMore>
+       </element>
+      </optional>
+    </element>
+  </define>
+
+  <define name='topology'>
+    <element name='topology'>
+      <element name='cells'>
+       <attribute name='num'>
+         <ref name='uint'/>
+       </attribute>
+       <oneOrMore>
+         <ref name='cell'/>
+       </oneOrMore>
+      </element>
+    </element>
+  </define>
+
+  <define name='cell'>
+    <element name='cell'>
+      <attribute name='id'>
+       <ref name='uint'/>
+      </attribute>
+
+      <optional>
+       <element name='cpus'>
+         <attribute name='num'>
+           <ref name='uint'/>
+         </attribute>
+         <oneOrMore>
+           <ref name='cpu'/>
+         </oneOrMore>
+       </element>
+      </optional>
+    </element>
+  </define>
+
+  <define name='cpu'>
+    <element name='cpu'>
+      <attribute name='id'>
+       <ref name='uint'/>
+      </attribute>
+    </element>
+  </define>
+
+  <define name='guestcaps'>
+    <element name='guest'>
+      <ref name='ostype'/>
+      <ref name='arch'/>
+      <optional>
+       <ref name='features'/>
+      </optional>
+    </element>
+  </define>
+
+  <define name='ostype'>
+    <element name='os_type'>
+      <choice>
+       <value>xen</value> <!-- Xen 3.0 pv -->
+       <value>linux</value> <!-- same as 'xen' - legacy -->
+       <value>hvm</value> <!-- unmodified OS -->
+       <value>exe</value> <!-- For container based virt -->
+       <value>uml</value> <!-- user mode linux -->
+      </choice>
+    </element>
+  </define>
+
+  <define name='arch'>
+    <element name='arch'>
+      <attribute name='name'>
+       <ref name='archnames'/>
+      </attribute>
+      <ref name='wordsize'/>
+      <optional>
+       <ref name='emulator'/>
+      </optional>
+      <optional>
+       <ref name='loader'/>
+      </optional>
+      <zeroOrMore>
+       <ref name='machine'/>
+      </zeroOrMore>
+      <oneOrMore>
+       <ref name='domain'/>
+      </oneOrMore>
+    </element>
+  </define>
+
+  <define name='emulator'>
+    <element name='emulator'>
+      <ref name='path'/>
+    </element>
+  </define>
+
+  <define name='loader'>
+    <element name='loader'>
+      <ref name='path'/>
+    </element>
+  </define>
+
+  <define name='wordsize'>
+    <element name='wordsize'>
+      <choice>
+       <value>31</value>
+       <value>32</value>
+       <value>64</value>
+      </choice>
+    </element>
+  </define>
+
+  <define name='machine'>
+    <element name='machine'>
+      <text/>
+    </element>
+  </define>
+
+  <define name='domain'>
+    <element name='domain'>
+      <attribute name='type'>
+       <choice>
+         <value>qemu</value>
+         <value>kqemu</value>
+         <value>kvm</value>
+         <value>xen</value>
+         <value>uml</value>
+         <value>lxc</value>
+         <value>openvz</value>
+         <value>test</value>
+       </choice>
+      </attribute>
+
+      <optional>
+       <ref name='emulator'/>
+      </optional>
+      <optional>
+       <ref name='machine'/>
+      </optional>
+    </element>
+  </define>
+
+  <define name='features'>
+    <element name='features'>
+      <optional>
+       <element name='pae'>
+         <empty/>
+       </element>
+      </optional>
+      <optional>
+       <element name='nonpae'>
+         <empty/>
+       </element>
+      </optional>
+      <optional>
+       <element name='ia64_be'>
+         <empty/>
+       </element>
+      </optional>
+      <optional>
+       <element name='acpi'>
+         <ref name='featuretoggle'/>
+         <empty/>
+       </element>
+      </optional>
+      <optional>
+       <element name='apic'>
+         <ref name='featuretoggle'/>
+         <empty/>
+       </element>
+      </optional>
+    </element>
+  </define>
+
+  <define name='featuretoggle'>
+    <attribute name='toggle'>
+      <choice>
+       <value>yes</value>
+       <value>no</value>
+      </choice>
+    </attribute>
+    <attribute name='default'>
+      <choice>
+       <value>on</value>
+       <value>off</value>
+      </choice>
+    </attribute>
+  </define>
+
+  <define name='archnames'>
+    <choice>
+      <value>i686</value>
+      <value>x86_64</value>
+      <value>ppc</value>
+      <value>ppc64</value>
+      <value>ia64</value>
+      <value>s390</value>
+      <value>mips</value>
+      <value>mipsel</value>
+      <value>sparc</value>
+    </choice>
+  </define>
+
+
+  <define name='uint'>
+    <data type='string'>
+      <param name="pattern">[0-9]+</param>
+    </data>
+  </define>
+
+  <define name='path'>
+    <data type='string'>
+      <param name="pattern">/[a-zA-Z0-9_\+\-/%]+</param>
+    </data>
+  </define>
+
+</grammar>
+
diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng
new file mode 100644 (file)
index 0000000..6acdbec
--- /dev/null
@@ -0,0 +1,1111 @@
+<?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 -->
+  <start>
+    <ref name='domain'/>
+  </start>
+
+  <!--
+      We handle only document defining a domain
+    -->
+  <define name='domain'>
+    <element name="domain">
+      <ref name='hvs'/>
+      <ref name='ids'/>
+      <interleave>
+        <ref name='os'/>
+        <ref name='clock'/>
+        <ref name='resources'/>
+        <ref name='features'/>
+        <ref name='termination'/>
+       <optional>
+          <ref name='devices'/>
+       </optional>
+      </interleave>
+    </element>
+  </define>
+
+  <define name='hvs'>
+    <attribute name='type'>
+      <choice>
+       <value>xen</value>
+       <value>kvm</value>
+       <value>kqemu</value>
+       <value>qemu</value>
+       <value>lxc</value>
+       <value>openvz</value>
+       <value>test</value>
+      </choice>
+    </attribute>
+  </define>
+
+  <define name='os'>
+    <choice>
+      <ref name='osxen'/>
+      <ref name='oshvm'/>
+      <ref name='osexe'/>
+    </choice>
+  </define>
+
+  <define name='osxen'>
+    <choice>
+      <group>
+       <optional>
+          <ref name='bootloader'/>
+       </optional>
+       <element name='os'>
+         <ref name='ostypexen'/>
+          <ref name='osbootkernel'/>
+       </element>
+      </group>
+      <group>
+       <ref name='bootloader'/>
+       <optional>
+         <element name='os'>
+           <ref name='ostypexen'/>
+           <optional>
+              <ref name='osbootkernel'/>
+           </optional>
+         </element>
+       </optional>
+      </group>
+    </choice>
+  </define>
+
+
+  <define name='oshvm'>
+    <element name='os'>
+      <ref name='ostypehvm'/>
+      <interleave>
+       <optional>
+         <element name='loader'>
+           <ref name='absFilePath'/>
+         </element>
+       </optional>
+       <choice>
+          <ref name='osbootkernel'/>
+          <ref name='osbootdev'/>
+       </choice>
+      </interleave>
+    </element>
+  </define>
+
+
+  <define name='ostypexen'>
+    <element name='type'>
+      <optional>
+       <attribute name='arch'>
+         <choice>
+           <value>i686</value>
+           <value>x86_64</value>
+           <value>ia64</value>
+         </choice>
+       </attribute>
+      </optional>
+      <optional>
+       <attribute name='machine'>
+         <choice>
+           <value>xenpv</value>
+           <value>xenner</value>
+         </choice>
+       </attribute>
+      </optional>
+      <choice>
+       <value>xen</value>
+       <value>linux</value>
+      </choice>
+    </element>
+  </define>
+
+  <define name='ostypehvm'>
+    <element name='type'>
+      <optional>
+       <choice>
+         <ref name='hvmx86'/>
+         <ref name='hvmmips'/>
+         <ref name='hvmsparc'/>
+         <ref name='hvmppc'/>
+       </choice>
+      </optional>
+      <value>hvm</value>
+    </element>
+  </define>
+
+  <define name='hvmx86'>
+    <group>
+      <attribute name='arch'>
+       <choice>
+         <value>i686</value>
+         <value>x86_64</value>
+       </choice>
+      </attribute>
+      <attribute name='machine'>
+       <choice>
+         <value>xenfv</value>
+         <value>pc</value>
+         <value>isapc</value>
+       </choice>
+      </attribute>
+    </group>
+  </define>
+
+  <define name='hvmmips'>
+    <group>
+      <attribute name='arch'>
+        <value>mips</value>
+      </attribute>
+      <attribute name='machine'>
+        <value>mips</value>
+      </attribute>
+    </group>
+  </define>
+
+  <define name='hvmsparc'>
+    <group>
+      <attribute name='arch'>
+       <value>sparc</value>
+      </attribute>
+      <attribute name='machine'>
+       <value>sun4m</value>
+      </attribute>
+    </group>
+  </define>
+
+  <define name='hvmppc'>
+    <group>
+      <attribute name='arch'>
+       <value>ppc</value>
+      </attribute>
+      <attribute name='machine'>
+       <choice>
+         <value>g3bw</value>
+         <value>mac99</value>
+         <value>prep</value>
+       </choice>
+      </attribute>
+    </group>
+  </define>
+
+
+  <define name='osexe'>
+    <element name='os'>
+      <element name='type'>
+       <value>exe</value>
+      </element>
+      <interleave>
+       <optional>
+         <element name='init'>
+           <ref name='absFilePath'/>
+         </element>
+       </optional>
+      </interleave>
+    </element>
+  </define>
+
+
+
+  <!--
+      The Identifiers can be:
+      - an optional id attribute with a number on the domain element
+      - a mandatory name
+      - an optional uuid
+    -->
+  <define name='ids'>
+    <optional>
+      <attribute name='id'>
+        <ref name='unsignedInt'/>
+      </attribute>
+    </optional>
+    <interleave>
+      <element name="name">
+        <ref name='domainName'/>
+      </element>
+      <optional>
+        <element name="uuid">
+          <ref name='UUID'/>
+        </element>
+      </optional>
+    </interleave>
+  </define>
+
+  <!--
+      Resources usage defines the amount of memory (maximum and possibly
+      current usage) and number of virtual CPUs used by that domain.
+      We can't check here the rule that currentMemory <= memory
+    -->
+
+  <define name='resources'>
+    <interleave>
+      <element name='memory'>
+        <ref name='memoryKB'/>
+      </element>
+      <optional>
+        <element name='currentMemory'>
+          <ref name='memoryKB'/>
+        </element>
+      </optional>
+      <optional>
+        <element name='vcpu'>
+          <optional>
+            <attribute name='cpuset' />
+          </optional>
+          <ref name='countCPU'/>
+        </element>
+      </optional>
+    </interleave>
+  </define>
+
+  <define name='clock'>
+    <optional>
+      <element name='clock'>
+        <attribute name='offset'>
+          <choice>
+            <value>localtime</value>
+            <value>utc</value>
+          </choice>
+        </attribute>
+        <empty/>
+      </element>
+    </optional>
+  </define>
+
+  <!--
+      A bootloader may be used to extract the OS information instead of
+      defining the OS parameter in the instance. It points just to the
+      binary or script used to extract the data from the first disk device.
+    -->
+  <define name='bootloader'>
+    <interleave>
+      <element name='bootloader'>
+       <choice>
+         <ref name='absFilePath'/>
+         <empty/>
+       </choice>
+      </element>
+      <optional>
+       <element name='bootloader_args'>
+         <text/>
+       </element>
+      </optional>
+    </interleave>
+  </define>
+
+  <define name='osbootkernel'>
+    <interleave>
+      <element name='kernel'>
+        <ref name='absFilePath'/>
+      </element>
+      <optional>
+        <element name='initrd'>
+         <ref name='absFilePath'/>
+       </element>
+      </optional>
+      <optional>
+        <element name='root'>
+          <ref name='devicePath'/>
+        </element>
+      </optional>
+      <optional>
+        <element name='cmdline'>
+         <text/>
+       </element>
+      </optional>
+    </interleave>
+  </define>
+
+  <define name='osbootdev'>
+    <element name='boot'>
+      <attribute name='dev'>
+        <choice>
+          <value>hd</value>
+          <value>fd</value>
+          <value>cdrom</value>
+          <value>network</value>
+        </choice>
+      </attribute>
+      <empty/>
+    </element>
+  </define>
+
+
+  <define name='diskspec'>
+    <optional>
+      <ref name='driver'/>
+    </optional>
+    <ref name='target'/>
+    <optional>
+      <element name='readonly'>
+        <empty/>
+      </element>
+    </optional>
+    <optional>
+      <element name='shareable'>
+        <empty/>
+      </element>
+    </optional>
+  </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
+
+    -->
+  <define name='disk'>
+    <element name='disk'>
+      <optional>
+       <attribute name='device'>
+         <choice>
+           <value>floppy</value>
+           <value>disk</value>
+           <value>cdrom</value>
+         </choice>
+       </attribute>
+      </optional>
+      <choice>
+        <group>
+          <attribute name='type'>
+           <value>file</value>
+          </attribute>
+         <interleave>
+           <optional>
+             <element name='source'>
+               <attribute name='file'>
+                 <ref name='absFilePath'/>
+               </attribute>
+               <empty/>
+             </element>
+           </optional>
+            <ref name='diskspec'/>
+         </interleave>
+        </group>
+        <group>
+          <attribute name='type'>
+           <value>block</value>
+         </attribute>
+         <interleave>
+           <optional>
+             <element name='source'>
+               <attribute name='dev'>
+                 <ref name='deviceName'/>
+               </attribute>
+               <empty/>
+             </element>
+           </optional>
+            <ref name='diskspec'/>
+         </interleave>
+        </group>
+        <ref name='diskspec'/>
+      </choice>
+    </element>
+  </define>
+
+  <define name='target'>
+    <element name='target'>
+      <attribute name='dev'>
+       <ref name='deviceName'/>
+      </attribute>
+      <optional>
+         <attribute name='bus'>
+           <choice>
+             <value>ide</value>
+             <value>virtio</value>
+             <value>fdc</value>
+             <value>xen</value>
+             <value>usb</value>
+           </choice>
+         </attribute>
+      </optional>
+    </element>
+  </define>
+
+  <!--
+      Disk may use a special driver for access. Currently this is
+      only defined for Xen for tap/aio and file, but will certainly be
+      extended in the future, and libvirt doesn't look for specific values.
+    -->
+  <define name='driver'>
+    <element name='driver'>
+      <attribute name='name'>
+       <ref name='genericName'/>
+      </attribute>
+      <optional>
+        <attribute name='type'>
+         <ref name='genericName'/>
+       </attribute>
+      </optional>
+      <empty/>
+    </element>
+  </define>
+
+  <define name='filesystem'>
+    <element name='filesystem'>
+      <choice>
+        <group>
+          <attribute name='type'>
+           <value>file</value>
+          </attribute>
+         <interleave>
+           <element name='source'>
+             <attribute name='file'>
+               <ref name='absFilePath'/>
+             </attribute>
+             <empty/>
+           </element>
+            <ref name='filesystemtgt'/>
+         </interleave>
+        </group>
+        <group>
+          <attribute name='type'>
+           <value>block</value>
+         </attribute>
+         <interleave>
+           <element name='source'>
+             <attribute name='dev'>
+               <ref name='deviceName'/>
+             </attribute>
+             <empty/>
+           </element>
+            <ref name='filesystemtgt'/>
+         </interleave>
+        </group>
+        <group>
+          <attribute name='type'>
+           <value>mount</value>
+         </attribute>
+         <interleave>
+           <element name='source'>
+             <attribute name='dir'>
+               <ref name='absFilePath'/>
+             </attribute>
+             <empty/>
+           </element>
+            <ref name='filesystemtgt'/>
+         </interleave>
+        </group>
+        <group>
+          <attribute name='type'>
+           <value>template</value>
+         </attribute>
+         <interleave>
+           <element name='source'>
+             <attribute name='name'>
+               <ref name='genericName'/>
+             </attribute>
+             <empty/>
+           </element>
+            <ref name='filesystemtgt'/>
+         </interleave>
+        </group>
+      </choice>
+    </element>
+  </define>
+
+  <define name='filesystemtgt'>
+    <element name='target'>
+      <attribute name='dir'>
+       <ref name='absDirPath'/>
+      </attribute>
+      <empty/>
+    </element>
+  </define>
+
+  <!--
+      An interface description can either be of type bridge in which case
+      it will use a bridging source, or of type ethernet which uses a device
+      source and a device target instead. They both share a set of interface
+      options. FIXME
+    -->
+  <define name='interface'>
+    <element name='interface'>
+      <choice>
+        <group>
+          <attribute name='type'>
+            <value>bridge</value>
+          </attribute>
+         <interleave>
+            <optional>
+             <element name='source'>
+               <attribute name='bridge'>
+                 <ref name='deviceName'/>
+               </attribute>
+               <empty/>
+             </element>
+            </optional>
+           <ref name='interface-options'/>
+         </interleave>
+       </group>
+        <group>
+          <attribute name='type'>
+            <value>ethernet</value>
+          </attribute>
+         <interleave>
+            <optional>
+             <element name='source'>
+               <attribute name='dev'>
+                 <ref name='deviceName'/>
+               </attribute>
+               <empty/>
+             </element>
+            </optional>
+           <ref name='interface-options'/>
+         </interleave>
+       </group>
+        <group>
+          <attribute name='type'>
+            <value>network</value>
+          </attribute>
+         <interleave>
+           <element name='source'>
+             <attribute name='network'>
+               <ref name='deviceName'/>
+             </attribute>
+             <empty/>
+           </element>
+           <ref name='interface-options'/>
+         </interleave>
+       </group>
+        <group>
+          <attribute name='type'>
+            <value>user</value>
+          </attribute>
+         <interleave>
+           <ref name='interface-options'/>
+         </interleave>
+       </group>
+      </choice>
+    </element>
+  </define>
+
+  <!--
+      The interface options possible are:
+        - the MAC address
+       - the IP address bound to the interface
+       - the name of the script used to set up the binding
+       - the target device used
+    -->
+  <define name='interface-options'>
+    <interleave>
+      <optional>
+       <element name='target'>
+         <attribute name='dev'>
+           <ref name='deviceName'/>
+         </attribute>
+         <empty/>
+       </element>
+      </optional>
+      <optional>
+       <element name='mac'>
+         <attribute name='address'>
+           <ref name='addrMAC'/>
+           </attribute>
+         <empty/>
+       </element>
+      </optional>
+      <optional>
+       <element name='ip'>
+         <attribute name='address'>
+           <ref name='addrIP'/>
+         </attribute>
+         <empty/>
+       </element>
+      </optional>
+      <optional>
+       <element name='script'>
+         <attribute name='path'>
+           <ref name='filePath'/>
+         </attribute>
+         <empty/>
+       </element>
+      </optional>
+      <optional>
+       <element name='model'>
+         <attribute name='type' />
+         <empty/>
+       </element>
+      </optional>
+    </interleave>
+  </define>
+
+  <!--
+      An emulator description is just a path to the binary used for the task
+    -->
+  <define name='emulator'>
+    <element name='emulator'>
+      <ref name='absFilePath'/>
+    </element>
+  </define>
+
+  <!--
+      A graphic description, currently in Xen only 2 types are supported:
+        - sdl with optional display, xauth and fullscreen
+       - vnc with a required port and optional listen IP address, password
+          and keymap
+    -->
+  <define name='graphic'>
+    <element name='graphics'>
+      <choice>
+       <group>
+          <attribute name='type'>
+           <value>sdl</value>
+         </attribute>
+         <optional>
+           <attribute name='display'>
+             <text/>
+           </attribute>
+         </optional>
+         <optional>
+           <attribute name='xauth'>
+             <text/>
+           </attribute>
+         </optional>
+         <optional>
+           <attribute name='fullscreen'>
+             <choice>
+               <value>yes</value>
+               <value>no</value>
+             </choice>
+           </attribute>
+         </optional>
+       </group>
+       <group>
+          <attribute name='type'>
+           <value>vnc</value>
+         </attribute>
+         <optional>
+            <attribute name='port'>
+             <ref name='PortNumber'/>
+           </attribute>
+         </optional>
+         <optional>
+           <attribute name='autoport'>
+             <choice>
+               <value>yes</value>
+               <value>no</value>
+             </choice>
+           </attribute>
+         </optional>
+         <optional>
+           <attribute name='listen'>
+             <ref name='addrIP'/>
+           </attribute>
+         </optional>
+         <optional>
+           <attribute name='passwd'>
+             <text/>
+           </attribute>
+         </optional>
+          <optional>
+            <attribute name='keymap'>
+              <text/>
+            </attribute>
+          </optional>
+       </group>
+      </choice>
+    </element>
+  </define>
+
+  <!--
+      When a domain terminates multiple policies can be applied depending
+      on how it ended:
+    -->
+  <define name='termination'>
+    <interleave>
+      <optional>
+        <element name='on_reboot'>
+         <ref name='offOptions'/>
+       </element>
+      </optional>
+      <optional>
+        <element name='on_poweroff'>
+         <ref name='offOptions'/>
+       </element>
+      </optional>
+      <optional>
+        <element name='on_crash'>
+         <ref name='offOptions'/>
+       </element>
+      </optional>
+    </interleave>
+  </define>
+
+  <!--
+      Options when a domain terminates:
+      destroy: The domain is cleaned up
+      restart: A new domain is started in place of the old one
+      preserve: The domain will remain in memory until it is destroyed manually
+      rename-restart: a variant of the previous one but where the old domain is
+                      renamed before being saved to allow a restart
+    -->
+  <define name='offOptions'>
+    <choice>
+      <value>destroy</value>
+      <value>restart</value>
+      <value>preserve</value>
+      <value>rename-restart</value>
+    </choice>
+  </define>
+
+  <!--
+      Specific setup for a qemu emulated character device.  Note: this
+      definition doesn't fully specify the constraints on this node.
+    -->
+  <define name='qemucdev'>
+    <attribute name='type'>
+      <choice>
+        <value>dev</value>
+        <value>file</value>
+        <value>pipe</value>
+        <value>unix</value>
+        <value>tcp</value>
+        <value>udp</value>
+        <value>null</value>
+        <value>stdio</value>
+        <value>vc</value>
+        <value>pty</value>
+      </choice>
+    </attribute>
+    
+    <interleave>
+      <optional>
+        <oneOrMore>
+          <element name='source'>
+            <optional>
+              <attribute name='mode' />
+            </optional>
+            <optional>
+              <attribute name='path' />
+            </optional>
+            <optional>
+              <attribute name='host' />
+            </optional>
+            <optional>
+              <attribute name='service' />
+            </optional>
+            <optional>
+              <attribute name='wiremode' />
+            </optional>
+          </element>
+        </oneOrMore>
+      </optional>
+      <optional>
+        <element name='protocol'>
+          <optional>
+            <attribute name='type' />
+          </optional>
+        </element>
+      </optional>
+      <optional>
+        <element name='target'>
+          <optional>
+            <attribute name='port' />
+          </optional>
+        </element>
+      </optional>
+    </interleave>
+  </define>
+
+  <!--
+      The description for a console
+      just a tty device
+    -->
+  <define name='console'>
+    <element name='console'>
+      <choice>
+        <group>
+          <optional>
+            <attribute name='tty'>
+              <ref name='devicePath'/>
+            </attribute>
+          </optional>
+          <empty/>
+        </group>
+        <ref name='qemucdev' />
+      </choice>
+    </element>
+  </define>
+
+  <define name='sound'>
+    <element name='sound'>
+      <attribute name='model'>
+        <choice>
+          <value>sb16</value>
+          <value>es1370</value>
+          <value>pcspk</value>
+        </choice>
+      </attribute>
+    </element>
+  </define>
+
+  <define name='parallel'>
+    <element name='parallel'>
+      <ref name='qemucdev' />
+    </element>
+  </define>
+
+  <define name='serial'>
+    <element name='serial'>
+      <ref name='qemucdev' />
+    </element>
+  </define>
+
+  <define name='input'>
+    <element name='input'>
+      <attribute name='type'>
+        <choice>
+          <value>tablet</value>
+          <value>mouse</value>
+        </choice>
+      </attribute>
+      <optional>
+        <attribute name='bus'>
+          <choice>
+            <value>ps2</value>
+            <value>usb</value>
+            <value>xen</value>
+          </choice>
+        </attribute>
+      </optional>
+    </element>
+  </define>
+
+  <define name='hostdev'>
+    <element name='hostdev'>
+      <optional>
+       <attribute name='mode'>
+         <choice>
+           <value>subsystem</value>
+           <value>capabilities</value>
+         </choice>
+       </attribute>
+        <attribute name='type'>
+          <choice>
+           <value>usb</value>
+           <value>pci</value>
+          </choice>
+        </attribute>
+      </optional>
+      <group>
+          <element name='source'>
+            <choice>
+              <ref name="usbproduct"/>
+              <ref name="usbaddress"/>
+              <ref name="pciaddress"/>
+            </choice>
+          </element>
+      </group>
+    </element>
+  </define>
+
+  <define name="usbproduct">
+    <element name="vendor">
+      <attribute name="id">
+          <ref name="usbId"/>
+      </attribute>
+    </element>
+    <element name="product">
+      <attribute name="id">
+          <ref name="usbId"/>
+      </attribute>
+    </element>
+  </define>
+  
+  <define name="usbaddress">
+    <element name="address">
+      <attribute name="bus">
+        <ref name="usbAddr"/>
+      </attribute>
+      <attribute name="device">
+        <ref name="usbAddr"/>
+      </attribute>
+    </element>
+  </define>
+
+  <define name="pciaddress">
+    <element name="address">
+      <optional>
+        <attribute name="domain">
+          <ref name="pciDomain"/>
+        </attribute>
+      </optional>
+      <attribute name="bus">
+        <ref name="pciBus"/>
+      </attribute>
+      <attribute name="slot">
+        <ref name="pciSlot"/>
+      </attribute>
+      <attribute name="function">
+        <ref name="pciFunc"/>
+      </attribute>
+    </element>
+  </define>
+  <!--
+      Devices attached to a domain.
+    -->
+  <define name='devices'>
+    <element name='devices'>
+      <interleave>
+       <optional>
+         <ref name='emulator'/>
+       </optional>
+       <zeroOrMore>
+         <choice>
+           <ref name='graphic'/>
+           <ref name='disk'/>
+           <ref name='filesystem'/>
+           <ref name='interface'/>
+           <ref name='console'/>
+            <ref name='sound'/>
+            <ref name='parallel'/>
+            <ref name='serial'/>
+            <ref name='input'/>
+            <ref name='hostdev'/>
+         </choice>
+       </zeroOrMore>
+      </interleave>
+    </element>
+  </define>
+
+  <!--
+      A set of optional features: PAE, APIC and ACPI support
+    -->
+  <define name='features'>
+    <optional>
+      <element name="features">
+        <interleave>
+         <optional>
+           <element name="pae">
+             <empty/>
+           </element>
+         </optional>
+         <optional>
+           <element name="apic">
+             <empty/>
+           </element>
+         </optional>
+         <optional>
+           <element name="acpi">
+             <empty/>
+           </element>
+         </optional>
+       </interleave>
+      </element>
+    </optional>
+  </define>
+
+  <!--
+       Type library
+
+       Our unsignedInt doesn't allow a leading '+' in its lexical form
+       A domain name shoul be made of ascii, numbers, _-+ and is non-empty
+       UUID currently allows only the 32 characters strict syntax
+       memoryKB request at least 4Mbytes though Xen will grow bigger if too low
+    -->
+  <define name='unsignedInt'>
+    <data type='unsignedInt'>
+      <param name="pattern">[0-9]+</param>
+    </data>
+  </define>
+  <define name='countCPU'>
+    <data type='unsignedShort'>
+      <param name="pattern">[0-9]+</param>
+      <param name="minInclusive">1</param>
+    </data>
+  </define>
+  <define name='PortNumber'>
+    <data type='short'>
+      <param name="minInclusive">-1</param>
+    </data>
+  </define>
+  <define name='memoryKB'>
+    <data type='unsignedInt'>
+      <param name="pattern">[0-9]+</param>
+      <param name="minInclusive">4000</param>
+    </data>
+  </define>
+  <define name='domainName'>
+    <data type='string'>
+      <param name="pattern">[A-Za-z0-9_\.\+\-&amp;:/]+</param>
+    </data>
+  </define>
+  <define name='genericName'>
+    <data type='string'>
+      <param name="pattern">[a-zA-Z0-9_\+\-]+</param>
+    </data>
+  </define>
+  <define name='UUID'>
+    <choice>
+      <data type='string'>
+        <param name="pattern">[a-fA-F0-9]{32}</param>
+      </data>
+      <data type='string'>
+        <param name="pattern">[a-fA-F0-9]{8}\-([a-fA-F0-9]{4}\-){3}[a-fA-F0-9]{12}</param>
+      </data>
+    </choice>
+  </define>
+  <define name='filePath'>
+    <data type='string'>
+      <param name="pattern">[a-zA-Z0-9_\.\+\-&amp;/%]+</param>
+    </data>
+  </define>
+  <define name='absFilePath'>
+    <data type='string'>
+      <param name="pattern">/[a-zA-Z0-9_\.\+\-&amp;/%]+</param>
+    </data>
+  </define>
+  <define name='absDirPath'>
+    <data type='string'>
+      <param name="pattern">/[a-zA-Z0-9_\.\+\-&amp;/%]*</param>
+    </data>
+  </define>
+  <define name='devicePath'>
+    <data type='string'>
+      <param name="pattern">/[a-zA-Z0-9_\+\-/%]+</param>
+    </data>
+  </define>
+  <define name='deviceName'>
+    <data type='string'>
+      <param name="pattern">[a-zA-Z0-9_\.\-:/]+</param>
+    </data>
+  </define>
+  <define name='addrMAC'>
+    <data type='string'>
+      <param name="pattern">([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}</param>
+    </data>
+  </define>
+  <define name='addrIP'>
+    <data type='string'>
+      <param name="pattern">([0-2]?[0-9]?[0-9]\.){3}[0-2]?[0-9]?[0-9]</param>
+    </data>
+  </define>
+  <define name='usbId'>
+    <data type='string'>
+      <param name="pattern">(0x)?[0-9a-fA-F]{1,4}</param>
+    </data>
+  </define>
+  <define name='usbAddr'>
+    <data type='string'>
+      <param name="pattern">(0x)?[0-9a-fA-F]{1,3}</param>
+    </data>
+  </define>
+  <define name='pciDomain'>
+    <data type='string'>
+      <param name="pattern">(0x)?[0-9a-fA-F]{1,4}</param>
+    </data>
+  </define>
+  <define name='pciBus'>
+    <data type='string'>
+      <param name="pattern">(0x)?[0-9a-fA-F]{1,2}</param>
+    </data>
+  </define>
+  <define name='pciSlot'>
+    <data type='string'>
+      <param name="pattern">(0x)?[0-1]?[0-9a-fA-F]</param>
+    </data>
+  </define>
+  <define name='pciFunc'>
+    <data type='string'>
+      <param name="pattern">(0x)?[0-7]</param>
+    </data>
+  </define>
+</grammar>
diff --git a/docs/schemas/network.rng b/docs/schemas/network.rng
new file mode 100644 (file)
index 0000000..34c0163
--- /dev/null
@@ -0,0 +1,69 @@
+<!-- A Relax NG schema for the libvirt network XML format -->
+<element name="network" xmlns="http://relaxng.org/ns/structure/1.0"
+         datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
+  <!-- The name of the network, used to refer to it through the API
+       and in virsh -->
+  <element name="name"><text/></element>
+  <optional>
+    <element name="uuid"><text/></element>
+  </optional>
+  <optional>
+    <!-- The name of the network to be set up; this will back
+         the network on the host -->
+    <element name="bridge">
+      <optional>
+        <attribute name="name"><text/></attribute>
+      </optional>
+      <optional>
+        <attribute name="stp">
+          <choice>
+            <value>on</value>
+            <value>off</value>
+          </choice>
+        </attribute>
+      </optional>
+      <optional>
+        <attribute name="delay"><data type="integer"/></attribute>
+      </optional>
+    </element>
+  </optional>
+  <optional>
+    <!-- The device through which the bridge is connected to the
+         rest of the network -->
+    <element name="forward">
+      <optional><attribute name="dev"><text/></attribute></optional>
+      <optional>
+        <attribute name="mode">
+          <choice>
+            <value>nat</value>
+            <value>routed</value>
+          </choice>
+        </attribute>
+      </optional>
+    </element>
+  </optional>
+  <optional>
+    <!-- The IP element sets up NAT'ing and an optional DHCP server
+         local to the host. -->
+    <!-- FIXME: address, netmask and the start and end of the ranges
+         are IP addresses, and should be validated as such in the scheme -->
+    <element name="ip">
+      <optional>
+        <attribute name="address"><text/></attribute>
+      </optional>
+      <optional>
+        <attribute name="netmask"><text/></attribute>
+      </optional>
+      <!-- Define the range(s) of IP addresses that the DHCP
+           server should hand out -->
+      <element name="dhcp">
+        <zeroOrMore>
+          <element name="range">
+            <attribute name="start"><text/></attribute>
+            <attribute name="end"><text/></attribute>
+          </element>
+        </zeroOrMore>
+      </element>
+    </element>
+  </optional>
+</element>
diff --git a/docs/schemas/nodedev.rng b/docs/schemas/nodedev.rng
new file mode 100644 (file)
index 0000000..ae6654c
--- /dev/null
@@ -0,0 +1,360 @@
+<!-- A Relax NG schema for the libvirt node device XML format -->
+<grammar xmlns="http://relaxng.org/ns/structure/1.0"
+    datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
+  <!-- We handle only document defining a domain -->
+  <start>
+    <ref name='device'/>
+  </start>
+
+  <!--
+      We handle only document defining a domain
+    -->
+  <define name='device'>
+    <element name="device">
+      <!-- The name of the network, used to refer to it through the API
+         and in virsh -->
+      <element name="name"><text/></element>
+      <optional>
+        <element name="parent"><text/></element>
+      </optional>
+
+      <zeroOrMore>
+       <ref name="capability"/>
+      </zeroOrMore>
+    </element>
+  </define>
+
+  <define name='capability'>
+    <element name="capability">
+      <choice>
+       <ref name="capsystem"/>
+       <ref name="cappcidev"/>
+       <ref name="capusbdev"/>
+       <ref name="capusbinterface"/>
+       <ref name="capnet"/>
+       <ref name="capscsihost"/>
+       <ref name="capscsi"/>
+       <ref name="capstorage"/>
+      </choice>
+    </element>
+  </define>
+
+  <define name='capsystem'>
+    <attribute name='type'>
+      <value>system</value>
+    </attribute>
+
+    <optional>
+      <element name='product'><text/></element>
+    </optional>
+
+    <element name='hardware'>
+      <optional>
+       <element name='vendor'><text/></element>
+      </optional>
+      <optional>
+       <element name='version'><text/></element>
+      </optional>
+      <optional>
+       <element name='serial'><text/></element>
+      </optional>
+
+      <element name='uuid'>
+       <ref name='uuid'/>
+      </element>
+    </element>
+
+
+    <element name='firmware'>
+      <optional>
+       <element name='vendor'><text/></element>
+      </optional>
+      <optional>
+       <element name='version'><text/></element>
+      </optional>
+      <optional>
+       <element name='release_date'><text/></element>
+      </optional>
+    </element>
+  </define>
+
+  <define name='cappcidev'>
+    <attribute name='type'>
+      <value>pci</value>
+    </attribute>
+
+    <element name='domain'>
+      <ref name='uint'/>
+    </element>
+    <element name='bus'>
+      <ref name='uint'/>
+    </element>
+    <element name='slot'>
+      <ref name='uint'/>
+    </element>
+    <element name='function'>
+      <ref name='uint'/>
+    </element>
+
+    <element name='product'>
+      <attribute name='id'>
+       <ref name='hexuint'/>
+      </attribute>
+
+      <choice>
+       <text/>
+       <empty/>
+      </choice>
+    </element>
+
+    <element name='vendor'>
+      <attribute name='id'>
+       <ref name='hexuint'/>
+      </attribute>
+
+      <choice>
+       <text/>
+       <empty/>
+      </choice>
+    </element>
+
+  </define>
+
+  <define name='capusbdev'>
+    <attribute name='type'>
+      <value>usb_device</value>
+    </attribute>
+
+    <element name='bus'>
+      <ref name='uint'/>
+    </element>
+    <element name='device'>
+      <ref name='uint'/>
+    </element>
+
+    <element name='product'>
+      <attribute name='id'>
+       <ref name='hexuint'/>
+      </attribute>
+
+      <choice>
+       <text/>
+       <empty/>
+      </choice>
+    </element>
+
+    <element name='vendor'>
+      <attribute name='id'>
+       <ref name='hexuint'/>
+      </attribute>
+
+      <choice>
+       <text/>
+       <empty/>
+      </choice>
+    </element>
+  </define>
+
+  <define name='capusbinterface'>
+    <attribute name='type'>
+      <value>usb</value>
+    </attribute>
+
+    <element name='number'>
+      <ref name='uint'/>
+    </element>
+    <element name='class'>
+      <ref name='uint'/>
+    </element>
+    <element name='subclass'>
+      <ref name='uint'/>
+    </element>
+    <element name='protocol'>
+      <ref name='uint'/>
+    </element>
+
+    <optional>
+      <element name='description'>
+       <text/>
+      </element>
+    </optional>
+  </define>
+
+  <define name='capnet'>
+    <attribute name='type'>
+      <value>net</value>
+    </attribute>
+
+    <element name='interface'>
+      <text/>
+    </element>
+    <optional>
+      <element name='address'>
+       <ref name='mac'/>
+      </element>
+    </optional>
+
+    <zeroOrMore>
+      <ref name='subcapnet'/>
+    </zeroOrMore>
+  </define>
+
+  <define name='subcapnet'>
+    <element name='capability'>
+      <choice>
+       <ref name='subcapnet80203'/>
+       <ref name='subcapnet80211'/>
+      </choice>
+    </element>
+  </define>
+
+  <define name='subcapnet80203'>
+    <attribute name='type'>
+      <value>80203</value>
+    </attribute>
+  </define>
+
+  <define name='subcapnet80211'>
+    <attribute name='type'>
+      <value>80211</value>
+    </attribute>
+  </define>
+
+
+  <define name='capscsihost'>
+    <attribute name='type'>
+      <value>scsi_host</value>
+    </attribute>
+
+    <element name='host'>
+      <ref name='uint'/>
+    </element>
+  </define>
+
+  <define name='capscsi'>
+    <attribute name='type'>
+      <value>scsi</value>
+    </attribute>
+
+    <element name='host'>
+      <ref name='uint'/>
+    </element>
+    <element name='bus'>
+      <ref name='uint'/>
+    </element>
+    <element name='target'>
+      <ref name='uint'/>
+    </element>
+    <element name='lun'>
+      <ref name='uint'/>
+    </element>
+
+    <element name='type'>
+      <text/>
+    </element>
+  </define>
+
+  <define name='capstorage'>
+    <attribute name='type'>
+      <value>storage</value>
+    </attribute>
+
+    <element name='block'>
+      <ref name='path'/>
+    </element>
+
+    <optional>
+      <element name='bus'>
+       <text/>
+      </element>
+    </optional>
+    <optional>
+      <element name='drive_type'>
+       <text/>
+      </element>
+    </optional>
+    <optional>
+      <element name='model'>
+       <text/>
+       </element>
+    </optional>
+    <optional>
+      <element name='vendor'>
+       <text/>
+      </element>
+    </optional>
+
+    <choice>
+      <ref name='capstorageremoveable'/>
+      <ref name='capstoragefixed'/>
+    </choice>
+
+    <optional>
+      <element name='capability'>
+       <attribute name='type'>
+         <value>hotpluggable</value>
+       </attribute>
+      </element>
+    </optional>
+  </define>
+
+  <define name='capstorageremoveable'>
+    <element name='capability'>
+      <attribute name='type'>
+       <value>removable</value>
+      </attribute>
+      <element name='media_available'>
+       <choice>
+         <value>1</value>
+         <value>0</value>
+       </choice>
+      </element>
+
+      <element name='media_size'>
+       <ref name='uint'/>
+      </element>
+    </element>
+  </define>
+
+  <define name='capstoragefixed'>
+    <element name='size'>
+      <ref name='uint'/>
+    </element>
+  </define>
+
+  <define name='uuid'>
+    <choice>
+      <data type='string'>
+        <param name="pattern">[a-fA-F0-9]{32}</param>
+      </data>
+      <data type='string'>
+        <param name="pattern">[a-fA-F0-9]{8}\-([a-fA-F0-9]{4}\-){3}[a-fA-F0-9]{12}</param>
+      </data>
+    </choice>
+  </define>
+
+  <define name='uint'>
+    <data type='string'>
+      <param name="pattern">[0-9]+</param>
+    </data>
+  </define>
+
+  <define name='hexuint'>
+    <data type='string'>
+      <param name="pattern">(0x)?[0-9a-f]+</param>
+    </data>
+  </define>
+
+  <define name='mac'>
+    <data type='string'>
+      <param name="pattern">([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}</param>
+    </data>
+  </define>
+
+  <define name='path'>
+    <data type='string'>
+      <param name="pattern">/[a-zA-Z0-9_\+\-/%]+</param>
+    </data>
+  </define>
+
+</grammar>
diff --git a/docs/schemas/storagepool.rng b/docs/schemas/storagepool.rng
new file mode 100644 (file)
index 0000000..e152e19
--- /dev/null
@@ -0,0 +1,371 @@
+<!-- A Relax NG schema for the libvirt node device XML format -->
+<grammar xmlns="http://relaxng.org/ns/structure/1.0"
+    datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
+  <!-- We handle only document defining a domain -->
+  <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'/>
+      </choice>
+    </element>
+  </define>
+
+  <define name='pooldir'>
+    <attribute name='type'>
+      <value>dir</value>
+    </attribute>
+    <ref name='commonmetadata'/>
+    <ref name='sizing'/>
+    <ref name='sourcedir'/>
+    <ref name='target'/>
+  </define>
+
+  <define name='poolfs'>
+    <attribute name='type'>
+      <value>fs</value>
+    </attribute>
+    <ref name='commonmetadata'/>
+    <ref name='sizing'/>
+    <ref name='sourcefs'/>
+    <ref name='target'/>
+  </define>
+
+  <define name='poolnetfs'>
+    <attribute name='type'>
+      <value>netfs</value>
+    </attribute>
+    <ref name='commonmetadata'/>
+    <ref name='sizing'/>
+    <ref name='sourcenetfs'/>
+    <ref name='target'/>
+  </define>
+
+  <define name='poollogical'>
+    <attribute name='type'>
+      <value>logical</value>
+    </attribute>
+    <ref name='commonmetadata'/>
+    <ref name='sizing'/>
+    <ref name='sourcelogical'/>
+    <ref name='target'/>
+  </define>
+
+  <define name='pooldisk'>
+    <attribute name='type'>
+      <value>disk</value>
+    </attribute>
+    <ref name='commonmetadata'/>
+    <ref name='sizing'/>
+    <ref name='sourcedisk'/>
+    <ref name='target'/>
+  </define>
+
+  <define name='pooliscsi'>
+    <attribute name='type'>
+      <value>iscsi</value>
+    </attribute>
+    <ref name='commonmetadata'/>
+    <ref name='sizing'/>
+    <ref name='sourceiscsi'/>
+    <ref name='target'/>
+  </define>
+
+  <define name='poolscsi'>
+    <attribute name='type'>
+      <value>scsi</value>
+    </attribute>
+    <ref name='commonmetadata'/>
+    <ref name='sizing'/>
+    <ref name='sourcescsi'/>
+    <ref name='target'/>
+  </define>
+
+  <define name='commonmetadata'>
+    <element name='name'>
+      <ref name='name'/>
+    </element>
+    <optional>
+      <element name='uuid'>
+       <ref name='uuid'/>
+      </element>
+    </optional>
+  </define>
+
+  <define name='sizing'>
+    <optional>
+      <element name='capacity'>
+       <ref name='uint'/>
+      </element>
+    </optional>
+    <optional>
+      <element name='allocation'>
+       <ref name='uint'/>
+      </element>
+    </optional>
+    <optional>
+      <element name='available'>
+       <ref name='uint'/>
+      </element>
+    </optional>
+  </define>
+
+  <define name='permissions'>
+    <optional>
+      <element name='permissions'>
+       <element name='mode'>
+         <ref name='uint'/>
+       </element>
+       <element name='owner'>
+         <ref name='uint'/>
+       </element>
+       <element name='group'>
+         <ref name='uint'/>
+       </element>
+       <optional>
+         <element name='label'>
+           <text/>
+       </element>
+       </optional>
+      </element>
+    </optional>
+  </define>
+
+  <define name='target'>
+    <element name='target'>
+      <optional>
+       <element name='path'>
+         <ref name='path'/>
+       </element>
+      </optional>
+      <ref name='permissions'/>
+    </element>
+  </define>
+
+  <define name='sourceinfohost'>
+    <element name='host'>
+      <attribute name='name'>
+       <text/>
+      </attribute>
+      <empty/>
+    </element>
+  </define>
+
+  <define name='sourceinfodev'>
+    <element name='device'>
+      <attribute name='path'>
+       <choice>
+         <ref name='path'/>
+         <ref name='name'/>
+       </choice>
+      </attribute>
+      <choice>
+       <empty/>
+       <ref name='devextents'/>
+      </choice>
+    </element>
+  </define>
+
+  <define name='devextents'>
+    <oneOrMore>
+      <element name='freeExtent'>
+       <attribute name='start'>
+         <ref name='uint'/>
+       </attribute>
+       <attribute name='end'>
+         <ref name='uint'/>
+       </attribute>
+      </element>
+    </oneOrMore>
+  </define>
+
+  <define name='sourceinfodir'>
+    <element name='dir'>
+      <attribute name='path'>
+       <ref name='path'/>
+      </attribute>
+      <empty/>
+    </element>
+  </define>
+
+  <define name='sourceinfoadapter'>
+    <element name='adapter'>
+      <attribute name='name'>
+       <text/>
+      </attribute>
+      <empty/>
+    </element>
+  </define>
+
+  <define name='sourceinfoname'>
+    <element name='name'>
+      <text/>
+    </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>
+         </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>none</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>
+      </element>
+    </optional>
+  </define>
+
+
+  <define name='sourcefmtlogical'>
+    <optional>
+      <element name='format'>
+       <attribute name='type'>
+         <choice>
+           <value>auto</value>
+           <value>lvm2</value>
+         </choice>
+       </attribute>
+      </element>
+    </optional>
+  </define>
+
+
+  <define name='sourcedir'>
+    <optional>
+      <element name='source'>
+       <empty/>
+      </element>
+    </optional>
+  </define>
+  <define name='sourcefs'>
+    <element name='source'>
+      <ref name='sourceinfodev'/>
+      <ref name='sourcefmtfs'/>
+    </element>
+  </define>
+
+  <define name='sourcenetfs'>
+    <element name='source'>
+      <ref name='sourceinfohost'/>
+      <ref name='sourceinfodir'/>
+      <ref name='sourcefmtnetfs'/>
+    </element>
+  </define>
+
+  <define name='sourcelogical'>
+    <element name='source'>
+      <ref name='sourceinfoname'/>
+      <optional>
+       <ref name='sourceinfodev'/>
+      </optional>
+      <ref name='sourcefmtlogical'/>
+    </element>
+  </define>
+
+  <define name='sourcedisk'>
+    <element name='source'>
+      <ref name='sourceinfodev'/>
+      <ref name='sourcefmtdisk'/>
+    </element>
+  </define>
+
+  <define name='sourceiscsi'>
+    <element name='source'>
+      <ref name='sourceinfohost'/>
+      <ref name='sourceinfodev'/>
+    </element>
+  </define>
+
+  <define name='sourcescsi'>
+    <element name='source'>
+      <ref name='sourceinfoname'/>
+    </element>
+  </define>
+
+
+  <define name='name'>
+    <data type='string'>
+      <param name="pattern">[a-zA-Z0-9_\+\-]+</param>
+    </data>
+  </define>
+  <define name='uuid'>
+    <choice>
+      <data type='string'>
+        <param name="pattern">[a-fA-F0-9]{32}</param>
+      </data>
+      <data type='string'>
+        <param name="pattern">[a-fA-F0-9]{8}\-([a-fA-F0-9]{4}\-){3}[a-fA-F0-9]{12}</param>
+      </data>
+    </choice>
+  </define>
+
+  <define name='uint'>
+    <data type='string'>
+      <param name="pattern">[0-9]+</param>
+    </data>
+  </define>
+
+  <define name='path'>
+    <data type='string'>
+      <param name="pattern">/[a-zA-Z0-9_\+\-/%]+</param>
+    </data>
+  </define>
+
+
+</grammar>
diff --git a/docs/schemas/storagevol.rng b/docs/schemas/storagevol.rng
new file mode 100644 (file)
index 0000000..c7bd3a7
--- /dev/null
@@ -0,0 +1,187 @@
+<!-- A Relax NG schema for the libvirt node device XML format -->
+<grammar xmlns="http://relaxng.org/ns/structure/1.0"
+    datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
+  <!-- We handle only document defining a domain -->
+  <start>
+    <ref name='vol'/>
+  </start>
+
+
+  <define name='vol'>
+    <element name='volume'>
+      <element name='name'>
+       <ref name='name'/>
+      </element>
+      <optional>
+       <element name='key'>
+         <text/>
+       </element>
+      </optional>
+      <ref name='source'/>
+      <ref name='sizing'/>
+      <ref name='target'/>
+      <optional>
+       <ref name='backingStore'/>
+      </optional>
+    </element>
+  </define>
+
+  <define name='sizing'>
+    <optional>
+      <element name='capacity'>
+       <ref name='uint'/>
+      </element>
+    </optional>
+    <optional>
+      <element name='allocation'>
+       <ref name='uint'/>
+      </element>
+    </optional>
+  </define>
+
+  <define name='permissions'>
+    <optional>
+      <element name='permissions'>
+       <element name='mode'>
+         <ref name='uint'/>
+       </element>
+       <element name='owner'>
+         <ref name='uint'/>
+       </element>
+       <element name='group'>
+         <ref name='uint'/>
+       </element>
+       <optional>
+         <element name='label'>
+           <text/>
+       </element>
+       </optional>
+      </element>
+    </optional>
+  </define>
+
+  <define name='target'>
+    <element name='target'>
+      <optional>
+       <element name='path'>
+         <ref name='path'/>
+       </element>
+      </optional>
+      <ref name='format'/>
+      <ref name='permissions'/>
+    </element>
+  </define>
+
+  <define name='backingStore'>
+    <element name='backingStore'>
+      <element name='path'>
+       <ref name='path'/>
+      </element>
+      <ref name='format'/>
+      <ref name='permissions'/>
+    </element>
+  </define>
+
+
+  <define name='source'>
+    <element name='source'>
+      <zeroOrMore>
+       <ref name='sourcedev'/>
+      </zeroOrMore>
+    </element>
+  </define>
+
+  <define name='sourcedev'>
+    <element name='device'>
+      <attribute name='path'>
+       <ref name='path'/>
+      </attribute>
+      <choice>
+       <empty/>
+       <ref name='devextents'/>
+      </choice>
+    </element>
+  </define>
+
+  <define name='devextents'>
+    <oneOrMore>
+      <element name='extent'>
+       <attribute name='start'>
+         <ref name='uint'/>
+       </attribute>
+       <attribute name='end'>
+         <ref name='uint'/>
+       </attribute>
+      </element>
+    </oneOrMore>
+  </define>
+
+  <define name='formatdev'>
+    <choice>
+      <value>none</value>
+      <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>
+    </choice>
+
+  </define>
+
+
+  <define name='formatfile'>
+    <choice>
+      <value>raw</value>
+      <value>dir</value>
+      <value>bochs</value>
+      <value>cloop</value>
+      <value>cow</value>
+      <value>dmg</value>
+      <value>iso</value>
+      <value>qcow</value>
+      <value>qcow2</value>
+      <value>vmdk</value>
+      <value>vpc</value>
+    </choice>
+  </define>
+
+  <define name='format'>
+    <optional>
+      <element name='format'>
+       <attribute name='type'>
+         <choice>
+           <ref name='formatfile'/>
+           <ref name='formatdev'/>
+         </choice>
+       </attribute>
+      </element>
+    </optional>
+  </define>
+
+  <define name='name'>
+    <data type='string'>
+      <param name="pattern">[a-zA-Z0-9_\+\-\.]+</param>
+    </data>
+  </define>
+
+  <define name='uint'>
+    <data type='string'>
+      <param name="pattern">[0-9]+</param>
+    </data>
+  </define>
+
+  <define name='path'>
+    <data type='string'>
+      <param name="pattern">/[a-zA-Z0-9_\+\-\./%]+</param>
+    </data>
+  </define>
+
+
+</grammar>
index 9121c6d8bcc26d8f54ce73c5701d8f1b799a5684..5a15de23469baf8603aac4baa43c1f8af83382b0 100644 (file)
@@ -354,6 +354,16 @@ fi
 %{_datadir}/libvirt/networks/default.xml
 %endif
 
+%dir %{_datadir}/libvirt/
+%dir %{_datadir}/libvirt/schemas/
+
+%{_datadir}/libvirt/schemas/domain.rng
+%{_datadir}/libvirt/schemas/network.rng
+%{_datadir}/libvirt/schemas/storagepool.rng
+%{_datadir}/libvirt/schemas/storagevol.rng
+%{_datadir}/libvirt/schemas/nodedev.rng
+%{_datadir}/libvirt/schemas/capability.rng
+
 %dir %{_localstatedir}/run/libvirt/
 
 %dir %{_localstatedir}/lib/libvirt/
@@ -410,7 +420,6 @@ fi
 %attr(0755, root, root) %{_sbindir}/libvirtd
 %endif
 
-%doc docs/*.rng
 %doc docs/*.xml
 
 %files devel
index 5c8317849903dafba8c755f6ab38a130571ab80a..1b6f73a2e76e1432d3b5e85a5d8cf601a03eace6 100644 (file)
@@ -80,6 +80,15 @@ rm -rf $RPM_BUILD_ROOT
 %{_mingw32_libdir}/libvirt.la
 %{_mingw32_libdir}/pkgconfig/libvirt.pc
 
+%dir %{_mingw32_datadir}/libvirt/
+%dir %{_mingw32_datadir}/libvirt/schemas/
+%{_mingw32_datadir}/libvirt/schemas/domain.rng
+%{_mingw32_datadir}/libvirt/schemas/network.rng
+%{_mingw32_datadir}/libvirt/schemas/storagepool.rng
+%{_mingw32_datadir}/libvirt/schemas/storagevol.rng
+%{_mingw32_datadir}/libvirt/schemas/nodedev.rng
+%{_mingw32_datadir}/libvirt/schemas/capability.rng
+
 %{_mingw32_datadir}/locale/*/LC_MESSAGES/libvirt.mo
 
 %dir %{_mingw32_includedir}/libvirt
index 9924657cc857cb0159acd91fb2d9051c6cab4d0e..e467a86e992e6de3619cf1283a30728edbda1be1 100644 (file)
@@ -41,8 +41,17 @@ EXTRA_DIST =         \
        test-lib.sh     \
        qemuxml2argvdata \
        nodeinfodata     \
+       capabilityschematest \
+       capabilityschemadata \
+       networkschematest \
        domainschematest \
-       domainschemadata
+       domainschemadata \
+       storagepoolschematest \
+       storagepoolschemadata \
+       storagevolschematest \
+       storagevolschemadata \
+       nodedevschematest \
+       nodedevschemadata
 
 noinst_PROGRAMS = virshtest conftest \
         nodeinfotest statstest qparamtest
@@ -55,7 +64,14 @@ if WITH_QEMU
 noinst_PROGRAMS += qemuxml2argvtest qemuxml2xmltest
 endif
 
-test_scripts = domainschematest
+test_scripts = \
+       capabilityschematest \
+       networkschematest \
+       storagepoolschematest \
+       storagevolschematest \
+       domainschematest \
+       nodedevschematest
+
 if WITH_LIBVIRTD
 test_scripts +=                                \
        test_conf.sh                    \
diff --git a/tests/capabilityschemadata/caps-qemu-kvm.xml b/tests/capabilityschemadata/caps-qemu-kvm.xml
new file mode 100644 (file)
index 0000000..fd8523e
--- /dev/null
@@ -0,0 +1,111 @@
+<capabilities>
+
+  <host>
+    <cpu>
+      <arch>i686</arch>
+    </cpu>
+  </host>
+
+  <guest>
+    <os_type>hvm</os_type>
+    <arch name='i686'>
+      <wordsize>32</wordsize>
+      <emulator>/usr/bin/qemu</emulator>
+      <machine>pc</machine>
+      <machine>isapc</machine>
+      <domain type='qemu'>
+      </domain>
+      <domain type='kvm'>
+        <emulator>/usr/bin/qemu-kvm</emulator>
+      </domain>
+    </arch>
+    <features>
+      <pae/>
+      <nonpae/>
+      <acpi default='on' toggle='yes'/>
+      <apic default='on' toggle='no'/>
+    </features>
+  </guest>
+
+  <guest>
+    <os_type>hvm</os_type>
+    <arch name='x86_64'>
+      <wordsize>64</wordsize>
+      <emulator>/usr/bin/qemu-system-x86_64</emulator>
+      <machine>pc</machine>
+      <machine>isapc</machine>
+      <domain type='qemu'>
+      </domain>
+    </arch>
+    <features>
+      <acpi default='on' toggle='yes'/>
+      <apic default='on' toggle='no'/>
+    </features>
+  </guest>
+
+  <guest>
+    <os_type>hvm</os_type>
+    <arch name='mips'>
+      <wordsize>32</wordsize>
+      <emulator>/usr/bin/qemu-system-mips</emulator>
+      <machine>mips</machine>
+      <domain type='qemu'>
+      </domain>
+    </arch>
+  </guest>
+
+  <guest>
+    <os_type>hvm</os_type>
+    <arch name='mipsel'>
+      <wordsize>32</wordsize>
+      <emulator>/usr/bin/qemu-system-mipsel</emulator>
+      <machine>mips</machine>
+      <domain type='qemu'>
+      </domain>
+    </arch>
+  </guest>
+
+  <guest>
+    <os_type>hvm</os_type>
+    <arch name='sparc'>
+      <wordsize>32</wordsize>
+      <emulator>/usr/bin/qemu-system-sparc</emulator>
+      <machine>sun4m</machine>
+      <domain type='qemu'>
+      </domain>
+    </arch>
+  </guest>
+
+  <guest>
+    <os_type>hvm</os_type>
+    <arch name='ppc'>
+      <wordsize>32</wordsize>
+      <emulator>/usr/bin/qemu-system-ppc</emulator>
+      <machine>g3bw</machine>
+      <machine>mac99</machine>
+      <machine>prep</machine>
+      <domain type='qemu'>
+      </domain>
+    </arch>
+  </guest>
+
+  <guest>
+    <os_type>xen</os_type>
+    <arch name='i686'>
+      <wordsize>32</wordsize>
+      <emulator>/usr/bin/xenner</emulator>
+      <machine>xenner</machine>
+      <domain type='kvm'>
+      </domain>
+    </arch>
+    <features>
+      <pae/>
+      <nonpae/>
+      <acpi default='on' toggle='yes'/>
+      <apic default='on' toggle='no'/>
+    </features>
+  </guest>
+
+</capabilities>
+
+
diff --git a/tests/capabilityschemadata/caps-test.xml b/tests/capabilityschemadata/caps-test.xml
new file mode 100644 (file)
index 0000000..1313c95
--- /dev/null
@@ -0,0 +1,71 @@
+<capabilities>
+
+  <host>
+    <cpu>
+      <arch>i686</arch>
+      <features>
+        <pae/>
+        <nonpae/>
+      </features>
+    </cpu>
+    <topology>
+      <cells num='2'>
+        <cell id='0'>
+          <cpus num='8'>
+            <cpu id='0'/>
+            <cpu id='2'/>
+            <cpu id='4'/>
+            <cpu id='6'/>
+            <cpu id='8'/>
+            <cpu id='10'/>
+            <cpu id='12'/>
+            <cpu id='14'/>
+          </cpus>
+        </cell>
+        <cell id='1'>
+          <cpus num='8'>
+            <cpu id='1'/>
+            <cpu id='3'/>
+            <cpu id='5'/>
+            <cpu id='7'/>
+            <cpu id='9'/>
+            <cpu id='11'/>
+            <cpu id='13'/>
+            <cpu id='15'/>
+          </cpus>
+        </cell>
+      </cells>
+    </topology>
+  </host>
+
+  <guest>
+    <os_type>hvm</os_type>
+    <arch name='i686'>
+      <wordsize>32</wordsize>
+      <emulator>/usr/bin/test-hv</emulator>
+      <domain type='test'>
+      </domain>
+    </arch>
+    <features>
+      <pae/>
+      <nonpae/>
+    </features>
+  </guest>
+
+  <guest>
+    <os_type>xen</os_type>
+    <arch name='i686'>
+      <wordsize>32</wordsize>
+      <emulator>/usr/bin/test-hv</emulator>
+      <domain type='test'>
+      </domain>
+    </arch>
+    <features>
+      <pae/>
+      <nonpae/>
+    </features>
+  </guest>
+
+</capabilities>
+
+
diff --git a/tests/capabilityschematest b/tests/capabilityschematest
new file mode 100755 (executable)
index 0000000..a166724
--- /dev/null
@@ -0,0 +1,34 @@
+#!/bin/sh
+
+test -z "$srcdir" && srcdir=`pwd`
+test -z "$abs_srcdir" && abs_srcdir=`pwd`
+
+DOMAINDIRS="capabilityschemadata xencapsdata"
+
+
+n=0
+f=0
+for dir in $DOMAINDIRS
+do
+  XML=`find $abs_srcdir/$dir -name '*.xml'` || exit 1
+
+  for xml in $XML
+  do
+    n=`expr $n + 1`
+    printf "%4d) %.60s  " $n $(basename $(dirname $xml))"/"$(basename $xml)
+    result=`xmllint --relaxng $srcdir/../docs/schemas/capability.rng --noout $xml 2>&1`
+    ret=$?
+    if test $ret = 0; then
+        echo "OK"
+    else
+        echo "FAILED"
+        echo $result
+        f=`expr $f + 1`
+    fi
+  done
+done
+echo "Validated $n files, $f failed"
+
+ret=0
+test $f != 0 && ret=255
+exit $ret
index d85d4631b4ad212e741dbcc3398951ba17e6c1f8..0a7d4a186020f764569474c0d69514a6f5a3a026 100755 (executable)
@@ -1,6 +1,7 @@
 #!/bin/sh
 
 test -z "$srcdir" && srcdir=`pwd`
+test -z "$abs_srcdir" && abs_srcdir=`pwd`
 
 DOMAINDIRS="domainschemadata qemuxml2argvdata sexpr2xmldata xmconfigdata xml2sexprdata"
 
@@ -14,7 +15,7 @@ do
   do
     n=`expr $n + 1`
     printf "%4d) %.60s  " $n $(basename $(dirname $xml))"/"$(basename $xml)
-    result=`xmllint --relaxng $srcdir/../docs/libvirt.rng --noout $xml 2>&1`
+    result=`xmllint --relaxng $srcdir/../docs/schemas/domain.rng --noout $xml 2>&1`
     ret=$?
     if test $ret = 0; then
         echo "OK"
diff --git a/tests/networkschematest b/tests/networkschematest
new file mode 100755 (executable)
index 0000000..1d7cffc
--- /dev/null
@@ -0,0 +1,33 @@
+#!/bin/sh
+
+test -z "$srcdir" && srcdir=`pwd`
+test -z "$abs_srcdir" && abs_srcdir=`pwd`
+
+DIRS="../qemud"
+
+n=0
+f=0
+for dir in $DIRS
+do
+  XML=`find $abs_srcdir/$dir -name '*.xml'` || exit 1
+
+  for xml in $XML
+  do
+    n=`expr $n + 1`
+    printf "%4d) %.60s  " $n $(basename $(dirname $xml))"/"$(basename $xml)
+    result=`xmllint --relaxng $srcdir/../docs/schemas/network.rng --noout $xml 2>&1`
+    ret=$?
+    if test $ret = 0; then
+        echo "OK"
+    else
+        echo "FAILED"
+        echo $result
+        f=`expr $f + 1`
+    fi
+  done
+done
+echo "Validated $n files, $f failed"
+
+ret=0
+test $f != 0 && ret=255
+exit $ret
diff --git a/tests/nodedevschemadata/DVD_GCC_4247N.xml b/tests/nodedevschemadata/DVD_GCC_4247N.xml
new file mode 100644 (file)
index 0000000..d81e983
--- /dev/null
@@ -0,0 +1,17 @@
+<device>
+  <name>DVD_GCC_4247N</name>
+  <parent>pci_8086_27df_scsi_host_scsi_device_lun0</parent>
+  <capability type='storage'>
+    <block>/dev/sr0</block>
+    <bus>scsi</bus>
+    <drive_type>cdrom</drive_type>
+    <model>RW/DVD GCC-4247N</model>
+    <vendor>HL-DT-ST</vendor>
+    <capability type='removable'>
+      <media_available>0</media_available>
+      <media_size>0</media_size>
+    </capability>
+  </capability>
+</device>
+
+
diff --git a/tests/nodedevschemadata/computer.xml b/tests/nodedevschemadata/computer.xml
new file mode 100644 (file)
index 0000000..4172c0c
--- /dev/null
@@ -0,0 +1,18 @@
+<device>
+  <name>computer</name>
+  <capability type='system'>
+    <hardware>
+      <vendor>LENOVO</vendor>
+      <version>ThinkPad T60p</version>
+      <serial>123123</serial>
+      <uuid>12345678-1234-1234-9596-a088b277d677</uuid>
+    </hardware>
+    <firmware>
+      <vendor>LENOVO</vendor>
+      <version>79ETE1WW (2.21 )</version>
+      <release_date>02/05/2008</release_date>
+    </firmware>
+  </capability>
+</device>
+
+
diff --git a/tests/nodedevschemadata/net_00_13_02_b9_f9_d3.xml b/tests/nodedevschemadata/net_00_13_02_b9_f9_d3.xml
new file mode 100644 (file)
index 0000000..9a09246
--- /dev/null
@@ -0,0 +1,11 @@
+<device>
+  <name>net_00_13_02_b9_f9_d3</name>
+  <parent>pci_8086_4227</parent>
+  <capability type='net'>
+    <interface>eth0</interface>
+    <address>00:13:02:b9:f9:d3</address>
+    <capability type='80211'/>
+  </capability>
+</device>
+
+
diff --git a/tests/nodedevschemadata/net_00_15_58_2f_e9_55.xml b/tests/nodedevschemadata/net_00_15_58_2f_e9_55.xml
new file mode 100644 (file)
index 0000000..b13215c
--- /dev/null
@@ -0,0 +1,11 @@
+<device>
+  <name>net_00_15_58_2f_e9_55</name>
+  <parent>pci_8086_109a</parent>
+  <capability type='net'>
+    <interface>eth1</interface>
+    <address>00:15:58:2f:e9:55</address>
+    <capability type='80203'/>
+  </capability>
+</device>
+
+
diff --git a/tests/nodedevschemadata/pci_1002_71c4.xml b/tests/nodedevschemadata/pci_1002_71c4.xml
new file mode 100644 (file)
index 0000000..305ca32
--- /dev/null
@@ -0,0 +1,14 @@
+<device>
+  <name>pci_1002_71c4</name>
+  <parent>pci_8086_27a1</parent>
+  <capability type='pci'>
+    <domain>0</domain>
+    <bus>1</bus>
+    <slot>0</slot>
+    <function>0</function>
+    <product id='0x71c4'>M56GL [Mobility FireGL V5200]</product>
+    <vendor id='0x1002'>ATI Technologies Inc</vendor>
+  </capability>
+</device>
+
+
diff --git a/tests/nodedevschemadata/pci_8086_27c5_scsi_host.xml b/tests/nodedevschemadata/pci_8086_27c5_scsi_host.xml
new file mode 100644 (file)
index 0000000..47937f1
--- /dev/null
@@ -0,0 +1,9 @@
+<device>
+  <name>pci_8086_27c5_scsi_host</name>
+  <parent>pci_8086_27c5</parent>
+  <capability type='scsi_host'>
+    <host>0</host>
+  </capability>
+</device>
+
+
diff --git a/tests/nodedevschemadata/pci_8086_27c5_scsi_host_0.xml b/tests/nodedevschemadata/pci_8086_27c5_scsi_host_0.xml
new file mode 100644 (file)
index 0000000..b58ee73
--- /dev/null
@@ -0,0 +1,9 @@
+<device>
+  <name>pci_8086_27c5_scsi_host_0</name>
+  <parent>pci_8086_27c5</parent>
+  <capability type='scsi_host'>
+    <host>1</host>
+  </capability>
+</device>
+
+
diff --git a/tests/nodedevschemadata/pci_8086_27c5_scsi_host_scsi_device_lun0.xml b/tests/nodedevschemadata/pci_8086_27c5_scsi_host_scsi_device_lun0.xml
new file mode 100644 (file)
index 0000000..09887a8
--- /dev/null
@@ -0,0 +1,13 @@
+<device>
+  <name>pci_8086_27c5_scsi_host_scsi_device_lun0</name>
+  <parent>pci_8086_27c5_scsi_host</parent>
+  <capability type='scsi'>
+    <host>0</host>
+    <bus>0</bus>
+    <target>0</target>
+    <lun>0</lun>
+    <type>disk</type>
+  </capability>
+</device>
+
+
diff --git a/tests/nodedevschemadata/pci_8086_27c5_scsi_host_scsi_host.xml b/tests/nodedevschemadata/pci_8086_27c5_scsi_host_scsi_host.xml
new file mode 100644 (file)
index 0000000..18f9500
--- /dev/null
@@ -0,0 +1,9 @@
+<device>
+  <name>pci_8086_27c5_scsi_host_scsi_host</name>
+  <parent>pci_8086_27c5_scsi_host</parent>
+  <capability type='scsi_host'>
+    <host>0</host>
+  </capability>
+</device>
+
+
diff --git a/tests/nodedevschemadata/storage_serial_SATA_HTS721010G9SA00_MPCZ12Y0GNGWSE.xml b/tests/nodedevschemadata/storage_serial_SATA_HTS721010G9SA00_MPCZ12Y0GNGWSE.xml
new file mode 100644 (file)
index 0000000..43294ac
--- /dev/null
@@ -0,0 +1,14 @@
+<device>
+  <name>storage_serial_SATA_HTS721010G9SA00_MPCZ12Y0GNGWSE</name>
+  <parent>pci_8086_27c5_scsi_host_scsi_device_lun0</parent>
+  <capability type='storage'>
+    <block>/dev/sda</block>
+    <bus>scsi</bus>
+    <drive_type>disk</drive_type>
+    <model>HTS721010G9SA00</model>
+    <vendor>ATA</vendor>
+    <size>100030242816</size>
+  </capability>
+</device>
+
+
diff --git a/tests/nodedevschemadata/usb_device_1d6b_1_0000_00_1d_0.xml b/tests/nodedevschemadata/usb_device_1d6b_1_0000_00_1d_0.xml
new file mode 100644 (file)
index 0000000..05999e8
--- /dev/null
@@ -0,0 +1,12 @@
+<device>
+  <name>usb_device_1d6b_1_0000_00_1d_0</name>
+  <parent>pci_8086_27c8</parent>
+  <capability type='usb_device'>
+    <bus>2</bus>
+    <device>1</device>
+    <product id='0x0001'>1.1 root hub</product>
+    <vendor id='0x1d6b'>Linux Foundation</vendor>
+  </capability>
+</device>
+
+
diff --git a/tests/nodedevschemadata/usb_device_1d6b_1_0000_00_1d_0_if0.xml b/tests/nodedevschemadata/usb_device_1d6b_1_0000_00_1d_0_if0.xml
new file mode 100644 (file)
index 0000000..bc951ff
--- /dev/null
@@ -0,0 +1,12 @@
+<device>
+  <name>usb_device_1d6b_1_0000_00_1d_0_if0</name>
+  <parent>usb_device_1d6b_1_0000_00_1d_0</parent>
+  <capability type='usb'>
+    <number>0</number>
+    <class>9</class>
+    <subclass>0</subclass>
+    <protocol>0</protocol>
+  </capability>
+</device>
+
+
diff --git a/tests/nodedevschematest b/tests/nodedevschematest
new file mode 100755 (executable)
index 0000000..23e9e57
--- /dev/null
@@ -0,0 +1,33 @@
+#!/bin/sh
+
+test -z "$srcdir" && srcdir=`pwd`
+test -z "$abs_srcdir" && abs_srcdir=`pwd`
+
+DIRS="nodedevschemadata"
+
+n=0
+f=0
+for dir in $DIRS
+do
+  XML=`find $abs_srcdir/$dir -name '*.xml'` || exit 1
+
+  for xml in $XML
+  do
+    n=`expr $n + 1`
+    printf "%4d) %.60s  " $n $(basename $(dirname $xml))"/"$(basename $xml)
+    result=`xmllint --relaxng $srcdir/../docs/schemas/nodedev.rng --noout $xml 2>&1`
+    ret=$?
+    if test $ret = 0; then
+        echo "OK"
+    else
+        echo "FAILED"
+        echo $result
+        f=`expr $f + 1`
+    fi
+  done
+done
+echo "Validated $n files, $f failed"
+
+ret=0
+test $f != 0 && ret=255
+exit $ret
diff --git a/tests/storagepoolschemadata/pool-dir.xml b/tests/storagepoolschemadata/pool-dir.xml
new file mode 100644 (file)
index 0000000..2b8735c
--- /dev/null
@@ -0,0 +1,17 @@
+<pool type='dir'>
+  <name>virtimages</name>
+  <uuid>70a7eb15-6c34-ee9c-bf57-69e8e5ff3fb2</uuid>
+  <capacity>0</capacity>
+  <allocation>0</allocation>
+  <available>0</available>
+  <source>
+  </source>
+  <target>
+    <path>/var/lib/libvirt/images</path>
+    <permissions>
+      <mode>0700</mode>
+      <owner>0</owner>
+      <group>0</group>
+    </permissions>
+  </target>
+</pool>
diff --git a/tests/storagepoolschemadata/pool-disk.xml b/tests/storagepoolschemadata/pool-disk.xml
new file mode 100644 (file)
index 0000000..4c27c54
--- /dev/null
@@ -0,0 +1,22 @@
+<pool type='disk'>
+  <name>sda</name>
+  <uuid>e3509a62-1b4c-e20b-94bd-9168963f9b97</uuid>
+  <capacity>100027630080</capacity>
+  <allocation>100027597824</allocation>
+  <available>0</available>
+  <source>
+    <device path='/dev/sda'>
+      <freeExtent start='370137600' end='567544320'/>
+      <freeExtent start='987033600' end='1044610560'/>
+    </device>
+    <format type='dos'/>
+  </source>
+  <target>
+    <path>/dev</path>
+    <permissions>
+      <mode>0700</mode>
+      <owner>0</owner>
+      <group>0</group>
+    </permissions>
+  </target>
+</pool>
diff --git a/tests/storagepoolschemadata/pool-fs.xml b/tests/storagepoolschemadata/pool-fs.xml
new file mode 100644 (file)
index 0000000..c253c55
--- /dev/null
@@ -0,0 +1,20 @@
+<pool type='fs'>
+  <name>images</name>
+  <uuid>7641d5a8-af11-f730-a34e-0a7dfcede71f</uuid>
+  <capacity>0</capacity>
+  <allocation>0</allocation>
+  <available>0</available>
+  <source>
+    <device path='/dev/sda6'/>
+    <format type='ext3'/>
+  </source>
+  <target>
+    <path>/mnt</path>
+    <permissions>
+      <mode>0700</mode>
+      <owner>0</owner>
+      <group>0</group>
+    </permissions>
+  </target>
+</pool>
+
diff --git a/tests/storagepoolschemadata/pool-iscsi.xml b/tests/storagepoolschemadata/pool-iscsi.xml
new file mode 100644 (file)
index 0000000..8d60f38
--- /dev/null
@@ -0,0 +1,10 @@
+<pool type='iscsi'>
+  <name>virtimages</name>
+  <source>
+    <host name="iscsi.example.com"/>
+    <device path="demo-target"/>
+  </source>
+  <target>
+    <path>/dev/disk/by-path</path>
+  </target>
+</pool>
diff --git a/tests/storagepoolschemadata/pool-logical.xml b/tests/storagepoolschemadata/pool-logical.xml
new file mode 100644 (file)
index 0000000..c4bfa07
--- /dev/null
@@ -0,0 +1,19 @@
+<pool type='logical'>
+  <name>HostVG</name>
+  <uuid>1c13165a-d0f4-3aee-b447-30fb38789091</uuid>
+  <capacity>99891544064</capacity>
+  <allocation>99220455424</allocation>
+  <available>671088640</available>
+  <source>
+    <name>HostVG</name>
+    <format type='lvm2'/>
+  </source>
+  <target>
+    <path>/dev/HostVG</path>
+    <permissions>
+      <mode>0700</mode>
+      <owner>0</owner>
+      <group>0</group>
+    </permissions>
+  </target>
+</pool>
diff --git a/tests/storagepoolschemadata/pool-netfs.xml b/tests/storagepoolschemadata/pool-netfs.xml
new file mode 100644 (file)
index 0000000..cb4252c
--- /dev/null
@@ -0,0 +1,21 @@
+<pool type='netfs'>
+  <name>nfsimages</name>
+  <uuid>7641d5a8-af11-f730-a34e-0a7dfcede71f</uuid>
+  <capacity>0</capacity>
+  <allocation>0</allocation>
+  <available>0</available>
+  <source>
+    <host name='localhost'/>
+    <dir path='/var/lib/libvirt/images'/>
+    <format type='nfs'/>
+  </source>
+  <target>
+    <path>/mnt</path>
+    <permissions>
+      <mode>0700</mode>
+      <owner>0</owner>
+      <group>0</group>
+    </permissions>
+  </target>
+</pool>
+
diff --git a/tests/storagepoolschematest b/tests/storagepoolschematest
new file mode 100755 (executable)
index 0000000..f6a973d
--- /dev/null
@@ -0,0 +1,33 @@
+#!/bin/sh
+
+test -z "$srcdir" && srcdir=`pwd`
+test -z "$abs_srcdir" && abs_srcdir=`pwd`
+
+DIRS="storagepoolschemadata"
+
+n=0
+f=0
+for dir in $DIRS
+do
+  XML=`find $abs_srcdir/$dir -name '*.xml'` || exit 1
+
+  for xml in $XML
+  do
+    n=`expr $n + 1`
+    printf "%4d) %.60s  " $n $(basename $(dirname $xml))"/"$(basename $xml)
+    result=`xmllint --relaxng $srcdir/../docs/schemas/storagepool.rng --noout $xml 2>&1`
+    ret=$?
+    if test $ret = 0; then
+        echo "OK"
+    else
+        echo "FAILED"
+        echo $result
+        f=`expr $f + 1`
+    fi
+  done
+done
+echo "Validated $n files, $f failed"
+
+ret=0
+test $f != 0 && ret=255
+exit $ret
diff --git a/tests/storagevolschemadata/vol-logical.xml b/tests/storagevolschemadata/vol-logical.xml
new file mode 100644 (file)
index 0000000..2c3e7ce
--- /dev/null
@@ -0,0 +1,21 @@
+<volume>
+  <name>Swap</name>
+  <key>r4xkCv-MQhr-WKIT-R66x-Epn2-e8hG-1Z5gY0</key>
+  <source>
+    <device path='/dev/sda2'>
+      <extent start='31440502784' end='33520877568'/>
+    </device>
+  </source>
+  <capacity>2080374784</capacity>
+  <allocation>2080374784</allocation>
+  <target>
+    <path>/dev/HostVG/Swap</path>
+    <permissions>
+      <mode>060660</mode>
+      <owner>0</owner>
+      <group>6</group>
+      <label>system_u:object_r:fixed_disk_device_t:s0</label>
+    </permissions>
+  </target>
+</volume>
+
diff --git a/tests/storagevolschemadata/vol-partition.xml b/tests/storagevolschemadata/vol-partition.xml
new file mode 100644 (file)
index 0000000..2db7e92
--- /dev/null
@@ -0,0 +1,21 @@
+<volume>
+  <name>sda1</name>
+  <key>/dev/sda1</key>
+  <source>
+    <device path='/dev/sda'>
+      <extent start='32256' end='106928640'/>
+    </device>
+  </source>
+  <capacity>106896384</capacity>
+  <allocation>106896384</allocation>
+  <target>
+    <path>/dev/sda1</path>
+    <format type='none'/>
+    <permissions>
+      <mode>060660</mode>
+      <owner>0</owner>
+      <group>6</group>
+      <label>system_u:object_r:fixed_disk_device_t:s0</label>
+    </permissions>
+  </target>
+</volume>
diff --git a/tests/storagevolschemadata/vol-qcow2.xml b/tests/storagevolschemadata/vol-qcow2.xml
new file mode 100644 (file)
index 0000000..a3f5cca
--- /dev/null
@@ -0,0 +1,28 @@
+<volume>
+  <name>OtherDemo.img</name>
+  <key>/var/lib/libvirt/images/OtherDemo.img</key>
+  <source>
+  </source>
+  <capacity>5242880000</capacity>
+  <allocation>294912</allocation>
+  <target>
+    <path>/var/lib/libvirt/images/OtherDemo.img</path>
+    <format type='qcow2'/>
+    <permissions>
+      <mode>0100644</mode>
+      <owner>0</owner>
+      <group>0</group>
+      <label>unconfined_u:object_r:virt_image_t:s0</label>
+    </permissions>
+  </target>
+  <backingStore>
+    <path>/var/lib/libvirt/images/BaseDemo.img</path>
+    <format type='raw'/>
+    <permissions>
+      <mode>0100644</mode>
+      <owner>0</owner>
+      <group>0</group>
+      <label>unconfined_u:object_r:virt_image_t:s0</label>
+    </permissions>
+  </backingStore>
+</volume>
diff --git a/tests/storagevolschematest b/tests/storagevolschematest
new file mode 100755 (executable)
index 0000000..7865102
--- /dev/null
@@ -0,0 +1,33 @@
+#!/bin/sh
+
+test -z "$srcdir" && srcdir=`pwd`
+test -z "$abs_srcdir" && abs_srcdir=`pwd`
+
+DIRS="storagevolschemadata"
+
+n=0
+f=0
+for dir in $DIRS
+do
+  XML=`find $abs_srcdir/$dir -name '*.xml'` || exit 1
+
+  for xml in $XML
+  do
+    n=`expr $n + 1`
+    printf "%4d) %.60s  " $n $(basename $(dirname $xml))"/"$(basename $xml)
+    result=`xmllint --relaxng $srcdir/../docs/schemas/storagevol.rng --noout $xml 2>&1`
+    ret=$?
+    if test $ret = 0; then
+        echo "OK"
+    else
+        echo "FAILED"
+        echo $result
+        f=`expr $f + 1`
+    fi
+  done
+done
+echo "Validated $n files, $f failed"
+
+ret=0
+test $f != 0 && ret=255
+exit $ret