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
11 class v43GetSlices(Method):
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.
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.
25 roles = ['admin', 'pi', 'user', 'node']
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)
37 returns = [Slice.fields]
39 def call(self, auth, slice_filter = None, return_fields = None):
40 # If we are not admin, make sure to return only viewable
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'])
49 valid_slice_ids += site['slice_ids']
51 if not valid_slice_ids:
54 if slice_filter is None:
55 slice_filter = valid_slice_ids
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')
64 slices = Slices(self.api, slice_filter, return_fields)
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)
71 # Remove slice_id if not specified
74 if 'slice_id' in slice:
79 slice_fields = Slice.fields.copy()
80 slice_fields['slice_attribute_ids']=Parameter([int], "Legacy version of slice_tag_ids")
82 class v42GetSlices(v43GetSlices):
84 Legacy wrapper for v43GetSlices.
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)
97 returns = [slice_fields]
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
114 if slice.has_key('slice_tag_ids'):
115 slice['slice_attribute_ids']=slice['slice_tag_ids']
118 class GetSlices(v42GetSlices):
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.
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.