From a4c02db39311a1b6ff0a6ece3cb2ba5c6bcca112 Mon Sep 17 00:00:00 2001 From: Sandrine Avakian Date: Tue, 10 Dec 2013 13:42:55 +0100 Subject: [PATCH] Allocate, Describe, Provision now working for iotlab. --- sfa/iotlab/iotlabaggregate.py | 253 ++++++++++++++++-- sfa/iotlab/iotlabdriver.py | 118 ++++++-- sfa/iotlab/iotlabshell.py | 42 +-- sfa/iotlab/iotlabslices.py | 34 +-- sfa/iotlab/iotlabxrn.py | 6 +- sfa/rspecs/elements/versions/iotlabv1Node.py | 5 +- .../iotlab_avakian_slice_iotlab2.rspec | 4 +- .../iotlab_user_slice_iotlab.rspec | 4 +- 8 files changed, 374 insertions(+), 92 deletions(-) diff --git a/sfa/iotlab/iotlabaggregate.py b/sfa/iotlab/iotlabaggregate.py index 8977e209..d57943e3 100644 --- a/sfa/iotlab/iotlabaggregate.py +++ b/sfa/iotlab/iotlabaggregate.py @@ -3,8 +3,9 @@ File providing methods to generate valid RSpecs for the Iotlab testbed. Contains methods to get information on slice, slivers, nodes and leases, formatting them and turn it into a RSpec. """ -from sfa.util.xrn import hrn_to_urn, urn_to_hrn, get_authority - +from sfa.util.sfatime import utcparse, datetime_to_string +from sfa.util.xrn import Xrn, hrn_to_urn, urn_to_hrn, get_authority +from sfa.iotlab.iotlabxrn import IotlabXrn from sfa.rspecs.rspec import RSpec #from sfa.rspecs.elements.location import Location from sfa.rspecs.elements.hardware_type import HardwareType @@ -14,16 +15,12 @@ from sfa.rspecs.elements.sliver import Sliver from sfa.rspecs.elements.lease import Lease from sfa.rspecs.elements.granularity import Granularity from sfa.rspecs.version_manager import VersionManager - +from sfa.storage.model import SliverAllocation from sfa.rspecs.elements.versions.iotlabv1Node import IotlabPosition, \ IotlabNode, IotlabLocation - +from sfa.iotlab.iotlabxrn import xrn_object from sfa.util.sfalogging import logger -from sfa.util.xrn import Xrn - - - - +import time class IotlabAggregate: """Aggregate manager class for Iotlab. """ @@ -283,7 +280,10 @@ class IotlabAggregate: # return (rspec_nodes) return nodes_dict - def node_to_rspec_node(self, node, grain): + def node_to_rspec_node(self, node): + + grain = self.driver.testbed_shell.GetLeaseGranularity() + rspec_node = IotlabNode() # xxx how to retrieve site['login_base'] #site_id=node['site_id'] @@ -354,6 +354,61 @@ class IotlabAggregate: return rspec_node + + def rspec_node_to_geni_sliver(self, rspec_node, sliver_allocations = {}): + if rspec_node['sliver_id'] in sliver_allocations: + # set sliver allocation and operational status + sliver_allocation = sliver_allocations[rspec_node['sliver_id']] + if sliver_allocation: + allocation_status = sliver_allocation.allocation_state + if allocation_status == 'geni_allocated': + op_status = 'geni_pending_allocation' + elif allocation_status == 'geni_provisioned': + op_status = 'geni_ready' + else: + op_status = 'geni_unknown' + else: + allocation_status = 'geni_unallocated' + else: + allocation_status = 'geni_unallocated' + op_status = 'geni_failed' + # required fields + geni_sliver = {'geni_sliver_urn': rspec_node['sliver_id'], + 'geni_expires': rspec_node['expires'], + 'geni_allocation_status' : allocation_status, + 'geni_operational_status': op_status, + 'geni_error': '', + } + return geni_sliver + + + def sliver_to_rspec_node(self, sliver, sliver_allocations): + rspec_node = self.node_to_rspec_node(sliver) + rspec_node['expires'] = datetime_to_string(utcparse(sliver['expires'])) + # add sliver info + logger.debug("IOTLABAGGREGATE api \t sliver_to_rspec_node sliverr %s \r\nsliver_allocations %s" + % (sliver, sliver_allocations)) + rspec_sliver = Sliver({'sliver_id': sliver['urn'], + 'name': sliver['slice_id'], + 'type': 'iotlab-exclusive', + 'tags': []}) + rspec_node['sliver_id'] = rspec_sliver['sliver_id'] + if sliver['urn'] in sliver_allocations: + rspec_node['client_id'] = sliver_allocations[sliver['urn']].client_id + if sliver_allocations[sliver['urn']].component_id: + rspec_node['component_id'] = sliver_allocations[sliver['urn']].component_id + rspec_node['slivers'] = [rspec_sliver] + + # slivers always provide the ssh service + login = Login({'authentication': 'ssh-keys', + 'hostname': sliver['hostname'], + 'port':'22', + 'username': sliver['slice_name'], + 'login': sliver['slice_name'] + }) + return rspec_node + + def get_all_leases(self, ldap_username): """ @@ -526,6 +581,125 @@ class IotlabAggregate: FINAL RSPEC %s \r\n" % (rspec.toxml())) return rspec.toxml() + def get_slivers(self, urns, options={}): + """ + + """ + + + slice_ids = set() + node_ids = [] + for urn in urns: + xrn = IotlabXrn(xrn=urn) + if xrn.type == 'sliver': + # id: slice_id-node_id + try: + sliver_id_parts = xrn.get_sliver_id_parts() + slice_id = int(sliver_id_parts[0]) + node_id = int(sliver_id_parts[1]) + slice_ids.add(slice_id) + node_ids.append(node_id) + except ValueError: + pass + else: + slice_names = set() + slice_names.add(xrn.hrn) + + + logger.debug("IotlabAggregate \t get_slivers urns %s slice_ids %s \ + node_ids %s\r\n" % (urns, slice_ids, node_ids)) + logger.debug("IotlabAggregate \t get_slivers xrn %s slice_names %s \ + \r\n" % (xrn, slice_names)) + filter = {} + if slice_names: + filter['slice_hrn'] = list(slice_names) + slice_hrn = filter['slice_hrn'][0] + + slice_filter_type = 'slice_hrn' + logger.debug("IotlabAggregate \t get_slivers slice_hrn%s \ + \r\n" % (slice_hrn )) + # if slice_ids: + # filter['slice_id'] = list(slice_ids) + # # get slices + if slice_hrn: + slices = self.driver.testbed_shell.GetSlices(slice_hrn, + slice_filter_type) + leases = self.driver.testbed_shell.GetLeases( + {'slice_hrn':slice_hrn}) + logger.debug("IotlabAggregate \t get_slivers \ + slices %s leases %s\r\n" % (slices, leases )) + if not slices: + return [] + # slice = slices[0] + # slice['hrn'] = DummyXrn(auth=self.driver.hrn, slicename=slice['slice_name']).hrn + single_slice = slices[0] + # get sliver users + # users = [] + # user_ids = [] + # for slice in slices: + # user_ids.extend(slice['user_ids']) + # if user_ids: + # users = self.driver.shell.GetUsers({'user_ids': user_ids}) + + user = single_slice['reg_researchers'][0].__dict__ + logger.debug("IotlabAggregate \t get_slivers user %s \ + \r\n" % (user)) + + # construct user key info + # users_list = [] + # for user in users: + person = self.driver.testbed_shell.ldap.LdapFindUser(record=user) + logger.debug("IotlabAggregate \t get_slivers person %s \ + \r\n" % (person)) + name = person['last_name'] + user['login'] = person['uid'] + user['user_urn'] = hrn_to_urn(user['hrn'], 'user') + user['keys'] = person['pkey'] + # name = user['email'][0:user['email'].index('@')] + # user = { + # 'login': slice['slice_name'], + # 'user_urn': Xrn('%s.%s' % (self.driver.hrn, name), type='user').urn, + # 'keys': user['keys'] + # } + # users_list.append(user) + + try: + node_ids = single_slice['node_ids'] + node_list = self.driver.testbed_shell.GetNodes( + {'hostname':single_slice['node_ids']}) + node_by_hostname = dict([(node['hostname'], node) for node in node_list]) + except KeyError: + logger.warning("\t get_slivers No slivers in slice") + # slice['node_ids'] = node_ids + # nodes_dict = self.get_slice_nodes(slice, options) + logger.debug("IotlabAggregate \t get_slivers node_by_hostname%s \ + \r\n" % (node_by_hostname)) + slivers = [] + for current_lease in leases: + for hostname in current_lease['reserved_nodes']: + node = {} + node['slice_id'] = current_lease['slice_id'] + node['slice_hrn'] = current_lease['slice_hrn'] + slice_name = current_lease['slice_hrn'].split(".")[1] + node['slice_name'] = slice_name + index = current_lease['reserved_nodes'].index(hostname) + node_id = current_lease['resource_ids'][index] + # node['slice_name'] = user['login'] + # node.update(single_slice) + more_info = node_by_hostname[hostname] + node.update(more_info) + # oar_job_id is the slice_id (lease_id) + sliver_hrn = '%s.%s-%s' % (self.driver.hrn, + current_lease['lease_id'], node_id) + node['node_id'] = node_id + node['expires'] = current_lease['t_until'] + node['sliver_id'] = Xrn(sliver_hrn, type='sliver').urn + node['urn'] = node['sliver_id'] + node['services_user'] = [user] + logger.debug("IotlabAggregate \t get_slivers node %s current_lease %s\ + \r\n more_info %s" % (node, current_lease, more_info)) + slivers.append(node) + return slivers def list_resources(self, version = None, options={}): @@ -533,7 +707,10 @@ class IotlabAggregate: version = version_manager.get_version(version) rspec_version = version_manager._get_version(version.type, version.version, 'ad') rspec = RSpec(version=rspec_version, user_options=options) - + # variable ldap_username to be compliant with the get_all_leases + # prototype. Now unused in geni-v3 since we are getting all the leases + # here + ldap_username = None if not options.get('list_leases') or options['list_leases'] != 'leases': # get nodes nodes_dict = self.get_nodes(options) @@ -551,12 +728,11 @@ class IotlabAggregate: # node_tags = self.get_node_tags({'node_tag_id': tag_ids}) # pl_initscripts = self.get_pl_initscripts() # convert nodes to rspec nodes - grain = self.driver.testbed_shell.GetLeaseGranularity() rspec_nodes = [] for node_id in nodes_dict: node = nodes_dict[node_id] # rspec_node = self.node_to_rspec_node(node, sites, interfaces, node_tags, pl_initscripts) - rspec_node = self.node_to_rspec_node(node, grain) + rspec_node = self.node_to_rspec_node(node) rspec_nodes.append(rspec_node) rspec.version.add_nodes(rspec_nodes) @@ -564,18 +740,45 @@ class IotlabAggregate: # links = self.get_links(sites, nodes_dict, interfaces) # rspec.version.add_links(links) - if not options.get('list_leases') or options.get('list_leases') and options['list_leases'] != 'resources': - leases = self.get_all_leases() - rspec.version.add_leases(leases) + if not options.get('list_leases') or options.get('list_leases') \ + and options['list_leases'] != 'resources': + leases = self.get_all_leases(ldap_username) + rspec.version.add_leases(leases) return rspec.toxml() def describe(self, urns, version=None, options={}): + """ + Retrieve a manifest RSpec describing the resources contained by the + named entities, e.g. a single slice or a set of the slivers in a slice. + This listing and description should be sufficiently descriptive to allow + experimenters to use the resources. + + returns: On success returns the following struct: + { + geni_rspec: + geni_urn: + geni_slivers:{ + geni_sliver_urn: + geni_expires: , + geni_allocation_status: , + geni_operational_status: , + geni_error: + }, + ]} + .. seealso:: http://groups.geni.net/geni/wiki/GAPI_AM_API_V3#Describe + """ version_manager = VersionManager() version = version_manager.get_version(version) - rspec_version = version_manager._get_version(version.type, - version.version, 'manifest') + rspec_version = version_manager._get_version( + version.type, version.version, 'manifest') rspec = RSpec(version=rspec_version, user_options=options) # get slivers @@ -590,8 +793,14 @@ class IotlabAggregate: # lookup the sliver allocations geni_urn = urns[0] sliver_ids = [sliver['sliver_id'] for sliver in slivers] + logger.debug(" IOTLAB_API.PY \tDescribe sliver_ids %s " + % (sliver_ids)) constraint = SliverAllocation.sliver_id.in_(sliver_ids) - sliver_allocations = self.driver.api.dbsession().query(SliverAllocation).filter(constraint) + logger.debug(" IOTLAB_API.PY \tDescribe constraint %s " + % (constraint)) + sliver_allocations = self.driver.api.dbsession().query(SliverAllocation).filter((constraint)).all() + logger.debug(" IOTLAB_API.PY \tDescribe sliver_allocations %s " + % (sliver_allocations)) sliver_allocation_dict = {} for sliver_allocation in sliver_allocations: geni_urn = sliver_allocation.slice_urn @@ -605,8 +814,14 @@ class IotlabAggregate: for sliver in slivers: rspec_node = self.sliver_to_rspec_node(sliver, sliver_allocation_dict) rspec_nodes.append(rspec_node) + logger.debug(" IOTLAB_API.PY \tDescribe sliver_allocation_dict %s " + % (sliver_allocation_dict)) geni_sliver = self.rspec_node_to_geni_sliver(rspec_node, sliver_allocation_dict) geni_slivers.append(geni_sliver) + + logger.debug(" IOTLAB_API.PY \tDescribe rspec_nodes %s\ + rspec %s " + % (rspec_nodes, rspec)) rspec.version.add_nodes(rspec_nodes) return {'geni_urn': geni_urn, diff --git a/sfa/iotlab/iotlabdriver.py b/sfa/iotlab/iotlabdriver.py index 6aea1ce2..699e1118 100644 --- a/sfa/iotlab/iotlabdriver.py +++ b/sfa/iotlab/iotlabdriver.py @@ -4,18 +4,20 @@ Implements what a driver should provide for SFA to work. from sfa.util.faults import SliverDoesNotExist, UnknownSfaType from sfa.util.sfalogging import logger from sfa.storage.model import RegRecord +from sfa.util.sfatime import utcparse, datetime_to_string from sfa.managers.driver import Driver from sfa.rspecs.version_manager import VersionManager from sfa.rspecs.rspec import RSpec -from sfa.util.xrn import Xrn, hrn_to_urn, get_authority +from sfa.iotlab.iotlabxrn import xrn_object +from sfa.util.xrn import Xrn, hrn_to_urn, get_authority, urn_to_hrn from sfa.iotlab.iotlabaggregate import IotlabAggregate from sfa.iotlab.iotlabxrn import xrn_to_hostname from sfa.iotlab.iotlabslices import IotlabSlices - +from sfa.storage.model import SliverAllocation from sfa.iotlab.iotlabshell import IotlabShell @@ -41,7 +43,7 @@ class IotlabDriver(Driver): Driver.__init__(self, api) self.api = api config = api.config - self.testbed_shell = IotlabShell(config) + self.testbed_shell = IotlabShell(api) self.cache = None def augment_records_with_testbed_info(self, record_list): @@ -525,17 +527,14 @@ class IotlabDriver(Driver): login=sfa_slice['login'], version=rspec.version) - def delete_sliver(self, slice_urn, slice_hrn, creds, options): + def delete(self, slice_urns, options): """ Deletes the lease associated with the slice hrn and the credentials if the slice belongs to iotlab. Answer to DeleteSliver. :param slice_urn: urn of the slice - :param slice_hrn: name of the slice - :param creds: slice credenials :type slice_urn: string - :type slice_hrn: string - :type creds: ? unused + :returns: 1 if the slice to delete was not found on iotlab, True if the deletion was successful, False otherwise otherwise. @@ -546,6 +545,20 @@ class IotlabDriver(Driver): .. note:: creds are unused, and are not used either in the dummy driver delete_sliver . """ + # collect sliver ids so we can update sliver allocation states after + # we remove the slivers. + aggregate = IotlabAggregate(self) + slivers = aggregate.get_slivers(slice_urns) + if slivers: + slice_id = slivers[0]['slice_id'] + node_ids = [] + sliver_ids = [] + for sliver in slivers: + node_ids.append(sliver['node_id']) + sliver_ids.append(sliver['sliver_id']) + logger.debug("IOTLABDRIVER.PY delete_sliver slivers %s slice_urns %s" + % (slivers, slice_urns)) + slice_hrn = urn_to_hrn(slice_urns[0])[0] sfa_slice_list = self.testbed_shell.GetSlices( slice_filter=slice_hrn, @@ -566,9 +579,19 @@ class IotlabDriver(Driver): \r\n \t sfa_slice %s " % (peer, sfa_slice)) try: self.testbed_shell.DeleteSliceFromNodes(sfa_slice) - return True + dbsession = self.api.dbsession() + SliverAllocation.delete_allocations(sliver_ids,dbsession) except: - return False + logger.log_exc("IOTLABDRIVER.PY delete error ") + + # prepare return struct + geni_slivers = [] + for sliver in slivers: + geni_slivers.append( + {'geni_sliver_urn': sliver['sliver_id'], + 'geni_allocation_status': 'geni_unallocated', + 'geni_expires': datetime_to_string(utcparse(sliver['expires']))}) + return geni_slivers def list_resources (self, slice_urn, slice_hrn, creds, options): """ @@ -869,10 +892,12 @@ class IotlabDriver(Driver): slice_record = None users = options.get('geni_users', []) - if users: - slice_record = users[0].get('slice_record', {}) - logger.debug("IOTLABDRIVER.PY \t ===============allocatte \t\ - \r\n \r\n users %s" % (users)) + + sfa_users = options.get('sfa_users', []) + if sfa_users: + slice_record = sfa_users[0].get('slice_record', []) + logger.debug("IOTLABDRIVER.PY \t ===============allocate \t\ + \r\n \r\n options %s slice_record %s" % (options,slice_record)) # parse rspec rspec = RSpec(rspec_string) # requested_attributes = rspec.version.get_slice_attributes() @@ -880,30 +905,65 @@ class IotlabDriver(Driver): # ensure site record exists # site = slices.verify_site(xrn.hrn, slice_record, peer, sfa_peer, options=options) # ensure slice record exists - current_slice = slices.verify_slice(xrn.hrn, slice_record, peer, sfa_peer, expiration=expiration, options=options) + + current_slice = slices.verify_slice(xrn.hrn, slice_record, sfa_peer) + logger.debug("IOTLABDRIVER.PY \t ===============allocate \t\ + \r\n \r\n current_slice %s" % (current_slice)) # ensure person records exists - persons = slices.verify_persons(xrn.hrn, slice, users, peer, sfa_peer, options=options) + + # oui c'est degueulasse, le slice_record se retrouve modifie + # dans la methode avec les infos du user, els infos sont propagees + # dans verify_slice_leases + persons = slices.verify_persons(xrn.hrn, slice_record, users, options=options) # ensure slice attributes exists # slices.verify_slice_attributes(slice, requested_attributes, options=options) # add/remove slice from nodes requested_xp_dict = self._process_requested_xp_dict(rspec) - logger.debug("IOTLABDRIVER.PY \tcreate_sliver requested_xp_dict %s " + logger.debug("IOTLABDRIVER.PY \tallocate requested_xp_dict %s " % (requested_xp_dict)) - # request_nodes = rspec.version.get_nodes_with_slivers() - # nodes = slices.verify_slice_nodes(urn, slice, request_nodes, peer) + request_nodes = rspec.version.get_nodes_with_slivers() + nodes_list = [] + for start_time in requested_xp_dict: + lease = requested_xp_dict[start_time] + for hostname in lease['hostname']: + nodes_list.append(hostname) + + # nodes = slices.verify_slice_nodes(slice_record,request_nodes, peer) + logger.debug("IOTLABDRIVER.PY \tallocate nodes_list %s slice_record %s" + % (nodes_list, slice_record)) + # add/remove leases + rspec_requested_leases = rspec.version.get_leases() + leases = slices.verify_slice_leases(slice_record, requested_xp_dict, peer) + logger.debug("IOTLABDRIVER.PY \tallocate leases %s rspec_requested_leases %s" + % (leases,rspec_requested_leases)) + # update sliver allocations + for hostname in nodes_list: + client_id = hostname + node_urn = xrn_object(self.testbed_shell.root_auth, hostname).urn + component_id = node_urn + slice_urn = current_slice['reg-urn'] + for lease in leases: + if hostname in lease['reserved_nodes']: + index = lease['reserved_nodes'].index(hostname) + sliver_hrn = '%s.%s-%s' % (self.hrn, lease['lease_id'], + lease['resource_ids'][index] ) + sliver_id = Xrn(sliver_hrn, type='sliver').urn + record = SliverAllocation(sliver_id=sliver_id, client_id=client_id, + component_id=component_id, + slice_urn = slice_urn, + allocation_state='geni_allocated') + + logger.debug("\r\n \ + ===============================IOTLABDRIVER.PY \tallocate sliver_id %s slice_urn %s \r\n" + % (sliver_id,slice_urn)) + record.sync(self.api.dbsession()) # add/remove links links # slices.verify_slice_links(slice, rspec.version.get_link_requests(), nodes) - # add/remove leases - # rspec_requested_leases = rspec.version.get_leases() - leases = slices.verify_slice_leases(current_slice, requested_xp_dict, peer) - # handle MyPLC peer association. - # only used by plc and ple. - slices.handle_peer(site, slice, None, peer) return aggregate.describe([xrn.get_urn()], version=rspec.version) @@ -916,12 +976,12 @@ class IotlabDriver(Driver): peer = slices.get_peer(current_slice['hrn']) sfa_peer = slices.get_sfa_peer(current_slice['hrn']) users = options.get('geni_users', []) - persons = slices.verify_persons(current_slice['hrn'], - current_slice, users, peer, sfa_peer, options=options) - slices.handle_peer(None, None, persons, peer) + # persons = slices.verify_persons(current_slice['hrn'], + # current_slice, users, peer, sfa_peer, options=options) + # slices.handle_peer(None, None, persons, peer) # update sliver allocation states and set them to geni_provisioned sliver_ids = [sliver['sliver_id'] for sliver in slivers] - dbsession=self.api.dbsession() + dbsession =self.api.dbsession() SliverAllocation.set_allocations(sliver_ids, 'geni_provisioned',dbsession) version_manager = VersionManager() rspec_version = version_manager.get_version(options['geni_rspec_version']) diff --git a/sfa/iotlab/iotlabshell.py b/sfa/iotlab/iotlabshell.py index 453852ea..e546943e 100644 --- a/sfa/iotlab/iotlabshell.py +++ b/sfa/iotlab/iotlabshell.py @@ -27,7 +27,7 @@ class IotlabShell(): _MINIMUM_DURATION = 10 # 10 units of granularity 60 s, 10 mins - def __init__(self, config): + def __init__(self, api): """Creates an instance of OARrestapi and LDAPapi which will be used to issue calls to OAR or LDAP methods. Set the time format and the testbed granularity used for OAR @@ -36,8 +36,8 @@ class IotlabShell(): :param config: configuration object from sfa.util.config :type config: Config object """ - # self.api=api - # config=api.config + self.api = api + config = api.config self.leases_db = TestbedAdditionalSfaDB(config) self.oar = OARrestapi() self.ldap = LDAPapi() @@ -814,6 +814,7 @@ class IotlabShell(): :type slice_record: dict :type lease_start_time: integer :type lease_duration: integer + :returns: job_id, can be None if the job request failed. """ logger.debug("IOTLAB_API \r\n \r\n \t AddLeases hostname_list %s \ @@ -828,31 +829,32 @@ class IotlabShell(): slice_record['hrn'], \ lease_start_time, lease_duration, \ username) - start_time = \ - datetime.fromtimestamp(int(lease_start_time)).\ - strftime(self.time_format) - end_time = lease_start_time + lease_duration + if job_id is not None: + start_time = \ + datetime.fromtimestamp(int(lease_start_time)).\ + strftime(self.time_format) + end_time = lease_start_time + lease_duration - logger.debug("IOTLAB_API \r\n \r\n \t AddLeases TURN ON LOGGING SQL \ - %s %s %s "%(slice_record['hrn'], job_id, end_time)) + logger.debug("IOTLAB_API \r\n \r\n \t AddLeases TURN ON LOGGING SQL \ + %s %s %s "%(slice_record['hrn'], job_id, end_time)) - logger.debug("IOTLAB_API \r\n \r\n \t AddLeases %s %s %s " \ - %(type(slice_record['hrn']), type(job_id), type(end_time))) + logger.debug("IOTLAB_API \r\n \r\n \t AddLeases %s %s %s " \ + %(type(slice_record['hrn']), type(job_id), type(end_time))) - iotlab_ex_row = LeaseTableXP(slice_hrn = slice_record['hrn'], experiment_id=job_id, - end_time= end_time) + iotlab_ex_row = LeaseTableXP(slice_hrn = slice_record['hrn'], experiment_id=job_id, + end_time= end_time) - logger.debug("IOTLAB_API \r\n \r\n \t AddLeases iotlab_ex_row %s" \ - %(iotlab_ex_row)) - self.leases_db.testbed_session.add(iotlab_ex_row) - self.leases_db.testbed_session.commit() + logger.debug("IOTLAB_API \r\n \r\n \t AddLeases iotlab_ex_row %s" \ + %(iotlab_ex_row)) + self.leases_db.testbed_session.add(iotlab_ex_row) + self.leases_db.testbed_session.commit() - logger.debug("IOTLAB_API \t AddLeases hostname_list start_time %s " \ - %(start_time)) + logger.debug("IOTLAB_API \t AddLeases hostname_list start_time %s " \ + %(start_time)) - return + return job_id #Delete the jobs from job_iotlab table diff --git a/sfa/iotlab/iotlabslices.py b/sfa/iotlab/iotlabslices.py index b7a81e0e..6b90c44d 100644 --- a/sfa/iotlab/iotlabslices.py +++ b/sfa/iotlab/iotlabslices.py @@ -207,10 +207,15 @@ class IotlabSlices: logger.debug("IOTLABSLICES \ NEWLEASE slice %s job %s" % (sfa_slice, job)) - self.driver.testbed_shell.AddLeases( + job_id = self.driver.testbed_shell.AddLeases( job['hostname'], sfa_slice, int(job['start_time']), int(job['duration'])) + if job_id is not None: + new_leases = self.driver.testbed_shell.GetLeases(login= + sfa_slice['login']) + for new_lease in new_leases: + leases.append(new_lease) #Deleted leases are the ones with lease id not declared in the Rspec if deleted_leases: @@ -378,7 +383,6 @@ class IotlabSlices: logger.debug("IOTLABSLICES \tverify_persons \tslice_hrn %s \ \t slice_record %s\r\n users %s \t " % (slice_hrn, slice_record, users)) - users_by_id = {} users_by_email = {} #users_dict : dict whose keys can either be the user's hrn or its id. @@ -387,19 +391,18 @@ class IotlabSlices: #First create dicts by hrn and id for each user in the user record list: for info in users: - if 'slice_record' in info: - slice_rec = info['slice_record'] - if 'user' in slice_rec : - user = slice_rec['user'] + # if 'slice_record' in info: + # slice_rec = info['slice_record'] + # if 'user' in slice_rec : + # user = slice_rec['user'] - if 'email' in user: - users_by_email[user['email']] = user - users_dict[user['email']] = user + if 'email' in info: + users_by_email[info['email']] = info + users_dict[info['email']] = info logger.debug("SLABSLICE.PY \t verify_person \ - users_dict %s \r\n user_by_email %s \r\n \ - \tusers_by_id %s " - % (users_dict, users_by_email, users_by_id)) + users_dict %s \r\n user_by_email %s \r\n " + % (users_dict, users_by_email)) existing_user_ids = [] existing_user_emails = [] @@ -417,12 +420,13 @@ class IotlabSlices: #Needed because what if the user has been deleted in LDAP but #is still in SFA? existing_users = self.driver.testbed_shell.GetPersons(filter_user) - logger.debug(" \r\n IOTLABSLICES.PY \tverify_person filter_user \ - %s existing_users %s " + logger.debug(" \r\n IOTLABSLICES.PY \tverify_person filter_user %s\ + existing_users %s " % (filter_user, existing_users)) #User is in iotlab LDAP if existing_users: for user in existing_users: + user['login'] = user['uid'] users_dict[user['email']].update(user) existing_user_emails.append( users_dict[user['email']]['email']) @@ -459,7 +463,7 @@ class IotlabSlices: #Check that the user of the slice in the slice record #matches one of the existing users try: - if slice_record['PI'][0] in requested_user_hrns: + if slice_record['reg-researchers'][0] in requested_user_hrns: logger.debug(" SLABSLICE \tverify_person ['PI']\ slice_record %s" % (slice_record)) diff --git a/sfa/iotlab/iotlabxrn.py b/sfa/iotlab/iotlabxrn.py index 5d842494..c7a147ca 100644 --- a/sfa/iotlab/iotlabxrn.py +++ b/sfa/iotlab/iotlabxrn.py @@ -46,8 +46,8 @@ def hrn_to_iotlab_authname (hrn): class IotlabXrn (Xrn): @staticmethod - def site_hrn (auth, testbed_name): - return '.'.join([auth, testbed_name]) + def site_hrn (auth): + return auth def __init__ (self, auth=None, hostname=None, login=None, slicename=None,**kwargs): #def hostname_to_hrn(auth_hrn, login_base, hostname): @@ -70,8 +70,6 @@ class IotlabXrn (Xrn): self.hrn_to_urn() # split at the first _ - - else: Xrn.__init__ (self,**kwargs) diff --git a/sfa/rspecs/elements/versions/iotlabv1Node.py b/sfa/rspecs/elements/versions/iotlabv1Node.py index 8d3722df..af6fe2a4 100644 --- a/sfa/rspecs/elements/versions/iotlabv1Node.py +++ b/sfa/rspecs/elements/versions/iotlabv1Node.py @@ -58,7 +58,7 @@ class Iotlabv1Node: network_elem.set('login', unicode(iotlab_network_dict['login'])) @staticmethod - def add_nodes(xml, nodes): + def add_nodes(xml, nodes,rspec_content_type=None): """Adds the nodes to the xml. Adds the nodes as well as dedicated iotlab fields to the node xml @@ -154,6 +154,9 @@ class Iotlabv1Node: #'value': initscript['name']}) Iotlabv1Sliver.add_slivers(node_elem, slivers) + # add sliver tag in Request Rspec + if rspec_content_type == "request": + node_elem.add_instance('sliver', '', []) return node_elems @staticmethod diff --git a/testbeds/iotlab/tests/tests_rspecs/iotlab_avakian_slice_iotlab2.rspec b/testbeds/iotlab/tests/tests_rspecs/iotlab_avakian_slice_iotlab2.rspec index c22b9e87..d6f60151 100644 --- a/testbeds/iotlab/tests/tests_rspecs/iotlab_avakian_slice_iotlab2.rspec +++ b/testbeds/iotlab/tests/tests_rspecs/iotlab_avakian_slice_iotlab2.rspec @@ -1,14 +1,14 @@ - + wsn430-8.devlille.iot-lab.info TRUE - + wsn430-5.devlille.iot-lab.info TRUE diff --git a/testbeds/iotlab/tests/tests_rspecs/iotlab_user_slice_iotlab.rspec b/testbeds/iotlab/tests/tests_rspecs/iotlab_user_slice_iotlab.rspec index 6a283f3d..ff78079b 100644 --- a/testbeds/iotlab/tests/tests_rspecs/iotlab_user_slice_iotlab.rspec +++ b/testbeds/iotlab/tests/tests_rspecs/iotlab_user_slice_iotlab.rspec @@ -1,14 +1,14 @@ - + wsn430-12.devlille.iot-lab.info TRUE - + "a8-11.devgrenoble.iot-lab.info TRUE -- 2.43.0