slice attribute methods
[plcapi.git] / PLC / Methods / GetSliceAttributes.py
1 from PLC.Faults import *
2 from PLC.Method import Method
3 from PLC.Parameter import Parameter, Mixed
4 from PLC.SliceAttributes import SliceAttribute, SliceAttributes
5 from PLC.Slices import Slice, Slices
6 from PLC.Nodes import Node, Nodes
7 from PLC.Auth import PasswordAuth
8
9 class GetSliceAttributes(Method):
10     """
11     Get an array of structs containing the values of slice and sliver
12     attributes. An attribute is a sliver attribute if the node_id
13     field is set. If slice_attribute_id_list is specified, only the
14     specified attributes will be queried, if set.
15
16     Users may only query attributes of slices or slivers of which they
17     are members. PIs may only query attributes of slices or slivers at
18     their sites, or of which they are members. Admins may query
19     attributes of any slice or sliver.
20     """
21
22     roles = ['admin', 'pi', 'user']
23
24     accepts = [
25         PasswordAuth(),
26         Mixed(Slice.fields['slice_id'],
27               Slice.fields['name']),
28         [SliceAttribute.fields['slice_attribute_id']],
29         ]
30
31     returns = [SliceAttribute.fields]
32
33     def call(self, auth, slice_id_or_name, slice_attribute_id_list = None):
34         slices = Slices(self.api, [slice_id_or_name]).values()
35         if not slices:
36             raise PLCInvalidArgument, "No such slice"
37         slice = slices[0]
38
39         if 'admin' not in self.caller['roles']:
40             if self.caller['person_id'] in slice['person_ids']:
41                 pass
42             elif 'pi' not in self.caller['roles']:
43                 raise PLCPermissionDenied, "Not a member of the specified slice"
44             elif slice['site_id'] not in self.caller['site_ids']:
45                 raise PLCPermissionDenied, "Specified slice not associated with any of your sites"
46
47         if slice_attribute_id_list is None:
48             slice_attribute_id_list = slice['slice_attribute_ids']
49         else:
50             if set(slice_attribute_id_list).intersection(slice['slice_attribute_ids']) != \
51                set(slice_attribute_id_list):
52                 raise PLCInvalidArgument, "Invalid slice attribute ID(s)"
53
54         slice_attributes = SliceAttributes(self.api, slice_attribute_id_list).values()
55
56         return slice_attributes