- re-enable return_fields specification
[plcapi.git] / PLC / Methods / GetSliceAttributes.py
1 from PLC.Faults import *
2 from PLC.Method import Method
3 from PLC.Parameter import Parameter, Mixed
4 from PLC.Filter import Filter
5 from PLC.SliceAttributes import SliceAttribute, SliceAttributes
6 from PLC.Sites import Site, Sites
7 from PLC.Slices import Slice, Slices
8 from PLC.Auth import Auth
9
10 class GetSliceAttributes(Method):
11     """
12     Returns an array of structs containing details about slice and
13     sliver attributes. An attribute is a sliver attribute if the
14     node_id field is set. If slice_attribute_filter is specified and
15     is an array of slice attribute identifiers, or a struct of slice
16     attribute attributes, only slice attributes matching the filter
17     will be returned. If return_fields is specified, only the
18     specified details will be returned.
19
20     Users may only query attributes of slices or slivers of which they
21     are members. PIs may only query attributes of slices or slivers at
22     their sites, or of which they are members. Admins may query
23     attributes of any slice or sliver.
24     """
25
26     roles = ['admin', 'pi', 'user']
27
28     accepts = [
29         Auth(),
30         Mixed([SliceAttribute.fields['slice_attribute_id']],
31               Filter(SliceAttribute.fields)),
32         Parameter([str], "List of fields to return", nullok = True)
33         ]
34
35     returns = [SliceAttribute.fields]
36
37     def call(self, auth, slice_attribute_filter = None, return_fields = None):
38         # If we are not admin, make sure to only return our own slice
39         # and sliver attributes.
40         if 'admin' not in self.caller['roles']:
41             # Get slices that we are able to view
42             valid_slice_ids = self.caller['slice_ids']
43             if 'pi' in self.caller['roles'] and self.caller['site_ids']:
44                 sites = Sites(self.api, self.caller['site_ids'])
45                 for site in sites:
46                     valid_slice_ids += site['slice_ids']
47
48             if not valid_slice_ids:
49                 return []
50
51             # Get slice attributes that we are able to view
52             valid_slice_attribute_ids = []
53             slices = Slices(self.api, valid_slice_ids)
54             for slice in slices:
55                 valid_slice_attribute_ids += slice['slice_attribute_ids']
56
57             if not valid_slice_attribute_ids:
58                 return []
59
60             if slice_attribute_filter is None:
61                 slice_attribute_filter = valid_slice_attribute_ids
62
63         slice_attributes = SliceAttributes(self.api, slice_attribute_filter, return_fields)
64
65         # Filter out slice attributes that are not viewable
66         if 'admin' not in self.caller['roles']:
67             slice_attributes = filter(lambda slice_attribute: \
68                                       slice_attribute['slice_attribute_id'] in valid_slice_attribute_ids,
69                                       slice_attributes)
70
71         return slice_attributes