X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fplanetlab%2Fplaggregate.py;h=399b3a2a0a17c0e7495d2d1450f9a562f7172ee6;hb=b54e90d0c3868fa5afb89ff784cba0d5d36265ad;hp=dc8a8ac7e8ef51d268f31c3a9b919968138ce77e;hpb=01160b187b31e1382e047c5027492bc311b6f6cd;p=sfa.git diff --git a/sfa/planetlab/plaggregate.py b/sfa/planetlab/plaggregate.py index dc8a8ac7..399b3a2a 100644 --- a/sfa/planetlab/plaggregate.py +++ b/sfa/planetlab/plaggregate.py @@ -1,27 +1,26 @@ #!/usr/bin/python from collections import defaultdict -from sfa.util.xrn import Xrn, hrn_to_urn, urn_to_hrn +from sfa.util.xrn import Xrn, hrn_to_urn, urn_to_hrn, get_authority, get_leaf from sfa.util.sfatime import utcparse, datetime_to_string from sfa.util.sfalogging import logger from sfa.util.faults import SliverDoesNotExist from sfa.rspecs.rspec import RSpec from sfa.rspecs.elements.hardware_type import HardwareType -from sfa.rspecs.elements.node import Node +from sfa.rspecs.elements.node import NodeElement from sfa.rspecs.elements.link import Link from sfa.rspecs.elements.sliver import Sliver from sfa.rspecs.elements.login import Login 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.services import ServicesElement 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, slicename_to_hrn +from sfa.planetlab.plxrn import PlXrn, hostname_to_urn, hrn_to_pl_slicename, slicename_to_hrn, top_auth, hash_loginbase from sfa.planetlab.vlink import get_tc_rate from sfa.planetlab.topology import Topology -from sfa.storage.alchemy import dbsession from sfa.storage.model import SliverAllocation @@ -129,7 +128,17 @@ class PlAggregate: except ValueError: pass else: - names.add(xrn.pl_slicename()) + slice_hrn = xrn.get_hrn() + top_auth_hrn = top_auth(slice_hrn) + site_hrn = '.'.join(slice_hrn.split('.')[:-1]) + slice_part = slice_hrn.split('.')[-1] + if top_auth_hrn == self.driver.hrn: + login_base = slice_hrn.split('.')[-2][:12] + else: + login_base = hash_loginbase(site_hrn) + + slice_name = '_'.join([login_base, slice_part]) + names.add(slice_name) filter = {} if names: @@ -141,7 +150,7 @@ class PlAggregate: if not slices: return [] slice = slices[0] - slice['hrn'] = PlXrn(auth=self.driver.hrn, slicename=slice['name']).hrn + slice['hrn'] = slice_hrn # get sliver users persons = [] @@ -165,10 +174,10 @@ class PlAggregate: # construct user key info users = [] for person in persons: - name = person['email'][0:person['email'].index('@')] + person_urn = hrn_to_urn(self.driver.shell.GetPersonHrn(int(person['person_id'])), 'user') user = { 'login': slice['name'], - 'user_urn': Xrn('%s.%s' % (self.driver.hrn, name), type='user').urn, + 'user_urn': person_urn, 'keys': [keys[k_id]['key'] for k_id in person['key_ids'] if k_id in keys] } users.append(user) @@ -190,10 +199,10 @@ class PlAggregate: return slivers def node_to_rspec_node(self, node, sites, interfaces, node_tags, pl_initscripts=[], grain=None, options={}): - rspec_node = Node() + rspec_node = NodeElement() # xxx how to retrieve site['login_base'] site=sites[node['site_id']] - rspec_node['component_id'] = PlXrn(self.driver.hrn, hostname=node['hostname']).get_urn() + rspec_node['component_id'] = hostname_to_urn(self.driver.hrn, site['login_base'], node['hostname']) rspec_node['component_name'] = node['hostname'] rspec_node['component_manager_id'] = Xrn(self.driver.hrn, 'authority+cm').get_urn() rspec_node['authority_id'] = hrn_to_urn(PlXrn.site_hrn(self.driver.hrn, site['login_base']), 'authority+sa') @@ -203,7 +212,13 @@ class PlAggregate: rspec_node['available'] = 'true' else: rspec_node['available'] = 'false' - rspec_node['exclusive'] = 'false' + + #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 @@ -248,9 +263,10 @@ class PlAggregate: 'type': 'plab-vserver', 'tags': []}) rspec_node['sliver_id'] = rspec_sliver['sliver_id'] - rspec_node['client_id'] = sliver_allocations[sliver['urn']].client_id - if sliver_allocations[sliver['urn']].component_id: - rspec_node['component_id'] = sliver_allocations[sliver['urn']].component_id + if sliver['urn'] in sliver_allocations: + rspec_node['client_id'] = sliver_allocations[sliver['urn']].client_id + if sliver_allocations[sliver['urn']].component_id: + rspec_node['component_id'] = sliver_allocations[sliver['urn']].component_id rspec_node['slivers'] = [rspec_sliver] # slivers always provide the ssh service @@ -260,7 +276,7 @@ class PlAggregate: 'username': sliver['name'], 'login': sliver['name'] }) - service = Services({'login': login, + service = ServicesElement({'login': login, 'services_user': sliver['services_user']}) rspec_node['services'] = [service] return rspec_node @@ -310,6 +326,9 @@ class PlAggregate: op_status = 'geni_unknown' else: allocation_status = 'geni_unallocated' + else: + allocation_status = 'geni_unallocated' + op_status = 'geni_failed' # required fields geni_sliver = {'geni_sliver_urn': rspec_node['sliver_id'], 'geni_expires': rspec_node['expires'], @@ -346,9 +365,8 @@ class PlAggregate: site_id=lease['site_id'] site=sites_dict[site_id] - rspec_lease['lease_id'] = lease['lease_id'] - rspec_lease['component_id'] = PlXrn(self.driver.hrn, hostname=lease['hostname']).urn - slice_hrn = slicename_to_hrn(self.driver.hrn, lease['name']) + rspec_lease['component_id'] = hrn_to_urn(self.driver.shell.GetNodeHrn(lease['hostname']), 'node') + slice_hrn = self.driver.shell.GetSliceHrn(lease['slice_id']) slice_urn = hrn_to_urn(slice_hrn, 'slice') rspec_lease['slice_id'] = slice_urn rspec_lease['start_time'] = lease['t_from'] @@ -390,6 +408,11 @@ class PlAggregate: # add links links = self.get_links(sites, nodes_dict, interfaces) rspec.version.add_links(links) + + if not options.get('list_leases') or options.get('list_leases') and options['list_leases'] != 'resources': + leases = self.get_leases() + rspec.version.add_leases(leases) + return rspec.toxml() def describe(self, urns, version=None, options={}):