class Nodes(SimpleStorage):
- def __init__(self, api, ttl = 1):
+ def __init__(self, api, ttl = 1, caller_cred=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.caller_cred=caller_cred
def refresh(self):
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
aggregates = Aggregates(self.api)
rspecs = {}
networks = []
- rspec = Rspec()
+ rspec = RSpec()
credential = self.api.getCredential()
for aggregate in aggregates:
try:
+ caller_cred = self.caller_cred
# get the rspec from the aggregate
- agg_rspec = aggregates[aggregate].get_resources(credential, hrn)
+ 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')}])
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
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})
# 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 = []
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()