From b0995f45712c5ea9dd26fdf0c4347ccba2d77fce Mon Sep 17 00:00:00 2001 From: Sandrine Avakian Date: Mon, 1 Jul 2013 17:39:46 +0200 Subject: [PATCH] Renaming Senslab into Iotlab. --- sfa/generic/{slab.py => iotlab.py} | 31 +- .../{slabimporter.py => iotlabimporter.py} | 124 +++--- sfa/{senslab => iotlab}/LDAPapi.py | 24 +- sfa/{senslab => iotlab}/OARrestapi.py | 338 ++++++++-------- sfa/{senslab => iotlab}/__init__.py | 0 .../iotlabaggregate.py} | 78 ++-- .../slabapi.py => iotlab/iotlabapi.py} | 260 ++++++------- .../slabdriver.py => iotlab/iotlabdriver.py} | 158 ++++---- .../iotlabpostgres.py} | 126 +++--- .../slabslices.py => iotlab/iotlabslices.py} | 363 +++++++++--------- .../{slabv1Lease.py => iotlabv1Lease.py} | 10 +- .../{slabv1Node.py => iotlabv1Node.py} | 140 ++++--- .../{slabv1Sliver.py => iotlabv1Sliver.py} | 28 +- .../versions/{slabv1.py => iotlabv1.py} | 110 +++--- testbeds/senslab/tests/TestSuite.py | 296 +++++++------- testbeds/senslab/tests/bash_testsuite | 6 +- 16 files changed, 1053 insertions(+), 1039 deletions(-) rename sfa/generic/{slab.py => iotlab.py} (65%) rename sfa/importer/{slabimporter.py => iotlabimporter.py} (81%) rename sfa/{senslab => iotlab}/LDAPapi.py (98%) rename sfa/{senslab => iotlab}/OARrestapi.py (85%) rename sfa/{senslab => iotlab}/__init__.py (100%) rename sfa/{senslab/slabaggregate.py => iotlab/iotlabaggregate.py} (85%) rename sfa/{senslab/slabapi.py => iotlab/iotlabapi.py} (85%) rename sfa/{senslab/slabdriver.py => iotlab/iotlabdriver.py} (82%) rename sfa/{senslab/slabpostgres.py => iotlab/iotlabpostgres.py} (69%) rename sfa/{senslab/slabslices.py => iotlab/iotlabslices.py} (74%) rename sfa/rspecs/elements/versions/{slabv1Lease.py => iotlabv1Lease.py} (94%) rename sfa/rspecs/elements/versions/{slabv1Node.py => iotlabv1Node.py} (75%) rename sfa/rspecs/elements/versions/{slabv1Sliver.py => iotlabv1Sliver.py} (77%) rename sfa/rspecs/versions/{slabv1.py => iotlabv1.py} (85%) diff --git a/sfa/generic/slab.py b/sfa/generic/iotlab.py similarity index 65% rename from sfa/generic/slab.py rename to sfa/generic/iotlab.py index e4a474be..7ca346be 100644 --- a/sfa/generic/slab.py +++ b/sfa/generic/iotlab.py @@ -4,41 +4,44 @@ import sfa.server.sfaapi -class slab (Generic): - +class iotlab (Generic): + # use the standard api class def api_class (self): return sfa.server.sfaapi.SfaApi - + # the importer class - def importer_class (self): - import sfa.importer.slabimporter - return sfa.importer.slabimporter.SlabImporter - + def importer_class (self): + import sfa.importer.iotlabimporter + return sfa.importer.iotlabimporter.IotlabImporter + # the manager classes for the server-side services def registry_manager_class (self) : - import sfa.managers.registry_manager + import sfa.managers.registry_manager return sfa.managers.registry_manager.RegistryManager - + def slicemgr_manager_class (self) : - import sfa.managers.slice_manager + import sfa.managers.slice_manager return sfa.managers.slice_manager.SliceManager - + def aggregate_manager_class (self) : import sfa.managers.aggregate_manager return sfa.managers.aggregate_manager.AggregateManager # driver class for server-side services, talk to the whole testbed def driver_class (self): +<<<<<<< HEAD:sfa/generic/slab.py import sfa.managers.v2_to_v3_adapter return sfa.managers.v2_to_v3_adapter.V2ToV3Adapter +======= + import sfa.iotlab.iotlabdriver + return sfa.iotlab.iotlabdriver.IotlabDriver +>>>>>>> 7cb1e78... Renaming Senslab into Iotlab.:sfa/generic/iotlab.py - # slab does not have a component manager yet + # iotlab does not have a component manager yet # manager class def component_manager_class (self): return None # driver_class def component_driver_class (self): return None - - diff --git a/sfa/importer/slabimporter.py b/sfa/importer/iotlabimporter.py similarity index 81% rename from sfa/importer/slabimporter.py rename to sfa/importer/iotlabimporter.py index fdf1ba1f..f97cd3ac 100644 --- a/sfa/importer/slabimporter.py +++ b/sfa/importer/iotlabimporter.py @@ -1,7 +1,7 @@ from sfa.util.config import Config from sfa.util.xrn import Xrn, get_authority, hrn_to_urn -from sfa.senslab.slabdriver import SlabDriver +from sfa.iotlab.iotlabdriver import IotlabDriver from sfa.trust.certificate import Keypair, convert_public_key from sfa.trust.gid import create_uuid @@ -15,10 +15,10 @@ from sqlalchemy.exc import SQLAlchemyError -class SlabImporter: +class IotlabImporter: """ - SlabImporter class, generic importer_class. Used to populate the SFA DB - with senslab resources' records. + IotlabImporter class, generic importer_class. Used to populate the SFA DB + with iotlab resources' records. Used to update records when new resources, users or nodes, are added or deleted. """ @@ -139,12 +139,12 @@ class SlabImporter: """ rec_tuple = (record.type, record.hrn) if rec_tuple in self.records_by_type_hrn: - self.logger.warning ("SlabImporter.update_just_added_records_dict:\ + self.logger.warning ("IotlabImporter.update_just_added_records_dict:\ duplicate (%s,%s)"%rec_tuple) return self.records_by_type_hrn [ rec_tuple ] = record - def import_sites_and_nodes(self, slabdriver): + def import_sites_and_nodes(self, iotlabdriver): """ Gets all the sites and nodes from OAR, process the information, @@ -152,13 +152,13 @@ class SlabImporter: For each site, import the site's nodes to the DB by calling import_nodes. - :param slabdriver: SlabDriver object, used to have access to slabdriver + :param iotlabdriver: IotlabDriver object, used to have access to iotlabdriver methods and fetching info on sites and nodes. - :type slabdriver: SlabDriver + :type iotlabdriver: IotlabDriver """ - sites_listdict = slabdriver.slab_api.GetSites() - nodes_listdict = slabdriver.slab_api.GetNodes() + sites_listdict = iotlabdriver.iotlab_api.GetSites() + nodes_listdict = iotlabdriver.iotlab_api.GetNodes() nodes_by_id = dict([(node['node_id'], node) for node in nodes_listdict]) for site in sites_listdict: site_hrn = site['name'] @@ -177,14 +177,14 @@ class SlabImporter: site_record.just_created() dbsession.add(site_record) dbsession.commit() - self.logger.info("SlabImporter: imported authority (site) \ + self.logger.info("IotlabImporter: imported authority (site) \ %s" % site_record) self.update_just_added_records_dict(site_record) except SQLAlchemyError: # if the site import fails then there is no point in # trying to import the # site's child records(node, slices, persons), so skip them. - self.logger.log_exc("SlabImporter: failed to import site. \ + self.logger.log_exc("IotlabImporter: failed to import site. \ Skipping child records") continue else: @@ -193,11 +193,11 @@ class SlabImporter: site_record.stale = False - self.import_nodes(site['node_ids'], nodes_by_id, slabdriver) + self.import_nodes(site['node_ids'], nodes_by_id, iotlabdriver) return - def import_nodes(self, site_node_ids, nodes_by_id, slabdriver): + def import_nodes(self, site_node_ids, nodes_by_id, iotlabdriver): """ Creates appropriate hostnames and RegNode records for @@ -210,9 +210,9 @@ class SlabImporter: :param nodes_by_id: dictionary , key is the node id, value is the a dict with node information. :type nodes_by_id: dictionary - :param slabdriver:SlabDriver object, used to have access to slabdriver + :param iotlabdriver:IotlabDriver object, used to have access to iotlabdriver attributes. - :type slabdriver:SlabDriver + :type iotlabdriver:IotlabDriver """ @@ -220,13 +220,13 @@ class SlabImporter: try: node = nodes_by_id[node_id] except KeyError: - self.logger.warning ("SlabImporter: cannot find node_id %s \ + self.logger.warning ("IotlabImporter: cannot find node_id %s \ - ignored" %(node_id)) continue escaped_hrn = \ - self.hostname_to_hrn_escaped(slabdriver.slab_api.root_auth, \ + self.hostname_to_hrn_escaped(iotlabdriver.iotlab_api.root_auth, \ node['hostname']) - self.logger.info("SLABIMPORTER node %s " %(node)) + self.logger.info("IOTLABIMPORTER node %s " %(node)) hrn = node['hrn'] @@ -241,22 +241,22 @@ class SlabImporter: self.auth_hierarchy.create_gid(urn, \ create_uuid(), pkey) - def slab_get_authority(hrn): + def iotlab_get_authority(hrn): return hrn.split(".")[0] node_record = RegNode(hrn=hrn, gid=node_gid, pointer = '-1', - authority=slab_get_authority(hrn)) + authority=iotlab_get_authority(hrn)) try: node_record.just_created() dbsession.add(node_record) dbsession.commit() - self.logger.info("SlabImporter: imported node: %s" \ + self.logger.info("IotlabImporter: imported node: %s" \ % node_record) self.update_just_added_records_dict(node_record) except SQLAlchemyError: - self.logger.log_exc("SlabImporter: \ + self.logger.log_exc("IotlabImporter: \ failed to import node") else: #TODO: xxx update the record ... @@ -264,28 +264,28 @@ class SlabImporter: node_record.stale = False - def init_person_key (self, person, slab_key): + def init_person_key (self, person, iotlab_key): """ Returns a tuple pubkey and pkey. :param person Person's data. :type person: dict - :param slab_key: SSH public key, from LDAP user's data. + :param iotlab_key: SSH public key, from LDAP user's data. RSA type supported. - :type slab_key: string + :type iotlab_key: string :rtype (string, Keypair) """ pubkey = None if person['pkey']: # randomly pick first key in set - pubkey = slab_key + pubkey = iotlab_key try: pkey = convert_public_key(pubkey) except TypeError: #key not good. create another pkey - self.logger.warn('SlabImporter: \ + self.logger.warn('IotlabImporter: \ unable to convert public \ key for %s' %person['hrn']) pkey = Keypair(create=True) @@ -293,13 +293,13 @@ class SlabImporter: else: # the user has no keys. #Creating a random keypair for the user's gid - self.logger.warn("SlabImporter: person %s does not have a \ + self.logger.warn("IotlabImporter: person %s does not have a \ public key" %(person['hrn'])) pkey = Keypair(create=True) return (pubkey, pkey) - def import_persons_and_slices(self, slabdriver): + def import_persons_and_slices(self, iotlabdriver): """ Gets user data from LDAP, process the information. @@ -310,18 +310,18 @@ class SlabImporter: import the user's slice onto the database as well by calling import_slice. - :param slabdriver:SlabDriver object, used to have access to slabdriver + :param iotlabdriver:IotlabDriver object, used to have access to iotlabdriver attributes. - :type slabdriver:SlabDriver + :type iotlabdriver:IotlabDriver """ - ldap_person_listdict = slabdriver.slab_api.GetPersons() - self.logger.info("SLABIMPORT \t ldap_person_listdict %s \r\n" \ + ldap_person_listdict = iotlabdriver.iotlab_api.GetPersons() + self.logger.info("IOTLABIMPORT \t ldap_person_listdict %s \r\n" \ %(ldap_person_listdict)) # import persons for person in ldap_person_listdict : - self.logger.info("SlabImporter: person :" %(person)) + self.logger.info("IotlabImporter: person :" %(person)) if 'ssh-rsa' not in person['pkey']: #people with invalid ssh key (ssh-dss, empty, bullshit keys...) #won't be imported @@ -335,13 +335,13 @@ class SlabImporter: person_urn = hrn_to_urn(person_hrn, 'user') - self.logger.info("SlabImporter: users_rec_by_email %s " \ + self.logger.info("IotlabImporter: users_rec_by_email %s " \ %(self.users_rec_by_email)) #Check if user using person['email'] from LDAP is already registered #in SFA. One email = one person. In this case, do not create another #record for this person - #person_hrn returned by GetPerson based on senslab root auth + + #person_hrn returned by GetPerson based on iotlab root auth + #uid ldap user_record = self.find_record_by_type_hrn('user', person_hrn) @@ -353,10 +353,10 @@ class SlabImporter: slice_record = self.find_record_by_type_hrn ('slice', slice_hrn) - slab_key = person['pkey'] + iotlab_key = person['pkey'] # new person if not user_record: - (pubkey, pkey) = self.init_person_key(person, slab_key) + (pubkey, pkey) = self.init_person_key(person, iotlab_key) if pubkey is not None and pkey is not None : person_gid = \ self.auth_hierarchy.create_gid(person_urn, \ @@ -386,12 +386,12 @@ class SlabImporter: user_record.just_created() dbsession.add (user_record) dbsession.commit() - self.logger.info("SlabImporter: imported person %s"\ + self.logger.info("IotlabImporter: imported person %s"\ %(user_record)) self.update_just_added_records_dict( user_record ) except SQLAlchemyError: - self.logger.log_exc("SlabImporter: \ + self.logger.log_exc("IotlabImporter: \ failed to import person %s"%(person)) else: # update the record ? @@ -400,12 +400,12 @@ class SlabImporter: sfa_keys = user_record.reg_keys new_key = False - if slab_key is not sfa_keys : + if iotlab_key is not sfa_keys : new_key = True if new_key: - self.logger.info("SlabImporter: \t \t USER UPDATE \ + self.logger.info("IotlabImporter: \t \t USER UPDATE \ person: %s" %(person['hrn'])) - (pubkey, pkey) = self.init_person_key (person, slab_key) + (pubkey, pkey) = self.init_person_key (person, iotlab_key) person_gid = \ self.auth_hierarchy.create_gid(person_urn, \ create_uuid(), pkey) @@ -413,7 +413,7 @@ class SlabImporter: user_record.reg_keys = [] else: user_record.reg_keys = [RegKey(pubkey)] - self.logger.info("SlabImporter: updated person: %s" \ + self.logger.info("IotlabImporter: updated person: %s" \ % (user_record)) if person['email']: @@ -423,7 +423,7 @@ class SlabImporter: dbsession.commit() user_record.stale = False except SQLAlchemyError: - self.logger.log_exc("SlabImporter: \ + self.logger.log_exc("IotlabImporter: \ failed to update person %s"%(person)) self.import_slice(slice_hrn, slice_record, user_record) @@ -465,9 +465,9 @@ class SlabImporter: self.update_just_added_records_dict ( slice_record ) except SQLAlchemyError: - self.logger.log_exc("SlabImporter: failed to import slice") + self.logger.log_exc("IotlabImporter: failed to import slice") - #No slice update upon import in senslab + #No slice update upon import in iotlab else: # xxx update the record ... self.logger.warning ("Slice update not yet implemented") @@ -480,12 +480,12 @@ class SlabImporter: dbsession.commit() slice_record.stale = False except SQLAlchemyError: - self.logger.log_exc("SlabImporter: failed to update slice") + self.logger.log_exc("IotlabImporter: failed to update slice") def run (self, options): """ - Create the special senslab table, slab_xp, in the senslab database. + Create the special iotlab table, iotlab_xp, in the iotlab database. Import everything (users, slices, nodes and sites from OAR and LDAP) into the SFA database. Delete stale records that are no longer in OAR or LDAP. @@ -494,24 +494,24 @@ class SlabImporter: """ config = Config() - slabdriver = SlabDriver(config) + iotlabdriver = IotlabDriver(config) - #Create special slice table for senslab + #Create special slice table for iotlab - if not slabdriver.db.exists('slab_xp'): - slabdriver.db.createtable() - self.logger.info ("SlabImporter.run: slab_xp table created ") + if not iotlabdriver.db.exists('iotlab_xp'): + iotlabdriver.db.createtable() + self.logger.info ("IotlabImporter.run: iotlab_xp table created ") # import site and node records in site into the SFA db. - self.import_sites_and_nodes(slabdriver) + self.import_sites_and_nodes(iotlabdriver) #import users and slice into the SFA DB. - self.import_persons_and_slices(slabdriver) + self.import_persons_and_slices(iotlabdriver) ### remove stale records # special records must be preserved - system_hrns = [slabdriver.hrn, slabdriver.slab_api.root_auth, \ - slabdriver.hrn+ '.slicemanager'] + system_hrns = [iotlabdriver.hrn, iotlabdriver.iotlab_api.root_auth, \ + iotlabdriver.hrn+ '.slicemanager'] for record in self.all_records: if record.hrn in system_hrns: record.stale = False @@ -521,7 +521,7 @@ class SlabImporter: for record in self.all_records: if record.type == 'user': - self.logger.info("SlabImporter: stale records: hrn %s %s" \ + self.logger.info("IotlabImporter: stale records: hrn %s %s" \ %(record.hrn,record.stale) ) try: stale = record.stale @@ -529,14 +529,14 @@ class SlabImporter: stale = True self.logger.warning("stale not found with %s"%record) if stale: - self.logger.info("SlabImporter: deleting stale record: %s" \ + self.logger.info("IotlabImporter: deleting stale record: %s" \ %(record)) try: dbsession.delete(record) dbsession.commit() except SQLAlchemyError: - self.logger.log_exc("SlabImporter: failed to delete stale \ + self.logger.log_exc("IotlabImporter: failed to delete stale \ record %s" %(record) ) diff --git a/sfa/senslab/LDAPapi.py b/sfa/iotlab/LDAPapi.py similarity index 98% rename from sfa/senslab/LDAPapi.py rename to sfa/iotlab/LDAPapi.py index aa99dab6..fda3515e 100644 --- a/sfa/senslab/LDAPapi.py +++ b/sfa/iotlab/LDAPapi.py @@ -30,7 +30,7 @@ class ldap_co: """ Set admin login and server configuration variables.""" def __init__(self): - #Senslab PROD LDAP parameters + #Iotlab PROD LDAP parameters self.ldapserv = None ldap_config = LdapConfig() self.config = ldap_config @@ -278,7 +278,7 @@ class LoginPassword(): :return: Returns encrypted password. :rtype:string """ - #Keep consistency with Java Senslab's LDAP API + #Keep consistency with Java Iotlab's LDAP API #RFC2307SSHAPasswordEncryptor so set the salt size to 8 bytes return lssha.encrypt(password, salt_size = 8) @@ -423,8 +423,8 @@ class LDAPapi : #Hrn should not be part of the filter because the hrn #presented by a certificate of a SFA user not imported in - #Senslab does not include the senslab login in it - #Plus, the SFA user may already have an account with senslab + #Iotlab does not include the iotlab login in it + #Plus, the SFA user may already have an account with iotlab #using another login. @@ -445,7 +445,7 @@ class LDAPapi : return req_ldap def make_ldap_attributes_from_record(self, record): - """When adding a new user to Senslab's LDAP, creates an attributes + """When adding a new user to Iotlab's LDAP, creates an attributes dictionnary from the SFA record understandable by LDAP. Generates the user's LDAP login. User is automatically validated (account enabled) and described @@ -494,10 +494,10 @@ class LDAPapi : #Password is automatically generated because SFA user don't go - #through the Senslab website used to register new users, + #through the Iotlab website used to register new users, #There is no place in SFA where users can enter such information #yet. - #If the user wants to set his own password , he must go to the Senslab + #If the user wants to set his own password , he must go to the Iotlab #website. password = self.login_pwd.generate_password() attrs['userPassword'] = self.login_pwd.encrypt_password(password) @@ -506,7 +506,7 @@ class LDAPapi : #Set to 0 to disable the account, -1 to enable it, attrs['shadowExpire'] = '-1' - #Motivation field in Senslab + #Motivation field in Iotlab attrs['description'] = 'SFA USER FROM OUTSIDE SENSLAB' attrs['ou'] = 'SFA' #Optional: organizational unit @@ -869,9 +869,9 @@ class LDAPapi : parent_hrn = get_authority(hrn) if parent_hrn != self.authname: peer_authority = parent_hrn - #In case the user was not imported from Senslab LDAP + #In case the user was not imported from Iotlab LDAP #but from another federated site, has an account in - #senslab but currently using his hrn from federated site + #iotlab but currently using his hrn from federated site #then the login is different from the one found in its hrn if tmpname != hrn.split('.')[1]: hrn = None @@ -903,12 +903,12 @@ class LDAPapi : expected_fields=None): """ Search a SFA user with a hrn. User should be already registered - in Senslab LDAP. + in Iotlab LDAP. :param record: sfa user's record. Should contain first_name,last_name, email or mail. If no record is provided, returns all the users found in LDAP. :type record: dict - :param is_user_enabled: is the user's senslab account already valid. + :param is_user_enabled: is the user's iotlab account already valid. :type is_user_enabled: Boolean. :return: LDAP entries from ldap matching the filter provided. Returns a single entry if one filter has been given and a list of diff --git a/sfa/senslab/OARrestapi.py b/sfa/iotlab/OARrestapi.py similarity index 85% rename from sfa/senslab/OARrestapi.py rename to sfa/iotlab/OARrestapi.py index bae1bff6..0223f472 100644 --- a/sfa/senslab/OARrestapi.py +++ b/sfa/iotlab/OARrestapi.py @@ -2,7 +2,7 @@ from httplib import HTTPConnection, HTTPException, NotConnected import json #import datetime -#from time import gmtime, strftime +#from time import gmtime, strftime import os.path import sys #import urllib @@ -22,7 +22,7 @@ POST_FORMAT = {'json' : {'content':"application/json", 'object':json},} #OARpostdatareqfields = {'resource' :"/nodes=", 'command':"sleep", \ #'workdir':"/home/", 'walltime':""} - + class JsonPage: """Class used to manipulate jsopn pages given by OAR.""" @@ -32,7 +32,7 @@ class JsonPage: #Indicates end of data, no more pages to be loaded. self.end = False self.next_page = False - #Next query address + #Next query address self.next_offset = None #Json page self.raw_json = None @@ -51,15 +51,15 @@ class JsonPage: self.next_page = True self.next_offset = "?" + page['href'].split("?")[1] print>>sys.stderr, "\r\n \t FindNextPage NEXT LINK" - return - + return + if self.concatenate : self.end = True self.next_page = False - self.next_offset = None + self.next_offset = None + + return - return - #Otherwise, no next page and no concatenate, must be a single page #Concatenate the single page and get out of here. else: @@ -67,41 +67,41 @@ class JsonPage: self.concatenate = True self.next_offset = None return - - @staticmethod + + @staticmethod def ConcatenateJsonPages(saved_json_list): #reset items list - + tmp = {} tmp['items'] = [] - + for page in saved_json_list: - tmp['items'].extend(page['items']) + tmp['items'].extend(page['items']) return tmp - - + + def ResetNextPage(self): self.next_page = True self.next_offset = None self.concatenate = False self.end = False - - + + class OARrestapi: def __init__(self, config_file = '/etc/sfa/oar_config.py'): self.oarserver = {} - - + + self.oarserver['uri'] = None self.oarserver['postformat'] = 'json' - + try: execfile(config_file, self.__dict__) - + self.config_file = config_file # path to configuration data self.config_path = os.path.dirname(config_file) - + except IOError: raise IOError, "Could not find or load the configuration file: %s" \ % config_file @@ -112,14 +112,14 @@ class OARrestapi: 'toError', 'toAckReservation', 'Launching', \ 'Finishing', 'Running', 'Suspended', 'Resuming',\ 'Error'] - + self.parser = OARGETParser(self) - - - def GETRequestToOARRestAPI(self, request, strval=None, next_page=None, username = None ): + + + def GETRequestToOARRestAPI(self, request, strval=None, next_page=None, username = None ): self.oarserver['uri'] = \ OARGETParser.OARrequests_uri_dict[request]['uri'] - #Get job details with username + #Get job details with username if 'owner' in OARGETParser.OARrequests_uri_dict[request] and username: self.oarserver['uri'] += OARGETParser.OARrequests_uri_dict[request]['owner'] + username headers = {} @@ -128,26 +128,26 @@ class OARrestapi: if strval: self.oarserver['uri'] = self.oarserver['uri'].\ replace("id",str(strval)) - + if next_page: self.oarserver['uri'] += next_page - + if username: - headers['X-REMOTE_IDENT'] = username - + headers['X-REMOTE_IDENT'] = username + logger.debug("OARrestapi: \t GETRequestToOARRestAPI \ self.oarserver['uri'] %s strval %s" \ %(self.oarserver['uri'], strval)) - try : + try : #seems that it does not work if we don't add this - headers['content-length'] = '0' + headers['content-length'] = '0' conn = HTTPConnection(self.oarserver['ip'], \ self.oarserver['port']) conn.request("GET", self.oarserver['uri'], data, headers) resp = ( conn.getresponse()).read() conn.close() - + except HTTPException, error : logger.log_exc("GET_OAR_SRVR : Problem with OAR server : %s " \ %(error)) @@ -156,20 +156,20 @@ class OARrestapi: js_dict = json.loads(resp) #print "\r\n \t\t\t js_dict keys" , js_dict.keys(), " \r\n", js_dict return js_dict - + except ValueError, error: logger.log_exc("Failed to parse Server Response: %s ERROR %s"\ %(js_dict, error)) #raise ServerError("Failed to parse Server Response:" + js) - + def POSTRequestToOARRestAPI(self, request, datadict, username=None): - """ Used to post a job on OAR , along with data associated + """ Used to post a job on OAR , along with data associated with the job. - + """ - #first check that all params for are OK + #first check that all params for are OK try: self.oarserver['uri'] = OAR_REQUEST_POST_URI_DICT[request]['uri'] @@ -185,7 +185,7 @@ class OARrestapi: data = json.dumps(datadict) headers = {'X-REMOTE_IDENT':username, \ 'content-type': POST_FORMAT['json']['content'], \ - 'content-length':str(len(data))} + 'content-length':str(len(data))} try : conn = HTTPConnection(self.oarserver['ip'], \ @@ -199,7 +199,7 @@ class OARrestapi: %(data,headers,self.oarserver['uri'])) #raise ServerError("POST_OAR_SRVR : error") - + try: answer = json.loads(resp) logger.debug("POSTRequestToOARRestAPI : answer %s" %(answer)) @@ -214,106 +214,106 @@ class OARrestapi: def AddOarNodeId(tuplelist, value): """ Adds Oar internal node id to the nodes attributes """ - + tuplelist.append(('oar_id', int(value))) - + def AddNodeNetworkAddr(dictnode, value): #Inserts new key. The value associated is a tuple list node_id = value - - dictnode[node_id] = [('node_id', node_id),('hostname', node_id) ] - - return node_id - + + dictnode[node_id] = [('node_id', node_id),('hostname', node_id) ] + + return node_id + def AddNodeSite(tuplelist, value): tuplelist.append(('site', str(value))) def AddNodeRadio(tuplelist, value): - tuplelist.append(('radio', str(value))) + tuplelist.append(('radio', str(value))) -def AddMobility(tuplelist, value): +def AddMobility(tuplelist, value): if value is 0: - tuplelist.append(('mobile', 'False')) + tuplelist.append(('mobile', 'False')) else : tuplelist.append(('mobile', 'True')) def AddPosX(tuplelist, value): - tuplelist.append(('posx', value)) + tuplelist.append(('posx', value)) def AddPosY(tuplelist, value): - tuplelist.append(('posy', value)) - + tuplelist.append(('posy', value)) + def AddPosZ(tuplelist, value): tuplelist.append(('posz', value)) - + def AddBootState(tuplelist, value): tuplelist.append(('boot_state', str(value))) - + #Insert a new node into the dictnode dictionary def AddNodeId(dictnode, value): #Inserts new key. The value associated is a tuple list node_id = int(value) - - dictnode[node_id] = [('node_id', node_id)] - return node_id + + dictnode[node_id] = [('node_id', node_id)] + return node_id def AddHardwareType(tuplelist, value): value_list = value.split(':') - tuplelist.append(('archi', value_list[0])) + tuplelist.append(('archi', value_list[0])) tuplelist.append(('radio', value_list[1])) - - + + class OARGETParser: resources_fulljson_dict = { 'network_address' : AddNodeNetworkAddr, - 'site': AddNodeSite, + 'site': AddNodeSite, 'radio': AddNodeRadio, 'mobile': AddMobility, 'x': AddPosX, 'y': AddPosY, 'z':AddPosZ, - 'archi':AddHardwareType, + 'archi':AddHardwareType, 'state':AddBootState, 'id' : AddOarNodeId, } - - + + def __init__(self, srv) : - self.version_json_dict = { + self.version_json_dict = { 'api_version' : None , 'apilib_version' :None,\ 'api_timezone': None, 'api_timestamp': None, 'oar_version': None ,} self.config = Config() - self.interface_hrn = self.config.SFA_INTERFACE_HRN - self.timezone_json_dict = { + self.interface_hrn = self.config.SFA_INTERFACE_HRN + self.timezone_json_dict = { 'timezone': None, 'api_timestamp': None, } #self.jobs_json_dict = { #'total' : None, 'links' : [],\ #'offset':None , 'items' : [], } #self.jobs_table_json_dict = self.jobs_json_dict - #self.jobs_details_json_dict = self.jobs_json_dict + #self.jobs_details_json_dict = self.jobs_json_dict self.server = srv self.node_dictlist = {} - + self.json_page = JsonPage() - + self.site_dict = {} self.SendRequest("GET_version") - - - - def ParseVersion(self) : + + + + def ParseVersion(self) : #print self.json_page.raw_json #print >>sys.stderr, self.json_page.raw_json if 'oar_version' in self.json_page.raw_json : self.version_json_dict.update(api_version = \ - self.json_page.raw_json['api_version'], - apilib_version = self.json_page.raw_json['apilib_version'], - api_timezone = self.json_page.raw_json['api_timezone'], - api_timestamp = self.json_page.raw_json['api_timestamp'], + self.json_page.raw_json['api_version'], + apilib_version = self.json_page.raw_json['apilib_version'], + api_timezone = self.json_page.raw_json['api_timezone'], + api_timestamp = self.json_page.raw_json['api_timestamp'], oar_version = self.json_page.raw_json['oar_version'] ) else : self.version_json_dict.update(api_version = \ @@ -322,37 +322,37 @@ class OARGETParser: api_timezone = self.json_page.raw_json['api_timezone'], api_timestamp = self.json_page.raw_json['api_timestamp'], oar_version = self.json_page.raw_json['oar'] ) - + print self.version_json_dict['apilib_version'] - - - def ParseTimezone(self) : + + + def ParseTimezone(self) : api_timestamp = self.json_page.raw_json['api_timestamp'] api_tz = self.json_page.raw_json['timezone'] return api_timestamp, api_tz - + def ParseJobs(self) : self.jobs_list = [] print " ParseJobs " return self.json_page.raw_json - - def ParseJobsTable(self) : + + def ParseJobsTable(self) : print "ParseJobsTable" - + def ParseJobsDetails (self): - # currently, this function is not used a lot, - #so i have no idea what be usefull to parse, + # currently, this function is not used a lot, + #so i have no idea what be usefull to parse, #returning the full json. NT #logger.debug("ParseJobsDetails %s " %(self.json_page.raw_json)) return self.json_page.raw_json - + def ParseJobsIds(self): - + job_resources = ['wanted_resources', 'name', 'id', 'start_time', \ 'state','owner','walltime','message'] - - + + job_resources_full = ['launching_directory', 'links', \ 'resubmit_job_id', 'owner', 'events', 'message', \ 'scheduled_start', 'id', 'array_id', 'exit_code', \ @@ -370,28 +370,28 @@ class OARGETParser: for k in job_resources: values.append(job_info[k]) return dict(zip(job_resources, values)) - + except KeyError: logger.log_exc("ParseJobsIds KeyError ") - + def ParseJobsIdResources(self): - """ Parses the json produced by the request + """ Parses the json produced by the request /oarapi/jobs/id/resources.json. - Returns a list of oar node ids that are scheduled for the + Returns a list of oar node ids that are scheduled for the given job id. - + """ job_resources = [] for resource in self.json_page.raw_json['items']: job_resources.append(resource['id']) - + #logger.debug("OARESTAPI \tParseJobsIdResources %s" %(self.json_page.raw_json)) return job_resources - + def ParseResources(self) : """ Parses the json produced by a get_resources request on oar.""" - + #logger.debug("OARESTAPI \tParseResources " ) #resources are listed inside the 'items' list from the json self.json_page.raw_json = self.json_page.raw_json['items'] @@ -399,9 +399,9 @@ class OARGETParser: def ParseReservedNodes(self): """ Returns an array containing the list of the reserved nodes """ - + #resources are listed inside the 'items' list from the json - reservation_list = [] + reservation_list = [] job = {} #Parse resources info for json_element in self.json_page.raw_json['items']: @@ -417,48 +417,48 @@ class OARGETParser: job['t_from'] = "As soon as possible" job['t_until'] = "As soon as possible" job['resource_ids'] = ["Undefined"] - - - job['state'] = json_element['state'] - job['lease_id'] = json_element['id'] - - + + + job['state'] = json_element['state'] + job['lease_id'] = json_element['id'] + + job['user'] = json_element['owner'] - #logger.debug("OARRestapi \tParseReservedNodes job %s" %(job)) + #logger.debug("OARRestapi \tParseReservedNodes job %s" %(job)) reservation_list.append(job) #reset dict job = {} return reservation_list - - def ParseRunningJobs(self): + + def ParseRunningJobs(self): """ Gets the list of nodes currently in use from the attributes of the running jobs. - + """ - logger.debug("OARESTAPI \tParseRunningJobs__________________________ ") + logger.debug("OARESTAPI \tParseRunningJobs__________________________ ") #resources are listed inside the 'items' list from the json nodes = [] for job in self.json_page.raw_json['items']: for node in job['nodes']: nodes.append(node['network_address']) return nodes - - - + + + def ParseDeleteJobs(self): - """ No need to parse anything in this function.A POST + """ No need to parse anything in this function.A POST is done to delete the job. - + """ - return - + return + def ParseResourcesFull(self) : - """ This method is responsible for parsing all the attributes + """ This method is responsible for parsing all the attributes of all the nodes returned by OAR when issuing a get resources full. The information from the nodes and the sites are separated. - Updates the node_dictlist so that the dictionnary of the platform's - nodes is available afterwards. - + Updates the node_dictlist so that the dictionnary of the platform's + nodes is available afterwards. + """ logger.debug("OARRESTAPI ParseResourcesFull________________________ ") #print self.json_page.raw_json[1] @@ -468,58 +468,58 @@ class OARGETParser: self.ParseNodes() self.ParseSites() return self.node_dictlist - + def ParseResourcesFullSites(self) : """ UNUSED. Originally used to get information from the sites. ParseResourcesFull is used instead. - + """ if self.version_json_dict['apilib_version'] != "0.2.10" : self.json_page.raw_json = self.json_page.raw_json['items'] self.ParseNodes() self.ParseSites() return self.site_dict - - - def ParseNodes(self): + + + def ParseNodes(self): """ Parse nodes properties from OAR - Put them into a dictionary with key = node id and value is a dictionary + Put them into a dictionary with key = node id and value is a dictionary of the node properties and properties'values. - + """ node_id = None keys = self.resources_fulljson_dict.keys() keys.sort() for dictline in self.json_page.raw_json: - node_id = None - # dictionary is empty and/or a new node has to be inserted + node_id = None + # dictionary is empty and/or a new node has to be inserted node_id = self.resources_fulljson_dict['network_address'](\ - self.node_dictlist, dictline['network_address']) + self.node_dictlist, dictline['network_address']) for k in keys: if k in dictline: if k == 'network_address': continue - + self.resources_fulljson_dict[k](\ self.node_dictlist[node_id], dictline[k]) - #The last property has been inserted in the property tuple list, - #reset node_id + #The last property has been inserted in the property tuple list, + #reset node_id #Turn the property tuple list (=dict value) into a dictionary self.node_dictlist[node_id] = dict(self.node_dictlist[node_id]) node_id = None - - @staticmethod - def slab_hostname_to_hrn( root_auth, hostname): - return root_auth + '.'+ hostname - + @staticmethod + def iotlab_hostname_to_hrn( root_auth, hostname): + return root_auth + '.'+ hostname + + def ParseSites(self): """ Returns a list of dictionnaries containing the sites' attributes.""" - + nodes_per_site = {} config = Config() #logger.debug(" OARrestapi.py \tParseSites self.node_dictlist %s"\ @@ -527,22 +527,22 @@ class OARGETParser: # Create a list of nodes per site_id for node_id in self.node_dictlist: node = self.node_dictlist[node_id] - + if node['site'] not in nodes_per_site: nodes_per_site[node['site']] = [] nodes_per_site[node['site']].append(node['node_id']) else: if node['node_id'] not in nodes_per_site[node['site']]: nodes_per_site[node['site']].append(node['node_id']) - + #Create a site dictionary whose key is site_login_base (name of the site) - # and value is a dictionary of properties, including the list + # and value is a dictionary of properties, including the list #of the node_ids for node_id in self.node_dictlist: node = self.node_dictlist[node_id] - #node.update({'hrn':self.slab_hostname_to_hrn(self.interface_hrn, \ + #node.update({'hrn':self.iotlab_hostname_to_hrn(self.interface_hrn, \ #node['site'],node['hostname'])}) - node.update({'hrn':self.slab_hostname_to_hrn(self.interface_hrn, node['hostname'])}) + node.update({'hrn':self.iotlab_hostname_to_hrn(self.interface_hrn, node['hostname'])}) self.node_dictlist.update({node_id:node}) if node['site'] not in self.site_dict: @@ -553,10 +553,10 @@ class OARGETParser: 'longitude':"- 2.10336",'name':config.SFA_REGISTRY_ROOT_AUTH, 'pcu_ids':[], 'max_slices':None, 'ext_consortium_id':None, 'max_slivers':None, 'is_public':True, 'peer_site_id': None, - 'abbreviated_name':"senslab", 'address_ids': [], + 'abbreviated_name':"iotlab", 'address_ids': [], 'url':"http,//www.senslab.info", 'person_ids':[], 'site_tag_ids':[], 'enabled': True, 'slice_ids':[], - 'date_created': None, 'peer_id': None } + 'date_created': None, 'peer_id': None } #if node['site_login_base'] not in self.site_dict.keys(): #self.site_dict[node['site_login_base']] = {'login_base':node['site_login_base'], #'node_ids':nodes_per_site[node['site_login_base']], @@ -567,26 +567,26 @@ class OARGETParser: #'abbreviated_name':"senslab", 'address_ids': [], #'url':"http,//www.senslab.info", 'person_ids':[], #'site_tag_ids':[], 'enabled': True, 'slice_ids':[], - #'date_created': None, 'peer_id': None } + #'date_created': None, 'peer_id': None } + - - OARrequests_uri_dict = { - 'GET_version': + OARrequests_uri_dict = { + 'GET_version': {'uri':'/oarapi/version.json', 'parse_func': ParseVersion}, 'GET_timezone': {'uri':'/oarapi/timezone.json' ,'parse_func': ParseTimezone }, - 'GET_jobs': + 'GET_jobs': {'uri':'/oarapi/jobs.json','parse_func': ParseJobs}, - 'GET_jobs_id': + 'GET_jobs_id': {'uri':'/oarapi/jobs/id.json','parse_func': ParseJobsIds}, - 'GET_jobs_id_resources': + 'GET_jobs_id_resources': {'uri':'/oarapi/jobs/id/resources.json',\ 'parse_func': ParseJobsIdResources}, - 'GET_jobs_table': + 'GET_jobs_table': {'uri':'/oarapi/jobs/table.json','parse_func': ParseJobsTable}, - 'GET_jobs_details': + 'GET_jobs_details': {'uri':'/oarapi/jobs/details.json',\ 'parse_func': ParseJobsDetails}, 'GET_reserved_nodes': @@ -595,11 +595,11 @@ class OARGETParser: 'owner':'&user=', 'parse_func':ParseReservedNodes}, - - 'GET_running_jobs': + + 'GET_running_jobs': {'uri':'/oarapi/jobs/details.json?state=Running',\ 'parse_func':ParseRunningJobs}, - 'GET_resources_full': + 'GET_resources_full': {'uri':'/oarapi/resources/full.json',\ 'parse_func': ParseResourcesFull}, 'GET_sites': @@ -612,12 +612,12 @@ class OARGETParser: } - - + + def SendRequest(self, request, strval = None , username = None): """ Connects to OAR , sends the valid GET requests and uses the appropriate json parsing functions. - + """ save_json = None @@ -634,7 +634,7 @@ class OARGETParser: self.json_page.FindNextPage() if self.json_page.concatenate: save_json.append(self.json_page.raw_json) - + if self.json_page.concatenate and self.json_page.end : self.json_page.raw_json = \ self.json_page.ConcatenateJsonPages(save_json) @@ -643,4 +643,4 @@ class OARGETParser: else: logger.error("OARRESTAPI OARGetParse __init__ : ERROR_REQUEST " \ %(request)) - + diff --git a/sfa/senslab/__init__.py b/sfa/iotlab/__init__.py similarity index 100% rename from sfa/senslab/__init__.py rename to sfa/iotlab/__init__.py diff --git a/sfa/senslab/slabaggregate.py b/sfa/iotlab/iotlabaggregate.py similarity index 85% rename from sfa/senslab/slabaggregate.py rename to sfa/iotlab/iotlabaggregate.py index d1946f8c..26c67646 100644 --- a/sfa/senslab/slabaggregate.py +++ b/sfa/iotlab/iotlabaggregate.py @@ -12,25 +12,25 @@ from sfa.rspecs.elements.granularity import Granularity from sfa.rspecs.version_manager import VersionManager -from sfa.rspecs.elements.versions.slabv1Node import SlabPosition, SlabNode, \ - SlabLocation +from sfa.rspecs.elements.versions.iotlabv1Node import IotlabPosition, IotlabNode, \ + IotlabLocation from sfa.util.sfalogging import logger from sfa.util.xrn import Xrn -def slab_xrn_to_hostname(xrn): +def iotlab_xrn_to_hostname(xrn): return Xrn.unescape(Xrn(xrn=xrn, type='node').get_leaf()) -def slab_xrn_object(root_auth, hostname): +def iotlab_xrn_object(root_auth, hostname): """Attributes are urn and hrn. - Get the hostname using slab_xrn_to_hostname on the urn. + Get the hostname using iotlab_xrn_to_hostname on the urn. - :return: the senslab node's xrn + :return: the iotlab node's xrn :rtype: Xrn """ return Xrn('.'.join( [root_auth, Xrn.escape(hostname)]), type='node') -class SlabAggregate: +class IotlabAggregate: sites = {} nodes = {} @@ -48,7 +48,7 @@ class SlabAggregate: def get_slice_and_slivers(self, slice_xrn, login=None): """ - Get the slices and the associated leases if any from the senslab + Get the slices and the associated leases if any from the iotlab testbed. For each slice, get the nodes in the associated lease and create a sliver with the necessary info and insertinto the sliver dictionary, keyed on the node hostnames. @@ -57,14 +57,14 @@ class SlabAggregate: :param slice_xrn: xrn of the slice - :param login: user's login on senslab ldap + :param login: user's login on iotlab ldap :type slice_xrn: string :type login: string :reutnr : a list of slices dict and a dictionary of Sliver object :rtype: (list, dict) - ..note: There is no slivers in senslab, only leases. + ..note: There is no slivers in iotlab, only leases. """ slivers = {} @@ -75,7 +75,7 @@ class SlabAggregate: slice_hrn, _ = urn_to_hrn(slice_xrn) slice_name = slice_hrn - slices = self.driver.slab_api.GetSlices(slice_filter= str(slice_name), \ + slices = self.driver.iotlab_api.GetSlices(slice_filter= str(slice_name), \ slice_filter_type = 'slice_hrn', \ login=login) @@ -101,15 +101,15 @@ class SlabAggregate: sliver_xrn.set_authority(self.driver.hrn) sliver = Sliver({'sliver_id':sliver_xrn.urn, 'name': sfa_slice['hrn'], - 'type': 'slab-node', + 'type': 'iotlab-node', 'tags': []}) slivers[node] = sliver #Add default sliver attribute : - #connection information for senslab - if get_authority (sfa_slice['hrn']) == self.driver.slab_api.root_auth: + #connection information for iotlab + if get_authority (sfa_slice['hrn']) == self.driver.iotlab_api.root_auth: tmp = sfa_slice['hrn'].split('.') ldap_username = tmp[1].split('_')[0] ssh_access = None @@ -138,16 +138,16 @@ class SlabAggregate: #tags_filter = {} # get the granularity in second for the reservation system - grain = self.driver.slab_api.GetLeaseGranularity() + grain = self.driver.iotlab_api.GetLeaseGranularity() - nodes = self.driver.slab_api.GetNodes() + nodes = self.driver.iotlab_api.GetNodes() #geni_available = options.get('geni_available') #if geni_available: #filter['boot_state'] = 'boot' #filter.update({'peer_id': None}) - #nodes = self.driver.slab_api.GetNodes(filter['hostname']) + #nodes = self.driver.iotlab_api.GetNodes(filter['hostname']) #site_ids = [] #interface_ids = [] @@ -182,14 +182,14 @@ class SlabAggregate: #for node in one_slice['node_ids']: #slice_nodes_list.append(node) - reserved_nodes = self.driver.slab_api.GetNodesCurrentlyInUse() + reserved_nodes = self.driver.iotlab_api.GetNodesCurrentlyInUse() logger.debug("SLABAGGREGATE api get_nodes slice_nodes_list %s "\ %(slice_nodes_list)) for node in nodes: nodes_dict[node['node_id']] = node if slice_nodes_list == [] or node['hostname'] in slice_nodes_list: - rspec_node = SlabNode() + rspec_node = IotlabNode() # xxx how to retrieve site['login_base'] #site_id=node['site_id'] #site=sites_dict[site_id] @@ -198,16 +198,16 @@ class SlabAggregate: rspec_node['archi'] = node['archi'] rspec_node['radio'] = node['radio'] - slab_xrn = slab_xrn_object(self.driver.slab_api.root_auth, \ + iotlab_xrn = iotlab_xrn_object(self.driver.iotlab_api.root_auth, \ node['hostname']) - rspec_node['component_id'] = slab_xrn.urn + rspec_node['component_id'] = iotlab_xrn.urn rspec_node['component_name'] = node['hostname'] rspec_node['component_manager_id'] = \ - hrn_to_urn(self.driver.slab_api.root_auth, \ + hrn_to_urn(self.driver.iotlab_api.root_auth, \ 'authority+sa') - # Senslab's nodes are federated : there is only one authority - # for all Senslab sites, registered in SFA. + # Iotlab's nodes are federated : there is only one authority + # for all Iotlab sites, registered in SFA. # Removing the part including the site # in authority_id SA 27/07/12 rspec_node['authority_id'] = rspec_node['component_manager_id'] @@ -221,15 +221,15 @@ class SlabAggregate: rspec_node['boot_state'] = "Reserved" rspec_node['exclusive'] = 'true' rspec_node['hardware_types'] = [HardwareType({'name': \ - 'slab-node'})] + 'iotlab-node'})] - location = SlabLocation({'country':'France', 'site': \ + location = IotlabLocation({'country':'France', 'site': \ node['site']}) rspec_node['location'] = location - position = SlabPosition() + position = IotlabPosition() for field in position : try: position[field] = node[field] @@ -281,9 +281,9 @@ class SlabAggregate: #if slice_record: #lease_filter.update({'name': slice_record['name']}) - #leases = self.driver.slab_api.GetLeases(lease_filter) - leases = self.driver.slab_api.GetLeases() - grain = self.driver.slab_api.GetLeaseGranularity() + #leases = self.driver.iotlab_api.GetLeases(lease_filter) + leases = self.driver.iotlab_api.GetLeases() + grain = self.driver.iotlab_api.GetLeaseGranularity() site_ids = [] rspec_leases = [] for lease in leases: @@ -292,14 +292,14 @@ class SlabAggregate: rspec_lease = Lease() rspec_lease['lease_id'] = lease['lease_id'] #site = node['site_id'] - slab_xrn = slab_xrn_object(self.driver.slab_api.root_auth, node) - rspec_lease['component_id'] = slab_xrn.urn + iotlab_xrn = iotlab_xrn_object(self.driver.iotlab_api.root_auth, node) + rspec_lease['component_id'] = iotlab_xrn.urn #rspec_lease['component_id'] = hostname_to_urn(self.driver.hrn,\ #site, node['hostname']) try: rspec_lease['slice_id'] = lease['slice_id'] except KeyError: - #No info on the slice used in slab_xp table + #No info on the slice used in iotlab_xp table pass rspec_lease['start_time'] = lease['t_from'] rspec_lease['duration'] = (lease['t_until'] - lease['t_from']) \ @@ -316,7 +316,7 @@ class SlabAggregate: rspec = None version_manager = VersionManager() version = version_manager.get_version(version) - logger.debug("SlabAggregate \t get_rspec ***version %s \ + logger.debug("IotlabAggregate \t get_rspec ***version %s \ version.type %s version.version %s options %s \r\n" \ %(version,version.type,version.version,options)) @@ -329,7 +329,7 @@ class SlabAggregate: version.version, 'manifest') slices, slivers = self.get_slice_and_slivers(slice_xrn, login) - #at this point sliver may be empty if no senslab job + #at this point sliver may be empty if no iotlab job #is running for this user/slice. rspec = RSpec(version=rspec_version, user_options=options) @@ -339,7 +339,7 @@ class SlabAggregate: #datetime_to_string(utcparse(slice['expires'])) # add sliver defaults #nodes, links = self.get_nodes(slice, slivers) - logger.debug("\r\n \r\n SlabAggregate \tget_rspec *** \ + logger.debug("\r\n \r\n IotlabAggregate \tget_rspec *** \ slice_xrn %s slices %s\r\n \r\n"\ %(slice_xrn, slices)) @@ -356,7 +356,7 @@ class SlabAggregate: #if not options.get('list_leases') or options.get('list_leases') #and options['list_leases'] != 'leases': nodes = self.get_nodes(slices, slivers) - logger.debug("\r\n \r\n SlabAggregate \ lease_option %s \ + logger.debug("\r\n \r\n IotlabAggregate \ lease_option %s \ get rspec ******* nodes %s"\ %(lease_option, nodes[0])) @@ -384,7 +384,7 @@ class SlabAggregate: default_sliver = slivers.get('default_sliver', []) if default_sliver: #default_sliver_attribs = default_sliver.get('tags', []) - logger.debug("SlabAggregate \tget_rspec **** \ + logger.debug("IotlabAggregate \tget_rspec **** \ default_sliver%s \r\n" %(default_sliver)) for attrib in default_sliver: rspec.version.add_default_sliver_attribute(attrib, \ @@ -394,6 +394,6 @@ class SlabAggregate: leases = self.get_all_leases() rspec.version.add_leases(leases) - #logger.debug("SlabAggregate \tget_rspec ******* rspec_toxml %s \r\n"\ + #logger.debug("IotlabAggregate \tget_rspec ******* rspec_toxml %s \r\n"\ #%(rspec.toxml())) return rspec.toxml() diff --git a/sfa/senslab/slabapi.py b/sfa/iotlab/iotlabapi.py similarity index 85% rename from sfa/senslab/slabapi.py rename to sfa/iotlab/iotlabapi.py index 8a0ed4a7..0c0f7987 100644 --- a/sfa/senslab/slabapi.py +++ b/sfa/iotlab/iotlabapi.py @@ -5,10 +5,10 @@ from sfa.util.sfalogging import logger from sfa.storage.alchemy import dbsession from sqlalchemy.orm import joinedload from sfa.storage.model import RegRecord, RegUser, RegSlice, RegKey -from sfa.senslab.slabpostgres import slab_dbsession, SenslabXP +from sfa.iotlab.iotlabpostgres import iotlab_dbsession, IotlabXP -from sfa.senslab.OARrestapi import OARrestapi -from sfa.senslab.LDAPapi import LDAPapi +from sfa.iotlab.OARrestapi import OARrestapi +from sfa.iotlab.LDAPapi import LDAPapi from sfa.util.xrn import Xrn, hrn_to_urn, get_authority @@ -16,9 +16,9 @@ from sfa.trust.certificate import Keypair, convert_public_key from sfa.trust.gid import create_uuid from sfa.trust.hierarchy import Hierarchy -from sfa.senslab.slabaggregate import slab_xrn_object +from sfa.iotlab.iotlabaggregate import iotlab_xrn_object -class SlabTestbedAPI(): +class IotlabTestbedAPI(): """ Class enabled to use LDAP and OAR api calls. """ def __init__(self, config): @@ -58,7 +58,7 @@ class SlabTestbedAPI(): existing_records = {} existing_hrns_by_types = {} - logger.debug("SLABDRIVER \tGetPeers peer_filter %s, \ + logger.debug("IOTLABDRIVER \tGetPeers peer_filter %s, \ " %(peer_filter)) all_records = dbsession.query(RegRecord).filter(RegRecord.type.like('%authority%')).all() @@ -70,7 +70,7 @@ class SlabTestbedAPI(): existing_hrns_by_types[record.type].append(record.hrn) - logger.debug("SLABDRIVER \tGetPeer\texisting_hrns_by_types %s "\ + logger.debug("IOTLABDRIVER \tGetPeer\texisting_hrns_by_types %s "\ %( existing_hrns_by_types)) records_list = [] @@ -81,14 +81,14 @@ class SlabTestbedAPI(): for hrn in existing_hrns_by_types['authority']: records_list.append(existing_records[(hrn,'authority')]) - logger.debug("SLABDRIVER \tGetPeer \trecords_list %s " \ + logger.debug("IOTLABDRIVER \tGetPeer \trecords_list %s " \ %(records_list)) except KeyError: pass return_records = records_list - logger.debug("SLABDRIVER \tGetPeer return_records %s " \ + logger.debug("IOTLABDRIVER \tGetPeer return_records %s " \ %(return_records)) return return_records @@ -99,7 +99,7 @@ class SlabTestbedAPI(): #over the records' list def GetPersons(self, person_filter=None): """ - Get the enabled users and their properties from Senslab LDAP. + Get the enabled users and their properties from Iotlab LDAP. If a filter is specified, looks for the user whose properties match the filter, otherwise returns the whole enabled users'list. :param person_filter: Must be a list of dictionnaries @@ -110,7 +110,7 @@ class SlabTestbedAPI(): :rtype: list of dicts """ - logger.debug("SLABDRIVER \tGetPersons person_filter %s" \ + logger.debug("IOTLABDRIVER \tGetPersons person_filter %s" \ %(person_filter)) person_list = [] if person_filter and isinstance(person_filter, list): @@ -118,7 +118,7 @@ class SlabTestbedAPI(): #Usually the list contains only one user record for searched_attributes in person_filter: - #Get only enabled user accounts in senslab LDAP : + #Get only enabled user accounts in iotlab LDAP : #add a filter for make_ldap_filters_from_record person = self.ldap.LdapFindUser(searched_attributes, \ is_user_enabled=True) @@ -131,7 +131,7 @@ class SlabTestbedAPI(): person_list = None else: - #Get only enabled user accounts in senslab LDAP : + #Get only enabled user accounts in iotlab LDAP : #add a filter for make_ldap_filters_from_record person_list = self.ldap.LdapFindUser(is_user_enabled=True) @@ -151,7 +151,7 @@ class SlabTestbedAPI(): posting a delete request to OAR. :param job_id: job id in OAR. - :param username: user's senslab login in LDAP. + :param username: user's iotlab login in LDAP. :type job_id:integer :type username: string @@ -159,7 +159,7 @@ class SlabTestbedAPI(): (True) or no (False) :rtype: dict """ - logger.debug("SLABDRIVER \tDeleteJobs jobid %s username %s "\ + logger.debug("IOTLABDRIVER \tDeleteJobs jobid %s username %s "\ %(job_id, username)) if not job_id or job_id is -1: return @@ -175,7 +175,7 @@ class SlabTestbedAPI(): ret = {job_id : True } else: ret = {job_id :False } - logger.debug("SLABDRIVER \tDeleteJobs jobid %s \r\n answer %s \ + logger.debug("IOTLABDRIVER \tDeleteJobs jobid %s \r\n answer %s \ username %s" %(job_id, answer, username)) return ret @@ -194,19 +194,19 @@ class SlabTestbedAPI(): ##Get job info from OAR #job_info = self.oar.parser.SendRequest(req, job_id, username) - #logger.debug("SLABDRIVER \t GetJobsId %s " %(job_info)) + #logger.debug("IOTLABDRIVER \t GetJobsId %s " %(job_info)) #try: #if job_info['state'] == 'Terminated': - #logger.debug("SLABDRIVER \t GetJobsId job %s TERMINATED"\ + #logger.debug("IOTLABDRIVER \t GetJobsId job %s TERMINATED"\ #%(job_id)) #return None #if job_info['state'] == 'Error': - #logger.debug("SLABDRIVER \t GetJobsId ERROR message %s "\ + #logger.debug("IOTLABDRIVER \t GetJobsId ERROR message %s "\ #%(job_info)) #return None #except KeyError: - #logger.error("SLABDRIVER \tGetJobsId KeyError") + #logger.error("IOTLABDRIVER \tGetJobsId KeyError") #return None #parsed_job_info = self.get_info_on_reserved_nodes(job_info, \ @@ -216,14 +216,14 @@ class SlabTestbedAPI(): ##with "node_ids" #job_info.update({'node_ids':parsed_job_info[node_list_k]}) #del job_info[node_list_k] - #logger.debug(" \r\nSLABDRIVER \t GetJobsId job_info %s " %(job_info)) + #logger.debug(" \r\nIOTLABDRIVER \t GetJobsId job_info %s " %(job_info)) #return job_info def GetJobsResources(self, job_id, username = None): """ Gets the list of nodes associated with the job_id and username if provided. - Transforms the senslab hostnames to the corresponding + Transforms the iotlab hostnames to the corresponding SFA nodes hrns. Rertuns dict key :'node_ids' , value : hostnames list :param username: user's LDAP login @@ -240,7 +240,7 @@ class SlabTestbedAPI(): #Get job resources list from OAR node_id_list = self.oar.parser.SendRequest(req, job_id, username) - logger.debug("SLABDRIVER \t GetJobsResources %s " %(node_id_list)) + logger.debug("IOTLABDRIVER \t GetJobsResources %s " %(node_id_list)) hostname_list = \ self.__get_hostnames_from_oar_node_ids(node_id_list) @@ -272,11 +272,11 @@ class SlabTestbedAPI(): #reserved_node_hostname_list[index] = \ #node_dict[job_info[node_list_name][index]]['hostname'] - #logger.debug("SLABDRIVER \t get_info_on_reserved_nodes \ + #logger.debug("IOTLABDRIVER \t get_info_on_reserved_nodes \ #reserved_node_hostname_list %s" \ #%(reserved_node_hostname_list)) #except KeyError: - #logger.error("SLABDRIVER \t get_info_on_reserved_nodes KEYERROR " ) + #logger.error("IOTLABDRIVER \t get_info_on_reserved_nodes KEYERROR " ) #return reserved_node_hostname_list @@ -338,7 +338,7 @@ class SlabTestbedAPI(): def GetNodes(self, node_filter_dict = None, return_fields_list = None): """ - Make a list of senslab nodes and their properties from information + Make a list of iotlab nodes and their properties from information given by OAR. Search for specific nodes if some filters are specified. Nodes properties returned if no return_fields_list given: 'hrn','archi','mobile','hostname','site','boot_state','node_id', @@ -355,7 +355,7 @@ class SlabTestbedAPI(): """ node_dict_by_id = self.oar.parser.SendRequest("GET_resources_full") node_dict_list = node_dict_by_id.values() - logger.debug (" SLABDRIVER GetNodes node_filter_dict %s \ + logger.debug (" IOTLABDRIVER GetNodes node_filter_dict %s \ return_fields_list %s "%(node_filter_dict, return_fields_list)) #No filtering needed return the list directly if not (node_filter_dict or return_fields_list): @@ -388,8 +388,8 @@ class SlabTestbedAPI(): @staticmethod def AddSlice(slice_record, user_record): - """Add slice to the local senslab sfa tables if the slice comes - from a federated site and is not yet in the senslab sfa DB, + """Add slice to the local iotlab sfa tables if the slice comes + from a federated site and is not yet in the iotlab sfa DB, although the user has already a LDAP login. Called by verify_slice during lease/sliver creation. :param slice_record: record of slice, must contain hrn, gid, slice_id @@ -403,7 +403,7 @@ class SlabTestbedAPI(): gid=slice_record['gid'], pointer=slice_record['slice_id'], authority=slice_record['authority']) - logger.debug("SLABDRIVER.PY AddSlice sfa_record %s user_record %s" + logger.debug("IOTLABDRIVER.PY AddSlice sfa_record %s user_record %s" % (sfa_record, user_record)) sfa_record.just_created() dbsession.add(sfa_record) @@ -446,7 +446,7 @@ class SlabTestbedAPI(): #TODO : Check rights to delete person def DeletePerson(self, person_record): - """ Disable an existing account in senslab LDAP. + """ Disable an existing account in iotlab LDAP. Users and techs can only delete themselves. PIs can only delete themselves and other non-PIs at their sites. ins can delete anyone. @@ -456,9 +456,9 @@ class SlabTestbedAPI(): :rtype: boolean """ - #Disable user account in senslab LDAP + #Disable user account in iotlab LDAP ret = self.ldap.LdapMarkUserAsDeleted(person_record) - logger.warning("SLABDRIVER DeletePerson %s " %(person_record)) + logger.warning("IOTLABDRIVER DeletePerson %s " %(person_record)) return ret['bool'] @@ -479,7 +479,7 @@ class SlabTestbedAPI(): delete_failed = [] delete_failed.append(job_id) - logger.info("SLABDRIVER DeleteSlice %s answer %s"%(slice_record, \ + logger.info("IOTLABDRIVER DeleteSlice %s answer %s"%(slice_record, \ delete_failed)) return delete_failed or True @@ -487,7 +487,7 @@ class SlabTestbedAPI(): def __add_person_to_db(user_dict): """ Add a federated user straight to db when the user issues a lease - request with senslab nodes and that he has not registered with senslab + request with iotlab nodes and that he has not registered with iotlab yet (that is he does not have a LDAP entry yet). Uses parts of the routines in SlabImport when importing user from LDAP. Called by AddPerson, right after LdapAddUser. @@ -547,7 +547,7 @@ class SlabTestbedAPI(): if ret['bool'] is True: record['hrn'] = self.root_auth + '.' + ret['uid'] - logger.debug("SLABDRIVER AddPerson return code %s record %s \r\n "\ + logger.debug("IOTLABDRIVER AddPerson return code %s record %s \r\n "\ %(ret, record)) self.__add_person_to_db(record) return ret['uid'] @@ -559,10 +559,10 @@ class SlabTestbedAPI(): #TODO AddPersonKey 04/07/2012 SA def AddPersonKey(self, person_uid, old_attributes_dict, new_key_dict): """Adds a new key to the specified account. Adds the key to the - senslab ldap, provided that the person_uid is valid. + iotlab ldap, provided that the person_uid is valid. Non-admins can only modify their own keys. - :param person_uid: user's senslab login in LDAP + :param person_uid: user's iotlab login in LDAP :param old_attributes_dict: dict with the user's old sshPublicKey :param new_key_dict:dict with the user's new sshPublicKey :type person_uid: string @@ -574,7 +574,7 @@ class SlabTestbedAPI(): """ ret = self.ldap.LdapModify(person_uid, old_attributes_dict, \ new_key_dict) - logger.warning("SLABDRIVER AddPersonKey EMPTY - DO NOTHING \r\n ") + logger.warning("IOTLABDRIVER AddPersonKey EMPTY - DO NOTHING \r\n ") return ret['bool'] def DeleteLeases(self, leases_id_list, slice_hrn ): @@ -591,7 +591,7 @@ class SlabTestbedAPI(): way to handle failure when dealing with multiple job delete. Plus, there was no easy way to report it to the user. """ - logger.debug("SLABDRIVER DeleteLeases leases_id_list %s slice_hrn %s \ + logger.debug("IOTLABDRIVER DeleteLeases leases_id_list %s slice_hrn %s \ \r\n " %(leases_id_list, slice_hrn)) for job_id in leases_id_list: self.DeleteJobs(job_id, slice_hrn) @@ -664,7 +664,7 @@ class SlabTestbedAPI(): walltime, sleep_walltime = \ - SlabTestbedAPI._process_walltime(\ + IotlabTestbedAPI._process_walltime(\ int(lease_dict['lease_duration'])) @@ -714,21 +714,21 @@ class SlabTestbedAPI(): lease_dict['time_format'] = self.time_format - logger.debug("SLABDRIVER.PY \tLaunchExperimentOnOAR slice_user %s\ + logger.debug("IOTLABDRIVER.PY \tLaunchExperimentOnOAR slice_user %s\ \r\n " %(slice_user)) #Create the request for OAR reqdict = self._create_job_structure_request_for_OAR(lease_dict) # first step : start the OAR job and update the job - logger.debug("SLABDRIVER.PY \tLaunchExperimentOnOAR reqdict %s\ + logger.debug("IOTLABDRIVER.PY \tLaunchExperimentOnOAR reqdict %s\ \r\n " %(reqdict)) answer = self.oar.POSTRequestToOARRestAPI('POST_job', \ reqdict, slice_user) - logger.debug("SLABDRIVER \tLaunchExperimentOnOAR jobid %s " %(answer)) + logger.debug("IOTLABDRIVER \tLaunchExperimentOnOAR jobid %s " %(answer)) try: jobid = answer['id'] except KeyError: - logger.log_exc("SLABDRIVER \tLaunchExperimentOnOAR \ + logger.log_exc("IOTLABDRIVER \tLaunchExperimentOnOAR \ Impossible to create job %s " %(answer)) return None @@ -736,7 +736,7 @@ class SlabTestbedAPI(): if jobid : - logger.debug("SLABDRIVER \tLaunchExperimentOnOAR jobid %s \ + logger.debug("IOTLABDRIVER \tLaunchExperimentOnOAR jobid %s \ added_nodes %s slice_user %s" %(jobid, added_nodes, \ slice_user)) @@ -748,7 +748,7 @@ class SlabTestbedAPI(): lease_start_time, lease_duration): """Creates a job in OAR corresponding to the information provided - as parameters. Adds the job id and the slice hrn in the senslab + as parameters. Adds the job id and the slice hrn in the iotlab database so that we are able to know which slice has which nodes. :param hostname_list: list of nodes' OAR hostnames. @@ -762,7 +762,7 @@ class SlabTestbedAPI(): :type lease_duration: integer """ - logger.debug("SLABDRIVER \r\n \r\n \t AddLeases hostname_list %s \ + logger.debug("IOTLABDRIVER \r\n \r\n \t AddLeases hostname_list %s \ slice_record %s lease_start_time %s lease_duration %s "\ %( hostname_list, slice_record , lease_start_time, \ lease_duration)) @@ -780,28 +780,28 @@ class SlabTestbedAPI(): end_time = lease_start_time + lease_duration - logger.debug("SLABDRIVER \r\n \r\n \t AddLeases TURN ON LOGGING SQL \ + logger.debug("IOTLABDRIVER \r\n \r\n \t AddLeases TURN ON LOGGING SQL \ %s %s %s "%(slice_record['hrn'], job_id, end_time)) - logger.debug("SLABDRIVER \r\n \r\n \t AddLeases %s %s %s " \ + logger.debug("IOTLABDRIVER \r\n \r\n \t AddLeases %s %s %s " \ %(type(slice_record['hrn']), type(job_id), type(end_time))) - slab_ex_row = SenslabXP(slice_hrn = slice_record['hrn'], \ + iotlab_ex_row = IotlabXP(slice_hrn = slice_record['hrn'], \ job_id = job_id, end_time= end_time) - logger.debug("SLABDRIVER \r\n \r\n \t AddLeases slab_ex_row %s" \ - %(slab_ex_row)) - slab_dbsession.add(slab_ex_row) - slab_dbsession.commit() + logger.debug("IOTLABDRIVER \r\n \r\n \t AddLeases iotlab_ex_row %s" \ + %(iotlab_ex_row)) + iotlab_dbsession.add(iotlab_ex_row) + iotlab_dbsession.commit() - logger.debug("SLABDRIVER \t AddLeases hostname_list start_time %s " \ + logger.debug("IOTLABDRIVER \t AddLeases hostname_list start_time %s " \ %(start_time)) return - #Delete the jobs from job_senslab table + #Delete the jobs from job_iotlab table def DeleteSliceFromNodes(self, slice_record): """ Deletes all the running or scheduled jobs of a given slice given its record. @@ -812,7 +812,7 @@ class SlabTestbedAPI(): False, for each job id. :rtype: dict """ - logger.debug("SLABDRIVER \t DeleteSliceFromNodese %s " %(slice_record)) + logger.debug("IOTLABDRIVER \t DeleteSliceFromNodese %s " %(slice_record)) if isinstance(slice_record['oar_job_id'], list): oar_bool_answer = {} @@ -830,7 +830,7 @@ class SlabTestbedAPI(): def GetLeaseGranularity(self): - """ Returns the granularity of an experiment in the Senslab testbed. + """ Returns the granularity of an experiment in the Iotlab testbed. OAR uses seconds for experiments duration , the granulaity is also defined in seconds. Experiments which last less than 10 min (600 sec) are invalid""" @@ -838,8 +838,8 @@ class SlabTestbedAPI(): @staticmethod - def update_jobs_in_slabdb( job_oar_list, jobs_psql): - """ Cleans the slab db by deleting expired and cancelled jobs. + def update_jobs_in_iotlabdb( job_oar_list, jobs_psql): + """ Cleans the iotlab db by deleting expired and cancelled jobs. Compares the list of job ids given by OAR with the job ids that are already in the database, deletes the jobs that are no longer in the OAR job id list. @@ -852,13 +852,13 @@ class SlabTestbedAPI(): set_jobs_psql = set(jobs_psql) kept_jobs = set(job_oar_list).intersection(set_jobs_psql) - logger.debug ( "\r\n \t\ update_jobs_in_slabdb jobs_psql %s \r\n \t \ + logger.debug ( "\r\n \t\ update_jobs_in_iotlabdb jobs_psql %s \r\n \t \ job_oar_list %s kept_jobs %s "%(set_jobs_psql, job_oar_list, kept_jobs)) deleted_jobs = set_jobs_psql.difference(kept_jobs) deleted_jobs = list(deleted_jobs) if len(deleted_jobs) > 0: - slab_dbsession.query(SenslabXP).filter(SenslabXP.job_id.in_(deleted_jobs)).delete(synchronize_session='fetch') - slab_dbsession.commit() + iotlab_dbsession.query(IotlabXP).filter(IotlabXP.job_id.in_(deleted_jobs)).delete(synchronize_session='fetch') + iotlab_dbsession.commit() return @@ -870,9 +870,9 @@ class SlabTestbedAPI(): Two purposes: -Fetch all the jobs from OAR (running, waiting..) complete the reservation information with slice hrn - found in slabxp table. If not available in the table, - assume it is a senslab slice. - -Updates the slab table, deleting jobs when necessary. + found in iotlab_xp table. If not available in the table, + assume it is a iotlab slice. + -Updates the iotlab table, deleting jobs when necessary. :return: reservation_list, list of dictionaries with 'lease_id', 'reserved_nodes','slice_id', 'state', 'user', 'component_id_list', 'slice_hrn', 'resource_ids', 't_from', 't_until' @@ -882,24 +882,24 @@ class SlabTestbedAPI(): unfiltered_reservation_list = self.GetReservedNodes(login) reservation_list = [] - #Find the slice associated with this user senslab ldap uid - logger.debug(" SLABDRIVER.PY \tGetLeases login %s\ + #Find the slice associated with this user iotlab ldap uid + logger.debug(" IOTLABDRIVER.PY \tGetLeases login %s\ unfiltered_reservation_list %s " %(login, unfiltered_reservation_list)) #Create user dict first to avoid looking several times for #the same user in LDAP SA 27/07/12 job_oar_list = [] - jobs_psql_query = slab_dbsession.query(SenslabXP).all() + jobs_psql_query = iotlab_dbsession.query(IotlabXP).all() jobs_psql_dict = dict([(row.job_id, row.__dict__ ) for row in jobs_psql_query ]) #jobs_psql_dict = jobs_psql_dict) - logger.debug("SLABDRIVER \tGetLeases jobs_psql_dict %s"\ + logger.debug("IOTLABDRIVER \tGetLeases jobs_psql_dict %s"\ %(jobs_psql_dict)) jobs_psql_id_list = [ row.job_id for row in jobs_psql_query ] for resa in unfiltered_reservation_list: - logger.debug("SLABDRIVER \tGetLeases USER %s"\ + logger.debug("IOTLABDRIVER \tGetLeases USER %s"\ %(resa['user'])) #Construct list of jobs (runing, waiting..) in oar job_oar_list.append(resa['lease_id']) @@ -907,12 +907,12 @@ class SlabTestbedAPI(): #(slice used and job id) if resa['lease_id'] in jobs_psql_dict: job_info = jobs_psql_dict[resa['lease_id']] - logger.debug("SLABDRIVER \tGetLeases job_info %s"\ + logger.debug("IOTLABDRIVER \tGetLeases job_info %s"\ %(job_info)) resa['slice_hrn'] = job_info['slice_hrn'] resa['slice_id'] = hrn_to_urn(resa['slice_hrn'], 'slice') - #otherwise, assume it is a senslab slice: + #otherwise, assume it is a iotlab slice: else: resa['slice_id'] = hrn_to_urn(self.root_auth+'.'+ \ resa['user'] +"_slice" , 'slice') @@ -922,11 +922,11 @@ class SlabTestbedAPI(): #Transform the hostnames into urns (component ids) for node in resa['reserved_nodes']: - slab_xrn = slab_xrn_object(self.root_auth, node) - resa['component_id_list'].append(slab_xrn.urn) + iotlab_xrn = iotlab_xrn_object(self.root_auth, node) + resa['component_id_list'].append(iotlab_xrn.urn) if lease_filter_dict: - logger.debug("SLABDRIVER \tGetLeases resa_ %s \ + logger.debug("IOTLABDRIVER \tGetLeases resa_ %s \ \r\n leasefilter %s" %(resa, lease_filter_dict)) if lease_filter_dict['name'] == resa['slice_hrn']: @@ -936,9 +936,9 @@ class SlabTestbedAPI(): reservation_list = unfiltered_reservation_list - self.update_jobs_in_slabdb(job_oar_list, jobs_psql_id_list) + self.update_jobs_in_iotlabdb(job_oar_list, jobs_psql_id_list) - logger.debug(" SLABDRIVER.PY \tGetLeases reservation_list %s"\ + logger.debug(" IOTLABDRIVER.PY \tGetLeases reservation_list %s"\ %(reservation_list)) return reservation_list @@ -966,7 +966,7 @@ class SlabTestbedAPI(): #FROM PLC DOC #""" - #logger.warning("SLABDRIVER \tUnBindObjectFromPeer EMPTY-\ + #logger.warning("IOTLABDRIVER \tUnBindObjectFromPeer EMPTY-\ #DO NOTHING \r\n ") #return @@ -985,11 +985,11 @@ class SlabTestbedAPI(): #FROM PLC API DOC #""" - #logger.warning("SLABDRIVER \tBindObjectToPeer EMPTY - DO NOTHING \r\n ") + #logger.warning("IOTLABDRIVER \tBindObjectToPeer EMPTY - DO NOTHING \r\n ") #return ##TODO UpdateSlice 04/07/2012 SA || Commented out 28/05/13 SA - ##Funciton should delete and create another job since oin senslab slice=job + ##Funciton should delete and create another job since oin iotlab slice=job #def UpdateSlice(self, auth, slice_id_or_name, slice_fields=None): #"""Updates the parameters of an existing slice with the values in #slice_fields. @@ -1002,12 +1002,12 @@ class SlabTestbedAPI(): #FROM PLC API DOC #""" - #logger.warning("SLABDRIVER UpdateSlice EMPTY - DO NOTHING \r\n ") + #logger.warning("IOTLABDRIVER UpdateSlice EMPTY - DO NOTHING \r\n ") #return #Unused SA 30/05/13, we only update the user's key or we delete it. ##TODO UpdatePerson 04/07/2012 SA - #def UpdatePerson(self, slab_hrn, federated_hrn, person_fields=None): + #def UpdatePerson(self, iotlab_hrn, federated_hrn, person_fields=None): #"""Updates a person. Only the fields specified in person_fields #are updated, all other fields are left untouched. #Users and techs can only update themselves. PIs can only update @@ -1016,11 +1016,11 @@ class SlabTestbedAPI(): #FROM PLC API DOC #""" - ##new_row = FederatedToSenslab(slab_hrn, federated_hrn) - ##slab_dbsession.add(new_row) - ##slab_dbsession.commit() + ##new_row = FederatedToIotlab(iotlab_hrn, federated_hrn) + ##iotlab_dbsession.add(new_row) + ##iotlab_dbsession.commit() - #logger.debug("SLABDRIVER UpdatePerson EMPTY - DO NOTHING \r\n ") + #logger.debug("IOTLABDRIVER UpdatePerson EMPTY - DO NOTHING \r\n ") #return @staticmethod @@ -1051,7 +1051,7 @@ class SlabTestbedAPI(): #user_by_email = dict((user[1]['mail'][0], user[1]['sshPublicKey']) \ #for user in ldap_rslt) - logger.debug("SLABDRIVER GetKeys -key_dict %s \r\n " %(key_dict)) + logger.debug("IOTLABDRIVER GetKeys -key_dict %s \r\n " %(key_dict)) return key_dict #TODO : test @@ -1071,7 +1071,7 @@ class SlabTestbedAPI(): all_user_keys.remove(key_string) new_attributes = {'sshPublicKey':all_user_keys} ret = self.ldap.LdapModifyUser(user_record, new_attributes) - logger.debug("SLABDRIVER DeleteKey %s- "%(ret)) + logger.debug("IOTLABDRIVER DeleteKey %s- "%(ret)) return ret['bool'] @@ -1093,7 +1093,7 @@ class SlabTestbedAPI(): #of the user otherwise will mess up the RegRecord in #Resolve, don't know why - SA 08/08/2012 - #Only one entry for one user = one slice in slab_xp table + #Only one entry for one user = one slice in iotlab_xp table #slicerec = dbsession.query(RegRecord).filter_by(hrn = slice_filter).first() raw_slicerec = dbsession.query(RegSlice).options(joinedload('reg_researchers')).filter_by(hrn = slice_filter).first() #raw_slicerec = dbsession.query(RegRecord).filter_by(hrn = slice_filter).first() @@ -1101,7 +1101,7 @@ class SlabTestbedAPI(): #load_reg_researcher #raw_slicerec.reg_researchers raw_slicerec = raw_slicerec.__dict__ - logger.debug(" SLABDRIVER \t get_slice_info slice_filter %s \ + logger.debug(" IOTLABDRIVER \t get_slice_info slice_filter %s \ raw_slicerec %s"%(slice_filter, raw_slicerec)) slicerec = raw_slicerec #only one researcher per slice so take the first one @@ -1187,7 +1187,7 @@ class SlabTestbedAPI(): #At this point if there is no login it means #record_id_user filter has been used for filtering #if login is None : - ##If theslice record is from senslab + ##If theslice record is from iotlab #if fixed_slicerec_dict['peer_authority'] is None: #login = fixed_slicerec_dict['hrn'].split(".")[1].split("_")[0] #return login, fixed_slicerec_dict @@ -1197,7 +1197,7 @@ class SlabTestbedAPI(): def GetSlices(self, slice_filter = None, slice_filter_type = None, \ login=None): - """ Get the slice records from the slab db and add lease information + """ Get the slice records from the iotlab db and add lease information if any. :param slice_filter: can be the slice hrn or slice record id in the db @@ -1223,7 +1223,7 @@ class SlabTestbedAPI(): self._get_slice_records(slice_filter, slice_filter_type) slice_hrn = fixed_slicerec_dict['hrn'] - logger.debug(" SLABDRIVER \tGetSlices login %s \ + logger.debug(" IOTLABDRIVER \tGetSlices login %s \ slice record %s slice_filter %s \ slice_filter_type %s " %(login, \ fixed_slicerec_dict, slice_filter, \ @@ -1246,7 +1246,7 @@ class SlabTestbedAPI(): for lease in leases_list : slicerec_dict = {} - logger.debug("SLABDRIVER.PY \tGetSlices slice_filter %s \ + logger.debug("IOTLABDRIVER.PY \tGetSlices slice_filter %s \ \ lease['slice_hrn'] %s" \ %(slice_filter, lease['slice_hrn'])) if lease['slice_hrn'] == slice_hrn: @@ -1266,16 +1266,16 @@ class SlabTestbedAPI(): #str(fixed_slicerec_dict['slice_hrn'])}) return_slicerec_dictlist.append(slicerec_dict) - logger.debug("SLABDRIVER.PY \tGetSlices \ + logger.debug("IOTLABDRIVER.PY \tGetSlices \ OHOHOHOH %s" %(return_slicerec_dictlist )) - logger.debug("SLABDRIVER.PY \tGetSlices \ + logger.debug("IOTLABDRIVER.PY \tGetSlices \ slicerec_dict %s return_slicerec_dictlist %s \ lease['reserved_nodes'] \ %s" %(slicerec_dict, return_slicerec_dictlist, \ lease['reserved_nodes'] )) - logger.debug("SLABDRIVER.PY \tGetSlices RETURN \ + logger.debug("IOTLABDRIVER.PY \tGetSlices RETURN \ return_slicerec_dictlist %s" \ %(return_slicerec_dictlist)) @@ -1283,7 +1283,7 @@ class SlabTestbedAPI(): else: - #Get all slices from the senslab sfa database , + #Get all slices from the iotlab sfa database , #put them in dict format #query_slice_list = dbsession.query(RegRecord).all() query_slice_list = dbsession.query(RegSlice).options(joinedload('reg_researchers')).all() @@ -1301,7 +1301,7 @@ class SlabTestbedAPI(): for fixed_slicerec_dict in return_slicerec_dictlist: slicerec_dict = {} - #Check if the slice belongs to a senslab user + #Check if the slice belongs to a iotlab user if fixed_slicerec_dict['peer_authority'] is None: owner = fixed_slicerec_dict['hrn'].split(".")[1].split("_")[0] else: @@ -1311,7 +1311,7 @@ class SlabTestbedAPI(): slicerec_dict['oar_job_id'] = lease['lease_id'] #for reserved_node in lease['reserved_nodes']: - logger.debug("SLABDRIVER.PY \tGetSlices lease %s "\ + logger.debug("IOTLABDRIVER.PY \tGetSlices lease %s "\ %(lease )) slicerec_dict.update({'node_ids':lease['reserved_nodes']}) @@ -1322,7 +1322,7 @@ class SlabTestbedAPI(): #return_slicerec_dictlist.append(slicerec_dict) fixed_slicerec_dict.update(slicerec_dict) - logger.debug("SLABDRIVER.PY \tGetSlices RETURN \ + logger.debug("IOTLABDRIVER.PY \tGetSlices RETURN \ return_slicerec_dictlist %s \slice_filter %s " \ %(return_slicerec_dictlist, slice_filter)) @@ -1330,60 +1330,60 @@ class SlabTestbedAPI(): - #Update slice unused, therefore sfa_fields_to_slab_fields unused + #Update slice unused, therefore sfa_fields_to_iotlab_fields unused #SA 30/05/13 #@staticmethod - #def sfa_fields_to_slab_fields(sfa_type, hrn, record): + #def sfa_fields_to_iotlab_fields(sfa_type, hrn, record): #""" #""" - #slab_record = {} + #iotlab_record = {} ##for field in record: - ## slab_record[field] = record[field] + ## iotlab_record[field] = record[field] #if sfa_type == "slice": ##instantion used in get_slivers ? - #if not "instantiation" in slab_record: - #slab_record["instantiation"] = "senslab-instantiated" - ##slab_record["hrn"] = hrn_to_pl_slicename(hrn) + #if not "instantiation" in iotlab_record: + #iotlab_record["instantiation"] = "iotlab-instantiated" + ##iotlab_record["hrn"] = hrn_to_pl_slicename(hrn) ##Unused hrn_to_pl_slicename because Slab's hrn already ##in the appropriate form SA 23/07/12 - #slab_record["hrn"] = hrn - #logger.debug("SLABDRIVER.PY sfa_fields_to_slab_fields \ - #slab_record %s " %(slab_record['hrn'])) + #iotlab_record["hrn"] = hrn + #logger.debug("IOTLABDRIVER.PY sfa_fields_to_iotlab_fields \ + #iotlab_record %s " %(iotlab_record['hrn'])) #if "url" in record: - #slab_record["url"] = record["url"] + #iotlab_record["url"] = record["url"] #if "description" in record: - #slab_record["description"] = record["description"] + #iotlab_record["description"] = record["description"] #if "expires" in record: - #slab_record["expires"] = int(record["expires"]) + #iotlab_record["expires"] = int(record["expires"]) ##nodes added by OAR only and then imported to SFA ##elif type == "node": - ##if not "hostname" in slab_record: + ##if not "hostname" in iotlab_record: ##if not "hostname" in record: ##raise MissingSfaInfo("hostname") - ##slab_record["hostname"] = record["hostname"] - ##if not "model" in slab_record: - ##slab_record["model"] = "geni" + ##iotlab_record["hostname"] = record["hostname"] + ##if not "model" in iotlab_record: + ##iotlab_record["model"] = "geni" ##One authority only ##elif type == "authority": - ##slab_record["login_base"] = hrn_to_slab_login_base(hrn) + ##iotlab_record["login_base"] = hrn_to_iotlab_login_base(hrn) - ##if not "name" in slab_record: - ##slab_record["name"] = hrn + ##if not "name" in iotlab_record: + ##iotlab_record["name"] = hrn - ##if not "abbreviated_name" in slab_record: - ##slab_record["abbreviated_name"] = hrn + ##if not "abbreviated_name" in iotlab_record: + ##iotlab_record["abbreviated_name"] = hrn - ##if not "enabled" in slab_record: - ##slab_record["enabled"] = True + ##if not "enabled" in iotlab_record: + ##iotlab_record["enabled"] = True - ##if not "is_public" in slab_record: - ##slab_record["is_public"] = True + ##if not "is_public" in iotlab_record: + ##iotlab_record["is_public"] = True - #return slab_record + #return iotlab_record diff --git a/sfa/senslab/slabdriver.py b/sfa/iotlab/iotlabdriver.py similarity index 82% rename from sfa/senslab/slabdriver.py rename to sfa/iotlab/iotlabdriver.py index b37f8b3b..84baa2b1 100644 --- a/sfa/senslab/slabdriver.py +++ b/sfa/iotlab/iotlabdriver.py @@ -12,19 +12,19 @@ from sfa.rspecs.rspec import RSpec from sfa.util.xrn import Xrn, hrn_to_urn, get_authority -from sfa.senslab.slabpostgres import SlabDB +from sfa.iotlab.iotlabpostgres import IotlabDB -from sfa.senslab.slabaggregate import SlabAggregate, slab_xrn_to_hostname +from sfa.iotlab.iotlabaggregate import IotlabAggregate, iotlab_xrn_to_hostname -from sfa.senslab.slabslices import SlabSlices +from sfa.iotlab.iotlabslices import IotlabSlices -from sfa.senslab.slabapi import SlabTestbedAPI +from sfa.iotlab.iotlabapi import IotlabTestbedAPI -class SlabDriver(Driver): - """ Senslab Driver class inherited from Driver generic class. +class IotlabDriver(Driver): + """ Iotlab Driver class inherited from Driver generic class. Contains methods compliant with the SFA standard and the testbed infrastructure (calls to LDAP and OAR). @@ -35,17 +35,17 @@ class SlabDriver(Driver): def __init__(self, config): """ - Sets the senslab SFA config parameters , - instanciates the testbed api and the senslab database. + Sets the iotlab SFA config parameters , + instanciates the testbed api and the iotlab database. - :param config: senslab SFA configuration object + :param config: iotlab SFA configuration object :type config: Config object """ Driver.__init__ (self, config) self.config = config - self.db = SlabDB(config, debug = False) - self.slab_api = SlabTestbedAPI(config) + self.db = IotlabDB(config, debug = False) + self.iotlab_api = IotlabTestbedAPI(config) self.cache = None def augment_records_with_testbed_info (self, record_list ): @@ -62,7 +62,7 @@ class SlabDriver(Driver): def fill_record_info(self, record_list): """ - For each SFA record, fill in the senslab specific and SFA specific + For each SFA record, fill in the iotlab specific and SFA specific fields in the record. :param record_list: list of sfa dictionaries records @@ -75,7 +75,7 @@ class SlabDriver(Driver): other way to do it given the way it's called in registry manager. """ - logger.debug("SLABDRIVER \tfill_record_info records %s " %(record_list)) + logger.debug("IOTLABDRIVER \tfill_record_info records %s " %(record_list)) if not isinstance(record_list, list): record_list = [record_list] @@ -84,7 +84,7 @@ class SlabDriver(Driver): for record in record_list: #If the record is a SFA slice record, then add information #about the user of this slice. This kind of - #information is in the Senslab's DB. + #information is in the Iotlab's DB. if str(record['type']) == 'slice': if 'reg_researchers' in record and \ isinstance(record['reg_researchers'], list) : @@ -101,41 +101,41 @@ class SlabDriver(Driver): 'key_ids':''}) #For client_helper.py compatibility - #Get slab slice record and oar job id if any. - recslice_list = self.slab_api.GetSlices(slice_filter = \ + #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') - logger.debug("SLABDRIVER \tfill_record_info \ + logger.debug("IOTLABDRIVER \tfill_record_info \ TYPE SLICE RECUSER record['hrn'] %s ecord['oar_job_id']\ %s " %(record['hrn'], record['oar_job_id'])) del record['reg_researchers'] try: for rec in recslice_list: - logger.debug("SLABDRIVER\r\n \t \ + logger.debug("IOTLABDRIVER\r\n \t \ fill_record_info oar_job_id %s " \ %(rec['oar_job_id'])) - record['node_ids'] = [ self.slab_api.root_auth + \ + record['node_ids'] = [ self.iotlab_api.root_auth + \ hostname for hostname in rec['node_ids']] except KeyError: pass - logger.debug( "SLABDRIVER.PY \t fill_record_info SLICE \ + logger.debug( "IOTLABDRIVER.PY \t fill_record_info SLICE \ recslice_list %s \r\n \t RECORD %s \r\n \ \r\n" %(recslice_list, record)) if str(record['type']) == 'user': #The record is a SFA user record. - #Get the information about his slice from Senslab's DB + #Get the information about his slice from Iotlab's DB #and add it to the user record. - recslice_list = self.slab_api.GetSlices(\ + recslice_list = self.iotlab_api.GetSlices(\ slice_filter = record['record_id'],\ slice_filter_type = 'record_id_user') - logger.debug( "SLABDRIVER.PY \t fill_record_info TYPE 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, @@ -143,7 +143,7 @@ class SlabDriver(Driver): #Will update PIs and researcher for the slice recuser = recslice_list[0]['reg_researchers'] - logger.debug( "SLABDRIVER.PY \t fill_record_info USER \ + logger.debug( "IOTLABDRIVER.PY \t fill_record_info USER \ recuser %s \r\n \r\n" %(recuser)) recslice = {} recslice = recslice_list[0] @@ -164,22 +164,22 @@ class SlabDriver(Driver): #GetPersons takes [] as filters - user_slab = self.slab_api.GetPersons([record]) + user_iotlab = self.iotlab_api.GetPersons([record]) - record.update(user_slab[0]) + record.update(user_iotlab[0]) #For client_helper.py compatibility record.update( { 'geni_urn':'', 'keys':'', 'key_ids':'' }) record_list.append(recslice) - logger.debug("SLABDRIVER.PY \tfill_record_info ADDING SLICE\ + logger.debug("IOTLABDRIVER.PY \tfill_record_info ADDING SLICE\ INFO TO USER records %s" %(record_list)) except TypeError, error: - logger.log_exc("SLABDRIVER \t fill_record_info EXCEPTION %s"\ + logger.log_exc("IOTLABDRIVER \t fill_record_info EXCEPTION %s"\ %(error)) return record_list @@ -188,7 +188,7 @@ class SlabDriver(Driver): def sliver_status(self, slice_urn, slice_hrn): """ Receive a status request for slice named urn/hrn - urn:publicid:IDN+senslab+nturro_slice hrn senslab.nturro_slice + 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. @@ -202,7 +202,7 @@ class SlabDriver(Driver): #First get the slice with the slice hrn - slice_list = self.slab_api.GetSlices(slice_filter = slice_hrn, \ + slice_list = self.iotlab_api.GetSlices(slice_filter = slice_hrn, \ slice_filter_type = 'slice_hrn') if len(slice_list) is 0: @@ -221,7 +221,7 @@ class SlabDriver(Driver): #slice_nodes_list.append(node['hostname']) slice_nodes_list = one_slice['node_ids'] #Get all the corresponding nodes details - nodes_all = self.slab_api.GetNodes({'hostname':slice_nodes_list}, + 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]) @@ -248,7 +248,7 @@ class SlabDriver(Driver): top_level_status = 'ready' - #A job is running on Senslab for this slice + #A job is running on Iotlab for this slice # report about the local nodes that are in the slice only result['geni_urn'] = slice_urn @@ -256,8 +256,8 @@ class SlabDriver(Driver): resources = [] for node_hostname in single_slice['node_ids']: res = {} - res['slab_hostname'] = node_hostname - res['slab_boot_state'] = nodeall_byhostname[node_hostname]['boot_state'] + res['iotlab_hostname'] = node_hostname + res['iotlab_boot_state'] = nodeall_byhostname[node_hostname]['boot_state'] #res['pl_hostname'] = node['hostname'] #res['pl_boot_state'] = \ @@ -283,7 +283,7 @@ class SlabDriver(Driver): result['geni_status'] = top_level_status result['geni_resources'] = resources - logger.debug("SLABDRIVER \tsliver_statusresources %s res %s "\ + logger.debug("IOTLABDRIVER \tsliver_statusresources %s res %s "\ %(resources,res)) return result @@ -340,7 +340,7 @@ class SlabDriver(Driver): 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 senslab experiment minimum duration). + to the iotlab experiment minimum duration). :param rspec: rspec request received. :type rspec: RSpec @@ -350,13 +350,13 @@ class SlabDriver(Driver): requested_lease_list = [] for lease in rspec.version.get_leases(): single_requested_lease = {} - logger.debug("SLABDRIVER.PY \t_get_requested_leases_list lease %s " %(lease)) + 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.slab_api.root_auth: + self.iotlab_api.root_auth: single_requested_lease['hostname'] = \ - slab_xrn_to_hostname(\ + iotlab_xrn_to_hostname(\ lease.get('component_id').strip()) single_requested_lease['start_time'] = \ lease.get('start_time') @@ -365,7 +365,7 @@ class SlabDriver(Driver): #the lease to the requested leases list duration_in_seconds = \ int(single_requested_lease['duration']) - if duration_in_seconds >= self.slab_api.GetMinExperimentDurationInSec() : + if duration_in_seconds >= self.iotlab_api.GetMinExperimentDurationInSec() : requested_lease_list.append(single_requested_lease) return requested_lease_list @@ -415,10 +415,10 @@ class SlabDriver(Driver): :rtype: dictionary """ requested_lease_list = self._get_requested_leases_list(rspec) - logger.debug("SLABDRIVER _process_requested_jobs requested_lease_list \ + 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("SLABDRIVER _process_requested_jobs job_dict\ + logger.debug("IOTLABDRIVER _process_requested_jobs job_dict\ %s"%(job_dict)) return job_dict @@ -446,9 +446,9 @@ class SlabDriver(Driver): """ - aggregate = SlabAggregate(self) + aggregate = IotlabAggregate(self) - slices = SlabSlices(self) + slices = IotlabSlices(self) peer = slices.get_peer(slice_hrn) sfa_peer = slices.get_sfa_peer(slice_hrn) slice_record = None @@ -458,7 +458,7 @@ class SlabDriver(Driver): if users: slice_record = users[0].get('slice_record', {}) - logger.debug("SLABDRIVER.PY \t ===============create_sliver \t\ + logger.debug("IOTLABDRIVER.PY \t ===============create_sliver \t\ creds %s \r\n \r\n users %s" \ %(creds, users)) slice_record['user'] = {'keys':users[0]['keys'], \ @@ -466,7 +466,7 @@ class SlabDriver(Driver): 'hrn':slice_record['reg-researchers'][0]} # parse rspec rspec = RSpec(rspec_string) - logger.debug("SLABDRIVER.PY \t create_sliver \trspec.version \ + logger.debug("IOTLABDRIVER.PY \t create_sliver \trspec.version \ %s slice_record %s users %s" \ %(rspec.version,slice_record, users)) @@ -486,13 +486,13 @@ class SlabDriver(Driver): #unused, removed SA 13/08/12 #rspec.version.get_slice_attributes() - logger.debug("SLABDRIVER.PY create_sliver slice %s " %(sfa_slice)) + logger.debug("IOTLABDRIVER.PY create_sliver slice %s " %(sfa_slice)) # add/remove slice from nodes #requested_slivers = [node.get('component_id') \ #for node in rspec.version.get_nodes_with_slivers()\ - #if node.get('authority_id') is self.slab_api.root_auth] + #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" \ @@ -504,7 +504,7 @@ class SlabDriver(Driver): requested_job_dict = self._process_requested_jobs(rspec) - logger.debug("SLABDRIVER.PY \tcreate_sliver requested_job_dict %s "\ + 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 @@ -518,17 +518,17 @@ class SlabDriver(Driver): def delete_sliver (self, slice_urn, slice_hrn, creds, options): """ Deletes the lease associated with the slice hrn and the credentials - if the slice belongs to senslab. Answer to DeleteSliver. + if the slice belongs to iotlab. Answer to DeleteSliver. - :return: 1 if the slice to delete was not found on senslab, + :return: 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 + .. 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 """ - sfa_slice_list = self.slab_api.GetSlices(slice_filter = slice_hrn, \ + sfa_slice_list = self.iotlab_api.GetSlices(slice_filter = slice_hrn, \ slice_filter_type = 'slice_hrn') if not sfa_slice_list: @@ -538,17 +538,17 @@ class SlabDriver(Driver): for sfa_slice in sfa_slice_list: - logger.debug("SLABDRIVER.PY delete_sliver slice %s" %(sfa_slice)) - slices = SlabSlices(self) + logger.debug("IOTLABDRIVER.PY delete_sliver slice %s" %(sfa_slice)) + slices = IotlabSlices(self) # determine if this is a peer slice peer = slices.get_peer(slice_hrn) - logger.debug("SLABDRIVER.PY delete_sliver peer %s \ + logger.debug("IOTLABDRIVER.PY delete_sliver peer %s \ \r\n \t sfa_slice %s " %(peer, sfa_slice)) try: - self.slab_api.DeleteSliceFromNodes(sfa_slice) + self.iotlab_api.DeleteSliceFromNodes(sfa_slice) return True except : return False @@ -556,7 +556,7 @@ class SlabDriver(Driver): def list_resources (self, slice_urn, slice_hrn, creds, options): """ - List resources from the senslab aggregate and returns a Rspec + List resources from the iotlab aggregate and returns a Rspec 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 @@ -595,12 +595,12 @@ class SlabDriver(Driver): #if cached_requested and self.cache and not slice_hrn: #rspec = self.cache.get(version_string) #if rspec: - #logger.debug("SlabDriver.ListResources: \ + #logger.debug("IotlabDriver.ListResources: \ #returning cached advertisement") #return rspec #panos: passing user-defined options - aggregate = SlabAggregate(self) + aggregate = IotlabAggregate(self) rspec = aggregate.get_rspec(slice_xrn=slice_urn, \ version=rspec_version, options=options) @@ -616,7 +616,7 @@ class SlabDriver(Driver): def list_slices (self, creds, options): """ Answer to ListSlices. - List slices belonging to senslab, returns slice urns list. + List slices belonging to iotlab, returns slice urns list. No caching used. Options unused but are defined in the SFA method api prototype. @@ -633,16 +633,16 @@ class SlabDriver(Driver): # get data from db - 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] + slices = self.iotlab_api.GetSlices() + logger.debug("IOTLABDRIVER.PY \tlist_slices hrn %s \r\n \r\n" %(slices)) + slice_hrns = [iotlab_slice['hrn'] for iotlab_slice in slices] slice_urns = [hrn_to_urn(slice_hrn, 'slice') \ for slice_hrn in slice_hrns] # cache the result #if self.cache: - #logger.debug ("SlabDriver.list_slices stores value in cache") + #logger.debug ("IotlabDriver.list_slices stores value in cache") #self.cache.add('slices', slice_urns) return slice_urns @@ -655,7 +655,7 @@ class SlabDriver(Driver): ..warnings:: should not be used. Different components are in charge of doing this task. Adding nodes = OAR - Adding users = LDAP Senslab + Adding users = LDAP Iotlab Adding slice = Import from LDAP users Adding site = OAR @@ -667,7 +667,7 @@ class SlabDriver(Driver): def update (self, old_sfa_record, new_sfa_record, hrn, new_key): - """No site or node record update allowed in Senslab. + """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: @@ -701,11 +701,11 @@ class SlabDriver(Driver): if new_key: # must check this key against the previous one if it exists - persons = self.slab_api.GetPersons([old_sfa_record]) + persons = self.iotlab_api.GetPersons([old_sfa_record]) person = persons[0] keys = [person['pkey']] #Get all the person's keys - keys_dict = self.slab_api.GetKeys(keys) + keys_dict = self.iotlab_api.GetKeys(keys) # Delete all stale keys, meaning the user has only one key #at a time @@ -718,10 +718,10 @@ class SlabDriver(Driver): else: #remove all the other keys for key in keys_dict: - self.slab_api.DeleteKey(person, key) - self.slab_api.AddPersonKey(person, \ + self.iotlab_api.DeleteKey(person, key) + self.iotlab_api.AddPersonKey(person, \ {'sshPublicKey': person['pkey']},{'sshPublicKey': new_key} ) - #self.slab_api.AddPersonKey(person, {'key_type': 'ssh', \ + #self.iotlab_api.AddPersonKey(person, {'key_type': 'ssh', \ #'key': new_key}) return True @@ -748,19 +748,19 @@ class SlabDriver(Driver): hrn = sfa_record['hrn'] if sfa_record_type == 'user': - #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 + #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 #accesible. if person : #Mark account as disabled in ldap - return self.slab_api.DeletePerson(sfa_record) + return self.iotlab_api.DeletePerson(sfa_record) elif sfa_record_type == 'slice': - if self.slab_api.GetSlices(slice_filter = hrn, \ + if self.iotlab_api.GetSlices(slice_filter = hrn, \ slice_filter_type = 'slice_hrn'): - ret = self.slab_api.DeleteSlice(sfa_record) + ret = self.iotlab_api.DeleteSlice(sfa_record) diff --git a/sfa/senslab/slabpostgres.py b/sfa/iotlab/iotlabpostgres.py similarity index 69% rename from sfa/senslab/slabpostgres.py rename to sfa/iotlab/iotlabpostgres.py index ca217760..4e3c6df4 100644 --- a/sfa/senslab/slabpostgres.py +++ b/sfa/iotlab/iotlabpostgres.py @@ -19,20 +19,20 @@ slice_table = {'record_id_user': 'integer PRIMARY KEY references X ON DELETE \ CASCADE ON UPDATE CASCADE','oar_job_id':'integer DEFAULT -1', \ 'record_id_slice':'integer', 'slice_hrn':'text NOT NULL'} -#Dict with all the specific senslab tables -tablenames_dict = {'slab_xp': slice_table} +#Dict with all the specific iotlab tables +tablenames_dict = {'iotlab_xp': slice_table} -SlabBase = declarative_base() +IotlabBase = declarative_base() - -class SenslabXP (SlabBase): - """ SQL alchemy class to manipulate slice_senslab table in - slab_sfa database. - + +class IotlabXP (IotlabBase): + """ SQL alchemy class to manipulate slice_iotlab table in + iotlab_sfa database. + """ - __tablename__ = 'slab_xp' + __tablename__ = 'iotlab_xp' slice_hrn = Column(String) @@ -42,10 +42,10 @@ class SenslabXP (SlabBase): #oar_job_id = Column( Integer,default = -1) #node_list = Column(postgresql.ARRAY(String), nullable =True) - + def __init__ (self, slice_hrn =None, job_id=None, end_time=None): """ - Defines a row of the slice_senslab table + Defines a row of the slice_iotlab table """ if slice_hrn: self.slice_hrn = slice_hrn @@ -53,37 +53,37 @@ class SenslabXP (SlabBase): self.job_id = job_id if end_time: self.end_time = end_time - - + + def __repr__(self): """Prints the SQLAlchemy record to the format defined by the function. """ - result = " 0: network_elem = network_elems[0] @@ -23,8 +23,8 @@ class Slabv1Lease: network_elem = xml.add_element('network', name = network_urn) else: network_elem = xml - - lease_elems = [] + + lease_elems = [] for lease in leases: lease['start_time'] = datetime_to_string(utcparse(lease['start_time'])) @@ -37,7 +37,7 @@ class Slabv1Lease: def get_leases(xml, filter={}): xpath = '//lease%s | //default:lease%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter)) lease_elems = xml.xpath(xpath) - return Slabv1Lease.get_lease_objs(lease_elems) + return Iotlabv1Lease.get_lease_objs(lease_elems) @staticmethod def get_lease_objs(lease_elems): diff --git a/sfa/rspecs/elements/versions/slabv1Node.py b/sfa/rspecs/elements/versions/iotlabv1Node.py similarity index 75% rename from sfa/rspecs/elements/versions/slabv1Node.py rename to sfa/rspecs/elements/versions/iotlabv1Node.py index 0804c9b8..2535c4e1 100644 --- a/sfa/rspecs/elements/versions/slabv1Node.py +++ b/sfa/rspecs/elements/versions/iotlabv1Node.py @@ -7,52 +7,59 @@ from sfa.rspecs.elements.location import Location from sfa.rspecs.elements.hardware_type import HardwareType from sfa.rspecs.elements.element import Element from sfa.rspecs.elements.interface import Interface -from sfa.rspecs.elements.versions.slabv1Sliver import Slabv1Sliver +from sfa.rspecs.elements.versions.iotlabv1Sliver import Iotlabv1Sliver from sfa.util.sfalogging import logger +<<<<<<< HEAD:sfa/rspecs/elements/versions/slabv1Node.py class SlabNode(NodeElement): #First get the fields already defined in the class Node fields = list(NodeElement.fields) #Extend it with senslab's specific fields +======= +class IotlabNode(Node): + #First get the fields already defined in the class Node + fields = list(Node.fields) + #Extend it with iotlab's specific fields +>>>>>>> 7cb1e78... Renaming Senslab into Iotlab.:sfa/rspecs/elements/versions/iotlabv1Node.py fields.extend (['archi', 'radio', 'mobile','position']) - -class SlabPosition(Element): + +class IotlabPosition(Element): fields = ['posx', 'posy','posz'] - -class SlabLocation(Location): + +class IotlabLocation(Location): fields = list(Location.fields) fields.extend (['site']) - -class Slabv1Node: - + +class Iotlabv1Node: + @staticmethod def add_connection_information(xml, ldap_username, sites_set): - """ Adds login and ssh connection info in the network item in - the xml. Does not create the network element, therefore + """ Adds login and ssh connection info in the network item in + the xml. Does not create the network element, therefore should be used after add_nodes, which creates the network item. - + """ logger.debug(" add_connection_information " ) #Get network item in the xml - network_elems = xml.xpath('//network') + network_elems = xml.xpath('//network') if len(network_elems) > 0: network_elem = network_elems[0] - slab_network_dict = {} - slab_network_dict['login'] = ldap_username - - slab_network_dict['ssh'] = \ - ['ssh ' + ldap_username + '@'+site+'.senslab.info' \ + iotlab_network_dict = {} + iotlab_network_dict['login'] = ldap_username + + iotlab_network_dict['ssh'] = \ + ['ssh ' + ldap_username + '@'+site+'.iotlab.info' \ for site in sites_set] network_elem.set('ssh', \ - unicode(slab_network_dict['ssh'])) - network_elem.set('login', unicode( slab_network_dict['login'])) + unicode(iotlab_network_dict['ssh'])) + network_elem.set('login', unicode( iotlab_network_dict['login'])) + - @staticmethod def add_nodes(xml, nodes): #Add network item in the xml @@ -65,8 +72,8 @@ class Slabv1Node: name = Xrn(network_urn).get_hrn()) else: network_elem = xml - - logger.debug("slabv1Node \t add_nodes nodes %s \r\n "%(nodes[0])) + + logger.debug("iotlabv1Node \t add_nodes nodes %s \r\n "%(nodes[0])) node_elems = [] #Then add nodes items to the network item in the xml for node in nodes: @@ -75,19 +82,19 @@ class Slabv1Node: 'boot_state', 'mobile'] node_elem = network_elem.add_instance('node', node, node_fields) node_elems.append(node_elem) - + #Set the attibutes of this node element - for attribute in node: + for attribute in node: # set component name if attribute is 'component_id': component_name = node['component_name'] node_elem.set('component_name', component_name) - - # set hardware types, extend fields to add Senslab's architecture + + # set hardware types, extend fields to add Iotlab's architecture #and radio type - + if attribute is 'hardware_types': - for hardware_type in node.get('hardware_types', []): + for hardware_type in node.get('hardware_types', []): fields = HardwareType.fields fields.extend(['archi','radio']) node_elem.add_instance('hardware_types', node, fields) @@ -95,7 +102,7 @@ class Slabv1Node: # set location if attribute is 'location': node_elem.add_instance('location', node['location'], \ - SlabLocation.fields) + IotlabLocation.fields) # add granularity of the reservation system #TODO put the granularity in network instead SA 18/07/12 if attribute is 'granularity' : @@ -103,8 +110,8 @@ class Slabv1Node: if granularity: node_elem.add_instance('granularity', \ granularity, granularity.fields) - - + + # set available element if attribute is 'boot_state': if node.get('boot_state').lower() == 'alive': @@ -114,71 +121,76 @@ class Slabv1Node: available_elem = node_elem.add_element('available', \ now='false') - #set position + #set position if attribute is 'position': node_elem.add_instance('position', node['position'], \ - SlabPosition.fields) + IotlabPosition.fields) ## add services - #PGv2Services.add_services(node_elem, node.get('services', [])) + #PGv2Services.add_services(node_elem, node.get('services', [])) # add slivers if attribute is 'slivers': slivers = node.get('slivers', []) if not slivers: # we must still advertise the available sliver types - slivers = Sliver({'type': 'slab-node'}) + slivers = Sliver({'type': 'iotlab-node'}) # we must also advertise the available initscripts #slivers['tags'] = [] - #if node.get('pl_initscripts'): + #if node.get('pl_initscripts'): #for initscript in node.get('pl_initscripts', []): #slivers['tags'].append({'name': 'initscript', \ #'value': initscript['name']}) - - Slabv1Sliver.add_slivers(node_elem, slivers) + + Iotlabv1Sliver.add_slivers(node_elem, slivers) return node_elems - - + + @staticmethod def get_nodes(xml, filter={}): xpath = '//node%s | //default:node%s' % (XpathFilter.xpath(filter), \ XpathFilter.xpath(filter)) - node_elems = xml.xpath(xpath) - return Slabv1Node.get_node_objs(node_elems) + node_elems = xml.xpath(xpath) + return Iotlabv1Node.get_node_objs(node_elems) - @staticmethod + @staticmethod def get_nodes_with_slivers(xml, sliver_filter={}): xpath = '//node[count(sliver)>0] | \ - //default:node[count(default:sliver) > 0]' - node_elems = xml.xpath(xpath) + //default:node[count(default:sliver) > 0]' + node_elems = xml.xpath(xpath) logger.debug("SLABV1NODE \tget_nodes_with_slivers \ node_elems %s"%(node_elems)) - return Slabv1Node.get_node_objs(node_elems) + return Iotlabv1Node.get_node_objs(node_elems) @staticmethod def get_node_objs(node_elems): nodes = [] for node_elem in node_elems: +<<<<<<< HEAD:sfa/rspecs/elements/versions/slabv1Node.py node = NodeElement(node_elem.attrib, node_elem) nodes.append(node) +======= + node = Node(node_elem.attrib, node_elem) + nodes.append(node) +>>>>>>> 7cb1e78... Renaming Senslab into Iotlab.:sfa/rspecs/elements/versions/iotlabv1Node.py if 'component_id' in node_elem.attrib: node['authority_id'] = \ Xrn(node_elem.attrib['component_id']).get_authority_urn() - + # get hardware types hardware_type_elems = node_elem.xpath('./default:hardware_type | \ ./hardware_type') node['hardware_types'] = [hw_type.get_instance(HardwareType) \ for hw_type in hardware_type_elems] - + # get location location_elems = node_elem.xpath('./default:location | ./location') locations = [location_elem.get_instance(Location) \ for location_elem in location_elems] if len(locations) > 0: node['location'] = locations[0] - - + + # get interfaces iface_elems = node_elem.xpath('./default:interface | ./interface') node['interfaces'] = [iface_elem.get_instance(Interface) \ @@ -188,15 +200,15 @@ class Slabv1Node: #node['services'] = PGv2Services.get_services(node_elem) # get slivers - node['slivers'] = Slabv1Sliver.get_slivers(node_elem) + node['slivers'] = Iotlabv1Sliver.get_slivers(node_elem) available_elems = node_elem.xpath('./default:available | \ ./available') if len(available_elems) > 0 and 'name' in available_elems[0].attrib: - if available_elems[0].attrib.get('now', '').lower() == 'true': + if available_elems[0].attrib.get('now', '').lower() == 'true': node['boot_state'] = 'boot' - else: - node['boot_state'] = 'disabled' - + else: + node['boot_state'] = 'disabled' + logger.debug("SLABV1NODE \tget_nodes_objs \ #nodes %s"%(nodes)) return nodes @@ -204,7 +216,7 @@ class Slabv1Node: @staticmethod def add_slivers(xml, slivers): - logger.debug("SLABv1NODE \tadd_slivers ") + logger.debug("Iotlabv1NODE \tadd_slivers ") component_ids = [] for sliver in slivers: filter_sliver = {} @@ -213,23 +225,23 @@ class Slabv1Node: sliver = {} elif 'component_id' in sliver and sliver['component_id']: filter_sliver['component_id'] = '*%s*' % sliver['component_id'] - if not filter_sliver: + if not filter_sliver: continue - nodes = Slabv1Node.get_nodes(xml, filter_sliver) + nodes = Iotlabv1Node.get_nodes(xml, filter_sliver) if not nodes: continue node = nodes[0] - Slabv1Sliver.add_slivers(node, sliver) + Iotlabv1Sliver.add_slivers(node, sliver) @staticmethod def remove_slivers(xml, hostnames): for hostname in hostnames: - nodes = Slabv1Node.get_nodes(xml, \ + nodes = Iotlabv1Node.get_nodes(xml, \ {'component_id': '*%s*' % hostname}) for node in nodes: - slivers = Slabv1Sliver.get_slivers(node.element) + slivers = Iotlabv1Sliver.get_slivers(node.element) for sliver in slivers: - node.element.remove(sliver.element) + node.element.remove(sliver.element) + + - - diff --git a/sfa/rspecs/elements/versions/slabv1Sliver.py b/sfa/rspecs/elements/versions/iotlabv1Sliver.py similarity index 77% rename from sfa/rspecs/elements/versions/slabv1Sliver.py rename to sfa/rspecs/elements/versions/iotlabv1Sliver.py index 370f55f3..f26ace6b 100644 --- a/sfa/rspecs/elements/versions/slabv1Sliver.py +++ b/sfa/rspecs/elements/versions/iotlabv1Sliver.py @@ -3,15 +3,15 @@ from sfa.rspecs.elements.sliver import Sliver #from sfa.rspecs.elements.versions.pgv2DiskImage import PGv2DiskImage import sys -class Slabv1Sliver: +class Iotlabv1Sliver: @staticmethod def add_slivers(xml, slivers): if not slivers: - return + return if not isinstance(slivers, list): slivers = [slivers] - for sliver in slivers: + for sliver in slivers: #sliver_elem = xml.add_element('sliver_type') sliver_elem = xml.add_element('sliver') if sliver.get('type'): @@ -20,12 +20,12 @@ class Slabv1Sliver: sliver_elem.set('client_id', sliver['client_id']) #images = sliver.get('disk_images') #if images and isinstance(images, list): - #Slabv1DiskImage.add_images(sliver_elem, images) - Slabv1Sliver.add_sliver_attributes(sliver_elem, sliver.get('tags', [])) - + #Iotlabv1DiskImage.add_images(sliver_elem, images) + Iotlabv1Sliver.add_sliver_attributes(sliver_elem, sliver.get('tags', [])) + @staticmethod def add_sliver_attributes(xml, attributes): - if attributes: + if attributes: for attribute in attributes: if attribute['name'] == 'initscript': xml.add_element('{%s}initscript' % xml.namespaces['planetlab'], name=attribute['value']) @@ -33,26 +33,26 @@ class Slabv1Sliver: attrib_elem = xml.add_element('{%s}info' % self.namespaces['flack']) attrib_dict = eval(tag['value']) for (key, value) in attrib_dict.items(): - attrib_elem.set(key, value) + attrib_elem.set(key, value) @staticmethod def get_slivers(xml, filter={}): xpath = './default:sliver | ./sliver' - + sliver_elems = xml.xpath(xpath) slivers = [] - for sliver_elem in sliver_elems: + for sliver_elem in sliver_elems: sliver = Sliver(sliver_elem.attrib,sliver_elem) - if 'component_id' in xml.attrib: + if 'component_id' in xml.attrib: sliver['component_id'] = xml.attrib['component_id'] if 'name' in sliver_elem.attrib: sliver['type'] = sliver_elem.attrib['name'] - #sliver['images'] = Slabv1DiskImage.get_images(sliver_elem) - + #sliver['images'] = Iotlabv1DiskImage.get_images(sliver_elem) + print>>sys.stderr, "\r\n \r\n SLABV1SLIVER.PY \t\t\t get_slivers sliver %s " %( sliver) slivers.append(sliver) return slivers @staticmethod def get_sliver_attributes(xml, filter={}): - return [] \ No newline at end of file + return [] \ No newline at end of file diff --git a/sfa/rspecs/versions/slabv1.py b/sfa/rspecs/versions/iotlabv1.py similarity index 85% rename from sfa/rspecs/versions/slabv1.py rename to sfa/rspecs/versions/iotlabv1.py index 39adddac..6d15973e 100644 --- a/sfa/rspecs/versions/slabv1.py +++ b/sfa/rspecs/versions/iotlabv1.py @@ -3,16 +3,16 @@ from copy import deepcopy from sfa.rspecs.version import RSpecVersion import sys -from sfa.rspecs.elements.versions.slabv1Lease import Slabv1Lease -from sfa.rspecs.elements.versions.slabv1Node import Slabv1Node -from sfa.rspecs.elements.versions.slabv1Sliver import Slabv1Sliver +from sfa.rspecs.elements.versions.iotlabv1Lease import Iotlabv1Lease +from sfa.rspecs.elements.versions.iotlabv1Node import Iotlabv1Node +from sfa.rspecs.elements.versions.iotlabv1Sliver import Iotlabv1Sliver from sfa.rspecs.elements.versions.sfav1Lease import SFAv1Lease from sfa.util.sfalogging import logger - -class Slabv1(RSpecVersion): + +class Iotlabv1(RSpecVersion): #enabled = True type = 'Slab' content_type = 'ad' @@ -27,16 +27,16 @@ class Slabv1(RSpecVersion): } namespaces = dict(extensions.items() + [('default', namespace)]) elements = [] - - # Network + + # Network def get_networks(self): - #WARNING Added //default:network to the xpath + #WARNING Added //default:network to the xpath #otherwise network element not detected 16/07/12 SA - - network_elems = self.xml.xpath('//network | //default:network') + + network_elems = self.xml.xpath('//network | //default:network') networks = [network_elem.get_instance(fields=['name', 'slice']) for \ network_elem in network_elems] - return networks + return networks def add_network(self, network): @@ -47,24 +47,24 @@ class Slabv1(RSpecVersion): network_tag = network_tags[0] return network_tag - + # Nodes def get_nodes(self, filter=None): - return Slabv1Node.get_nodes(self.xml, filter) + return Iotlabv1Node.get_nodes(self.xml, filter) def get_nodes_with_slivers(self): - return Slabv1Node.get_nodes_with_slivers(self.xml) - + return Iotlabv1Node.get_nodes_with_slivers(self.xml) + def get_slice_timeslot(self ): - return Slabv1Timeslot.get_slice_timeslot(self.xml) - + return Iotlabv1Timeslot.get_slice_timeslot(self.xml) + def add_connection_information(self, ldap_username, sites_set): - return Slabv1Node.add_connection_information(self.xml,ldap_username, sites_set) - + return Iotlabv1Node.add_connection_information(self.xml,ldap_username, sites_set) + def add_nodes(self, nodes, check_for_dupes=False): - return Slabv1Node.add_nodes(self.xml,nodes ) - + return Iotlabv1Node.add_nodes(self.xml,nodes ) + def merge_node(self, source_node_tag, network, no_dupes = False): logger.debug("SLABV1 merge_node") #if no_dupes and self.get_node_element(node['hostname']): @@ -74,19 +74,19 @@ class Slabv1(RSpecVersion): network_tag.append(deepcopy(source_node_tag)) # Slivers - - def get_sliver_attributes(self, hostname, node, network=None): + + def get_sliver_attributes(self, hostname, node, network=None): print>>sys.stderr, "\r\n \r\n \r\n \t\t SLABV1.PY get_sliver_attributes hostname %s " %(hostname) nodes = self.get_nodes({'component_id': '*%s*' %hostname}) - attribs = [] + attribs = [] print>>sys.stderr, "\r\n \r\n \r\n \t\t SLABV1.PY get_sliver_attributes-----------------nodes %s " %(nodes) if nodes is not None and isinstance(nodes, list) and len(nodes) > 0: node = nodes[0] - #if node : + #if node : #sliver = node.xpath('./default:sliver | ./sliver') #sliver = node.xpath('./default:sliver', namespaces=self.namespaces) sliver = node['slivers'] - + if sliver is not None and isinstance(sliver, list) and len(sliver) > 0: sliver = sliver[0] attribs = sliver @@ -95,7 +95,7 @@ class Slabv1(RSpecVersion): return attribs def get_slice_attributes(self, network=None): - + slice_attributes = [] nodes_with_slivers = self.get_nodes_with_slivers() @@ -120,7 +120,7 @@ class Slabv1(RSpecVersion): value = text attribute = {'name': 'initscript', 'value': value, 'node_id': node} slice_attributes.append(attribute) - + return slice_attributes @@ -140,35 +140,35 @@ class Slabv1(RSpecVersion): def add_slivers(self, hostnames, attributes=[], sliver_urn=None, append=False): # all nodes hould already be present in the rspec. Remove all # nodes that done have slivers - print>>sys.stderr, "\r\n \r\n \r\n \t\t\t SLABv1.PY add_slivers ----->get_node " + print>>sys.stderr, "\r\n \r\n \r\n \t\t\t Iotlabv1.PY add_slivers ----->get_node " for hostname in hostnames: node_elems = self.get_nodes({'component_id': '*%s*' % hostname}) if not node_elems: continue node_elem = node_elems[0] - + # determine sliver types for this node #TODO : add_slivers valid type of sliver needs to be changed 13/07/12 SA - valid_sliver_types = ['slab-node', 'emulab-openvz', 'raw-pc', 'plab-vserver', 'plab-vnode'] + valid_sliver_types = ['iotlab-node', 'emulab-openvz', 'raw-pc', 'plab-vserver', 'plab-vnode'] #valid_sliver_types = ['emulab-openvz', 'raw-pc', 'plab-vserver', 'plab-vnode'] requested_sliver_type = None for sliver_type in node_elem.get('slivers', []): if sliver_type.get('type') in valid_sliver_types: requested_sliver_type = sliver_type['type'] - + if not requested_sliver_type: continue sliver = {'type': requested_sliver_type, 'pl_tags': attributes} - print>>sys.stderr, "\r\n \r\n \r\n \t\t\t SLABv1.PY add_slivers node_elem %s sliver_type %s \r\n \r\n " %(node_elem, sliver_type) + print>>sys.stderr, "\r\n \r\n \r\n \t\t\t Iotlabv1.PY add_slivers node_elem %s sliver_type %s \r\n \r\n " %(node_elem, sliver_type) # remove available element for available_elem in node_elem.xpath('./default:available | ./available'): node_elem.remove(available_elem) - + # remove interface elements for interface_elem in node_elem.xpath('./default:interface | ./interface'): node_elem.remove(interface_elem) - + # remove existing sliver_type elements for sliver_type in node_elem.get('slivers', []): node_elem.element.remove(sliver_type.element) @@ -185,8 +185,8 @@ class Slabv1(RSpecVersion): #node_elem.set('sliver_id', sliver_id) # add the sliver type elemnt - Slabv1Sliver.add_slivers(node_elem.element, sliver) - #Slabv1SliverType.add_slivers(node_elem.element, sliver) + Iotlabv1Sliver.add_slivers(node_elem.element, sliver) + #Iotlabv1SliverType.add_slivers(node_elem.element, sliver) # remove all nodes without slivers if not append: @@ -196,11 +196,11 @@ class Slabv1(RSpecVersion): parent.remove(node_elem.element) def remove_slivers(self, slivers, network=None, no_dupes=False): - Slabv1Node.remove_slivers(self.xml, slivers) - - + Iotlabv1Node.remove_slivers(self.xml, slivers) + + # Utility - + def merge(self, in_rspec): """ Merge contents for specified rspec with current rspec @@ -208,9 +208,9 @@ class Slabv1(RSpecVersion): if not in_rspec: return - + from sfa.rspecs.rspec import RSpec - + if isinstance(in_rspec, RSpec): rspec = in_rspec else: @@ -221,7 +221,7 @@ class Slabv1(RSpecVersion): rspec = RSpec(in_rspec) # just copy over all networks #Attention special get_networks using //default:network xpath - current_networks = self.get_networks() + current_networks = self.get_networks() networks = rspec.version.get_networks() for network in networks: current_network = network.get('name') @@ -232,39 +232,39 @@ class Slabv1(RSpecVersion): - + # Leases def get_leases(self, lease_filter=None): return SFAv1Lease.get_leases(self.xml, lease_filter) - #return Slabv1Lease.get_leases(self.xml, lease_filter) + #return Iotlabv1Lease.get_leases(self.xml, lease_filter) def add_leases(self, leases, network = None, no_dupes=False): SFAv1Lease.add_leases(self.xml, leases) - #Slabv1Lease.add_leases(self.xml, leases) + #Iotlabv1Lease.add_leases(self.xml, leases) def cleanup(self): # remove unncecessary elements, attributes if self.type in ['request', 'manifest']: # remove 'available' element from remaining node elements self.xml.remove_element('//default:available | //available') - - -class Slabv1Ad(Slabv1): + + +class Iotlabv1Ad(Iotlabv1): enabled = True content_type = 'ad' schema = 'http://senslab.info/resources/rspec/1/ad.xsd' #http://www.geni.net/resources/rspec/3/ad.xsd' template = '' -class Slabv1Request(Slabv1): +class Iotlabv1Request(Iotlabv1): enabled = True content_type = 'request' schema = 'http://senslab.info/resources/rspec/1/request.xsd' #http://www.geni.net/resources/rspec/3/request.xsd template = '' -class Slabv1Manifest(Slabv1): +class Iotlabv1Manifest(Iotlabv1): enabled = True content_type = 'manifest' schema = 'http://senslab.info/resources/rspec/1/manifest.xsd' @@ -275,7 +275,7 @@ class Slabv1Manifest(Slabv1): if __name__ == '__main__': from sfa.rspecs.rspec import RSpec from sfa.rspecs.rspec_elements import * - r = RSpec('/tmp/slab.rspec') - r.load_rspec_elements(Slabv1.elements) - r.namespaces = Slabv1.namespaces + r = RSpec('/tmp/iotlab.rspec') + r.load_rspec_elements(Iotlabv1.elements) + r.namespaces = Iotlabv1.namespaces print r.get(RSpecElements.NODE) diff --git a/testbeds/senslab/tests/TestSuite.py b/testbeds/senslab/tests/TestSuite.py index d20db034..7f2352d1 100644 --- a/testbeds/senslab/tests/TestSuite.py +++ b/testbeds/senslab/tests/TestSuite.py @@ -1,12 +1,12 @@ ########################################################################### -# Copyright (C) 2012 by -# +# Copyright (C) 2012 by +# # # Copyright: See COPYING file that comes with this distribution # ########################################################################### -#LDAP import -from sfa.senslab.LDAPapi import LDAPapi +#LDAP import +from sfa.iotlab.LDAPapi import LDAPapi import ldap.modlist as modlist @@ -15,10 +15,10 @@ from sfa.util.sfalogging import logger #OAR imports from datetime import datetime -from sfa.senslab.OARrestapi import OARrestapi +from sfa.iotlab.OARrestapi import OARrestapi -#Test slabdriver -from sfa.senslab.slabdriver import SlabDriver +#Test iotlabdriver +from sfa.iotlab.iotlabdriver import IotlabDriver from sfa.util.config import Config @@ -26,9 +26,9 @@ import os import sys - + def parse_options(): - + #arguments supplied if len(sys.argv) > 1 : options_list = sys.argv[1:] @@ -38,12 +38,12 @@ def parse_options(): valid_options_dict = {} value_list = [] #Passing options to the script should be done like this : - #-10 OAR -2 SlabDriver + #-10 OAR -2 IotlabDriver for option in options_list: if option in supported_options: - #update the values used for the fonctions associated + #update the values used for the fonctions associated #with the options - + valid_options_dict[option] = value_list #empty the values list for next option value_list = [] @@ -54,16 +54,16 @@ def parse_options(): print "value_list", value_list - return valid_options_dict - + return valid_options_dict + def TestLdap(job_id = None): logger.setLevelDebug() ldap_server = LDAPapi() ret = ldap_server.conn.connect(bind=True) - ldap_server.conn.close() + ldap_server.conn.close() print "TEST ldap_server.conn.connect(bind=True)" , ret - + ret = ldap_server.conn.connect(bind=False) ldap_server.conn.close() print "TEST ldap_server.conn.connect(bind=False)", ret @@ -71,14 +71,14 @@ def TestLdap(job_id = None): ret = ldap_server.LdapSearch() print "TEST ldap_server.LdapSearch ALL", ret - + ret = ldap_server.LdapSearch('(uid=avakian)', []) print "\r\n TEST ldap_server.LdapSearch ids = avakian", ret password = ldap_server.generate_password() - print "\r\n TEST generate_password ", password - + print "\r\n TEST generate_password ", password + maxi = ldap_server.find_max_uidNumber() print "\r\n TEST find_max_uidNumber " , maxi @@ -87,315 +87,315 @@ def TestLdap(job_id = None): data['first_name'] = "Tim" data['givenName'] = data['first_name'] data['mail'] = "robin@arkham.fr" - + record = {} - record['hrn'] = 'senslab.drake' + record['hrn'] = 'iotlab.drake' record['last_name'] = "Drake" record['first_name'] = "Tim" record['mail'] = "robin@arkham.fr" - - + + login = ldap_server.generate_login(data) print "\r\n Robin \tgenerate_login ", ret, login - + ret = ldap_server.LdapAddUser(data) print "\r\n Robin \tLdapAddUser ", ret req_ldap = '(uid=' + login + ')' ret = ldap_server.LdapSearch(req_ldap, []) print "\r\n Robin \tldap_server.LdapSearch ids = %s %s" % (login, ret) - + password = "Thridrobin" enc = ldap_server.encrypt_password(password) print "\r\n Robin \tencrypt_password ", enc - + ret = ldap_server.LdapModifyUser(record, {'userPassword':enc}) print "\r\n Robin \tChange password LdapModifyUser ", ret - + #dn = 'uid=' + login + ',' + ldap_server.baseDN #ret = ldap_server.LdapDelete(dn) #print "\r\n Robin \tLdapDelete ", ret - + datanight = {} datanight['last_name'] = "Grayson" datanight['first_name'] = "Dick" datanight['givenName'] = datanight['first_name'] datanight['mail'] = "nightwing@arkham.fr" - - + + record_night = {} - record_night['hrn'] = 'senslab.grayson' + record_night['hrn'] = 'iotlab.grayson' record_night['last_name'] = datanight['last_name'] record_night['first_name'] = datanight['first_name'] record_night['mail'] = datanight['mail'] - + ret = ldap_server.LdapFindUser(record_night) print "\r\n Nightwing \tldap_server.LdapFindUser %s : %s" % (record_night, ret) - + #ret = ldap_server.LdapSearch('(uid=grayson)', []) #print "\r\n Nightwing \tldap_server.LdapSearch ids = %s %s" %('grayson',ret ) #ret = ldap_server.LdapAddUser(datanight) - #print "\r\n Nightwing \tLdapAddUser ", ret - + #print "\r\n Nightwing \tLdapAddUser ", ret + #ret = ldap_server.LdapResetPassword(record_night) #print "\r\n Nightwing \tLdapResetPassword de %s : %s" % (record_night, ret) - + ret = ldap_server.LdapDeleteUser(record_night) - print "\r\n Nightwing \tLdapDeleteUser ", ret - - + print "\r\n Nightwing \tLdapDeleteUser ", ret + + #record_avakian = {} - #record_avakian['hrn']= 'senslab.avakian' + #record_avakian['hrn']= 'iotlab.avakian' #record_avakian['last_name'] = 'avakian' #record_avakian['first_name'] = 'sandrine' #record_avakian['mail'] = 'sandrine.avakian@inria.fr' - #pubkey = "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwSUkJ+cr3xM47h8lFkIXJoJhg4wHakTaLJmgTXkzvUmQsQeFB2MjUZ6WAelMXj/EFz2+XkK+bcWNXwfbrLptJQ+XwGpPZlu9YV/kzO63ghVrAyEg0+p7Pn1TO9f1ZYg4R6JfP/3qwH1AsE+X3PNpIewsuEIKwd2wUCJDf5RXJTpl39GizcBFemrRqgs0bdqAN/vUT9YvtWn8fCYR5EfJHVXOK8P1KmnbuGZpk7ryz21pDMlgw13+8aYB+LPkxdv5zG54A5c6o9N3zOCblvRFWaNBqathS8y04cOYWPmyu+Q0Xccwi7vM3Ktm8RoJw+raQNwsmneJOm6KXKnjoOQeiQ== savakian@sfa2.grenoble.senslab.info" + #pubkey = "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwSUkJ+cr3xM47h8lFkIXJoJhg4wHakTaLJmgTXkzvUmQsQeFB2MjUZ6WAelMXj/EFz2+XkK+bcWNXwfbrLptJQ+XwGpPZlu9YV/kzO63ghVrAyEg0+p7Pn1TO9f1ZYg4R6JfP/3qwH1AsE+X3PNpIewsuEIKwd2wUCJDf5RXJTpl39GizcBFemrRqgs0bdqAN/vUT9YvtWn8fCYR5EfJHVXOK8P1KmnbuGZpk7ryz21pDMlgw13+8aYB+LPkxdv5zG54A5c6o9N3zOCblvRFWaNBqathS8y04cOYWPmyu+Q0Xccwi7vM3Ktm8RoJw+raQNwsmneJOm6KXKnjoOQeiQ== savakian@sfa2.grenoble.iotlab.info" #ret = ldap_server.LdapModifyUser(record_night, {'sshPublicKey':pubkey}) - #print "\r\n Sandrine \tChange pubkey LdapModifyUser ", ret - + #print "\r\n Sandrine \tChange pubkey LdapModifyUser ", ret + #record_myslice = {} - #record_myslice['hrn']= 'senslab.myslice' + #record_myslice['hrn']= 'iotlab.myslice' #record_myslice['last_name'] = 'myslice' #record_myslice['first_name'] = 'myslice' #record_myslice['mail'] = 'nturro@inria.fr' #pubkeymyslice = "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAuyRPwn8PZxjdhu+ciRuPyM0eVBn7XS7i3tym9F30UVhaCd09a/UEmGn7WJZdfsxV3hXqG1Wc766FEst97NuzHzELSuvy/rT96J0UHG4wae4pnzOLd6NwFdZh7pkPsgHMHxK9ALVE68Puu+EDSOB5bBZ9Q624wCIGxEpmuS/+X+dDBTKgG5Hi0WA1uKJwhLSbbXb38auh4FlYgXPsdpljTIJatt+zGL0Zsy6fdrsVRc5W8kr3/SmE4OMNyabKBNyxioSEuYhRSjoQAHnYoevEjZniP8IzscKK7qwelzGUfnJEzexikhsQamhAFti2ReiFfoHBRZxnSc49ioH7Kaci5w== root@rhoecos3.ipv6.lip6.fr" - + #pubkeytestuser = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDYS8tzufciTm6GdNUGHQc64OfTxFebMYUwh/Jl04IPTvjjr26uakbM0M2v33HxZ5Q7PnmPN9pB/w+a+f7a7J4cNs/tApOMg2hb6UrLaOrdnDMOs4KZlfElyDsF3Zx5QwxPYvzsKADAbDVoX4NF9PttuDLdm2l3nLSvm89jfla00GBg+K8grdOCHyYZVX/Wt7kxhXDK3AidQhKJgn+iD5GxvtWMBE+7S5kJGdRW1W10lSLBW3+VNsCrKJB2s8L55Xz/l2HNBScU7T0VcMQJrFxEXKzLPagZsMz0lfLzHESoGHIZ3Tz85DfECbTtMxLts/4KoAEc3EE+PYr2VDeAggDx testuser@myslice" - - + + #password = "ReptileFight" #enc = ldap_server.encrypt_password(password) #print "\r\n sandrine \tencrypt_password ", enc - + #ret = ldap_server.LdapModifyUser(record_avakian, {'userPassword':enc}) - #print "\r\n sandrine \tChange password LdapModifyUser ", ret + #print "\r\n sandrine \tChange password LdapModifyUser ", ret return def get_stuff(oar, uri): import httplib - import json + import json headers = {} - data = json.dumps({}) - - headers['X-REMOTE_IDENT'] = 'avakian' - + data = json.dumps({}) + + headers['X-REMOTE_IDENT'] = 'avakian' + headers['content-length'] = '0' #seems that it does not work if we don't add this - + conn = httplib.HTTPConnection(oar.oarserver['ip'], oar.oarserver['port']) conn.request("GET", uri, data , headers ) resp = ( conn.getresponse()).read() conn.close() - + js = json.loads(resp) return js - - + + def TestOAR(job_id = None): - print "JOB_ID", job_id + print "JOB_ID", job_id if isinstance(job_id, list) : if len(job_id) >= 1: job_id = job_id[0] else: job_id = '1' else: - job_id = '1' - print "JOB_ID", job_id + job_id = '1' + print "JOB_ID", job_id oar = OARrestapi() - jobs = oar.parser.SendRequest("GET_reserved_nodes", username = 'avakian') + jobs = oar.parser.SendRequest("GET_reserved_nodes", username = 'avakian') print "\r\n OAR GET_reserved_nodes ", jobs - - - jobs = oar.parser.SendRequest("GET_jobs") + + + jobs = oar.parser.SendRequest("GET_jobs") print "\r\n OAR GET_jobs ", jobs - - + + jobs = oar.parser.SendRequest("GET_jobs_id", job_id, 'avakian') print "\r\n OAR GET_jobs_id ", jobs - - uri = '/oarapi/jobs/details.json?state=Running,Waiting,Launching&user=avakian' + + uri = '/oarapi/jobs/details.json?state=Running,Waiting,Launching&user=avakian' raw_json = get_stuff(oar, uri) print "\r\nOAR ", uri, raw_json, "\r\n KKK \t", raw_json.keys() - + uri = '/oarapi/jobs/' + job_id +'.json' - raw_json = get_stuff(oar, uri) + raw_json = get_stuff(oar, uri) print "\r\n OAR ", uri, raw_json, "\r\n KKK \t", raw_json.keys() - + uri = '/oarapi/jobs/' + job_id + '/resources.json' raw_json = get_stuff(oar, uri) print "\r\n OAR ", uri, raw_json, "\r\n KKK \t", raw_json.keys() - + time_format = "%Y-%m-%d %H:%M:%S" - + server_timestamp, server_tz = oar.parser.SendRequest("GET_timezone") - + print "\r\n OAR GetTimezone ", server_timestamp, server_tz print(datetime.fromtimestamp(int(server_timestamp)).strftime('%Y-%m-%d %H:%M:%S')) uri = '/oarapi/resources/full.json' raw_json = get_stuff(oar, uri) print "\r\n OAR ", uri, raw_json, "\r\n KKK \t", raw_json.keys() - - uri = '/oarapi/jobs.json?user=avakian' + + uri = '/oarapi/jobs.json?user=avakian' raw_json = get_stuff(oar, uri) print "\r\nOAR ", uri, raw_json, "\r\n KKK \t", raw_json.keys() return - - - -def TestSlabDriver(job_id = None): + + + +def TestIotlabDriver(job_id = None): if job_id is None: job_id = 1 - + if isinstance(job_id, list) and len(job_id) == 1: job_id = job_id[0] - slabdriver = SlabDriver(Config()) - - #nodes = slabdriver.slab_api.GetReservedNodes() + iotlabdriver = IotlabDriver(Config()) + + #nodes = iotlabdriver.iotlab_api.GetReservedNodes() #print " \r\n \r\n GetReservedNodes", nodes - - #sl = slabdriver.slab_api.GetSlices(slice_filter='senslab.avakian_slice', slice_filter_type='slice_hrn') + + #sl = iotlabdriver.iotlab_api.GetSlices(slice_filter='iotlab.avakian_slice', slice_filter_type='slice_hrn') #print "\r\n \r\nGetSlices", sl[0] - - #sl = slabdriver.slab_api.GetSlices(slice_filter='20', slice_filter_type='record_id_user') + + #sl = iotlabdriver.iotlab_api.GetSlices(slice_filter='20', slice_filter_type='record_id_user') #print "\r\n \r\nGetSlices", sl - - #sl = slabdriver.slab_api.GetSlices() + + #sl = iotlabdriver.iotlab_api.GetSlices() #print "\r\n \r\nGetSlices", sl - - persons = slabdriver.slab_api.GetPersons() + + persons = iotlabdriver.iotlab_api.GetPersons() print "\r\n \r\n GetPersons", persons - - leases = slabdriver.slab_api.GetLeases(login='avakian') + + leases = iotlabdriver.iotlab_api.GetLeases(login='avakian') print "\r\n \r\n GetLeases", leases - + def TestSfi(filename = None): if filename is None: filename = "/home/savakian/flab-sfa/test_rspec/my_lyon_nodes.rspec" print " ================= SFI.PY RESOURCES =============", \ - os.system("sfi.py list senslab") - + os.system("sfi.py list iotlab") + print os.system("sfi.py resources") - print os.system("sfi.py resources -r slab") + print os.system("sfi.py resources -r iotlab") print os.system("sfi.py resources -l all") - - + + print "================ SFI.PY RESOURCES -R SLAB -L ALL ============\r\n", \ - os.system("sfi.py resources -r slab -l all") - + os.system("sfi.py resources -r iotlab -l all") + print "================ WRITING sfi.py resources -l all ===========\r\n", \ filename - + filename = filename.split(".")[0]+"_out.rspec" rspecfile = open(filename,"w") - r = os.popen("sfi.py resources -l all") + r = os.popen("sfi.py resources -l all") for i in r.readlines(): rspecfile.write(i) rspecfile.close() - + print " ================= SFI.PY SHOW SLICE ============= \r\n", \ - os.system("sfi.py resources senslab.avakian_slice") - + os.system("sfi.py resources iotlab.avakian_slice") + print " ================= SFI.PY SHOW USER =============\r\n", \ - os.system("sfi.py show senslab.avakian_slice") + os.system("sfi.py show iotlab.avakian_slice") print " ================= SFI.PY SHOW NODE =============\r\n", \ - os.system("sfi.py show senslab.avakian") + os.system("sfi.py show iotlab.avakian") print " ================= SFI.PY SLICES =============\r\n", \ - os.system("sfi.py show senslab.node6.devlille.senslab.info") + os.system("sfi.py show iotlab.node6.devlille.iotlab.info") print " ================= SFI.PY LIST SLICE =============\r\n", \ os.system("sfi.py slices") print " ================= SFI.PY STATUS SLICE =============\r\n", \ - os.system("sfi.py status senslab.avakian_slice") - + os.system("sfi.py status iotlab.avakian_slice") + print " ================= SFI.PY DELETE SLICE =============\r\n", \ - os.system("sfi.py delete senslab.avakian_slice") - + os.system("sfi.py delete iotlab.avakian_slice") + print " ================= SFI.PY CREATE SLICE =============\r\n", \ - os.system("sfi.py create senslab.avakian_slice \ + os.system("sfi.py create iotlab.avakian_slice \ /home/savakian/flab-sfa/test_rspec/my_lyon_nodes.rspec") - + def TestSQL(arg = None): from sfa.storage.model import make_record, RegSlice, RegRecord from sfa.storage.alchemy import dbsession - from sqlalchemy.orm.collections import InstrumentedList - - from sqlalchemy.orm import joinedload - - #solo_query_slice_list = dbsession.query(RegSlice).options(joinedload('reg_researchers')).filter_by(hrn='senslab.avakian_slice').first() + from sqlalchemy.orm.collections import InstrumentedList + + from sqlalchemy.orm import joinedload + + #solo_query_slice_list = dbsession.query(RegSlice).options(joinedload('reg_researchers')).filter_by(hrn='iotlab.avakian_slice').first() #print "\r\n \r\n =========== query_slice_list RegSlice \ - #joinedload('reg_researchers') senslab.avakian first \r\n \t ", \ + #joinedload('reg_researchers') iotlab.avakian first \r\n \t ", \ #solo_query_slice_list.__dict__ - - #query_slice_list = dbsession.query(RegSlice).options(joinedload('reg_researchers')).all() + + #query_slice_list = dbsession.query(RegSlice).options(joinedload('reg_researchers')).all() #print "\r\n \r\n =========== query_slice_list RegSlice \ #joinedload('reg_researchers') ALL \r\n \t", \ - #query_slice_list[0].__dict__ - + #query_slice_list[0].__dict__ + #return_slicerec_dictlist = [] #record = query_slice_list[0] - #print "\r\n \r\n =========== \r\n \t", record - + #print "\r\n \r\n =========== \r\n \t", record + #tmp = record.__dict__ - #print "\r\n \r\n =========== \r\n \t", tmp + #print "\r\n \r\n =========== \r\n \t", tmp #tmp['reg_researchers'] = tmp['reg_researchers'][0].__dict__ - #print "\r\n \r\n =========== \r\n \t", tmp + #print "\r\n \r\n =========== \r\n \t", tmp ##del tmp['reg_researchers']['_sa_instance_state'] #return_slicerec_dictlist.append(tmp) - + #print "\r\n \r\n =========== \r\n \t", return_slicerec_dictlist - + all_records = dbsession.query(RegRecord).all() - - #create hash by (type,hrn) - #used to know if a given record is already known to SFA - + + #create hash by (type,hrn) + #used to know if a given record is already known to SFA + records_by_type_hrn = \ dict ( [ ( (record.type,record.hrn) , record ) for record in all_records ] ) for (rec_type, rec) in records_by_type_hrn : if rec_type == 'user': - print >>sys.stderr,"\r\n SLABIMPORT \t keys %s rec %s \r\n" %(rec_type, rec ) - + print >>sys.stderr,"\r\n IOTLABIMPORT \t keys %s rec %s \r\n" %(rec_type, rec ) + users_rec_by_email = \ dict ( [ (record.email, record) for record in all_records if record.type == 'user' ] ) - - + + def RunAll( arg ): TestLdap() TestOAR() - TestSlabDriver() + TestIotlabDriver() TestSfi() - - + + supported_options = { 'OAR' : TestOAR, 'LDAP': TestLdap, - 'driver': TestSlabDriver, + 'driver': TestIotlabDriver, 'sfi':TestSfi, 'sql':TestSQL, 'all' : RunAll } - + def main(): opts = parse_options() print opts for opt in opts: supported_options[opt](opts[opt]) - + if __name__ == "__main__": - main() \ No newline at end of file + main() \ No newline at end of file diff --git a/testbeds/senslab/tests/bash_testsuite b/testbeds/senslab/tests/bash_testsuite index 6bcfd504..55c363cd 100755 --- a/testbeds/senslab/tests/bash_testsuite +++ b/testbeds/senslab/tests/bash_testsuite @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/bash if (( ! $# == 2 )) then echo " Usage : bash_test takes 2 arguments : one jobid and one of the following:" @@ -12,13 +12,13 @@ echo " ================= SFI.PY RESOURCES =============" sfi.py resources echo " ================= SFI.PY RESOURCES -R SLAB =============" -sfi.py resources -r slab +sfi.py resources -r iotlab echo " ================= SFI.PY RESOURCES -L ALL =============" sfi.py resources -l all echo " ================= SFI.PY RESOURCES -R SLAB -L ALL =============" -sfi.py resources -r slab -l all +sfi.py resources -r iotlab -l all echo " ================= SFI.PY RESOURCES -L ALL > avakian_adv.rspec =============" sfi.py resources -l all > /home/savakian/flab-sfa/avakian_adv.rspec -- 2.43.0