X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fiotlab%2Fiotlabdriver.py;h=016249b5215ab6a9b39b51c6f4a2b7d28aff1883;hb=95015fd08e08729c3aaeec2c000995595ea7a7e0;hp=eea909c514744ae3b96c17a263e6954ce33e5fcc;hpb=fb6607ca689efb9da8f28bb96601231449bd40e7;p=sfa.git diff --git a/sfa/iotlab/iotlabdriver.py b/sfa/iotlab/iotlabdriver.py index eea909c5..016249b5 100644 --- a/sfa/iotlab/iotlabdriver.py +++ b/sfa/iotlab/iotlabdriver.py @@ -704,7 +704,7 @@ class IotlabDriver(Driver): sfa_record = RegSlice(hrn=slice_record['hrn'], gid=slice_record['gid'], - pointer=slice_record['slice_id'], + #pointer=slice_record['slice_id'], authority=slice_record['authority']) logger.debug("IOTLAB_API.PY AddSlice sfa_record %s user_record %s" % (sfa_record, user_record)) @@ -1088,7 +1088,7 @@ class IotlabDriver(Driver): - def delete(self, slice_urns, options={}): + def delete(self, slice_urns, options=None): """ Deletes the lease associated with the slice hrn and the credentials if the slice belongs to iotlab. Answer to DeleteSliver. @@ -1106,6 +1106,7 @@ class IotlabDriver(Driver): .. note:: creds are unused, and are not used either in the dummy driver delete_sliver . """ + if options is None: options={} # collect sliver ids so we can update sliver allocation states after # we remove the slivers. aggregate = IotlabAggregate(self) @@ -1398,7 +1399,8 @@ class IotlabDriver(Driver): 'geni_ad_rspec_versions': ad_rspec_versions} # first 2 args are None in case of resource discovery - def list_resources (self, version=None, options={}): + def list_resources (self, version=None, options=None): + if options is None: options={} aggregate = IotlabAggregate(self) rspec = aggregate.list_resources(version=version, options=options) return rspec @@ -1407,7 +1409,8 @@ class IotlabDriver(Driver): aggregate = IotlabAggregate(self) return aggregate.describe(urns, version=version, options=options) - def status (self, urns, options={}): + def status (self, urns, options=None): + if options is None: options={} aggregate = IotlabAggregate(self) desc = aggregate.describe(urns, version='GENI 3') status = {'geni_urn': desc['geni_urn'], @@ -1415,7 +1418,8 @@ class IotlabDriver(Driver): return status - def allocate (self, urn, rspec_string, expiration, options={}): + def allocate (self, urn, rspec_string, expiration, options=None): + if options is None: options={} xrn = Xrn(urn) aggregate = IotlabAggregate(self) @@ -1423,20 +1427,36 @@ class IotlabDriver(Driver): peer = slices.get_peer(xrn.get_hrn()) sfa_peer = slices.get_sfa_peer(xrn.get_hrn()) + caller_hrn = options.get('actual_caller_hrn', []) + caller_xrn = Xrn(caller_hrn) + caller_urn = caller_xrn.get_urn() + + logger.debug("IOTLABDRIVER.PY :: Allocate caller = %s" % (caller_urn)) slice_record = {} users = options.get('geni_users', []) - sfa_users = options.get('sfa_users', []) + if sfa_users: - # XXX Always empty ??? no slice_record in the Allocate call - #slice_record = sfa_users[0].get('slice_record', []) - user_xrn = Xrn(sfa_users[0]['urn']) - user_hrn = user_xrn.get_hrn() - - slice_record = sfa_users[0].get('slice_record', {}) - slice_record['user'] = {'keys': users[0]['keys'], - 'email': users[0]['email'], + user = None + # Looking for the user who actually called the Allocate function in the list of users of the slice + for u in sfa_users: + if 'urn' in u and u['urn'] == caller_urn: + user = u + logger.debug("user = %s" % u) + # If we find the user in the list we use it, else we take the 1st in the list as before + if user: + user_hrn = caller_hrn + else: + user = sfa_users[0] + # XXX Always empty ??? no slice_record in the Allocate call + #slice_record = sfa_users[0].get('slice_record', []) + user_xrn = Xrn(sfa_users[0]['urn']) + user_hrn = user_xrn.get_hrn() + + slice_record = user.get('slice_record', {}) + slice_record['user'] = {'keys': user['keys'], + 'email': user['email'], 'hrn': user_hrn} slice_record['authority'] = xrn.get_authority_hrn() @@ -1449,30 +1469,56 @@ class IotlabDriver(Driver): # ensure site record exists - # ensure slice record exists - - current_slice = slices.verify_slice(xrn.hrn, slice_record, sfa_peer) - logger.debug("IOTLABDRIVER.PY \t ===============allocate \t\ - \r\n \r\n current_slice %s" % (current_slice)) # ensure person records exists + for user in users: + # XXX LOIC using hrn is a workaround because the function + # Xrn.get_urn returns 'urn:publicid:IDN+onelab:upmc+timur_friedman' + # Instead of this 'urn:publicid:IDN+onelab:upmc+user+timur_friedman' + user['hrn'] = urn_to_hrn(user['urn'])[0] + # XXX LOIC adding the users of the slice to reg-researchers + # reg-researchers is used in iotlabslices.py verify_slice in order to add the slice + if 'reg-researchers' not in slice_record: + slice_record['reg-researchers'] = list() + slice_record['reg-researchers'].append(user['hrn']) + if caller_hrn == user['hrn']: + #hierarchical_user = user['hrn'].split(".") + #user['login'] = hierarchical_user[-1] + #slice_record['login'] = user['login'] + slice_record['user']=user # oui c'est degueulasse, le slice_record se retrouve modifie # dans la methode avec les infos du user, els infos sont propagees # dans verify_slice_leases logger.debug("IOTLABDRIVER.PY BEFORE slices.verify_persons") + + # XXX JORDAN XXX slice_record devrait recevoir le caller_xrn... + # LOIC maintenant c'est fait au dessus + logger.debug("LOIC - slice_record[user] = %s" % slice_record['user']) persons = slices.verify_persons(xrn.hrn, slice_record, users, options=options) logger.debug("IOTLABDRIVER.PY AFTER slices.verify_persons") + logger.debug("LOIC - slice_record[user] = %s" % slice_record['user']) + + # ensure slice record exists + current_slice = slices.verify_slice(xrn.hrn, slice_record, sfa_peer) + logger.debug("LOIC - AFTER verify_slice - slice_record[user] = %s" % slice_record['user']) + logger.debug("IOTLABDRIVER.PY \t ===============allocate \t\ + \r\n \r\n current_slice %s" % (current_slice)) + # ensure slice attributes exists # slices.verify_slice_attributes(slice, requested_attributes, # options=options) # add/remove slice from nodes + # XXX JORDAN ensure requested_xp_dict returns a dict with all new leases requested_xp_dict = self._process_requested_xp_dict(rspec) logger.debug("IOTLABDRIVER.PY \tallocate requested_xp_dict %s " % (requested_xp_dict)) request_nodes = rspec.version.get_nodes_with_slivers() + + + # JORDAN: nodes_list will contain a list of newly allocated nodes nodes_list = [] for start_time in requested_xp_dict: lease = requested_xp_dict[start_time] @@ -1487,10 +1533,14 @@ class IotlabDriver(Driver): rspec_requested_leases = rspec.version.get_leases() leases = slices.verify_slice_leases(slice_record, requested_xp_dict, peer) + # JORDAN: + # leases = already in slice + # rspec_requested_leases = newly requested logger.debug("IOTLABDRIVER.PY \tallocate leases %s \ rspec_requested_leases %s" % (leases, rspec_requested_leases)) - # update sliver allocations + # update sliver allocations + # JORDAN Here we loop over newly allocated nodes for hostname in nodes_list: client_id = hostname node_urn = xrn_object(self.testbed_shell.root_auth, hostname).urn @@ -1499,21 +1549,29 @@ class IotlabDriver(Driver): slice_urn = current_slice['reg-urn'] else: slice_urn = current_slice['urn'] + + # JORDAN: We loop over leases previously in the slice for lease in leases: if hostname in lease['reserved_nodes']: index = lease['reserved_nodes'].index(hostname) sliver_hrn = '%s.%s-%s' % (self.hrn, lease['lease_id'], lease['resource_ids'][index] ) - sliver_id = Xrn(sliver_hrn, type='sliver').urn - record = SliverAllocation(sliver_id=sliver_id, client_id=client_id, + sliver_id = Xrn(sliver_hrn, type='sliver').urn + record = SliverAllocation(sliver_id=sliver_id, client_id=client_id, component_id=component_id, slice_urn = slice_urn, allocation_state='geni_allocated') - record.sync(self.api.dbsession()) + record.sync(self.api.dbsession()) - return aggregate.describe([xrn.get_urn()], version=rspec.version) + # JORDAN : added describe_options which was not specified at all + describe_options = { + 'geni_slice_urn': urn, + 'list_leases': 'all', + } + return aggregate.describe([xrn.get_urn()], version=rspec.version, options=describe_options) - def provision(self, urns, options={}): + def provision(self, urns, options=None): + if options is None: options={} # update users slices = IotlabSlices(self) aggregate = IotlabAggregate(self) @@ -1533,4 +1591,10 @@ class IotlabDriver(Driver): version_manager = VersionManager() rspec_version = version_manager.get_version(options[ 'geni_rspec_version']) - return self.describe(urns, rspec_version, options=options) + # JORDAN : added describe_options instead of options + # urns at the begining ??? + describe_options = { + 'geni_slice_urn': current_slice['urn'], + 'list_leases': 'all', + } + return self.describe(urns, rspec_version, options=describe_options)