X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fplanetlab%2Fplaggregate.py;h=47c637bc5573dc84c2b127aaf771fb747c96ee36;hb=5f5f29e2bc00befe5b7b601806ef5a7e44349b75;hp=ccf68527c01d9481cb3a56f9479f29dff0fe7e03;hpb=8a8c1cf266637f8477e480debe46cb4d866c4f9e;p=sfa.git diff --git a/sfa/planetlab/plaggregate.py b/sfa/planetlab/plaggregate.py index ccf68527..47c637bc 100644 --- a/sfa/planetlab/plaggregate.py +++ b/sfa/planetlab/plaggregate.py @@ -1,5 +1,5 @@ #!/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 @@ -13,12 +13,15 @@ from sfa.rspecs.elements.location import Location 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.planetlab.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: @@ -115,7 +118,9 @@ 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': []}) @@ -126,7 +131,9 @@ class PlAggregate: 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': []}) @@ -149,11 +156,14 @@ class PlAggregate: 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 = [] @@ -193,7 +203,13 @@ class PlAggregate: # do not include boot state ( 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 @@ -205,6 +221,10 @@ class PlAggregate: 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']: @@ -218,14 +238,17 @@ class PlAggregate: 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']}) @@ -234,7 +257,52 @@ class PlAggregate: 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() @@ -249,17 +317,25 @@ class PlAggregate: 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()