From: Sandrine Avakian Date: Wed, 18 Dec 2013 14:02:22 +0000 (+0100) Subject: Merge branch 'geni-v3' of ssh://git.onelab.eu/git/sfa into geni-v3 X-Git-Tag: sfa-3.1-2~44 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=38a5b91de2913a5a5501b3b5a74ec01e3b3be3b7;hp=55add1f11471ddd41edcb2df90c048b6f1184a3c;p=sfa.git Merge branch 'geni-v3' of ssh://git.onelab.eu/git/sfa into geni-v3 --- diff --git a/sfa/client/sfi.py b/sfa/client/sfi.py index 6e60f636..e5575372 100644 --- a/sfa/client/sfi.py +++ b/sfa/client/sfi.py @@ -1144,10 +1144,10 @@ 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) + de-allocate and de-provision all or named slivers of the named slice (Delete) """ server = self.sliceapi() @@ -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 all or named already 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) @@ -1291,7 +1304,7 @@ use this if you mean an authority instead""") @register_command("slice_hrn","") def status(self, options, args): """ - retrieve the status of the slivers belonging to tne named slice (Status) + retrieve the status of the slivers belonging to the named slice (Status) """ server = self.sliceapi() @@ -1317,17 +1330,23 @@ 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 + Perform the named operational action on all or named slivers of the named slice """ server = self.sliceapi() 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) @@ -1343,18 +1362,26 @@ use this if you mean an authority instead""") print value return value - @register_command("slice_hrn time","") + @register_command("slice_hrn [ ... ] time","") def renew(self, options, args): """ - renew slice (RenewSliver) + renew slice (Renew) """ server = self.sliceapi() - if len(args) != 2: + if len(args) < 2: self.print_help() sys.exit(1) - [ slice_hrn, input_time ] = args - # slice urn - slice_urn = hrn_to_urn(slice_hrn, 'slice') + slice_hrn = args[0] + 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] + input_time = args[-1] + # time: don't try to be smart on the time format, server-side will # creds slice_cred = self.slice_credential(args[0]) @@ -1364,7 +1391,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.Renew([slice_urn], creds, input_time, *self.ois(server,api_options)) + result = server.Renew(sliver_urns, creds, input_time, *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) 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']