X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fiotlab%2Fiotlabdriver.py;h=7fa49574b4cd34b6fe95b2c0dada30defed82078;hb=a18ad5b1dbc2a1dd346784105c89a0714086ebc4;hp=4f05e810a64bf4f890f308b938f098bd7e5fcf22;hpb=efa9ed860628dba98c63b7722f472d922fbe8a87;p=sfa.git diff --git a/sfa/iotlab/iotlabdriver.py b/sfa/iotlab/iotlabdriver.py index 4f05e810..7fa49574 100644 --- a/sfa/iotlab/iotlabdriver.py +++ b/sfa/iotlab/iotlabdriver.py @@ -1,31 +1,18 @@ +""" +Implements what a driver should provide for SFA to work. +""" from sfa.util.faults import SliverDoesNotExist, UnknownSfaType from sfa.util.sfalogging import logger from sfa.storage.alchemy import dbsession from sfa.storage.model import RegRecord - - from sfa.managers.driver import Driver from sfa.rspecs.version_manager import VersionManager from sfa.rspecs.rspec import RSpec from sfa.util.xrn import Xrn, hrn_to_urn, get_authority - -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py -from sfa.iotlab.iotlabpostgres import IotlabDB -======= -from sfa.senslab.slabpostgres import SlabDB - - -from sfa.senslab.slabaggregate import SlabAggregate, slab_xrn_to_hostname - -from sfa.senslab.slabslices import SlabSlices ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py - - from sfa.iotlab.iotlabaggregate import IotlabAggregate, iotlab_xrn_to_hostname - from sfa.iotlab.iotlabslices import IotlabSlices @@ -35,241 +22,189 @@ from sfa.iotlab.iotlabapi import IotlabTestbedAPI class IotlabDriver(Driver): """ Iotlab Driver class inherited from Driver generic class. -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py -======= -class SlabDriver(Driver): - """ Senslab Driver class inherited from Driver generic class. - ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py Contains methods compliant with the SFA standard and the testbed - infrastructure (calls to LDAP and OAR). + infrastructure (calls to LDAP and OAR). - ..seealso:: Driver class + .. seealso::: Driver class """ def __init__(self, config): """ -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py - Sets the iotlab SFA config parameters , - instanciates the testbed api and the iotlab database. + Sets the iotlab SFA config parameters, + instanciates the testbed api and the iotlab database. :param config: iotlab SFA configuration object -======= - Sets the senslab SFA config parameters , - instanciates the testbed api and the senslab database. - - :param config: senslab SFA configuration object ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py :type config: Config object + """ - Driver.__init__ (self, config) + Driver.__init__(self, config) self.config = config - - self.db = IotlabDB(config, debug = False) self.iotlab_api = IotlabTestbedAPI(config) self.cache = None - def augment_records_with_testbed_info (self, record_list ): + def augment_records_with_testbed_info(self, record_list): """ Adds specific testbed info to the records. :param record_list: list of sfa dictionaries records :type record_list: list - :return: list of records with extended information in each record + :returns: list of records with extended information in each record :rtype: list + """ - return self.fill_record_info (record_list) + return self.fill_record_info(record_list) def fill_record_info(self, record_list): """ -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py + For each SFA record, fill in the iotlab specific and SFA specific -======= - For each SFA record, fill in the senslab specific and SFA specific ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py - fields in the record. + fields in the record. :param record_list: list of sfa dictionaries records :type record_list: list - :return: list of records with extended information in each record + :returns: list of records with extended information in each record :rtype: list - .. warnings:: Should not be modifying record_list directly because modi - fication are kept outside the method's scope. Howerver, there is no - other way to do it given the way it's called in registry manager. + .. warning:: Should not be modifying record_list directly because modi + fication are kept outside the method's scope. Howerver, there is no + other way to do it given the way it's called in registry manager. + """ -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py - logger.debug("IOTLABDRIVER \tfill_record_info records %s " %(record_list)) -======= - logger.debug("SLABDRIVER \tfill_record_info records %s " %(record_list)) ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py + logger.debug("IOTLABDRIVER \tfill_record_info records %s " + % (record_list)) if not isinstance(record_list, list): record_list = [record_list] - try: for record in record_list: + + if str(record['type']) == 'node': + # look for node info using GetNodes + # the record is about one node only + filter_dict = {'hrn': [record['hrn']]} + node_info = self.iotlab_api.GetNodes(filter_dict) + # the node_info is about one node only, but it is formatted + # as a list + record.update(node_info[0]) + logger.debug("IOTLABDRIVER.PY \t \ + fill_record_info NODE" % (record)) + #If the record is a SFA slice record, then add information #about the user of this slice. This kind of -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py #information is in the Iotlab's DB. -======= - #information is in the Senslab's DB. ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py if str(record['type']) == 'slice': - if 'reg_researchers' in record and \ - isinstance(record['reg_researchers'], list) : + if 'reg_researchers' in record and isinstance(record + ['reg_researchers'], + list): record['reg_researchers'] = \ record['reg_researchers'][0].__dict__ - record.update({'PI':[record['reg_researchers']['hrn']], - 'researcher': [record['reg_researchers']['hrn']], - 'name':record['hrn'], - 'oar_job_id':[], - 'node_ids': [], - 'person_ids':[record['reg_researchers']['record_id']], - 'geni_urn':'', #For client_helper.py compatibility - 'keys':'', #For client_helper.py compatibility - 'key_ids':''}) #For client_helper.py compatibility - - -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py - #Get iotlab slice record and oar job id if any. - recslice_list = self.iotlab_api.GetSlices(slice_filter = \ -======= - #Get slab slice record and oar job id if any. - recslice_list = self.slab_api.GetSlices(slice_filter = \ ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py - str(record['hrn']),\ - slice_filter_type = 'slice_hrn') + record.update( + {'PI': [record['reg_researchers']['hrn']], + 'researcher': [record['reg_researchers']['hrn']], + 'name': record['hrn'], + 'oar_job_id': [], + 'node_ids': [], + 'person_ids': [record['reg_researchers'] + ['record_id']], + # For client_helper.py compatibility + 'geni_urn': '', + # For client_helper.py compatibility + 'keys': '', + # For client_helper.py compatibility + 'key_ids': ''}) + #Get iotlab slice record and oar job id if any. + recslice_list = self.iotlab_api.GetSlices( + slice_filter=str(record['hrn']), + slice_filter_type='slice_hrn') -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py logger.debug("IOTLABDRIVER \tfill_record_info \ -======= - logger.debug("SLABDRIVER \tfill_record_info \ ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py - TYPE SLICE RECUSER record['hrn'] %s ecord['oar_job_id']\ - %s " %(record['hrn'], record['oar_job_id'])) + TYPE SLICE RECUSER record['hrn'] %s record['oar_job_id']\ + %s " % (record['hrn'], record['oar_job_id'])) del record['reg_researchers'] try: for rec in recslice_list: -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py logger.debug("IOTLABDRIVER\r\n \t \ - fill_record_info oar_job_id %s " \ - %(rec['oar_job_id'])) - - record['node_ids'] = [ self.iotlab_api.root_auth + \ -======= - logger.debug("SLABDRIVER\r\n \t \ - fill_record_info oar_job_id %s " \ - %(rec['oar_job_id'])) - - record['node_ids'] = [ self.slab_api.root_auth + \ ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py - hostname for hostname in rec['node_ids']] + fill_record_info oar_job_id %s " + % (rec['oar_job_id'])) + + record['node_ids'] = [self.iotlab_api.root_auth + + '.' + hostname for hostname + in rec['node_ids']] except KeyError: pass - -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py - logger.debug( "IOTLABDRIVER.PY \t fill_record_info SLICE \ -======= - logger.debug( "SLABDRIVER.PY \t fill_record_info SLICE \ ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py + logger.debug("IOTLABDRIVER.PY \t fill_record_info SLICE \ recslice_list %s \r\n \t RECORD %s \r\n \ - \r\n" %(recslice_list, record)) + \r\n" % (recslice_list, record)) if str(record['type']) == 'user': #The record is a SFA user record. #Get the information about his slice from Iotlab's DB #and add it to the user record. - recslice_list = self.iotlab_api.GetSlices(\ - slice_filter = record['record_id'],\ - slice_filter_type = 'record_id_user') - -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py - logger.debug( "IOTLABDRIVER.PY \t fill_record_info TYPE USER \ -======= - logger.debug( "SLABDRIVER.PY \t fill_record_info TYPE USER \ ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py - recslice_list %s \r\n \t RECORD %s \r\n" \ - %(recslice_list , record)) + recslice_list = self.iotlab_api.GetSlices( + slice_filter=record['record_id'], + slice_filter_type='record_id_user') + + logger.debug("IOTLABDRIVER.PY \t fill_record_info \ + TYPE USER recslice_list %s \r\n \t RECORD %s \r\n" + % (recslice_list, record)) #Append slice record in records list, #therefore fetches user and slice info again(one more loop) #Will update PIs and researcher for the slice recuser = recslice_list[0]['reg_researchers'] -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py - logger.debug( "IOTLABDRIVER.PY \t fill_record_info USER \ -======= - logger.debug( "SLABDRIVER.PY \t fill_record_info USER \ ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py - recuser %s \r\n \r\n" %(recuser)) + logger.debug("IOTLABDRIVER.PY \t fill_record_info USER \ + recuser %s \r\n \r\n" % (recuser)) recslice = {} recslice = recslice_list[0] - recslice.update({'PI':[recuser['hrn']], - 'researcher': [recuser['hrn']], - 'name':record['hrn'], - 'node_ids': [], - 'oar_job_id': [], - 'person_ids':[recuser['record_id']]}) + recslice.update( + {'PI': [recuser['hrn']], + 'researcher': [recuser['hrn']], + 'name': record['hrn'], + 'node_ids': [], + 'oar_job_id': [], + 'person_ids': [recuser['record_id']]}) try: for rec in recslice_list: recslice['oar_job_id'].append(rec['oar_job_id']) except KeyError: pass - recslice.update({'type':'slice', \ - 'hrn':recslice_list[0]['hrn']}) - + recslice.update({'type': 'slice', + 'hrn': recslice_list[0]['hrn']}) #GetPersons takes [] as filters -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py user_iotlab = self.iotlab_api.GetPersons([record]) - record.update(user_iotlab[0]) -======= - user_slab = self.slab_api.GetPersons([record]) - - - record.update(user_slab[0]) ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py #For client_helper.py compatibility - record.update( { 'geni_urn':'', - 'keys':'', - 'key_ids':'' }) + record.update( + {'geni_urn': '', + 'keys': '', + 'key_ids': ''}) record_list.append(recslice) -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py - logger.debug("IOTLABDRIVER.PY \tfill_record_info ADDING SLICE\ -======= - logger.debug("SLABDRIVER.PY \tfill_record_info ADDING SLICE\ ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py - INFO TO USER records %s" %(record_list)) - + logger.debug("IOTLABDRIVER.PY \t \ + fill_record_info ADDING SLICE\ + INFO TO USER records %s" % (record_list)) except TypeError, error: - logger.log_exc("IOTLABDRIVER \t fill_record_info EXCEPTION %s"\ - %(error)) + logger.log_exc("IOTLABDRIVER \t fill_record_info EXCEPTION %s" + % (error)) return record_list - def sliver_status(self, slice_urn, slice_hrn): """ Receive a status request for slice named urn/hrn -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py - urn:publicid:IDN+iotlab+nturro_slice hrn iotlab.nturro_slice -======= - urn:publicid:IDN+senslab+nturro_slice hrn senslab.nturro_slice ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py - shall return a structure as described in - http://groups.geni.net/geni/wiki/GAPI_AM_API_V2#SliverStatus - NT : not sure if we should implement this or not, but used by sface. + urn:publicid:IDN+iotlab+nturro_slice hrn iotlab.nturro_slice + shall return a structure as described in + http://groups.geni.net/geni/wiki/GAPI_AM_API_V2#SliverStatus + NT : not sure if we should implement this or not, but used by sface. :param slice_urn: slice urn :type slice_urn: string @@ -278,60 +213,47 @@ class SlabDriver(Driver): """ - #First get the slice with the slice hrn - slice_list = self.iotlab_api.GetSlices(slice_filter = slice_hrn, \ - slice_filter_type = 'slice_hrn') + slice_list = self.iotlab_api.GetSlices(slice_filter=slice_hrn, + slice_filter_type='slice_hrn') - if len(slice_list) is 0: + if len(slice_list) == 0: raise SliverDoesNotExist("%s slice_hrn" % (slice_hrn)) #Used for fetching the user info witch comes along the slice info one_slice = slice_list[0] - #Make a list of all the nodes hostnames in use for this slice slice_nodes_list = [] - #for single_slice in slice_list: - #for node in single_slice['node_ids']: - #slice_nodes_list.append(node['hostname']) - #for node in one_slice: - #slice_nodes_list.append(node['hostname']) slice_nodes_list = one_slice['node_ids'] #Get all the corresponding nodes details -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py - nodes_all = self.iotlab_api.GetNodes({'hostname':slice_nodes_list}, -======= - nodes_all = self.slab_api.GetNodes({'hostname':slice_nodes_list}, ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py - ['node_id', 'hostname','site','boot_state']) - nodeall_byhostname = dict([(one_node['hostname'], one_node) \ - for one_node in nodes_all]) - - + nodes_all = self.iotlab_api.GetNodes( + {'hostname': slice_nodes_list}, + ['node_id', 'hostname', 'site', 'boot_state']) + nodeall_byhostname = dict([(one_node['hostname'], one_node) + for one_node in nodes_all]) for single_slice in slice_list: - #For compatibility top_level_status = 'empty' result = {} - result.fromkeys(\ - ['geni_urn','geni_error', 'pl_login','geni_status','geni_resources'], None) - result['pl_login'] = one_slice['reg_researchers'][0].hrn + result.fromkeys( + ['geni_urn', 'geni_error', 'iotlab_login', 'geni_status', + 'geni_resources'], None) + # result.fromkeys(\ + # ['geni_urn','geni_error', 'pl_login','geni_status', + # 'geni_resources'], None) + # result['pl_login'] = one_slice['reg_researchers'][0].hrn + result['iotlab_login'] = one_slice['user'] logger.debug("Slabdriver - sliver_status Sliver status \ - urn %s hrn %s single_slice %s \r\n " \ - %(slice_urn, slice_hrn, single_slice)) + urn %s hrn %s single_slice %s \r\n " + % (slice_urn, slice_hrn, single_slice)) if 'node_ids' not in single_slice: #No job in the slice result['geni_status'] = top_level_status result['geni_resources'] = [] return result -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py -======= - - top_level_status = 'ready' ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py top_level_status = 'ready' @@ -343,22 +265,18 @@ class SlabDriver(Driver): resources = [] for node_hostname in single_slice['node_ids']: res = {} -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py res['iotlab_hostname'] = node_hostname - res['iotlab_boot_state'] = nodeall_byhostname[node_hostname]['boot_state'] -======= - res['slab_hostname'] = node_hostname - res['slab_boot_state'] = nodeall_byhostname[node_hostname]['boot_state'] ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py + res['iotlab_boot_state'] = \ + nodeall_byhostname[node_hostname]['boot_state'] #res['pl_hostname'] = node['hostname'] #res['pl_boot_state'] = \ #nodeall_byhostname[node['hostname']]['boot_state'] #res['pl_last_contact'] = strftime(self.time_format, \ #gmtime(float(timestamp))) - sliver_id = Xrn(slice_urn, type='slice', \ - id=nodeall_byhostname[node_hostname]['node_id'], \ - authority=self.hrn).urn + sliver_id = Xrn( + slice_urn, type='slice', + id=nodeall_byhostname[node_hostname]['node_id']).urn res['geni_urn'] = sliver_id #node_name = node['hostname'] @@ -375,44 +293,43 @@ class SlabDriver(Driver): result['geni_status'] = top_level_status result['geni_resources'] = resources -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py - logger.debug("IOTLABDRIVER \tsliver_statusresources %s res %s "\ -======= - logger.debug("SLABDRIVER \tsliver_statusresources %s res %s "\ ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py - %(resources,res)) + logger.debug("IOTLABDRIVER \tsliver_statusresources %s res %s " + % (resources, res)) return result @staticmethod def get_user_record(hrn): """ + Returns the user record based on the hrn from the SFA DB . :param hrn: user's hrn :type hrn: string - :return : user record from SFA database + :returns: user record from SFA database :rtype: RegUser """ - return dbsession.query(RegRecord).filter_by(hrn = hrn).first() - + return dbsession.query(RegRecord).filter_by(hrn=hrn).first() - def testbed_name (self): + def testbed_name(self): """ - Returns testbed's name. + Returns testbed's name. + :returns: testbed authority name. :rtype: string + """ return self.hrn # 'geni_request_rspec_versions' and 'geni_ad_rspec_versions' are mandatory - def aggregate_version (self): + def aggregate_version(self): """ - Returns the testbed's supported rspec advertisement and - request versions. - + Returns the testbed's supported rspec advertisement and request + versions. + :returns: rspec versions supported ad a dictionary. :rtype: dict + """ version_manager = VersionManager() ad_rspec_versions = [] @@ -423,57 +340,43 @@ class SlabDriver(Driver): if rspec_version.content_type in ['*', 'request']: request_rspec_versions.append(rspec_version.to_dict()) return { - 'testbed':self.testbed_name(), + 'testbed': self.testbed_name(), 'geni_request_rspec_versions': request_rspec_versions, - 'geni_ad_rspec_versions': ad_rspec_versions, - } - - + 'geni_ad_rspec_versions': ad_rspec_versions} def _get_requested_leases_list(self, rspec): """ Process leases in rspec depending on the rspec version (format) - type. Find the lease requests in the rspec and creates - a lease request list with the mandatory information ( nodes, - start time and duration) of the valid leases (duration above or equal -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py - to the iotlab experiment minimum duration). -======= - to the senslab experiment minimum duration). ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py + type. Find the lease requests in the rspec and creates + a lease request list with the mandatory information ( nodes, + start time and duration) of the valid leases (duration above or + equal to the iotlab experiment minimum duration). :param rspec: rspec request received. :type rspec: RSpec - :return: list of lease requests found in the rspec + :returns: list of lease requests found in the rspec :rtype: list """ requested_lease_list = [] for lease in rspec.version.get_leases(): single_requested_lease = {} -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py - logger.debug("IOTLABDRIVER.PY \t_get_requested_leases_list lease %s " %(lease)) -======= - logger.debug("SLABDRIVER.PY \t_get_requested_leases_list lease %s " %(lease)) ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py + logger.debug("IOTLABDRIVER.PY \t \ + _get_requested_leases_list lease %s " % (lease)) if not lease.get('lease_id'): if get_authority(lease['component_id']) == \ - self.iotlab_api.root_auth: + self.iotlab_api.root_auth: single_requested_lease['hostname'] = \ - iotlab_xrn_to_hostname(\ - lease.get('component_id').strip()) + iotlab_xrn_to_hostname(\ + lease.get('component_id').strip()) single_requested_lease['start_time'] = \ - lease.get('start_time') + lease.get('start_time') single_requested_lease['duration'] = lease.get('duration') #Check the experiment's duration is valid before adding #the lease to the requested leases list duration_in_seconds = \ - int(single_requested_lease['duration']) -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py - if duration_in_seconds >= self.iotlab_api.GetMinExperimentDurationInSec() : -======= - if duration_in_seconds >= self.slab_api.GetMinExperimentDurationInSec() : ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py + int(single_requested_lease['duration']) + if duration_in_seconds >= self.iotlab_api.GetMinExperimentDurationInSec(): requested_lease_list.append(single_requested_lease) return requested_lease_list @@ -482,14 +385,15 @@ class SlabDriver(Driver): def _group_leases_by_start_time(requested_lease_list): """ Create dict of leases by start_time, regrouping nodes reserved - at the same time, for the same amount of time so as to - define one job on OAR. + at the same time, for the same amount of time so as to + define one job on OAR. :param requested_lease_list: list of leases :type requested_lease_list: list - :return: Dictionary with key = start time, value = list of leases - with the same start time. + :returns: Dictionary with key = start time, value = list of leases + with the same start time. :rtype: dictionary + """ requested_job_dict = {} @@ -503,12 +407,11 @@ class SlabDriver(Driver): if isinstance(lease['hostname'], str): lease['hostname'] = [lease['hostname']] - requested_job_dict[lease['start_time']] = lease - else : + else: job_lease = requested_job_dict[lease['start_time']] - if lease['duration'] == job_lease['duration'] : + if lease['duration'] == job_lease['duration']: job_lease['hostname'].append(lease['hostname']) return requested_job_dict @@ -516,33 +419,30 @@ class SlabDriver(Driver): def _process_requested_jobs(self, rspec): """ Turns the requested leases and information into a dictionary - of requested jobs, grouped by starting time. + of requested jobs, grouped by starting time. :param rspec: RSpec received :type rspec : RSpec :rtype: dictionary + """ requested_lease_list = self._get_requested_leases_list(rspec) - logger.debug("IOTLABDRIVER _process_requested_jobs requested_lease_list \ - %s"%(requested_lease_list)) - job_dict = self._group_leases_by_start_time(requested_lease_list) -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py + logger.debug("IOTLABDRIVER _process_requested_jobs \ + requested_lease_list %s" % (requested_lease_list)) + job_dict = self._group_leases_by_start_time(requested_lease_list) logger.debug("IOTLABDRIVER _process_requested_jobs job_dict\ -======= - logger.debug("SLABDRIVER _process_requested_jobs job_dict\ ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py - %s"%(job_dict)) + %s" % (job_dict)) return job_dict - def create_sliver (self, slice_urn, slice_hrn, creds, rspec_string, \ - users, options): - """ - Answer to CreateSliver. + def create_sliver(self, slice_urn, slice_hrn, creds, rspec_string, + users, options): + """Answer to CreateSliver. + Creates the leases and slivers for the users from the information - found in the rspec string. - Launch experiment on OAR if the requested leases is valid. Delete - no longer requested leases. + found in the rspec string. + Launch experiment on OAR if the requested leases is valid. Delete + no longer requested leases. :param creds: user's credentials @@ -552,21 +452,15 @@ class SlabDriver(Driver): :param options: :type options: - :return: a valid Rspec for the slice which has just been - modified. + :returns: a valid Rspec for the slice which has just been + modified. :rtype: RSpec """ -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py aggregate = IotlabAggregate(self) slices = IotlabSlices(self) -======= - aggregate = SlabAggregate(self) - - slices = SlabSlices(self) ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py peer = slices.get_peer(slice_hrn) sfa_peer = slices.get_sfa_peer(slice_hrn) slice_record = None @@ -576,50 +470,40 @@ class SlabDriver(Driver): if users: slice_record = users[0].get('slice_record', {}) -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py logger.debug("IOTLABDRIVER.PY \t ===============create_sliver \t\ -======= - logger.debug("SLABDRIVER.PY \t ===============create_sliver \t\ ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py - creds %s \r\n \r\n users %s" \ - %(creds, users)) - slice_record['user'] = {'keys':users[0]['keys'], \ - 'email':users[0]['email'], \ - 'hrn':slice_record['reg-researchers'][0]} + creds %s \r\n \r\n users %s" + % (creds, users)) + slice_record['user'] = {'keys': users[0]['keys'], + 'email': users[0]['email'], + 'hrn': slice_record['reg-researchers'][0]} # parse rspec rspec = RSpec(rspec_string) logger.debug("IOTLABDRIVER.PY \t create_sliver \trspec.version \ - %s slice_record %s users %s" \ - %(rspec.version,slice_record, users)) - + %s slice_record %s users %s" + % (rspec.version, slice_record, users)) # ensure site record exists? # ensure slice record exists - #Removed options to verify_slice SA 14/08/12 - sfa_slice = slices.verify_slice(slice_hrn, slice_record, peer, \ - sfa_peer) + #Removed options in verify_slice SA 14/08/12 + #Removed peer record in verify_slice SA 18/07/13 + sfa_slice = slices.verify_slice(slice_hrn, slice_record, sfa_peer) # ensure person records exists - #verify_persons returns added persons but since the return value + #verify_persons returns added persons but the return value #is not used - slices.verify_persons(slice_hrn, sfa_slice, users, peer, \ - sfa_peer, options=options) + #Removed peer record and sfa_peer in verify_persons SA 18/07/13 + slices.verify_persons(slice_hrn, sfa_slice, users, options=options) #requested_attributes returned by rspec.version.get_slice_attributes() #unused, removed SA 13/08/12 #rspec.version.get_slice_attributes() - logger.debug("IOTLABDRIVER.PY create_sliver slice %s " %(sfa_slice)) + logger.debug("IOTLABDRIVER.PY create_sliver slice %s " % (sfa_slice)) # add/remove slice from nodes -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py -======= - # add/remove slice from nodes - ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py #requested_slivers = [node.get('component_id') \ - #for node in rspec.version.get_nodes_with_slivers()\ - #if node.get('authority_id') is self.iotlab_api.root_auth] + #for node in rspec.version.get_nodes_with_slivers()\ + #if node.get('authority_id') is self.iotlab_api.root_auth] #l = [ node for node in rspec.version.get_nodes_with_slivers() ] #logger.debug("SLADRIVER \tcreate_sliver requested_slivers \ #requested_slivers %s listnodes %s" \ @@ -627,105 +511,86 @@ class SlabDriver(Driver): #verify_slice_nodes returns nodes, but unused here. Removed SA 13/08/12. #slices.verify_slice_nodes(sfa_slice, requested_slivers, peer) - requested_job_dict = self._process_requested_jobs(rspec) - -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py - logger.debug("IOTLABDRIVER.PY \tcreate_sliver requested_job_dict %s "\ -======= - logger.debug("SLABDRIVER.PY \tcreate_sliver requested_job_dict %s "\ ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py - %(requested_job_dict)) + logger.debug("IOTLABDRIVER.PY \tcreate_sliver requested_job_dict %s " + % (requested_job_dict)) #verify_slice_leases returns the leases , but the return value is unused #here. Removed SA 13/08/12 - slices.verify_slice_leases(sfa_slice, \ - requested_job_dict, peer) - - return aggregate.get_rspec(slice_xrn=slice_urn, \ - login=sfa_slice['login'], version=rspec.version) + slices.verify_slice_leases(sfa_slice, + requested_job_dict, peer) + return aggregate.get_rspec(slice_xrn=slice_urn, + login=sfa_slice['login'], + version=rspec.version) - def delete_sliver (self, slice_urn, slice_hrn, creds, options): + def delete_sliver(self, slice_urn, slice_hrn, creds, options): """ Deletes the lease associated with the slice hrn and the credentials -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py - if the slice belongs to iotlab. Answer to DeleteSliver. - - :return: 1 if the slice to delete was not found on iotlab, - True if the deletion was successful, False otherwise otherwise. + if the slice belongs to iotlab. Answer to DeleteSliver. - .. note:: Should really be named delete_leases because iotlab does -======= - if the slice belongs to senslab. Answer to DeleteSliver. + :param slice_urn: urn of the slice + :param slice_hrn: name of the slice + :param creds: slice credenials + :type slice_urn: string + :type slice_hrn: string + :type creds: ? unused - :return: 1 if the slice to delete was not found on senslab, - True if the deletion was successful, False otherwise otherwise. + :returns: 1 if the slice to delete was not found on iotlab, + True if the deletion was successful, False otherwise otherwise. - .. note:: Should really be named delete_leases because senslab does ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py - not have any slivers, but only deals with leases. However, SFA api only - have delete_sliver define so far. SA 13.05/2013 + .. note:: Should really be named delete_leases because iotlab does + not have any slivers, but only deals with leases. However, + SFA api only have delete_sliver define so far. SA 13/05/2013 + .. note:: creds are unused, and are not used either in the dummy driver + delete_sliver . """ -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py - sfa_slice_list = self.iotlab_api.GetSlices(slice_filter = slice_hrn, \ -======= - sfa_slice_list = self.slab_api.GetSlices(slice_filter = slice_hrn, \ ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py - slice_filter_type = 'slice_hrn') + sfa_slice_list = self.iotlab_api.GetSlices( + slice_filter=slice_hrn, + slice_filter_type='slice_hrn') if not sfa_slice_list: return 1 #Delete all leases in the slice for sfa_slice in sfa_slice_list: - - -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py - logger.debug("IOTLABDRIVER.PY delete_sliver slice %s" %(sfa_slice)) + logger.debug("IOTLABDRIVER.PY delete_sliver slice %s" % (sfa_slice)) slices = IotlabSlices(self) # determine if this is a peer slice -======= - logger.debug("SLABDRIVER.PY delete_sliver slice %s" %(sfa_slice)) - slices = SlabSlices(self) - # determine if this is a peer slice - - peer = slices.get_peer(slice_hrn) ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py peer = slices.get_peer(slice_hrn) logger.debug("IOTLABDRIVER.PY delete_sliver peer %s \ - \r\n \t sfa_slice %s " %(peer, sfa_slice)) + \r\n \t sfa_slice %s " % (peer, sfa_slice)) try: - -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py self.iotlab_api.DeleteSliceFromNodes(sfa_slice) -======= - self.slab_api.DeleteSliceFromNodes(sfa_slice) ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py return True - except : + except: return False - def list_resources (self, slice_urn, slice_hrn, creds, options): """ -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py + List resources from the iotlab aggregate and returns a Rspec -======= - List resources from the senslab aggregate and returns a Rspec ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py - advertisement with resources found when slice_urn and slice_hrn are None - (in case of resource discovery). - If a slice hrn and urn are provided, list experiment's slice - nodes in a rspec format. Answer to ListResources. - Caching unused. + advertisement with resources found when slice_urn and slice_hrn are + None (in case of resource discovery). + If a slice hrn and urn are provided, list experiment's slice + nodes in a rspec format. Answer to ListResources. + Caching unused. + + :param slice_urn: urn of the slice + :param slice_hrn: name of the slice + :param creds: slice credenials + :type slice_urn: string + :type slice_hrn: string + :type creds: ? unused :param options: options used when listing resources (list_leases, info, - geni_available) - :return: rspec string in xml + geni_available) + :returns: rspec string in xml :rtype: string + + .. note:: creds are unused """ #cached_requested = options.get('cached', True) @@ -733,13 +598,13 @@ class SlabDriver(Driver): version_manager = VersionManager() # get the rspec's return format from options rspec_version = \ - version_manager.get_version(options.get('geni_rspec_version')) + version_manager.get_version(options.get('geni_rspec_version')) version_string = "rspec_%s" % (rspec_version) #panos adding the info option to the caching key (can be improved) if options.get('info'): version_string = version_string + "_" + \ - options.get('info', 'default') + options.get('info', 'default') # Adding the list_leases option to the caching key if options.get('list_leases'): @@ -760,37 +625,30 @@ class SlabDriver(Driver): #return rspec #panos: passing user-defined options -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py aggregate = IotlabAggregate(self) -======= - aggregate = SlabAggregate(self) ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py - rspec = aggregate.get_rspec(slice_xrn=slice_urn, \ - version=rspec_version, options=options) + rspec = aggregate.get_rspec(slice_xrn=slice_urn, + version=rspec_version, options=options) # cache the result #if self.cache and not slice_hrn: - #logger.debug("Slab.ListResources: stores advertisement in cache") + #logger.debug("Iotlab.ListResources: stores advertisement in cache") #self.cache.add(version_string, rspec) return rspec - def list_slices (self, creds, options): - """ - Answer to ListSlices. -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py + def list_slices(self, creds, options): + """Answer to ListSlices. + List slices belonging to iotlab, returns slice urns list. -======= - List slices belonging to senslab, returns slice urns list. ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py - No caching used. Options unused but are defined in the SFA method - api prototype. + No caching used. Options unused but are defined in the SFA method + api prototype. - :return: slice urns list + :returns: slice urns list :rtype: list + .. note:: creds are unused """ # look in cache first #if self.cache: @@ -801,78 +659,77 @@ class SlabDriver(Driver): # get data from db -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py slices = self.iotlab_api.GetSlices() - logger.debug("IOTLABDRIVER.PY \tlist_slices hrn %s \r\n \r\n" %(slices)) + logger.debug("IOTLABDRIVER.PY \tlist_slices hrn %s \r\n \r\n" + % (slices)) slice_hrns = [iotlab_slice['hrn'] for iotlab_slice in slices] -======= - slices = self.slab_api.GetSlices() - logger.debug("SLABDRIVER.PY \tlist_slices hrn %s \r\n \r\n" %(slices)) - slice_hrns = [slab_slice['hrn'] for slab_slice in slices] ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py - slice_urns = [hrn_to_urn(slice_hrn, 'slice') \ - for slice_hrn in slice_hrns] + slice_urns = [hrn_to_urn(slice_hrn, 'slice') + for slice_hrn in slice_hrns] # cache the result #if self.cache: -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py #logger.debug ("IotlabDriver.list_slices stores value in cache") -======= - #logger.debug ("SlabDriver.list_slices stores value in cache") ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py #self.cache.add('slices', slice_urns) return slice_urns - def register (self, sfa_record, hrn, pub_key): + def register(self, sfa_record, hrn, pub_key): """ Adding new user, slice, node or site should not be handled - by SFA. + by SFA. ..warnings:: should not be used. Different components are in charge of - doing this task. Adding nodes = OAR - Adding users = LDAP Iotlab - Adding slice = Import from LDAP users - Adding site = OAR + doing this task. Adding nodes = OAR + Adding users = LDAP Iotlab + Adding slice = Import from LDAP users + Adding site = OAR :param sfa_record: record provided by the client of the - Register API call. + Register API call. :type sfa_record: dict + :param pub_key: public key of the user + :type pub_key: string + + .. note:: DOES NOTHING. Returns -1. + """ return -1 - def update (self, old_sfa_record, new_sfa_record, hrn, new_key): -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py - """No site or node record update allowed in Iotlab. -======= - """No site or node record update allowed in Senslab. ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py - The only modifications authorized here are key deletion/addition - on an existing user and password change. - On an existing user, CAN NOT BE MODIFIED: - 'first_name', 'last_name', 'email' - DOES NOT EXIST IN SENSLAB: - 'phone', 'url', 'bio','title', 'accepted_aup', - A slice is bound to its user, so modifying the user's ssh key should - modify the slice's GID after an import procedure. + def update(self, old_sfa_record, new_sfa_record, hrn, new_key): + """ + No site or node record update allowed in Iotlab. + The only modifications authorized here are key deletion/addition + on an existing user and password change. + On an existing user, CAN NOT BE MODIFIED: + 'first_name', 'last_name', 'email' + DOES NOT EXIST IN SENSLAB: + 'phone', 'url', 'bio','title', 'accepted_aup', + A slice is bound to its user, so modifying the user's ssh key should + modify the slice's GID after an import procedure. :param old_sfa_record: what is in the db for this hrn :param new_sfa_record: what was passed to the Update call + :param new_key: the new user's public key + :param hrn: the user's sfa hrn + :type old_sfa_record: dictionary + :type new_sfa_record: dictionary + :type pub_key: string + :type hrn: string - ..seealso:: update in driver.py. - """ + TODO: needs review + .. seealso::: update in driver.py. + """ pointer = old_sfa_record['pointer'] old_sfa_record_type = old_sfa_record['type'] # new_key implemented for users only - if new_key and old_sfa_record_type not in [ 'user' ]: + if new_key and old_sfa_record_type not in ['user']: raise UnknownSfaType(old_sfa_record_type) - if old_sfa_record_type == "user": update_fields = {} all_fields = new_sfa_record @@ -880,18 +737,13 @@ class SlabDriver(Driver): if key in ['key', 'password']: update_fields[key] = all_fields[key] - if new_key: # must check this key against the previous one if it exists persons = self.iotlab_api.GetPersons([old_sfa_record]) person = persons[0] keys = [person['pkey']] #Get all the person's keys -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py keys_dict = self.iotlab_api.GetKeys(keys) -======= - keys_dict = self.slab_api.GetKeys(keys) ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py # Delete all stale keys, meaning the user has only one key #at a time @@ -905,27 +757,26 @@ class SlabDriver(Driver): #remove all the other keys for key in keys_dict: self.iotlab_api.DeleteKey(person, key) - self.iotlab_api.AddPersonKey(person, \ - {'sshPublicKey': person['pkey']},{'sshPublicKey': new_key} ) - #self.iotlab_api.AddPersonKey(person, {'key_type': 'ssh', \ - #'key': new_key}) + self.iotlab_api.AddPersonKey( + person, {'sshPublicKey': person['pkey']}, + {'sshPublicKey': new_key}) return True - - def remove (self, sfa_record): + def remove(self, sfa_record): """ - Removes users only. Mark the user as disabled in - LDAP. The user and his slice are then deleted from the db by running an - import on the registry. - + Removes users only. Mark the user as disabled in + LDAP. The user and his slice are then deleted from the + db by running an import on the registry. :param sfa_record: record is the existing sfa record in the db :type sfa_record: dict ..warning::As fas as the slice is concerned, here only the leases are - removed from the slice. The slice is record itself is not removed from - the db. + removed from the slice. The slice is record itself is not removed + from the db. + TODO: needs review + TODO : REMOVE SLICE FROM THE DB AS WELL? SA 14/05/2013, TODO: return boolean for the slice part @@ -934,29 +785,17 @@ class SlabDriver(Driver): hrn = sfa_record['hrn'] if sfa_record_type == 'user': -<<<<<<< HEAD:sfa/iotlab/iotlabdriver.py #get user from iotlab ldap person = self.iotlab_api.GetPersons(sfa_record) #No registering at a given site in Iotlab. #Once registered to the LDAP, all iotlab sites are -======= - #get user from senslab ldap - person = self.slab_api.GetPersons(sfa_record) - #No registering at a given site in Senslab. - #Once registered to the LDAP, all senslab sites are ->>>>>>> 3fe7429... SA:sfa/senslab/slabdriver.py #accesible. - if person : + if person: #Mark account as disabled in ldap return self.iotlab_api.DeletePerson(sfa_record) elif sfa_record_type == 'slice': - if self.iotlab_api.GetSlices(slice_filter = hrn, \ - slice_filter_type = 'slice_hrn'): + if self.iotlab_api.GetSlices(slice_filter=hrn, + slice_filter_type='slice_hrn'): ret = self.iotlab_api.DeleteSlice(sfa_record) - - - return True - -