define tags exposed to the API in the Accessors area
authorThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Wed, 10 Dec 2008 20:58:29 +0000 (20:58 +0000)
committerThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Wed, 10 Dec 2008 20:58:29 +0000 (20:58 +0000)
PLC/Accessors/Accessors_site.py
PLC/Accessors/Accessors_standard.py
PLC/Accessors/Accessors_wireless.py
PLC/Accessors/Factory.py
PLC/Nodes.py

index 1816117..3a78e82 100644 (file)
@@ -12,7 +12,7 @@ methods=[]
 from PLC.Nodes import Node
 from PLC.Interfaces import Interface
 from PLC.Slices import Slice
-from PLC.Ilinks import Ilink
+#from PLC.Ilinks import Ilink
 
 from PLC.Accessors.Factory import define_accessors, all_roles, tech_roles
 
@@ -20,5 +20,9 @@ import sys
 current_module = sys.modules[__name__]
 
 #### example : attach vlan ids on interfaces
-###define_accessors(current_module, Interface, "Vlan", "vlan","interface/general", "tag for setting VLAN id",
-###                 get_roles=all_roles, set_roles=tech_roles)
+# The third argument expose_in_api is a boolean flag that tells whether this tag may be handled 
+#   through the Add/Get/Update methods as a native field
+# 
+#define_accessors(current_module, Interface, "Vlan", "vlan",
+#                  "interface/general", "tag for setting VLAN id",
+#                  get_roles=all_roles, set_roles=tech_roles)
index cbc4fb3..585f881 100644 (file)
@@ -4,7 +4,7 @@
 from PLC.Nodes import Node
 from PLC.Interfaces import Interface
 from PLC.Slices import Slice
-from PLC.Ilinks import Ilink
+#from PLC.Ilinks import Ilink
 
 from PLC.Accessors.Factory import define_accessors, all_roles, tech_roles
 
@@ -17,31 +17,41 @@ current_module = sys.modules[__name__]
 #
 
 # slice vref
-define_accessors(current_module, Slice, "Vref", 'vref', 'slice/config', 'vserver reference image type',
-                 get_roles=all_roles, set_roles=['admin'])
+# xxx - don't expose yet in api interface and slices dont know how to use that yet
+define_accessors(current_module, Slice, "Vref", "vref", 
+                 "slice/config", "vserver reference image type",
+                 get_roles=all_roles, set_roles=["admin"], expose_in_api=False)
 
 
 # node architecture 
-define_accessors(current_module, Node, "Arch", 'arch',  'node/config', 'architecture name', 
-                 get_roles=all_roles, set_roles=tech_roles )
+define_accessors(current_module, Node, "Arch", "arch",  
+                 "node/config", "architecture name", 
+                 get_roles=all_roles, set_roles=tech_roles, expose_in_api=True)
 # distribution to be deployed
-define_accessors(current_module, Node, "Pldistro", 'pldistro',  'node/config', 'PlanetLab distribution', 
-                 get_roles=all_roles, set_roles=['admin'] )
+define_accessors(current_module, Node, "Pldistro", "pldistro",
+                 "node/config", "PlanetLab distribution", 
+                 get_roles=all_roles, set_roles=["admin"], expose_in_api=True)
 # node deployment (alpha, beta, ...)
-define_accessors(current_module, Node, "Deployment", "deployment", "node/operation", 
-                 'deployment flavour, typically "alpha", "beta", or "production"',
-                 get_roles=all_roles, set_roles=['admin'])
+define_accessors(current_module, Node, "Deployment", "deployment",
+                 "node/operation", 'typically "alpha", "beta", or "production"',
+                 get_roles=all_roles, set_roles=["admin"], expose_in_api=True)
 # extension
-define_accessors(current_module, Node, "Extensions", "extensions", "node/config", "space-separated list of extensions to install",
-                 get_roles=all_roles, set_roles=['admin'])
+define_accessors(current_module, Node, "Extensions", "extensions", 
+                 "node/config", "space-separated list of extensions to install",
+                 get_roles=all_roles, set_roles=["admin"])
 # test nodes perform their installation from an uncompressed bootstrapfs
-define_accessors(current_module, Node, "PlainBootstrapfs", "plain-bootstrapfs", "node/config", "use uncompressed bootstrapfs when set",
-                 get_roles=all_roles, set_roles=['admin','pi','tech'])
-
-# interface accessors
-define_accessors(current_module, Interface, "Ifname", "ifname", "interface/config", "linux name",
+define_accessors(current_module, Node, "PlainBootstrapfs", "plain-bootstrapfs", 
+                 "node/config", "use uncompressed bootstrapfs when set",
                  get_roles=all_roles, set_roles=tech_roles)
-define_accessors(current_module, Interface, "Driver", "driver", "interface/config", "driver name",
+
+# interface 
+# xxx - don't expose yet in api interface and slices dont know how to use that yet
+define_accessors(current_module, Interface, "Ifname", "ifname", 
+                 "interface/config", "linux name",
+                 get_roles=all_roles, set_roles=tech_roles, expose_in_api=False)
+define_accessors(current_module, Interface, "Driver", "driver", 
+                 "interface/config", "driver name",
                  get_roles=all_roles, set_roles=tech_roles)
-define_accessors(current_module, Interface, "Alias", "alias", "interface/config", "interface alias",
+define_accessors(current_module, Interface, "Alias", "alias", 
+                 "interface/config", "interface alias",
                  get_roles=all_roles, set_roles=tech_roles)
index 986ebe6..203a3b5 100644 (file)
@@ -4,7 +4,7 @@
 from PLC.Nodes import Node
 from PLC.Interfaces import Interface
 from PLC.Slices import Slice
-from PLC.Ilinks import Ilink
+#from PLC.Ilinks import Ilink
 
 from PLC.Accessors.Factory import define_accessors, all_roles, tech_roles
 
@@ -12,35 +12,48 @@ import sys
 current_module = sys.modules[__name__]
 
 #### Wireless
-
-define_accessors(current_module, Interface, "WifiMode", "mode", "interface/wifi", "Wifi operation mode - see iwconfig",
+define_accessors(current_module, Interface, "Mode", "mode", 
+                 "interface/wifi", "Wifi operation mode - see iwconfig",
                  get_roles=all_roles, set_roles=tech_roles)
-define_accessors(current_module, Interface, "Essid", "essid", "interface/wifi", "Wireless essid - see iwconfig",
+define_accessors(current_module, Interface, "Essid", "essid",
+                 "interface/wifi", "Wireless essid - see iwconfig",
                  get_roles=all_roles, set_roles=tech_roles)
-define_accessors(current_module, Interface, "Nw", "nw", "interface/wifi", "Wireless nw - see iwconfig",
+define_accessors(current_module, Interface, "Nw", "nw",
+                 "interface/wifi", "Wireless nw - see iwconfig",
                  get_roles=all_roles, set_roles=tech_roles)
-define_accessors(current_module, Interface, "Freq", "freq", "interface/wifi", "Wireless freq - see iwconfig",
+define_accessors(current_module, Interface, "Freq", "freq", 
+                 "interface/wifi", "Wireless freq - see iwconfig",
                  get_roles=all_roles, set_roles=tech_roles)
-define_accessors(current_module, Interface, "Channel", "channel", "interface/wifi", "Wireless channel - see iwconfig",
+define_accessors(current_module, Interface, "Channel", "channel", 
+                 "interface/wifi", "Wireless channel - see iwconfig",
                  get_roles=all_roles, set_roles=tech_roles)
-define_accessors(current_module, Interface, "Sens", "sens", "interface/wifi", "Wireless sens - see iwconfig",
+define_accessors(current_module, Interface, "Sens", "sens", 
+                 "interface/wifi", "Wireless sens - see iwconfig",
                  get_roles=all_roles, set_roles=tech_roles)
-define_accessors(current_module, Interface, "Rate", "rate", "interface/wifi", "Wireless rate - see iwconfig",
+define_accessors(current_module, Interface, "Rate", "rate", 
+                 "interface/wifi", "Wireless rate - see iwconfig",
                  get_roles=all_roles, set_roles=tech_roles)
-define_accessors(current_module, Interface, "Key", "key", "interface/wifi", "Wireless key - see iwconfig key",
+define_accessors(current_module, Interface, "Key", "key", 
+                 "interface/wifi", "Wireless key - see iwconfig key",
                  get_roles=all_roles, set_roles=tech_roles)
-define_accessors(current_module, Interface, "Key1", "key1", "interface/wifi", "Wireless key1 - see iwconfig key[1]",
+define_accessors(current_module, Interface, "Key1", "key1", 
+                 "interface/wifi", "Wireless key1 - see iwconfig key[1]",
                  get_roles=all_roles, set_roles=tech_roles)
-define_accessors(current_module, Interface, "Key2", "key2", "interface/wifi", "Wireless key2 - see iwconfig key[2]",
+define_accessors(current_module, Interface, "Key2", "key2", 
+                 "interface/wifi", "Wireless key2 - see iwconfig key[2]",
                  get_roles=all_roles, set_roles=tech_roles)
-define_accessors(current_module, Interface, "Key3", "key3", "interface/wifi", "Wireless key3 - see iwconfig key[3]",
+define_accessors(current_module, Interface, "Key3", "key3", 
+                 "interface/wifi", "Wireless key3 - see iwconfig key[3]",
                  get_roles=all_roles, set_roles=tech_roles)
-define_accessors(current_module, Interface, "Key4", "key4", "interface/wifi", "Wireless key4 - see iwconfig key[4]",
+define_accessors(current_module, Interface, "Key4", "key4", 
+                 "interface/wifi", "Wireless key4 - see iwconfig key[4]",
                  get_roles=all_roles, set_roles=tech_roles)
-define_accessors(current_module, Interface, "SecurityMode", "securitymode", "interface/wifi", "Wireless securitymode - see iwconfig enc",
+define_accessors(current_module, Interface, "SecurityMode", "securitymode", 
+                 "interface/wifi", "Wireless securitymode - see iwconfig enc",
                  get_roles=all_roles, set_roles=tech_roles)
-define_accessors(current_module, Interface, "Iwconfig", "iwconfig", "interface/wifi", "Wireless iwconfig - see ifup-wireless",
+define_accessors(current_module, Interface, "Iwconfig", "iwconfig", 
+                 "interface/wifi", "Wireless iwconfig - see ifup-wireless",
                  get_roles=all_roles, set_roles=tech_roles)
-define_accessors(current_module, Interface, "Iwpriv", "iwpriv", "interface/wifi", "Wireless iwpriv - see ifup-wireless",
+define_accessors(current_module, Interface, "Iwpriv", "iwpriv", 
+                 "interface/wifi", "Wireless iwpriv - see ifup-wireless",
                  get_roles=all_roles, set_roles=tech_roles)
-
index c4950ca..0f5eb54 100644 (file)
@@ -38,26 +38,35 @@ taggable_classes = { Node : {'table_class' : Nodes,
 all_roles = [ 'admin', 'pi', 'tech', 'user', 'node' ]
 tech_roles = [ 'admin', 'pi', 'tech' ]
 
+#
 # generates 2 method classes:
 # Get<classname><methodsuffix> (auth, id_or_name) -> value or None
 # Set<classname><methodsuffix> (auth, id_or_name, value) -> None
 # value is always a string, no cast nor typecheck for now
 #
+# The expose_in_api flag tells whether this tag may be handled 
+#   through the Add/Get/Update methods as a native field
+#
 # note: tag_min_role_id gets attached to the tagtype instance, 
 # while get_roles and set_roles get attached to the created methods
+# this might need a cleanup
 # 
-# returns a tuple (get_method, set_method)
-# See Accessors* for examples
 
-def define_accessors (module, objclass, methodsuffix, 
-                      tagname, category, description, tag_min_role_id=10,
-                      get_roles=['admin'], set_roles=['admin']):
+def define_accessors (module, objclass, methodsuffix, tagname, 
+                      category, description, 
+                      get_roles=['admin'], set_roles=['admin'], 
+                      tag_min_role_id=10, expose_in_api = False):
     
     if objclass not in taggable_classes:
         try:
             raise PLCInvalidArgument,"PLC.Accessors.Factory: unknown class %s"%objclass.__name__
         except:
             raise PLCInvalidArgument,"PLC.Accessors.Factory: unknown class ??"
+
+    # side-effect on, say, Node.tags, if required
+    if expose_in_api:
+        getattr(objclass,'tags')[tagname]=Parameter(str,"accessor")
+
     classname=objclass.__name__
     get_name = "Get" + classname + methodsuffix
     set_name = "Set" + classname + methodsuffix
index c734a2b..723aeae 100644 (file)
@@ -80,15 +80,9 @@ class Node(Row):
        }
 
     view_tags_name = "view_node_tags"
-    # tags declared here should also be defined as Accessors to ensure that the TagType is created
-    # type info not used yet
-    tags = {
-        # regular nodes
-        'arch': str,
-        'pldistro' : str,
-        'deployment': str,
-        # dummynet nodes
-        }
+    # tags are used by the Add/Get/Update methods to expose tags
+    # this is initialized here and updated by the accessors factory
+    tags = { }
 
     def validate_hostname(self, hostname):
         if not valid_hostname(hostname):