X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=PLC%2FMethods%2FGetSlices.py;h=c06fbe297ded8bb46b8e255e76cf7b6be0a65d20;hb=475ee53aaaa011ba14a34af34d3340257d6f9d59;hp=8728db1b60dc1e283400a3fe5d27bca10f2f0432;hpb=721cb6162e07c2f74955ecb1947a453f94451ed6;p=plcapi.git diff --git a/PLC/Methods/GetSlices.py b/PLC/Methods/GetSlices.py index 8728db1..c06fbe2 100644 --- a/PLC/Methods/GetSlices.py +++ b/PLC/Methods/GetSlices.py @@ -1,13 +1,13 @@ -# $Id$ from PLC.Method import Method from PLC.Parameter import Parameter, Mixed from PLC.Filter import Filter from PLC.Auth import Auth from PLC.Persons import Person, Persons +from PLC.Nodes import Nodes from PLC.Sites import Site, Sites from PLC.Slices import Slice, Slices -class v43GetSlices(Method): +class GetSlices(Method): """ Returns an array of structs containing details about slices. If slice_filter is specified and is an array of slice identifiers or @@ -36,16 +36,22 @@ class v43GetSlices(Method): returns = [Slice.fields] def call(self, auth, slice_filter = None, return_fields = None): - # If we are not admin, make sure to return only viewable - # slices. + # If we are not admin, make sure to return only viewable + # slices. if isinstance(self.caller, Person) and \ 'admin' not in self.caller['roles']: # Get slices that we are able to view valid_slice_ids = self.caller['slice_ids'] + # pis can view all slices at their site if 'pi' in self.caller['roles'] and self.caller['site_ids']: sites = Sites(self.api, self.caller['site_ids']) for site in sites: valid_slice_ids += site['slice_ids'] + # techs can view all slices on the nodes at their site + if 'tech' in self.caller['roles'] and self.caller['site_ids']: + nodes = Nodes(self.api, {'site_id': self.caller['site_ids']}, ['site_id', 'slice_ids']) + for node in nodes: + valid_slice_ids.extend(node['slice_ids']) if not valid_slice_ids: return [] @@ -70,62 +76,7 @@ class v43GetSlices(Method): # Remove slice_id if not specified if added_fields: for slice in slices: - if 'slice_id' in slice: - del slice['slice_id'] + if 'slice_id' in slice: + del slice['slice_id'] return slices - -slice_fields = Slice.fields.copy() -slice_fields['slice_attribute_ids']=Parameter([int], "Legacy version of slice_tag_ids") - -class v42GetSlices(v43GetSlices): - """ - Legacy wrapper for v43GetSlices. - """ - - accepts = [ - Auth(), - Mixed([Mixed(Slice.fields['slice_id'], - Slice.fields['name'])], - Parameter(str,"name"), - Parameter(int,"slice_id"), - Filter(slice_fields)), - Parameter([str], "List of fields to return", nullok = True) - ] - - returns = [slice_fields] - - def call(self, auth, slice_filter = None, return_fields = None): - # convert nodenetwork_ids -> interface_ids - if isinstance(slice_filter, dict): - if slice_filter.has_key('slice_attribute_ids'): - slice_tag_ids = slice_filter.pop('slice_attribute_ids') - if not slice_filter.has_key('slice_tag_ids'): - slice_filter['slice_tag_ids']=slice_tag_ids - if isinstance(return_fields, list): - if 'slice_attribute_ids' in return_fields: - return_fields.remove('slice_attribute_ids') - if 'slice_tag_ids' not in return_fields: - return_fields.append('slice_tag_ids') - slices = v43GetSlices.call(self,auth,slice_filter,return_fields) - # add in a slice_tag_ids -> slice_attribute_ids - for slice in slices: - if slice.has_key('slice_tag_ids'): - slice['slice_attribute_ids']=slice['slice_tag_ids'] - return slices - -class GetSlices(v42GetSlices): - """ - Returns an array of structs containing details about slices. If - slice_filter is specified and is an array of slice identifiers or - slice names, or a struct of slice attributes, only slices matching - the filter will be returned. If return_fields is specified, only the - specified details will be returned. - - Users may only query slices of which they are members. PIs may - query any of the slices at their sites. Admins and nodes may query - any slice. If a slice that cannot be queried is specified in - slice_filter, details about that slice will not be returned. - """ - - pass