X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fplc%2Fnodes.py;h=f80bd1ab394eb4f60356d480120f3b3f7de82f85;hb=3d7237fa0b5f2b4a60cb97c7fb3b6aecfd94558a;hp=d21b8c5796b354f73a18f0612574d4804c75ae8b;hpb=76116aea258be853d85bb8ac5615d9f090950e81;p=sfa.git diff --git a/sfa/plc/nodes.py b/sfa/plc/nodes.py index d21b8c57..f80bd1ab 100644 --- a/sfa/plc/nodes.py +++ b/sfa/plc/nodes.py @@ -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 @@ -109,29 +109,30 @@ 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, hrn) + 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_node_smgr(self): + def refresh_nodes_smgr(self): rspec = self.get_remote_resources() # filter according to policy @@ -161,25 +162,16 @@ class Nodes(SimpleStorage): return self.get_rspec_aggregate(hrn) def get_rspec_smgr(self, hrn = None): - aggregates = Aggregates(self.api) - credential = self.api.getCredential() - rspecs = {} - # send the request to all known aggregates - for aggregate in aggregates: - try: - rspec = aggregates[aggregate].get_resources(credential, hrn) - tmp_rspec = Rspec() - tmp_rspec.parseString(rspec) - except: - print >> log, "Error calling get resources at aggregate %(aggregate)s" % locals() - + 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}) @@ -197,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 = [] @@ -208,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']: @@ -216,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: @@ -225,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 @@ -238,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 @@ -264,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()