merge changes from head
authorMark Huang <mlhuang@cs.princeton.edu>
Wed, 7 Feb 2007 05:57:52 +0000 (05:57 +0000)
committerMark Huang <mlhuang@cs.princeton.edu>
Wed, 7 Feb 2007 05:57:52 +0000 (05:57 +0000)
PLC/Methods/GetPCUs.py
PLC/Methods/GetPersons.py
PLC/Methods/GetSliceAttributes.py
PLC/Methods/GetSlices.py

index 28d50d6..3280070 100644 (file)
@@ -51,10 +51,22 @@ class GetPCUs(Method):
             if pcu_filter is None:
                 pcu_filter = valid_pcu_ids
 
+        # Must query at least slice_id (see below)
+        if return_fields is not None and 'pcu_id' not in return_fields:
+            return_fields.append('pcu_id')
+            added_fields = True
+        else:
+            added_fields = False
+
         pcus = PCUs(self.api, pcu_filter, return_fields)
 
         # Filter out PCUs that are not viewable
         if not (isinstance(self.caller, Person) and 'admin' in self.caller['roles']):
             pcus = filter(lambda pcu: pcu['pcu_id'] in valid_pcu_ids, pcus)
 
+        # Remove pcu_id if not specified
+        if added_fields:
+            for pcu in pcus:
+                del pcu['pcu_id']
+
         return pcus
index 458fdac..e48db7b 100644 (file)
@@ -60,6 +60,14 @@ class GetPersons(Method):
        else:
            return_fields = self.return_fields.keys()
 
+        # Must query at least person_id, site_ids, and role_ids (see
+        # Person.can_view() and below).
+        if return_fields is not None:
+            added_fields = set(['person_id', 'site_ids', 'role_ids']).difference(return_fields)
+            return_fields += added_fields
+        else:
+            added_fields = []
+
         persons = Persons(self.api, person_filter, return_fields)
 
         # Filter out accounts that are not viewable
@@ -67,4 +75,10 @@ class GetPersons(Method):
            'admin' not in self.caller['roles']:
             persons = filter(self.caller.can_view, persons)
 
+        # Remove added fields if not specified
+        if added_fields:
+            for person in persons:
+                for field in added_fields:
+                    del person[field]
+
         return persons
index d763661..80fc344 100644 (file)
@@ -3,6 +3,7 @@ from PLC.Method import Method
 from PLC.Parameter import Parameter, Mixed
 from PLC.Filter import Filter
 from PLC.SliceAttributes import SliceAttribute, SliceAttributes
+from PLC.Persons import Person, Persons
 from PLC.Sites import Site, Sites
 from PLC.Slices import Slice, Slices
 from PLC.Auth import Auth
@@ -23,7 +24,7 @@ class GetSliceAttributes(Method):
     attributes of any slice or sliver.
     """
 
-    roles = ['admin', 'pi', 'user']
+    roles = ['admin', 'pi', 'user', 'node']
 
     accepts = [
         Auth(),
@@ -38,7 +39,8 @@ class GetSliceAttributes(Method):
     def call(self, auth, slice_attribute_filter = None, return_fields = None):
        # If we are not admin, make sure to only return our own slice
        # and sliver attributes.
-        if 'admin' not in self.caller['roles']:
+        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 self.caller['site_ids']:
@@ -61,12 +63,25 @@ class GetSliceAttributes(Method):
             if slice_attribute_filter is None:
                 slice_attribute_filter = valid_slice_attribute_ids
 
+        # Must query at least slice_attribute_id (see below)
+        if return_fields is not None and 'slice_attribute_id' not in return_fields:
+            return_fields.append('slice_attribute_id')
+            added_fields = True
+        else:
+            added_fields = False
+
         slice_attributes = SliceAttributes(self.api, slice_attribute_filter, return_fields)
 
         # Filter out slice attributes that are not viewable
-        if 'admin' not in self.caller['roles']:
+        if isinstance(self.caller, Person) and \
+           'admin' not in self.caller['roles']:
             slice_attributes = filter(lambda slice_attribute: \
                                       slice_attribute['slice_attribute_id'] in valid_slice_attribute_ids,
                                       slice_attributes)
 
+        # Remove slice_attribute_id if not specified
+        if added_fields:
+            for slice_attribute in slice_attributes:
+                del slice_attribute['slice_attribute_id']
+
         return slice_attributes
index 9bd9017..b2ddfde 100644 (file)
@@ -31,7 +31,6 @@ class GetSlices(Method):
         ]
 
     returns = [Slice.fields]
-    
 
     def call(self, auth, slice_filter = None, return_fields = None):
        # If we are not admin, make sure to return only viewable
@@ -51,6 +50,13 @@ class GetSlices(Method):
             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')
+            added_fields = True
+        else:
+            added_fields = False
+
         slices = Slices(self.api, slice_filter, return_fields)
 
         # Filter out slices that are not viewable
@@ -58,4 +64,9 @@ class GetSlices(Method):
            'admin' not in self.caller['roles']:
             slices = filter(lambda slice: slice['slice_id'] in valid_slice_ids, slices)
 
+        # Remove slice_id if not specified
+        if added_fields:
+            for slice in slices:
+                del slice['slice_id']
+
         return slices