X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=PLC%2FMethods%2FGetNodes.py;h=878f327bbe680f2f9184eacef2214da1b588c756;hb=40d48fabe01e13685cf380e69797ec1ed2e97eaa;hp=e442a95252d3d8273d17cca135cf70c5229c36b8;hpb=66525a88db155d029e62841ec2170b276995e8cc;p=plcapi.git diff --git a/PLC/Methods/GetNodes.py b/PLC/Methods/GetNodes.py index e442a95..878f327 100644 --- a/PLC/Methods/GetNodes.py +++ b/PLC/Methods/GetNodes.py @@ -1,3 +1,4 @@ +# $Id$ from PLC.Faults import * from PLC.Method import Method from PLC.Parameter import Parameter, Mixed @@ -23,6 +24,8 @@ class GetNodes(Method): Auth(), Mixed([Mixed(Node.fields['node_id'], Node.fields['hostname'])], + Parameter(str,"hostname"), + Parameter(int,"node_id"), Filter(Node.fields)), Parameter([str], "List of fields to return", nullok = True), ] @@ -34,7 +37,7 @@ class GetNodes(Method): # Must query at least slice_ids_whitelist if return_fields is not None: - added_fields = set(['slice_ids_whitelist']).difference(return_fields) + added_fields = set(['slice_ids_whitelist', 'site_id']).difference(return_fields) return_fields += added_fields else: added_fields =[] @@ -46,14 +49,27 @@ class GetNodes(Method): if not isinstance(self.caller, Person) or \ 'admin' not in self.caller['roles']: slice_ids = set() + site_ids = set() + if self.caller: slice_ids.update(self.caller['slice_ids']) - # if node has whitelist, make sure the user has a slice on the whitelist + if isinstance(self.caller, Node): + site_ids.update([self.caller['site_id']]) + else: + site_ids.update(self.caller['site_ids']) + + # if node has whitelist, only return it if users is at + # the same site or user has a slice on the whitelist for node in nodes[:]: + if 'site_id' in node and \ + site_ids.intersection([node['site_id']]): + continue if 'slice_ids_whitelist' in node and \ node['slice_ids_whitelist'] and \ not slice_ids.intersection(node['slice_ids_whitelist']): nodes.remove(node) + + # remove remaining admin only fields for node in nodes: for field in ['boot_nonce', 'key', 'session', 'root_person_ids']: if field in node: