8728db1b60dc1e283400a3fe5d27bca10f2f0432
[plcapi.git] / PLC / Methods / GetSlices.py
1 # $Id$
2 from PLC.Method import Method
3 from PLC.Parameter import Parameter, Mixed
4 from PLC.Filter import Filter
5 from PLC.Auth import Auth
6 from PLC.Persons import Person, Persons
7 from PLC.Sites import Site, Sites
8 from PLC.Slices import Slice, Slices
9
10 class v43GetSlices(Method):
11     """
12     Returns an array of structs containing details about slices. If
13     slice_filter is specified and is an array of slice identifiers or
14     slice names, or a struct of slice attributes, only slices matching
15     the filter will be returned. If return_fields is specified, only the
16     specified details will be returned.
17
18     Users may only query slices of which they are members. PIs may
19     query any of the slices at their sites. Admins and nodes may query
20     any slice. If a slice that cannot be queried is specified in
21     slice_filter, details about that slice will not be returned.
22     """
23
24     roles = ['admin', 'pi', 'user', 'node']
25
26     accepts = [
27         Auth(),
28         Mixed([Mixed(Slice.fields['slice_id'],
29                      Slice.fields['name'])],
30               Parameter(str,"name"),
31               Parameter(int,"slice_id"),
32               Filter(Slice.fields)),
33         Parameter([str], "List of fields to return", nullok = True)
34         ]
35
36     returns = [Slice.fields]
37
38     def call(self, auth, slice_filter = None, return_fields = None):
39         # If we are not admin, make sure to return only viewable
40         # slices.
41         if isinstance(self.caller, Person) and \
42            'admin' not in self.caller['roles']:
43             # Get slices that we are able to view
44             valid_slice_ids = self.caller['slice_ids']
45             if 'pi' in self.caller['roles'] and self.caller['site_ids']:
46                 sites = Sites(self.api, self.caller['site_ids'])
47                 for site in sites:
48                     valid_slice_ids += site['slice_ids']
49
50             if not valid_slice_ids:
51                 return []
52
53             if slice_filter is None:
54                 slice_filter = valid_slice_ids
55
56         # Must query at least slice_id (see below)
57         if return_fields is not None and 'slice_id' not in return_fields:
58             return_fields.append('slice_id')
59             added_fields = True
60         else:
61             added_fields = False
62
63         slices = Slices(self.api, slice_filter, return_fields)
64
65         # Filter out slices that are not viewable
66         if isinstance(self.caller, Person) and \
67            'admin' not in self.caller['roles']:
68             slices = filter(lambda slice: slice['slice_id'] in valid_slice_ids, slices)
69
70         # Remove slice_id if not specified
71         if added_fields:
72             for slice in slices:
73                 if 'slice_id' in slice:
74                     del slice['slice_id']
75
76         return slices
77
78 slice_fields = Slice.fields.copy()
79 slice_fields['slice_attribute_ids']=Parameter([int], "Legacy version of slice_tag_ids")
80
81 class v42GetSlices(v43GetSlices):
82     """
83     Legacy wrapper for v43GetSlices.
84     """
85
86     accepts = [
87         Auth(),
88         Mixed([Mixed(Slice.fields['slice_id'],
89                      Slice.fields['name'])],
90               Parameter(str,"name"),
91               Parameter(int,"slice_id"),
92               Filter(slice_fields)),
93         Parameter([str], "List of fields to return", nullok = True)
94         ]
95
96     returns = [slice_fields]
97
98     def call(self, auth, slice_filter = None, return_fields = None):
99         # convert nodenetwork_ids -> interface_ids
100         if isinstance(slice_filter, dict):
101             if slice_filter.has_key('slice_attribute_ids'):
102                 slice_tag_ids = slice_filter.pop('slice_attribute_ids') 
103                 if not slice_filter.has_key('slice_tag_ids'):
104                     slice_filter['slice_tag_ids']=slice_tag_ids
105         if isinstance(return_fields, list):
106             if 'slice_attribute_ids' in return_fields:
107                 return_fields.remove('slice_attribute_ids')
108                 if 'slice_tag_ids' not in return_fields:
109                     return_fields.append('slice_tag_ids')
110         slices = v43GetSlices.call(self,auth,slice_filter,return_fields)
111         # add in a slice_tag_ids -> slice_attribute_ids
112         for slice in slices:
113             if slice.has_key('slice_tag_ids'):
114                 slice['slice_attribute_ids']=slice['slice_tag_ids']
115         return slices
116
117 class GetSlices(v42GetSlices):
118     """
119     Returns an array of structs containing details about slices. If
120     slice_filter is specified and is an array of slice identifiers or
121     slice names, or a struct of slice attributes, only slices matching
122     the filter will be returned. If return_fields is specified, only the
123     specified details will be returned.
124
125     Users may only query slices of which they are members. PIs may
126     query any of the slices at their sites. Admins and nodes may query
127     any slice. If a slice that cannot be queried is specified in
128     slice_filter, details about that slice will not be returned.
129     """
130
131     pass