from sfa.iotlab.iotlabaggregate import IotLABAggregate
from sfa.iotlab.iotlablease import LeaseTable
+
class IotLabDriver(Driver):
"""
SFA driver for Iot-LAB testbed
""" 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")
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 = []
'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:
rspec = aggregate.list_resources(version=version, options=options)
return rspec
-
def describe(self, urns, version, options=None):
logger.warning("iotlabdriver describe")
if not options:
aggregate = IotLABAggregate(self)
return aggregate.describe(urns, version=version, options=options)
-
def status(self, urns, options=None):
logger.warning("iotlabdriver status")
aggregate = IotLABAggregate(self)
'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>
"""
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,
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 :
# 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
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,