X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fplanetlab%2Fplaggregate.py;h=32d6d933e7cecd36972137428d5377d9456bfdbc;hb=047496aae8c0251fb2624f71c1d81b73ac491fa4;hp=cae6495b6ecb695ec43f91febebbc39caa354000;hpb=1797053da9abae56a22655efe188ccb3e4bbcf61;p=sfa.git diff --git a/sfa/planetlab/plaggregate.py b/sfa/planetlab/plaggregate.py index cae6495b..32d6d933 100644 --- a/sfa/planetlab/plaggregate.py +++ b/sfa/planetlab/plaggregate.py @@ -18,7 +18,7 @@ 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, top_auth, hash_loginbase +from sfa.planetlab.plxrn import PlXrn, hostname_to_urn from sfa.planetlab.vlink import get_tc_rate from sfa.planetlab.topology import Topology from sfa.storage.model import SliverAllocation @@ -31,7 +31,8 @@ class PlAggregate: def __init__(self, driver): self.driver = driver - def get_nodes(self, options={}): + def get_nodes(self, options=None): + if options is None: options={} filter = {'peer_id': None} geni_available = options.get('geni_available') if geni_available == True: @@ -40,13 +41,15 @@ class PlAggregate: return nodes - def get_sites(self, filter={}): + def get_sites(self, filter=None): + if filter is None: filter={} sites = {} for site in self.driver.shell.GetSites(filter): sites[site['site_id']] = site return sites - def get_interfaces(self, filter={}): + def get_interfaces(self, filter=None): + if filter is None: filter={} interfaces = {} for interface in self.driver.shell.GetInterfaces(filter): iface = Interface() @@ -98,20 +101,23 @@ class PlAggregate: return links - def get_node_tags(self, filter={}): + def get_node_tags(self, filter=None): + if filter is None: filter={} node_tags = {} - for node_tag in self.driver.shell.GetNodeTags(filter): + for node_tag in self.driver.shell.GetNodeTags(filter, ['tagname', 'value', 'node_id', 'node_tag_id'] ): node_tags[node_tag['node_tag_id']] = node_tag return node_tags - def get_pl_initscripts(self, filter={}): + def get_pl_initscripts(self, filter=None): + if filter is None: filter={} pl_initscripts = {} filter.update({'enabled': True}) for initscript in self.driver.shell.GetInitScripts(filter): pl_initscripts[initscript['initscript_id']] = initscript return pl_initscripts - def get_slivers(self, urns, options={}): + def get_slivers(self, urns, options=None): + if options is None: options={} names = set() slice_ids = set() node_ids = [] @@ -136,13 +142,18 @@ class PlAggregate: if slice_ids: filter['slice_id'] = list(slice_ids) # get all slices - all_slices = self.driver.shell.GetSlices(filter, ['slice_id', 'name', 'hrn', 'person_ids', 'node_ids', 'slice_tag_ids', 'expires']) + fields = ['slice_id', 'name', 'hrn', 'person_ids', 'node_ids', 'slice_tag_ids', 'expires'] + all_slices = self.driver.shell.GetSlices(filter, fields) if slice_hrn: slices = [slice for slice in all_slices if slice['hrn'] == slice_hrn] else: slices = all_slices if not slices: + if slice_hrn: + logger.error("PlAggregate.get_slivers : no slice found with hrn {}".format(slice_hrn)) + else: + logger.error("PlAggregate.get_slivers : no sliver found with urns {}".format(urns)) return [] slice = slices[0] slice['hrn'] = slice_hrn @@ -180,20 +191,31 @@ class PlAggregate: if node_ids: node_ids = [node_id for node_id in node_ids if node_id in slice['node_ids']] slice['node_ids'] = node_ids - tags_dict = self.get_slice_tags(slice) + pltags_dict = self.get_pltags_by_node_id(slice) nodes_dict = self.get_slice_nodes(slice, options) slivers = [] for node in nodes_dict.values(): node.update(slice) - node['tags'] = tags_dict[node['node_id']] + # slice-global tags + node['slice-tags'] = pltags_dict['slice-global'] + # xxx + # this is where we chould maybe add the nodegroup slice tags, + # but it's tedious... + # xxx + # sliver tags + node['slice-tags'] += pltags_dict[node['node_id']] sliver_hrn = '%s.%s-%s' % (self.driver.hrn, slice['slice_id'], node['node_id']) node['sliver_id'] = Xrn(sliver_hrn, type='sliver').urn node['urn'] = node['sliver_id'] node['services_user'] = users slivers.append(node) + if not slivers: + logger.warning("PlAggregate.get_slivers : slice(s) found but with no sliver {}".format(urns)) return slivers - def node_to_rspec_node(self, node, sites, interfaces, node_tags, pl_initscripts=[], grain=None, options={}): + def node_to_rspec_node(self, node, sites, interfaces, node_tags, pl_initscripts=None, grain=None, options=None): + if pl_initscripts is None: pl_initscripts=[] + if options is None: options={} rspec_node = NodeElement() # xxx how to retrieve site['login_base'] site=sites[node['site_id']] @@ -239,24 +261,28 @@ class PlAggregate: interface['client_id'] = "%s:%s" % (node['node_id'], if_id) rspec_node['interfaces'].append(interface) if_count+=1 - tags = [PLTag(node_tags[tag_id]) for tag_id in node['node_tag_ids'] if tag_id in node_tags] - rspec_node['tags'] = tags + # this is what describes a particular node + node_level_tags = [PLTag(node_tags[tag_id]) for tag_id in node['node_tag_ids'] if tag_id in node_tags] + rspec_node['tags'] = node_level_tags return rspec_node - def sliver_to_rspec_node(self, sliver, sites, interfaces, node_tags, \ + def sliver_to_rspec_node(self, sliver, sites, interfaces, node_tags, sliver_pltags, \ pl_initscripts, sliver_allocations): # get the granularity in second for the reservation system grain = self.driver.shell.GetLeaseGranularity() rspec_node = self.node_to_rspec_node(sliver, sites, interfaces, node_tags, pl_initscripts, grain) + for pltag in sliver_pltags: + logger.debug("Need to expose {}".format(pltag)) # xxx how to retrieve site['login_base'] rspec_node['expires'] = datetime_to_string(utcparse(sliver['expires'])) # remove interfaces from manifest rspec_node['interfaces'] = [] # add sliver info rspec_sliver = Sliver({'sliver_id': sliver['urn'], - 'name': sliver['name'], - 'type': 'plab-vserver', - 'tags': []}) + 'name': sliver['name'], + 'type': 'plab-vserver', + 'tags': sliver_pltags, + }) rspec_node['sliver_id'] = rspec_sliver['sliver_id'] if sliver['urn'] in sliver_allocations: rspec_node['client_id'] = sliver_allocations[sliver['urn']].client_id @@ -265,28 +291,43 @@ class PlAggregate: rspec_node['slivers'] = [rspec_sliver] # slivers always provide the ssh service - login = Login({'authentication': 'ssh-keys', - 'hostname': sliver['hostname'], + login = Login({'authentication': 'ssh-keys', + 'hostname': sliver['hostname'], 'port':'22', 'username': sliver['name'], 'login': sliver['name'] }) service = ServicesElement({'login': login, - 'services_user': sliver['services_user']}) - rspec_node['services'] = [service] - return rspec_node + 'services_user': sliver['services_user']}) + rspec_node['services'] = [service] + return rspec_node - def get_slice_tags(self, slice): + def get_pltags_by_node_id(self, slice): slice_tag_ids = [] slice_tag_ids.extend(slice['slice_tag_ids']) - tags = self.driver.shell.GetSliceTags({'slice_tag_id': slice_tag_ids}) + tags = self.driver.shell.GetSliceTags({'slice_tag_id': slice_tag_ids}, + ['tagname', 'value', 'node_id', 'nodegroup_id']) # sorted by node_id - tags_dict = defaultdict(list) + pltags_dict = defaultdict(list) for tag in tags: - tags_dict[tag['node_id']] = tag - return tags_dict + # specific to a node + if tag['node_id']: + tag['scope'] = 'sliver' + pltags_dict[tag['node_id']].append(PLTag(tag)) + # restricted to a nodegroup + # for now such tags are not exposed to describe + # xxx we should also expose the nodegroup name in this case to be complete.. + elif tag['nodegroup_id']: + tag['scope'] = 'nodegroup' + pltags_dict['nodegroup'].append(PLTag(tag)) + # this tag is global to the slice + else: + tag['scope'] = 'slice' + pltags_dict['slice-global'].append(PLTag(tag)) + return pltags_dict - def get_slice_nodes(self, slice, options={}): + def get_slice_nodes(self, slice, options=None): + if options is None: options={} nodes_dict = {} filter = {'peer_id': None} tags_filter = {} @@ -304,7 +345,8 @@ class PlAggregate: nodes_dict[node['node_id']] = node return nodes_dict - def rspec_node_to_geni_sliver(self, rspec_node, sliver_allocations = {}): + def rspec_node_to_geni_sliver(self, rspec_node, sliver_allocations=None): + 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']] @@ -333,7 +375,8 @@ class PlAggregate: } return geni_sliver - def get_leases(self, slice=None, options={}): + def get_leases(self, slice=None, options=None): + if options is None: options={} now = int(time.time()) filter={} @@ -370,7 +413,8 @@ class PlAggregate: return rspec_leases - def list_resources(self, version = None, options={}): + def list_resources(self, version = None, options=None): + if options is None: options={} version_manager = VersionManager() version = version_manager.get_version(version) @@ -410,7 +454,8 @@ class PlAggregate: return rspec.toxml() - def describe(self, urns, version=None, options={}): + def describe(self, urns, version=None, options=None): + if options is None: options={} version_manager = VersionManager() version = version_manager.get_version(version) rspec_version = version_manager._get_version(version.type, version.version, 'manifest') @@ -454,8 +499,10 @@ class PlAggregate: for sliver in slivers: if sliver['slice_ids_whitelist'] and sliver['slice_id'] not in sliver['slice_ids_whitelist']: continue - rspec_node = self.sliver_to_rspec_node(sliver, sites, interfaces, node_tags, + sliver_pltags = sliver['slice-tags'] + rspec_node = self.sliver_to_rspec_node(sliver, sites, interfaces, node_tags, sliver_pltags, pl_initscripts, sliver_allocation_dict) + logger.debug('rspec of type {}'.format(rspec_node.__class__.__name__)) # manifest node element shouldn't contain available attribute rspec_node.pop('available') rspec_nodes.append(rspec_node)