Handle C-BAS hrn format with "\"
[sfa.git] / sfa / iotlab / iotlabdriver.py
index cc8f6e6..a820fc6 100644 (file)
@@ -10,6 +10,7 @@ from sfa.iotlab.iotlabshell import IotLABShell
 from sfa.iotlab.iotlabaggregate import IotLABAggregate
 from sfa.iotlab.iotlablease import LeaseTable
 
+
 class IotLabDriver(Driver):
     """
     SFA driver for Iot-LAB testbed
@@ -28,31 +29,26 @@ class IotLabDriver(Driver):
         """ Not used and need by SFA """
         pass
 
-    ########################################
-    ########## registry oriented
-    ########################################
+    # #######################################
+    # ######### registry oriented
+    # #######################################
 
     ##########
     def register(self, sfa_record, hrn, pub_key):
         logger.warning("iotlabdriver register : not implemented")
         return -1
 
-
-    ##########
     def update(self, old_sfa_record, new_sfa_record, hrn, new_key):
         logger.warning("iotlabdriver update : not implemented")
         return True
 
-
-    ##########
     def remove(self, sfa_record):
         logger.warning("iotlabdriver remove : not implemented")
         return True
 
-
-    ########################################
-    ########## aggregate oriented
-    ########################################
+    # #######################################
+    # ######### aggregate oriented
+    # #######################################
 
     def provision(self, urns, options=None):
         logger.warning("iotlabdriver provision : not implemented")
@@ -61,15 +57,12 @@ class IotLabDriver(Driver):
         rspec_version = version_manager.get_version(opt)
         return self.describe(urns, rspec_version, options=options)
 
-
     def delete(self, urns, options=None):
         logger.warning("iotlabdriver delete : not implemented")
         geni_slivers = []
         return geni_slivers
 
-
     def aggregate_version(self):
-        logger.warning("iotlabdriver aggregate_version")
         version_manager = VersionManager()
         ad_rspec_versions = []
         request_rspec_versions = []
@@ -83,7 +76,6 @@ class IotLabDriver(Driver):
             'geni_request_rspec_versions': request_rspec_versions,
             'geni_ad_rspec_versions': ad_rspec_versions}
 
-
     def list_resources(self, version=None, options=None):
         logger.warning("iotlabdriver list_resources")
         if not options:
@@ -92,7 +84,6 @@ class IotLabDriver(Driver):
         rspec = aggregate.list_resources(version=version, options=options)
         return rspec
 
-
     def describe(self, urns, version, options=None):
         logger.warning("iotlabdriver describe")
         if not options:
@@ -100,7 +91,6 @@ class IotLabDriver(Driver):
         aggregate = IotLABAggregate(self)
         return aggregate.describe(urns, version=version, options=options)
 
-
     def status(self, urns, options=None):
         logger.warning("iotlabdriver status")
         aggregate = IotLABAggregate(self)
@@ -109,33 +99,31 @@ class IotLabDriver(Driver):
                   'geni_slivers': desc['geni_slivers']}
         return status
 
-
-    def _get_users(self):
+    def _get_users(self, email=None):
         """ Get all users """
-        ret = self.shell.get_users()
+        ret = self.shell.get_users(email)
         if 'error' in ret:
             return None
         return ret
 
-
     def _get_user_login(self, caller_user):
         """ Get user login with email """
         email = caller_user['email']
         # ensure user exist in LDAP tree
-        users = self._get_users()
-        if users and not email in users:
+        users = self._get_users(email)
+        if email not in users:
             self.shell.add_user(caller_user)
-            users = self._get_users()
+            users = self._get_users(email)
         if users and email in users:
             return users[email]['login']
         else:
             return None
 
-
     @classmethod
     def _get_experiment(cls, rspec):
         """
-        Find in RSpec leases the experiment start time, duration and nodes list.
+        Find in RSpec leases the experiment start time, duration and nodes
+        list.
 
         :Example:
         <rspec>
@@ -155,20 +143,27 @@ class IotLabDriver(Driver):
         """
         leases = rspec.version.get_leases()
         start_time = min([int(lease['start_time'])
-                         for lease in leases])
-        end_time = max([int(lease['start_time']) +
-                       int(lease['duration'])
-                       for lease in leases])
+                          for lease in leases])
+        # ASAP jobs
+        if start_time == 0:
+            start_time = None
+            duration = max([int(lease['duration'])
+                            for lease in leases])
+        # schedule jobs
+        else:
+            end_time = max([int(lease['start_time']) +
+                            int(lease['duration']) * 60
+                            for lease in leases])
+            from math import floor
+            # minutes
+            duration = floor((end_time - start_time) / 60)
         nodes_list = [Xrn.unescape(Xrn(lease['component_id'].strip(),
-                      type='node').get_leaf())
+                                       type='node').get_leaf())
                       for lease in leases]
         # uniq hostnames
         nodes_list = list(set(nodes_list))
-        from math import floor
-        duration = floor((end_time - start_time)/60) # minutes
         return nodes_list, start_time, duration
 
-
     def _save_db_lease(self, job_id, slice_hrn):
         """ Save lease table row in SFA database """
         lease_row = LeaseTable(job_id,
@@ -178,7 +173,6 @@ class IotLabDriver(Driver):
         self.api.dbsession().add(lease_row)
         self.api.dbsession().commit()
 
-
     def allocate(self, urn, rspec_string, expiration, options=None):
         """
         Allocate method submit an experiment on Iot-LAB testbed with :
@@ -200,6 +194,7 @@ class IotLabDriver(Driver):
         # parse rspec
         rspec = RSpec(rspec_string)
 
+        logger.warning(options)
         caller_hrn = options.get('actual_caller_hrn', [])
         geni_users = options.get('geni_users', [])
         caller_user = [user for user in geni_users if
@@ -212,11 +207,12 @@ class IotLabDriver(Driver):
         if login:
             nodes_list, start_time, duration = \
                 self._get_experiment(rspec)
+            # [0-9A-Za-z_] with onelab.inria.test_iotlab
+            exp_name = '_'.join((xrn.hrn.replace('\\.','')).split('.'))
             logger.warning("iotlabdriver allocate submit OAR job :"
                            " %s %s %s %s" %
-                           (xrn.hrn, start_time, duration, nodes_list))
-            # [0-9A-Za-z_] with onelab.inria.test_iotlab
-            exp_name = '_'.join((xrn.hrn).split('.'))
+                           (exp_name, start_time, duration, nodes_list))
+
             # submit OAR job
             ret = self.shell.reserve_nodes(login,
                                            exp_name,