oops
[tests.git] / system / TestMapper.py
index 06ed8f7..f07ed1b 100644 (file)
@@ -1,81 +1,87 @@
 #
-# Thierry Parmentelat - INRIA Sophia Antipolis 
+# Thierry Parmentelat <thierry.parmentelat@inria.fr>
+# 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_onelab_testbox32.py
+# and allows to remap various fields on the local substrate
 # 
 
-import re
 import utils
 
 class TestMapper:
 
-    def __init__ (self,plcs,mapper,options):
-        self.plcs=plcs
-        self.mapper=mapper
-        self.options=options
-
-    @staticmethod
-    def match (name,key):
-        key=key.replace("*",".*")
-        return re.compile(key).match(name)
+    def __init__(self,plcs,options):
+        self.plcs = plcs
+        self.options = options
 
     @staticmethod
-    def plc_name (plc):
+    def plc_name(plc):
         return plc['name']
 
     @staticmethod
-    def node_name (node):
-        return node['node_fields']['hostname']
+    def node_name(node):
+        return node['name']
 
-    def apply_first_map (self, type, name, obj, maplist):
+    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, 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():
+            if utils.match (name,map_pattern):
+                if self.options.verbose:
+                    utils.header("TestMapper/{} : applying rules '{}' on {}"\
+                                 .format(type, map_pattern, name))
+                for (k,v) in rename_dict.items():
                     # apply : separator
-                    path=k.split(':')
+                    path = k.split(':')
                     # step down but last step in path
-                    o=obj
+                    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]
+                        if step not in o:
+                            o[step] = {}
+                            if self.options.verbose:
+                                utils.header ("WARNING : created step {} in path {} on {} {}"\
+                                              .format(step,path,type,name))
+                        o = o[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]
+                    step = path[-1]
                     if self.options.verbose:
-                        utils.header("mapping %s->%s towards %s"%(name,k,v))
-                    o[step]=v
+                        if step not in o:
+                            utils.header ("WARNING : inserting key {} for path {} on {} {}"\
+                                          .format(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 {}: {} into {}"\
+                              .format(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']
+            name = TestMapper.plc_name(plc)
+            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
-                                               
-