in the case of an SM-SM federation, this check will avoid looping of get_resources...
[sfa.git] / sfa / plc / nodes.py
index 29668b7..a8e0b60 100644 (file)
@@ -24,7 +24,7 @@ class Nodes(SimpleStorage):
         self.api = api
         self.ttl = ttl
         self.threshold = None
-        path = self.api.config.SFA_BASE_DIR
+        path = self.api.config.SFA_DATA_DIR
         filename = ".".join([self.api.interface, self.api.hrn, "nodes"])
         filepath = path + os.sep + filename
         self.nodes_file = filepath
@@ -49,7 +49,7 @@ class Nodes(SimpleStorage):
                 self.refresh_nodes_smgr()
 
     def refresh_nodes_aggregate(self):
-        rspec = Rspec()
+        rspec = RSpec()
         rspec.parseString(self.get_rspec())
         
         # filter nodes according to policy
@@ -109,16 +109,20 @@ class Nodes(SimpleStorage):
         aggregates = Aggregates(self.api)
         rspecs = {}
         networks = []
-        rspec = Rspec()
+        rspec = RSpec()
         credential = self.api.getCredential() 
         for aggregate in aggregates:
+          if aggregate not in [self.api.auth.client_cred.get_gid_caller().get_hrn()]:
             try:
                 caller_cred = self.caller_cred
-                arg_list = [credential, hrn]
-                request_hash = self.api.key.compute_hash(arg_list)
-                
                 # get the rspec from the aggregate
-                agg_rspec = aggregates[aggregate].get_resources(credential, hrn, request_hash, caller_cred)
+                try:
+                   request_hash=None
+                    agg_rspec = aggregates[aggregate].get_resources(credential, hrn, request_hash, caller_cred)
+                except:
+                    arg_list = [credential, hrn]
+                    request_hash = self.api.key.compute_hash(arg_list)
+                    agg_rspec = aggregates[aggregate].get_resources(credential, hrn, request_hash, caller_cred)
                 # extract the netspec from each aggregates rspec
                 rspec.parseString(agg_rspec)
                 networks.extend([{'NetSpec': rspec.getDictsByTagName('NetSpec')}])
@@ -129,7 +133,7 @@ class Nodes(SimpleStorage):
                 print >> log, "%s" % (traceback.format_exc())
         # create the rspec dict
         resources = {'networks': networks, 'start_time': start_time, 'duration': duration}
-        resourceDict = {'Rspec': resources}
+        resourceDict = {'RSpec': resources}
         # convert rspec dict to xml
         rspec.parseDict(resourceDict)
         return rspec
@@ -173,6 +177,7 @@ class Nodes(SimpleStorage):
         Get resource information from PLC
         """
 
+        slicename = None
         # Get the required nodes
         if not hrn:
             nodes = self.api.plshell.GetNodes(self.api.plauth, {'peer_id': None})
@@ -190,7 +195,10 @@ class Nodes(SimpleStorage):
 
         # Filter out whitelisted nodes
         public_nodes = lambda n: n.has_key('slice_ids_whitelist') and not n['slice_ids_whitelist']
-        nodes = filter(public_nodes, nodes)
+            
+        # ...only if they are not already assigned to this slice.
+        if (not slicename):        
+            nodes = filter(public_nodes, nodes)
 
         # Get all network interfaces
         interface_ids = []
@@ -257,9 +265,9 @@ class Nodes(SimpleStorage):
         resources = {'networks': networks, 'start_time': start_time, 'duration': duration}
 
         # convert the plc dict to an rspec dict
-        resourceDict = RspecDict(resources)
+        resourceDict = RSpecDict(resources)
         # convert the rspec dict to xml
-        rspec = Rspec()
+        rspec = RSpec()
         rspec.parseDict(resourceDict)
         return rspec.toxml()