X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fiotlab%2Fiotlabdriver.py;h=a820fc697259dcd376dd68c6d93c902e1ff681f8;hb=HEAD;hp=5746fed27c9714471396154319ea2438ba84f623;hpb=dc78e3f893a576ed12c695682770a124f1462acc;p=sfa.git diff --git a/sfa/iotlab/iotlabdriver.py b/sfa/iotlab/iotlabdriver.py index 5746fed2..a820fc69 100644 --- a/sfa/iotlab/iotlabdriver.py +++ b/sfa/iotlab/iotlabdriver.py @@ -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: @@ -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'])*60 - 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,