- names.add(xrn.get_slice_name())
- if xrn.id:
- ids.add(xrn.id)
-
- slices = self.driver.shell.GetSlices(names)
- # filter on id
- if ids:
- slices = [slice for slice in slices if slice['slice_id'] in ids]
-
- tags_dict = self.get_slice_tags(slices)
- nodes_dict = self.get_slice_nodes(slices, options)
+ if xrn.type == 'sliver':
+ # id: slice_id-node_id
+ try:
+ sliver_id_parts = xrn.get_sliver_id_parts()
+ slice_id = int(sliver_id_parts[0])
+ node_id = int(sliver_id_parts[1])
+ slice_ids.add(slice_id)
+ node_ids.append(node_id)
+ except ValueError:
+ pass
+ else:
+ slice_hrn = xrn.get_hrn()
+
+ filter = {}
+ filter['peer_id'] = None
+ if slice_ids:
+ filter['slice_id'] = list(slice_ids)
+ # get all slices
+ 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
+
+ # get sliver users
+ persons = []
+ person_ids = []
+ for slice in slices:
+ person_ids.extend(slice['person_ids'])
+ if person_ids:
+ persons = self.driver.shell.GetPersons(person_ids)
+
+ # get user keys
+ keys = {}
+ key_ids = []
+ for person in persons:
+ key_ids.extend(person['key_ids'])
+
+ if key_ids:
+ key_list = self.driver.shell.GetKeys(key_ids)
+ for key in key_list:
+ keys[key['key_id']] = key
+
+ # construct user key info
+ users = []
+ for person in persons:
+ person_urn = hrn_to_urn(self.driver.shell.GetPersonHrn(
+ int(person['person_id'])), 'user')
+ user = {
+ 'login': slice['name'],
+ 'user_urn': person_urn,
+ 'keys': [keys[k_id]['key'] for k_id in person['key_ids'] if k_id in keys]
+ }
+ users.append(user)
+
+ 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
+ pltags_dict = self.get_pltags_by_node_id(slice)
+ nodes_dict = self.get_slice_nodes(slice, options)