From cb5d090105476e9d94b6809ca898fca42cc6038d Mon Sep 17 00:00:00 2001 From: Tony Mack Date: Tue, 6 Dec 2011 16:49:08 -0500 Subject: [PATCH] move 'append' from users struct to options struct --- sfa/client/sfi.py | 8 ++++--- sfa/managers/aggregate_manager.py | 8 +++---- sfa/plc/plslices.py | 40 +++++++++++++++---------------- 3 files changed, 29 insertions(+), 27 deletions(-) diff --git a/sfa/client/sfi.py b/sfa/client/sfi.py index 80c2c042..96a8d3b9 100755 --- a/sfa/client/sfi.py +++ b/sfa/client/sfi.py @@ -1027,10 +1027,12 @@ or currently provisioned resources (ListResources) creds = [slice_cred] if delegated_cred: creds.append(delegated_cred) - call_args = [slice_urn, creds, rspec, users] + # do not append users, keys, or slice tags. Anything + # not contained in this request will be removed from the slice + options = {'append': False} if self.server_supports_options_arg(server): - options = {'call_id': unique_call_id()} - call_args.append(options) + options['call_id'] = unique_call_id() + call_args = [slice_urn, creds, rspec, users, options] result = server.CreateSliver(*call_args) value = ReturnValue.get_value(result) if opts.file is None: diff --git a/sfa/managers/aggregate_manager.py b/sfa/managers/aggregate_manager.py index 7559f9a5..c49b0d7d 100644 --- a/sfa/managers/aggregate_manager.py +++ b/sfa/managers/aggregate_manager.py @@ -123,13 +123,13 @@ class AggregateManager: requested_attributes = rspec.version.get_slice_attributes() # ensure site record exists - site = slices.verify_site(hrn, slice_record, peer, sfa_peer) + site = slices.verify_site(hrn, slice_record, peer, sfa_peer, options=options) # ensure slice record exists - slice = slices.verify_slice(hrn, slice_record, peer, sfa_peer) + slice = slices.verify_slice(hrn, slice_record, peer, sfa_peer, options=options) # ensure person records exists - persons = slices.verify_persons(hrn, slice, users, peer, sfa_peer) + persons = slices.verify_persons(hrn, slice, users, peer, sfa_peer, options=options) # ensure slice attributes exists - slices.verify_slice_attributes(slice, requested_attributes) + slices.verify_slice_attributes(slice, requested_attributes, options=options) # add/remove slice from nodes requested_slivers = [node.get('component_name') for node in rspec.version.get_nodes_with_slivers()] diff --git a/sfa/plc/plslices.py b/sfa/plc/plslices.py index 7b08c999..5dc20329 100644 --- a/sfa/plc/plslices.py +++ b/sfa/plc/plslices.py @@ -230,7 +230,7 @@ class PlSlices: slice_tags.append({'name': 'vini_topo', 'value': 'manual', 'node_id': node_id}) #self.api.driver.AddSliceTag(slice['name'], 'topo_rspec', str([topo_rspec]), node_id) - self.verify_slice_attributes(slice, slice_tags, append=True, admin=True) + self.verify_slice_attributes(slice, slice_tags, {'append': True}, admin=True) @@ -270,7 +270,7 @@ class PlSlices: return slice - def verify_site(self, slice_xrn, slice_record={}, peer=None, sfa_peer=None): + def verify_site(self, slice_xrn, slice_record={}, peer=None, sfa_peer=None, options={}): (slice_hrn, type) = urn_to_hrn(slice_xrn) site_hrn = get_authority(slice_hrn) # login base can't be longer than 20 characters @@ -307,7 +307,7 @@ class PlSlices: return site - def verify_slice(self, slice_hrn, slice_record, peer, sfa_peer): + def verify_slice(self, slice_hrn, slice_record, peer, sfa_peer, options={}): slicename = hrn_to_pl_slicename(slice_hrn) parts = slicename.split("_") login_base = parts[0] @@ -340,10 +340,9 @@ class PlSlices: return slice #def get_existing_persons(self, users): - def verify_persons(self, slice_hrn, slice_record, users, peer, sfa_peer, append=True): + def verify_persons(self, slice_hrn, slice_record, users, peer, sfa_peer, options={}): users_by_email = {} users_by_site = defaultdict(list) - users_dict = {} for user in users: hrn, type = urn_to_hrn(user['urn']) @@ -352,26 +351,23 @@ class PlSlices: user['username'] = username user['site'] = login_base - if 'append' in user and user['append'] == False: - append = False - if 'email' in user: users_by_email[user['email']] = user users_dict[user['email']] = user else: users_by_site[user['site']].append(user) - # start building a list of existing users - existing_user_ids = [] + # start building a list of existing users + existing_user_ids = [] existing_user_ids_filter = [] if users_by_email: existing_user_ids_filter.extend(users_by_email.keys()) - if users_by_site: - for login_base in users_by_site: - users = users_by_site[login_base] - for user in users: - existing_user_ids_filter.append(user['username']+'@geni.net') - if existing_user_ids_filter: + if users_by_site: + for login_base in users_by_site: + users = users_by_site[login_base] + for user in users: + existing_user_ids_filter.append(user['username']+'@geni.net') + if existing_user_ids_filter: # get existing users by email existing_users = self.api.driver.GetPersons({'email': existing_user_ids_filter}, ['person_id', 'key_ids', 'email']) @@ -428,13 +424,15 @@ class PlSlices: updated_user_ids = set(existing_slice_user_ids).intersection(requested_user_ids) # Remove stale users (only if we are not appending). + # Append by default. + append = options.get('append', True) if append == False: for removed_user_id in removed_user_ids: self.api.driver.DeletePersonFromSlice(removed_user_id, slice_record['name']) # update_existing users updated_users_list = [user for user in existing_slice_users if user['email'] in \ updated_user_ids] - self.verify_keys(existing_slice_users, updated_users_list, peer, append) + self.verify_keys(existing_slice_users, updated_users_list, peer, options) added_persons = [] # add new users @@ -480,7 +478,7 @@ class PlSlices: return added_persons - def verify_keys(self, persons, users, peer, append=True): + def verify_keys(self, persons, users, peer, options={}): # existing keys key_ids = [] for person in persons: @@ -519,6 +517,7 @@ class PlSlices: self.api.driver.BindObjectToPeer('person', person['person_id'], peer['shortname'], user['person_id']) # remove old keys (only if we are not appending) + append = options.get('append', True) if append == False: removed_keys = set(existing_keys).difference(requested_keys) for existing_key_id in keydict: @@ -530,7 +529,8 @@ class PlSlices: except: pass - def verify_slice_attributes(self, slice, requested_slice_attributes, append=False, admin=False): + def verify_slice_attributes(self, slice, requested_slice_attributes, options={}, admin=False): + append = options.get('append', True) # get list of attributes users ar able to manage filter = {'category': '*slice*'} if not admin: @@ -543,7 +543,7 @@ class PlSlices: removed_slice_attributes = [] ignored_slice_attribute_names = [] existing_slice_attributes = self.api.driver.GetSliceTags({'slice_id': slice['slice_id']}) - + # get attributes that should be removed for slice_tag in existing_slice_attributes: if slice_tag['tagname'] in ignored_slice_attribute_names: -- 2.43.0