X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=system%2FTestMapper.py;h=7d0547f3e40c72891049ca2487d284eeecca803d;hb=86060c0d1d30f491bda3f34be1f4fa7a16230a7d;hp=1d2dd3c17f6bc9e287a7bca6dcb58f7acc32a9a5;hpb=065ae8e8bd2787cbea793a855822c44751ef01e7;p=tests.git diff --git a/system/TestMapper.py b/system/TestMapper.py index 1d2dd3c..7d0547f 100644 --- a/system/TestMapper.py +++ b/system/TestMapper.py @@ -1,67 +1,85 @@ # -# Thierry Parmentelat - INRIA Sophia Antipolis +# Thierry Parmentelat +# Copyright (C) 2010 INRIA +# # # mapper class # # 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 +# and allows to remap various fields on the local substrate # -import re import utils class TestMapper: - def __init__ (self,plcs,mapper,options): + def __init__ (self,plcs,options): self.plcs=plcs - self.mapper=mapper self.options=options - @staticmethod - def match (name,key): - key=key.replace("*",".*") - return re.compile(key).match(name) - @staticmethod def plc_name (plc): return plc['name'] @staticmethod def node_name (node): - return node['node_fields']['hostname'] + return node['name'] + + def node_names (self): + result=[] + for plc in self.plcs: + for site in plc['sites']: + for node in site['nodes']: + result.append(node['name']) + return result - 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 utils.match (name,map_pattern): + if self.options.verbose: + utils.header("TestMapper/%s : applying rules '%s' on %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): + o[step]={} + if self.options.verbose: + utils.header ("WARNING : created step %s in path %s on %s %s"%( + step,path,type,name)) + o=o[step] + # last step is the one for side-effect + step=path[-1] + if self.options.verbose: + if not o.has_key(step): + utils.header ("WARNING : inserting key %s for path %s on %s %s"%( + step,path,type,name)) + # apply formatting if '%s' found in the value + if v is None: + if self.options.verbose: print "TestMapper WARNING - None value - ignored, key=",k + continue + if v.find('%s')>=0: + v=v%obj[k] + if self.options.verbose: + print("TestMapper, rewriting %s: %s into %s"%(name,k,v)) + o[step]=v + # only apply first rule + return - def map (self): + def map (self,mapper): - plc_maps = self.mapper['plc'] + plc_maps = mapper.get('plc',[]) + node_maps = mapper.get('node',[]) for plc in self.plcs: name=TestMapper.plc_name(plc) - self.apply_first_map (plc,name,'plc',plc_maps) - - node_maps = self.mapper['node'] + self.apply_first_map ('plc',name,plc,plc_maps) 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 - -