removed another bunch of references to geni
[sfa.git] / sfa / plc / nodes.py
index 9a2902e..f80bd1a 100644 (file)
@@ -7,7 +7,7 @@ import datetime
 import sys
 import traceback
 
-from sfa.util.misc import *
+from sfa.util.namespace import *
 from sfa.util.rspec import *
 from sfa.util.specdict import * 
 from sfa.util.faults import *
@@ -20,17 +20,18 @@ from sfa.server.aggregate import Aggregates
 
 class Nodes(SimpleStorage):
 
-    def __init__(self, api, ttl = 1):
+    def __init__(self, api, ttl = 1, origin_hrn=None):
         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
         SimpleStorage.__init__(self, self.nodes_file)
         self.policy = Policy(api)
         self.load()
+        self.origin_hrn = origin_hrn
 
 
     def refresh(self):
@@ -47,9 +48,8 @@ class Nodes(SimpleStorage):
             elif self.api.interface in ['slicemgr']:
                 self.refresh_nodes_smgr()
 
-        
     def refresh_nodes_aggregate(self):
-        rspec = Rspec()
+        rspec = RSpec()
         rspec.parseString(self.get_rspec())
         
         # filter nodes according to policy
@@ -88,7 +88,7 @@ class Nodes(SimpleStorage):
         self.update(node_details)
         self.write()       
  
-    def refresh_nodes_smgr(self):
+    def get_remote_resources(self, hrn = None):
         # convert and threshold to ints
         if self.has_key('timestamp') and self['timestamp']:
             hr_timestamp = self['timestamp']
@@ -109,27 +109,32 @@ class Nodes(SimpleStorage):
         aggregates = Aggregates(self.api)
         rspecs = {}
         networks = []
-        rspec = Rspec()
-        credential = self.api.getCredential() 
+        rspec = RSpec()
+        credential = self.api.getCredential()
+        origin_hrn = self.origin_hrn
         for aggregate in aggregates:
+          if aggregate not in [self.api.auth.client_cred.get_gid_caller().get_hrn()]:
             try:
                 # get the rspec from the aggregate
-                agg_rspec = aggregates[aggregate].get_resources(credential)
+                agg_rspec = aggregates[aggregate].get_resources(credential, hrn, origin_hrn)
                 # extract the netspec from each aggregates rspec
                 rspec.parseString(agg_rspec)
                 networks.extend([{'NetSpec': rspec.getDictsByTagName('NetSpec')}])
             except:
                 # XX print out to some error log
-                print >> log, "Error calling list nodes at aggregate %s" % aggregate
+                print >> log, "Error getting resources at aggregate %s" % aggregate
                 traceback.print_exc(log)
-                exc_type, exc_value, exc_traceback = sys.exc_info()
-                raise exc_type, exc_value
+                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
 
+    def refresh_nodes_smgr(self):
+
+        rspec = self.get_remote_resources()        
         # filter according to policy
         blist = self.policy['node_blacklist']
         wlist = self.policy['node_whitelist']    
@@ -149,12 +154,24 @@ class Nodes(SimpleStorage):
         self.update(nodedict)
         self.write()
 
-
     def get_rspec(self, hrn = None):
+
+        if self.api.interface in ['slicemgr']:
+            return self.get_rspec_smgr(hrn)
+        elif self.api.interface in ['aggregate']:
+            return self.get_rspec_aggregate(hrn)     
+
+    def get_rspec_smgr(self, hrn = None):
+        
+        rspec = self.get_remote_resources(hrn)
+        return rspec.toxml()
+
+    def get_rspec_aggregate(self, hrn = None):
         """
         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})
@@ -172,7 +189,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 = []
@@ -183,7 +203,7 @@ class Nodes(SimpleStorage):
             elif self.api.plshell_version in ['4.3']:
                 interface_ids.extend(node['interface_ids'])
             else:
-                raise GeniAPIError, "Unsupported plcapi version ", \
+                raise SfaAPIError, "Unsupported plcapi version ", \
                                  self.api.plshell_version
 
         if self.api.plshell_version in ['4.2']:
@@ -191,7 +211,7 @@ class Nodes(SimpleStorage):
         elif self.api.plshell_version in ['4.3']:
             interfaces = self.api.plshell.GetInterfaces(self.api.plauth, interface_ids)
         else:
-            raise GeniAPIError, "Unsupported plcapi version ", \
+            raise SfaAPIError, "Unsupported plcapi version ", \
                                 self.api.plshell_version 
         interface_dict = {}
         for interface in interfaces:
@@ -200,7 +220,7 @@ class Nodes(SimpleStorage):
             elif self.api.plshell_version in ['4.3']:
                 interface_dict[interface['interface_id']] = interface
             else:
-                raise GeniAPIError, "Unsupported plcapi version", \
+                raise SfaAPIError, "Unsupported plcapi version", \
                                     self.api.plshell_version 
 
         # join nodes with thier interfaces
@@ -213,7 +233,7 @@ class Nodes(SimpleStorage):
                 for interface_id in node['interface_ids']:
                     node['interfaces'].append(interface_dict[interface_id])
             else:
-                raise GeniAPIError, "Unsupported plcapi version", \
+                raise SfaAPIError, "Unsupported plcapi version", \
                                     self.api.plshell_version
 
         # convert and threshold to ints
@@ -239,9 +259,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()