from PLC.Method import Method from PLC.Parameter import Parameter, Mixed from PLC.Auth import Auth from PLC.Slices import Slice, Slices class GetSlices(Method): """ Return an array of structs containing details about slices. If slice_id_or_name_list is specified, only the specified slices will be queried. Users may only query slices of which they are members. PIs may query any of the slices at their sites. Admins may query any slice. If a slice that cannot be queried is specified in slice_id_or_name_list, details about that slice will not be returned. """ roles = ['admin', 'pi', 'user'] accepts = [ Auth(), [Mixed(Slice.fields['slice_id'], Slice.fields['name'])] ] returns = [Slice.fields] def call(self, auth, slice_id_or_name_list = None): # If we are not admin, make sure to return only viewable # slices. if 'admin' not in self.caller['roles']: # Get slices that we are able to view valid_slice_ids = self.caller['slice_ids'] if 'pi' in self.caller['roles'] and self.caller['site_ids']: sites = Sites(self.api, self.caller['site_ids']).values() for site in sites: valid_slice_ids += site['slice_ids'] if not valid_slice_ids: return [] if not slice_id_or_name_list: slice_id_or_name_list = valid_slice_ids slices = Slices(self.api, slice_id_or_name_list).values() # Filter out slices that are not viewable if 'admin' not in self.caller['roles']: can_view = lambda slice: slice['slice_id'] in valid_slice_ids slices = filter(can_view, slices) return slices