contiue the loop if a federated call fails
[sfa.git] / sfa / managers / slice_manager_pl.py
index 80d98f1..e7880f5 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,30 +196,35 @@ 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()]:      
             try:
                 # get the rspec from the aggregate
                 agg_rspec = aggs[agg].get_resources(cred, xrn, origin_hrn)
-
-                tree = etree.parse(StringIO(agg_rspec))
-                root = tree.getroot()
-                if root.get("type") in ["Planetlab", "VINI"]:
-                    # Validate the aggregate's RSpec?
-
-                    if rspec == None:
-                        rspec = root
-                    else:
-                        for network in root.iterfind("./network"):
-                            rspec.append(deepcopy(network))
             except:
                 # XX print out to some error log
                 print >> log, "Error getting resources at aggregate %s" % agg
                 traceback.print_exc(log)
                 print >> log, "%s" % (traceback.format_exc())
-
+                continue
+                
+            try:
+                tree = etree.parse(StringIO(agg_rspec))
+            except etree.XMLSyntaxError:
+                message = agg + ": " + str(sys.exc_info()[1])
+                raise InvalidRSpec(message)
+
+            root = tree.getroot()
+            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)