allow filters to be specified in most Get() calls
[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.Filter import Filter
5 from PLC.SliceAttributes import SliceAttribute, SliceAttributes
6 from PLC.Sites import Site, Sites
7 from PLC.Slices import Slice, Slices
8 from PLC.Auth import Auth
9
10 class GetSliceAttributes(Method):
11     """
12     Get an array of structs containing the values of slice and sliver
13     attributes. An attribute is a sliver attribute if the node_id
14     field is set. If slice_attribute_id_list is specified, only the
15     specified attributes will be queried, if set.
16
17     Users may only query attributes of slices or slivers of which they
18     are members. PIs may only query attributes of slices or slivers at
19     their sites, or of which they are members. Admins may query
20     attributes of any slice or sliver.
21     """
22
23     roles = ['admin', 'pi', 'user']
24
25     accepts = [
26         Auth(),
27         Mixed([SliceAttribute.fields['slice_attribute_id']],
28               Filter(SliceAttribute.fields))
29         ]
30
31     returns = [SliceAttribute.fields]
32
33     def call(self, auth, slice_attribute_filter = None):
34         # If we are not admin, make sure to only return our own slice
35         # and sliver attributes.
36         if 'admin' not in self.caller['roles']:
37             # Get slices that we are able to view
38             valid_slice_ids = self.caller['slice_ids']
39             if 'pi' in self.caller['roles'] and self.caller['site_ids']:
40                 sites = Sites(self.api, self.caller['site_ids']).values()
41                 for site in sites:
42                     valid_slice_ids += site['slice_ids']
43
44             if not valid_slice_ids:
45                 return []
46
47             # Get slice attributes that we are able to view
48             valid_slice_attribute_ids = []
49             slices = Slices(self.api, valid_slice_ids).values()
50             for slice in slices:
51                 valid_slice_attribute_ids += slice['slice_attribute_ids']
52
53             if not valid_slice_attribute_ids:
54                 return []
55
56             if slice_attribute_filter is None:
57                 slice_attribute_filter = valid_slice_attribute_ids
58
59         slice_attributes = SliceAttributes(self.api, slice_attribute_filter).values()
60
61         # Filter out slice attributes that are not viewable
62         if 'admin' not in self.caller['roles']:
63             slice_attributes = filter(lambda slice_attribute: \
64                                       slice_attribute['slice_attribute_id'] in valid_slice_attribute_ids,
65                                       slice_attributes)
66
67         return slice_attributes