From 08640c799a631ba71096a04bcb1a8676695fa89b Mon Sep 17 00:00:00 2001 From: Sapan Bhatia Date: Tue, 27 Jul 2010 10:39:42 -0400 Subject: [PATCH] Added base policy class + Slice policy class --- PLC/Policy.py | 30 +++++++++++++++++++ PLC/SlicesPolicy.py | 70 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 PLC/Policy.py create mode 100644 PLC/SlicesPolicy.py diff --git a/PLC/Policy.py b/PLC/Policy.py new file mode 100644 index 00000000..1359ed33 --- /dev/null +++ b/PLC/Policy.py @@ -0,0 +1,30 @@ +from types import StringTypes +import time +import re + +from PLC.Faults import * +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Debug import profile +from PLC.Table import Row, Table +from PLC.SliceInstantiations import SliceInstantiation, SliceInstantiations +from PLC.Nodes import Node +from PLC.Persons import Person, Persons +from PLC.SliceTags import SliceTag +from PLC.Timestamp import Timestamp + +class Policy(Table): + def __init__(self, api, caller, states): + self.api = api + self.caller = caller + self.states = states + self.state_function = iter(self.states) + # Compatibility for current state of API methods, this should go away + self.clutter = {} + return + + def incoming(self, row_id_filter, column_name_filter, row_value_filter): + return {'row_id_filter':slices,'column_filter':column_name_filter,'value_filter':row_value_filter} + + def outgoing(self, rows): + return rows diff --git a/PLC/SlicesPolicy.py b/PLC/SlicesPolicy.py new file mode 100644 index 00000000..e77723fe --- /dev/null +++ b/PLC/SlicesPolicy.py @@ -0,0 +1,70 @@ +from types import StringTypes +import time +import re + +from PLC.Faults import * +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Debug import profile +from PLC.Table import Row, Table +from PLC.SliceInstantiations import SliceInstantiation, SliceInstantiations +from PLC.Nodes import Node +from PLC.Persons import Person, Persons +from PLC.SliceTags import SliceTag +from PLC.Timestamp import Timestamp + +class SlicesPolicy(Policy): + def __init__(self, api, caller, states): + slice_states = ['incoming','outgoing'] + return Policy(api, caller, slice_states) + + def incoming(self, slice_filter, column_filter, value_filter): + """ + Returns set of rows/columns caller is allowed to touch + """ + # If we are not admin, make sure to return only viewable + # slices. + if isinstance(self.caller, Person) and \ + '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 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 [] + + if slice_filter is None: + slice_filter = valid_slice_ids + + # Must query at least slice_id (see below) + if return_fields is not None and 'slice_id' not in return_fields: + return_fields.append('slice_id') + self.clutter['added_fields'] = True + else: + self.clutter['added_fields'] = False + + # This is redundant given the code above - Sapan + # Filter out slices that are not viewable + # if isinstance(self.caller, Person) and \ + # 'admin' not in self.caller['roles']: + # slices = filter(lambda slice: slice['slice_id'] in valid_slice_ids, slices) + + + return {'row_filter':slices,'column_filter':column_filter,'value_filter':value_filter} + + + def outgoing(self, api, caller, rows): + state = self.state_function.next() + if (state is not 'outgoing'): + raise Exception('Outgoing hook called in state %s'%state) + + # Remove slice_id if not specified + if self.clutter['added_fields']: + for slice in rows: + if 'slice_id' in slice: + del slice['slice_id'] + + return rows -- 2.47.0