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.Persons import Person, Persons
7 from PLC.Sites import Site, Sites
8 from PLC.Slices import Slice, Slices
9 from PLC.Auth import Auth
11 class GetSliceAttributes(Method):
13 Returns an array of structs containing details about slice and
14 sliver attributes. An attribute is a sliver attribute if the
15 node_id field is set. If slice_attribute_filter is specified and
16 is an array of slice attribute identifiers, or a struct of slice
17 attribute attributes, only slice attributes matching the filter
18 will be returned. If return_fields is specified, only the
19 specified details will be returned.
21 Users may only query attributes of slices or slivers of which they
22 are members. PIs may only query attributes of slices or slivers at
23 their sites, or of which they are members. Admins may query
24 attributes of any slice or sliver.
27 roles = ['admin', 'pi', 'user', 'node']
31 Mixed([SliceAttribute.fields['slice_attribute_id']],
32 Filter(SliceAttribute.fields)),
33 Parameter([str], "List of fields to return", nullok = True)
36 returns = [SliceAttribute.fields]
39 def call(self, auth, slice_attribute_filter = None, return_fields = None):
40 # If we are not admin, make sure to only return our own slice
41 # and sliver attributes.
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 # Get slice attributes that we are able to view
55 valid_slice_attribute_ids = []
56 slices = Slices(self.api, valid_slice_ids)
58 valid_slice_attribute_ids += slice['slice_attribute_ids']
60 if not valid_slice_attribute_ids:
63 if slice_attribute_filter is None:
64 slice_attribute_filter = valid_slice_attribute_ids
66 # Must query at least slice_attribute_id (see below)
67 if return_fields is not None and 'slice_attribute_id' not in return_fields:
68 return_fields.append('slice_attribute_id')
73 slice_attributes = SliceAttributes(self.api, slice_attribute_filter, return_fields)
75 # Filter out slice attributes that are not viewable
76 if isinstance(self.caller, Person) and \
77 'admin' not in self.caller['roles']:
78 slice_attributes = filter(lambda slice_attribute: \
79 slice_attribute['slice_attribute_id'] in valid_slice_attribute_ids,
82 # Remove slice_attribute_id if not specified
84 for slice_attribute in slice_attributes:
85 if 'slice_attribute_id' in slice_attribute:
86 del slice_attribute['slice_attribute_id']
88 return slice_attributes