2011-08-13 05:33:15 +04:00
<?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>qemu</value>
2011-11-28 18:26:57 +04:00
<value>kqemu</value>
<value>kvm</value>
<value>xen</value>
2011-08-13 05:33:15 +04:00
<value>lxc</value>
2011-11-28 18:26:57 +04:00
<value>uml</value>
2011-08-13 05:33:15 +04:00
<value>openvz</value>
<value>test</value>
2011-11-28 18:26:57 +04:00
<value>vmware</value>
<value>hyperv</value>
<value>vbox</value>
<value>phyp</value>
2011-08-13 05:33:15 +04:00
</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>
2011-10-28 22:29:39 +04:00
<optional>
<ref name="diskAuth"/>
</optional>
2011-08-13 05:33:15 +04:00
<ref name="target"/>
<optional>
<ref name="deviceBoot"/>
</optional>
<optional>
<element name="readonly">
<empty/>
</element>
</optional>
<optional>
<element name="shareable">
<empty/>
</element>
</optional>
2011-08-13 23:20:21 +04:00
<optional>
<element name="transient">
<empty/>
</element>
</optional>
2011-08-13 05:33:15 +04:00
<optional>
<element name="serial">
<ref name="diskSerial"/>
</element>
</optional>
<optional>
<ref name="encryption"/>
</optional>
<optional>
<ref name="address"/>
</optional>
</define>
2011-08-13 23:20:21 +04:00
<define name="snapshot">
<attribute name="snapshot">
<choice>
<value>no</value>
<value>internal</value>
<value>external</value>
</choice>
</attribute>
</define>
2011-08-13 05:33:15 +04:00
<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>
2011-10-17 18:54:03 +04:00
<define name="startupPolicy">
<attribute name="startupPolicy">
<choice>
<value>mandatory</value>
<value>requisite</value>
<value>optional</value>
</choice>
</attribute>
</define>
2011-08-13 05:33:15 +04:00
<!--
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>
2011-08-13 23:20:21 +04:00
<optional>
<ref name="snapshot"/>
</optional>
2011-08-13 05:33:15 +04:00
<choice>
<group>
<attribute name="type">
<value>file</value>
</attribute>
<interleave>
<optional>
<element name="source">
2011-10-17 18:54:03 +04:00
<optional>
<attribute name="file">
<ref name="absFilePath"/>
</attribute>
</optional>
<optional>
<ref name="startupPolicy"/>
</optional>
2011-08-13 05:33:15 +04:00
<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>
snapshot: also support disks by path
I got confused when 'virsh domblkinfo dom disk' required the
path to a disk (which can be ambiguous, since a single file
can back multiple disks), rather than the unambiguous target
device name that I was using in disk snapshots. So, in true
developer fashion, I went for the best of both worlds - all
interfaces that operate on a disk (aka block) now accept
either the target name or the unambiguous path to the backing
file used by the disk.
* src/conf/domain_conf.h (virDomainDiskIndexByName): Add
parameter.
(virDomainDiskPathByName): New prototype.
* src/libvirt_private.syms (domain_conf.h): Export it.
* src/conf/domain_conf.c (virDomainDiskIndexByName): Also allow
searching by path, and decide whether ambiguity is okay.
(virDomainDiskPathByName): New function.
(virDomainDiskRemoveByName, virDomainSnapshotAlignDisks): Update
callers.
* src/qemu/qemu_driver.c (qemudDomainBlockPeek)
(qemuDomainAttachDeviceConfig, qemuDomainUpdateDeviceConfig)
(qemuDomainGetBlockInfo, qemuDiskPathToAlias): Likewise.
* src/qemu/qemu_process.c (qemuProcessFindDomainDiskByPath):
Likewise.
* src/libxl/libxl_driver.c (libxlDomainAttachDeviceDiskLive)
(libxlDomainDetachDeviceDiskLive, libxlDomainAttachDeviceConfig)
(libxlDomainUpdateDeviceConfig): Likewise.
* src/uml/uml_driver.c (umlDomainBlockPeek): Likewise.
* src/xen/xend_internal.c (xenDaemonDomainBlockPeek): Likewise.
* docs/formatsnapshot.html.in: Update documentation.
* tools/virsh.pod (domblkstat, domblkinfo): Likewise.
* docs/schemas/domaincommon.rng (diskTarget): Tighten pattern on
disk targets.
* docs/schemas/domainsnapshot.rng (disksnapshot): Update to match.
* tests/domainsnapshotxml2xmlin/disk_snapshot.xml: Update test.
2011-08-20 06:38:36 +04:00
<define name="diskTarget">
<data type="string">
<param name="pattern">(ioemu:)?(fd|hd|sd|vd|xvd|ubd)[a-zA-Z0-9_]+</param>
</data>
</define>
2011-08-13 05:33:15 +04:00
<define name="target">
<element name="target">
<attribute name="dev">
snapshot: also support disks by path
I got confused when 'virsh domblkinfo dom disk' required the
path to a disk (which can be ambiguous, since a single file
can back multiple disks), rather than the unambiguous target
device name that I was using in disk snapshots. So, in true
developer fashion, I went for the best of both worlds - all
interfaces that operate on a disk (aka block) now accept
either the target name or the unambiguous path to the backing
file used by the disk.
* src/conf/domain_conf.h (virDomainDiskIndexByName): Add
parameter.
(virDomainDiskPathByName): New prototype.
* src/libvirt_private.syms (domain_conf.h): Export it.
* src/conf/domain_conf.c (virDomainDiskIndexByName): Also allow
searching by path, and decide whether ambiguity is okay.
(virDomainDiskPathByName): New function.
(virDomainDiskRemoveByName, virDomainSnapshotAlignDisks): Update
callers.
* src/qemu/qemu_driver.c (qemudDomainBlockPeek)
(qemuDomainAttachDeviceConfig, qemuDomainUpdateDeviceConfig)
(qemuDomainGetBlockInfo, qemuDiskPathToAlias): Likewise.
* src/qemu/qemu_process.c (qemuProcessFindDomainDiskByPath):
Likewise.
* src/libxl/libxl_driver.c (libxlDomainAttachDeviceDiskLive)
(libxlDomainDetachDeviceDiskLive, libxlDomainAttachDeviceConfig)
(libxlDomainUpdateDeviceConfig): Likewise.
* src/uml/uml_driver.c (umlDomainBlockPeek): Likewise.
* src/xen/xend_internal.c (xenDaemonDomainBlockPeek): Likewise.
* docs/formatsnapshot.html.in: Update documentation.
* tools/virsh.pod (domblkstat, domblkinfo): Likewise.
* docs/schemas/domaincommon.rng (diskTarget): Tighten pattern on
disk targets.
* docs/schemas/domainsnapshot.rng (disksnapshot): Update to match.
* tests/domainsnapshotxml2xmlin/disk_snapshot.xml: Update test.
2011-08-20 06:38:36 +04:00
<ref name="diskTarget"/>
2011-08-13 05:33:15 +04:00
</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>
2011-09-28 07:46:08 +04:00
<value>sata</value>
2011-08-13 05:33:15 +04:00
</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>
2011-10-04 22:17:06 +04:00
<optional>
<ref name="driverRerrorPolicy"/>
</optional>
2011-08-13 05:33:15 +04:00
<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>
2011-09-22 23:33:47 +04:00
<value>unsafe</value>
2011-08-13 05:33:15 +04:00
</choice>
</attribute>
</define>
<define name="driverErrorPolicy">
<attribute name="error_policy">
<choice>
<value>stop</value>
2011-10-04 22:17:06 +04:00
<value>report</value>
2011-08-13 05:33:15 +04:00
<value>ignore</value>
<value>enospace</value>
</choice>
</attribute>
</define>
2011-10-04 22:17:06 +04:00
<define name="driverRerrorPolicy">
<attribute name="rerror_policy">
<choice>
<value>stop</value>
<value>report</value>
<value>ignore</value>
</choice>
</attribute>
</define>
2011-08-13 05:33:15 +04:00
<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>
2011-10-11 15:30:40 +04:00
<!-- type='mount' is default -->
<optional>
<attribute name="type">
<value>mount</value>
</attribute>
</optional>
2011-08-13 05:33:15 +04:00
<interleave>
<element name="source">
<attribute name="dir">
<ref name="absFilePath"/>
</attribute>
<empty/>
</element>
2011-10-11 15:30:40 +04:00
<optional>
<element name="driver">
<attribute name="type">
<choice>
<value>path</value>
<value>handle</value>
</choice>
</attribute>
<empty/>
</element>
</optional>
2011-08-13 05:33:15 +04:00
<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>
<attribute name="accessmode">
<choice>
<value>passthrough</value>
<value>mapped</value>
<value>squash</value>
</choice>
</attribute>
</optional>
</element>
</define>
<define name="filesystemtgt">
2011-10-11 15:30:40 +04:00
<interleave>
<optional>
<ref name="address"/>
</optional>
<element name="target">
<attribute name="dir">
<ref name="absDirPath"/>
</attribute>
<empty/>
</element>
</interleave>
2011-08-13 05:33:15 +04:00
</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"/>
2011-09-06 11:06:59 +04:00
<optional>
<ref name="address"/>
</optional>
2011-08-13 05:33:15 +04:00
</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>
2011-09-20 21:31:52 +04:00
<optional>
<element name="rom">
<attribute name="bar">
<choice>
<value>on</value>
<value>off</value>
</choice>
</attribute>
<empty/>
</element>
</optional>
2011-08-13 05:33:15 +04:00
</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>
qemu: make PCI multifunction support more manual
When support for was added for PCI multifunction cards (in commit
9f8baf, first included in libvirt 0.9.3), it was done by always
turning on the multifunction bit for all PCI devices. Since that time
it has been realized that this is not an ideal solution, and that the
multifunction bit must be selectively turned on. For example, see
https://bugzilla.redhat.com/show_bug.cgi?id=728174
and the discussion before and after
https://www.redhat.com/archives/libvir-list/2011-September/msg01036.html
This patch modifies multifunction support so that the multifunction=on
option is only added to the qemu commandline for a device if its PCI
<address> definition has the attribute "multifunction='on'", e.g.:
<address type='pci' domain='0x0000' bus='0x00'
slot='0x04' function='0x0' multifunction='on'/>
In practice, the multifunction bit should only be turned on if
function='0' AND other functions will be used in the same slot - it
usually isn't needed for functions 1-7 (although there are apparently
some exceptions, e.g. the Intel X53 according to the QEMU source
code), and should never be set if only function 0 will be used in the
slot. The test cases have been changed accordingly to illustrate.
With this patch in place, if a user attempts to assign multiple
functions in a slot without setting the multifunction bit for function
0, libvirt will issue an error when the domain is defined, and the
define operation will fail. In the future, we may decide to detect
this situation and automatically add multifunction=on to avoid the
error; even then it will still be useful to have a manual method of
turning on multifunction since, as stated above, there are some
devices that excpect it to be turned on for all functions in a slot.
A side effect of this patch is that attempts to use the same PCI
address for two different devices will now log an error (previously
this would cause the domain define operation to fail, but there would
be no log message generated). Because the function doing this log was
almost completely rewritten, I didn't think it worthwhile to make a
separate patch for that fix (the entire patch would immediately be
obsoleted).
2011-09-29 21:00:32 +04:00
<optional>
<attribute name="multifunction">
<choice>
<value>on</value>
<value>off</value>
</choice>
</attribute>
</optional>
2011-08-13 05:33:15 +04:00
</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>
2011-11-11 16:51:45 +04:00
<group>
<interleave>
<optional>
<ref name="cpuTopology"/>
</optional>
<optional>
<ref name="cpuNuma"/>
</optional>
</interleave>
</group>
2011-08-13 05:33:15 +04:00
<group>
<ref name="cpuMatch"/>
<interleave>
<ref name="cpuModel"/>
<optional>
<ref name="cpuVendor"/>
</optional>
<optional>
<ref name="cpuTopology"/>
</optional>
<zeroOrMore>
<ref name="cpuFeature"/>
</zeroOrMore>
2011-11-11 16:51:45 +04:00
<optional>
<ref name="cpuNuma"/>
</optional>
2011-08-13 05:33:15 +04:00
</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>
2011-11-11 16:51:45 +04:00
<define name="cpuNuma">
<element name="numa">
<oneOrMore>
<ref name="numaCell"/>
</oneOrMore>
</element>
</define>
<define name="numaCell">
<element name="cell">
<attribute name="cpus">
<ref name="cpuset"/>
</attribute>
<attribute name="memory">
<ref name="memoryKB"/>
</attribute>
</element>
</define>
2011-08-13 05:33:15 +04:00
<!--
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>
2011-10-28 22:29:39 +04:00
<define name="diskAuth">
<element name="auth">
<attribute name="username">
<ref name="genericName"/>
</attribute>
<ref name="diskAuthSecret"/>
</element>
</define>
<define name='diskAuthSecret'>
<element name='secret'>
<attribute name='type'>
<choice>
<value>ceph</value>
</choice>
</attribute>
<choice>
<attribute name='uuid'>
<ref name="UUID"/>
</attribute>
2011-10-29 01:19:34 +04:00
<attribute name='usage'>
<ref name='genericName'/>
2011-10-28 22:29:39 +04:00
</attribute>
</choice>
</element>
</define>
2011-08-13 05:33:15 +04:00
<!--
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_\.\+\-&:/]+</param>
</data>
</define>
<define name="diskSerial">
<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>