[PATCH 1/2] add recipe.xsd and recipe.dtd

olichtne at redhat.com olichtne at redhat.com
Thu May 16 13:22:53 UTC 2013


From: Ondrej Lichtner <olichtne at redhat.com>

This commit adds the XML Schema file and the DTD file that describe our
recipe format. These files reflect the current format, including the
recent changes to interface tag. Both can be used for validation of
recipe files.

The DTD validation is a little bit different due to the limitations of
the language. Some elements need to appear in a specific order, and
value types are not checked as precisely as with the XML Schema.

Signed-off-by: Ondrej Lichtner <olichtne at redhat.com>
---
 recipe.dtd |  56 ++++++++++++++++++
 recipe.xsd | 196 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 252 insertions(+)
 create mode 100644 recipe.dtd
 create mode 100644 recipe.xsd

diff --git a/recipe.dtd b/recipe.dtd
new file mode 100644
index 0000000..3974028
--- /dev/null
+++ b/recipe.dtd
@@ -0,0 +1,56 @@
+<!ELEMENT lnstrecipe (machines, command_sequence+)>
+<!ELEMENT machines (machine+)>
+<!ELEMENT command_sequence (command+)>
+
+<!ELEMENT machine (params?, interfaces)>
+<!ATTLIST machine id CDATA #REQUIRED >
+
+<!ELEMENT command (options*) >
+<!ATTLIST command type CDATA #REQUIRED>
+<!ATTLIST command machine_id CDATA #IMPLIED >
+<!ATTLIST command bg_id CDATA #IMPLIED >
+<!ATTLIST command value CDATA #IMPLIED >
+<!ATTLIST command timeout CDATA #IMPLIED >
+<!ATTLIST command option CDATA #IMPLIED >
+<!ATTLIST command persistent CDATA #IMPLIED >
+<!ATTLIST command desc CDATA #IMPLIED >
+<!ATTLIST command from CDATA #IMPLIED >
+
+<!ELEMENT interfaces (eth|bond|bridge|vlan|macvlan|team)* >
+
+<!ELEMENT eth (params?, addresses?) >
+<!ATTLIST eth id CDATA #REQUIRED >
+<!ATTLIST eth network CDATA #IMPLIED >
+
+<!ELEMENT bond (options?, addresses?, slaves?) >
+<!ATTLIST bond id CDATA #REQUIRED >
+
+<!ELEMENT bridge (options?, addresses?, slaves?) >
+<!ATTLIST bridge id CDATA #REQUIRED >
+
+<!ELEMENT vlan (options?, addresses?, slaves?) >
+<!ATTLIST vlan id CDATA #REQUIRED >
+
+<!ELEMENT macvlan (options?, addresses?, slaves?) >
+<!ATTLIST macvlan id CDATA #REQUIRED >
+
+<!ELEMENT team (options?, addresses?, slaves?) >
+<!ATTLIST team id CDATA #REQUIRED >
+
+<!ELEMENT params (param+)>
+<!ELEMENT param (#PCDATA)>
+<!ATTLIST param name CDATA #REQUIRED >
+<!ATTLIST param value CDATA #IMPLIED >
+
+<!ELEMENT options (option+)>
+<!ELEMENT option (#PCDATA)>
+<!ATTLIST option name CDATA #REQUIRED >
+<!ATTLIST option value CDATA #IMPLIED >
+
+<!ELEMENT addresses (address+)>
+<!ELEMENT address (#PCDATA)>
+<!ATTLIST address value CDATA #IMPLIED >
+
+<!ELEMENT slaves (slave+)>
+<!ELEMENT slave (#PCDATA)>
+<!ATTLIST slave id CDATA #IMPLIED >
diff --git a/recipe.xsd b/recipe.xsd
new file mode 100644
index 0000000..300fea2
--- /dev/null
+++ b/recipe.xsd
@@ -0,0 +1,196 @@
+<?xml version="1.0"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+    elementFormDefault="qualified">
+
+    <xs:element name="lnstrecipe">
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="machines" minOccurs="1" maxOccurs="1">
+                    <xs:complexType>
+                        <xs:sequence>
+                            <xs:element name="machine" type="machineType"
+                                minOccurs="1" maxOccurs="unbounded"/>
+                        </xs:sequence>
+                    </xs:complexType>
+                </xs:element>
+                <xs:element name="command_sequence" minOccurs="1" maxOccurs="unbounded">
+                    <xs:complexType>
+                        <xs:sequence>
+                            <xs:element name="command" type="commandType" minOccurs="1" maxOccurs="unbounded"/>
+                        </xs:sequence>
+                        <xs:attribute name="quit_on_fail">
+                            <xs:simpleType>
+                                <xs:restriction base="xs:string">
+                                    <xs:enumeration value="yes"/>
+                                    <xs:enumeration value="no"/>
+                                </xs:restriction>
+                            </xs:simpleType>
+                        </xs:attribute>
+                    </xs:complexType>
+                </xs:element>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:complexType name="machineType">
+        <xs:all>
+            <xs:element name="params" type="paramsType" minOccurs="0"/>
+            <xs:element name="interfaces" minOccurs="1">
+                <xs:complexType>
+                    <xs:choice maxOccurs="unbounded">
+                        <xs:element name="eth" type="ethInterface"/>
+                        <xs:element name="bond" type="bondInterface"/>
+                        <xs:element name="bridge" type="bridgeInterface"/>
+                        <xs:element name="vlan" type="vlanInterface"/>
+                        <xs:element name="macvlan" type="macvlanInterface"/>
+                        <xs:element name="team" type="teamInterface"/>
+                    </xs:choice>
+                </xs:complexType>
+            </xs:element>
+        </xs:all>
+        <xs:attribute name="id" type="xs:string" use="required"/>
+    </xs:complexType>
+
+    <xs:complexType name="ethInterface">
+        <xs:all>
+            <xs:element name="params" type="paramsType" minOccurs="0"/>
+            <xs:element name="addresses" type="addressesType" minOccurs="0"/>
+        </xs:all>
+        <xs:attribute name="id" type="xs:string" use="required"/>
+        <xs:attribute name="network" type="xs:string" use="required"/>
+    </xs:complexType>
+
+    <xs:complexType name="bondInterface">
+        <xs:all>
+            <xs:element name="options" type="optionsType" minOccurs="0"/>
+            <xs:element name="addresses" type="addressesType" minOccurs="0"/>
+            <xs:element name="slaves" type="slavesType" minOccurs="0"/>
+        </xs:all>
+        <xs:attribute name="id" type="xs:string" use="required"/>
+    </xs:complexType>
+
+    <xs:complexType name="bridgeInterface">
+        <xs:all>
+            <xs:element name="options" type="optionsType" minOccurs="0"/>
+            <xs:element name="addresses" type="addressesType" minOccurs="0"/>
+            <xs:element name="slaves" type="slavesType" minOccurs="0"/>
+        </xs:all>
+        <xs:attribute name="id" type="xs:string" use="required"/>
+    </xs:complexType>
+
+    <xs:complexType name="vlanInterface">
+        <xs:all>
+            <xs:element name="options" type="optionsType" minOccurs="0"/>
+            <xs:element name="addresses" type="addressesType" minOccurs="0"/>
+            <xs:element name="slaves" type="slavesType" minOccurs="0"/>
+        </xs:all>
+        <xs:attribute name="id" type="xs:string" use="required"/>
+    </xs:complexType>
+
+    <xs:complexType name="macvlanInterface">
+        <xs:all>
+            <xs:element name="options" type="optionsType" minOccurs="0"/>
+            <xs:element name="addresses" type="addressesType" minOccurs="0"/>
+            <xs:element name="slaves" type="slavesType" minOccurs="0"/>
+        </xs:all>
+        <xs:attribute name="id" type="xs:string" use="required"/>
+    </xs:complexType>
+
+    <xs:complexType name="teamInterface">
+        <xs:all>
+            <xs:element name="options" type="optionsType" minOccurs="0"/>
+            <xs:element name="addresses" type="addressesType" minOccurs="0"/>
+            <xs:element name="slaves" type="slavesType" minOccurs="0"/>
+        </xs:all>
+        <xs:attribute name="id" type="xs:string" use="required"/>
+    </xs:complexType>
+
+    <xs:complexType name="commandType">
+        <xs:sequence>
+            <xs:element name="options" type="optionsType" minOccurs="0"/>
+        </xs:sequence>
+        <xs:attribute name="machine_id" type="xs:string"/>
+        <xs:attribute name="type" use="required">
+            <xs:simpleType>
+                <xs:restriction base="xs:string">
+                    <xs:enumeration value="exec"/>
+                    <xs:enumeration value="test"/>
+                    <xs:enumeration value="wait"/>
+                    <xs:enumeration value="intr"/>
+                    <xs:enumeration value="kill"/>
+                    <xs:enumeration value="system_config"/>
+                    <xs:enumeration value="ctl_wait"/>
+                </xs:restriction>
+            </xs:simpleType>
+        </xs:attribute>
+        <xs:attribute name="bg_id" type="xs:string"/>
+        <xs:attribute name="value" type="xs:string"/>
+        <xs:attribute name="timeout" type="xs:integer"/>
+        <xs:attribute name="option" type="xs:string"/>
+        <xs:attribute name="persistent">
+            <xs:simpleType>
+                <xs:restriction base="xs:string">
+                    <xs:enumeration value="true"/>
+                    <xs:enumeration value="false"/>
+                </xs:restriction>
+            </xs:simpleType>
+        </xs:attribute>
+        <xs:attribute name="desc" type="xs:string"/>
+        <xs:attribute name="from" type="xs:string"/>
+    </xs:complexType>
+
+    <xs:complexType name="paramsType">
+        <xs:sequence>
+            <xs:element name="param" minOccurs="1" maxOccurs="unbounded">
+                <xs:complexType>
+                    <xs:attribute name="name" type="xs:string" use="required"/>
+                    <xs:attribute name="value" type="xs:string"/>
+                </xs:complexType>
+            </xs:element>
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:complexType name="optionsType">
+        <xs:sequence>
+            <xs:element name="option" minOccurs="1" maxOccurs="unbounded">
+                <xs:complexType>
+                    <xs:simpleContent>
+                        <xs:extension base="xs:string">
+                            <xs:attribute name="name" type="xs:string" use="required"/>
+                            <xs:attribute name="value" type="xs:string"/>
+                        </xs:extension>
+                    </xs:simpleContent>
+                </xs:complexType>
+            </xs:element>
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:complexType name="addressesType">
+        <xs:sequence>
+            <xs:element name="address" minOccurs="1" maxOccurs="unbounded">
+                <xs:complexType>
+                    <xs:simpleContent>
+                        <xs:extension base="xs:string">
+                            <xs:attribute name="value" type="xs:string"/>
+                        </xs:extension>
+                    </xs:simpleContent>
+                </xs:complexType>
+            </xs:element>
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:complexType name="slavesType">
+        <xs:sequence>
+            <xs:element name="slave" minOccurs="1" maxOccurs="unbounded">
+                <xs:complexType>
+                    <xs:simpleContent>
+                        <xs:extension base="xs:string">
+                            <xs:attribute name="id" type="xs:string" use="required"/>
+                        </xs:extension>
+                    </xs:simpleContent>
+                </xs:complexType>
+            </xs:element>
+        </xs:sequence>
+    </xs:complexType>
+
+</xs:schema>
-- 
1.7.11.7



More information about the LNST-developers mailing list