X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fplc%2Fslices.py;h=a3c7c1a05e90a6f91526ecfd57b45b0b783d6de5;hb=eababa96fb603cdd552bc03091813544b099befd;hp=7aecd84741cb87a02513dda3ad7907282b42b22b;hpb=b0c4256789a3bb17edeabbd2e30dd6e3f423683e;p=sfa.git diff --git a/sfa/plc/slices.py b/sfa/plc/slices.py index 7aecd847..a3c7c1a0 100644 --- a/sfa/plc/slices.py +++ b/sfa/plc/slices.py @@ -14,7 +14,6 @@ from sfa.util.faults import * from sfa.util.record import SfaRecord from sfa.util.policy import Policy from sfa.util.prefixTree import prefixTree -from sfa.util.debug import log MAXINT = 2L**31-1 @@ -171,11 +170,12 @@ class Slices: def verify_site(self, registry, credential, slice_hrn, peer, sfa_peer, reg_objects=None): authority = get_authority(slice_hrn) authority_urn = hrn_to_urn(authority, 'authority') - + login_base = None if reg_objects: site = reg_objects['site'] + login_base = site['login_base'] else: - site_records = registry.Resolve(authority_urn, credential) + site_records = registry.Resolve(authority_urn, [credential]) site = {} for site_record in site_records: if site_record['type'] == 'authority': @@ -184,14 +184,19 @@ class Slices: raise RecordNotFound(authority) remote_site_id = site.pop('site_id') - - login_base = get_leaf(authority) + + if login_base is None: + login_base = get_leaf(authority) sites = self.api.plshell.GetSites(self.api.plauth, login_base) if not sites: site_id = self.api.plshell.AddSite(self.api.plauth, site) if peer: - self.api.plshell.BindObjectToPeer(self.api.plauth, 'site', site_id, peer, remote_site_id) + try: + self.api.plshell.BindObjectToPeer(self.api.plauth, 'site', site_id, peer, remote_site_id) + except Exception,e: + self.api.plshell.DeleteSite(self.api.plauth, site_id) + raise e # mark this site as an sfa peer record if sfa_peer and not reg_objects: peer_dict = {'type': 'authority', 'hrn': authority, 'peer_authority': sfa_peer, 'pointer': site_id} @@ -215,7 +220,7 @@ class Slices: if reg_objects: slice_record = reg_objects['slice_record'] else: - slice_records = registry.Resolve(credential, slice_hrn) + slice_records = registry.Resolve(slice_hrn, [credential]) for record in slice_records: if record['type'] in ['slice']: @@ -234,8 +239,7 @@ class Slices: for key in slice_keys: if key in slice_record and slice_record[key]: slice_fields[key] = slice_record[key] - - # add the slice + # add the slice slice_id = self.api.plshell.AddSlice(self.api.plauth, slice_fields) slice = slice_fields slice['slice_id'] = slice_id @@ -247,7 +251,11 @@ class Slices: #this belongs to a peer if peer: - self.api.plshell.BindObjectToPeer(self.api.plauth, 'slice', slice_id, peer, slice_record['pointer']) + try: + self.api.plshell.BindObjectToPeer(self.api.plauth, 'slice', slice_id, peer, slice_record['pointer']) + except Exception,e: + self.api.plshell.DeleteSlice(self.api.plauth,slice_id) + raise e slice['node_ids'] = [] else: slice = slices[0] @@ -273,7 +281,7 @@ class Slices: if reg_objects: person_dict = reg_objects['users'][researcher] else: - person_records = registry.Resolve(credential, researcher) + person_records = registry.Resolve(researcher, [credential]) for record in person_records: if record['type'] in ['user'] and record['enabled']: person_record = record @@ -303,7 +311,11 @@ class Slices: registry.register_peer_object(credential, peer_dict) if peer: - self.api.plshell.BindObjectToPeer(self.api.plauth, 'person', person_id, peer, person_dict['pointer']) + try: + self.api.plshell.BindObjectToPeer(self.api.plauth, 'person', person_id, peer, person_dict['pointer']) + except Exception,e: + self.api.plshell.DeletePerson(self.api.plauth,person_id) + raise e key_ids = [] else: person_id = persons[0]['person_id'] @@ -312,16 +324,21 @@ class Slices: # if this is a peer person, we must unbind them from the peer or PLCAPI will throw # an error - if peer: - self.api.plshell.UnBindObjectFromPeer(self.api.plauth, 'person', person_id, peer) - self.api.plshell.UnBindObjectFromPeer(self.api.plauth, 'site', site_id, peer) + try: + if peer and not local_person: + self.api.plshell.UnBindObjectFromPeer(self.api.plauth, 'person', person_id, peer) + if peer: + self.api.plshell.UnBindObjectFromPeer(self.api.plauth, 'site', site_id, peer) - self.api.plshell.AddPersonToSlice(self.api.plauth, person_dict['email'], slicename) - self.api.plshell.AddPersonToSite(self.api.plauth, person_dict['email'], site_id) - if peer and not local_person: - self.api.plshell.BindObjectToPeer(self.api.plauth, 'person', person_id, peer, person_dict['pointer']) - if peer: - self.api.plshell.BindObjectToPeer(self.api.plauth, 'site', site_id, peer, remote_site_id) + self.api.plshell.AddPersonToSlice(self.api.plauth, person_dict['email'], slicename) + self.api.plshell.AddPersonToSite(self.api.plauth, person_dict['email'], site_id) + finally: + if peer: + try: self.api.plshell.BindObjectToPeer(self.api.plauth, 'site', site_id, peer, remote_site_id) + except: pass + if peer and not local_person: + try: self.api.plshell.BindObjectToPeer(self.api.plauth, 'person', person_id, peer, person_dict['pointer']) + except: pass self.verify_keys(registry, credential, person_dict, key_ids, person_id, peer, local_person) @@ -334,15 +351,17 @@ class Slices: for personkey in person_dict['keys']: if personkey not in keys: key = {'key_type': 'ssh', 'key': personkey} - if peer: - self.api.plshell.UnBindObjectFromPeer(self.api.plauth, 'person', person_id, peer) - key_id = self.api.plshell.AddPersonKey(self.api.plauth, person_dict['email'], key) - if peer and not local_person: - self.api.plshell.BindObjectToPeer(self.api.plauth, 'person', person_id, peer, person_dict['pointer']) - if peer: - try: self.api.plshell.BindObjectToPeer(self.api.plauth, 'key', key_id, peer, key_ids.pop(0)) - - except: pass + try: + if peer: + self.api.plshell.UnBindObjectFromPeer(self.api.plauth, 'person', person_id, peer) + key_id = self.api.plshell.AddPersonKey(self.api.plauth, person_dict['email'], key) + finally: + if peer and not local_person: + self.api.plshell.BindObjectToPeer(self.api.plauth, 'person', person_id, peer, person_dict['pointer']) + if peer: + # xxx - thierry how are we getting the peer_key_id in here ? + try: self.api.plshell.BindObjectToPeer(self.api.plauth, 'key', key_id, peer, key_ids.pop(0)) + except: pass def create_slice_aggregate(self, xrn, rspec): hrn, type = urn_to_hrn(xrn) @@ -400,44 +419,50 @@ class Slices: # add nodes from rspec added_nodes = list(set(node_names).difference(hostnames)) - if peer: - self.api.plshell.UnBindObjectFromPeer(self.api.plauth, 'slice', slice['slice_id'], peer) + try: + if peer: + self.api.plshell.UnBindObjectFromPeer(self.api.plauth, 'slice', slice['slice_id'], peer) - self.api.plshell.AddSliceToNodes(self.api.plauth, slicename, added_nodes) + self.api.plshell.AddSliceToNodes(self.api.plauth, slicename, added_nodes) - # Add recognized slice tags - for node_name in node_names: - node = nodes[node_name] - for slice_tag in node.keys(): - value = node[slice_tag] - if (isinstance(value, list)): - value = value[0] + # Add recognized slice tags + for node_name in node_names: + node = nodes[node_name] + for slice_tag in node.keys(): + value = node[slice_tag] + if (isinstance(value, list)): + value = value[0] - self.api.plshell.AddSliceTag(self.api.plauth, slicename, slice_tag, value, node_name) + self.api.plshell.AddSliceTag(self.api.plauth, slicename, slice_tag, value, node_name) - self.api.plshell.DeleteSliceFromNodes(self.api.plauth, slicename, deleted_nodes) - if peer: - self.api.plshell.BindObjectToPeer(self.api.plauth, 'slice', slice['slice_id'], peer, slice['peer_slice_id']) + self.api.plshell.DeleteSliceFromNodes(self.api.plauth, slicename, deleted_nodes) + finally: + if peer: + self.api.plshell.BindObjectToPeer(self.api.plauth, 'slice', slice['slice_id'], peer, slice['peer_slice_id']) 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']) + try: + 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']}) + finally: + 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']}) - if peer: - self.api.plshell.BindObjectToPeer(self.api.plauth, 'slice', old_record['slice_id'], peer, old_record['peer_slice_id']) + try: + 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']}) + finally: + if peer: + self.api.plshell.BindObjectToPeer(self.api.plauth, 'slice', old_record['slice_id'], peer, old_record['peer_slice_id']) return 1