Fix roles to work with MyPLC 5.0
authorAndy Bavier <acb@acb-imac.cs.princeton.edu>
Wed, 23 Feb 2011 21:59:52 +0000 (16:59 -0500)
committerAndy Bavier <acb@acb-imac.cs.princeton.edu>
Wed, 23 Feb 2011 21:59:52 +0000 (16:59 -0500)
SFA-4
MyPLC 5.0 does away with the min_role_id field in the SliceTag.  This is replaced by a list of roles that can set the tag in
the TagType.  Updated permission checks accordingly for setting SliceTags from the RSpec.

sfa/plc/network.py

index ee04381..9650e4c 100644 (file)
@@ -9,7 +9,6 @@ from lxml import etree
 import sys
 from StringIO import StringIO
 
-
 class Sliver:
     def __init__(self, node):
         self.node = node
@@ -172,9 +171,9 @@ class Slice:
         return n
 
     # Add a new slice tag   
-    def add_tag(self, tagname, value, node = None, role_id = 30):
+    def add_tag(self, tagname, value, node = None, role = "user"):
         tt = self.network.lookupTagType(tagname)
-        if not tt.permit_update(role_id):
+        if not tt.permit_update(role):
             raise InvalidRSpec("permission denied to modify '%s' tag" % tagname)
         tag = Slicetag()
         tag.initialize(tagname, value, node, self.network)
@@ -183,23 +182,24 @@ class Slice:
         return tag
     
     # Update a slice tag if it exists, else add it             
-    def update_tag(self, tagname, value, node = None, role_id = 30):
+    def update_tag(self, tagname, value, node = None, role = "user"):
+        tt = self.network.lookupTagType(tagname)
+        if not tt.permit_update(role):
+            raise InvalidRSpec("permission denied to modify '%s' tag" % tagname)
         tag = self.get_tag(tagname, node)
         if tag:
-            if not tag.permit_update(role_id, value):
-                raise InvalidRSpec("permission denied to modify '%s' tag" % tagname)
             tag.change(value)
         else:
-            tag = self.add_tag(tagname, value, node, role_id)
+            tag = self.add_tag(tagname, value, node, role)
         return tag
             
-    def update_multi_tag(self, tagname, value, node = None, role_id = 30):
+    def update_multi_tag(self, tagname, value, node = None, role = "user"):
         tags = self.get_multi_tag(tagname, node)
         for tag in tags:
             if tag and tag.value == value:
                 break
         else:
-            tag = self.add_tag(tagname, value, node, role_id)
+            tag = self.add_tag(tagname, value, node, role)
         return tag
             
     def tags_to_xml(self, xml, node = None):
@@ -224,7 +224,6 @@ class Slice:
 
 class Slicetag:
     newid = -1 
-#    filter_fields = ['slice_tag_id','slice_id','tagname','value','node_id','category','min_role_id'] 
     filter_fields = ['slice_tag_id','slice_id','tagname','value','node_id','category'] 
     ignore_tags = ['hmac','ssh_key']
     def __init__(self, tag = None):
@@ -236,7 +235,6 @@ class Slicetag:
         self.value = tag['value']
         self.node_id = tag['node_id']
         self.category = tag['category']
-#        self.min_role_id = tag['min_role_id']
         self.status = None
 
     # Create a new slicetag that will be written to the DB later
@@ -252,17 +250,8 @@ class Slicetag:
         else:
             self.node_id = None
         self.category = tt.category
-#        self.min_role_id = tt.min_role_id
         self.status = "new"
 
-    def permit_update(self, role_id, value = None):
-        if value and self.value == value:
-            return True
-        # xxx FIXME - the new model in PLCAPI has roles and not min_role_id
-        #if role_id > self.min_role_id:
-        #    return False
-        return False
-        
     def change(self, value):
         if self.value != value:
             self.value = value
@@ -302,7 +291,7 @@ class TagType:
         self.id = tagtype['tag_type_id']
         self.category = tagtype['category']
         self.tagname = tagtype['tagname']
-#        self.min_role_id = tagtype['min_role_id']
+        self.roles = tagtype['roles']
         self.multi = False
         self.in_rspec = False
         if self.category == 'slice/rspec':
@@ -310,10 +299,9 @@ class TagType:
         if self.tagname in ['codemux', 'ip_addresses', 'vsys']:
             self.multi = True
 
-    def permit_update(self, role_id):
-        # XXX FIXME ditto
-        #if role_id > self.min_role_id:
-        #    return False
+    def permit_update(self, role):
+        if role in self.roles:
+            return True
         return False
         
 
@@ -527,9 +515,10 @@ class Network:
         Write any slice tags that have been added or modified back to the DB
         """
         for tag in self.getSliceTags():
-            if tag.category == 'slice/rspec' and not tag.was_updated() and tag.permit_update(None, 30):
-                # The user wants to delete this tag
-                tag.delete()
+            if tag.category == 'slice/rspec' and not tag.was_updated():
+                tt = self.lookupTagType(tag.tagname)
+                if tt.permit_update("user"):
+                    tag.delete()
 
         # Update slice tags in database
         for tag in self.getSliceTags():