X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fsenslab%2Fslabaggregate.py;h=c31b32b4f706e9a47fd5308eb181cd1e660f8d57;hb=d041d6a410611efb27e66a12a9728996492f15d8;hp=0ec8ddea0bb975790888ce43c12bb28f00146b80;hpb=8d14077fe21d1e78dba172962f9f0d003974ec29;p=sfa.git diff --git a/sfa/senslab/slabaggregate.py b/sfa/senslab/slabaggregate.py index 0ec8ddea..c31b32b4 100644 --- a/sfa/senslab/slabaggregate.py +++ b/sfa/senslab/slabaggregate.py @@ -1,21 +1,19 @@ import time - - -from sfa.util.xrn import hrn_to_urn, urn_to_hrn, urn_to_sliver_id +from sfa.util.xrn import hrn_to_urn, urn_to_hrn, get_authority from sfa.rspecs.rspec import RSpec -from sfa.rspecs.elements.versions.slabv1Node import SlabPosition -from sfa.rspecs.elements.location import Location +#from sfa.rspecs.elements.location import Location from sfa.rspecs.elements.hardware_type import HardwareType -#from sfa.rspecs.elements.login import Login -#from sfa.rspecs.elements.services import Services +from sfa.rspecs.elements.login import Login +from sfa.rspecs.elements.services import Services 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.rspecs.elements.versions.slabv1Node import SlabNode +from sfa.rspecs.elements.versions.slabv1Node import SlabPosition, SlabNode, \ + SlabLocation from sfa.util.sfalogging import logger from sfa.util.xrn import Xrn @@ -46,7 +44,7 @@ class SlabAggregate: def __init__(self, driver): self.driver = driver - def get_slice_and_slivers(self, slice_xrn): + def get_slice_and_slivers(self, slice_xrn, login=None): """ Returns a dict of slivers keyed on the sliver's node_id """ @@ -58,10 +56,13 @@ class SlabAggregate: slice_hrn, _ = urn_to_hrn(slice_xrn) slice_name = slice_hrn - slices = self.driver.GetSlices(slice_filter= str(slice_name), \ - slice_filter_type = 'slice_hrn') - logger.debug("Slabaggregate api \tget_slice_and_slivers slices %s " \ - %(slices)) + slices = self.driver.slab_api.GetSlices(slice_filter= str(slice_name), \ + slice_filter_type = 'slice_hrn', \ + login=login) + + logger.debug("Slabaggregate api \tget_slice_and_slivers \ + sfa_slice %s \r\n slices %s self.driver.hrn %s" \ + %(sfa_slice, slices, self.driver.hrn)) if not slices: return (sfa_slice, slivers) #if isinstance(sfa_slice, list): @@ -73,35 +74,34 @@ class SlabAggregate: #and therfore, node allocated to this slice for sfa_slice in slices: try: - - for node in sfa_slice['node_ids']: - #node_id = self.driver.root_auth + '.' + node_id - sliver = Sliver({'sliver_id': Xrn(slice_urn, type='slice', id=node['hostname'], authority=self.driver.hrn).urn, - 'name': sfa_slice['slice_hrn'], - 'type': 'slab-node', - 'tags': []}) - - slivers[node['hostname']] = sliver + node_ids_list = sfa_slice['node_ids'] except KeyError: logger.log_exc("SLABAGGREGATE \t \ get_slice_and_slivers KeyError ") + continue + + for node in node_ids_list: + sliver_xrn = Xrn(slice_urn, type='sliver', id=node) + sliver_xrn.set_authority(self.driver.hrn) + sliver = Sliver({'sliver_id':sliver_xrn.urn, + 'name': sfa_slice['hrn'], + 'type': 'slab-node', + 'tags': []}) + + slivers[node] = sliver + #Add default sliver attribute : #connection information for senslab - tmp = sfa_slice['slice_hrn'].split('.') - ldap_username = tmp[1].split('_')[0] - vmaddr = 'ssh ' + ldap_username + '@grenoble.senslab.info' - slivers['default_sliver'] = {'vm': vmaddr , 'login': ldap_username} - ## sort sliver attributes by node id - ##tags = self.driver.GetSliceTags({'slice_tag_id': slice['slice_tag_ids']}) - ##for tag in tags: - ### most likely a default/global sliver attribute (node_id == None) - ##if tag['node_id'] not in slivers: - ##sliver = Sliver({'sliver_id': urn_to_sliver_id(slice_urn, slice['slice_id'], ""), - ##'name': 'slab-vm', - ##'tags': []}) - ##slivers[tag['node_id']] = sliver - ##slivers[tag['node_id']]['tags'].append(tag) + if get_authority (sfa_slice['hrn']) == self.driver.slab_api.root_auth: + tmp = sfa_slice['hrn'].split('.') + ldap_username = tmp[1].split('_')[0] + ssh_access = None + slivers['default_sliver'] = {'ssh': ssh_access , \ + 'login': ldap_username} + + #TODO get_slice_and_slivers Find the login of the external user + logger.debug("SLABAGGREGATE api get_slice_and_slivers slivers %s "\ %(slivers)) return (slices, slivers) @@ -119,10 +119,10 @@ class SlabAggregate: #if slice_xrn: #if not slices or not slices['node_ids']: #return ([],[]) - tags_filter = {} + #tags_filter = {} # get the granularity in second for the reservation system - grain = self.driver.GetLeaseGranularity() + grain = self.driver.slab_api.GetLeaseGranularity() # Commenting this part since all nodes should be returned, # even if a slice is provided @@ -131,20 +131,20 @@ class SlabAggregate: # #first case, a non empty slice was provided # filter['hostname'] = slice['node_ids'] # tags_filter=filter.copy() - # nodes = self.driver.GetNodes(filter['hostname']) + # nodes = self.driver.slab_api.GetNodes(filter['hostname']) # else : # #second case, a slice was provided, but is empty # nodes={} #else : # #third case, no slice was provided - # nodes = self.driver.GetNodes() - nodes = self.driver.GetNodes() + # nodes = self.driver.slab_api.GetNodes() + nodes = self.driver.slab_api.GetNodes() #geni_available = options.get('geni_available') #if geni_available: #filter['boot_state'] = 'boot' #filter.update({'peer_id': None}) - #nodes = self.driver.GetNodes(filter['hostname']) + #nodes = self.driver.slab_api.GetNodes(filter['hostname']) #site_ids = [] #interface_ids = [] @@ -153,7 +153,8 @@ class SlabAggregate: for node in nodes: nodes_dict[node['node_id']] = node - + #logger.debug("SLABAGGREGATE api get_nodes nodes %s "\ + #%(nodes )) # get sites #sites_dict = self.get_sites({'site_id': site_ids}) # get interfaces @@ -165,13 +166,19 @@ class SlabAggregate: # Make a list of all the nodes in the slice before getting their attributes rspec_nodes = [] slice_nodes_list = [] + logger.debug("SLABAGGREGATE api get_nodes slice_nodes_list %s "\ + %(slices )) if slices: for one_slice in slices: - for node in one_slice['node_ids']: - slice_nodes_list.append(node['hostname']) + try: + slice_nodes_list = one_slice['node_ids'] + except KeyError: + pass + #for node in one_slice['node_ids']: + #slice_nodes_list.append(node) - reserved_nodes = self.driver.GetNodesCurrentlyInUse() - logger.debug("SLABAGGREGATE api get_rspec slice_nodes_list %s "\ + reserved_nodes = self.driver.slab_api.GetNodesCurrentlyInUse() + logger.debug("SLABAGGREGATE api get_nodes slice_nodes_list %s "\ %(slice_nodes_list)) for node in nodes: # skip whitelisted nodes @@ -179,59 +186,65 @@ class SlabAggregate: #if not slice or slice['slice_id'] not in node['slice_ids_whitelist']: #continue #rspec_node = Node() - logger.debug("SLABAGGREGATE api get_rspec node %s "\ - %(node)) + #logger.debug("SLABAGGREGATE api get_nodes node %s "\ + #%(node)) if slice_nodes_list == [] or node['hostname'] in slice_nodes_list: rspec_node = SlabNode() # xxx how to retrieve site['login_base'] #site_id=node['site_id'] #site=sites_dict[site_id] + rspec_node['mobile'] = node['mobile'] rspec_node['archi'] = node['archi'] rspec_node['radio'] = node['radio'] - slab_xrn = slab_xrn_object(self.driver.root_auth, node['hostname']) + slab_xrn = slab_xrn_object(self.driver.slab_api.root_auth, \ + node['hostname']) rspec_node['component_id'] = slab_xrn.urn rspec_node['component_name'] = node['hostname'] rspec_node['component_manager_id'] = \ - hrn_to_urn(self.driver.root_auth, 'authority+sa') + hrn_to_urn(self.driver.slab_api.root_auth, 'authority+sa') # Senslab's nodes are federated : there is only one authority # for all Senslab sites, registered in SFA. - # Removing the part including the site in authority_id SA 27/07/12 + # Removing the part including the site + # in authority_id SA 27/07/12 rspec_node['authority_id'] = rspec_node['component_manager_id'] - # do not include boot state ( element) in the manifest rspec + # do not include boot state ( element) + #in the manifest rspec rspec_node['boot_state'] = node['boot_state'] if node['hostname'] in reserved_nodes: rspec_node['boot_state'] = "Reserved" - rspec_node['exclusive'] = 'True' - rspec_node['hardware_types'] = [HardwareType({'name': 'slab-node'})] + rspec_node['exclusive'] = 'true' + rspec_node['hardware_types'] = [HardwareType({'name': \ + 'slab-node'})] # only doing this because protogeni rspec needs # to advertise available initscripts - #rspec_node['pl_initscripts'] = None # add site/interface info to nodes. - # assumes that sites, interfaces and tags have already been prepared. - #site = sites_dict[node['site_id']] - location = Location({'country':'France'}) + # assumes that sites, interfaces and tags have already been + #prepared. + + location = SlabLocation({'country':'France','site': \ + node['site']}) rspec_node['location'] = location - + position = SlabPosition() for field in position : try: position[field] = node[field] except KeyError, error : - logger.log_exc("SLABAGGREGATE\t get_rspec position %s "%(error)) + logger.log_exc("SLABAGGREGATE\t get_nodes \ + position %s "%(error)) rspec_node['position'] = position #rspec_node['interfaces'] = [] - #tags = [PLTag(node_tags[tag_id]) for tag_id in node['node_tag_ids']] # Granularity granularity = Granularity({'grain': grain}) rspec_node['granularity'] = granularity @@ -244,9 +257,9 @@ class SlabAggregate: rspec_node['slivers'] = [sliver] # slivers always provide the ssh service - #login = Login({'authentication': 'ssh-keys', 'hostname': node['hostname'], 'port':'22', 'username': sliver['name']}) - #service = Services({'login': login}) - #rspec_node['services'] = [service] + login = Login({'authentication': 'ssh-keys', 'hostname': node['hostname'], 'port':'22', 'username': sliver['name']}) + service = Services({'login': login}) + rspec_node['services'] = [service] rspec_nodes.append(rspec_node) return (rspec_nodes) @@ -255,15 +268,14 @@ class SlabAggregate: now = int(time.time()) lease_filter = {'clip': now } - - #self.driver.synchronize_oar_and_slice_table() + #if slice_record: #lease_filter.update({'name': slice_record['name']}) return_fields = ['lease_id', 'hostname', 'site_id', \ 'name', 'start_time', 'duration'] - #leases = self.driver.GetLeases(lease_filter) - leases = self.driver.GetLeases() - grain = self.driver.GetLeaseGranularity() + #leases = self.driver.slab_api.GetLeases(lease_filter) + leases = self.driver.slab_api.GetLeases() + grain = self.driver.slab_api.GetLeaseGranularity() site_ids = [] rspec_leases = [] for lease in leases: @@ -271,12 +283,16 @@ class SlabAggregate: for node in lease['reserved_nodes']: rspec_lease = Lease() rspec_lease['lease_id'] = lease['lease_id'] - site = node['site_id'] - slab_xrn = slab_xrn_object(self.driver.root_auth, node['hostname']) + #site = node['site_id'] + slab_xrn = slab_xrn_object(self.driver.slab_api.root_auth, node) rspec_lease['component_id'] = slab_xrn.urn #rspec_lease['component_id'] = hostname_to_urn(self.driver.hrn, \ #site, node['hostname']) - rspec_lease['slice_id'] = lease['slice_id'] + try: + rspec_lease['slice_id'] = lease['slice_id'] + except KeyError: + #No info on the slice used in slab_xp table + pass rspec_lease['start_time'] = lease['t_from'] rspec_lease['duration'] = (lease['t_until'] - lease['t_from']) \ / grain @@ -302,7 +318,7 @@ class SlabAggregate: #rspec_leases.append(rspec_lease) #return rspec_leases #from plc/aggregate.py - def get_rspec(self, slice_xrn=None, version = None, options={}): + def get_rspec(self, slice_xrn=None, login=None, version = None, options={}): rspec = None version_manager = VersionManager() @@ -319,7 +335,7 @@ class SlabAggregate: rspec_version = version_manager._get_version(version.type, \ version.version, 'manifest') - slices, slivers = self.get_slice_and_slivers(slice_xrn) + slices, slivers = self.get_slice_and_slivers(slice_xrn, login) #at this point sliver may be empty if no senslab job #is running for this user/slice. rspec = RSpec(version=rspec_version, user_options=options) @@ -329,22 +345,26 @@ class SlabAggregate: #rspec.xml.set('expires', datetime_to_epoch(slice['expires'])) # add sliver defaults #nodes, links = self.get_nodes(slice, slivers) - logger.debug("\r\n \r\n SlabAggregate \tget_rspec ******* slice_xrn %s \r\n \r\n"\ - %(slice_xrn)) + logger.debug("\r\n \r\n SlabAggregate \tget_rspec ******* slice_xrn %s slices %s\r\n \r\n"\ + %(slice_xrn, slices)) try: lease_option = options['list_leases'] except KeyError: #If no options are specified, at least print the resources - if slice_xrn : - lease_option = 'all' + lease_option = 'all' + #if slice_xrn : + #lease_option = 'all' pass if lease_option in ['all', 'resources']: #if not options.get('list_leases') or options.get('list_leases') and options['list_leases'] != 'leases': nodes = self.get_nodes(slices, slivers) - logger.debug("SlabAggregate \tget_rspec **** \ - nodes %s \r\n" %(nodes)) + logger.debug("\r\n \r\n SlabAggregate \ lease_option %s get rspec ******* nodes %s"\ + %(lease_option, nodes[0])) + + sites_set = set([node['location']['site'] for node in nodes] ) + #In case creating a job, slice_xrn is not set to None rspec.version.add_nodes(nodes) if slice_xrn : @@ -356,12 +376,12 @@ class SlabAggregate: #for one_slice in slices : - ldap_username = slices[0]['slice_hrn'] + ldap_username = slices[0]['hrn'] tmp = ldap_username.split('.') ldap_username = tmp[1].split('_')[0] if version.type == "Slab": - rspec.version.add_connection_information(ldap_username) + rspec.version.add_connection_information(ldap_username, sites_set) default_sliver = slivers.get('default_sliver', []) if default_sliver: @@ -376,6 +396,6 @@ class SlabAggregate: leases = self.get_leases(slices) rspec.version.add_leases(leases) - logger.debug("SlabAggregate \tget_rspec ******* rspec_toxml %s \r\n"\ - %(rspec.toxml())) + #logger.debug("SlabAggregate \tget_rspec ******* rspec_toxml %s \r\n"\ + #%(rspec.toxml())) return rspec.toxml()