From 1a490bae2371aebd8d0c0dfdcbad97cdccb19f03 Mon Sep 17 00:00:00 2001 From: Thierry Parmentelat Date: Mon, 31 Mar 2008 12:23:03 +0000 Subject: [PATCH] Allows to set spec fields at arbitrary depth --- system/TestMapper.py | 50 ++++++++++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/system/TestMapper.py b/system/TestMapper.py index 1d2dd3c..06ed8f7 100644 --- a/system/TestMapper.py +++ b/system/TestMapper.py @@ -5,7 +5,7 @@ # # this works on a spec as defined in a config file # and allows to remap various fields, typically to another testbox -# see an example in config-testbox2.py +# see an example in config_onelab_testbox32.py # import re @@ -31,21 +31,35 @@ class TestMapper: def node_name (node): return node['node_fields']['hostname'] - def apply_first_map (self, obj, name, type, maplist): - for (key,dict) in maplist: - if TestMapper.match (name,key): - utils.header("TestMapper/%s : applying match key %s on plc %s"%(type,key,name)) - for (k,v) in dict.iteritems(): - if not obj.has_key(k): - utils.header ("WARNING : no such key %s in %s %s",k,type,name) - else: - # apply formatting if found - if v.find('%s')>=0: - v=v%obj[k] - if self.options.verbose: - utils.header("mapping %s->%s towards %s"%(name,k,v)) - obj[k]=v - break + def apply_first_map (self, type, name, obj, maplist): + for (map_pattern,rename_dict) in maplist: + if TestMapper.match (name,map_pattern): + utils.header("TestMapper/%s : applying match key %s on plc %s"%(type,map_pattern,name)) + for (k,v) in rename_dict.iteritems(): + # apply : separator + path=k.split(':') + # step down but last step in path + o=obj + for step in path[:-1]: + if not o.has_key(step): + utils.header ("WARNING : cannot apply step %s in path %s on %s %s"%( + step,path,type,name)) + return + o=obj[step] + # last step is the one for side-effect + step=path[-1] + if not o.has_key(step): + utils.header ("WARNING : cannot apply step %s in path %s on %s %s"%( + step,path,type,name)) + return + # apply formatting if found + if v.find('%s')>=0: + v=v%obj[k] + if self.options.verbose: + utils.header("mapping %s->%s towards %s"%(name,k,v)) + o[step]=v + # only apply first rule + return def map (self): @@ -53,14 +67,14 @@ class TestMapper: for plc in self.plcs: name=TestMapper.plc_name(plc) - self.apply_first_map (plc,name,'plc',plc_maps) + self.apply_first_map ('plc',name,plc,plc_maps) node_maps = self.mapper['node'] for site in plc['sites']: for node in site['nodes']: nodename = TestMapper.node_name(node) - self.apply_first_map(node,nodename,"node",node_maps) + self.apply_first_map('node',nodename,node,node_maps) return self.plcs -- 2.47.0