2 from sfa.util.xrn import hrn_to_urn, urn_to_hrn, get_authority
4 from sfa.rspecs.rspec import RSpec
5 #from sfa.rspecs.elements.location import Location
6 from sfa.rspecs.elements.hardware_type import HardwareType
7 from sfa.rspecs.elements.login import Login
8 from sfa.rspecs.elements.services import Services
9 from sfa.rspecs.elements.sliver import Sliver
10 from sfa.rspecs.elements.lease import Lease
11 from sfa.rspecs.elements.granularity import Granularity
12 from sfa.rspecs.version_manager import VersionManager
15 from sfa.rspecs.elements.versions.slabv1Node import SlabPosition, SlabNode, \
17 from sfa.util.sfalogging import logger
19 from sfa.util.xrn import Xrn
21 def slab_xrn_to_hostname(xrn):
22 return Xrn.unescape(Xrn(xrn=xrn, type='node').get_leaf())
24 def slab_xrn_object(root_auth, hostname):
25 """Attributes are urn and hrn.
26 Get the hostname using slab_xrn_to_hostname on the urn.
28 :return: the senslab node's xrn
31 return Xrn('.'.join( [root_auth, Xrn.escape(hostname)]), type='node')
46 def __init__(self, driver):
49 def get_slice_and_slivers(self, slice_xrn, login=None):
51 Get the slices and the associated leases if any from the senslab
52 testbed. For each slice, get the nodes in the associated lease
53 and create a sliver with the necessary info and insertinto the sliver
54 dictionary, keyed on the node hostnames.
55 Returns a dict of slivers based on the sliver's node_id.
59 :param slice_xrn: xrn of the slice
60 :param login: user's login on senslab ldap
62 :type slice_xrn: string
64 :reutnr : a list of slices dict and a dictionary of Sliver object
67 ..note: There is no slivers in senslab, only leases.
73 return (sfa_slice, slivers)
74 slice_urn = hrn_to_urn(slice_xrn, 'slice')
75 slice_hrn, _ = urn_to_hrn(slice_xrn)
76 slice_name = slice_hrn
78 slices = self.driver.slab_api.GetSlices(slice_filter= str(slice_name), \
79 slice_filter_type = 'slice_hrn', \
82 logger.debug("Slabaggregate api \tget_slice_and_slivers \
83 sfa_slice %s \r\n slices %s self.driver.hrn %s" \
84 %(sfa_slice, slices, self.driver.hrn))
86 return (sfa_slice, slivers)
89 # sort slivers by node id , if there is a job
90 #and therefore, node allocated to this slice
91 for sfa_slice in slices:
93 node_ids_list = sfa_slice['node_ids']
95 logger.log_exc("SLABAGGREGATE \t \
96 get_slice_and_slivers KeyError ")
99 for node in node_ids_list:
100 sliver_xrn = Xrn(slice_urn, type='sliver', id=node)
101 sliver_xrn.set_authority(self.driver.hrn)
102 sliver = Sliver({'sliver_id':sliver_xrn.urn,
103 'name': sfa_slice['hrn'],
107 slivers[node] = sliver
110 #Add default sliver attribute :
111 #connection information for senslab
112 if get_authority (sfa_slice['hrn']) == self.driver.slab_api.root_auth:
113 tmp = sfa_slice['hrn'].split('.')
114 ldap_username = tmp[1].split('_')[0]
116 slivers['default_sliver'] = {'ssh': ssh_access , \
117 'login': ldap_username}
119 #TODO get_slice_and_slivers Find the login of the external user
121 logger.debug("SLABAGGREGATE api get_slice_and_slivers slivers %s "\
123 return (slices, slivers)
127 def get_nodes(self, slices=None, slivers=[], options=None):
128 # NT: the semantic of this function is not clear to me :
129 # if slice is not defined, then all the nodes should be returned
130 # if slice is defined, we should return only the nodes that
131 # are part of this slice
132 # but what is the role of the slivers parameter ?
133 # So i assume that slice['node_ids'] will be the same as slivers for us
136 #if not slices or not slices['node_ids']:
140 # get the granularity in second for the reservation system
141 grain = self.driver.slab_api.GetLeaseGranularity()
144 nodes = self.driver.slab_api.GetNodes()
145 #geni_available = options.get('geni_available')
147 #filter['boot_state'] = 'boot'
149 #filter.update({'peer_id': None})
150 #nodes = self.driver.slab_api.GetNodes(filter['hostname'])
159 #nodes_dict[node['node_id']] = node
160 #logger.debug("SLABAGGREGATE api get_nodes nodes %s "\
163 #sites_dict = self.get_sites({'site_id': site_ids})
165 #interfaces = self.get_interfaces({'interface_id':interface_ids})
167 #node_tags = self.get_node_tags(tags_filter)
169 #if slices, this means we got to list all the nodes given to this slice
170 # Make a list of all the nodes in the slice before getting their
173 slice_nodes_list = []
174 logger.debug("SLABAGGREGATE api get_nodes slice_nodes_list %s "\
177 for one_slice in slices:
179 slice_nodes_list = one_slice['node_ids']
182 #for node in one_slice['node_ids']:
183 #slice_nodes_list.append(node)
185 reserved_nodes = self.driver.slab_api.GetNodesCurrentlyInUse()
186 logger.debug("SLABAGGREGATE api get_nodes slice_nodes_list %s "\
189 nodes_dict[node['node_id']] = node
190 if slice_nodes_list == [] or node['hostname'] in slice_nodes_list:
192 rspec_node = SlabNode()
193 # xxx how to retrieve site['login_base']
194 #site_id=node['site_id']
195 #site=sites_dict[site_id]
197 rspec_node['mobile'] = node['mobile']
198 rspec_node['archi'] = node['archi']
199 rspec_node['radio'] = node['radio']
201 slab_xrn = slab_xrn_object(self.driver.slab_api.root_auth, \
203 rspec_node['component_id'] = slab_xrn.urn
204 rspec_node['component_name'] = node['hostname']
205 rspec_node['component_manager_id'] = \
206 hrn_to_urn(self.driver.slab_api.root_auth, \
209 # Senslab's nodes are federated : there is only one authority
210 # for all Senslab sites, registered in SFA.
211 # Removing the part including the site
212 # in authority_id SA 27/07/12
213 rspec_node['authority_id'] = rspec_node['component_manager_id']
215 # do not include boot state (<available> element)
216 #in the manifest rspec
219 rspec_node['boot_state'] = node['boot_state']
220 if node['hostname'] in reserved_nodes:
221 rspec_node['boot_state'] = "Reserved"
222 rspec_node['exclusive'] = 'true'
223 rspec_node['hardware_types'] = [HardwareType({'name': \
227 location = SlabLocation({'country':'France', 'site': \
229 rspec_node['location'] = location
232 position = SlabPosition()
233 for field in position :
235 position[field] = node[field]
236 except KeyError, error :
237 logger.log_exc("SLABAGGREGATE\t get_nodes \
238 position %s "%(error))
240 rspec_node['position'] = position
241 #rspec_node['interfaces'] = []
244 granularity = Granularity({'grain': grain})
245 rspec_node['granularity'] = granularity
246 rspec_node['tags'] = []
247 if node['hostname'] in slivers:
249 sliver = slivers[node['hostname']]
250 rspec_node['sliver_id'] = sliver['sliver_id']
251 rspec_node['client_id'] = node['hostname']
252 rspec_node['slivers'] = [sliver]
254 # slivers always provide the ssh service
255 login = Login({'authentication': 'ssh-keys', \
256 'hostname': node['hostname'], 'port':'22', \
257 'username': sliver['name']})
258 service = Services({'login': login})
259 rspec_node['services'] = [service]
260 rspec_nodes.append(rspec_node)
263 #def get_all_leases(self, slice_record = None):
264 def get_all_leases(self):
266 Get list of lease dictionaries which all have the mandatory keys
267 ('lease_id', 'hostname', 'site_id', 'name', 'start_time', 'duration').
268 All the leases running or scheduled are returned.
271 ..note::There is no filtering of leases within a given time frame.
272 All the running or scheduled leases are returned. options
273 removed SA 15/05/2013
278 #now = int(time.time())
279 #lease_filter = {'clip': now }
282 #lease_filter.update({'name': slice_record['name']})
284 #leases = self.driver.slab_api.GetLeases(lease_filter)
285 leases = self.driver.slab_api.GetLeases()
286 grain = self.driver.slab_api.GetLeaseGranularity()
290 #as many leases as there are nodes in the job
291 for node in lease['reserved_nodes']:
292 rspec_lease = Lease()
293 rspec_lease['lease_id'] = lease['lease_id']
294 #site = node['site_id']
295 slab_xrn = slab_xrn_object(self.driver.slab_api.root_auth, node)
296 rspec_lease['component_id'] = slab_xrn.urn
297 #rspec_lease['component_id'] = hostname_to_urn(self.driver.hrn,\
298 #site, node['hostname'])
300 rspec_lease['slice_id'] = lease['slice_id']
302 #No info on the slice used in slab_xp table
304 rspec_lease['start_time'] = lease['t_from']
305 rspec_lease['duration'] = (lease['t_until'] - lease['t_from']) \
307 rspec_leases.append(rspec_lease)
312 #from plc/aggregate.py
313 def get_rspec(self, slice_xrn=None, login=None, version = None, options
317 version_manager = VersionManager()
318 version = version_manager.get_version(version)
319 logger.debug("SlabAggregate \t get_rspec ***version %s \
320 version.type %s version.version %s options %s \r\n" \
321 %(version,version.type,version.version,options))
323 if slice_xrn is None:
324 rspec_version = version_manager._get_version(version.type, \
325 version.version, 'ad')
328 rspec_version = version_manager._get_version(version.type, \
329 version.version, 'manifest')
331 slices, slivers = self.get_slice_and_slivers(slice_xrn, login)
332 #at this point sliver may be empty if no senslab job
333 #is running for this user/slice.
334 rspec = RSpec(version=rspec_version, user_options=options)
337 #if slice and 'expires' in slice:
338 #rspec.xml.set('expires', datetime_to_epoch(slice['expires']))
339 # add sliver defaults
340 #nodes, links = self.get_nodes(slice, slivers)
341 logger.debug("\r\n \r\n SlabAggregate \tget_rspec *** \
342 slice_xrn %s slices %s\r\n \r\n"\
343 %(slice_xrn, slices))
346 lease_option = options['list_leases']
348 #If no options are specified, at least print the resources
351 #lease_option = 'all'
354 if lease_option in ['all', 'resources']:
355 #if not options.get('list_leases') or options.get('list_leases')
356 #and options['list_leases'] != 'leases':
357 nodes = self.get_nodes(slices, slivers)
358 logger.debug("\r\n \r\n SlabAggregate \ lease_option %s \
359 get rspec ******* nodes %s"\
360 %(lease_option, nodes[0]))
362 sites_set = set([node['location']['site'] for node in nodes] )
364 #In case creating a job, slice_xrn is not set to None
365 rspec.version.add_nodes(nodes)
367 #Get user associated with this slice
368 #user = dbsession.query(RegRecord).filter_by(record_id = \
369 #slices['record_id_user']).first()
371 #ldap_username = (user.hrn).split('.')[1]
374 #for one_slice in slices :
375 ldap_username = slices[0]['hrn']
376 tmp = ldap_username.split('.')
377 ldap_username = tmp[1].split('_')[0]
379 if version.type == "Slab":
380 rspec.version.add_connection_information(ldap_username, \
383 default_sliver = slivers.get('default_sliver', [])
385 #default_sliver_attribs = default_sliver.get('tags', [])
386 logger.debug("SlabAggregate \tget_rspec **** \
387 default_sliver%s \r\n" %(default_sliver))
388 for attrib in default_sliver:
389 rspec.version.add_default_sliver_attribute(attrib, \
390 default_sliver[attrib])
391 if lease_option in ['all','leases']:
392 #leases = self.get_all_leases(slices)
393 leases = self.get_all_leases()
394 rspec.version.add_leases(leases)
396 #logger.debug("SlabAggregate \tget_rspec ******* rspec_toxml %s \r\n"\