This commit was manufactured by cvs2svn to create branch
[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.Persons import Person, Persons
6 from PLC.Slices import Slice, Slices
7
8 class GetSlices(Method):
9     """
10     Returns an array of structs containing details about slices. If
11     slice_filter is specified and is an array of slice identifiers or
12     slice names, or a struct of slice attributes, only slices matching
13     the filter will be returned. If return_fields is specified, only the
14     specified details will be returned.
15
16     Users may only query slices of which they are members. PIs may
17     query any of the slices at their sites. Admins and nodes may query
18     any slice. If a slice that cannot be queried is specified in
19     slice_filter, details about that slice will not be returned.
20     """
21
22     roles = ['admin', 'pi', 'user', 'node']
23
24     accepts = [
25         Auth(),
26         Mixed([Mixed(Slice.fields['slice_id'],
27                      Slice.fields['name'])],
28               Filter(Slice.fields)),
29         Parameter([str], "List of fields to return", nullok = True)
30         ]
31
32     returns = [Slice.fields]
33     
34
35     def call(self, auth, slice_filter = None, return_fields = None):
36         # If we are not admin, make sure to return only viewable
37         # slices.
38         if isinstance(self.caller, Person) and \
39            'admin' not in self.caller['roles']:
40             # Get slices that we are able to view
41             valid_slice_ids = self.caller['slice_ids']
42             if 'pi' in self.caller['roles'] and self.caller['site_ids']:
43                 sites = Sites(self.api, self.caller['site_ids'])
44                 for site in sites:
45                     valid_slice_ids += site['slice_ids']
46
47             if not valid_slice_ids:
48                 return []
49
50             if slice_filter is None:
51                 slice_filter = valid_slice_ids
52
53         slices = Slices(self.api, slice_filter, return_fields)
54
55         # Filter out slices that are not viewable
56         if isinstance(self.caller, Person) and \
57            'admin' not in self.caller['roles']:
58             slices = filter(lambda slice: slice['slice_id'] in valid_slice_ids, slices)
59
60         return slices