Added base policy class + Slice policy class
authorSapan Bhatia <sapanbhatia@boring3.CS.Princeton.EDU>
Tue, 27 Jul 2010 14:39:42 +0000 (10:39 -0400)
committerSapan Bhatia <sapanbhatia@boring3.CS.Princeton.EDU>
Tue, 27 Jul 2010 14:39:42 +0000 (10:39 -0400)
PLC/Policy.py [new file with mode: 0644]
PLC/SlicesPolicy.py [new file with mode: 0644]

diff --git a/PLC/Policy.py b/PLC/Policy.py
new file mode 100644 (file)
index 0000000..1359ed3
--- /dev/null
@@ -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 (file)
index 0000000..e77723f
--- /dev/null
@@ -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