X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=PLC%2FMethods%2FGetSliceAttributes.py;h=d7636615cf8d75714cf2a1c988479e54af41a296;hb=f54d08c82ed43f0298349dea6ba9d8e58d4dbae5;hp=be646c86e6e9797bf548441f34014d629da83d73;hpb=fe0cd47e2b702d69bde8518a41e3661dd9ffbea7;p=plcapi.git diff --git a/PLC/Methods/GetSliceAttributes.py b/PLC/Methods/GetSliceAttributes.py index be646c8..d763661 100644 --- a/PLC/Methods/GetSliceAttributes.py +++ b/PLC/Methods/GetSliceAttributes.py @@ -1,18 +1,21 @@ from PLC.Faults import * from PLC.Method import Method from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter from PLC.SliceAttributes import SliceAttribute, SliceAttributes from PLC.Sites import Site, Sites from PLC.Slices import Slice, Slices -from PLC.Nodes import Node, Nodes -from PLC.Auth import PasswordAuth +from PLC.Auth import Auth class GetSliceAttributes(Method): """ - Get an array of structs containing the values of slice and sliver - attributes. An attribute is a sliver attribute if the node_id - field is set. If slice_attribute_id_list is specified, only the - specified attributes will be queried, if set. + Returns an array of structs containing details about slice and + sliver attributes. An attribute is a sliver attribute if the + node_id field is set. If slice_attribute_filter is specified and + is an array of slice attribute identifiers, or a struct of slice + attribute attributes, only slice attributes matching the filter + will be returned. If return_fields is specified, only the + specified details will be returned. Users may only query attributes of slices or slivers of which they are members. PIs may only query attributes of slices or slivers at @@ -23,27 +26,47 @@ class GetSliceAttributes(Method): roles = ['admin', 'pi', 'user'] accepts = [ - PasswordAuth(), - [SliceAttribute.fields['slice_attribute_id']], + Auth(), + Mixed([SliceAttribute.fields['slice_attribute_id']], + Filter(SliceAttribute.fields)), + Parameter([str], "List of fields to return", nullok = True) ] returns = [SliceAttribute.fields] + - def call(self, auth, slice_attribute_ids = None): + def call(self, auth, slice_attribute_filter = None, return_fields = None): # If we are not admin, make sure to only return our own slice # and sliver attributes. if 'admin' not in self.caller['roles']: - if not slice_attribute_ids: - slice_attribute_ids = [] - slices = Slices(self.api, self.caller['slice_ids']).values() - if 'pi' in self.caller['roles']: - sites = Sites(self.api, self.caller['site_ids']).values() - slices += Slices(self.api, sites['slice_ids']).values() - for slice in slices: - slice_attribute_ids = set(slice_attribute_ids).union(slice['slice_attribute_ids']) - - slice_attributes = SliceAttributes(self.api, slice_attribute_ids).values() - - slice_attributes = [dict(slice_attribute) for slice_attribute in slice_attributes] - + # 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']) + for site in sites: + valid_slice_ids += site['slice_ids'] + + if not valid_slice_ids: + return [] + + # Get slice attributes that we are able to view + valid_slice_attribute_ids = [] + slices = Slices(self.api, valid_slice_ids) + for slice in slices: + valid_slice_attribute_ids += slice['slice_attribute_ids'] + + if not valid_slice_attribute_ids: + return [] + + if slice_attribute_filter is None: + slice_attribute_filter = valid_slice_attribute_ids + + slice_attributes = SliceAttributes(self.api, slice_attribute_filter, return_fields) + + # Filter out slice attributes that are not viewable + if 'admin' not in self.caller['roles']: + slice_attributes = filter(lambda slice_attribute: \ + slice_attribute['slice_attribute_id'] in valid_slice_attribute_ids, + slice_attributes) + return slice_attributes