[libvirt] [PATCH] Fix <cpu> element in domain XML schema

Jiri Denemark jdenemar at redhat.com
Tue Feb 9 14:53:03 UTC 2010


The current schema is more permissive than the XML parsing code in
libvirt. Precisely, 'match' attribute is optional in schema while in
reality its use is bound to <model> element:

- <cpu> element without 'match' attribute is allowed only if <topology>
  element is the only child element of <cpu>

- <cpu> element with 'match' attribute requires <model> element to be
  present; <topology> and <feature> elements are optional

Signed-off-by: Jiri Denemark <jdenemar at redhat.com>
---
 docs/schemas/domain.rng |  109 +++++++++++++++++++++++++++--------------------
 1 files changed, 63 insertions(+), 46 deletions(-)

diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng
index bb6d00d..c913a50 100644
--- a/docs/schemas/domain.rng
+++ b/docs/schemas/domain.rng
@@ -1313,52 +1313,69 @@
       -->
   <define name="cpu">
     <element name="cpu">
-      <optional>
-        <attribute name="match">
-          <choice>
-            <value>minimum</value>
-            <value>exact</value>
-            <value>strict</value>
-          </choice>
-        </attribute>
-      </optional>
-      <interleave>
-        <optional>
-          <element name="model">
-            <text/>
-          </element>
-        </optional>
-        <optional>
-          <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>
-        </optional>
-        <zeroOrMore>
-          <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>
-        </zeroOrMore>
-      </interleave>
+      <choice>
+        <ref name="cpuTopology"/>
+        <group>
+          <ref name="cpuMatch"/>
+          <interleave>
+            <ref name="cpuModel"/>
+            <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="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>
 
-- 
1.6.6.1




More information about the libvir-list mailing list