#!/usr/bin/python3 # Template Batchrahmen # #import sys, getopt import argparse import copy import yaml from datetime import datetime import ulrich.message import ulrich.message import ulrich.componentHandling import utils.date_tool import utils.path_tool jobdef = { "unit": { "pardef": "", "pfilesource" : "", "pfiletarget" : "envparfile", "basedir": "envbase", "logdir": "{job.par.envdir}/{log}/log_{time}.txt" }, "check_environment": { "pardef": "", "pfilesource" : "", "pfiletarget" : "envparfile", "basedir": "envbase", "logdir": "{job.par.envdir}/{log}/log_{time}.txt" }, "init_testset": { "pardef": "tsdir,tdtyp,tdsrc,tdname", "pfilesource" : "envparfile", "pfiletarget" : "tsparfile", "basedir": "tsbase", "logdir": "{job.par.tsdir}/{log}/log_{tstime}.txt" }, "init_testcase": { "pardef": "tcdir,tdtyp,tdsrc,tdname", "pfilesource" : "tsparfile", "pfiletarget" : "tcparfile", "basedir": "tcbase", "logdir": "{job.par.tcdir}/{log}/log_{tctime}.txt" } } def setGlobal(): pass class Job: __instance = None def __init__ (self, program): print ("################# init Job ## " + program + " #################") self.program = program Job.__instance = self par = Parameter(program) self.par = par print("prog-42 " + str(self.par.basedir)) conf = Configuration(program) self.conf = conf print("prog-45 " + str(self.par.basedir)) dirpath = self.par.getDirParameter() setGlobal() if dirpath is not None: utils.path_tool.extractPath(dirpath[0], dirpath[1]) if program == "unit": # no job will be started self.start = datetime.now() logTime = self.start.strftime("%Y%m%d_%H%M%S") self.m = ulrich.message.Message(ulrich.message.LIMIT_DEBUG, logTime, None) print("prog-50 " + str(self.par.basedir)) def resetInstance(program): job = Job.getInstance() if job is not None: job.stopJob(1) Job.__instance = None Job(program) return Job.__instance def getInstance(): if (Job.__instance is not None): return Job.__instance else: return None def startJob(self): self.start = datetime.now() print("prog-68 " + str(self.par.basedir)) logTime = self.start.strftime("%Y%m%d_%H%M%S") self.m = ulrich.message.Message(ulrich.message.LIMIT_DEBUG, logTime, None) print("prog-68 " + str(self.m.rc)) self.par.setParameterLoaded() self.m.logInfo("# # # Start Job " + self.start.strftime("%d.%m.%Y %H:%M:%S") + " # # # ") self.m.debug(ulrich.message.LIMIT_INFO, "# # # Start Job " + self.start.strftime("%d.%m.%Y %H:%M:%S") + " # # # ") self.par.checkParameter() def stopJob(self, reboot=0): self.ende = datetime.now() self.dumpParameter() print("stopJob " + str(self.m.messages) + ", " + str(self.m.debugfile)) self.m.logInfo("# # " + self.m.topmessage + " # # # ") self.m.logInfo("# # # Stop Job " + self.start.strftime("%d.%m.%Y %H:%M:%S") + " # " + self.ende.strftime("%d.%m.%Y %H:%M:%S") + " # # # ") self.m.debug(ulrich.message.LIMIT_INFO, "# # " + self.m.topmessage + " # # # ") self.m.debug(ulrich.message.LIMIT_INFO, "# # # Stop Job " + self.start.strftime("%d.%m.%Y %H:%M:%S") + " # " + self.ende.strftime("%d.%m.%Y %H:%M:%S") + " # # # RC: " + str(self.m.getFinalRc())) self.m.closeMessage() rc = self.m.getFinalRc() print ("rc " + str(rc)) if reboot == 0: exit(rc) def dumpParameter(self): parpath = utils.path_tool.composePath(jobdef[self.program]["pfiletarget"], None) output = {} output["comps"] = ulrich.componentHandling.getComponentDict() output["par"] = self.par.__dict__ print(str(output)) with open(parpath, "w") as file: doc = yaml.dump(output, file) file.close() def loadParameter(self): output = {} if len(str(jobdef[self.program]["pfilesource"])) < 2: return None parpath = utils.path_tool.composePath(jobdef[self.program]["pfilesource"], None) with open(parpath, "r") as file: doc = yaml.full_load(file) for k in doc.keys(): output[k] = copy.deepcopy(doc[k]) return output def getParameter(self, parameter): if hasattr(self.par, parameter): return getattr(self.par, parameter) elif "xxxtime" in parameter: neu = utils.date_tool.getActdate(utils.date_tool.F_DIR) # setattr(self.par, parameter, neu) return neu def hasElement(self, parameter, elem): if hasattr(self.par, parameter): print (parameter + " in Parameter") if getattr(self.par, parameter).find(elem) >= 0: return True return False return True def hascomponente(self, komp): return self.hasElement("componente", komp) def hasFunction(self, fct): return self.hasElement("function", fct) def hasTool(self, tool): return self.hasElement("tool", tool) def getMessageLevel(self, errtyp, elem): if (not hasattr(self, "m")) or (self.m is None): return ulrich.message.LIMIT_DEBUG elif elem.find("tool") > 1: if not hasattr(self.par, "tool") or getattr(self.par, "tool").find(elem) <= 0: return int(self.m.CONST_ERRTYP[errtyp]) -1 else: return int(self.m.CONST_ERRTYP[errtyp]) else: return int(self.m.CONST_ERRTYP[errtyp]) def getInfoLevel(self, elem): return self.getMessageLevel("info", elem) def getDebugLevel(self, elem): return self.getMessageLevel("debug", elem) def getTraceLevel(self, elem): return self.getMessageLevel("trace", elem) def debug(self, prio, text): print("job.debug "+str(prio)+" "+text) if hasattr(self, "m"): self.m.debug(prio, text) else: print(text) class Parameter: print ("class Parameter") def __init__ (self, program): print ("# init Parameter for " + program) self.program = program if program == "unit": self.basedir = "debugs" return elif jobdef[program]: self.basedir = jobdef[program]["basedir"] elif "estcase" in program: self.basedir = "tcbase" elif "estset" in program: self.basedir = "tsbase" elif "nviron" in program: self.basedir = "envbase" else: self.basedir = "debugs" print (f"# Parameter initialisiert {self.program} mit basedir {self.basedir}") self.setParameter() def checkParameter(self): job = Job.getInstance() print (f"Parameter initialisiert {self.program}") pardef = jobdef[job.program]["pardef"] for p in pardef.split(","): print(p) if len(p) > 1 and not hasattr(self, p): job.m.setFatal("Parameter " + p + " is not set!") print (f"job initialisiert {self.program}") def setParameter(self): """ 1. Programm -- implementiert in Main-Klasse 2. anwndung -- steuert zu pruefende System [ in basis_Config ] 3. amgebung -- steuert zu pruefende Maschine [ in dir/applicationen ] 4. release -- steuert zu prufendes Release [ aus dir/release kann spez. release_Config geladen werden, dir/lauf/release ] 5. ~Verz -- Dokumentationsverzeichnis zu Testlauf/Testfall/Soll-Branch 6. zyklus -- optional unterscheidet echte und entwicklungsLaeufe 7. Programmspezifische Parameter 8. loglevel -- steuert Protokollierung; default debug (fatal/error/warn/msg/info/debug1/debug2/trace1/trace2) 10. modus -- steuert die Verarbeitung; default echt - echt-auto Lauf aus Automatisierung (1-7) - test Lauf ohne Ausfuehrungen am Testsystem, wohl aber in Testverzeichnissen - echt-spez Wiederholung einer spezifischen Funktion (1-13) - unit Ausfuehrung der Unittests 11. componente -- schraenkt Verarbeitung auf parametriserte componenten ein 12. funktion -- schraenkt Verarbeitung auf parametriserte Funktionen ein 13. tool -- schraenkt Protokollierung/Verarbeitung auf parametriserte Tools ein """ # args = str(sys.argv) # print ("Job-Programm %s : " % args) parser = argparse.ArgumentParser() parser.add_argument('-a', '--application', required=True, action='store') parser.add_argument('-e', '--environment', required=True, action='store') parser.add_argument('-r', '--release', action='store') parser.add_argument('-ts', '--tsdir', action='store') parser.add_argument('-tc', '--tcdir', action='store') parser.add_argument('-rs', '--rsdir', action='store') parser.add_argument('-dt', '--tdtyp', action='store') parser.add_argument('-ds', '--tdsrc', action='store') parser.add_argument('-dn', '--tdname', action='store') parser.add_argument('-l', '--loglevel', action='store') parser.add_argument('-m', '--modus', action='store') parser.add_argument('-c', '--componente', action='store') parser.add_argument('-f', '--funktion', action='store') parser.add_argument('-t', '--tool', action='store') # parser.add_argument('-t', '--typ', default='einzel', action='store') # parser.add_argument('-d', '--dir', action='store') args = parser.parse_args() self.setParameterArgs(args) def getDirParameter(self): if hasattr(self, "tcdir"): return ("tcbase", str(self.tcdir)) if hasattr(self, "tsdir"): return ("tsbase", str(self.tsdir)) return None def setParameterArgs(self, args): job = Job.getInstance() print("setParArgs " + str(type(args))) self.parstring = "python " + self.program if "dict" in str(type(args)): for k in args: self.setJobAttr(k, args[k]) else: for k in vars(args): if getattr(args, k) is not None: self.setJobAttr(k , getattr(args, k)) def setParameterLoaded(self): job = Job.getInstance() print("setParLoaded " ) readedPar = job.loadParameter() if readedPar is not None: for k in readedPar["par"].keys(): if not hasattr(self, k): self.setJobAttr(k, readedPar["par"][k]) def setJobAttr(self, key, val): setattr(self, key, val) self.parstring = self.parstring + " --" + key + " " + val class Configuration: def __init__ (self, program): self.program = program print (f"job initialisiert {self.program}") if program == "unit": self.setConfiguration('../conf/basis.yml') return self.setConfiguration('conf/basis.yml') def setConfiguration(self, path): self.confs = {} with open(path, "r") as file: doc = yaml.full_load(file) for i, v in doc.items(): self.confs[i] = v print ("set conf") print ("set configuration")