Fix the Eucalyptus RSpec schema.
authorMarco Yuen <marcoy@gmail.com>
Tue, 22 Feb 2011 17:21:18 +0000 (12:21 -0500)
committerMarco Yuen <marcoy@gmail.com>
Tue, 22 Feb 2011 17:21:18 +0000 (12:21 -0500)
sfa/managers/eucalyptus/euca_rspec_validator.py [new file with mode: 0755]
sfa/managers/eucalyptus/eucalyptus.rnc
sfa/managers/eucalyptus/eucalyptus.rng

diff --git a/sfa/managers/eucalyptus/euca_rspec_validator.py b/sfa/managers/eucalyptus/euca_rspec_validator.py
new file mode 100755 (executable)
index 0000000..7e25063
--- /dev/null
@@ -0,0 +1,28 @@
+#!/usr/bin/env python
+
+from __future__ import with_statement 
+import sys
+import os
+from lxml import etree as ET
+
+##
+# The location of the RelaxNG schema.
+#
+EUCALYPTUS_RSPEC_SCHEMA='eucalyptus.rng'
+
+def main():
+    with open(sys.argv[1], 'r') as f:
+        xml = f.read()
+        schemaXML = ET.parse(EUCALYPTUS_RSPEC_SCHEMA)
+        rspecValidator = ET.RelaxNG(schemaXML)
+        rspecXML = ET.XML(xml)
+        if not rspecValidator(rspecXML):
+            error = rspecValidator.error_log.last_error
+            message = '%s (line %s)' % (error.message, error.line) 
+            print message
+        else:
+            print 'It is valid'
+
+if __name__ == "__main__":
+    main()
+
index 49c1f33..ba9758c 100644 (file)
@@ -48,8 +48,8 @@ vm_type = element vm_type {
    cores,
    memory,
    disk_space,
-   request?,
-   euca_instances?
+   euca_instances?,
+   request?
 }
 
 request = element request {
@@ -74,7 +74,7 @@ euca_instance = element euca_instance {
    attribute id { xsd:ID },
    state,
    public_dns,
-   keypair
+   keypair?
 }
 ipv4 = element ipv4 { text }
 type = element type { text }
index ec91e05..51d23c6 100644 (file)
       <ref name="memory"/>
       <ref name="disk_space"/>
       <optional>
-        <ref name="request"/>
+        <ref name="euca_instances"/>
       </optional>
       <optional>
-        <ref name="euca_instances"/>
+        <ref name="request"/>
       </optional>
     </element>
   </define>
       </attribute>
       <ref name="state"/>
       <ref name="public_dns"/>
-      <ref name="keypair"/>
+      <optional>
+        <ref name="keypair"/>
+      </optional>
     </element>
   </define>
   <define name="ipv4">