X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fplc%2Fslices.py;h=3c535048405c8d3b4fa7d64d803c742f0c99cd03;hb=82f6b46e70dff8f7defd92177562c7d387b2f1fd;hp=944e6e44c40895a4afcc38fc175bb89d0d532a00;hpb=38b1ba9d33dd2a712a96ee5a1e5ea65b656c507c;p=sfa.git diff --git a/sfa/plc/slices.py b/sfa/plc/slices.py index 944e6e44..3c535048 100644 --- a/sfa/plc/slices.py +++ b/sfa/plc/slices.py @@ -7,38 +7,29 @@ import traceback import sys from types import StringTypes -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 * -from sfa.util.storage import * -from sfa.util.record import GeniRecord +from sfa.util.record import SfaRecord from sfa.util.policy import Policy from sfa.util.prefixTree import prefixTree from sfa.util.debug import log -from sfa.server.aggregate import Aggregates -from sfa.server.registry import Registries MAXINT = 2L**31-1 -class Slices(SimpleStorage): +class Slices: rspec_to_slice_tag = {'max_rate':'net_max_rate'} - def __init__(self, api, ttl = .5, gid_origin_caller=None): + def __init__(self, api, ttl = .5, origin_hrn=None): self.api = api - self.ttl = ttl - self.threshold = None - path = self.api.config.SFA_DATA_DIR - filename = ".".join([self.api.interface, self.api.hrn, "slices"]) - filepath = path + os.sep + filename - self.slices_file = filepath - SimpleStorage.__init__(self, self.slices_file) + #filepath = path + os.sep + filename self.policy = Policy(self.api) - self.load() - self.gid_origin_caller=gid_origin_caller + self.origin_hrn = origin_hrn - def get_slivers(self, hrn, node=None): + def get_slivers(self, xrn, node=None): + hrn, type = urn_to_hrn(xrn) slice_name = hrn_to_pl_slicename(hrn) # XX Should we just call PLCAPI.GetSliceTicket(slice_name) instead @@ -142,7 +133,8 @@ class Slices(SimpleStorage): return slivers - def get_peer(self, hrn): + def get_peer(self, xrn): + hrn, type = urn_to_hrn(xrn) # Becaues of myplc federation, we first need to determine if this # slice belongs to out local plc or a myplc peer. We will assume it # is a local site, unless we find out otherwise @@ -163,7 +155,9 @@ class Slices(SimpleStorage): return peer - def get_sfa_peer(self, hrn): + def get_sfa_peer(self, xrn): + hrn, type = urn_to_hrn(xrn) + # return the authority for this hrn or None if we are the authority sfa_peer = None slice_authority = get_authority(hrn) @@ -174,89 +168,10 @@ class Slices(SimpleStorage): return sfa_peer - def refresh(self): - """ - Update the cached list of slices - """ - # Reload components list - now = datetime.datetime.now() - if not self.has_key('threshold') or not self.has_key('timestamp') or \ - now > datetime.datetime.fromtimestamp(time.mktime(time.strptime(self['threshold'], self.api.time_format))): - if self.api.interface in ['aggregate']: - self.refresh_slices_aggregate() - elif self.api.interface in ['slicemgr']: - self.refresh_slices_smgr() - - def refresh_slices_aggregate(self): - slices = self.api.plshell.GetSlices(self.api.plauth, {'peer_id': None}, ['name']) - slice_hrns = [slicename_to_hrn(self.api.hrn, slice['name']) for slice in slices] - - # update timestamp and threshold - timestamp = datetime.datetime.now() - hr_timestamp = timestamp.strftime(self.api.time_format) - delta = datetime.timedelta(hours=self.ttl) - threshold = timestamp + delta - hr_threshold = threshold.strftime(self.api.time_format) - - slice_details = {'hrn': slice_hrns, - 'timestamp': hr_timestamp, - 'threshold': hr_threshold - } - self.update(slice_details) - self.write() - - - def refresh_slices_smgr(self): - slice_hrns = [] - aggregates = Aggregates(self.api) - credential = self.api.getCredential() - for aggregate in aggregates: - success = False - # request hash is optional so lets try the call without it - try: - request_hash=None - slices = aggregates[aggregate].get_slices(credential, request_hash) - slice_hrns.extend(slices) - success = True - except: - print >> log, "%s" % (traceback.format_exc()) - print >> log, "Error calling slices at aggregate %(aggregate)s" % locals() - - # try sending the request hash if the previous call failed - if not success: - arg_list = [credential] - request_hash = self.api.key.compute_hash(arg_list) - try: - slices = aggregates[aggregate].get_slices(credential, request_hash) - slice_hrns.extend(slices) - success = True - except: - print >> log, "%s" % (traceback.format_exc()) - print >> log, "Error calling slices at aggregate %(aggregate)s" % locals() - - # update timestamp and threshold - timestamp = datetime.datetime.now() - hr_timestamp = timestamp.strftime(self.api.time_format) - delta = datetime.timedelta(hours=self.ttl) - threshold = timestamp + delta - hr_threshold = threshold.strftime(self.api.time_format) - - slice_details = {'hrn': slice_hrns, - 'timestamp': hr_timestamp, - 'threshold': hr_threshold - } - self.update(slice_details) - self.write() - - def verify_site(self, registry, credential, slice_hrn, peer, sfa_peer): authority = get_authority(slice_hrn) - try: - site_records = registry.resolve(credential, authority) - except: - arg_list = [credential, authority] - request_hash = self.api.key.compute_hash(arg_list) - site_records = registry.resolve(credential, authority, request_hash) + authority_urn = hrn_to_urn(authority, 'authority') + site_records = registry.resolve(credential, authority_urn) site = {} for site_record in site_records: @@ -275,15 +190,13 @@ class Slices(SimpleStorage): # mark this site as an sfa peer record if sfa_peer: peer_dict = {'type': 'authority', 'hrn': authority, 'peer_authority': sfa_peer, 'pointer': site_id} - try: - registry.register_peer_object(credential, peer_dict) - except: - arg_list = [credential] - request_hash = self.api.key.compute_hash(arg_list) - registry.register_peer_object(credential, peer_dict, request_hash) + registry.register_peer_object(credential, peer_dict) else: site_id = sites[0]['site_id'] remote_site_id = sites[0]['peer_site_id'] + old_site = sites[0] + #the site is alredy on the remote agg. Let us update(e.g. max_slices field) it with the latest info. + self.sync_site(old_site, site, peer) return (site_id, remote_site_id) @@ -292,12 +205,7 @@ class Slices(SimpleStorage): slice = {} slice_record = None authority = get_authority(slice_hrn) - try: - slice_records = registry.resolve(credential, slice_hrn) - except: - arg_list = [credential, slice_hrn] - request_hash = self.api.key.compute_hash(arg_list) - slice_records = registry.resolve(credential, slice_hrn, request_hash) + slice_records = registry.resolve(credential, slice_hrn) for record in slice_records: if record['type'] in ['slice']: @@ -323,12 +231,7 @@ class Slices(SimpleStorage): # mark this slice as an sfa peer record if sfa_peer: peer_dict = {'type': 'slice', 'hrn': slice_hrn, 'peer_authority': sfa_peer, 'pointer': slice_id} - try: - registry.register_peer_object(credential, peer_dict) - except: - arg_list = [credential] - request_hash = self.api.key.compute_hash(arg_list) - registry.register_peer_object(credential, peer_dict, request_hash) + registry.register_peer_object(credential, peer_dict) #this belongs to a peer if peer: @@ -353,17 +256,12 @@ class Slices(SimpleStorage): researchers = slice_record.get('researcher', []) for researcher in researchers: person_record = {} - try: - person_records = registry.resolve(credential, researcher) - except: - arg_list = [credential, researcher] - request_hash = self.api.key.compute_hash(arg_list) - person_records = registry.resolve(credential, researcher, request_hash) + person_records = registry.resolve(credential, researcher) for record in person_records: - if record['type'] in ['user']: + if record['type'] in ['user'] and record['enabled']: person_record = record if not person_record: - pass + return 1 person_dict = person_record local_person=False if peer: @@ -384,12 +282,7 @@ class Slices(SimpleStorage): # mark this person as an sfa peer record if sfa_peer: peer_dict = {'type': 'user', 'hrn': researcher, 'peer_authority': sfa_peer, 'pointer': person_id} - try: - registry.register_peer_object(credential, peer_dict) - except: - arg_list = [credential] - request_hash = self.api.key.compute_hash(arg_list) - registry.register_peer_object(credential, peer_dict, request_hash) + registry.register_peer_object(credential, peer_dict) if peer: self.api.plshell.BindObjectToPeer(self.api.plauth, 'person', person_id, peer, person_dict['pointer']) @@ -433,8 +326,8 @@ class Slices(SimpleStorage): except: pass - def create_slice_aggregate(self, hrn, rspec): - + def create_slice_aggregate(self, xrn, rspec): + hrn, type = urn_to_hrn(xrn) # Determine if this is a peer slice peer = self.get_peer(hrn) sfa_peer = self.get_sfa_peer(hrn) @@ -444,8 +337,7 @@ class Slices(SimpleStorage): slicename = hrn_to_pl_slicename(hrn) slice = {} slice_record = None - registries = Registries(self.api) - registry = registries[self.api.hrn] + registry = self.api.registries[self.api.hrn] credential = self.api.getCredential() site_id, remote_site_id = self.verify_site(registry, credential, hrn, peer, sfa_peer) @@ -511,11 +403,23 @@ class Slices(SimpleStorage): return 1 + def sync_site(self, old_record, new_record, peer): + if old_record['max_slices'] != new_record['max_slices'] or old_record['max_slivers'] != new_record['max_slivers']: + if peer: + self.api.plshell.UnBindObjectFromPeer(self.api.plauth, 'site', old_record['site_id'], peer) + if old_record['max_slices'] != new_record['max_slices']: + self.api.plshell.UpdateSite(self.api.plauth, old_record['site_id'], {'max_slices' : new_record['max_slices']}) + if old_record['max_slivers'] != new_record['max_slivers']: + self.api.plshell.UpdateSite(self.api.plauth, old_record['site_id'], {'max_slivers' : new_record['max_slivers']}) + if peer: + self.api.plshell.BindObjectToPeer(self.api.plauth, 'site', old_record['site_id'], peer, old_record['peer_site_id']) + return 1 + def sync_slice(self, old_record, new_record, peer): if old_record['expires'] != new_record['expires']: if peer: self.api.plshell.UnBindObjectFromPeer(self.api.plauth, 'slice', old_record['slice_id'], peer) - self.api.plshell.UpdateSlice(self.api.plauth, old_record['slice_id'], {'expires' : new_record['expires']}) + self.api.plshell.UpdateSlice(self.api.plauth, old_record['slice_id'], {'expires' : new_record['expires']}) if peer: - self.api.plshell.BindObjectToPeer(self.api.plauth, 'slice', old_record['slice_id'], peer, old_record['peer_slice_id']) + self.api.plshell.BindObjectToPeer(self.api.plauth, 'slice', old_record['slice_id'], peer, old_record['peer_slice_id']) return 1