allow filters to be specified in most Get() calls
[plcapi.git] / PLC / Methods / GetSlices.py
1 from PLC.Method import Method
2 from PLC.Parameter import Parameter, Mixed
3 from PLC.Filter import Filter
4 from PLC.Auth import Auth
5 from PLC.Slices import Slice, Slices
6
7 class GetSlices(Method):
8     """
9     Returns an array of structs containing details about slices. If
10     slice_filter is specified and is an array of slice identifiers or
11     slice names, or a struct of slice attributes, only slices matching
12     the filter will be returned.
13
14     Users may only query slices of which they are members. PIs may
15     query any of the slices at their sites. Admins may query any
16     slice. If a slice that cannot be queried is specified in
17     slice_id_or_name_list, details about that slice will not be
18     returned.
19     """
20
21     roles = ['admin', 'pi', 'user']
22
23     accepts = [
24         Auth(),
25         Mixed([Mixed(Slice.fields['slice_id'],
26                      Slice.fields['name'])],
27               Filter(Slice.fields))
28         ]
29
30     returns = [Slice.fields]
31
32     def call(self, auth, slice_filter = None):
33         # If we are not admin, make sure to return only viewable
34         # slices.
35         if 'admin' not in self.caller['roles']:
36             # Get slices that we are able to view
37             valid_slice_ids = self.caller['slice_ids']
38             if 'pi' in self.caller['roles'] and self.caller['site_ids']:
39                 sites = Sites(self.api, self.caller['site_ids']).values()
40                 for site in sites:
41                     valid_slice_ids += site['slice_ids']
42
43             if not valid_slice_ids:
44                 return []
45
46             if slice_filter is None:
47                 slice_filter = valid_slice_ids
48
49         slices = Slices(self.api, slice_filter).values()
50
51         # Filter out slices that are not viewable
52         if 'admin' not in self.caller['roles']:
53             can_view = lambda slice: slice['slice_id'] in valid_slice_ids
54             slices = filter(can_view, slices)
55
56         return slices