- # check our slice policy before we procede
- whitelist = self.policy['slice_whitelist']
- blacklist = self.policy['slice_blacklist']
-
- if whitelist and hrn not in whitelist or \
- blacklist and hrn in blacklist:
- policy_file = self.policy.policy_file
- print >> log, "Slice %(hrn)s not allowed by policy %(policy_file)s" % locals()
- return 1
-
- if self.api.interface in ['aggregate']:
- self.create_slice_aggregate(hrn, rspec)
- elif self.api.interface in ['slicemgr']:
- self.create_slice_smgr(hrn, rspec)
-
- def create_slice_aggregate(self, hrn, rspec):
+ # from PLCAPI.GetSlivers.get_slivers()
+ slice_fields = ['slice_id', 'name', 'instantiation', 'expires', 'person_ids', 'slice_tag_ids']
+ slices = self.api.plshell.GetSlices(self.api.plauth, slice_name, slice_fields)
+ # Build up list of users and slice attributes
+ person_ids = set()
+ all_slice_tag_ids = set()
+ for slice in slices:
+ person_ids.update(slice['person_ids'])
+ all_slice_tag_ids.update(slice['slice_tag_ids'])
+ person_ids = list(person_ids)
+ all_slice_tag_ids = list(all_slice_tag_ids)
+ # Get user information
+ all_persons_list = self.api.plshell.GetPersons(self.api.plauth, {'person_id':person_ids,'enabled':True}, ['person_id', 'enabled', 'key_ids'])
+ all_persons = {}
+ for person in all_persons_list:
+ all_persons[person['person_id']] = person
+
+ # Build up list of keys
+ key_ids = set()
+ for person in all_persons.values():
+ key_ids.update(person['key_ids'])
+ key_ids = list(key_ids)
+ # Get user account keys
+ all_keys_list = self.api.plshell.GetKeys(self.api.plauth, key_ids, ['key_id', 'key', 'key_type'])
+ all_keys = {}
+ for key in all_keys_list:
+ all_keys[key['key_id']] = key
+ # Get slice attributes
+ all_slice_tags_list = self.api.plshell.GetSliceTags(self.api.plauth, all_slice_tag_ids)
+ all_slice_tags = {}
+ for slice_tag in all_slice_tags_list:
+ all_slice_tags[slice_tag['slice_tag_id']] = slice_tag
+
+ slivers = []
+ for slice in slices:
+ keys = []
+ for person_id in slice['person_ids']:
+ if person_id in all_persons:
+ person = all_persons[person_id]
+ if not person['enabled']:
+ continue
+ for key_id in person['key_ids']:
+ if key_id in all_keys:
+ key = all_keys[key_id]
+ keys += [{'key_type': key['key_type'],
+ 'key': key['key']}]
+ attributes = []
+ # All (per-node and global) attributes for this slice
+ slice_tags = []
+ for slice_tag_id in slice['slice_tag_ids']:
+ if slice_tag_id in all_slice_tags:
+ slice_tags.append(all_slice_tags[slice_tag_id])
+ # Per-node sliver attributes take precedence over global
+ # slice attributes, so set them first.
+ # Then comes nodegroup slice attributes
+ # Followed by global slice attributes
+ sliver_attributes = []
+
+ if node is not None:
+ for sliver_attribute in filter(lambda a: a['node_id'] == node['node_id'], slice_tags):
+ sliver_attributes.append(sliver_attribute['tagname'])
+ attributes.append({'tagname': sliver_attribute['tagname'],
+ 'value': sliver_attribute['value']})
+
+ # set nodegroup slice attributes
+ for slice_tag in filter(lambda a: a['nodegroup_id'] in node['nodegroup_ids'], slice_tags):
+ # Do not set any nodegroup slice attributes for
+ # which there is at least one sliver attribute
+ # already set.
+ if slice_tag not in slice_tags:
+ attributes.append({'tagname': slice_tag['tagname'],
+ 'value': slice_tag['value']})
+
+ for slice_tag in filter(lambda a: a['node_id'] is None, slice_tags):
+ # Do not set any global slice attributes for
+ # which there is at least one sliver attribute
+ # already set.
+ if slice_tag['tagname'] not in sliver_attributes:
+ attributes.append({'tagname': slice_tag['tagname'],
+ 'value': slice_tag['value']})
+
+ # XXX Sanity check; though technically this should be a system invariant
+ # checked with an assertion
+ if slice['expires'] > MAXINT: slice['expires']= MAXINT
+
+ slivers.append({
+ 'hrn': hrn,
+ 'name': slice['name'],
+ 'slice_id': slice['slice_id'],
+ 'instantiation': slice['instantiation'],
+ 'expires': slice['expires'],
+ 'keys': keys,
+ 'attributes': attributes
+ })
+
+ return slivers
+
+ def get_peer(self, xrn):
+ hrn, type = urn_to_hrn(xrn)