- top = rspecdict['RSpec']
- if ('network' in top):
- sites = top['network'][0]['site']
- for site in sites:
- for node in site['node']:
- if 'sliver' in node:
- n = nodedict[node['id']]
- slicenodes[n.id] = n
- n.add_sliver()
- links = top['network'][0]['link']
- for link in links:
- if 'vlink' in link:
- for vlink in link['vlink']:
- self.__add_vlink(vlink, slicenodes, link)
- elif ('request' in top):
- for sliver in top['request'][0]['sliver']:
- n = nodedict[sliver['nodeid']]
- slicenodes[n.id] = n
- n.add_sliver()
- for vlink in top['request'][0]['vlink']:
- self.__add_vlink(vlink, slicenodes)
+ tree = etree.parse(StringIO(xml))
+
+ # Validate the incoming request against the RelaxNG schema
+ relaxng_doc = etree.parse(VINI_RELAXNG_SCHEMA)
+ relaxng = etree.RelaxNG(relaxng_doc)
+
+ if not relaxng(tree):
+ error = relaxng.error_log.last_error
+ message = "%s (line %s)" % (error.message, error.line)
+ raise InvalidRSpec(message)
+
+ rspec = tree.getroot()
+
+ """
+ Handle requests where the user has annotated a description of the
+ physical resources (nodes and links) with virtual ones (slivers
+ and vlinks).
+ """
+ # Find slivers under node elements
+ for sliver in rspec.iterfind("./network/site/node/sliver"):
+ elem = sliver.getparent()
+ node = nodedict[elem.get("id")]
+ slicenodes[node.id] = node
+ node.add_sliver()
+
+ # Find links under link elements
+ for vlink in rspec.iterfind("./network/link/vlink"):
+ link = vlink.getparent()
+ self.__add_vlink(vlink, slicenodes, link)
+
+ """
+ Handle requests where the user has listed the virtual resources only
+ """
+ # Find slivers that specify nodeid
+ for sliver in rspec.iterfind("./request/sliver[@nodeid]"):
+ node = nodedict[sliver.get("nodeid")]
+ slicenodes[node.id] = node
+ node.add_sliver()
+
+ # Find vlinks that specify endpoints
+ for vlink in rspec.iterfind("./request/vlink[@endpoints]"):
+ self.__add_vlink(vlink, slicenodes)
+