#!/usr/bin/python
-from sfa.util.xrn import Xrn, hrn_to_urn, urn_to_hrn, urn_to_sliver_id
+from sfa.util.xrn import Xrn, hrn_to_urn, urn_to_hrn
from sfa.util.sfatime import utcparse, datetime_to_string
from sfa.util.sfalogging import logger
from sfa.rspecs.elements.interface import Interface
from sfa.rspecs.elements.services import Services
from sfa.rspecs.elements.pltag import PLTag
+from sfa.rspecs.elements.lease import Lease
+from sfa.rspecs.elements.granularity import Granularity
from sfa.rspecs.version_manager import VersionManager
-from sfa.util.plxrn import PlXrn, hostname_to_urn, hrn_to_pl_slicename
+from sfa.planetlab.plxrn import PlXrn, hostname_to_urn, hrn_to_pl_slicename, slicename_to_hrn
from sfa.planetlab.vlink import get_tc_rate
from sfa.planetlab.topology import Topology
+import time
class PlAggregate:
# sort slivers by node id
for node_id in slice['node_ids']:
- sliver = Sliver({'sliver_id': urn_to_sliver_id(slice_urn, slice['slice_id'], node_id, authority=self.driver.hrn),
+ sliver_xrn = Xrn(slice_urn, type='sliver', id=node_id)
+ sliver_xrn.set_authority(self.driver.hrn)
+ sliver = Sliver({'sliver_id': sliver_xrn.urn,
'name': slice['name'],
'type': 'plab-vserver',
'tags': []})
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'], ""),
+ sliver_xrn = Xrn(slice_urn, type='sliver', id=tag['node_id'])
+ sliver_xrn.set_authority(self.driver.hrn)
+ sliver = Sliver({'sliver_id': sliver_xrn.urn,
'name': slice['name'],
'type': 'plab-vserver',
'tags': []})
tags_filter=filter.copy()
geni_available = options.get('geni_available')
- if geni_available:
+ if geni_available == True:
filter['boot_state'] = 'boot'
filter.update({'peer_id': None})
nodes = self.driver.shell.GetNodes(filter)
+
+ # get the granularity in second for the reservation system
+ grain = self.driver.shell.GetLeaseGranularity()
site_ids = []
interface_ids = []
# do not include boot state (<available> element) in the manifest rspec
if not slice:
rspec_node['boot_state'] = node['boot_state']
- rspec_node['exclusive'] = 'false'
+
+ #add the exclusive tag to distinguish between Shared and Reservable nodes
+ if node['node_type'] == 'reservable':
+ rspec_node['exclusive'] = 'true'
+ else:
+ rspec_node['exclusive'] = 'false'
+
rspec_node['hardware_types'] = [HardwareType({'name': 'plab-pc'}),
HardwareType({'name': 'pc'})]
# only doing this because protogeni rspec needs
if site['longitude'] and site['latitude']:
location = Location({'longitude': site['longitude'], 'latitude': site['latitude'], 'country': 'unknown'})
rspec_node['location'] = location
+ # Granularity
+ granularity = Granularity({'grain': grain})
+ rspec_node['granularity'] = granularity
+
rspec_node['interfaces'] = []
if_count=0
for if_id in node['interface_ids']:
rspec_node['interfaces'].append(interface)
if_count+=1
- tags = [PLTag(node_tags[tag_id]) for tag_id in node['node_tag_ids']]
+ tags = [PLTag(node_tags[tag_id]) for tag_id in node['node_tag_ids']\
+ if tag_id in node_tags]
rspec_node['tags'] = tags
if node['node_id'] in slivers:
# add sliver info
sliver = slivers[node['node_id']]
rspec_node['sliver_id'] = sliver['sliver_id']
- rspec_node['client_id'] = node['hostname']
rspec_node['slivers'] = [sliver]
+ for tag in sliver['tags']:
+ if tag['tagname'] == 'client_id':
+ rspec_node['client_id'] = tag['value']
# slivers always provide the ssh service
login = Login({'authentication': 'ssh-keys', 'hostname': node['hostname'], 'port':'22', 'username': sliver['name']})
rspec_nodes.append(rspec_node)
return (rspec_nodes, links)
+
+ def get_leases(self, slice_xrn=None, slice=None, options={}):
+ if slice_xrn and not slice:
+ return []
+
+ now = int(time.time())
+ filter={}
+ filter.update({'clip':now})
+ if slice:
+ filter.update({'name':slice['name']})
+ return_fields = ['lease_id', 'hostname', 'site_id', 'name', 't_from', 't_until']
+ leases = self.driver.shell.GetLeases(filter)
+ grain = self.driver.shell.GetLeaseGranularity()
+
+ site_ids = []
+ for lease in leases:
+ site_ids.append(lease['site_id'])
+
+ # get sites
+ sites_dict = self.get_sites({'site_id': site_ids})
+
+ rspec_leases = []
+ for lease in leases:
+
+ rspec_lease = Lease()
+
+ # xxx how to retrieve site['login_base']
+ site_id=lease['site_id']
+ site=sites_dict[site_id]
+
+ #rspec_lease['lease_id'] = lease['lease_id']
+ rspec_lease['component_id'] = hostname_to_urn(self.driver.hrn, site['login_base'], lease['hostname'])
+ if slice_xrn:
+ slice_urn = slice_xrn
+ slice_hrn = urn_to_hrn(slice_urn)
+ else:
+ slice_hrn = slicename_to_hrn(self.driver.hrn, lease['name'])
+ slice_urn = hrn_to_urn(slice_hrn, 'slice')
+ rspec_lease['slice_id'] = slice_urn
+ 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_rspec(self, slice_xrn=None, version = None, options={}):
version_manager = VersionManager()
if slice and 'expires' in slice:
rspec.xml.set('expires', datetime_to_string(utcparse(slice['expires'])))
- nodes, links = self.get_nodes_and_links(slice_xrn, slice, slivers)
- rspec.version.add_nodes(nodes)
- rspec.version.add_links(links)
+ if not options.get('list_leases') or options.get('list_leases') and options['list_leases'] != 'leases':
+ if slice_xrn and not slivers:
+ nodes, links = [], []
+ else:
+ nodes, links = self.get_nodes_and_links(slice_xrn, slice, slivers, options)
+ rspec.version.add_nodes(nodes)
+ rspec.version.add_links(links)
+ # add sliver defaults
+ default_sliver = slivers.get(None, [])
+ if default_sliver:
+ default_sliver_attribs = default_sliver.get('tags', [])
+ for attrib in default_sliver_attribs:
+ logger.info(attrib)
+ rspec.version.add_default_sliver_attribute(attrib['tagname'], attrib['value'])
- # add sliver defaults
- default_sliver = slivers.get(None, [])
- if default_sliver:
- default_sliver_attribs = default_sliver.get('tags', [])
- for attrib in default_sliver_attribs:
- logger.info(attrib)
- rspec.version.add_default_sliver_attribute(attrib['tagname'], attrib['value'])
+ if not options.get('list_leases') or options.get('list_leases') and options['list_leases'] != 'resources':
+ leases = self.get_leases(slice_xrn, slice)
+ rspec.version.add_leases(leases)
+
return rspec.toxml()