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