From 30abeea24f5e8911ce18426dc2947be1850a196c Mon Sep 17 00:00:00 2001 From: Thierry Parmentelat Date: Wed, 10 Dec 2008 20:58:29 +0000 Subject: [PATCH] define tags exposed to the API in the Accessors area --- PLC/Accessors/Accessors_site.py | 10 ++++-- PLC/Accessors/Accessors_standard.py | 48 +++++++++++++++++----------- PLC/Accessors/Accessors_wireless.py | 49 ++++++++++++++++++----------- PLC/Accessors/Factory.py | 19 ++++++++--- PLC/Nodes.py | 12 ++----- 5 files changed, 84 insertions(+), 54 deletions(-) diff --git a/PLC/Accessors/Accessors_site.py b/PLC/Accessors/Accessors_site.py index 1816117..3a78e82 100644 --- a/PLC/Accessors/Accessors_site.py +++ b/PLC/Accessors/Accessors_site.py @@ -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) diff --git a/PLC/Accessors/Accessors_standard.py b/PLC/Accessors/Accessors_standard.py index cbc4fb3..585f881 100644 --- a/PLC/Accessors/Accessors_standard.py +++ b/PLC/Accessors/Accessors_standard.py @@ -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) diff --git a/PLC/Accessors/Accessors_wireless.py b/PLC/Accessors/Accessors_wireless.py index 986ebe6..203a3b5 100644 --- a/PLC/Accessors/Accessors_wireless.py +++ b/PLC/Accessors/Accessors_wireless.py @@ -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) - diff --git a/PLC/Accessors/Factory.py b/PLC/Accessors/Factory.py index c4950ca..0f5eb54 100644 --- a/PLC/Accessors/Factory.py +++ b/PLC/Accessors/Factory.py @@ -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 (auth, id_or_name) -> value or None # Set (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 diff --git a/PLC/Nodes.py b/PLC/Nodes.py index c734a2b..723aeae 100644 --- a/PLC/Nodes.py +++ b/PLC/Nodes.py @@ -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): -- 2.43.0