support returning nodenetwork_ids, which are identical to interface_ids
[plcapi.git] / PLC / Legacy / NodeNetworks.py
1 # Thierry Parmentelat - INRIA
2 # $Id$
3
4 from PLC.Method import Method
5 import v42legacy
6 import sys
7 current_module=sys.modules[__name__]
8
9 methods = [
10     "AddNodeNetwork",
11     "AddNodeNetworkSetting",
12     "DeleteNodeNetwork",
13     "DeleteNodeNetworkSetting",
14     "GetNodeNetworkSettings",
15     "GetNodeNetworks",
16     "UpdateNodeNetwork",
17     "UpdateNodeNetworkSetting",
18 ]
19
20 # argument mapping
21 v42_to_v43_argmap = {
22     "nodenetwork_id":"interface_id",
23     "nodenetwork_ids":"interface_ids",
24     "nodenetworksetting_ids":"interface_tag_ids",
25     }
26 v43_to_v42_argmap = dict([ (v,k) for k,v in v42_to_v43_argmap.iteritems()])
27 def v42rename (x): return v42_to_v43_argmap.get(x,x)
28 def v43rename (x): return v43_to_v42_argmap.get(x,x)
29
30 # attach methods here
31 for legacyname in methods:
32     # new method name
33     newname=legacyname.replace("NodeNetwork","Interface").replace("Setting","Tag")
34     path = "PLC.Methods."
35     setattr(current_module,legacyname,v42legacy.make_class(legacyname,newname,path,v42rename,v43rename))
36
37 # GetNodes update
38 # first replace the call method so we can translate fields
39 c = getattr(v42legacy.import_deep("PLC.Methods.GetNodes"),"GetNodes")
40 # rename call to newcall so we can still invoke
41 original = getattr(c,"call")
42 setattr(c,"newcall",original)
43
44 # 4.2 legacy support; update node_fields to include nodenetwork_ids
45 from PLC.Parameter import Parameter, Mixed, python_type
46 from PLC.Filter import Filter
47 from PLC.Nodes import Node, Nodes
48
49 node_fields = {}
50 node_fields['nodenetwork_ids']=Parameter([int], "Legacy version of interface_ids")
51 for k,v in Node.fields.iteritems():
52     node_fields[k]=v
53
54 if False:
55     expected = node_fields['nodenetwork_ids']
56     print "type of nodenetwork_ids = %s" % python_type(node_fields['nodenetwork_ids'])
57     print Filter(node_fields).fields.keys()
58     print Filter(Node.fields).fields.keys()
59
60 accepts = getattr(c,"accepts")
61 arg0=accepts[0]
62 arg1=Mixed([Mixed(Node.fields['node_id'],
63                   Node.fields['hostname'])],
64            Parameter(str,"hostname"),
65            Parameter(int,"node_id"),
66            Filter(node_fields))
67 arg2=accepts[2]
68 newaccepts = [arg0,arg1,arg2]
69 setattr(c,"accepts",newaccepts)
70 newreturns = [node_fields]
71 setattr(c,"returns",newreturns)
72
73 def GetNodesCall(self, auth, node_filter = None, return_fields = None):
74     global original
75     # convert nodenetwork_ids -> interface_ids
76     if node_filter <> None and \
77            node_filter.has_key('nodenetwork_ids') and \
78            not node_filter.has_key('interface_ids'):
79         node_filter['interface_ids']=node_filter['nodenetwork_ids']
80         
81     nodes = original(self,auth,node_filter,return_fields)
82
83     # add in a interface_ids -> nodenetwork_ids
84     for node in nodes:
85         if node.has_key('interface_ids'):
86             node['nodenetwork_ids']=node['interface_ids']
87
88     return nodes
89
90 setattr(c,"call",GetNodesCall)