slice_hrn, _ = urn_to_hrn(slice_xrn)
# GetSlices always returns a list, even if there is only one element
- slices = self.driver.GetSlices(
- slice_filter=str(slice_hrn),
+ slices = self.driver.GetSlices(slice_filter=str(slice_hrn),
slice_filter_type='slice_hrn',
login=login)
return rspec_node
- def rspec_node_to_geni_sliver(self, rspec_node, sliver_allocations = {}):
+ def rspec_node_to_geni_sliver(self, rspec_node, sliver_allocations = None):
"""Makes a geni sliver structure from all the nodes allocated
to slivers in the sliver_allocations dictionary. Returns the states
of the sliver.
.. seealso:: node_to_rspec_node
"""
+ if sliver_allocations is None: sliver_allocations={}
if rspec_node['sliver_id'] in sliver_allocations:
# set sliver allocation and operational status
sliver_allocation = sliver_allocations[rspec_node['sliver_id']]
:param sliver_allocations: dictionary of slivers
:type sliver_allocations: dict
- :returns: Node dictionary with all necessary data. .
+ :returns: Node dictionary with all necessary data.
+
.. seealso:: node_to_rspec_node
"""
rspec_node = self.node_to_rspec_node(sliver)
return rspec_node
+ def get_leases(self, slice=None, options=None):
+ if options is None: options={}
+ filter={}
+ if slice:
+ filter.update({'slice_hrn':slice['slice_hrn']}) # JORDAN: this is = "upmc" !!!
+ #filter.update({'name':slice['slice_name']})
+ #return_fields = ['lease_id', 'hostname', 'site_id', 'name', 't_from', 't_until']
+ leases = self.driver.GetLeases(lease_filter_dict=filter)
+ grain = self.driver.testbed_shell.GetLeaseGranularity()
+
+ rspec_leases = []
+ for lease in leases:
+ #as many leases as there are nodes in the job
+ for node in lease['reserved_nodes']:
+ rspec_lease = Lease()
+ rspec_lease['lease_id'] = lease['lease_id']
+ #site = node['site_id']
+ iotlab_xrn = xrn_object(self.driver.testbed_shell.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 testbed_xp table
+ pass
+ rspec_lease['start_time'] = lease['t_from']
+ rspec_lease['duration'] = (lease['t_until'] - lease['t_from']) \
+ / grain
+ rspec_leases.append(rspec_lease)
+ return rspec_leases
+
+
def get_all_leases(self, ldap_username):
"""
Get list of lease dictionaries which all have the mandatory keys
FINAL RSPEC %s \r\n" % (rspec.toxml()))
return rspec.toxml()
- def get_slivers(self, urns, options={}):
+ def get_slivers(self, urns, options=None):
"""Get slivers of the given slice urns. Slivers contains slice, node and
user information.
.. seealso:: http://groups.geni.net/geni/wiki/GAPI_AM_API_V3/CommonConcepts#urns
"""
-
-
+ # JORDAN using SLICE_KEY for slice_hrn
+ SLICE_KEY = 'slice_hrn' # slice_hrn
+ if options is None: options={}
slice_ids = set()
node_ids = []
for urn in urns:
\r\n" % (xrn, slice_names))
filter_sliver = {}
if slice_names:
- filter_sliver['slice_hrn'] = list(slice_names)
- slice_hrn = filter_sliver['slice_hrn'][0]
+ filter_sliver[SLICE_KEY] = list(slice_names)
+ slice_hrn = filter_sliver[SLICE_KEY][0]
- slice_filter_type = 'slice_hrn'
+ slice_filter_type = SLICE_KEY
# if slice_ids:
# filter['slice_id'] = list(slice_ids)
# # get slices
if slice_hrn:
+ #logger.debug("JORDAN SLICE_HRN=%r" % slice_hrn)
slices = self.driver.GetSlices(slice_hrn,
slice_filter_type)
- leases = self.driver.GetLeases({'slice_hrn':slice_hrn})
+ leases = self.driver.GetLeases({SLICE_KEY:slice_hrn})
logger.debug("IotlabAggregate \t get_slivers \
slices %s leases %s\r\n" % (slices, leases ))
if not slices:
single_slice = slices[0]
# get sliver users
+ # XXX LOIC !!! XXX QUICK AND DIRTY - Let's try...
+ logger.debug("LOIC Number of reg_researchers = %s" % len(single_slice['reg_researchers']))
+ if 'reg_researchers' in single_slice and len(single_slice['reg_researchers'])==0:
+ user = {'uid':single_slice['user']}
+ else:
+ user = single_slice['reg_researchers'][0].__dict__
+
user = single_slice['reg_researchers'][0].__dict__
logger.debug("IotlabAggregate \t get_slivers user %s \
\r\n" % (user))
\r\n" % (person))
# name = person['last_name']
user['login'] = person['uid']
- user['user_urn'] = hrn_to_urn(user['hrn'], 'user')
- user['keys'] = person['pkey']
+ # XXX LOIC !!! if we have more info, let's fill user
+ if 'hrn' in user:
+ user['user_urn'] = hrn_to_urn(user['hrn'], 'user')
+ if 'keys' in user:
+ user['keys'] = person['pkey']
try:
+ logger.debug("############################################ iotlab AM : single_slice = %s" % single_slice)
node_ids = single_slice['node_ids']
- node_list = self.driver.testbed_shell.GetNodes(
- {'hostname':single_slice['node_ids']})
+ node_list = self.driver.testbed_shell.GetNodes()
+ logger.debug("############################################ iotlab AM : node_list = %s" % node_list)
+# JORDAN REMOVED FILTER so that next check always succeed
+# {'hostname':single_slice['node_ids']})
node_by_hostname = dict([(node['hostname'], node)
for node in node_list])
except KeyError:
node_id = current_lease['resource_ids'][index]
# node['slice_name'] = user['login']
# node.update(single_slice)
+ # JORDAN XXX This fails sometimes when hostname not in the list
+ #if hostname in node_by_hostname:
more_info = node_by_hostname[hostname]
node.update(more_info)
+ #else:
+ # # This can happen when specifying a lease without the resource, then all subsequent calls will fail
+ # logger.debug("Ignored missing hostname for now one")
# oar_job_id is the slice_id (lease_id)
sliver_hrn = '%s.%s-%s' % (self.driver.hrn,
- current_lease['lease_id'], node_id)
+ 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
slivers.append(node)
return slivers
- def list_resources(self, version = None, options={}):
+ def list_resources(self, version = None, options=None):
"""
Returns an advertisement Rspec of available resources at this
aggregate. This Rspec contains a resource listing along with their
.. seealso:: http://groups.geni.net/geni/wiki/GAPI_AM_API_V3#ListResources
"""
+ if options is None: options={}
version_manager = VersionManager()
version = version_manager.get_version(version)
rspec_version = version_manager._get_version(version.type,
return rspec.toxml()
- def describe(self, urns, version=None, options={}):
+ def describe(self, urns, version=None, options=None):
"""
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.
.. seealso:: http://groups.geni.net/geni/wiki/GAPI_AM_API_V3#Describe
.. seealso:: http://groups.geni.net/geni/wiki/GAPI_AM_API_V3/CommonConcepts#urns
"""
+ if options is None: options={}
version_manager = VersionManager()
version = version_manager.get_version(version)
rspec_version = version_manager._get_version(
# 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)
query = self.driver.api.dbsession().query(SliverAllocation)
sliver_allocations = query.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
sliver_allocation_dict[sliver_allocation.sliver_id] = \
sliver_allocation
+ # JORDAN get the option list_leases if we want to have the leases in describe
+ show_leases = options.get('list_leases')
+ if show_leases in ['resources', 'all']:
+ #if not options.get('list_leases') or options['list_leases'] != 'leases':
+ # add slivers
+ nodes_dict = {}
+ for sliver in slivers:
+ nodes_dict[sliver['node_id']] = sliver
+ rspec_nodes = []
+ for sliver in slivers:
+ rspec_node = self.sliver_to_rspec_node(sliver,
+ sliver_allocation_dict)
+ rspec_nodes.append(rspec_node)
+ geni_sliver = self.rspec_node_to_geni_sliver(rspec_node,
+ sliver_allocation_dict)
+ geni_slivers.append(geni_sliver)
+ rspec.version.add_nodes(rspec_nodes)
- # add slivers
- nodes_dict = {}
- for sliver in slivers:
- nodes_dict[sliver['node_id']] = sliver
- rspec_nodes = []
- 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)
+ if show_leases in ['leases', 'all']:
+ #if not options.get('list_leases') or options['list_leases'] == 'resources':
+ if slivers:
+ leases = self.get_leases(slice=slivers[0])
+ logger.debug("JORDAN: getting leases from slice: %r" % slivers[0])
+ rspec.version.add_leases(leases)
return {'geni_urn': geni_urn,
'geni_rspec': rspec.toxml(),
- 'geni_slivers': geni_slivers}
\ No newline at end of file
+ 'geni_slivers': geni_slivers}