Merge branch 'geni-v3' of ssh://git.onelab.eu/git/sfa into geni-v3
authorLoic Baron <sandrine.avakian@inria.fr>
Wed, 30 Jul 2014 08:15:32 +0000 (10:15 +0200)
committerLoic Baron <sandrine.avakian@inria.fr>
Wed, 30 Jul 2014 08:15:32 +0000 (10:15 +0200)
Conflicts:
sfa/iotlab/iotlabaggregate.py
sfa/iotlab/iotlabslices.py

1  2 
sfa/iotlab/iotlabaggregate.py
sfa/iotlab/iotlabdriver.py
sfa/iotlab/iotlabslices.py

@@@ -306,7 -306,7 +306,7 @@@ class IotlabAggregate
          return rspec_node
  
  
-     def rspec_node_to_geni_sliver(self, rspec_node, sliver_allocations = {}):
+     def rspec_node_to_geni_sliver(self, rspec_node, sliver_allocations = None):
          """Makes a geni sliver structure from all the nodes allocated
          to slivers in the sliver_allocations dictionary. Returns the states
          of the sliver.
          .. seealso:: node_to_rspec_node
  
          """
+         if sliver_allocations is None: sliver_allocations={}
          if rspec_node['sliver_id'] in sliver_allocations:
              # set sliver allocation and operational status
              sliver_allocation = sliver_allocations[rspec_node['sliver_id']]
          return rspec_node
  
  
-     def get_leases(self, slice=None, options={}):
+     def get_leases(self, slice=None, options=None):
+         if options is None: options={}
          filter={}
          if slice:
 -           filter.update({'name':slice['slice_name']})
 +           #filter.update({'name':slice['slice_name']}) # JORDAN: this is = "upmc" !!!
 +           filter.update({'slice_hrn':slice['slice_hrn']}) # JORDAN: this is = "upmc" !!!
 +            # slice_hrn = "ple.upmc.myslicedemo
          #return_fields = ['lease_id', 'hostname', 'site_id', 'name', 't_from', 't_until']
          leases = self.driver.GetLeases(lease_filter_dict=filter)
          grain = self.driver.testbed_shell.GetLeaseGranularity()
                         FINAL RSPEC %s \r\n" % (rspec.toxml()))
          return rspec.toxml()
  
-     def get_slivers(self, urns, options={}):
+     def get_slivers(self, urns, options=None):
          """Get slivers of the given slice urns. Slivers contains slice, node and
          user information.
  
          .. seealso:: http://groups.geni.net/geni/wiki/GAPI_AM_API_V3/CommonConcepts#urns
          """
  
 +        SLICE_KEY = 'slice_hrn' # slice_hrn
+         if options is None: options={}
          slice_ids = set()
          node_ids = []
          for urn in urns:
                         \r\n" % (xrn, slice_names))
          filter_sliver = {}
          if slice_names:
 -            filter_sliver['slice_hrn'] = list(slice_names)
 -            slice_hrn = filter_sliver['slice_hrn'][0]
 +            filter_sliver[SLICE_KEY] = list(slice_names)
 +            slice_hrn = filter_sliver[SLICE_KEY][0]
  
 -            slice_filter_type = 'slice_hrn'
 +            slice_filter_type = SLICE_KEY
  
          # if slice_ids:
          #     filter['slice_id'] = list(slice_ids)
          # # get slices
          if slice_hrn:
 +            logger.debug("JORDAN SLICE_HRN=%r" % slice_hrn)
              slices = self.driver.GetSlices(slice_hrn,
                  slice_filter_type)
 -            leases = self.driver.GetLeases({'slice_hrn':slice_hrn})
 +            leases = self.driver.GetLeases({SLICE_KEY:slice_hrn})
          logger.debug("IotlabAggregate \t get_slivers \
                         slices %s leases %s\r\n" % (slices, leases ))
          if not slices:
              return []
  
 +        logger.debug("LOIC SLICES = %r" % slices)
          single_slice = slices[0]
          # get sliver users
 -        user = single_slice['reg_researchers'][0].__dict__
 +
 +        # XXX LOIC !!! XXX QUICK AND DIRTY - Let's try...
 +        logger.debug("LOIC Number of reg_researchers = %s" % len(single_slice['reg_researchers']))
 +        if 'reg_researchers' in single_slice and len(single_slice['reg_researchers'])==0:
 +            user = {'uid':single_slice['user']}
 +        else:
 +            user = single_slice['reg_researchers'][0].__dict__
          logger.debug("IotlabAggregate \t get_slivers user %s \
                         \r\n" % (user))
  
                         \r\n" % (person))
          # name = person['last_name']
          user['login'] = person['uid']
 -        user['user_urn'] = hrn_to_urn(user['hrn'], 'user')
 -        user['keys'] = person['pkey']
 +
 +        # XXX LOIC !!! if we have more info, let's fill user
 +        if 'hrn' in user:
 +            user['user_urn'] = hrn_to_urn(user['hrn'], 'user')
 +        if 'keys' in user:
 +            user['keys'] = person['pkey']
  
  
          try:
              node_ids = single_slice['node_ids']
 -            node_list = self.driver.testbed_shell.GetNodes(
 -                    {'hostname':single_slice['node_ids']})
 +            node_list = self.driver.testbed_shell.GetNodes()
 +# JORDAN REMOVED FILTER so that next check always succeed
 +#                    {'hostname':single_slice['node_ids']})
              node_by_hostname = dict([(node['hostname'], node)
                                          for node in node_list])
          except KeyError:
                  node_id = current_lease['resource_ids'][index]
                  # node['slice_name'] = user['login']
                  # node.update(single_slice)
 +                # JORDAN XXX This fails sometimes when hostname not in the list
 +                #if hostname in node_by_hostname:
                  more_info = node_by_hostname[hostname]
                  node.update(more_info)
 +                #else:
 +                #    # This can happen when specifying a lease without the resource, then all subsequent calls will fail
 +                #    logger.debug("Ignored missing hostname for now one")
                  # oar_job_id is the slice_id (lease_id)
                  sliver_hrn = '%s.%s-%s' % (self.driver.hrn,
                              current_lease['lease_id'], node_id)
                  slivers.append(node)
          return slivers
  
-     def list_resources(self, version = None, options={}):
+     def list_resources(self, version = None, options=None):
          """
          Returns an advertisement Rspec of available resources at this
          aggregate. This Rspec contains a resource listing along with their
          .. seealso:: http://groups.geni.net/geni/wiki/GAPI_AM_API_V3#ListResources
          """
  
+         if options is None: options={}
          version_manager = VersionManager()
          version = version_manager.get_version(version)
          rspec_version = version_manager._get_version(version.type,
          return rspec.toxml()
  
  
-     def describe(self, urns, version=None, options={}):
+     def describe(self, urns, version=None, options=None):
          """
          Retrieve a manifest RSpec describing the resources contained by the
          named entities, e.g. a single slice or a set of the slivers in a slice.
          .. seealso:: http://groups.geni.net/geni/wiki/GAPI_AM_API_V3#Describe
          .. seealso:: http://groups.geni.net/geni/wiki/GAPI_AM_API_V3/CommonConcepts#urns
          """
+         if options is None: options={}
          version_manager = VersionManager()
          version = version_manager.get_version(version)
          rspec_version = version_manager._get_version(
          # get slivers
          geni_slivers = []
          slivers = self.get_slivers(urns, options)
 +        logger.debug("SLIVERS=%r" % slivers)
          if slivers:
              rspec_expires = datetime_to_string(utcparse(slivers[0]['expires']))
          else:
              geni_urn = sliver_allocation.slice_urn
              sliver_allocation_dict[sliver_allocation.sliver_id] = \
                                                              sliver_allocation
 -        if not options.get('list_leases') or options['list_leases'] != 'leases':                                                    
 +        show_leases = options.get('list_leases')
 +        if show_leases in ['resources', 'all']:
 +        #if not options.get('list_leases') or options['list_leases'] != 'leases':                                                    
              # add slivers
              nodes_dict = {}
              for sliver in slivers:
                  geni_slivers.append(geni_sliver)
              rspec.version.add_nodes(rspec_nodes)
  
 -        if not options.get('list_leases') or options['list_leases'] == 'resources':
 +        logger.debug("SHOW LEASES = %r" % show_leases)
 +        if show_leases in ['leases', 'all']:
 +        #if not options.get('list_leases') or options['list_leases'] == 'resources':
              if slivers:
 -                leases = self.get_leases(slivers[0])
 +                leases = self.get_leases(slice=slivers[0])
 +                logger.debug("JORDAN: getting leases from slice: %r" % slivers[0])
                  rspec.version.add_leases(leases)
  
          return {'geni_urn': geni_urn,
@@@ -135,7 -135,7 +135,7 @@@ class IotlabDriver(Driver)
  
  
  
 -    def AddPerson(self, record):
 +    def AddPerson(self, record, add_to_ldap = True):
          """
  
          Adds a new account. Any fields specified in records are used,
          :rtype: dict
  
          """
 +        if not add_to_ldap:
 +            ret = self.__add_person_to_db(record)
 +            return ret
 +
          ret = self.testbed_shell.ldap.LdapAddUser(record)
  
          if ret['bool'] is True:
          """
          query = self.api.dbsession().query(RegUser)
          check_if_exists = query.filter_by(email = user_dict['email']).first()
 +        logger.debug("LOIC __add_person_to_db %s" % check_if_exists)
          #user doesn't exists
          if not check_if_exists:
              logger.debug("__add_person_to_db \t Adding %s \r\n \r\n \
          .. seealso::_sql_get_slice_info_from_user
          .. seealso:: _sql_get_slice_info
          """
 +        logger.debug("JORDAN get_slice_records slice_filter=%r slice_filter_type=%r" % (slice_filter, slice_filter_type))
  
          #Get list of slices based on the slice hrn
          if slice_filter_type == 'slice_hrn':
  
          #First try to get information on the slice based on the filter provided
          if slice_filter_type in authorized_filter_types_list:
 +            logger.debug("JORDAN GET SLICES 1")
              fixed_slicerec_dict = self._get_slice_records(slice_filter,
                                                      slice_filter_type)
 +            logger.debug("JORDAN GET SLICE RECORDS %r" % fixed_slicerec_dict)
              # if the slice was not found in the sfa db
              if fixed_slicerec_dict is None:
                  return return_slicerec_dictlist
              #If no job is running or no job scheduled
              #return only the slice record
              if leases_list == [] and fixed_slicerec_dict:
 +                logger.debug("JORDAN CASE 1")
                  return_slicerec_dictlist.append(fixed_slicerec_dict)
  
              # if the jobs running don't belong to the user/slice we are looking
              # for
              leases_hrn = [lease['slice_hrn'] for lease in leases_list]
              if slice_hrn not in leases_hrn:
 +                logger.debug("JORDAN CASE 2")
                  return_slicerec_dictlist.append(fixed_slicerec_dict)
              #If several jobs for one slice , put the slice record into
              # each lease information dict
  
  
          else:
 +            logger.debug("JORDAN GET SLICES 2")
              #Get all slices from the iotlab sfa database ,
              #put them in dict format
              #query_slice_list = dbsession.query(RegRecord).all()
  
          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))
          self.api.dbsession().add(sfa_record)
          self.api.dbsession().commit()
          #Update the reg-researchers dependency table
 -        sfa_record.reg_researchers = [user_record]
 +        if user_record is not None:
 +            sfa_record.reg_researchers = [user_record]
 +        else:
 +            sfa_record.reg_researchers = slice_record['reg-researchers']
          self.api.dbsession().commit()
  
          return
  
  
  
-     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.
          .. 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)
              '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
  
-     def describe(self, urns, version, options={}):
+     def describe(self, urns, version, options=None):
+         if options is None: options={}
          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'],
          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)
  
  
          # 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
  
          # 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")
 -        persons = slices.verify_persons(xrn.hrn, slice_record, users,
 -                                        options=options)
 +        # XXX JORDAN XXX slice_record devrait recevoir le caller_xrn...
 +        logger.debug("LOIC users = %r" % users)
 +        # XXX LOIC XXX Trying here to bypass the verify_persons function
 +        # But it doesn't work, It seems we have to add users in LDAP anyway...
 +        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
 +
 +        # XXX LOIC XXX Need to re-activate this function and understand exactly what is required
 +
 +        persons = slices.verify_persons(xrn.hrn, slice_record, [slice_record['user']], options=options)
          logger.debug("IOTLABDRIVER.PY  AFTER slices.verify_persons")
 +        logger.debug("LOIC - IOTLABDRIVER.PY - AFTER slices.verify_persons slice_record = %r" % slice_record)
          # ensure slice attributes exists
 -        # slices.verify_slice_attributes(slice, requested_attributes,
 -                                    # options=options)
 +        # XXX LOIC XXX This method doesn't exist !!!
 +        #slices.verify_slice_attributes(slice, requested_attributes, options=options)
 +
 +        # XXX LOIC !!! Essayons d'inverser : d'abord verify_persons ensuite verify_slice
 +        
 +        # ensure slice record exists
 +        # XXX LOIC !!! verify_slice uniquement pour iotlab - les slices externes ne doivent pas être vérifiés = Ils ne sont pas dans le registry IOTLAB
 +        current_slice = None
 +        #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))
  
          # 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]
          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
 +
 +        # XXX LOIC !!! What is in the slice_record?
 +        # Where is affected reg_researchers value???
 +        logger.debug("LOIC - IOTLABDRIVER.PY - After verify_slice_leases slice_record = %r" %slice_record)
 +        # update sliver allocations
 +        # JORDAN Here we loop over newly allocated nodes
          for hostname in nodes_list:
 +            logger.debug("FORLOOP JORDAN hostname=%r" % hostname)
              client_id = hostname
              node_urn = xrn_object(self.testbed_shell.root_auth, hostname).urn
              component_id = node_urn
 -            if 'reg-urn' in current_slice:
 -                slice_urn = current_slice['reg-urn']
 +            if current_slice is not None:
 +                if 'reg-urn' in current_slice:
 +                    slice_urn = current_slice['reg-urn']
 +                else:
 +                    slice_urn = current_slice['urn']
              else:
 -                slice_urn = current_slice['urn']
 -            for lease in leases:
 +                slice_urn = slice_record['urn']
 +            # JORDAN: We loop over leases previously in the slice
 +            for lease in leases: # rspec_requested_leases ?????? XXX
 +                logger.debug("FOR LEASE LOOP JORDAN lease=%r" % lease)
 +                logger.debug("JORDAN hostname=%r lease['reserved_nodes']=%r, bool=%r" % (hostname, lease['reserved_nodes'], hostname in lease['reserved_nodes']))
                  if hostname in lease['reserved_nodes']:
 +                    logger.debug("JORDAN IF OK")
                      index = lease['reserved_nodes'].index(hostname)
 +                    logger.debug("JORDAN index=%r" % index)
                      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,
 -                                      component_id=component_id,
 -                                      slice_urn = slice_urn,
 -                                      allocation_state='geni_allocated')
 -            record.sync(self.api.dbsession())
  
 -        return aggregate.describe([xrn.get_urn()], version=rspec.version)
 +                    logger.debug("LOIC sliver_hrn=%r" % sliver_hrn)
 +                    sliver_id = Xrn(sliver_hrn, type='sliver').urn
 +
 +                    logger.debug("LOIC sliver_id=%r" % sliver_id)
 +                    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())
 +
 +        # 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)
          slivers = aggregate.get_slivers(urns)
          current_slice = slivers[0]
 +        logger.debug("Provision current slice: %r" % (current_slice,))
          peer = slices.get_peer(current_slice['hrn'])
          sfa_peer = slices.get_sfa_peer(current_slice['hrn'])
          users = options.get('geni_users', [])
          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)
@@@ -2,7 -2,7 +2,7 @@@
  This file defines the IotlabSlices class by which all the slice checkings
  upon lease creation are done.
  """
 -from sfa.util.xrn import get_authority, urn_to_hrn
 +from sfa.util.xrn import get_authority, urn_to_hrn, hrn_to_urn
  from sfa.util.sfalogging import logger
  
  MAXINT = 2L**31-1
@@@ -135,7 -135,6 +135,7 @@@ class IotlabSlices
                  * self.driver.testbed_shell.GetLeaseGranularity())
              if job['duration'] < \
                      self.driver.testbed_shell.GetLeaseGranularity():
 +                logger.debug("JORDAN removed too short lease !!!! %r" % (requested_jobs_dict[job['start_time']],))
                  del requested_jobs_dict[job['start_time']]
  
          #Requested jobs
                           "%( start_time))
              if start_time in current_nodes_reserved_by_start_time:
  
 +                # JORDAN : if we request the same nodes: do nothing
                  if requested_nodes_by_start_time[start_time] == \
                      current_nodes_reserved_by_start_time[start_time]:
                      continue
                      job['hostname'],
                      sfa_slice, int(job['start_time']),
                      int(job['duration']))
 -                if job_id is not None:
 -                    new_leases = self.driver.GetLeases(login=
 -                        sfa_slice['login'])
 -                    for new_lease in new_leases:
 -                        leases.append(new_lease)
 +                # Removed by jordan
 +                #if job_id is not None:
 +                #    new_leases = self.driver.GetLeases(login=
 +                #        sfa_slice['login'])
 +                #    for new_lease in new_leases:
 +                #        leases.append(new_lease)
  
          #Deleted leases are the ones with lease id not declared in the Rspec
          if deleted_leases:
                           % (sfa_slice, deleted_leases))
  
          if reschedule_jobs_dict:
 +            logger.debug("JORDAN re-schedule jobs: %r" % (reschedule_jobs_dict,))
              for start_time in reschedule_jobs_dict:
                  job = reschedule_jobs_dict[start_time]
                  self.driver.AddLeases(
                      job['hostname'],
                      sfa_slice, int(job['start_time']),
                      int(job['duration']))
 -        return leases
 +
 +        # Added by Jordan: until we find a better solution, always update the list of leases
 +        return self.driver.GetLeases(login= sfa_slice['login'])
 +        #return leases
  
      def verify_slice_nodes(self, sfa_slice, requested_slivers, peer):
          """Check for wanted and unwanted nodes in the slice.
          """
  
          slicename = slice_hrn
 +        sfa_slice = None
 +
          # check if slice belongs to Iotlab
 -        slices_list = self.driver.GetSlices(slice_filter=slicename,
 -                                            slice_filter_type='slice_hrn')
 +        if slicename.startswith("iotlab"):
 +            slices_list = self.driver.GetSlices(slice_filter=slicename,
 +                                                slice_filter_type='slice_hrn')
  
 -        sfa_slice = None
  
 -        if slices_list:
 -            for sl in slices_list:
 +            if slices_list:
 +                for sl in slices_list:
  
 -                logger.debug("IOTLABSLICES \t verify_slice slicename %s \
 -                                slices_list %s sl %s \r slice_record %s"
 -                             % (slicename, slices_list, sl, slice_record))
 -                sfa_slice = sl
 -                sfa_slice.update(slice_record)
 +                    logger.debug("IOTLABSLICES \t verify_slice slicename %s \
 +                                    slices_list %s sl %s \r slice_record %s"
 +                                 % (slicename, slices_list, sl, slice_record))
 +                    sfa_slice = sl
 +                    sfa_slice.update(slice_record)
  
 +            else:
 +                #Search for user in ldap based on email SA 14/11/12
 +                ldap_user = self.driver.testbed_shell.ldap.LdapFindUser(\
 +                                                        slice_record['user'])
 +                logger.debug(" IOTLABSLICES \tverify_slice Oups \
 +                            slice_record %s sfa_peer %s ldap_user %s"
 +                            % (slice_record, sfa_peer, ldap_user))
 +                #User already registered in ldap, meaning user should be in SFA db
 +                #and hrn = sfa_auth+ uid
 +                sfa_slice = {'hrn': slicename,
 +                             'node_list': [],
 +                             'authority': slice_record['authority'],
 +                             'gid': slice_record['gid'],
 +                             'slice_id': slice_record['record_id'],
 +                             'urn': hrn_to_urn(slicename,'slice'),
 +                             'reg-researchers': slice_record['reg-researchers'],
 +                             #'peer_authority': str(sfa_peer)
 +                             }
 +
 +                if ldap_user:
 +                    hrn = self.driver.testbed_shell.root_auth + '.' \
 +                                                    + ldap_user['uid']
 +                    # Registry returns a user record from get_user_record 
 +                    user = self.driver.get_user_record(hrn)
 +
 +                    logger.debug(" IOTLABSLICES \tverify_slice hrn %s USER %s"
 +                                 % (hrn, user))
 +
 +                     # add the external slice to the local SFA iotlab DB
 +                    if sfa_slice:
 +                        self.driver.AddSlice(sfa_slice, user)
 +
 +                logger.debug("IOTLABSLICES \tverify_slice ADDSLICE OK")
          else:
 -            #Search for user in ldap based on email SA 14/11/12
 -            ldap_user = self.driver.testbed_shell.ldap.LdapFindUser(\
 -                                                    slice_record['user'])
 -            logger.debug(" IOTLABSLICES \tverify_slice Oups \
 -                        slice_record %s sfa_peer %s ldap_user %s"
 -                        % (slice_record, sfa_peer, ldap_user))
 -            #User already registered in ldap, meaning user should be in SFA db
 -            #and hrn = sfa_auth+ uid
              sfa_slice = {'hrn': slicename,
 -                         'node_list': [],
 -                         'authority': slice_record['authority'],
 -                         'gid': slice_record['gid'],
 -                         'slice_id': slice_record['record_id'],
 -                         #'reg-researchers': slice_record['reg-researchers'],
 -                         #'peer_authority': str(sfa_peer)
 -                         }
 -
 -            if ldap_user:
 -                hrn = self.driver.testbed_shell.root_auth + '.' \
 -                                                + ldap_user['uid']
 -                user = self.driver.get_user_record(hrn)
 -
 -                logger.debug(" IOTLABSLICES \tverify_slice hrn %s USER %s"
 -                             % (hrn, user))
 -
 -                 # add the external slice to the local SFA iotlab DB
 -                if sfa_slice:
 -                    self.driver.AddSlice(sfa_slice, user)
 -
 -            logger.debug("IOTLABSLICES \tverify_slice ADDSLICE OK")
 +             'node_list': [],
 +             'authority': slice_record['authority'],
 +             'gid': slice_record['gid'],
 +             'urn': hrn_to_urn(slicename,'slice'),
 +             #'slice_id': slice_record['record_id'],
 +             'reg-researchers': slice_record['reg-researchers'],
 +             #'peer_authority': str(sfa_peer)
 +            }
 +
 +
 +            # JORDAN
 +            logger.debug("JORDAN ADDSLICE")
 +            logger.debug("ADDSLICE user hrn = %s" % slice_record['user']['hrn'])
 +            # XXX LOIC !!! searching in IOTLAB DB because has been added in verify_persons
 +            user = self.driver.get_user_record(slice_record['user']['hrn'])
 +
 +            logger.debug("LOIC ADDSLICE Search in IOTLAB DB for user = %s" % user)
 +            # XXX LOIC !!! not searching in LDAP because this has been done in verify_persons
 +            #ldap_user = self.driver.testbed_shell.ldap.LdapFindUser(\
 +            #                                        slice_record['user'])
 +            #if ldap_user:
 +            #    hrn = self.driver.testbed_shell.root_auth + '.' \
 +            #                                    + ldap_user['uid']
 +            #    user = self.driver.get_user_record(hrn)
 +            #    logger.debug(" IOTLAB SLICES JORDAN user: %r %r " % (user, hrn))
 +
 +            #    logger.debug(" IOTLABSLICES \tverify_slice hrn %s USER %s"
 +            #                 % (hrn, user))
 +
 +            # add the external slice to the local SFA iotlab DB
 +            if sfa_slice:
 +                self.driver.AddSlice(sfa_slice, user)
 +                logger.debug("IOTLABSLICES \tverify_slice ADDSLICE OK")
 +
          return sfa_slice
  
  
-     def verify_persons(self, slice_hrn, slice_record, users, options={}):
+     def verify_persons(self, slice_hrn, slice_record, users, options=None):
          """Ensures the users in users list exist and are enabled in LDAP. Adds
          person if needed (AddPerson).
  
  
  
          """
+         if options is None: options={}
          logger.debug("IOTLABSLICES \tverify_persons \tslice_hrn  %s  \
                      \t slice_record %s\r\n users %s \t  "
                       % (slice_hrn, slice_record, users))
              logger.debug(" \r\n IOTLABSLICES.PY \tverify_person  filter_user %s\
                         existing_users %s  "
                          % (filter_user, existing_users))
 -            #User is in iotlab LDAP
 -            if existing_users:
 +            # User is in iotlab LDAP
 +            # XXX LOIC !!! user is existing in iotlab LDAP but coming from OneLab portal
 +            if existing_users and slice_hrn.startswith("iotlab"):
                  for user in existing_users:
                      user['login'] = user['uid']
                      users_dict[user['email']].update(user)
                      existing_user_emails.append(
                          users_dict[user['email']]['email'])
  
 -
              # User from another known trusted federated site. Check
              # if a iotlab account matching the email has already been created.
              else:
                  req = 'mail='
                  if isinstance(users, list):
                      req += users[0]['email']
 +                    user = users[0]
                  else:
                      req += users['email']
 +                    user = users
                  ldap_reslt = self.driver.testbed_shell.ldap.LdapSearch(req)
  
                  if ldap_reslt:
                      logger.debug(" IOTLABSLICES.PY \tverify_person users \
                                  USER already in Iotlab \t ldap_reslt %s \
                                  " % (ldap_reslt))
 -                    existing_users.append(ldap_reslt[1])
 -
 +                    
 +                    #existing_users.append(ldap_reslt[1])
 +                    # XXX LOIC !!! Not sure why we use to take the element 1
 +                    if len(ldap_reslt)>0:
 +                        ldap_reslt = ldap_reslt[0]
 +                        logger.debug(ldap_reslt)
 +                        if len(ldap_reslt)>1:
 +                            ldap_reslt = ldap_reslt[1]
 +                            logger.debug("LOIC - iotlabslices.py - ldap_reslt = %s" % (ldap_reslt))
 +                            existing_users.append(ldap_reslt)
 +                            existing_user_emails.append(ldap_reslt['mail'][0])
 +                    
 +                    # XXX LOIC !!! This login is required 
 +                    # sfa/iotlab/iotlabdriver.py", line 523, in AddLeases 
 +                    if 'uid' in ldap_reslt:
 +                        # meaning that the Person was found in LDAP
 +                        slice_record['login'] = ldap_reslt['uid'][0]
 +
 +                    # XXX LOIC !!! Add the user to IOTLAB DB Registry???
 +                    #if 'keys' in user:
 +                    #    user['pkey'] = user['keys'][0]
 +
 +                    #ret = self.driver.AddPerson(user,add_to_ldap=False)
 +                    #logger.debug("LOIC verify_persons AddPerson ret = %s" % ret)
                  else:
                      #User not existing in LDAP
                      logger.debug("IOTLABSLICES.PY \tverify_person users \
                                  not in ldap ...NEW ACCOUNT NEEDED %s \r\n \t \
                                  ldap_reslt %s " % (users, ldap_reslt))
 -
          requested_user_emails = users_by_email.keys()
          # requested_user_hrns = \
          #     [users_by_email[user]['hrn'] for user in users_by_email]
          #to remove/ add any user from/to a slice.
          #However a user from SFA which is not registered in Iotlab yet
          #should be added to the LDAP.
 +        logger.debug("LOIC - iotlabslice.py - requested_user_emails = %r" % requested_user_emails)
 +        logger.debug("LOIC - iotlabslice.py - existing_user_emails = %r" % existing_user_emails)
 +
          added_user_emails = set(requested_user_emails).\
                                          difference(set(existing_user_emails))
 -
 -
 +        logger.debug("LOIC - iotlabslice.py - added_user_emails = %r" % added_user_emails)
 +        logger.debug("LOIC - iotlabslice.py - existing_user_emails = %r" % existing_user_emails)
          #self.verify_keys(existing_slice_users, updated_users_list, \
                                                              #peer, append)
  
 +        # XXX JORDAN the uid of the user is put in slice_record['login']
 +
          added_persons = []
          # add new users
          #requested_user_email is in existing_user_emails
          if len(added_user_emails) == 0:
 -            slice_record['login'] = users_dict[requested_user_emails[0]]['uid']
 +#            slice_record['login'] = users_dict[requested_user_emails[0]]['uid']
              logger.debug(" IOTLABSLICES  \tverify_person QUICK DIRTY %s"
                           % (slice_record))
  
 +            # XXX JORDAN uid == 'register'
 +#            new_hrn = slice_record['user']['hrn']
 +#            new_user = self.driver.get_user_record(new_hrn)
 +#            if not new_user:
 +#                # XXX HERE WE SHOULD CREATE A SFA USER !!!!!!
 +#                added_user = users_dict[requested_user_emails[0]]
 +#                person = {}
 +#                person['peer_person_id'] = None
 +#                k_list = ['first_name', 'last_name', 'person_id']
 +#                for k in k_list:
 +#                    if k in added_user:
 +#                        person[k] = added_user[k]
 +#                # bug user without key
 +#                if added_user['keys']:
 +#                    person['pkey'] = added_user['keys'][0]
 +#                person['mail'] = added_user['email']
 +#                person['email'] = added_user['email']
 +#                person['key_ids'] = added_user.get('key_ids', [])
 +#                # LOIC !!! il faudrait transformer onelab.upmc.XXX en iotlab.XXX
 +#                if new_hrn.startswith("iotlab"):
 +#                    person['hrn'] = new_hrn                 
 +#                else:
 +#                    hrn_hierarchy = new_hrn.split(".")
 +#                    person['hrn'] = "iotlab." + hrn_hierarchy[-1]
 +#
 +#                ret = self.driver.AddPerson(person, add_to_ldap=False)
 +#                logger.debug("AddPerson return = %r type = %s" % (ret,type(ret)))
 +#                # LOIC !!! XXX Dans un cas ça retourne un dict du LDAP dans l'autre cas pas de LDAP donc ça ne retourne rien
 +#                if ret is None:
 +#                    person['uid'] = slice_record['login']
 +#                else:
 +#                    if 'uid' in ret:
 +#                        # meaning bool is True and the AddPerson was successful
 +#                        person['uid'] = ret['uid']
 +#                        slice_record['login'] = person['uid']
 +
 +        # XXX JORDAN i have no added_user_emails
          for added_user_email in added_user_emails:
              added_user = users_dict[added_user_email]
              logger.debug(" IOTLABSLICES \r\n \r\n  \t  verify_person \
          return added_persons
  
  
-     def verify_keys(self, persons, users, peer, options={}):
+     def verify_keys(self, persons, users, peer, options=None):
          """
          .. warning:: unused
          """
+         if options is None: options={}
          # existing keys
          key_ids = []
          for person in persons: