From: Mohamed Larabi Date: Mon, 16 Dec 2013 17:44:32 +0000 (+0100) Subject: Provision(), Delete() and PerformOperationalAction() handle single slivers X-Git-Tag: sfa-3.1-2~44^2~2 X-Git-Url: http://git.onelab.eu/?p=sfa.git;a=commitdiff_plain;h=96df4d7d52e14ea85055813121a07bb3e798d98e Provision(), Delete() and PerformOperationalAction() handle single slivers --- diff --git a/sfa/client/sfi.py b/sfa/client/sfi.py index 6e60f636..dca8e9ad 100644 --- a/sfa/client/sfi.py +++ b/sfa/client/sfi.py @@ -1144,7 +1144,7 @@ use this if you mean an authority instead""") return - @register_command("slice_hrn","") + @register_command("slice_hrn [ ... ]","") def delete(self, options, args): """ de-allocate and de-provision all or named slivers of the slice (Delete) @@ -1155,6 +1155,13 @@ use this if you mean an authority instead""") slice_hrn = args[0] slice_urn = hrn_to_urn(slice_hrn, 'slice') + if len(args) > 1: + # we have sliver urns + sliver_urns = args[1:] + else: + # we provision all the slivers of the slice + sliver_urns = [slice_urn] + # creds slice_cred = self.slice_credential(slice_hrn) creds = [slice_cred] @@ -1164,7 +1171,7 @@ use this if you mean an authority instead""") api_options ['call_id'] = unique_call_id() if options.show_credential: show_credentials(creds) - result = server.Delete([slice_urn], creds, *self.ois(server, api_options ) ) + result = server.Delete(sliver_urns, creds, *self.ois(server, api_options ) ) value = ReturnValue.get_value(result) if self.options.raw: save_raw_to_file(result, self.options.raw, self.options.rawformat, self.options.rawbanner) @@ -1229,15 +1236,21 @@ use this if you mean an authority instead""") return value - @register_command("slice_hrn","") + @register_command("slice_hrn [ ... ]","") def provision(self, options, args): """ - provision already allocated resources of named slice (Provision) + provision already or named allocated slivers of the named slice (Provision) """ server = self.sliceapi() server_version = self.get_cached_server_version(server) slice_hrn = args[0] slice_urn = Xrn(slice_hrn, type='slice').get_urn() + if len(args) > 1: + # we have sliver urns + sliver_urns = args[1:] + else: + # we provision all the slivers of the slice + sliver_urns = [slice_urn] # credentials creds = [self.slice_credential(slice_hrn)] @@ -1278,7 +1291,7 @@ use this if you mean an authority instead""") users = pg_users_arg(user_records) api_options['geni_users'] = users - result = server.Provision([slice_urn], creds, api_options) + result = server.Provision(sliver_urns, creds, api_options) value = ReturnValue.get_value(result) if self.options.raw: save_raw_to_file(result, self.options.raw, self.options.rawformat, self.options.rawbanner) @@ -1317,7 +1330,7 @@ use this if you mean an authority instead""") # Thierry: seemed to be missing return value - @register_command("slice_hrn action","") + @register_command("slice_hrn [ ... ] action","") def action(self, options, args): """ Perform the named operational action on these slivers @@ -1326,8 +1339,14 @@ use this if you mean an authority instead""") api_options = {} # slice urn slice_hrn = args[0] - action = args[1] - slice_urn = Xrn(slice_hrn, type='slice').get_urn() + slice_urn = Xrn(slice_hrn, type='slice').get_urn() + if len(args) > 2: + # we have sliver urns + sliver_urns = args[1:-1] + else: + # we provision all the slivers of the slice + sliver_urns = [slice_urn] + action = args[-1] # cred slice_cred = self.slice_credential(args[0]) creds = [slice_cred] @@ -1335,7 +1354,7 @@ use this if you mean an authority instead""") delegated_cred = self.delegate_cred(slice_cred, get_authority(self.authority)) creds.append(delegated_cred) - result = server.PerformOperationalAction([slice_urn], creds, action , api_options) + result = server.PerformOperationalAction(sliver_urns, creds, action , api_options) value = ReturnValue.get_value(result) if self.options.raw: save_raw_to_file(result, self.options.raw, self.options.rawformat, self.options.rawbanner) diff --git a/sfa/methods/PerformOperationalAction.py b/sfa/methods/PerformOperationalAction.py index 073929f3..01d853d4 100644 --- a/sfa/methods/PerformOperationalAction.py +++ b/sfa/methods/PerformOperationalAction.py @@ -32,6 +32,9 @@ class PerformOperationalAction(Method): self.api.logger.info("interface: %s\ttarget-hrn: %s\tmethod-name: %s"%(self.api.interface, xrns, self.name)) # Find the valid credentials - valid_creds = self.api.auth.checkCredentials(creds, 'createsliver', xrns) + valid_creds = self.api.auth.checkCredentials(creds, 'createsliver', xrns, + check_sliver_callback = self.api.driver.check_sliver_credentials) + origin_hrn = Credential(cred=valid_creds[0]).get_gid_caller().get_hrn() + self.api.logger.info("interface: %s\tcaller-hrn: %s\ttarget-hrn: %s\tmethod-name: %s"%(self.api.interface, origin_hrn, xrns, self.name)) result = self.api.manager.PerformOperationalAction(self.api, xrns, creds, action, options) return result diff --git a/sfa/planetlab/pldriver.py b/sfa/planetlab/pldriver.py index f20ce9f3..1c59fc9e 100644 --- a/sfa/planetlab/pldriver.py +++ b/sfa/planetlab/pldriver.py @@ -55,7 +55,7 @@ class PlDriver (Driver): def sliver_to_slice_xrn(self, xrn): sliver_id_parts = Xrn(xrn).get_sliver_id_parts() - filter = {} + filter = {'peer_id': None} try: filter['slice_id'] = int(sliver_id_parts[0]) except ValueError: @@ -76,7 +76,7 @@ class PlDriver (Driver): site_hrn = '.'.join(slice_cred_hrn.split('.')[:-1]) slice_part = slice_cred_hrn.split('.')[-1] if top_auth_hrn == self.hrn: - login_base = slice_hrn.split('.')[-2][:12] + login_base = slice_cred_hrn.split('.')[-2][:12] else: login_base = hash_loginbase(site_hrn) @@ -650,6 +650,7 @@ class PlDriver (Driver): sfa_peer = slices.get_sfa_peer(xrn.get_hrn()) slice_record=None users = options.get('geni_users', []) + if users: slice_record = users[0].get('slice_record', {}) @@ -684,14 +685,32 @@ class PlDriver (Driver): slices = PlSlices(self) aggregate = PlAggregate(self) slivers = aggregate.get_slivers(urns) - slice = slivers[0] - sfa_peer = slices.get_sfa_peer(slice['hrn']) - users = options.get('geni_users', []) - persons = slices.verify_persons(slice['hrn'], slice, users, sfa_peer, options=options) - # update sliver allocation states and set them to geni_provisioned - sliver_ids = [sliver['sliver_id'] for sliver in slivers] - dbsession=self.api.dbsession() - SliverAllocation.set_allocations(sliver_ids, 'geni_provisioned',dbsession) + if not slivers: + sliver_id_parts = Xrn(urns[0]).get_sliver_id_parts() + filter = {} + try: + filter['slice_id'] = int(sliver_id_parts[0]) + except ValueError: + filter['name'] = sliver_id_parts[0] + slices = self.shell.GetSlices(filter,['hrn']) + if not slices: + raise Forbidden("Unable to locate slice record for sliver: %s" % xrn) + slice = slices[0] + slice_urn = hrn_to_urn(slice['hrn'], type='slice') + urns = [slice_urn] + else: + slice_id = slivers[0]['slice_id'] + slice_hrn = self.shell.GetSliceHrn(slice_id) + slice = self.shell.GetSlices({'slice_id': slice_id})[0] + slice['hrn'] = slice_hrn + sfa_peer = slices.get_sfa_peer(slice['hrn']) + users = options.get('geni_users', []) + persons = slices.verify_persons(slice['hrn'], slice, users, sfa_peer, options=options) + # update sliver allocation states and set them to geni_provisioned + sliver_ids = [sliver['sliver_id'] for sliver in slivers] + dbsession=self.api.dbsession() + SliverAllocation.set_allocations(sliver_ids, 'geni_provisioned',dbsession) + version_manager = VersionManager() rspec_version = version_manager.get_version(options['geni_rspec_version']) return self.describe(urns, rspec_version, options=options) @@ -711,7 +730,7 @@ class PlDriver (Driver): sliver_ids.append(sliver['sliver_id']) # leases - leases = self.shell.GetLeases({'name': slice_name}) + leases = self.shell.GetLeases({'name': slice_name, 'node_id': node_ids}) leases_ids = [lease['lease_id'] for lease in leases ] slice_hrn = self.shell.GetSliceHrn(int(slice_id)) diff --git a/sfa/planetlab/plslices.py b/sfa/planetlab/plslices.py index 9a118ada..14179846 100644 --- a/sfa/planetlab/plslices.py +++ b/sfa/planetlab/plslices.py @@ -446,7 +446,7 @@ class PlSlices: # Add persons or add persons to slice for person_hrn in persons_to_add: - person_email = users_by_hrn[person_hrn].get('email', None) + person_email = users_by_hrn[person_hrn].get('email', "%s@geni.net"%person_hrn.split('.')[-1]) if person_email and person_email in persons_by_email.keys(): # check if the user already exist in PL person_id = persons_by_email[person_email]['person_id']