]> xenbits.xensource.com Git - libvirt.git/commitdiff
snapshot: update rng to support full domain in xml
authorEric Blake <eblake@redhat.com>
Sat, 13 Aug 2011 01:33:15 +0000 (19:33 -0600)
committerEric Blake <eblake@redhat.com>
Sat, 3 Sep 2011 14:12:13 +0000 (08:12 -0600)
This patch will probably cause merge conflicts to those trying
to do backports.  The end goal is simple - domaincommon.rng
should be the state of domain.rng pre-patch, with a few lines
tweaked in the header, while domain.rng post-patch is now just
a shell that includes domaincommon.rng and sets the <start>.

* docs/schemas/domain.rng: Move guts...
* docs/schemas/domaincommon.rng: ...to new file.
* docs/schemas/domainsnapshot.rng: Allow new xml.
* docs/schemas/Makefile.am (schema_DATA): Distribute new file.
* tests/domainsnapshotxml2xmlout/full_domain.xml: New test.
* libvirt.spec.in (%files client): Ship new file.  Sort lines.
* mingw32-libvirt.spec.in: Likewise.

docs/schemas/Makefile.am
docs/schemas/domain.rng
docs/schemas/domaincommon.rng [new file with mode: 0644]
docs/schemas/domainsnapshot.rng
libvirt.spec.in
mingw32-libvirt.spec.in
tests/domainsnapshotxml2xmlout/full_domain.xml [new file with mode: 0644]

index 596c2079816515de12a82c5a833a78b274558c7e..4413d9ec27b29b3dd59f1c7c061d42683f3572f4 100644 (file)
@@ -6,6 +6,7 @@ schema_DATA = \
        basictypes.rng \
        capability.rng \
        domain.rng \
+       domaincommon.rng \
        domainsnapshot.rng \
        interface.rng \
        network.rng \
index b6dd19ac56f17f069df9e25d841bac5be928174b..cf0be68c27c3d39f900f3140fb628e1843f3a3fa 100644 (file)
     <ref name="domain"/>
   </start>
 
-  <include href='basictypes.rng'/>
-  <include href='storageencryption.rng'/>
-  <include href='networkcommon.rng'/>
-
-  <!--
-    description element, maybe placed anywhere under the root
-    -->
-  <define name="description">
-    <element name="description">
-      <text/>
-    </element>
-  </define>
-
-  <!--
-      We handle only document defining a domain
-    -->
-  <define name="domain">
-    <element name="domain">
-      <ref name="hvs"/>
-      <ref name="ids"/>
-      <interleave>
-        <optional>
-          <ref name="description"/>
-        </optional>
-        <optional>
-          <ref name="cpu"/>
-        </optional>
-        <optional>
-          <ref name="sysinfo"/>
-        </optional>
-        <ref name="os"/>
-        <ref name="clock"/>
-        <ref name="resources"/>
-        <ref name="features"/>
-        <ref name="termination"/>
-        <optional>
-          <ref name="devices"/>
-        </optional>
-        <optional>
-          <ref name="seclabel"/>
-        </optional>
-        <optional>
-          <ref name='qemucmdline'/>
-        </optional>
-      </interleave>
-    </element>
-  </define>
-  <define name="seclabel">
-    <element name="seclabel">
-      <attribute name="model">
-        <text/>
-      </attribute>
-      <attribute name="type">
-        <choice>
-          <value>dynamic</value>
-          <value>static</value>
-        </choice>
-      </attribute>
-      <attribute name="relabel">
-        <choice>
-          <value>yes</value>
-          <value>no</value>
-        </choice>
-      </attribute>
-      <element name="label">
-        <text/>
-      </element>
-      <element name="imagelabel">
-        <text/>
-      </element>
-      <element name="baselabel">
-        <text/>
-      </element>
-    </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"/>
-          <zeroOrMore>
-            <ref name="osbootdev"/>
-          </zeroOrMore>
-        </choice>
-        <optional>
-          <element name="bootmenu">
-            <attribute name="enable">
-              <choice>
-                <value>yes</value>
-                <value>no</value>
-              </choice>
-            </attribute>
-          </element>
-        </optional>
-        <optional>
-          <ref name="smbios"/>
-        </optional>
-        <optional>
-          <ref name="bios"/>
-        </optional>
-      </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>
-      <optional>
-        <attribute name="arch">
-          <choice>
-            <value>i686</value>
-            <value>x86_64</value>
-          </choice>
-        </attribute>
-      </optional>
-      <optional>
-        <attribute name="machine">
-          <data type="string">
-            <param name="pattern">[a-zA-Z0-9_\.\-]+</param>
-          </data>
-        </attribute>
-      </optional>
-    </group>
-  </define>
-  <define name="hvmmips">
-    <group>
-      <optional>
-        <attribute name="arch">
-          <value>mips</value>
-        </attribute>
-      </optional>
-      <optional>
-        <attribute name="machine">
-          <value>mips</value>
-        </attribute>
-      </optional>
-    </group>
-  </define>
-  <define name="hvmsparc">
-    <group>
-      <optional>
-        <attribute name="arch">
-          <value>sparc</value>
-        </attribute>
-      </optional>
-      <optional>
-        <attribute name="machine">
-          <value>sun4m</value>
-        </attribute>
-      </optional>
-    </group>
-  </define>
-  <define name="hvmppc">
-    <group>
-      <optional>
-        <attribute name="arch">
-          <value>ppc</value>
-        </attribute>
-      </optional>
-      <optional>
-        <attribute name="machine">
-          <choice>
-            <value>g3beige</value>
-            <value>mac99</value>
-            <value>prep</value>
-          </choice>
-        </attribute>
-      </optional>
-    </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="memoryBacking">
-          <optional>
-            <element name="hugepages">
-              <empty/>
-            </element>
-          </optional>
-        </element>
-      </optional>
-
-      <!-- The Blkio cgroup related tunables would go in the blkiotune -->
-      <optional>
-        <element name="blkiotune">
-          <!-- I/O weight the VM can use -->
-          <optional>
-            <element name="weight">
-              <ref name="weight"/>
-            </element>
-          </optional>
-        </element>
-      </optional>
-
-      <!-- All the memory/swap related tunables would go in the memtune -->
-      <optional>
-        <element name="memtune">
-          <!-- Maximum memory the VM can use -->
-          <optional>
-            <element name="hard_limit">
-              <ref name="memoryKB"/>
-            </element>
-          </optional>
-          <!-- Minimum memory ascertained for the VM during contention -->
-          <optional>
-            <element name="soft_limit">
-              <ref name="memoryKB"/>
-            </element>
-          </optional>
-          <!-- Minimum amount of memory required to start the VM -->
-          <optional>
-            <element name="min_guarantee">
-              <ref name="memoryKB"/>
-            </element>
-          </optional>
-          <!-- Maximum swap area the VM can use -->
-          <optional>
-            <element name="swap_hard_limit">
-              <ref name="memoryKB"/>
-            </element>
-          </optional>
-        </element>
-      </optional>
-
-      <optional>
-        <element name="vcpu">
-          <optional>
-            <attribute name="cpuset">
-              <ref name="cpuset"/>
-            </attribute>
-          </optional>
-          <optional>
-            <attribute name="current">
-              <ref name="countCPU"/>
-            </attribute>
-          </optional>
-          <ref name="countCPU"/>
-        </element>
-      </optional>
-
-      <!-- All the cpu related tunables would go in the cputune -->
-      <optional>
-        <element name="cputune">
-          <optional>
-            <element name="shares">
-              <ref name="cpushares"/>
-            </element>
-          </optional>
-          <optional>
-            <element name="period">
-              <ref name="cpuperiod"/>
-            </element>
-          </optional>
-          <optional>
-            <element name="quota">
-              <ref name="cpuquota"/>
-            </element>
-          </optional>
-          <zeroOrMore>
-            <element name="vcpupin">
-              <attribute name="vcpu">
-                <ref name="vcpuid"/>
-              </attribute>
-              <attribute name="cpuset">
-                <ref name="cpuset"/>
-              </attribute>
-            </element>
-          </zeroOrMore>
-        </element>
-      </optional>
-
-      <!-- All the NUMA related tunables would go in the numatune -->
-      <optional>
-        <element name="numatune">
-          <optional>
-            <element name="memory">
-              <attribute name="mode">
-                <choice>
-                  <value>strict</value>
-                  <value>preferred</value>
-                  <value>interleave</value>
-                </choice>
-              </attribute>
-              <attribute name="nodeset">
-                <ref name="cpuset"/>
-              </attribute>
-            </element>
-          </optional>
-        </element>
-      </optional>
-    </interleave>
-  </define>
-  <define name="clock">
-    <optional>
-      <element name="clock">
-        <choice>
-          <attribute name="offset">
-            <value>localtime</value>
-          </attribute>
-          <attribute name="offset">
-            <value>utc</value>
-          </attribute>
-          <group>
-            <attribute name="offset">
-              <value>timezone</value>
-            </attribute>
-            <optional>
-              <attribute name="timezone">
-                <ref name="timeZone"/>
-              </attribute>
-            </optional>
-          </group>
-          <group>
-            <attribute name="offset">
-              <value>variable</value>
-            </attribute>
-            <optional>
-              <attribute name="adjustment">
-                <ref name="timeDelta"/>
-              </attribute>
-            </optional>
-          </group>
-        </choice>
-        <zeroOrMore>
-          <ref name="timer"/>
-        </zeroOrMore>
-      </element>
-    </optional>
-  </define>
-  <define name="timer">
-    <element name="timer">
-      <attribute name="name">
-        <choice>
-          <value>platform</value>
-          <value>pit</value>
-          <value>rtc</value>
-          <value>hpet</value>
-          <value>tsc</value>
-        </choice>
-      </attribute>
-      <optional>
-        <attribute name="track">
-          <choice>
-            <value>boot</value>
-            <value>guest</value>
-            <value>wall</value>
-          </choice>
-        </attribute>
-      </optional>
-      <optional>
-        <attribute name="tickpolicy">
-          <choice>
-            <value>delay</value>
-            <value>catchup</value>
-            <value>merge</value>
-            <value>discard</value>
-          </choice>
-        </attribute>
-      </optional>
-      <optional>
-        <ref name="catchup"/>
-      </optional>
-      <optional>
-        <attribute name="frequency">
-          <ref name="unsignedInt"/>
-        </attribute>
-      </optional>
-      <optional>
-        <attribute name="mode">
-          <choice>
-            <value>auto</value>
-            <value>native</value>
-            <value>emulate</value>
-            <value>paravirt</value>
-            <value>smpsafe</value>
-          </choice>
-        </attribute>
-      </optional>
-      <optional>
-        <attribute name="present">
-          <choice>
-            <value>yes</value>
-            <value>no</value>
-          </choice>
-        </attribute>
-      </optional>
-      <empty/>
-    </element>
-  </define>
-  <define name="catchup">
-    <element name="catchup">
-      <optional>
-        <attribute name="threshold">
-          <ref name="unsignedInt"/>
-        </attribute>
-        <attribute name="slew">
-          <ref name="unsignedInt"/>
-        </attribute>
-        <attribute name="limit">
-          <ref name="unsignedInt"/>
-        </attribute>
-      </optional>
-    </element>
-  </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>
-      <optional>
-        <element name="kernel">
-          <ref name="absFilePath"/>
-        </element>
-      </optional>
-      <optional>
-        <element name="initrd">
-          <ref name="absFilePath"/>
-        </element>
-      </optional>
-      <optional>
-        <element name="root">
-          <ref name="absFilePath"/>
-        </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>
-      <ref name="deviceBoot"/>
-    </optional>
-    <optional>
-      <element name="readonly">
-        <empty/>
-      </element>
-    </optional>
-    <optional>
-      <element name="shareable">
-        <empty/>
-      </element>
-    </optional>
-    <optional>
-      <element name="serial">
-        <ref name="diskSerial"/>
-      </element>
-    </optional>
-    <optional>
-      <ref name="encryption"/>
-    </optional>
-    <optional>
-      <ref name="address"/>
-    </optional>
-  </define>
-
-  <define name="lease">
-    <element name="lease">
-      <interleave>
-        <element name="lockspace">
-          <text/>
-        </element>
-        <element name="key">
-          <text/>
-        </element>
-        <element name="target">
-          <attribute name="path">
-            <text/>
-          </attribute>
-          <optional>
-            <attribute name="offset">
-              <ref name="unsignedInt"/>
-            </attribute>
-          </optional>
-        </element>
-      </interleave>
-    </element>
-  </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="absFilePath"/>
-                </attribute>
-                <empty/>
-              </element>
-            </optional>
-            <ref name="diskspec"/>
-          </interleave>
-        </group>
-        <group>
-          <attribute name="type">
-            <value>dir</value>
-          </attribute>
-          <interleave>
-            <optional>
-              <element name="source">
-                <attribute name="dir">
-                  <ref name="absFilePath"/>
-                </attribute>
-                <empty/>
-              </element>
-            </optional>
-            <ref name="diskspec"/>
-          </interleave>
-        </group>
-        <group>
-          <attribute name="type">
-            <value>network</value>
-          </attribute>
-          <interleave>
-            <optional>
-              <element name="source">
-                <attribute name="protocol">
-                  <choice>
-                    <value>nbd</value>
-                    <value>rbd</value>
-                    <value>sheepdog</value>
-                  </choice>
-                </attribute>
-                <optional>
-                  <attribute name="name"/>
-                </optional>
-                <zeroOrMore>
-                  <element name="host">
-                    <attribute name="name">
-                      <ref name="dnsName"/>
-                    </attribute>
-                    <attribute name="port">
-                      <ref name="unsignedInt"/>
-                    </attribute>
-                  </element>
-                </zeroOrMore>
-                <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>fdc</value>
-            <value>scsi</value>
-            <value>virtio</value>
-            <value>xen</value>
-            <value>usb</value>
-            <value>uml</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">
-      <choice>
-        <group>
-          <ref name="driverFormat"/>
-          <optional>
-            <ref name="driverCache"/>
-          </optional>
-        </group>
-        <group>
-          <optional>
-            <ref name="driverFormat"/>
-          </optional>
-          <ref name="driverCache"/>
-        </group>
-      </choice>
-      <optional>
-        <ref name="driverErrorPolicy"/>
-      </optional>
-      <optional>
-        <ref name="driverIO"/>
-      </optional>
-      <optional>
-        <ref name="ioeventfd"/>
-      </optional>
-      <optional>
-        <ref name="event_idx"/>
-      </optional>
-      <empty/>
-    </element>
-  </define>
-  <define name="driverFormat">
-    <attribute name="name">
-      <ref name="genericName"/>
-    </attribute>
-    <optional>
-      <attribute name="type">
-        <ref name="genericName"/>
-      </attribute>
-    </optional>
-  </define>
-  <define name="driverCache">
-    <attribute name="cache">
-      <choice>
-        <value>none</value>
-        <value>writeback</value>
-        <value>writethrough</value>
-        <value>directsync</value>
-      </choice>
-    </attribute>
-  </define>
-  <define name="driverErrorPolicy">
-    <attribute name="error_policy">
-      <choice>
-        <value>stop</value>
-        <value>ignore</value>
-        <value>enospace</value>
-      </choice>
-    </attribute>
-  </define>
-  <define name="driverIO">
-    <attribute name="io">
-      <choice>
-        <value>threads</value>
-        <value>native</value>
-      </choice>
-    </attribute>
-  </define>
-  <define name="ioeventfd">
-    <attribute name="ioeventfd">
-      <choice>
-        <value>on</value>
-        <value>off</value>
-      </choice>
-    </attribute>
-  </define>
-  <define name="event_idx">
-    <attribute name="event_idx">
-      <choice>
-        <value>on</value>
-        <value>off</value>
-      </choice>
-    </attribute>
-  </define>
-  <define name="controller">
-    <element name="controller">
-      <choice>
-        <group>
-          <optional>
-            <attribute name="type">
-              <choice>
-                <value>fdc</value>
-                <value>ide</value>
-                <value>scsi</value>
-                <value>sata</value>
-                <value>ccid</value>
-                <value>usb</value>
-              </choice>
-            </attribute>
-          </optional>
-        </group>
-        <!-- virtio-serial can have 2 additional attributes -->
-        <group>
-          <attribute name="type">
-            <value>virtio-serial</value>
-          </attribute>
-          <optional>
-            <attribute name="ports">
-              <ref name="unsignedInt"/>
-            </attribute>
-          </optional>
-          <optional>
-            <attribute name="vectors">
-              <ref name="unsignedInt"/>
-            </attribute>
-          </optional>
-        </group>
-      </choice>
-      <attribute name="index">
-        <ref name="unsignedInt"/>
-      </attribute>
-      <optional>
-        <attribute name="model">
-          <choice>
-            <value>auto</value>
-            <value>buslogic</value>
-            <value>lsilogic</value>
-            <value>lsisas1068</value>
-            <value>vmpvscsi</value>
-            <value>piix3-uhci</value>
-            <value>piix4-uhci</value>
-            <value>ehci</value>
-            <value>ich9-ehci1</value>
-            <value>ich9-uhci1</value>
-            <value>ich9-uhci2</value>
-            <value>ich9-uhci3</value>
-            <value>vt82c686b-uhci</value>
-            <value>pci-ohci</value>
-          </choice>
-        </attribute>
-      </optional>
-      <optional>
-        <ref name="usbmaster"/>
-      </optional>
-      <optional>
-        <ref name="address"/>
-      </optional>
-    </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="absFilePath"/>
-              </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>
-      <optional>
-        <ref name="address"/>
-        <attribute name="accessmode">
-        <choice>
-          <value>passthrough</value>
-          <value>mapped</value>
-          <value>squash</value>
-        </choice>
-        </attribute>
-      </optional>
-    </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>
-              <optional>
-                <attribute name="portgroup">
-                  <ref name="deviceName"/>
-                </attribute>
-              </optional>
-              <empty/>
-            </element>
-            <optional>
-              <ref name="virtualPortProfile"/>
-            </optional>
-            <ref name="interface-options"/>
-          </interleave>
-        </group>
-        <group>
-          <attribute name="type">
-            <value>direct</value>
-          </attribute>
-          <interleave>
-            <element name="source">
-              <attribute name="dev">
-                <ref name="deviceName"/>
-              </attribute>
-              <optional>
-                <attribute name="mode">
-                  <ref name="bridgeMode"/>
-                </attribute>
-              </optional>
-              <empty/>
-            </element>
-            <optional>
-              <ref name="virtualPortProfile"/>
-            </optional>
-            <ref name="interface-options"/>
-          </interleave>
-        </group>
-        <group>
-          <attribute name="type">
-            <value>user</value>
-          </attribute>
-          <interleave>
-            <ref name="interface-options"/>
-          </interleave>
-        </group>
-        <group>
-          <attribute name="type">
-            <value>internal</value>
-          </attribute>
-          <interleave>
-            <element name="source">
-              <attribute name="name">
-                <ref name="deviceName"/>
-              </attribute>
-              <empty/>
-            </element>
-            <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
-        - boot order
-    -->
-  <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="macAddr"/>
-          </attribute>
-          <empty/>
-        </element>
-      </optional>
-      <optional>
-        <element name="ip">
-          <attribute name="address">
-            <ref name="ipv4Addr"/>
-          </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>
-      <optional>
-        <element name="driver">
-          <optional>
-            <attribute name="name">
-              <choice>
-                <value>qemu</value>
-                <value>vhost</value>
-              </choice>
-            </attribute>
-          </optional>
-          <optional>
-            <attribute name="txmode">
-              <choice>
-                <value>iothread</value>
-                <value>timer</value>
-              </choice>
-            </attribute>
-          </optional>
-          <optional>
-            <ref name="ioeventfd"/>
-          </optional>
-          <optional>
-            <ref name="event_idx"/>
-          </optional>
-          <empty/>
-        </element>
-      </optional>
-      <optional>
-        <ref name="address"/>
-      </optional>
-      <optional>
-        <element name="filterref">
-          <ref name="filterref-node-attributes"/>
-        </element>
-      </optional>
-      <optional>
-        <element name="tune">
-          <optional>
-            <!-- size of send buffer for network tap devices -->
-            <element name="sndbuf">
-              <ref name="unsignedInt"/>
-            </element>
-          </optional>
-        </element>
-      </optional>
-      <optional>
-        <ref name="deviceBoot"/>
-      </optional>
-      <optional>
-        <ref name="bandwidth"/>
-      </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>
-          <choice>
-            <group>
-              <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="addrIPorName"/>
-                </attribute>
-              </optional>
-            </group>
-            <group>
-              <optional>
-                <attribute name="socket">
-                  <ref name="absFilePath"/>
-                </attribute>
-              </optional>
-            </group>
-          </choice>
-          <optional>
-            <attribute name="passwd">
-              <text/>
-            </attribute>
-          </optional>
-          <optional>
-            <attribute name="keymap">
-              <text/>
-            </attribute>
-          </optional>
-          <optional>
-            <attribute name="passwdValidTo">
-              <data type="dateTime"/>
-            </attribute>
-          </optional>
-          <optional>
-            <attribute name="connected">
-              <choice>
-                <value>keep</value>
-              </choice>
-            </attribute>
-          </optional>
-          <ref name="listenElements"/>
-        </group>
-        <group>
-          <attribute name="type">
-            <value>spice</value>
-          </attribute>
-          <optional>
-            <attribute name="port">
-              <ref name="PortNumber"/>
-            </attribute>
-          </optional>
-          <optional>
-            <attribute name="tlsPort">
-              <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="addrIPorName"/>
-            </attribute>
-          </optional>
-          <optional>
-            <attribute name="passwd">
-              <text/>
-            </attribute>
-          </optional>
-          <optional>
-            <attribute name="keymap">
-              <text/>
-            </attribute>
-          </optional>
-          <optional>
-            <attribute name="passwdValidTo">
-              <data type="dateTime"/>
-            </attribute>
-          </optional>
-          <optional>
-            <attribute name="connected">
-              <choice>
-                <value>fail</value>
-                <value>disconnect</value>
-                <value>keep</value>
-              </choice>
-            </attribute>
-          </optional>
-          <interleave>
-            <ref name="listenElements"/>
-            <zeroOrMore>
-              <element name="channel">
-                <attribute name="name">
-                  <choice>
-                    <value>main</value>
-                    <value>display</value>
-                    <value>inputs</value>
-                    <value>cursor</value>
-                    <value>playback</value>
-                    <value>record</value>
-                    <value>smartcard</value>
-                  </choice>
-                </attribute>
-                <attribute name="mode">
-                  <choice>
-                    <value>any</value>
-                    <value>secure</value>
-                    <value>insecure</value>
-                  </choice>
-                </attribute>
-                <empty/>
-              </element>
-            </zeroOrMore>
-            <optional>
-              <element name="image">
-                <attribute name="compression">
-                  <choice>
-                    <value>auto_glz</value>
-                    <value>auto_lz</value>
-                    <value>quic</value>
-                    <value>glz</value>
-                    <value>lz</value>
-                    <value>off</value>
-                  </choice>
-                </attribute>
-                <empty/>
-              </element>
-            </optional>
-            <optional>
-              <element name="jpeg">
-                <attribute name="compression">
-                  <choice>
-                    <value>auto</value>
-                    <value>never</value>
-                    <value>always</value>
-                  </choice>
-                </attribute>
-                <empty/>
-              </element>
-            </optional>
-            <optional>
-              <element name="zlib">
-                <attribute name="compression">
-                  <choice>
-                    <value>auto</value>
-                    <value>never</value>
-                    <value>always</value>
-                  </choice>
-                </attribute>
-                <empty/>
-              </element>
-            </optional>
-            <optional>
-              <element name="playback">
-                <attribute name="compression">
-                  <choice>
-                    <value>on</value>
-                    <value>off</value>
-                  </choice>
-                </attribute>
-                <empty/>
-              </element>
-            </optional>
-            <optional>
-              <element name="streaming">
-                <attribute name="mode">
-                  <choice>
-                    <value>filter</value>
-                    <value>all</value>
-                    <value>off</value>
-                  </choice>
-                </attribute>
-                <empty/>
-              </element>
-            </optional>
-            <optional>
-              <element name="clipboard">
-                <attribute name="copypaste">
-                  <choice>
-                    <value>yes</value>
-                    <value>no</value>
-                  </choice>
-                </attribute>
-                <empty/>
-              </element>
-            </optional>
-          </interleave>
-        </group>
-        <group>
-          <attribute name="type">
-            <value>rdp</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="replaceUser">
-              <choice>
-                <value>yes</value>
-                <value>no</value>
-              </choice>
-            </attribute>
-          </optional>
-          <optional>
-            <attribute name="multiUser">
-              <choice>
-                <value>yes</value>
-                <value>no</value>
-              </choice>
-            </attribute>
-          </optional>
-          <optional>
-            <attribute name="listen">
-              <ref name="addrIPorName"/>
-            </attribute>
-          </optional>
-          <ref name="listenElements"/>
-        </group>
-        <group>
-          <attribute name="type">
-            <value>desktop</value>
-          </attribute>
-          <optional>
-            <attribute name="display">
-              <text/>
-            </attribute>
-          </optional>
-          <optional>
-            <attribute name="fullscreen">
-              <choice>
-                <value>yes</value>
-                <value>no</value>
-              </choice>
-            </attribute>
-          </optional>
-        </group>
-      </choice>
-    </element>
-  </define>
-
-  <define name="listenElements">
-    <zeroOrMore>
-      <element name="listen">
-        <choice>
-          <group>
-            <attribute name="type">
-              <value>address</value>
-            </attribute>
-            <attribute name="address">
-              <ref name="addrIPorName"/>
-            </attribute>
-          </group>
-          <group>
-            <attribute name="type">
-              <value>network</value>
-            </attribute>
-            <attribute name="network">
-              <text/>
-            </attribute>
-            <optional>
-              <attribute name="address">
-                <ref name="addrIPorName"/>
-              </attribute>
-            </optional>
-          </group>
-        </choice>
-      </element>
-    </zeroOrMore>
-  </define>
-  <!--
-     A video adapter description, allowing configuration of device
-     model, number of virtual heads, and video ram size
-   -->
-  <define name="video">
-    <element name="video">
-      <optional>
-        <element name="model">
-          <attribute name="type">
-            <choice>
-              <value>vga</value>
-              <value>cirrus</value>
-              <value>vmvga</value>
-              <value>xen</value>
-              <value>vbox</value>
-              <value>qxl</value>
-            </choice>
-          </attribute>
-          <optional>
-            <attribute name="vram">
-              <ref name="unsignedInt"/>
-            </attribute>
-          </optional>
-          <optional>
-            <attribute name="heads">
-              <ref name="unsignedInt"/>
-            </attribute>
-          </optional>
-          <optional>
-            <element name="acceleration">
-              <optional>
-                <attribute name="accel3d">
-                  <choice>
-                    <value>yes</value>
-                    <value>no</value>
-                  </choice>
-                </attribute>
-              </optional>
-              <optional>
-                <attribute name="accel2d">
-                  <choice>
-                    <value>yes</value>
-                    <value>no</value>
-                  </choice>
-                </attribute>
-              </optional>
-            </element>
-          </optional>
-        </element>
-      </optional>
-      <optional>
-        <ref name="address"/>
-      </optional>
-    </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="crashOptions"/>
-        </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>
-  <!--
-      Options when a domain crashes:
-      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
-      coredump-destroy: The crashed domain's core will be dumped, and then the
-                        domain will be terminated completely and all resources
-                        released
-      coredump-restart: The crashed domain's core will be dumped, and then the
-                        domain will be restarted with the same configuration
-    -->
-  <define name="crashOptions">
-    <choice>
-      <value>destroy</value>
-      <value>restart</value>
-      <value>preserve</value>
-      <value>rename-restart</value>
-      <value>coredump-destroy</value>
-      <value>coredump-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">
-    <ref name="qemucdevSrcType"/>
-    <optional>
-      <attribute name="tty">
-        <ref name="absFilePath"/>
-      </attribute>
-    </optional>
-    <interleave>
-      <ref name="qemucdevSrcDef"/>
-      <optional>
-        <ref name="qemucdevTgtDef"/>
-      </optional>
-      <optional>
-        <ref name="address"/>
-      </optional>
-    </interleave>
-  </define>
-
-  <define name="qemucdevConsoleTgtType">
-    <attribute name="type">
-      <choice>
-        <value>xen</value>
-        <value>serial</value>
-        <value>uml</value>
-        <value>virtio</value>
-      </choice>
-    </attribute>
-  </define>
-
-  <define  name="qemucdevTgtDef">
-    <element name="target">
-      <interleave>
-        <optional>
-          <ref name="qemucdevConsoleTgtType"/>
-        </optional>
-        <optional>
-          <attribute name="port"/>
-        </optional>
-      </interleave>
-    </element>
-  </define>
-
-  <define name="qemucdevSrcTypeChoice">
-    <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>
-      <value>spicevmc</value>
-    </choice>
-  </define>
-
-  <define name="qemucdevSrcType">
-    <attribute name="type">
-      <ref name="qemucdevSrcTypeChoice"/>
-    </attribute>
-  </define>
-  <define name="qemucdevSrcDef">
-    <zeroOrMore>
-      <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>
-    </zeroOrMore>
-    <optional>
-      <element name="protocol">
-        <optional>
-          <attribute name="type">
-            <choice>
-              <value>raw</value>
-              <value>telnet</value>
-              <value>telnets</value>
-              <value>tls</value>
-            </choice>
-          </attribute>
-        </optional>
-      </element>
-    </optional>
-  </define>
-  <!--
-      The description for a console
-      just a tty device
-    -->
-  <define name="console">
-    <element name="console">
-      <choice>
-        <group>
-          <optional>
-            <attribute name="tty">
-              <ref name="absFilePath"/>
-            </attribute>
-          </optional>
-          <empty/>
-        </group>
-        <choice>
-          <ref name="qemucdev"/>
-        </choice>
-      </choice>
-    </element>
-  </define>
-  <define name="sound">
-    <element name="sound">
-      <attribute name="model">
-        <choice>
-          <value>sb16</value>
-          <value>es1370</value>
-          <value>pcspk</value>
-          <value>ac97</value>
-          <value>ich6</value>
-        </choice>
-      </attribute>
-      <optional>
-        <ref name="address"/>
-      </optional>
-    </element>
-  </define>
-  <define name="watchdog">
-    <element name="watchdog">
-      <attribute name="model">
-        <choice>
-          <value>i6300esb</value>
-          <value>ib700</value>
-        </choice>
-      </attribute>
-      <optional>
-        <attribute name="action">
-          <choice>
-            <value>reset</value>
-            <value>shutdown</value>
-            <value>poweroff</value>
-            <value>pause</value>
-            <value>none</value>
-            <value>dump</value>
-          </choice>
-        </attribute>
-      </optional>
-      <optional>
-        <ref name="address"/>
-      </optional>
-    </element>
-  </define>
-  <define name="memballoon">
-    <element name="memballoon">
-      <attribute name="model">
-        <choice>
-          <value>virtio</value>
-          <value>xen</value>
-          <value>none</value>
-        </choice>
-      </attribute>
-      <optional>
-        <ref name="address"/>
-      </optional>
-    </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="guestfwdTarget">
-    <element name="target">
-      <attribute name="type">
-        <value>guestfwd</value>
-      </attribute>
-      <attribute name="address"/>
-      <attribute name="port"/>
-    </element>
-  </define>
-  <define name="virtioTarget">
-    <element name="target">
-      <attribute name="type">
-        <value>virtio</value>
-      </attribute>
-      <optional>
-        <attribute name="name"/>
-      </optional>
-    </element>
-  </define>
-  <define name="channel">
-    <element name="channel">
-      <ref name="qemucdevSrcType"/>
-      <interleave>
-        <ref name="qemucdevSrcDef"/>
-        <choice>
-          <ref name="guestfwdTarget"/>
-          <ref name="virtioTarget"/>
-        </choice>
-        <optional>
-          <ref name="address"/>
-        </optional>
-      </interleave>
-    </element>
-  </define>
-  <define name="smartcard">
-    <element name="smartcard">
-      <choice>
-        <group>
-          <attribute name="mode">
-            <value>host</value>
-          </attribute>
-          <!-- might need to add optional database element here later -->
-        </group>
-        <group>
-          <attribute name="mode">
-            <value>host-certificates</value>
-          </attribute>
-          <ref name='certificate'/>
-          <ref name='certificate'/>
-          <ref name='certificate'/>
-          <optional>
-            <element name="database">
-              <ref name="absDirPath"/>
-            </element>
-          </optional>
-        </group>
-        <group>
-          <attribute name="mode">
-            <value>passthrough</value>
-          </attribute>
-          <ref name="qemucdevSrcType"/>
-          <interleave>
-            <ref name="qemucdevSrcDef"/>
-            <optional>
-              <ref name="qemucdevTgtDef"/>
-            </optional>
-          </interleave>
-        </group>
-      </choice>
-      <optional>
-        <ref name="address"/>
-      </optional>
-    </element>
-  </define>
-  <define name="certificate">
-    <element name="certificate">
-      <text/>
-    </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>
-      <optional>
-        <ref name="address"/>
-      </optional>
-    </element>
-  </define>
-  <define name="hub">
-    <element name="hub">
-      <attribute name="type">
-        <choice>
-          <value>usb</value>
-        </choice>
-      </attribute>
-      <optional>
-        <ref name="address"/>
-      </optional>
-    </element>
-  </define>
-  <define name="redirdev">
-    <element name="redirdev">
-      <attribute name="bus">
-        <choice>
-          <value>usb</value>
-        </choice>
-      </attribute>
-      <attribute name="type">
-        <ref name="qemucdevSrcTypeChoice"/>
-      </attribute>
-      <ref name="qemucdevSrcDef"/>
-    </element>
-  </define>
-  <define name="hostdev">
-    <element name="hostdev">
-      <optional>
-        <attribute name="mode">
-          <choice>
-            <value>subsystem</value>
-            <value>capabilities</value>
-          </choice>
-        </attribute>
-      </optional>
-      <attribute name="type">
-        <choice>
-          <value>usb</value>
-          <value>pci</value>
-        </choice>
-      </attribute>
-      <optional>
-        <attribute name="managed">
-          <choice>
-            <value>yes</value>
-            <value>no</value>
-          </choice>
-        </attribute>
-      </optional>
-      <group>
-        <element name="source">
-          <choice>
-            <group>
-              <ref name="usbproduct"/>
-              <optional>
-                <ref name="usbaddress"/>
-              </optional>
-            </group>
-            <ref name="usbaddress"/>
-            <element name="address">
-              <ref name="pciaddress"/>
-            </element>
-          </choice>
-        </element>
-      </group>
-      <optional>
-        <ref name="deviceBoot"/>
-      </optional>
-      <optional>
-        <ref name="address"/>
-      </optional>
-    </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="usbPort"/>
-      </attribute>
-    </element>
-  </define>
-  <define name="usbportaddress">
-    <attribute name="bus">
-      <ref name="usbAddr"/>
-    </attribute>
-    <attribute name="port">
-      <ref name="usbPort"/>
-    </attribute>
-  </define>
-  <define name="pciaddress">
-    <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>
-  </define>
-  <define name="driveaddress">
-    <optional>
-      <attribute name="controller">
-        <ref name="driveController"/>
-      </attribute>
-    </optional>
-    <optional>
-      <attribute name="bus">
-        <ref name="driveBus"/>
-      </attribute>
-    </optional>
-    <attribute name="unit">
-      <ref name="driveUnit"/>
-    </attribute>
-  </define>
-  <define name="virtioserialaddress">
-    <attribute name="controller">
-      <ref name="driveController"/>
-    </attribute>
-    <optional>
-      <attribute name="bus">
-        <ref name="driveBus"/>
-      </attribute>
-    </optional>
-    <optional>
-      <attribute name="port">
-        <ref name="driveUnit"/>
-      </attribute>
-    </optional>
-  </define>
-  <define name="ccidaddress">
-    <attribute name="controller">
-      <ref name="driveController"/>
-    </attribute>
-    <optional>
-      <attribute name="slot">
-        <ref name="driveUnit"/>
-      </attribute>
-    </optional>
-  </define>
-  <!--
-      Devices attached to a domain.
-      Sub-elements such as <alias> are not documented here, as they
-      can only exist when generated for a live domain and are ignored
-      when defining a domain.
-    -->
-  <define name="devices">
-    <element name="devices">
-      <interleave>
-        <optional>
-          <ref name="emulator"/>
-        </optional>
-        <zeroOrMore>
-          <choice>
-            <ref name="disk"/>
-            <ref name="controller"/>
-            <ref name="lease"/>
-            <ref name="filesystem"/>
-            <ref name="interface"/>
-            <ref name="input"/>
-            <ref name="sound"/>
-            <ref name="hostdev"/>
-            <ref name="graphic"/>
-            <ref name="video"/>
-            <ref name="console"/>
-            <ref name="parallel"/>
-            <ref name="serial"/>
-            <ref name="channel"/>
-            <ref name="smartcard"/>
-            <ref name="hub"/>
-            <ref name="redirdev"/>
-          </choice>
-        </zeroOrMore>
-        <optional>
-          <ref name="watchdog"/>
-        </optional>
-        <optional>
-          <ref name="memballoon"/>
-        </optional>
-      </interleave>
-    </element>
-  </define>
-  <!--
-      A set of optional features: PAE, APIC, ACPI, and HAP 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>
-          <optional>
-            <element name="hap">
-              <empty/>
-            </element>
-          </optional>
-        </interleave>
-      </element>
-    </optional>
-  </define>
-  <!--
-      CPU specification
-      -->
-  <define name="cpu">
-    <element name="cpu">
-      <choice>
-        <ref name="cpuTopology"/>
-        <group>
-          <ref name="cpuMatch"/>
-          <interleave>
-            <ref name="cpuModel"/>
-            <optional>
-              <ref name="cpuVendor"/>
-            </optional>
-            <optional>
-              <ref name="cpuTopology"/>
-            </optional>
-            <zeroOrMore>
-              <ref name="cpuFeature"/>
-            </zeroOrMore>
-          </interleave>
-        </group>
-      </choice>
-    </element>
-  </define>
-
-  <define name="cpuMatch">
-    <attribute name="match">
-      <choice>
-        <value>minimum</value>
-        <value>exact</value>
-        <value>strict</value>
-      </choice>
-    </attribute>
-  </define>
-
-  <define name="cpuModel">
-    <element name="model">
-      <text/>
-    </element>
-  </define>
-
-  <define name="cpuVendor">
-    <element name="vendor">
-      <text/>
-    </element>
-  </define>
-
-  <define name="cpuFeature">
-    <element name="feature">
-      <attribute name="policy">
-        <choice>
-          <value>force</value>
-          <value>require</value>
-          <value>optional</value>
-          <value>disable</value>
-          <value>forbid</value>
-        </choice>
-      </attribute>
-      <attribute name="name">
-        <ref name="featureName"/>
-      </attribute>
-      <empty/>
-    </element>
-  </define>
-
-  <define name="cpuTopology">
-    <element name="topology">
-      <attribute name="sockets">
-        <ref name="positiveInteger"/>
-      </attribute>
-      <attribute name="cores">
-        <ref name="positiveInteger"/>
-      </attribute>
-      <attribute name="threads">
-        <ref name="positiveInteger"/>
-      </attribute>
-    </element>
-  </define>
-
-  <!--
-      System information specification:
-       Placeholder for system specific informations likes the ones
-       contained in the SMBIOS area.
-       Only a limited subset of entries can be modified there, so we
-       fully enumerate each case here.
-       The DMTF spec doesn't specify any string subset, just 0 terminated
-       byte strings, but better be safe and restrict at least the names
-       to avoid problems with space normalization in attribute values,
-       the value is kept as the element body for maximum flexibility.
-       A priori we allow only type 0 and type 1 string updates
-      -->
-  <define name="sysinfo">
-    <element name="sysinfo">
-      <attribute name="type">
-        <value>smbios</value>
-      </attribute>
-      <interleave>
-        <optional>
-          <element name="bios">
-            <oneOrMore>
-              <element name="entry">
-                <attribute name="name">
-                  <ref name="sysinfo-bios-name"/>
-                </attribute>
-                <ref name="sysinfo-value"/>
-              </element>
-            </oneOrMore>
-          </element>
-        </optional>
-        <optional>
-          <element name="system">
-            <oneOrMore>
-              <element name="entry">
-                <attribute name="name">
-                  <ref name="sysinfo-system-name"/>
-                </attribute>
-                <ref name="sysinfo-value"/>
-              </element>
-            </oneOrMore>
-          </element>
-        </optional>
-      </interleave>
-    </element>
-  </define>
-
-  <define name="sysinfo-bios-name">
-    <choice>
-      <value>vendor</value>
-      <value>version</value>
-      <value>date</value>
-      <value>release</value>
-    </choice>
-  </define>
-
-  <define name="sysinfo-system-name">
-    <choice>
-      <value>manufacturer</value>
-      <value>product</value>
-      <value>version</value>
-      <value>serial</value>
-      <value>uuid</value>
-      <value>sku</value>
-      <value>family</value>
-    </choice>
-  </define>
-
-  <define name="sysinfo-value">
-    <data type="string">
-      <param name='pattern'>[a-zA-Z0-9/\-_\. \(\)]+</param>
-    </data>
-  </define>
-
-  <define name="smbios">
-    <element name="smbios">
-      <attribute name="mode">
-        <choice>
-          <value>emulate</value>
-          <value>host</value>
-          <value>sysinfo</value>
-        </choice>
-      </attribute>
-      <empty/>
-    </element>
-  </define>
-
-  <define name="bios">
-    <element name="bios">
-      <attribute name="useserial">
-        <choice>
-          <value>yes</value>
-          <value>no</value>
-        </choice>
-      </attribute>
-    </element>
-  </define>
-
-  <define name="address">
-    <element name="address">
-      <choice>
-        <group>
-          <attribute name="type">
-            <value>pci</value>
-          </attribute>
-          <ref name="pciaddress"/>
-        </group>
-        <group>
-          <attribute name="type">
-            <value>drive</value>
-          </attribute>
-          <ref name="driveaddress"/>
-        </group>
-        <group>
-          <attribute name="type">
-            <value>virtio-serial</value>
-          </attribute>
-          <ref name="virtioserialaddress"/>
-        </group>
-        <group>
-          <attribute name="type">
-            <value>ccid</value>
-          </attribute>
-          <ref name="ccidaddress"/>
-        </group>
-        <group>
-          <attribute name="type">
-            <value>usb</value>
-          </attribute>
-          <ref name="usbportaddress"/>
-        </group>
-      </choice>
-    </element>
-  </define>
-
-  <define name="usbmaster">
-    <element name="master">
-      <attribute name="startport">
-        <ref name="usbPort"/>
-      </attribute>
-      <empty/>
-    </element>
-  </define>
-
-  <define name="filterref-node-attributes">
-    <attribute name="filter">
-      <data type="NCName"/>
-    </attribute>
-    <optional>
-      <element name="parameter">
-        <attribute name="name">
-          <ref name="filter-param-name"/>
-        </attribute>
-        <attribute name="value">
-          <ref name="filter-param-value"/>
-        </attribute>
-      </element>
-    </optional>
-  </define>
-
-  <define name="deviceBoot">
-    <element name="boot">
-      <attribute name="order">
-        <ref name="positiveInteger"/>
-      </attribute>
-      <empty/>
-    </element>
-  </define>
-
-  <!--
-       Optional hypervisor extensions in their own namespace:
-         QEmu
-    -->
-  <define name="qemucmdline">
-    <element name="commandline" ns="http://libvirt.org/schemas/domain/qemu/1.0">
-      <zeroOrMore>
-        <element name="arg">
-          <attribute name='value'/>
-        </element>
-      </zeroOrMore>
-      <zeroOrMore>
-        <element name="env">
-          <attribute name='name'>
-            <ref name="filter-param-name"/>
-          </attribute>
-          <optional>
-            <attribute name='value'/>
-          </optional>
-          <empty/>
-        </element>
-      </zeroOrMore>
-    </element>
-  </define>
-
-  <!--
-       Type library
-
-       A domain name should be made of ascii, numbers, _-+ and is non-empty
-       memoryKB request at least 4Mbytes though Xen will grow bigger if too low
-       weight currently is in range [100, 1000]
-    -->
-  <define name="cpuset">
-    <data type="string">
-      <param name="pattern">([0-9]+(-[0-9]+)?|\^[0-9]+)(,([0-9]+(-[0-9]+)?|\^[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="vcpuid">
-    <data type="unsignedShort">
-      <param name="pattern">[0-9]+</param>
-    </data>
-  </define>
-  <define name="cpushares">
-    <data type="unsignedInt">
-      <param name="pattern">[0-9]+</param>
-    </data>
-  </define>
-  <define name="cpuperiod">
-    <data type="unsignedLong">
-      <param name="pattern">[0-9]+</param>
-      <param name="minInclusive">1000</param>
-      <param name="maxInclusive">1000000</param>
-    </data>
-  </define>
-  <define name="cpuquota">
-    <data type="long">
-      <param name="pattern">-?[0-9]+</param>
-      <param name="maxInclusive">18446744073709551</param>
-      <param name='minInclusive'>-1</param>
-    </data>
-  </define>
-  <define name="PortNumber">
-    <data type="short">
-      <param name="minInclusive">-1</param>
-    </data>
-  </define>
-  <define name="weight">
-    <data type="unsignedInt">
-      <param name="pattern">[0-9]+</param>
-      <param name="minInclusive">100</param>
-      <param name="maxInclusive">1000</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="diskSerial">
-    <data type="string">
-      <param name="pattern">[A-Za-z0-9_\.\+\-]+</param>
-    </data>
-  </define>
-  <define name="genericName">
-    <data type="string">
-      <param name="pattern">[a-zA-Z0-9_\+\-]+</param>
-    </data>
-  </define>
-  <define name="bridgeMode">
-    <data type="string">
-      <param name="pattern">(vepa|bridge|private|passthrough)</param>
-    </data>
-  </define>
-  <define name="addrIPorName">
-    <data type="string">
-      <param name="pattern">(([0-2]?[0-9]?[0-9]\.){3}[0-2]?[0-9]?[0-9])|(([0-9a-fA-F]+|:)+[0-9a-fA-F]+)|([a-zA-Z0-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="usbPort">
-    <data type="string">
-      <param name="pattern">((0x)?[0-9a-fA-F]{1,3}\.){0,3}(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>
-  <define name="driveController">
-    <data type="string">
-      <param name="pattern">[0-9]{1,2}</param>
-    </data>
-  </define>
-  <define name="driveBus">
-    <data type="string">
-      <param name="pattern">[0-9]{1,2}</param>
-    </data>
-  </define>
-  <define name="driveUnit">
-    <data type="string">
-      <param name="pattern">[0-9]{1,2}</param>
-    </data>
-  </define>
-  <define name="featureName">
-    <data type="string">
-      <param name='pattern'>[a-zA-Z0-9\-_]+</param>
-    </data>
-  </define>
-  <define name="timeDelta">
-    <data type="string">
-      <param name="pattern">(-|\+)?[0-9]+</param>
-    </data>
-  </define>
-  <define name="timeZone">
-    <data type="string">
-      <param name="pattern">[a-zA-Z0-9_\.\+\-/]+</param>
-    </data>
-  </define>
-  <define name="filter-param-name">
-    <data type="string">
-      <param name="pattern">[a-zA-Z0-9_]+</param>
-    </data>
-  </define>
-  <define name="filter-param-value">
-    <data type="string">
-      <param name="pattern">[a-zA-Z0-9_\.:]+</param>
-    </data>
-  </define>
+  <include href='domaincommon.rng'/>
 </grammar>
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
new file mode 100644 (file)
index 0000000..8e7fd63
--- /dev/null
@@ -0,0 +1,2631 @@
+<?xml version="1.0"?>
+<grammar xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
+  <!-- domain-related definitions used in multiple grammars -->
+  <include href='basictypes.rng'/>
+  <include href='storageencryption.rng'/>
+  <include href='networkcommon.rng'/>
+
+  <!--
+    description element, may be placed anywhere under the root
+    -->
+  <define name="description">
+    <element name="description">
+      <text/>
+    </element>
+  </define>
+
+  <!--
+      We handle only document defining a domain
+    -->
+  <define name="domain">
+    <element name="domain">
+      <ref name="hvs"/>
+      <ref name="ids"/>
+      <interleave>
+        <optional>
+          <ref name="description"/>
+        </optional>
+        <optional>
+          <ref name="cpu"/>
+        </optional>
+        <optional>
+          <ref name="sysinfo"/>
+        </optional>
+        <ref name="os"/>
+        <ref name="clock"/>
+        <ref name="resources"/>
+        <ref name="features"/>
+        <ref name="termination"/>
+        <optional>
+          <ref name="devices"/>
+        </optional>
+        <optional>
+          <ref name="seclabel"/>
+        </optional>
+        <optional>
+          <ref name='qemucmdline'/>
+        </optional>
+      </interleave>
+    </element>
+  </define>
+  <define name="seclabel">
+    <element name="seclabel">
+      <attribute name="model">
+        <text/>
+      </attribute>
+      <attribute name="type">
+        <choice>
+          <value>dynamic</value>
+          <value>static</value>
+        </choice>
+      </attribute>
+      <attribute name="relabel">
+        <choice>
+          <value>yes</value>
+          <value>no</value>
+        </choice>
+      </attribute>
+      <element name="label">
+        <text/>
+      </element>
+      <element name="imagelabel">
+        <text/>
+      </element>
+      <element name="baselabel">
+        <text/>
+      </element>
+    </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"/>
+          <zeroOrMore>
+            <ref name="osbootdev"/>
+          </zeroOrMore>
+        </choice>
+        <optional>
+          <element name="bootmenu">
+            <attribute name="enable">
+              <choice>
+                <value>yes</value>
+                <value>no</value>
+              </choice>
+            </attribute>
+          </element>
+        </optional>
+        <optional>
+          <ref name="smbios"/>
+        </optional>
+        <optional>
+          <ref name="bios"/>
+        </optional>
+      </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>
+      <optional>
+        <attribute name="arch">
+          <choice>
+            <value>i686</value>
+            <value>x86_64</value>
+          </choice>
+        </attribute>
+      </optional>
+      <optional>
+        <attribute name="machine">
+          <data type="string">
+            <param name="pattern">[a-zA-Z0-9_\.\-]+</param>
+          </data>
+        </attribute>
+      </optional>
+    </group>
+  </define>
+  <define name="hvmmips">
+    <group>
+      <optional>
+        <attribute name="arch">
+          <value>mips</value>
+        </attribute>
+      </optional>
+      <optional>
+        <attribute name="machine">
+          <value>mips</value>
+        </attribute>
+      </optional>
+    </group>
+  </define>
+  <define name="hvmsparc">
+    <group>
+      <optional>
+        <attribute name="arch">
+          <value>sparc</value>
+        </attribute>
+      </optional>
+      <optional>
+        <attribute name="machine">
+          <value>sun4m</value>
+        </attribute>
+      </optional>
+    </group>
+  </define>
+  <define name="hvmppc">
+    <group>
+      <optional>
+        <attribute name="arch">
+          <value>ppc</value>
+        </attribute>
+      </optional>
+      <optional>
+        <attribute name="machine">
+          <choice>
+            <value>g3beige</value>
+            <value>mac99</value>
+            <value>prep</value>
+          </choice>
+        </attribute>
+      </optional>
+    </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="memoryBacking">
+          <optional>
+            <element name="hugepages">
+              <empty/>
+            </element>
+          </optional>
+        </element>
+      </optional>
+
+      <!-- The Blkio cgroup related tunables would go in the blkiotune -->
+      <optional>
+        <element name="blkiotune">
+          <!-- I/O weight the VM can use -->
+          <optional>
+            <element name="weight">
+              <ref name="weight"/>
+            </element>
+          </optional>
+        </element>
+      </optional>
+
+      <!-- All the memory/swap related tunables would go in the memtune -->
+      <optional>
+        <element name="memtune">
+          <!-- Maximum memory the VM can use -->
+          <optional>
+            <element name="hard_limit">
+              <ref name="memoryKB"/>
+            </element>
+          </optional>
+          <!-- Minimum memory ascertained for the VM during contention -->
+          <optional>
+            <element name="soft_limit">
+              <ref name="memoryKB"/>
+            </element>
+          </optional>
+          <!-- Minimum amount of memory required to start the VM -->
+          <optional>
+            <element name="min_guarantee">
+              <ref name="memoryKB"/>
+            </element>
+          </optional>
+          <!-- Maximum swap area the VM can use -->
+          <optional>
+            <element name="swap_hard_limit">
+              <ref name="memoryKB"/>
+            </element>
+          </optional>
+        </element>
+      </optional>
+
+      <optional>
+        <element name="vcpu">
+          <optional>
+            <attribute name="cpuset">
+              <ref name="cpuset"/>
+            </attribute>
+          </optional>
+          <optional>
+            <attribute name="current">
+              <ref name="countCPU"/>
+            </attribute>
+          </optional>
+          <ref name="countCPU"/>
+        </element>
+      </optional>
+
+      <!-- All the cpu related tunables would go in the cputune -->
+      <optional>
+        <element name="cputune">
+          <optional>
+            <element name="shares">
+              <ref name="cpushares"/>
+            </element>
+          </optional>
+          <optional>
+            <element name="period">
+              <ref name="cpuperiod"/>
+            </element>
+          </optional>
+          <optional>
+            <element name="quota">
+              <ref name="cpuquota"/>
+            </element>
+          </optional>
+          <zeroOrMore>
+            <element name="vcpupin">
+              <attribute name="vcpu">
+                <ref name="vcpuid"/>
+              </attribute>
+              <attribute name="cpuset">
+                <ref name="cpuset"/>
+              </attribute>
+            </element>
+          </zeroOrMore>
+        </element>
+      </optional>
+
+      <!-- All the NUMA related tunables would go in the numatune -->
+      <optional>
+        <element name="numatune">
+          <optional>
+            <element name="memory">
+              <attribute name="mode">
+                <choice>
+                  <value>strict</value>
+                  <value>preferred</value>
+                  <value>interleave</value>
+                </choice>
+              </attribute>
+              <attribute name="nodeset">
+                <ref name="cpuset"/>
+              </attribute>
+            </element>
+          </optional>
+        </element>
+      </optional>
+    </interleave>
+  </define>
+  <define name="clock">
+    <optional>
+      <element name="clock">
+        <choice>
+          <attribute name="offset">
+            <value>localtime</value>
+          </attribute>
+          <attribute name="offset">
+            <value>utc</value>
+          </attribute>
+          <group>
+            <attribute name="offset">
+              <value>timezone</value>
+            </attribute>
+            <optional>
+              <attribute name="timezone">
+                <ref name="timeZone"/>
+              </attribute>
+            </optional>
+          </group>
+          <group>
+            <attribute name="offset">
+              <value>variable</value>
+            </attribute>
+            <optional>
+              <attribute name="adjustment">
+                <ref name="timeDelta"/>
+              </attribute>
+            </optional>
+          </group>
+        </choice>
+        <zeroOrMore>
+          <ref name="timer"/>
+        </zeroOrMore>
+      </element>
+    </optional>
+  </define>
+  <define name="timer">
+    <element name="timer">
+      <attribute name="name">
+        <choice>
+          <value>platform</value>
+          <value>pit</value>
+          <value>rtc</value>
+          <value>hpet</value>
+          <value>tsc</value>
+        </choice>
+      </attribute>
+      <optional>
+        <attribute name="track">
+          <choice>
+            <value>boot</value>
+            <value>guest</value>
+            <value>wall</value>
+          </choice>
+        </attribute>
+      </optional>
+      <optional>
+        <attribute name="tickpolicy">
+          <choice>
+            <value>delay</value>
+            <value>catchup</value>
+            <value>merge</value>
+            <value>discard</value>
+          </choice>
+        </attribute>
+      </optional>
+      <optional>
+        <ref name="catchup"/>
+      </optional>
+      <optional>
+        <attribute name="frequency">
+          <ref name="unsignedInt"/>
+        </attribute>
+      </optional>
+      <optional>
+        <attribute name="mode">
+          <choice>
+            <value>auto</value>
+            <value>native</value>
+            <value>emulate</value>
+            <value>paravirt</value>
+            <value>smpsafe</value>
+          </choice>
+        </attribute>
+      </optional>
+      <optional>
+        <attribute name="present">
+          <choice>
+            <value>yes</value>
+            <value>no</value>
+          </choice>
+        </attribute>
+      </optional>
+      <empty/>
+    </element>
+  </define>
+  <define name="catchup">
+    <element name="catchup">
+      <optional>
+        <attribute name="threshold">
+          <ref name="unsignedInt"/>
+        </attribute>
+        <attribute name="slew">
+          <ref name="unsignedInt"/>
+        </attribute>
+        <attribute name="limit">
+          <ref name="unsignedInt"/>
+        </attribute>
+      </optional>
+    </element>
+  </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>
+      <optional>
+        <element name="kernel">
+          <ref name="absFilePath"/>
+        </element>
+      </optional>
+      <optional>
+        <element name="initrd">
+          <ref name="absFilePath"/>
+        </element>
+      </optional>
+      <optional>
+        <element name="root">
+          <ref name="absFilePath"/>
+        </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>
+      <ref name="deviceBoot"/>
+    </optional>
+    <optional>
+      <element name="readonly">
+        <empty/>
+      </element>
+    </optional>
+    <optional>
+      <element name="shareable">
+        <empty/>
+      </element>
+    </optional>
+    <optional>
+      <element name="serial">
+        <ref name="diskSerial"/>
+      </element>
+    </optional>
+    <optional>
+      <ref name="encryption"/>
+    </optional>
+    <optional>
+      <ref name="address"/>
+    </optional>
+  </define>
+
+  <define name="lease">
+    <element name="lease">
+      <interleave>
+        <element name="lockspace">
+          <text/>
+        </element>
+        <element name="key">
+          <text/>
+        </element>
+        <element name="target">
+          <attribute name="path">
+            <text/>
+          </attribute>
+          <optional>
+            <attribute name="offset">
+              <ref name="unsignedInt"/>
+            </attribute>
+          </optional>
+        </element>
+      </interleave>
+    </element>
+  </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="absFilePath"/>
+                </attribute>
+                <empty/>
+              </element>
+            </optional>
+            <ref name="diskspec"/>
+          </interleave>
+        </group>
+        <group>
+          <attribute name="type">
+            <value>dir</value>
+          </attribute>
+          <interleave>
+            <optional>
+              <element name="source">
+                <attribute name="dir">
+                  <ref name="absFilePath"/>
+                </attribute>
+                <empty/>
+              </element>
+            </optional>
+            <ref name="diskspec"/>
+          </interleave>
+        </group>
+        <group>
+          <attribute name="type">
+            <value>network</value>
+          </attribute>
+          <interleave>
+            <optional>
+              <element name="source">
+                <attribute name="protocol">
+                  <choice>
+                    <value>nbd</value>
+                    <value>rbd</value>
+                    <value>sheepdog</value>
+                  </choice>
+                </attribute>
+                <optional>
+                  <attribute name="name"/>
+                </optional>
+                <zeroOrMore>
+                  <element name="host">
+                    <attribute name="name">
+                      <ref name="dnsName"/>
+                    </attribute>
+                    <attribute name="port">
+                      <ref name="unsignedInt"/>
+                    </attribute>
+                  </element>
+                </zeroOrMore>
+                <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>fdc</value>
+            <value>scsi</value>
+            <value>virtio</value>
+            <value>xen</value>
+            <value>usb</value>
+            <value>uml</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">
+      <choice>
+        <group>
+          <ref name="driverFormat"/>
+          <optional>
+            <ref name="driverCache"/>
+          </optional>
+        </group>
+        <group>
+          <optional>
+            <ref name="driverFormat"/>
+          </optional>
+          <ref name="driverCache"/>
+        </group>
+      </choice>
+      <optional>
+        <ref name="driverErrorPolicy"/>
+      </optional>
+      <optional>
+        <ref name="driverIO"/>
+      </optional>
+      <optional>
+        <ref name="ioeventfd"/>
+      </optional>
+      <optional>
+        <ref name="event_idx"/>
+      </optional>
+      <empty/>
+    </element>
+  </define>
+  <define name="driverFormat">
+    <attribute name="name">
+      <ref name="genericName"/>
+    </attribute>
+    <optional>
+      <attribute name="type">
+        <ref name="genericName"/>
+      </attribute>
+    </optional>
+  </define>
+  <define name="driverCache">
+    <attribute name="cache">
+      <choice>
+        <value>none</value>
+        <value>writeback</value>
+        <value>writethrough</value>
+        <value>directsync</value>
+      </choice>
+    </attribute>
+  </define>
+  <define name="driverErrorPolicy">
+    <attribute name="error_policy">
+      <choice>
+        <value>stop</value>
+        <value>ignore</value>
+        <value>enospace</value>
+      </choice>
+    </attribute>
+  </define>
+  <define name="driverIO">
+    <attribute name="io">
+      <choice>
+        <value>threads</value>
+        <value>native</value>
+      </choice>
+    </attribute>
+  </define>
+  <define name="ioeventfd">
+    <attribute name="ioeventfd">
+      <choice>
+        <value>on</value>
+        <value>off</value>
+      </choice>
+    </attribute>
+  </define>
+  <define name="event_idx">
+    <attribute name="event_idx">
+      <choice>
+        <value>on</value>
+        <value>off</value>
+      </choice>
+    </attribute>
+  </define>
+  <define name="controller">
+    <element name="controller">
+      <choice>
+        <group>
+          <optional>
+            <attribute name="type">
+              <choice>
+                <value>fdc</value>
+                <value>ide</value>
+                <value>scsi</value>
+                <value>sata</value>
+                <value>ccid</value>
+                <value>usb</value>
+              </choice>
+            </attribute>
+          </optional>
+        </group>
+        <!-- virtio-serial can have 2 additional attributes -->
+        <group>
+          <attribute name="type">
+            <value>virtio-serial</value>
+          </attribute>
+          <optional>
+            <attribute name="ports">
+              <ref name="unsignedInt"/>
+            </attribute>
+          </optional>
+          <optional>
+            <attribute name="vectors">
+              <ref name="unsignedInt"/>
+            </attribute>
+          </optional>
+        </group>
+      </choice>
+      <attribute name="index">
+        <ref name="unsignedInt"/>
+      </attribute>
+      <optional>
+        <attribute name="model">
+          <choice>
+            <value>auto</value>
+            <value>buslogic</value>
+            <value>lsilogic</value>
+            <value>lsisas1068</value>
+            <value>vmpvscsi</value>
+            <value>piix3-uhci</value>
+            <value>piix4-uhci</value>
+            <value>ehci</value>
+            <value>ich9-ehci1</value>
+            <value>ich9-uhci1</value>
+            <value>ich9-uhci2</value>
+            <value>ich9-uhci3</value>
+            <value>vt82c686b-uhci</value>
+            <value>pci-ohci</value>
+          </choice>
+        </attribute>
+      </optional>
+      <optional>
+        <ref name="usbmaster"/>
+      </optional>
+      <optional>
+        <ref name="address"/>
+      </optional>
+    </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="absFilePath"/>
+              </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>
+      <optional>
+        <ref name="address"/>
+        <attribute name="accessmode">
+        <choice>
+          <value>passthrough</value>
+          <value>mapped</value>
+          <value>squash</value>
+        </choice>
+        </attribute>
+      </optional>
+    </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>
+              <optional>
+                <attribute name="portgroup">
+                  <ref name="deviceName"/>
+                </attribute>
+              </optional>
+              <empty/>
+            </element>
+            <optional>
+              <ref name="virtualPortProfile"/>
+            </optional>
+            <ref name="interface-options"/>
+          </interleave>
+        </group>
+        <group>
+          <attribute name="type">
+            <value>direct</value>
+          </attribute>
+          <interleave>
+            <element name="source">
+              <attribute name="dev">
+                <ref name="deviceName"/>
+              </attribute>
+              <optional>
+                <attribute name="mode">
+                  <ref name="bridgeMode"/>
+                </attribute>
+              </optional>
+              <empty/>
+            </element>
+            <optional>
+              <ref name="virtualPortProfile"/>
+            </optional>
+            <ref name="interface-options"/>
+          </interleave>
+        </group>
+        <group>
+          <attribute name="type">
+            <value>user</value>
+          </attribute>
+          <interleave>
+            <ref name="interface-options"/>
+          </interleave>
+        </group>
+        <group>
+          <attribute name="type">
+            <value>internal</value>
+          </attribute>
+          <interleave>
+            <element name="source">
+              <attribute name="name">
+                <ref name="deviceName"/>
+              </attribute>
+              <empty/>
+            </element>
+            <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
+        - boot order
+    -->
+  <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="macAddr"/>
+          </attribute>
+          <empty/>
+        </element>
+      </optional>
+      <optional>
+        <element name="ip">
+          <attribute name="address">
+            <ref name="ipv4Addr"/>
+          </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>
+      <optional>
+        <element name="driver">
+          <optional>
+            <attribute name="name">
+              <choice>
+                <value>qemu</value>
+                <value>vhost</value>
+              </choice>
+            </attribute>
+          </optional>
+          <optional>
+            <attribute name="txmode">
+              <choice>
+                <value>iothread</value>
+                <value>timer</value>
+              </choice>
+            </attribute>
+          </optional>
+          <optional>
+            <ref name="ioeventfd"/>
+          </optional>
+          <optional>
+            <ref name="event_idx"/>
+          </optional>
+          <empty/>
+        </element>
+      </optional>
+      <optional>
+        <ref name="address"/>
+      </optional>
+      <optional>
+        <element name="filterref">
+          <ref name="filterref-node-attributes"/>
+        </element>
+      </optional>
+      <optional>
+        <element name="tune">
+          <optional>
+            <!-- size of send buffer for network tap devices -->
+            <element name="sndbuf">
+              <ref name="unsignedInt"/>
+            </element>
+          </optional>
+        </element>
+      </optional>
+      <optional>
+        <ref name="deviceBoot"/>
+      </optional>
+      <optional>
+        <ref name="bandwidth"/>
+      </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>
+          <choice>
+            <group>
+              <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="addrIPorName"/>
+                </attribute>
+              </optional>
+            </group>
+            <group>
+              <optional>
+                <attribute name="socket">
+                  <ref name="absFilePath"/>
+                </attribute>
+              </optional>
+            </group>
+          </choice>
+          <optional>
+            <attribute name="passwd">
+              <text/>
+            </attribute>
+          </optional>
+          <optional>
+            <attribute name="keymap">
+              <text/>
+            </attribute>
+          </optional>
+          <optional>
+            <attribute name="passwdValidTo">
+              <data type="dateTime"/>
+            </attribute>
+          </optional>
+          <optional>
+            <attribute name="connected">
+              <choice>
+                <value>keep</value>
+              </choice>
+            </attribute>
+          </optional>
+          <ref name="listenElements"/>
+        </group>
+        <group>
+          <attribute name="type">
+            <value>spice</value>
+          </attribute>
+          <optional>
+            <attribute name="port">
+              <ref name="PortNumber"/>
+            </attribute>
+          </optional>
+          <optional>
+            <attribute name="tlsPort">
+              <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="addrIPorName"/>
+            </attribute>
+          </optional>
+          <optional>
+            <attribute name="passwd">
+              <text/>
+            </attribute>
+          </optional>
+          <optional>
+            <attribute name="keymap">
+              <text/>
+            </attribute>
+          </optional>
+          <optional>
+            <attribute name="passwdValidTo">
+              <data type="dateTime"/>
+            </attribute>
+          </optional>
+          <optional>
+            <attribute name="connected">
+              <choice>
+                <value>fail</value>
+                <value>disconnect</value>
+                <value>keep</value>
+              </choice>
+            </attribute>
+          </optional>
+          <interleave>
+            <ref name="listenElements"/>
+            <zeroOrMore>
+              <element name="channel">
+                <attribute name="name">
+                  <choice>
+                    <value>main</value>
+                    <value>display</value>
+                    <value>inputs</value>
+                    <value>cursor</value>
+                    <value>playback</value>
+                    <value>record</value>
+                    <value>smartcard</value>
+                  </choice>
+                </attribute>
+                <attribute name="mode">
+                  <choice>
+                    <value>any</value>
+                    <value>secure</value>
+                    <value>insecure</value>
+                  </choice>
+                </attribute>
+                <empty/>
+              </element>
+            </zeroOrMore>
+            <optional>
+              <element name="image">
+                <attribute name="compression">
+                  <choice>
+                    <value>auto_glz</value>
+                    <value>auto_lz</value>
+                    <value>quic</value>
+                    <value>glz</value>
+                    <value>lz</value>
+                    <value>off</value>
+                  </choice>
+                </attribute>
+                <empty/>
+              </element>
+            </optional>
+            <optional>
+              <element name="jpeg">
+                <attribute name="compression">
+                  <choice>
+                    <value>auto</value>
+                    <value>never</value>
+                    <value>always</value>
+                  </choice>
+                </attribute>
+                <empty/>
+              </element>
+            </optional>
+            <optional>
+              <element name="zlib">
+                <attribute name="compression">
+                  <choice>
+                    <value>auto</value>
+                    <value>never</value>
+                    <value>always</value>
+                  </choice>
+                </attribute>
+                <empty/>
+              </element>
+            </optional>
+            <optional>
+              <element name="playback">
+                <attribute name="compression">
+                  <choice>
+                    <value>on</value>
+                    <value>off</value>
+                  </choice>
+                </attribute>
+                <empty/>
+              </element>
+            </optional>
+            <optional>
+              <element name="streaming">
+                <attribute name="mode">
+                  <choice>
+                    <value>filter</value>
+                    <value>all</value>
+                    <value>off</value>
+                  </choice>
+                </attribute>
+                <empty/>
+              </element>
+            </optional>
+            <optional>
+              <element name="clipboard">
+                <attribute name="copypaste">
+                  <choice>
+                    <value>yes</value>
+                    <value>no</value>
+                  </choice>
+                </attribute>
+                <empty/>
+              </element>
+            </optional>
+          </interleave>
+        </group>
+        <group>
+          <attribute name="type">
+            <value>rdp</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="replaceUser">
+              <choice>
+                <value>yes</value>
+                <value>no</value>
+              </choice>
+            </attribute>
+          </optional>
+          <optional>
+            <attribute name="multiUser">
+              <choice>
+                <value>yes</value>
+                <value>no</value>
+              </choice>
+            </attribute>
+          </optional>
+          <optional>
+            <attribute name="listen">
+              <ref name="addrIPorName"/>
+            </attribute>
+          </optional>
+          <ref name="listenElements"/>
+        </group>
+        <group>
+          <attribute name="type">
+            <value>desktop</value>
+          </attribute>
+          <optional>
+            <attribute name="display">
+              <text/>
+            </attribute>
+          </optional>
+          <optional>
+            <attribute name="fullscreen">
+              <choice>
+                <value>yes</value>
+                <value>no</value>
+              </choice>
+            </attribute>
+          </optional>
+        </group>
+      </choice>
+    </element>
+  </define>
+
+  <define name="listenElements">
+    <zeroOrMore>
+      <element name="listen">
+        <choice>
+          <group>
+            <attribute name="type">
+              <value>address</value>
+            </attribute>
+            <attribute name="address">
+              <ref name="addrIPorName"/>
+            </attribute>
+          </group>
+          <group>
+            <attribute name="type">
+              <value>network</value>
+            </attribute>
+            <attribute name="network">
+              <text/>
+            </attribute>
+            <optional>
+              <attribute name="address">
+                <ref name="addrIPorName"/>
+              </attribute>
+            </optional>
+          </group>
+        </choice>
+      </element>
+    </zeroOrMore>
+  </define>
+  <!--
+     A video adapter description, allowing configuration of device
+     model, number of virtual heads, and video ram size
+   -->
+  <define name="video">
+    <element name="video">
+      <optional>
+        <element name="model">
+          <attribute name="type">
+            <choice>
+              <value>vga</value>
+              <value>cirrus</value>
+              <value>vmvga</value>
+              <value>xen</value>
+              <value>vbox</value>
+              <value>qxl</value>
+            </choice>
+          </attribute>
+          <optional>
+            <attribute name="vram">
+              <ref name="unsignedInt"/>
+            </attribute>
+          </optional>
+          <optional>
+            <attribute name="heads">
+              <ref name="unsignedInt"/>
+            </attribute>
+          </optional>
+          <optional>
+            <element name="acceleration">
+              <optional>
+                <attribute name="accel3d">
+                  <choice>
+                    <value>yes</value>
+                    <value>no</value>
+                  </choice>
+                </attribute>
+              </optional>
+              <optional>
+                <attribute name="accel2d">
+                  <choice>
+                    <value>yes</value>
+                    <value>no</value>
+                  </choice>
+                </attribute>
+              </optional>
+            </element>
+          </optional>
+        </element>
+      </optional>
+      <optional>
+        <ref name="address"/>
+      </optional>
+    </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="crashOptions"/>
+        </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>
+  <!--
+      Options when a domain crashes:
+      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
+      coredump-destroy: The crashed domain's core will be dumped, and then the
+                        domain will be terminated completely and all resources
+                        released
+      coredump-restart: The crashed domain's core will be dumped, and then the
+                        domain will be restarted with the same configuration
+    -->
+  <define name="crashOptions">
+    <choice>
+      <value>destroy</value>
+      <value>restart</value>
+      <value>preserve</value>
+      <value>rename-restart</value>
+      <value>coredump-destroy</value>
+      <value>coredump-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">
+    <ref name="qemucdevSrcType"/>
+    <optional>
+      <attribute name="tty">
+        <ref name="absFilePath"/>
+      </attribute>
+    </optional>
+    <interleave>
+      <ref name="qemucdevSrcDef"/>
+      <optional>
+        <ref name="qemucdevTgtDef"/>
+      </optional>
+      <optional>
+        <ref name="address"/>
+      </optional>
+    </interleave>
+  </define>
+
+  <define name="qemucdevConsoleTgtType">
+    <attribute name="type">
+      <choice>
+        <value>xen</value>
+        <value>serial</value>
+        <value>uml</value>
+        <value>virtio</value>
+      </choice>
+    </attribute>
+  </define>
+
+  <define  name="qemucdevTgtDef">
+    <element name="target">
+      <interleave>
+        <optional>
+          <ref name="qemucdevConsoleTgtType"/>
+        </optional>
+        <optional>
+          <attribute name="port"/>
+        </optional>
+      </interleave>
+    </element>
+  </define>
+
+  <define name="qemucdevSrcTypeChoice">
+    <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>
+      <value>spicevmc</value>
+    </choice>
+  </define>
+
+  <define name="qemucdevSrcType">
+    <attribute name="type">
+      <ref name="qemucdevSrcTypeChoice"/>
+    </attribute>
+  </define>
+  <define name="qemucdevSrcDef">
+    <zeroOrMore>
+      <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>
+    </zeroOrMore>
+    <optional>
+      <element name="protocol">
+        <optional>
+          <attribute name="type">
+            <choice>
+              <value>raw</value>
+              <value>telnet</value>
+              <value>telnets</value>
+              <value>tls</value>
+            </choice>
+          </attribute>
+        </optional>
+      </element>
+    </optional>
+  </define>
+  <!--
+      The description for a console
+      just a tty device
+    -->
+  <define name="console">
+    <element name="console">
+      <choice>
+        <group>
+          <optional>
+            <attribute name="tty">
+              <ref name="absFilePath"/>
+            </attribute>
+          </optional>
+          <empty/>
+        </group>
+        <choice>
+          <ref name="qemucdev"/>
+        </choice>
+      </choice>
+    </element>
+  </define>
+  <define name="sound">
+    <element name="sound">
+      <attribute name="model">
+        <choice>
+          <value>sb16</value>
+          <value>es1370</value>
+          <value>pcspk</value>
+          <value>ac97</value>
+          <value>ich6</value>
+        </choice>
+      </attribute>
+      <optional>
+        <ref name="address"/>
+      </optional>
+    </element>
+  </define>
+  <define name="watchdog">
+    <element name="watchdog">
+      <attribute name="model">
+        <choice>
+          <value>i6300esb</value>
+          <value>ib700</value>
+        </choice>
+      </attribute>
+      <optional>
+        <attribute name="action">
+          <choice>
+            <value>reset</value>
+            <value>shutdown</value>
+            <value>poweroff</value>
+            <value>pause</value>
+            <value>none</value>
+            <value>dump</value>
+          </choice>
+        </attribute>
+      </optional>
+      <optional>
+        <ref name="address"/>
+      </optional>
+    </element>
+  </define>
+  <define name="memballoon">
+    <element name="memballoon">
+      <attribute name="model">
+        <choice>
+          <value>virtio</value>
+          <value>xen</value>
+          <value>none</value>
+        </choice>
+      </attribute>
+      <optional>
+        <ref name="address"/>
+      </optional>
+    </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="guestfwdTarget">
+    <element name="target">
+      <attribute name="type">
+        <value>guestfwd</value>
+      </attribute>
+      <attribute name="address"/>
+      <attribute name="port"/>
+    </element>
+  </define>
+  <define name="virtioTarget">
+    <element name="target">
+      <attribute name="type">
+        <value>virtio</value>
+      </attribute>
+      <optional>
+        <attribute name="name"/>
+      </optional>
+    </element>
+  </define>
+  <define name="channel">
+    <element name="channel">
+      <ref name="qemucdevSrcType"/>
+      <interleave>
+        <ref name="qemucdevSrcDef"/>
+        <choice>
+          <ref name="guestfwdTarget"/>
+          <ref name="virtioTarget"/>
+        </choice>
+        <optional>
+          <ref name="address"/>
+        </optional>
+      </interleave>
+    </element>
+  </define>
+  <define name="smartcard">
+    <element name="smartcard">
+      <choice>
+        <group>
+          <attribute name="mode">
+            <value>host</value>
+          </attribute>
+          <!-- might need to add optional database element here later -->
+        </group>
+        <group>
+          <attribute name="mode">
+            <value>host-certificates</value>
+          </attribute>
+          <ref name='certificate'/>
+          <ref name='certificate'/>
+          <ref name='certificate'/>
+          <optional>
+            <element name="database">
+              <ref name="absDirPath"/>
+            </element>
+          </optional>
+        </group>
+        <group>
+          <attribute name="mode">
+            <value>passthrough</value>
+          </attribute>
+          <ref name="qemucdevSrcType"/>
+          <interleave>
+            <ref name="qemucdevSrcDef"/>
+            <optional>
+              <ref name="qemucdevTgtDef"/>
+            </optional>
+          </interleave>
+        </group>
+      </choice>
+      <optional>
+        <ref name="address"/>
+      </optional>
+    </element>
+  </define>
+  <define name="certificate">
+    <element name="certificate">
+      <text/>
+    </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>
+      <optional>
+        <ref name="address"/>
+      </optional>
+    </element>
+  </define>
+  <define name="hub">
+    <element name="hub">
+      <attribute name="type">
+        <choice>
+          <value>usb</value>
+        </choice>
+      </attribute>
+      <optional>
+        <ref name="address"/>
+      </optional>
+    </element>
+  </define>
+  <define name="redirdev">
+    <element name="redirdev">
+      <attribute name="bus">
+        <choice>
+          <value>usb</value>
+        </choice>
+      </attribute>
+      <attribute name="type">
+        <ref name="qemucdevSrcTypeChoice"/>
+      </attribute>
+      <ref name="qemucdevSrcDef"/>
+    </element>
+  </define>
+  <define name="hostdev">
+    <element name="hostdev">
+      <optional>
+        <attribute name="mode">
+          <choice>
+            <value>subsystem</value>
+            <value>capabilities</value>
+          </choice>
+        </attribute>
+      </optional>
+      <attribute name="type">
+        <choice>
+          <value>usb</value>
+          <value>pci</value>
+        </choice>
+      </attribute>
+      <optional>
+        <attribute name="managed">
+          <choice>
+            <value>yes</value>
+            <value>no</value>
+          </choice>
+        </attribute>
+      </optional>
+      <group>
+        <element name="source">
+          <choice>
+            <group>
+              <ref name="usbproduct"/>
+              <optional>
+                <ref name="usbaddress"/>
+              </optional>
+            </group>
+            <ref name="usbaddress"/>
+            <element name="address">
+              <ref name="pciaddress"/>
+            </element>
+          </choice>
+        </element>
+      </group>
+      <optional>
+        <ref name="deviceBoot"/>
+      </optional>
+      <optional>
+        <ref name="address"/>
+      </optional>
+    </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="usbPort"/>
+      </attribute>
+    </element>
+  </define>
+  <define name="usbportaddress">
+    <attribute name="bus">
+      <ref name="usbAddr"/>
+    </attribute>
+    <attribute name="port">
+      <ref name="usbPort"/>
+    </attribute>
+  </define>
+  <define name="pciaddress">
+    <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>
+  </define>
+  <define name="driveaddress">
+    <optional>
+      <attribute name="controller">
+        <ref name="driveController"/>
+      </attribute>
+    </optional>
+    <optional>
+      <attribute name="bus">
+        <ref name="driveBus"/>
+      </attribute>
+    </optional>
+    <attribute name="unit">
+      <ref name="driveUnit"/>
+    </attribute>
+  </define>
+  <define name="virtioserialaddress">
+    <attribute name="controller">
+      <ref name="driveController"/>
+    </attribute>
+    <optional>
+      <attribute name="bus">
+        <ref name="driveBus"/>
+      </attribute>
+    </optional>
+    <optional>
+      <attribute name="port">
+        <ref name="driveUnit"/>
+      </attribute>
+    </optional>
+  </define>
+  <define name="ccidaddress">
+    <attribute name="controller">
+      <ref name="driveController"/>
+    </attribute>
+    <optional>
+      <attribute name="slot">
+        <ref name="driveUnit"/>
+      </attribute>
+    </optional>
+  </define>
+  <!--
+      Devices attached to a domain.
+      Sub-elements such as <alias> are not documented here, as they
+      can only exist when generated for a live domain and are ignored
+      when defining a domain.
+    -->
+  <define name="devices">
+    <element name="devices">
+      <interleave>
+        <optional>
+          <ref name="emulator"/>
+        </optional>
+        <zeroOrMore>
+          <choice>
+            <ref name="disk"/>
+            <ref name="controller"/>
+            <ref name="lease"/>
+            <ref name="filesystem"/>
+            <ref name="interface"/>
+            <ref name="input"/>
+            <ref name="sound"/>
+            <ref name="hostdev"/>
+            <ref name="graphic"/>
+            <ref name="video"/>
+            <ref name="console"/>
+            <ref name="parallel"/>
+            <ref name="serial"/>
+            <ref name="channel"/>
+            <ref name="smartcard"/>
+            <ref name="hub"/>
+            <ref name="redirdev"/>
+          </choice>
+        </zeroOrMore>
+        <optional>
+          <ref name="watchdog"/>
+        </optional>
+        <optional>
+          <ref name="memballoon"/>
+        </optional>
+      </interleave>
+    </element>
+  </define>
+  <!--
+      A set of optional features: PAE, APIC, ACPI, and HAP 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>
+          <optional>
+            <element name="hap">
+              <empty/>
+            </element>
+          </optional>
+        </interleave>
+      </element>
+    </optional>
+  </define>
+  <!--
+      CPU specification
+      -->
+  <define name="cpu">
+    <element name="cpu">
+      <choice>
+        <ref name="cpuTopology"/>
+        <group>
+          <ref name="cpuMatch"/>
+          <interleave>
+            <ref name="cpuModel"/>
+            <optional>
+              <ref name="cpuVendor"/>
+            </optional>
+            <optional>
+              <ref name="cpuTopology"/>
+            </optional>
+            <zeroOrMore>
+              <ref name="cpuFeature"/>
+            </zeroOrMore>
+          </interleave>
+        </group>
+      </choice>
+    </element>
+  </define>
+
+  <define name="cpuMatch">
+    <attribute name="match">
+      <choice>
+        <value>minimum</value>
+        <value>exact</value>
+        <value>strict</value>
+      </choice>
+    </attribute>
+  </define>
+
+  <define name="cpuModel">
+    <element name="model">
+      <text/>
+    </element>
+  </define>
+
+  <define name="cpuVendor">
+    <element name="vendor">
+      <text/>
+    </element>
+  </define>
+
+  <define name="cpuFeature">
+    <element name="feature">
+      <attribute name="policy">
+        <choice>
+          <value>force</value>
+          <value>require</value>
+          <value>optional</value>
+          <value>disable</value>
+          <value>forbid</value>
+        </choice>
+      </attribute>
+      <attribute name="name">
+        <ref name="featureName"/>
+      </attribute>
+      <empty/>
+    </element>
+  </define>
+
+  <define name="cpuTopology">
+    <element name="topology">
+      <attribute name="sockets">
+        <ref name="positiveInteger"/>
+      </attribute>
+      <attribute name="cores">
+        <ref name="positiveInteger"/>
+      </attribute>
+      <attribute name="threads">
+        <ref name="positiveInteger"/>
+      </attribute>
+    </element>
+  </define>
+
+  <!--
+      System information specification:
+       Placeholder for system specific informations likes the ones
+       contained in the SMBIOS area.
+       Only a limited subset of entries can be modified there, so we
+       fully enumerate each case here.
+       The DMTF spec doesn't specify any string subset, just 0 terminated
+       byte strings, but better be safe and restrict at least the names
+       to avoid problems with space normalization in attribute values,
+       the value is kept as the element body for maximum flexibility.
+       A priori we allow only type 0 and type 1 string updates
+      -->
+  <define name="sysinfo">
+    <element name="sysinfo">
+      <attribute name="type">
+        <value>smbios</value>
+      </attribute>
+      <interleave>
+        <optional>
+          <element name="bios">
+            <oneOrMore>
+              <element name="entry">
+                <attribute name="name">
+                  <ref name="sysinfo-bios-name"/>
+                </attribute>
+                <ref name="sysinfo-value"/>
+              </element>
+            </oneOrMore>
+          </element>
+        </optional>
+        <optional>
+          <element name="system">
+            <oneOrMore>
+              <element name="entry">
+                <attribute name="name">
+                  <ref name="sysinfo-system-name"/>
+                </attribute>
+                <ref name="sysinfo-value"/>
+              </element>
+            </oneOrMore>
+          </element>
+        </optional>
+      </interleave>
+    </element>
+  </define>
+
+  <define name="sysinfo-bios-name">
+    <choice>
+      <value>vendor</value>
+      <value>version</value>
+      <value>date</value>
+      <value>release</value>
+    </choice>
+  </define>
+
+  <define name="sysinfo-system-name">
+    <choice>
+      <value>manufacturer</value>
+      <value>product</value>
+      <value>version</value>
+      <value>serial</value>
+      <value>uuid</value>
+      <value>sku</value>
+      <value>family</value>
+    </choice>
+  </define>
+
+  <define name="sysinfo-value">
+    <data type="string">
+      <param name='pattern'>[a-zA-Z0-9/\-_\. \(\)]+</param>
+    </data>
+  </define>
+
+  <define name="smbios">
+    <element name="smbios">
+      <attribute name="mode">
+        <choice>
+          <value>emulate</value>
+          <value>host</value>
+          <value>sysinfo</value>
+        </choice>
+      </attribute>
+      <empty/>
+    </element>
+  </define>
+
+  <define name="bios">
+    <element name="bios">
+      <attribute name="useserial">
+        <choice>
+          <value>yes</value>
+          <value>no</value>
+        </choice>
+      </attribute>
+    </element>
+  </define>
+
+  <define name="address">
+    <element name="address">
+      <choice>
+        <group>
+          <attribute name="type">
+            <value>pci</value>
+          </attribute>
+          <ref name="pciaddress"/>
+        </group>
+        <group>
+          <attribute name="type">
+            <value>drive</value>
+          </attribute>
+          <ref name="driveaddress"/>
+        </group>
+        <group>
+          <attribute name="type">
+            <value>virtio-serial</value>
+          </attribute>
+          <ref name="virtioserialaddress"/>
+        </group>
+        <group>
+          <attribute name="type">
+            <value>ccid</value>
+          </attribute>
+          <ref name="ccidaddress"/>
+        </group>
+        <group>
+          <attribute name="type">
+            <value>usb</value>
+          </attribute>
+          <ref name="usbportaddress"/>
+        </group>
+      </choice>
+    </element>
+  </define>
+
+  <define name="usbmaster">
+    <element name="master">
+      <attribute name="startport">
+        <ref name="usbPort"/>
+      </attribute>
+      <empty/>
+    </element>
+  </define>
+
+  <define name="filterref-node-attributes">
+    <attribute name="filter">
+      <data type="NCName"/>
+    </attribute>
+    <optional>
+      <element name="parameter">
+        <attribute name="name">
+          <ref name="filter-param-name"/>
+        </attribute>
+        <attribute name="value">
+          <ref name="filter-param-value"/>
+        </attribute>
+      </element>
+    </optional>
+  </define>
+
+  <define name="deviceBoot">
+    <element name="boot">
+      <attribute name="order">
+        <ref name="positiveInteger"/>
+      </attribute>
+      <empty/>
+    </element>
+  </define>
+
+  <!--
+       Optional hypervisor extensions in their own namespace:
+         QEmu
+    -->
+  <define name="qemucmdline">
+    <element name="commandline" ns="http://libvirt.org/schemas/domain/qemu/1.0">
+      <zeroOrMore>
+        <element name="arg">
+          <attribute name='value'/>
+        </element>
+      </zeroOrMore>
+      <zeroOrMore>
+        <element name="env">
+          <attribute name='name'>
+            <ref name="filter-param-name"/>
+          </attribute>
+          <optional>
+            <attribute name='value'/>
+          </optional>
+          <empty/>
+        </element>
+      </zeroOrMore>
+    </element>
+  </define>
+
+  <!--
+       Type library
+
+       A domain name should be made of ascii, numbers, _-+ and is non-empty
+       memoryKB request at least 4Mbytes though Xen will grow bigger if too low
+       weight currently is in range [100, 1000]
+    -->
+  <define name="cpuset">
+    <data type="string">
+      <param name="pattern">([0-9]+(-[0-9]+)?|\^[0-9]+)(,([0-9]+(-[0-9]+)?|\^[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="vcpuid">
+    <data type="unsignedShort">
+      <param name="pattern">[0-9]+</param>
+    </data>
+  </define>
+  <define name="cpushares">
+    <data type="unsignedInt">
+      <param name="pattern">[0-9]+</param>
+    </data>
+  </define>
+  <define name="cpuperiod">
+    <data type="unsignedLong">
+      <param name="pattern">[0-9]+</param>
+      <param name="minInclusive">1000</param>
+      <param name="maxInclusive">1000000</param>
+    </data>
+  </define>
+  <define name="cpuquota">
+    <data type="long">
+      <param name="pattern">-?[0-9]+</param>
+      <param name="maxInclusive">18446744073709551</param>
+      <param name='minInclusive'>-1</param>
+    </data>
+  </define>
+  <define name="PortNumber">
+    <data type="short">
+      <param name="minInclusive">-1</param>
+    </data>
+  </define>
+  <define name="weight">
+    <data type="unsignedInt">
+      <param name="pattern">[0-9]+</param>
+      <param name="minInclusive">100</param>
+      <param name="maxInclusive">1000</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="diskSerial">
+    <data type="string">
+      <param name="pattern">[A-Za-z0-9_\.\+\-]+</param>
+    </data>
+  </define>
+  <define name="genericName">
+    <data type="string">
+      <param name="pattern">[a-zA-Z0-9_\+\-]+</param>
+    </data>
+  </define>
+  <define name="bridgeMode">
+    <data type="string">
+      <param name="pattern">(vepa|bridge|private|passthrough)</param>
+    </data>
+  </define>
+  <define name="addrIPorName">
+    <data type="string">
+      <param name="pattern">(([0-2]?[0-9]?[0-9]\.){3}[0-2]?[0-9]?[0-9])|(([0-9a-fA-F]+|:)+[0-9a-fA-F]+)|([a-zA-Z0-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="usbPort">
+    <data type="string">
+      <param name="pattern">((0x)?[0-9a-fA-F]{1,3}\.){0,3}(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>
+  <define name="driveController">
+    <data type="string">
+      <param name="pattern">[0-9]{1,2}</param>
+    </data>
+  </define>
+  <define name="driveBus">
+    <data type="string">
+      <param name="pattern">[0-9]{1,2}</param>
+    </data>
+  </define>
+  <define name="driveUnit">
+    <data type="string">
+      <param name="pattern">[0-9]{1,2}</param>
+    </data>
+  </define>
+  <define name="featureName">
+    <data type="string">
+      <param name='pattern'>[a-zA-Z0-9\-_]+</param>
+    </data>
+  </define>
+  <define name="timeDelta">
+    <data type="string">
+      <param name="pattern">(-|\+)?[0-9]+</param>
+    </data>
+  </define>
+  <define name="timeZone">
+    <data type="string">
+      <param name="pattern">[a-zA-Z0-9_\.\+\-/]+</param>
+    </data>
+  </define>
+  <define name="filter-param-name">
+    <data type="string">
+      <param name="pattern">[a-zA-Z0-9_]+</param>
+    </data>
+  </define>
+  <define name="filter-param-value">
+    <data type="string">
+      <param name="pattern">[a-zA-Z0-9_\.:]+</param>
+    </data>
+  </define>
+</grammar>
index 410833f670234e1eb6ec2d68f4e8a1b0e2030fb3..a16d73132ca20d925d7b56ed9109a43a8edc8388 100644 (file)
@@ -1,9 +1,12 @@
+<?xml version="1.0"?>
 <!-- A Relax NG schema for the libvirt domain snapshot properties XML format -->
 <grammar xmlns="http://relaxng.org/ns/structure/1.0">
   <start>
     <ref name='domainsnapshot'/>
   </start>
 
+  <include href='domaincommon.rng'/>
+
   <define name='domainsnapshot'>
     <element name='domainsnapshot'>
       <interleave>
           </element>
         </optional>
         <optional>
-          <element name='domain'>
-            <element name='uuid'>
-              <text/>
+          <choice>
+            <element name='domain'>
+              <element name='uuid'>
+                <ref name="UUID"/>
+              </element>
             </element>
-          </element>
+            <ref name='domain'/>
+          </choice>
         </optional>
         <optional>
           <element name='parent'>
index a7bcfd7e157f1ef70dc67aba844c45a6a4415bfd..9decc31629f32dc1573e8090178e082d13ca8e85 100644 (file)
@@ -1080,19 +1080,20 @@ fi
 %dir %{_datadir}/libvirt/
 %dir %{_datadir}/libvirt/schemas/
 
+%{_datadir}/libvirt/schemas/basictypes.rng
+%{_datadir}/libvirt/schemas/capability.rng
 %{_datadir}/libvirt/schemas/domain.rng
+%{_datadir}/libvirt/schemas/domaincommon.rng
 %{_datadir}/libvirt/schemas/domainsnapshot.rng
+%{_datadir}/libvirt/schemas/interface.rng
 %{_datadir}/libvirt/schemas/network.rng
-%{_datadir}/libvirt/schemas/storagepool.rng
-%{_datadir}/libvirt/schemas/storagevol.rng
+%{_datadir}/libvirt/schemas/networkcommon.rng
 %{_datadir}/libvirt/schemas/nodedev.rng
-%{_datadir}/libvirt/schemas/capability.rng
-%{_datadir}/libvirt/schemas/interface.rng
+%{_datadir}/libvirt/schemas/nwfilter.rng
 %{_datadir}/libvirt/schemas/secret.rng
 %{_datadir}/libvirt/schemas/storageencryption.rng
-%{_datadir}/libvirt/schemas/nwfilter.rng
-%{_datadir}/libvirt/schemas/basictypes.rng
-%{_datadir}/libvirt/schemas/networkcommon.rng
+%{_datadir}/libvirt/schemas/storagepool.rng
+%{_datadir}/libvirt/schemas/storagevol.rng
 
 %{_datadir}/libvirt/cpu_map.xml
 
index 3958d3322154275c4eee340080a4c9201b5acf81..f651d11015a69bae201caa87e018c8b27ce2edb4 100644 (file)
@@ -97,19 +97,20 @@ rm -rf $RPM_BUILD_ROOT
 
 %dir %{_mingw32_datadir}/libvirt/
 %dir %{_mingw32_datadir}/libvirt/schemas/
+%{_mingw32_datadir}/libvirt/schemas/basictypes.rng
+%{_mingw32_datadir}/libvirt/schemas/capability.rng
 %{_mingw32_datadir}/libvirt/schemas/domain.rng
+%{_mingw32_datadir}/libvirt/schemas/domaincommon.rng
 %{_mingw32_datadir}/libvirt/schemas/domainsnapshot.rng
+%{_mingw32_datadir}/libvirt/schemas/interface.rng
 %{_mingw32_datadir}/libvirt/schemas/network.rng
-%{_mingw32_datadir}/libvirt/schemas/storagepool.rng
-%{_mingw32_datadir}/libvirt/schemas/storagevol.rng
+%{_mingw32_datadir}/libvirt/schemas/networkcommon.rng
 %{_mingw32_datadir}/libvirt/schemas/nodedev.rng
-%{_mingw32_datadir}/libvirt/schemas/capability.rng
-%{_mingw32_datadir}/libvirt/schemas/interface.rng
 %{_mingw32_datadir}/libvirt/schemas/nwfilter.rng
 %{_mingw32_datadir}/libvirt/schemas/secret.rng
 %{_mingw32_datadir}/libvirt/schemas/storageencryption.rng
-%{_mingw32_datadir}/libvirt/schemas/basictypes.rng
-%{_mingw32_datadir}/libvirt/schemas/networkcommon.rng
+%{_mingw32_datadir}/libvirt/schemas/storagepool.rng
+%{_mingw32_datadir}/libvirt/schemas/storagevol.rng
 
 %{_mingw32_datadir}/libvirt/cpu_map.xml
 
diff --git a/tests/domainsnapshotxml2xmlout/full_domain.xml b/tests/domainsnapshotxml2xmlout/full_domain.xml
new file mode 100644 (file)
index 0000000..942bd7f
--- /dev/null
@@ -0,0 +1,35 @@
+<domainsnapshot>
+  <name>my snap name</name>
+  <description>!@#$%^</description>
+  <parent>
+    <name>earlier_snap</name>
+  </parent>
+  <state>running</state>
+  <creationTime>1272917631</creationTime>
+<domain type='qemu'>
+  <name>QEMUGuest1</name>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+  <memory>219100</memory>
+  <currentMemory>219100</currentMemory>
+  <vcpu cpuset='1-4,8-20,525'>1</vcpu>
+  <os>
+    <type arch='i686' machine='pc'>hvm</type>
+    <boot dev='hd'/>
+  </os>
+  <clock offset='utc'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+    <emulator>/usr/bin/qemu</emulator>
+    <disk type='block' device='disk'>
+      <source dev='/dev/HostVG/QEMUGuest1'/>
+      <target dev='hda' bus='ide'/>
+      <address type='drive' controller='0' bus='0' unit='0'/>
+    </disk>
+    <controller type='ide' index='0'/>
+    <memballoon model='virtio'/>
+  </devices>
+</domain>
+  <active>1</active>
+</domainsnapshot>