X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fplc%2Fslices.py;h=173de19453fd850d13690999dd981a6b53e93420;hb=0cf0d31c313a366e3f272f830bdb4f2a7308e11f;hp=3f713bcdb2d67365b75b9ffa2692d1a8cc7f1005;hpb=478b599e1279461d64161d060bd3fdd33937bf23;p=sfa.git diff --git a/sfa/plc/slices.py b/sfa/plc/slices.py index 3f713bcd..173de194 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 @@ -175,7 +174,7 @@ class Slices: if reg_objects: site = reg_objects['site'] else: - site_records = registry.Resolve([credential], authority_urn) + site_records = registry.Resolve(authority_urn, [credential]) site = {} for site_record in site_records: if site_record['type'] == 'authority': @@ -191,7 +190,11 @@ class Slices: 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} @@ -247,7 +250,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] @@ -303,7 +310,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 +323,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 +350,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 +418,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