Registries/Aggregates are accessed through api object now
[sfa.git] / sfa / managers / slice_manager_pl.py
index 4a6fdf0..ee60941 100644 (file)
@@ -20,13 +20,11 @@ from sfa.util.prefixTree import prefixTree
 from sfa.util.rspec import *
 from sfa.util.sfaticket import *
 from sfa.util.debug import log
-from sfa.server.registry import Registries
-from sfa.server.aggregate import Aggregates
 import sfa.plc.peers as peers
 
 def delete_slice(api, xrn, origin_hrn=None):
     credential = api.getCredential()
-    aggregates = Aggregates(api)
+    aggregates = api.aggregates
     for aggregate in aggregates:
         success = False
         # request hash is optional so lets try the call without it
@@ -40,12 +38,27 @@ def delete_slice(api, xrn, origin_hrn=None):
 
 def create_slice(api, xrn, rspec, origin_hrn=None):
     hrn, type = urn_to_hrn(xrn)
-    aggs = Aggregates(api)
-    cred = api.getCredential()
 
-    # Validate the RSpec here against PlanetLab's schema
-
-    aggs = Aggregates(api)
+    # Validate the RSpec against PlanetLab's schema --disabled for now
+    # The schema used here needs to aggregate the PL and VINI schemas
+    # schema = "/var/www/html/schemas/pl.rng"
+    schema = None
+    if schema:
+        try:
+            tree = etree.parse(StringIO(rspec))
+        except etree.XMLSyntaxError:
+            message = str(sys.exc_info()[1])
+            raise InvalidRSpec(message)
+
+        relaxng_doc = etree.parse(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)
+
+    aggs = api.aggregates
     cred = api.getCredential()                                                 
     for agg in aggs:
         if agg not in [api.auth.client_cred.get_gid_caller().get_hrn()]:      
@@ -76,7 +89,7 @@ def get_ticket(api, xrn, rspec, origin_hrn=None):
         rspecs[net_hrn] = temp_rspec.toxml() 
     
     # send the rspec to the appropiate aggregate/sm
-    aggregates = Aggregates(api)
+    aggregates = api.aggregates
     credential = api.getCredential()
     tickets = {}
     for net_hrn in rspecs:
@@ -183,7 +196,7 @@ def get_rspec(api, xrn=None, origin_hrn=None):
     hrn, type = urn_to_hrn(xrn)
     rspec = None
 
-    aggs = Aggregates(api)
+    aggs = api.aggregates
     cred = api.getCredential()                                                 
     for agg in aggs:
         if agg not in [api.auth.client_cred.get_gid_caller().get_hrn()]:      
@@ -204,12 +217,14 @@ def get_rspec(api, xrn=None, origin_hrn=None):
                 raise InvalidRSpec(message)
 
             root = tree.getroot()
-            if root.get("type") in ["Planetlab", "VINI"]:
+            if root.get("type") in ["SFA"]:
                 if rspec == None:
                     rspec = root
                 else:
                     for network in root.iterfind("./network"):
                         rspec.append(deepcopy(network))
+                    for request in root.iterfind("./request"):
+                        rspec.append(deepcopy(request))
 
     return etree.tostring(rspec, xml_declaration=True, pretty_print=True)