from PLC.Slices import Slice
from PLC.Ilinks import Ilink
-from PLC.Accessors.Factory import all_roles, get_set_factory
+from PLC.Accessors.Factory import define_accessors, all_roles
+
+import sys
+current_module = sys.modules[__name__]
#### example : attach vlan ids on interfaces
-###(GetInterfaceVlan, SetInterfaceVlan) = \
-### get_set_factory ( Interface, "Vlan", "vlan","interface/general", "tag for setting VLAN id",
-### get_roles=all_roles,
-### set_roles=['admin', 'pi', 'tech'] )
-###methods += [ 'GetInterfaceVlan', 'SetInterfaceVlan' ]
+###define_accessors(current_module, Interface, "Vlan", "vlan","interface/general", "tag for setting VLAN id",
+### get_roles=all_roles,
+### set_roles=['admin', 'pi', 'tech'] )
from PLC.Slices import Slice
from PLC.Ilinks import Ilink
-from PLC.Accessors.Factory import all_roles, get_set_factory
+from PLC.Accessors.Factory import define_accessors, all_roles
-methods=[]
+import sys
+current_module = sys.modules[__name__]
# example : node architecture
-(GetNodeArch, SetNodeArch) = \
- get_set_factory ( Node, "Arch", 'arch', 'node/config', 'architecture name',
- tag_min_role_id=40,
- get_roles=all_roles,
- set_roles=['admin', 'pi', 'tech'] )
-methods += [ 'GetNodeArch', 'SetNodeArch' ]
+define_accessors(current_module, Node, "Arch", 'arch', 'node/config', 'architecture name',
+ tag_min_role_id=40,
+ get_roles=all_roles,
+ set_roles=['admin', 'pi', 'tech'] )
# returns a tuple (get_method, set_method)
# See Accessors* for examples
-def get_set_factory (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, tag_min_role_id=10,
+ get_roles=['admin'], set_roles=['admin']):
if objclass not in taggable_classes:
try:
'min_role_id': tag_min_role_id}
tag_type = TagType (self.api, tag_type_fields)
tag_type.sync()
- # proceed
tag_type_id = tag_type['tag_type_id']
+
+ # locate the join object (e.g. NodeTag, SliceAttribute or InterfaceSetting)
filter = {'tag_type_id':tag_type_id}
if isinstance (id_or_name,int):
filter[primary_key]=id_or_name
else:
filter[secondary_key]=id_or_name
joins = joins_class (self.api,filter)
- if not joins:
- join = join_class (self.api)
- join['tag_type_id']=tag_type_id
- join[primary_key]=primary_id
- join[value_key]=tagvalue
- join.sync()
+ # setting to something non void
+ if tagvalue is not None:
+ if not joins:
+ join = join_class (self.api)
+ join['tag_type_id']=tag_type_id
+ join[primary_key]=primary_id
+ join[value_key]=tagvalue
+ join.sync()
+ else:
+ joins[0][value_key]=tagvalue
+ joins[0].sync()
+ # providing an empty value means clean up
else:
- joins[0][value_key]=tagvalue
- joins[0].sync()
+ if joins:
+ join=joins[0]
+ join.delete()
# attach it
setattr (set_class,"call",set_call)
- return ( get_class, set_class )
+ # define in module
+ setattr(module,get_name,get_class)
+ setattr(module,set_name,set_class)
+ # add in <module>.methods
+ try:
+ methods=getattr(module,'methods')
+ except:
+ methods=[]
+ methods += [get_name,set_name]
+ setattr(module,'methods',methods)
return dict ( [ (rename(k),v) for (k,v) in arg.iteritems() ] )
return arg
-def factory (legacyname):
+def legacy_method (legacyname):
# new method name
newname=legacyname.replace("NodeNetwork","Interface")
# locate new class
return legacyclass
-# this does not work, as __module__ is not yet supported
-#for legacyname in methods:
-# setattr(__module__,legacyname,factory(legacyname))
-# this does not work either, as we are importing the module so we cannot locate it yet
-#for legacyname in methods:
-# this_module = import_deep(__name__)
-# setattr(__module__,legacyname,factory(legacyname))
+import sys
+current_module=sys.modules[__name__]
+
+# attach
+for legacyname in methods:
+ setattr(current_module,legacyname,legacy_method(legacyname))
-AddNodeNetwork=factory("AddNodeNetwork")
-AddNodeNetworkSetting=factory("AddNodeNetworkSetting")
-DeleteNodeNetwork=factory("DeleteNodeNetwork")
-DeleteNodeNetworkSetting=factory("DeleteNodeNetworkSetting")
-GetNodeNetworkSettings=factory("GetNodeNetworkSettings")
-GetNodeNetworks=factory("GetNodeNetworks")
-UpdateNodeNetwork=factory("UpdateNodeNetwork")
-UpdateNodeNetworkSetting=factory("UpdateNodeNetworkSetting")
"UpdateNodeNetworkSettingType" : "UpdateTagType",
}
-methods = map.keys()
-
# does any required renaming
def rename (x):
if x=='name':
return dict ( [ (rename(k),v) for (k,v) in arg.iteritems() ] )
return arg
-def factory (legacyname, newname):
+def legacy_method (legacyname, newname):
# locate new class
newclass=getattr(import_deep("PLC.Methods."+newname),newname)
# create class for legacy name
return legacyclass
-# see NodeNetworks for attempts to avoid this
+import sys
+current_module=sys.modules[__name__]
+
+for (legacyname,newname) in map.iteritems():
+ setattr(current_module,legacyname,legacy_method(legacyname,newname))
+
+methods = map.keys()
-AddSliceAttributeType=factory("AddSliceAttributeType","AddTagType")
-DeleteSliceAttributeType=factory("DeleteSliceAttributeType","DeleteTagType")
-GetSliceAttributeTypes=factory("GetSliceAttributeTypes","GetTagTypes")
-UpdateSliceAttributeType=factory("UpdateSliceAttributeType","UpdateTagType")
-AddNodeNetworkSettingType=factory("AddNodeNetworkSettingType","AddTagType")
-DeleteNodeNetworkSettingType=factory("DeleteNodeNetworkSettingType","DeleteTagType")
-GetNodeNetworkSettingTypes=factory("GetNodeNetworkSettingTypes","GetTagTypes")
-UpdateNodeNetworkSettingType=factory("UpdateNodeNetworkSettingType","UpdateTagType")