commit
						2726a1f518
					
				 75 changed files with 3184 additions and 0 deletions
			
			
		| @ -0,0 +1,5 @@ | |||
| # Default ignored files | |||
| /shelf/ | |||
| /workspace.xml | |||
| ../test/log/*.txt | |||
| ../test/environment/ENV01/log/*.txt | |||
| @ -0,0 +1,6 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <project version="4"> | |||
|   <component name="ExternalDependencies"> | |||
|     <plugin id="com.intellij.configurationScript" /> | |||
|   </component> | |||
| </project> | |||
| @ -0,0 +1,6 @@ | |||
| <component name="InspectionProjectProfileManager"> | |||
|   <settings> | |||
|     <option name="USE_PROJECT_PROFILE" value="false" /> | |||
|     <version value="1.0" /> | |||
|   </settings> | |||
| </component> | |||
| @ -0,0 +1,4 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <project version="4"> | |||
|   <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.9 (pythonProject)" project-jdk-type="Python SDK" /> | |||
| </project> | |||
| @ -0,0 +1,8 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <project version="4"> | |||
|   <component name="ProjectModuleManager"> | |||
|     <modules> | |||
|       <module fileurl="file://$PROJECT_DIR$/.idea/pythonProject.iml" filepath="$PROJECT_DIR$/.idea/pythonProject.iml" /> | |||
|     </modules> | |||
|   </component> | |||
| </project> | |||
| @ -0,0 +1,8 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <module type="PYTHON_MODULE" version="4"> | |||
|   <component name="NewModuleRootManager"> | |||
|     <content url="file://$MODULE_DIR$" /> | |||
|     <orderEntry type="jdk" jdkName="Python 3.9 (pythonProject)" jdkType="Python SDK" /> | |||
|     <orderEntry type="sourceFolder" forTests="false" /> | |||
|   </component> | |||
| </module> | |||
| @ -0,0 +1,6 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <project version="4"> | |||
|   <component name="VcsDirectoryMappings"> | |||
|     <mapping directory="$PROJECT_DIR$" vcs="Git" /> | |||
|   </component> | |||
| </project> | |||
| @ -0,0 +1,4 @@ | |||
| This program is a test-framework which controls especially the system-under-test and which makes comparsions for diversity-tests. | |||
| It should be installed near by the application-system which has to be tested and with access-rights to the application-system. | |||
| 
 | |||
| The business-test-frameworks on | |||
| @ -0,0 +1,33 @@ | |||
| # This is a sample Python script. | |||
| import sys# | |||
| # import jsonpickle # pip install jsonpickle | |||
| import yaml # pip install pyyaml | |||
| import ulrich.program | |||
| import ulrich.componentHandling | |||
| import ulrich.message | |||
| import utils.tdata_tool | |||
| 
 | |||
| PROGRAM_NAME = "check_environment" | |||
| 
 | |||
| if __name__ == '__main__': | |||
|     x = ulrich.program.Job(PROGRAM_NAME) | |||
|     print ("x "+str(x)) | |||
|     x.startJob() | |||
|     x.m.logDebug(str(vars(x.par)) + "\n" + str(vars(x.conf))) | |||
|     if x.m.isRc("fatal"): | |||
|         x.stopJob() | |||
|         exit(x.m.rc * (-1) + 3) | |||
|     # now in theory the program is runnable | |||
|     x.m.setMsg("# job initialized") | |||
|     cm = ulrich.componentHandling.ComponentManager() | |||
|     cm.initComponents() | |||
|     comps = cm.getComponents(PROGRAM_NAME) | |||
|     x.m.setMsg("# Components initialized with these relevant components " + str(comps)) | |||
|     for c in comps: | |||
|         comp = cm.getComponents(c) | |||
|         comp.check_Instance() | |||
|         x.m.merge(comp.m) | |||
|         comp.confs["function"][PROGRAM_NAME] = comp.m.topmessage | |||
| 
 | |||
|     x.stopJob() | |||
| # See PyCharm help at https://www.jetbrains.com/help/pycharm/ | |||
| @ -0,0 +1,380 @@ | |||
| # abstract class for instance components | |||
| # --------------------------------------------------------------------- | |||
| from datetime import datetime | |||
| 
 | |||
| import ulrich.message | |||
| import inspect | |||
| """ | |||
| A component represents an application of the system-under-test | |||
| As the representation it has to knowlegde of the url, which other components depends on this component. | |||
| During a test-run the component must be checked, prepared, appfiles has to be collected, etc. For this doing there are some standard-methods implemented. | |||
| """ | |||
| class Component: | |||
|     def init(self): | |||
|         """ | |||
|         The range of the test-system is defined by the dependancy graph which starts at the application.and indate each component. | |||
|         By this way it is possible to use the same component in different test-systems and so the | |||
|         application-knowlegde of this component must be defined only once. | |||
|         A component can be a software-instance or a data. | |||
|         Initialisation of concrete component | |||
| 
 | |||
|         it is controlled by their configuration | |||
|         """ | |||
|         job = ulrich.program.Job.getInstance() | |||
|         verify = job.getDebugLevel(self.name) | |||
|         self.m.debug(verify, "--- " + str(inspect.currentframe().f_code.co_name) + "() " + str(self.name)) | |||
| 
 | |||
| 
 | |||
|     def prepare_system(self): | |||
|         """ | |||
|         In order to preparate the test system test data should be cleaned and loaded with actual data. | |||
|         This can happen on different granularities: for each testcase or for each test sequences or for a test set or | |||
|         for a whole test. | |||
|         The loaded test data should be selected for a later comparison. | |||
|         :return: | |||
|         """ | |||
|         pass | |||
|     def init_Testset(self): | |||
|         """ | |||
|         main methode for system-preparation | |||
|         :param self: | |||
|         :return: | |||
|         """ | |||
|         job = ulrich.program.Job.getInstance() | |||
|         verify = -1+job.getDebugLevel(self.name) | |||
|         self.m.logInfo("--- " + str(inspect.currentframe().f_code.co_name) + "() started at " + datetime.now().strftime("%Y%m%d_%H%M%S") + " for " + str(self.name).upper()) | |||
| 
 | |||
|         self.m.setMsg("checkInstance for " + self.name + " is OK") | |||
|         self.m.logInfo("--- " + str(inspect.currentframe().f_code.co_name) + "() finished at " + datetime.now().strftime("%Y%m%d_%H%M%S") + " for " + str(self.name).upper()) | |||
| 
 | |||
|     def reset_TsData(self): | |||
|         job = ulrich.program.Job.getInstance() | |||
|         verify = -1+job.getDebugLevel(self.name) | |||
|         self.m.logDebug(verify, "--- " + str(inspect.currentframe().f_code.co_name) + "() started at " + datetime.now().strftime("%Y%m%d_%H%M%S") + " for " + str(self.name).upper()) | |||
|         if "log" in self.conf["artifact"]: | |||
|             self.m.logInfo("log rotate  in "+ self.name) | |||
|         if "db" in self.conf["artifact"]: | |||
|             self.m.logInfo("delete db-content "+ self.name) | |||
|         if "lob" in self.conf["artifact"]: | |||
|             self.m.logInfo("lob is deleted with db "+ self.name) | |||
|         if "file" in self.conf["artifact"]: | |||
|             self.m.logInfo("rm files in "+ self.name) | |||
|         self.m.setMsg("checkInstance for " + self.name + " is OK") | |||
|         self.m.logDebug(verify, "--- " + str(inspect.currentframe().f_code.co_name) + "() finished at " + datetime.now().strftime("%Y%m%d_%H%M%S") + " for " + str(self.name).upper()) | |||
|     def load_TsData(self, testdata): | |||
|         job = ulrich.program.Job.getInstance() | |||
|         verify = -1+job.getDebugLevel(self.name) | |||
|         self.m.logDebug(verify, "--- " + str(inspect.currentframe().f_code.co_name) + "() started at " + datetime.now().strftime("%Y%m%d_%H%M%S") + " for " + str(self.name).upper()) | |||
|         if "testdata" in self.conf: | |||
|             if self.conf["testdata"] == "db": | |||
|                 self.m.logInfo("insert db-content " + self.name) | |||
|             self.m.setMsg("data loaded for " + self.name + " is OK") | |||
|         self.m.logDebug(verify, "--- " + str(inspect.currentframe().f_code.co_name) + "() finished at " + datetime.now().strftime("%Y%m%d_%H%M%S") + " for " + str(self.name).upper()) | |||
| 
 | |||
|     def read_TsData(self): | |||
|         job = ulrich.program.Job.getInstance() | |||
|         verify = -1+job.getDebugLevel(self.name) | |||
|         self.m.logDebug(verify, "--- " + str(inspect.currentframe().f_code.co_name) + "() started at " + datetime.now().strftime("%Y%m%d_%H%M%S") + " for " + str(self.name).upper()) | |||
|         if "db" in self.conf["artifact"]: | |||
|             self.m.logInfo("select db-content "+ self.name) | |||
|         if "lob" in self.conf["artifact"]: | |||
|             self.m.logInfo("check lob if is deleted with db "+ self.name) | |||
|         self.m.setMsg("checkInstance for " + self.name + " is OK") | |||
|         self.m.logDebug(verify, "--- " + str(inspect.currentframe().f_code.co_name) + "() finished at " + datetime.now().strftime("%Y%m%d_%H%M%S") + " for " + str(self.name).upper()) | |||
| 
 | |||
|     def init_Testcase(self): | |||
|         """ | |||
|         main methode for system-preparation | |||
|         :param self: | |||
|         :return: | |||
|         """ | |||
|         job = ulrich.program.Job.getInstance() | |||
|         verify = -1+job.getDebugLevel(self.name) | |||
|         self.m.logInfo("--- " + str(inspect.currentframe().f_code.co_name) + "() started at " + datetime.now().strftime("%Y%m%d_%H%M%S") + " for " + str(self.name).upper()) | |||
|         self.m.logInfo("something in "+ self.name) | |||
|         self.m.setMsg("checkInstance for " + self.name + " is OK") | |||
|         self.m.logInfo("--- " + str(inspect.currentframe().f_code.co_name) + "() finished at " + datetime.now().strftime("%Y%m%d_%H%M%S") + " for " + str(self.name).upper()) | |||
| 
 | |||
|     def reset_TcData(self): | |||
|         job = ulrich.program.Job.getInstance() | |||
|         verify = -1+job.getDebugLevel(self.name) | |||
|         self.m.logDebug(verify, "--- " + str(inspect.currentframe().f_code.co_name) + "() started at " + datetime.now().strftime("%Y%m%d_%H%M%S") + " for " + str(self.name).upper()) | |||
|         if "log" in self.conf["artifact"]: | |||
|             self.m.logInfo("log rotate  in "+ self.name) | |||
|         if "db" in self.conf["artifact"]: | |||
|             self.m.logInfo("delete db-content "+ self.name) | |||
|         if "lob" in self.conf["artifact"]: | |||
|             self.m.logInfo("lob is deleted with db "+ self.name) | |||
|         if "file" in self.conf["artifact"]: | |||
|             self.m.logInfo("rm files in "+ self.name) | |||
|         self.m.setMsg("checkInstance for " + self.name + " is OK") | |||
|         self.m.logDebug(verify, "--- " + str(inspect.currentframe().f_code.co_name) + "() finished at " + datetime.now().strftime("%Y%m%d_%H%M%S") + " for " + str(self.name).upper()) | |||
| 
 | |||
|     def load_TcData(self): | |||
|         job = ulrich.program.Job.getInstance() | |||
|         verify = -1+job.getDebugLevel(self.name) | |||
|         self.m.logDebug(verify, "--- " + str(inspect.currentframe().f_code.co_name) + "() started at " + datetime.now().strftime("%Y%m%d_%H%M%S") + " for " + str(self.name).upper()) | |||
|         if "testdata" in self.conf: | |||
|             if self.conf["testdata"] == "db": | |||
|                 self.m.logInfo("insert db-content " + self.name) | |||
|             self.m.setMsg("data loaded for " + self.name + " is OK") | |||
|         self.m.logDebug(verify, "--- " + str(inspect.currentframe().f_code.co_name) + "() finished at " + datetime.now().strftime("%Y%m%d_%H%M%S") + " for " + str(self.name).upper()) | |||
| 
 | |||
|     def read_TcData(self): | |||
|         job = ulrich.program.Job.getInstance() | |||
|         verify = -1+job.getDebugLevel(self.name) | |||
|         self.m.logDebug(verify, "--- " + str(inspect.currentframe().f_code.co_name) + "() started at " + datetime.now().strftime("%Y%m%d_%H%M%S") + " for " + str(self.name).upper()) | |||
|         if "db" in self.conf["artifact"]: | |||
|             self.m.logInfo("select db-content "+ self.name) | |||
|         if "lob" in self.conf["artifact"]: | |||
|             self.m.logInfo("check lob if is deleted with db "+ self.name) | |||
|         self.m.setMsg("checkInstance for " + self.name + " is OK") | |||
|         self.m.logDebug(verify, "--- " + str(inspect.currentframe().f_code.co_name) + "() finished at " + datetime.now().strftime("%Y%m%d_%H%M%S") + " for " + str(self.name).upper()) | |||
| 
 | |||
|     def test_system(self): | |||
|         """ | |||
| 
 | |||
|         :return: | |||
|         """ | |||
|         pass | |||
| 
 | |||
|     def spiele_ein(self): | |||
|         pass | |||
|     def erzeuge_Anfrage(self): | |||
|         pass | |||
|     def sende_Anfrage(self, testdata): | |||
|         pass | |||
|     def lese_Antwort(self): | |||
|         pass | |||
| 
 | |||
|     def finish_Testcase(self): | |||
|         """ | |||
|         initialization-routine for finish-step | |||
|         :return: | |||
|         """ | |||
|         job = ulrich.program.Job.getInstance() | |||
|         verify = -1+job.getDebugLevel(self.name) | |||
|         self.m.logInfo("--- " + str(inspect.currentframe().f_code.co_name) + "() started at " + datetime.now().strftime("%Y%m%d_%H%M%S") + " for " + str(self.name).upper()) | |||
|         self.m.logInfo("something in "+ self.name) | |||
|         self.m.setMsg("checkInstance for " + self.name + " is OK") | |||
|         self.m.logInfo("--- " + str(inspect.currentframe().f_code.co_name) + "() finished at " + datetime.now().strftime("%Y%m%d_%H%M%S") + " for " + str(self.name).upper()) | |||
| 
 | |||
|     def collect_system(self): | |||
|         """ | |||
|         After the test the test data of each component should be selected again - to get the post-condition. | |||
|         In each component is configured how these data can be collected. | |||
|         In this phase the collected data have to be transformed to comparable files. | |||
|         :return: | |||
|         """ | |||
|         pass | |||
| 
 | |||
|     def collect_TcArtifact(self): | |||
|         """ | |||
|         collects the artifacts from the test-system. | |||
|         the result is written as original in subfolder {tcorigin} | |||
|         post: a further contact zo the test-system is not necessary | |||
|         :return: | |||
|         """ | |||
|         job = ulrich.program.Job.getInstance() | |||
|         verify = job.getDebugLevel(self.name) | |||
|         if "log" in self.conf["artifact"]: | |||
|             self.m.logInfo("get files in for "+ self.name + " in " + self.conf["artifact"]["log"]["path"]) | |||
|         if "db" in self.conf["artifact"]: | |||
|             self.m.logInfo("select db-content "+ self.name) | |||
|         if "lob" in self.conf["artifact"]: | |||
|             pass # after selection get file from db | |||
|         if "file" in self.conf["artifact"]: | |||
|             self.m.logInfo("get files in for "+ self.name + " in " + self.conf["artifact"]["file"]["path"]) | |||
| 
 | |||
|         self.m.debug(verify, "--- " + str(inspect.currentframe().f_code.co_name) + "() " + str(self.name)) | |||
| 
 | |||
|     def split_TcResult(self): | |||
|         """ | |||
|         transforms the result from subfolder {tcorigin}. | |||
|         the result is written as utf-8-readable parts in subfolder {tcparts} | |||
|         :return: | |||
|         """ | |||
|         job = ulrich.program.Job.getInstance() | |||
|         verify = job.getDebugLevel(self.name) | |||
|         self.m.debug(verify, "--- " + str(inspect.currentframe().f_code.co_name) + "() " + str(self.name)) | |||
|         if "log" in self.conf["artifact"]: | |||
|             pass # | |||
|         if "db" in self.conf["artifact"]: | |||
|             pass # stored in table | |||
|         if "lob" in self.conf["artifact"]: | |||
|             self.m.logInfo("move file from db "+ self.name) | |||
|             self.m.logInfo("tidy files in for " + self.name + " in " + self.conf["artifact"]["lob"]["format"]) | |||
|         if "file" in self.conf["artifact"]: | |||
|             self.m.logInfo("tidy files in for "+ self.name + " in " + self.conf["artifact"]["file"]["format"]) | |||
| 
 | |||
|     def fix_TcResult(self): | |||
|         """ | |||
|         fixes the result which is collected and transformed from the test-system. | |||
|         the result is written in comparable form in folder {tcresult} | |||
|         with the identifiable name - like in target | |||
|         :return: | |||
|         """ | |||
|         job = ulrich.program.Job.getInstance() | |||
|         verify = job.getDebugLevel(self.name) | |||
|         self.m.debug(verify, "--- " + str(inspect.currentframe().f_code.co_name) + "() " + str(self.name)) | |||
| 
 | |||
|     def compare_results(self): | |||
|         """ | |||
|         to compare the actual result with the target result has three steps: | |||
|         1 matching each element so you get a comparable pair | |||
|         2 comparing this pair so maybe you get differences | |||
|         3 rating the difference if this can be accepted | |||
|         :return: | |||
|         """ | |||
|         pass | |||
| 
 | |||
|     def collect_TcResult(self): | |||
|         """ | |||
|         collects the result from the folder {tcresult}. | |||
|         the content is stored intern for comparison | |||
|         :return: | |||
|         """ | |||
|         job = ulrich.program.Job.getInstance() | |||
|         verify = job.getDebugLevel(self.name) | |||
|         self.m.logInfo("get files in for " + self.name + " in tcresult ") | |||
|         self.m.debug(verify, "--- " + str(inspect.currentframe().f_code.co_name) + "() " + str(self.name)) | |||
| 
 | |||
|     def collect_Target(self): | |||
|         """ | |||
|         pre: only for components which be collected at the end of the test-set | |||
|         collects the result from the folder {rsresult}. | |||
|         post: a further contact zo the test-system is not necessary | |||
|         :return: | |||
|         """ | |||
|         job = ulrich.program.Job.getInstance() | |||
|         verify = job.getDebugLevel(self.name) | |||
|         self.m.debug(verify, "--- " + str(inspect.currentframe().f_code.co_name) + "() " + str(self.name)) | |||
| 
 | |||
|     def compare_TcResults(self): | |||
|         """ | |||
|         compares the result with the target | |||
|         (1) the elements of both sides are assigned | |||
|         [2) looks for differences in assigned pairs | |||
|         (3) try to accept the difference with inherent rules | |||
|         (4) writes the result of comparison as html in folder {diff*} | |||
|         (5) the summary result is returned | |||
|         :return: | |||
|         """ | |||
|         pass | |||
| 
 | |||
|     def getHitscore(self, typ, rs, tg): | |||
|         """ | |||
|         calculates the difference between the given elements. | |||
|         the score is a number [00000-99999] with prefix h_ - 00000 is the best, 99999 the worst | |||
|         :param typ: | |||
|         :param rs: | |||
|         :param tg: | |||
|         :return: | |||
|         """ | |||
|     def report_TcResults(self): | |||
|         """ | |||
|         reports the result-code | |||
|         :return: | |||
|         """ | |||
|         pass | |||
| 
 | |||
|     def finish_Testset(self): | |||
|         pass | |||
| 
 | |||
|     def collect_TsArtifact(self): | |||
|         """ | |||
|         collects the artifacts from the test-system. | |||
|         the result is written as original in subfolder {tsorigin} | |||
|         :return: | |||
|         """ | |||
|         pass | |||
|     def split_TsResult(self): | |||
|         """ | |||
|         transforms the result which is collected from the test-system. | |||
|         the result is written as utf-8-readable parts in the specific subfolder {tcparts} | |||
|         the relevant testcases will be called | |||
|         :return: | |||
|         """ | |||
|         job = ulrich.program.Job.getInstance() | |||
|         verify = job.getDebugLevel(self.name) | |||
|         self.m.debug(verify, "--- " + str(inspect.currentframe().f_code.co_name) + "() " + str(self.name)) | |||
|         # for tc in testcases: | |||
|         #   self.fix_TcResult(self) | |||
| 
 | |||
|     def compare_TsResults(self): | |||
|         """ | |||
|         controles the comparison the result with the target | |||
|         :return: | |||
|         """ | |||
|         job = ulrich.program.Job.getInstance() | |||
|         verify = job.getDebugLevel(self.name) | |||
|         self.m.debug(verify, "--- " + str(inspect.currentframe().f_code.co_name) + "() " + str(self.name)) | |||
|         # for tc in testcases: | |||
|         #    self.collect_TcResult | |||
|         #    self.collect_Target | |||
|         #    self.compare_TcResults | |||
| 
 | |||
|     def report_TsResults(self): | |||
|         """ | |||
|         (1.2) extraction of diff-files (only not accepted differences) as html-file in test-set - result-report - | |||
|         (2.3) visualization of final result-code of each component and each testcase in test-set - result-report - | |||
|         (2.4) visualization of statistical result-codes of each component and each test-set in test-context - result-report - | |||
|         :return: | |||
|         """ | |||
|         job = ulrich.program.Job.getInstance() | |||
|         verify = job.getDebugLevel(self.name) | |||
|         self.m.debug(verify, "--- " + str(inspect.currentframe().f_code.co_name) + "() " + str(self.name)) | |||
|         reportheader = '<head>' | |||
|         reportbody = '<body>' | |||
|         testreport = "" | |||
|         # if job.par.context == "tset": | |||
|         # for tc in testcases: | |||
|         #   header = utils.report_tool.getTcHeader() | |||
|         #   body = utils.report_tool.getTcExtraction() | |||
|         # if job.par.context == "tcontext": | |||
|         # for ts in testsets: | |||
|         reportheader = reportheader +'<\head>' | |||
|         reportbody = reportbody + '<\body>' | |||
|         testreport  = reportheader + reportbody | |||
|         return testreport | |||
| 
 | |||
|     def report_result(self): | |||
|         """ | |||
|         When you finish your test run you have to report the result for your customer. | |||
|         1 Your testers have recherche the results which are not acceptable. | |||
|         They need detailed information of all test results in order to proof if the difference has their cause | |||
|         in test-technicals or in system-technicals. They should be able to declare the cause. | |||
|         2 Your testmanager wants to know what is done - the percentage of the necessary test metrik and the status of each test - | |||
|         and which principle faults are found and which cause the faults have. | |||
|         3 Your projectmanager wants to know if the system is working correct - the percentage of the necessary test metrik | |||
|         and founded system errors. | |||
|         :return: | |||
|         """ | |||
|         pass | |||
| 
 | |||
|     def maintain_tests(self): | |||
|         """ | |||
| 
 | |||
|         :return: | |||
|         """ | |||
|         pass | |||
| 
 | |||
|     def declare_Target(self): | |||
|         job = ulrich.program.Job.getInstance() | |||
|         verify = -1+job.getDebugLevel(self.name) | |||
|         self.m.logInfo("--- " + str(inspect.currentframe().f_code.co_name) + "() started at " + datetime.now().strftime("%Y%m%d_%H%M%S") + " for " + str(self.name).upper()) | |||
|         self.m.logInfo("something in "+ self.name) | |||
|         self.m.setMsg("checkInstance for " + self.name + " is OK") | |||
|         self.m.logInfo("--- " + str(inspect.currentframe().f_code.co_name) + "() finished at " + datetime.now().strftime("%Y%m%d_%H%M%S") + " for " + str(self.name).upper()) | |||
| 
 | |||
|     def catalog_tests(self): | |||
|         """ | |||
|         Its not only a nice-to-have to know which tests are exactly running and which special cases they tests. | |||
|         Each test running in a special context a special case. Each of such cases are defined by some attributes. | |||
|         But often nobody knows in which testcases these attributes are tested. If you want to proof your test metrik | |||
|         for some very special cases a database of these attributes can be very helpful! | |||
|         Otherwise you must specify always new test cases for a correction of such special case, | |||
|         the existent test cases must be found afterwards and must be correct in their expectation. | |||
|         :return: | |||
|         """ | |||
|         pass | |||
| @ -0,0 +1,17 @@ | |||
| # Example af a component with | |||
| # # one instance -> connection | |||
| # # mo subcomponents | |||
| # # artifact-tyoe db -> precondition, load testdata, postcondition | |||
| conf: | |||
|   instance: | |||
|     count: 1 | |||
|   components: none | |||
|   function: | |||
|     check_environment: "todo" | |||
|     init_testcase: "todo"  # -> precondition, load testdata | |||
|     finish_testcase: "todo" # -> postcondition, check data | |||
|   artifact: | |||
|     db: | |||
|       reset:  testcase | |||
|   checks: | |||
|     type: systemctl | |||
| @ -0,0 +1,34 @@ | |||
| # | |||
| # -------------------------------------------------------- | |||
| """ | |||
| When the test system is installed - especially in a continous pipeline - you dont know which versions are | |||
| installed and if each instance is running. In order to know these fundamental points it should be checked. | |||
| The result could be inserted into a database so you can get an overview over all test environments. | |||
| """ | |||
| 
 | |||
| class SystemMonitor: | |||
| 
 | |||
|     def check_Instance(self): | |||
|         """ | |||
|         checks system-instances and writes it into the parameter-file | |||
|         """ | |||
|         job = ulrich.program.Job.getInstance() | |||
|         verify = -1 + job.getDebugLevel(self.name) | |||
|         self.m.logInfo("--- " + str(inspect.currentframe().f_code.co_name) + "() started at " + datetime.now().strftime( | |||
|             "%Y%m%d_%H%M%S") + " for " + str(self.name).upper()) | |||
|         for c in self.confs["components"].keys(): | |||
|             if self.confs["components"][c] == "none": | |||
|                 pass | |||
|             elif self.confs["components"][c]["relationtyp"] == "call": | |||
|                 self.m.logInfo("check connection from " + self.name + " to " + c) | |||
|             elif self.confs["components"][c]["relationtyp"] == "called": | |||
|                 self.m.logInfo("check connection from " + c + " to " + self.name) | |||
|             elif self.confs["components"][c]["relationtyp"] == "queue": | |||
|                 self.m.logInfo("check queue from " + self.name + " to " + c) | |||
|         self.m.setMsg("checkInstance for " + self.name + " is OK") | |||
|         self.m.logInfo("--- " + str(inspect.currentframe().f_code.co_name) + "() finished at " + datetime.now().strftime( | |||
|             "%Y%m%d_%H%M%S") + " for " + str(self.name).upper()) | |||
| 
 | |||
| 
 | |||
|     def restart_Instance(self): | |||
|         pass | |||
| @ -0,0 +1,32 @@ | |||
| # Example af a component with | |||
| # # more instance -> connection | |||
| # # some subcomponents | |||
| # # artifact-tyoe log | |||
| conf: | |||
|   instance: | |||
|     count: 2                     # count of instances | |||
|     single: n | |||
|   components: | |||
|     testA1: | |||
|       relationtyp: call            # call|called|queue | |||
|       conffile: "{dompath}/config/dbconn.xml" | |||
|       filetyp:  xml | |||
|       ippattern: "<second>.*?<ip>(.*?)</ip>" | |||
|       hostpattern: "<second>.*?<hostname>(.*?)</hostname>" | |||
|     testA2: | |||
|       relationtyp: call          # call : is called by this comp | |||
|       conffile: "{dompath}/config/settings.xml" | |||
|       filetyp:  xml | |||
|       urlpattern: "<first>.*?<ulr>(.*?)</url>" | |||
|   function: | |||
|     check_environment: "todo" | |||
|     init_testcase: "todo" | |||
|     finish_testcase: "todo" | |||
|   artifact: | |||
|     log:    # log|db|file|lob | |||
|       path: "{dompath}/log/debug.log" | |||
|       rotate: jmx | |||
|       reset:  testcase | |||
|       oldfile: "{dompath}/log/debug_{timepattern}.log" | |||
| 
 | |||
| 
 | |||
| @ -0,0 +1,7 @@ | |||
| import components.component | |||
| 
 | |||
| class Testa(components.component.Component): | |||
|     def __init__(self): | |||
|         print('init Testa') | |||
| 
 | |||
| 
 | |||
| @ -0,0 +1,24 @@ | |||
| # Example af a component with | |||
| # # one instance -> connection | |||
| # # mo subcomponents | |||
| # # artifact-tyoe db -> precondition, load testdata, postcondition | |||
| conf: | |||
|   instance: | |||
|     count: 1 | |||
|     single: y | |||
|   components: | |||
|     testa11: | |||
|       relationtyp: a  # these attributes can be checked in statical way if connection is correctly set | |||
|       conffile: "{dompath}/config/dbconn.xml" | |||
|       filetyp:  xml | |||
|       ippattern: "<second>.*?<ip>(.*?)</ip>" | |||
|       hostpattern: "<second>.*?<hostname>(.*?)</hostname>" | |||
|   function: | |||
|     check_environment: "todo" | |||
|     init_testcase: "todo"  # -> precondition, load testdata | |||
|     finish_testcase: "todo" # -> postcondition, check data | |||
|   artifact: | |||
|     db: | |||
|       reset:  testset | |||
|   testdata: db  # | |||
| 
 | |||
| @ -0,0 +1,193 @@ | |||
| # Example of a data-structure with | |||
| # # different count of tables, id-fields | |||
| testa1:      # database | |||
|   immo:      # schema | |||
|     lofts:   # table | |||
|       character: inventory | |||
|       fields: | |||
|       - street | |||
|       - city | |||
|       - zip | |||
|       - state | |||
|       - beds | |||
|       - baths | |||
|       - sqft | |||
|       - type | |||
|       - price | |||
|       - latitude | |||
|       - longitude | |||
|       data: | |||
|         city: | |||
|           id: b_2 | |||
|           acceptance: norm | |||
|           type: string | |||
|           nullable: n | |||
|         zip: | |||
|           id: b_1 | |||
|           acceptance: norm | |||
|           type: string | |||
|           nullable: n | |||
|         state: | |||
|           id: n | |||
|           acceptance: norm | |||
|           type: string | |||
|           nullable: n | |||
|         beds: | |||
|           id: n | |||
|           acceptance: norm | |||
|           type: int | |||
|           nullable: y | |||
|         baths: | |||
|           id: n | |||
|           acceptance: norm | |||
|           type: int | |||
|           nullable: y | |||
|         sqft: | |||
|           id: n | |||
|           acceptance: norm | |||
|           type: double | |||
|           nullable: y | |||
|         type: | |||
|           id: n | |||
|           acceptance: norm | |||
|           type: string | |||
|           nullable: y | |||
|         price: | |||
|           id: n | |||
|           acceptance: norm | |||
|           type: double | |||
|           nullable: y | |||
|         latitude: | |||
|           id: n | |||
|           acceptance: norm | |||
|           type: float | |||
|           nullable: y | |||
|         longitude: | |||
|           id: n | |||
|           acceptance: norm | |||
|           type: float | |||
|           nullable: y | |||
|   user: | |||
|     name: | |||
|       character: inventory | |||
|       fields: | |||
|       - Username | |||
|       - Identifier | |||
|       - First_name | |||
|       - Last_name | |||
|       data: | |||
|         Username: | |||
|           id: b_1 | |||
|           acceptance: norm | |||
|           type: string | |||
|           nullable: y | |||
|         Identifier: | |||
|           id: t_1 | |||
|           acceptance: exist | |||
|           type: int | |||
|           nullable: y | |||
|         First_name: | |||
|           id: n | |||
|           acceptance: norm | |||
|           type: string | |||
|           nullable: y | |||
|         Last_name: | |||
|           id: n | |||
|           acceptance: norm | |||
|           type: string | |||
|           nullable: y | |||
|     mail: | |||
|       character: inventory | |||
|       fields: | |||
|       - Email | |||
|       - Identifier | |||
|       - First_name | |||
|       - Last_name | |||
|       data: | |||
|         Email: | |||
|           id: b_1 | |||
|           acceptance: norm | |||
|           type: string | |||
|           nullable: y | |||
|         Identifier: | |||
|           id: t_1 | |||
|           acceptance: exist | |||
|           type: int | |||
|           nullable: n | |||
|         First_name: | |||
|           id: n | |||
|           acceptance: norm | |||
|           type: string | |||
|           nullable: y | |||
|         Last_name: | |||
|           id: n | |||
|           acceptance: norm | |||
|           type: string | |||
|           nullable: y | |||
|     action: | |||
|       character: transaction | |||
|       fields: | |||
|       - id | |||
|       - Identifier | |||
|       - login_ok | |||
|       - login_time | |||
|       - session_state | |||
|       - end_time | |||
|       - cnt_transactions | |||
|       data: | |||
|         id: | |||
|           id: t_1 | |||
|           acceptance: exist | |||
|           type: int | |||
|           nullable: n | |||
|         Identifier: | |||
|           id: b_1 | |||
|           acceptance: norm | |||
|           type: int | |||
|           nullable: n | |||
|         login_ok: | |||
|         login_time: | |||
|         session_state: | |||
|         end_time: | |||
|         cnt_transactions: | |||
|   biblio: | |||
|     books: | |||
|       character: inventory | |||
|       fields: | |||
|         - id | |||
|         - title | |||
|         - autor | |||
|         - library | |||
|         - subject | |||
|         - description | |||
|       data: | |||
|         id: | |||
|           id: t_1 | |||
|           acceptance: norm | |||
|           type: int | |||
|           nullable: n | |||
|         title: | |||
|           id: b_1 | |||
|           acceptance: norm | |||
|           type: string | |||
|           nullable: n | |||
|         autor: | |||
|           id: b_2 | |||
|           acceptance: norm | |||
|           type: string | |||
|           nullable: n | |||
|         library: | |||
|           id: n | |||
|           acceptance: norm | |||
|           type: string | |||
|           nullable: y | |||
|         subject: | |||
|           id: n | |||
|           acceptance: norm | |||
|           type: string | |||
|           nullable: y | |||
|         description: | |||
|           id: n | |||
|           acceptance: exist | |||
|           type: clob | |||
|           nullable: y | |||
| @ -0,0 +1,7 @@ | |||
| import components.component | |||
| 
 | |||
| class Testa1(components.component.Component): | |||
|     def __init__(self): | |||
|         print('init Testa1') | |||
| 
 | |||
| 
 | |||
| @ -0,0 +1,16 @@ | |||
| # Example af a component with | |||
| # # one instance -> connection | |||
| # # mo subcomponents | |||
| # # artifact-tyoe db -> precondition, load testdata, postcondition | |||
| conf: | |||
|   instance: | |||
|     count: 1 | |||
|     single: y | |||
|   components: | |||
|     none: none | |||
|   function: | |||
|     finish_testcase: "todo" # -> postcondition, check data | |||
|   artifact: | |||
|     lob: | |||
|       reset:  none | |||
|       path:   "testa1:biblio:books.description" | |||
| @ -0,0 +1,187 @@ | |||
| # Example of a data-structure with | |||
| # # different count of tables, id-fields | |||
| testa1:      # database | |||
|   immo:      # schema | |||
|     lofts:   # table | |||
|       character: inventory | |||
|       fields: | |||
|       - street | |||
|       - city | |||
|       - zip | |||
|       - state | |||
|       - beds | |||
|       - baths | |||
|       - sqft | |||
|       - type | |||
|       - price | |||
|       - latitude | |||
|       - longitude | |||
|       data: | |||
|         city: | |||
|           id: b_2 | |||
|           acceptance: norm | |||
|           type: string | |||
|           nullable: n | |||
|         zip: | |||
|           id: b_1 | |||
|           acceptance: norm | |||
|           type: string | |||
|           nullable: n | |||
|         state: | |||
|           id: n | |||
|           acceptance: norm | |||
|           type: string | |||
|           nullable: n | |||
|         beds: | |||
|           id: n | |||
|           acceptance: norm | |||
|           type: int | |||
|           nullable: y | |||
|         baths: | |||
|           id: n | |||
|           acceptance: norm | |||
|           type: int | |||
|           nullable: y | |||
|         sqft: | |||
|           id: n | |||
|           acceptance: norm | |||
|           type: double | |||
|           nullable: y | |||
|         type: | |||
|           id: n | |||
|           acceptance: norm | |||
|           type: string | |||
|           nullable: y | |||
|         price: | |||
|           id: n | |||
|           acceptance: norm | |||
|           type: double | |||
|           nullable: y | |||
|         latitude: | |||
|           id: n | |||
|           acceptance: norm | |||
|           type: float | |||
|           nullable: y | |||
|         longitude: | |||
|           id: n | |||
|           acceptance: norm | |||
|           type: float | |||
|           nullable: y | |||
|   user: | |||
|     name: | |||
|       character: inventory | |||
|       fields: | |||
|       - Username | |||
|       - Identifier | |||
|       - First_name | |||
|       - Last_name | |||
|       data: | |||
|         Username: | |||
|           id: b_1 | |||
|           acceptance: norm | |||
|           type: string | |||
|           nullable: y | |||
|         Identifier: | |||
|           id: t_1 | |||
|           acceptance: exist | |||
|           type: int | |||
|           nullable: y | |||
|         First_name: | |||
|           id: n | |||
|           acceptance: norm | |||
|           type: string | |||
|           nullable: y | |||
|         Last_name: | |||
|           id: n | |||
|           acceptance: norm | |||
|           type: string | |||
|           nullable: y | |||
|     mail: | |||
|       character: inventory | |||
|       fields: | |||
|       - Email | |||
|       - Identifier | |||
|       - First_name | |||
|       - Last_name | |||
|       data: | |||
|         Email: | |||
|           id: b_1 | |||
|           acceptance: norm | |||
|           type: string | |||
|           nullable: y | |||
|         Identifier: | |||
|           id: t_1 | |||
|           acceptance: exist | |||
|           type: int | |||
|           nullable: n | |||
|         First_name: | |||
|           id: n | |||
|           acceptance: norm | |||
|           type: string | |||
|           nullable: y | |||
|         Last_name: | |||
|           id: n | |||
|           acceptance: norm | |||
|           type: string | |||
|           nullable: y | |||
|     action: | |||
|       character: transaction | |||
|       fields: | |||
|       - id | |||
|       - Identifier | |||
|       - login_ok | |||
|       - login_time | |||
|       - session_state | |||
|       - end_time | |||
|       - cnt_transactions | |||
|       data: | |||
|         id: | |||
|           id: t_1 | |||
|           acceptance: exist | |||
|           type: int | |||
|           nullable: n | |||
|         Identifier: | |||
|           id: b_1 | |||
|           acceptance: norm | |||
|           type: int | |||
|           nullable: n | |||
|         login_ok: | |||
|         login_time: | |||
|         session_state: | |||
|         end_time: | |||
|         cnt_transactions: | |||
|   biblio: | |||
|     books: | |||
|       character: inventory | |||
|       fields: | |||
|         - id | |||
|         - title | |||
|         - autor | |||
|         - library | |||
|         - subject | |||
|       data: | |||
|         id: | |||
|           id: t_1 | |||
|           acceptance: norm | |||
|           type: int | |||
|           nullable: n | |||
|         title: | |||
|           id: b_1 | |||
|           acceptance: norm | |||
|           type: string | |||
|           nullable: n | |||
|         autor: | |||
|           id: b_2 | |||
|           acceptance: norm | |||
|           type: string | |||
|           nullable: n | |||
|         library: | |||
|           id: n | |||
|           acceptance: norm | |||
|           type: string | |||
|           nullable: y | |||
|         subject: | |||
|           id: n | |||
|           acceptance: norm | |||
|           type: string | |||
|           nullable: y | |||
| @ -0,0 +1,7 @@ | |||
| import components.component | |||
| 
 | |||
| class Testa11(components.component.Component): | |||
|     def __init__(self): | |||
|         print('init Testa1') | |||
| 
 | |||
| 
 | |||
| @ -0,0 +1,24 @@ | |||
| # Example af a component like a sub-app with | |||
| # # one interface - | |||
| # # one subcomponents | |||
| # # artifact-tyoe log | |||
| conf: | |||
|   instance: | |||
|     count: 1 | |||
|     single: n | |||
|   components: | |||
|     testa21: | |||
|       relationtyp: call | |||
|       conffile: "{dompath}/config/dbconn.xml" | |||
|       filetyp:  xml | |||
|       ippattern: "<second>.*?<ip>(.*?)</ip>" | |||
|       hostpattern: "<second>.*?<hostname>(.*?)</hostname>" | |||
|   function: | |||
|     check_environment: "todo" | |||
|     init_testcase: "todo" | |||
|     finish_testcase: "todo" | |||
|   artifact: | |||
|     lob: | |||
|       path: "testa" | |||
|       rotate: jmx | |||
|       reset:  testcase | |||
| @ -0,0 +1,7 @@ | |||
| import components.component | |||
| 
 | |||
| class Testa2(components.component.Component): | |||
|     def __init__(self): | |||
|         print('init Testa1') | |||
| 
 | |||
| 
 | |||
| @ -0,0 +1,19 @@ | |||
| # Example af a component like a sub-app with | |||
| # # no subcomponents | |||
| # # artifact-tyoe log | |||
| conf: | |||
|   instance: | |||
|     count: 1 | |||
|     single: n | |||
|   components: | |||
|     none: none | |||
|   function: | |||
|     check_environment: "todo" | |||
|     init_testcase: "todo" | |||
|     finish_testcase: "todo" | |||
|   artifact: | |||
|     file: | |||
|       path: "{dompath}/log/debug.log" | |||
|       reset:  testcase | |||
|       format: xml | |||
|       match: lines # lines|tree | |||
| @ -0,0 +1,5 @@ | |||
| import components.component | |||
| 
 | |||
| class Testa21(components.component.Component): | |||
|     def __init__(self): | |||
|         print('init Testa1') | |||
| @ -0,0 +1,24 @@ | |||
| # Example af a component like a main app with | |||
| # # one instance -> connection | |||
| # # one subcomponents | |||
| # # artifact-tyoe log | |||
| conf: | |||
|   instance: | |||
|     count: 1 | |||
|     single: y | |||
|   components: | |||
|     testB1: | |||
|       relationtyp: db | |||
|       conffile: "{dompath}/config/dbconn.xml" | |||
|       filetyp:  xml | |||
|       ippattern: "<second>.*?<ip>(.*?)</ip>" | |||
|       hostpattern: "<second>.*?<hostname>(.*?)</hostname>" | |||
|   function: | |||
|     check_environment: "todo" | |||
|     init_testcase: "todo" | |||
|     finish_testcase: "todo" | |||
|   artifact: | |||
|     log: | |||
|       path: "{dompath}/log/debug.log" | |||
|       rotate: jmx | |||
|       reset:  testcase | |||
| @ -0,0 +1,5 @@ | |||
| import components.component | |||
| 
 | |||
| class Testb(components.component.Component): | |||
|     def __init__(self): | |||
|         print('init Testb') | |||
| @ -0,0 +1,17 @@ | |||
| # Example af a component with | |||
| # # one instance -> connection | |||
| # # mo subcomponents | |||
| # # artifact-tyoe db -> precondition, load testdata, postcondition | |||
| conf: | |||
|   instance: | |||
|     count: 1 | |||
|     single: y | |||
|   components: | |||
|     none: none | |||
|   function: | |||
|     check_environment: "todo" | |||
|     init_testcase: "todo"  # -> precondition, load testdata | |||
|     finish_testcase: "todo" # -> postcondition, check data | |||
|   artifact: | |||
|     db: | |||
|       reset:  testset | |||
| @ -0,0 +1,5 @@ | |||
| import components.component | |||
| 
 | |||
| class Testb1(components.component.Component): | |||
|     def __init__(self): | |||
|         print('init Testa1') | |||
| @ -0,0 +1,28 @@ | |||
| # This is a sample Python script. | |||
| import sys# | |||
| # import jsonpickle # pip install jsonpickle | |||
| import yaml # pip install pyyaml | |||
| import ulrich.program as program | |||
| from ulrich.componentHandling import ComponentManager | |||
| import ulrich.message as message | |||
| # Press Umschalt+F10 to execute it or replace it with your code. | |||
| # Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings. | |||
| 
 | |||
| 
 | |||
| 
 | |||
| 
 | |||
| # Press the green button in the gutter to run the script. | |||
| if __name__ == '__main__': | |||
|     x = program.Job("check_environment") | |||
|     #m = message.Message(3) | |||
|     #m.closeMessage() | |||
|     x.startJob() | |||
|     x.m.logInfo("hier eine LogInfo") | |||
|     x.m.logDebug("hier eine DbugMeldung") | |||
|     x.m.logDebug(str(vars(x.par)) + "\n" + str(vars(x.conf))) | |||
|     cm = ComponentManager() | |||
|     if x.m.isRc("fatal"): | |||
|         x.stopJob() | |||
|         exit(x.m.rc * (-1) + 3) | |||
|     x.stopJob() | |||
| # See PyCharm help at https://www.jetbrains.com/help/pycharm/ | |||
| @ -0,0 +1,29 @@ | |||
| # This is a sample Python script. | |||
| import sys# | |||
| # import jsonpickle # pip install jsonpickle | |||
| import yaml # pip install pyyaml | |||
| import ulrich.program | |||
| from ulrich.componentHandling import ComponentManager | |||
| import ulrich.message | |||
| import utils.tdata_tool | |||
| 
 | |||
| PROGRAM_NAME = "finish_testcase" | |||
| 
 | |||
| if __name__ == '__main__': | |||
|     x = ulrich.program.Job(PROGRAM_NAME) | |||
|     x.startJob() | |||
|     x.m.logInfo("hier eine LogInfo") | |||
|     x.m.logDebug("hier eine DbugMeldung") | |||
|     x.m.logDebug(str(vars(x.par)) + "\n" + str(vars(x.conf))) | |||
|     if x.m.isRc("fatal"): | |||
|         print("fatal Error at begin") | |||
|         x.stopJob() | |||
|         exit(x.m.rc * (-1) + 3) | |||
|     # now in theory the program is runnable | |||
|     cm = ComponentManager() | |||
|     cm.initComponents() | |||
|     comps = cm.getComponents(PROGRAM_NAME) | |||
|     print("   relevant components for this job: " + str(comps)) | |||
|     tdata = utils.tdata_tool.getTestdata() | |||
|     x.stopJob() | |||
| # See PyCharm help at https://www.jetbrains.com/help/pycharm/ | |||
| @ -0,0 +1,28 @@ | |||
| # This is a sample Python script. | |||
| import sys# | |||
| # import jsonpickle # pip install jsonpickle | |||
| import yaml # pip install pyyaml | |||
| import ulrich.program as program | |||
| from ulrich.componentHandling import ComponentManager | |||
| import ulrich.message as message | |||
| # Press Umschalt+F10 to execute it or replace it with your code. | |||
| # Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings. | |||
| 
 | |||
| 
 | |||
| 
 | |||
| 
 | |||
| # Press the green button in the gutter to run the script. | |||
| if __name__ == '__main__': | |||
|     x = program.Job("check_environment") | |||
|     #m = message.Message(3) | |||
|     #m.closeMessage() | |||
|     x.startJob() | |||
|     x.m.logInfo("hier eine LogInfo") | |||
|     x.m.logDebug("hier eine DbugMeldung") | |||
|     x.m.logDebug(str(vars(x.par)) + "\n" + str(vars(x.conf))) | |||
|     cm = ComponentManager() | |||
|     if x.m.isRc("fatal"): | |||
|         x.stopJob() | |||
|         exit(x.m.rc * (-1) + 3) | |||
|     x.stopJob() | |||
| # See PyCharm help at https://www.jetbrains.com/help/pycharm/ | |||
| @ -0,0 +1,28 @@ | |||
| # This is a sample Python script. | |||
| import sys# | |||
| # import jsonpickle # pip install jsonpickle | |||
| import yaml # pip install pyyaml | |||
| import ulrich.program as program | |||
| from ulrich.componentHandling import ComponentManager | |||
| import ulrich.message as message | |||
| # Press Umschalt+F10 to execute it or replace it with your code. | |||
| # Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings. | |||
| 
 | |||
| 
 | |||
| 
 | |||
| 
 | |||
| # Press the green button in the gutter to run the script. | |||
| if __name__ == '__main__': | |||
|     x = program.Job("check_environment") | |||
|     #m = message.Message(3) | |||
|     #m.closeMessage() | |||
|     x.startJob() | |||
|     x.m.logInfo("hier eine LogInfo") | |||
|     x.m.logDebug("hier eine DbugMeldung") | |||
|     x.m.logDebug(str(vars(x.par)) + "\n" + str(vars(x.conf))) | |||
|     cm = ComponentManager() | |||
|     if x.m.isRc("fatal"): | |||
|         x.stopJob() | |||
|         exit(x.m.rc * (-1) + 3) | |||
|     x.stopJob() | |||
| # See PyCharm help at https://www.jetbrains.com/help/pycharm/ | |||
| @ -0,0 +1,29 @@ | |||
| # This is a sample Python script. | |||
| import sys# | |||
| # import jsonpickle # pip install jsonpickle | |||
| import yaml # pip install pyyaml | |||
| import ulrich.program | |||
| from ulrich.componentHandling import ComponentManager | |||
| import ulrich.message | |||
| import utils.tdata_tool | |||
| 
 | |||
| PROGRAM_NAME = "init_testset" | |||
| 
 | |||
| if __name__ == '__main__': | |||
|     x = ulrich.program.Job(PROGRAM_NAME) | |||
|     x.startJob() | |||
|     x.m.logInfo("hier eine LogInfo") | |||
|     x.m.logDebug("hier eine DbugMeldung") | |||
|     x.m.logDebug(str(vars(x.par)) + "\n" + str(vars(x.conf))) | |||
|     if x.m.isRc("fatal"): | |||
|         print("fatal Error at begin") | |||
|         x.stopJob() | |||
|         exit(x.m.rc * (-1) + 3) | |||
|     # now in theory the program is runnable | |||
|     cm = ComponentManager() | |||
|     cm.initComponents() | |||
|     comps = cm.getComponents(PROGRAM_NAME) | |||
|     print("   relevant components for this job: " + str(comps)) | |||
|     tdata = utils.tdata_tool.getTestdata() | |||
|     x.stopJob() | |||
| # See PyCharm help at https://www.jetbrains.com/help/pycharm/ | |||
| @ -0,0 +1 @@ | |||
| pyyaml | |||
| @ -0,0 +1,34 @@ | |||
| tools: | |||
|   connsrc: yml | |||
|   remotetyp: ssh | |||
| toolcls: | |||
|   pathTool: path_tool | |||
| paths: | |||
|   mode: "0o775" | |||
|   home: /home/ulrich/6_Projekte/Programme/pythonProject | |||
|   debugs: /home/ulrich/6_Projekte/Programme/pythonProject/test/log # for temporary debug-logs | |||
|   archiv: /home/ulrich/6_Projekte/Programme/pythonProject/test/lauf # the results of | |||
|   results: /home/ulrich/6_Projekte/Programme/pythonProject/test/target # the target results which a former result files | |||
|   program: /home/ulrich/6_Projekte/Programme/pythonProject # the programs with default configs | |||
|   environment: /home/ulrich/6_Projekte/Programme/pythonProject/test/environment # for config etc about the system under test | |||
|   release: /home/ulrich/6_Projekte/Programme/pythonProject/test/release # for configs about special releases | |||
|   testdata: /home/ulrich/6_Projekte/Programme/pythonProject/test/tdata # for configs about special releases | |||
| pattern: | |||
|   tctime: '\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}' | |||
|   tltime: '\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}' | |||
|   testcase: '.*?/' | |||
|   usecase: '.*?/' | |||
| typen: | |||
|   einzel: "Einzelfaelle separat" | |||
|   menge:  "alle zum Lauf einmal laden und auswerten" | |||
|   unit: | |||
|     text: "Units testen" | |||
|     todo: 1 | |||
| applicationen: | |||
|   TEST: | |||
|     - testA | |||
|     - testB | |||
| application: | |||
|   TEST: | |||
|     - testA | |||
|     - testB | |||
| @ -0,0 +1,7 @@ | |||
| comps: {} | |||
| par: | |||
|   application: TEST | |||
|   basedir: envbase | |||
|   environment: ENV01 | |||
|   parstring: python check_environment --application TEST --environment ENV01 | |||
|   program: check_environment | |||
| @ -0,0 +1,87 @@ | |||
| env: | |||
|   testa: | |||
|     instance: 2 | |||
|     inst1: | |||
|       ip:  "192.178.168.12" | |||
|       hostname: my-app-store-1 | |||
|       port:  54321 | |||
|       dompath:  /opt/app/testa | |||
|       domscript:  bin/manage.sh | |||
|       user:  testa | |||
|       password:  test_secure_a | |||
|       home:  /home/testa | |||
|     inst2: | |||
|       ip:  192.178.168.14 | |||
|       hostname:  my-app-store-2 | |||
|       port:  54321 | |||
|       dompath:  /opt/app/testa | |||
|       domscript:  bin/manage.sh | |||
|       user:  testa | |||
|       password:  test_secure_a | |||
|       home:  /home/testa | |||
|   testa1: | |||
|     instance: 1 | |||
|     inst1: | |||
|       ip:  192.178.168.12 | |||
|       hostname:  my-app-store-1 | |||
|       port:  54410 | |||
|       dompath:  /opt/app/testa01 | |||
|       domscript:  bin/manage.sh | |||
|       user:  testa | |||
|       password:  test_secure_a | |||
|       home:  /home/testa | |||
|   testa11: | |||
|     instance: 1 | |||
|     inst1: | |||
|       ip:  192.178.168.12 | |||
|       hostname:  my-app-store-1 | |||
|       port:  54410 | |||
|       dompath:  /opt/app/testa01 | |||
|       domscript:  bin/manage.sh | |||
|       user:  testa | |||
|       password:  test_secure_a | |||
|       home:  /home/testa | |||
|   testa2: | |||
|     instance: 1 | |||
|     inst1: | |||
|       ip:  192.178.168.12 | |||
|       hostname:  my-app-store-1 | |||
|       port:  54420 | |||
|       dompath:  /opt/app/testa02 | |||
|       domscript:  bin/manage.sh | |||
|       user:  testa | |||
|       password:  test_secure_a | |||
|       home:  /home/testa | |||
|   testa21: | |||
|     instance: 1 | |||
|     inst1: | |||
|       ip:  192.178.168.12 | |||
|       hostname:  my-app-store-1 | |||
|       port:  54420 | |||
|       dompath:  /opt/app/testa02 | |||
|       domscript:  bin/manage.sh | |||
|       user:  testa | |||
|       password:  test_secure_a | |||
|       home:  /home/testa | |||
|   testb: | |||
|     instance: 1 | |||
|     inst1: | |||
|       ip:  192.178.168.14 | |||
|       hostname:  my-app-store-2 | |||
|       port:  54500 | |||
|       dompath:  /opt/app/testb | |||
|       domscript:  bin/manage.sh | |||
|       user:  testb | |||
|       password:  test_secure_b | |||
|       home:  /home/testb | |||
|   testb1: | |||
|     instance: 1 | |||
|     inst1: | |||
|       ip:  192.178.168.14 | |||
|       hostname:  my-app-store-2 | |||
|       port:  54510 | |||
|       dompath:  /opt/app/testb01 | |||
|       domscript:  bin/manage.sh | |||
|       user:  testb | |||
|       password:  test_secure_b | |||
|       home:  /home/testb | |||
| @ -0,0 +1,43 @@ | |||
| comps: | |||
|   testa_02: | |||
|     conn: | |||
|       dompath: /opt/app/testa | |||
|       domscript: bin/manage.sh | |||
|       home: /home/testa | |||
|       hostname: my-app-store-1 | |||
|       ip: 192.178.168.12 | |||
|       password: test_secure_a | |||
|       port: 54321 | |||
|       user: testa | |||
|     function: | |||
|       check_environment: 'INFO: checkInstance for testa_02 is OK' | |||
|       finish_testcase: todo | |||
|       init_testcase: todo | |||
|   testb: | |||
|     conn: | |||
|       dompath: /opt/app/testb | |||
|       domscript: bin/manage.sh | |||
|       home: /home/testb | |||
|       hostname: my-app-store-2 | |||
|       ip: 192.178.168.14 | |||
|       password: test_secure_b | |||
|       port: 54500 | |||
|       user: testb | |||
|     function: | |||
|       check_environment: 'INFO: checkInstance for testb is OK' | |||
|       finish_testcase: todo | |||
|       init_testcase: todo | |||
| par: | |||
|   application: TEST | |||
|   basedir: tsbase | |||
|   environment: ENV01 | |||
|   parstring: python init_testset --application TEST --environment ENV01 --tsdir /home/ulrich/6_Projekte/Programme/pythonProject/test/lauf/V0.1/implement_2021-08-28_23-50-51 | |||
|     --tdtyp csv --tdsrc implement --tdname firstunit | |||
|   program: init_testset | |||
|   release: V0.1 | |||
|   tdname: firstunit | |||
|   tdsrc: implement | |||
|   tdtyp: csv | |||
|   tltime: 2021-08-28_23-50-51 | |||
|   tsdir: /home/ulrich/6_Projekte/Programme/pythonProject/test/lauf/V0.1/implement_2021-08-28_23-50-51 | |||
|   usecase: implement | |||
| @ -0,0 +1,28 @@ | |||
| import unittest | |||
| import utils.config_tool as t | |||
| from ulrich.program import Job | |||
| 
 | |||
| 
 | |||
| class MyTestCase(unittest.TestCase): | |||
|     def test_something(self): | |||
|         job = Job("unit") | |||
|         args = {"application": "TEST", "application": "ENV01", "modus": "unit", "loglevel": "debug", "tool": "config_tool", | |||
|                 "modus": "unit"} | |||
|         job.par.setParameterArgs(args) | |||
|         r = t.getConfigPath("tool", "path") | |||
|         print (r) | |||
|         self.assertEqual(r, "/home/ulrich/6_Projekte/Programme/pythonProject/utils/configs/path.yml") | |||
|         r = t.getConfigPath("comp", "TestA2") | |||
|         print (r) | |||
|         self.assertEqual(r, None) | |||
|         r = t.getConfigPath("comp", "testA2") | |||
|         print (r) | |||
|         r = t.getConfig("tool", "path") | |||
|         print (r) | |||
|         #r = t.getConfig("comp", "testA2") | |||
|         print("pattern " + r["pattern"]["log"]) | |||
|         print("pattern " + r["pattern"]["precond"]) | |||
| 
 | |||
| 
 | |||
| if __name__ == '__main__': | |||
|     unittest.main() | |||
| @ -0,0 +1,20 @@ | |||
| import unittest | |||
| import ulrich.program | |||
| import utils.conn_tool | |||
| 
 | |||
| class MyTestCase(unittest.TestCase): | |||
|     def test_something(self): | |||
|         print("# # # # tetsComponents # # # # #") | |||
|         job = ulrich.program.Job("unit") | |||
|         args = { "application" : "TEST" , "environment" : "ENV01", "modus" : "unit", "loglevel" : "debug", "tool" : "job_tool"} | |||
|         job.par.setParameterArgs(args) | |||
|         self.assertEqual(True, True) | |||
|         conn = utils.conn_tool.getConnection("testb", 1) | |||
|         print("test-conn " + str(conn)) | |||
|         conns = utils.conn_tool.getConnections("testb") | |||
|         print("test-conn " + str(conns)) | |||
|         conns = utils.conn_tool.getConnections("testa") | |||
|         print("test-conn " + str(conns)) | |||
| 
 | |||
| if __name__ == '__main__': | |||
|     unittest.main() | |||
| @ -0,0 +1,32 @@ | |||
| import unittest | |||
| import utils.file_tool as t | |||
| import utils.path_tool | |||
| import ulrich.program | |||
| 
 | |||
| 
 | |||
| class MyTestCase(unittest.TestCase): | |||
|         def test_getFiles(self): | |||
|                 job = ulrich.program.Job("unit") | |||
|                 args = {"application": "TEST", "application": "ENV01", "modus": "unit", "loglevel": "debug", "tool": "job_tool", | |||
|                         "modus": "unit"} | |||
|                 job.par.setParameterArgs(args) | |||
|                 r = t.getFiles(job.m, job.conf.confs.get("paths").get("program") + "/utils", "file_.*.py", None) | |||
|                 self.assertEqual((len(r) == 1), True) | |||
|                 r = t.getFiles(job.m, job.conf.confs.get("paths").get("program") + "/utils", "file__.*.py", None) | |||
|                 self.assertEqual((len(r) == 0), True) | |||
|                 r = t.getFiles(job.m, job.conf.confs.get("paths").get("program") + "/utils", ".*_tool.py", None) | |||
|                 self.assertEqual((len(r) > 2), True) | |||
|                 r = t.getFilesRec(job.m, job.conf.confs.get("paths").get("program"), ".*?file.*.py") | |||
|                 print (r) | |||
| 
 | |||
|         def test_pathTool(self): | |||
|                 job = ulrich.program.Job("unit") | |||
|                 args = {"application": "TEST", "application": "ENV01", "modus": "unit", "loglevel": "debug", "tool": "job_tool", | |||
|                         "modus": "unit"} | |||
|                 job.par.setParameterArgs(args) | |||
|                 self.assertEqual(utils.path_tool.generatePath("program", "komp", "testA", "CONFIG.yml"), | |||
|                                  "/home/ulrich/6_Projekte/PythonProject/komponents/testA/COFIG.yml") | |||
| 
 | |||
| 
 | |||
| if __name__ == '__main__': | |||
|     unittest.main() | |||
| @ -0,0 +1,35 @@ | |||
| import unittest | |||
| import os | |||
| from ulrich.program import Job | |||
| from ulrich.componentHandling import ComponentManager | |||
| 
 | |||
| class MyTestCase(unittest.TestCase): | |||
|     def test_parameter(self): | |||
|         job = Job("unit") | |||
|         args = { "application" : "TEST" , "environment" : "ENV01", "modus" : "unit", "loglevel" : "debug", "tool" : "job_tool"} | |||
|         job.par.setParameterArgs(args) | |||
|         self.assertEqual(job.hascomponente("TestA"), True) | |||
|         self.assertEqual(job.hasTool("TestA"), False) | |||
|         self.assertEqual(job.hasTool("job_tool"), True) | |||
|         self.assertEqual(job.getDebugLevel("file_tool"), 23) | |||
|         self.assertEqual(job.getDebugLevel("job_tool"), 23) | |||
|         args = { "application" : "TEST" , "environment" : "ENV01", "modus" : "unit", "loglevel" : "debug", | |||
|                  "tool" : "job_tool", "tsdir": "/home/ulrich/6_Projekte/Programme/pythonProject/test/lauf/V0.1/startjob/2021-08-21_18-ß2-01"} | |||
|         job.par.setParameterArgs(args) | |||
|     def test_components(self): | |||
|         print("# # # # tetsComponents # # # # #") | |||
|         job = Job.resetInstance("unit") | |||
|         args = { "application" : "TEST" , "environment" : "ENV01", "modus" : "unit", "loglevel" : "debug", "tool" : "job_tool"} | |||
|         job.par.setParameterArgs(args) | |||
|         cm = ComponentManager() | |||
|         cm.createComponents("testb", 0, "") | |||
|         cm.createComponents("testa", 1, "") | |||
| 
 | |||
|     def test_run(self): | |||
|         os.system("python /home/ulrich/6_Projekte/Programme/pythonProject/check_environment.py -a TEST -e ENV01") | |||
|         # os.system("python /home/ulrich/6_Projekte/Programme/pythonProject/init_testset.py -a TEST -e ENV01 " | |||
|         #    "-ts /home/ulrich/6_Projekte/Programme/pythonProject/test/lauf/V0.1/implement_2021-08-28_23-50-51 -dt csv -ds implement -dn firstunit") | |||
|         # os.system("python /home/ulrich/6_Projekte/Programme/pythonProject/init_testset.py") | |||
| 
 | |||
| if __name__ == '__main__': | |||
|     unittest.main() | |||
| @ -0,0 +1,12 @@ | |||
| import unittest | |||
| import utils.path_tool as path_tool | |||
| import ulrich.program as program | |||
| 
 | |||
| class MyTestCase(unittest.TestCase): | |||
|     def test_pathTool(self): | |||
|         x = program.Job("test:application=TEST:application=ENV01") | |||
|         self.assertEqual(path_tool.generatePath("program", "komp", "testA", "CONFIG.yml"), "/home/ulrich/6_Projekte/PythonProject/komponents/testA/COFIG.yml") | |||
| 
 | |||
| 
 | |||
| if __name__ == '__main__': | |||
|     unittest.main() | |||
| @ -0,0 +1,39 @@ | |||
| import unittest | |||
| import utils.path_tool | |||
| from ulrich.program import Job | |||
| 
 | |||
| 
 | |||
| class MyTestCase(unittest.TestCase): | |||
|     def test_path(self): | |||
|         job = Job("unit") | |||
|         t = utils.path_tool.PathTool() | |||
|         args = {"application": "TEST", "environment": "ENV01", "modus": "unit", "loglevel": "debug", "tool": "job_tool", | |||
|                 "modus": "unit", "testcase": "TESTFALL", "release": "V0.1", "tctime": "2021-08-21_12-02-01" } | |||
|         job.par.setParameterArgs(args) | |||
|         pt = t.PathConf() | |||
|         r = t.getKeyValue("job.par.application") | |||
|         print(r) | |||
|         r = t.getKeyValue("job.conf.results") | |||
|         print(r) | |||
|         self.assertEqual(r, "/home/ulrich/6_Projekte/Programme/pythonProject/test/target") | |||
|         r = t.composePath("tcbase", None) | |||
|         #r = t.replaceNoPython("{job.conf.archiv}/{job.par.release}/{job.par.testcase}/{job.par.tctime}", "{job.conf.archiv}", "/home/ulrich/6_Projekte/Programme/pythonProject/test/lauf") | |||
|         print(r) | |||
|         args = { "application" : "TEST" , "application" : "ENV01", "modus" : "unit", "loglevel" : "debug", | |||
|                  "tool" : "job_tool", "tsdir": "/home/ulrich/6_Projekte/Programme/pythonProject/test/lauf/V0.1/startjob/2021-08-21_18-ß2-01"} | |||
|         job = Job.resetInstance("unit") | |||
|         job.par.setParameterArgs(args) | |||
|         # r = t.extractPath("tsbase" , "/home/ulrich/6_Projekte/Programme/pythonProject/test/lauf/V0.1/startjob/2021-08-21_18-ß2-01") | |||
|         r = t.extractPattern("tsbase" ) | |||
|         print(r) | |||
|         self.assertEqual(r[0][1], "job.conf.archiv") | |||
|         self.assertEqual(r[3][0], "_") | |||
|         r = t.extractPath("tsbase" , "/home/ulrich/6_Projekte/Programme/pythonProject/test/lauf/V0.1/startjob_2021-08-21_10-02-01") | |||
|         print("r " + str(r)) | |||
|         print(vars(job.par)) | |||
|         self.assertEqual(job.par.release, "V0.1") | |||
|         self.assertEqual(job.par.usecase, "startjob") | |||
|         self.assertEqual(job.par.tltime, "2021-08-21_10-02-01") | |||
| 
 | |||
| if __name__ == '__main__': | |||
|     unittest.main() | |||
| @ -0,0 +1,18 @@ | |||
| import unittest | |||
| import utils.tdata_tool as t | |||
| import ulrich.program | |||
| 
 | |||
| class MyTestCase(unittest.TestCase): | |||
|     def test_pathTool(self): | |||
|         job = ulrich.program.Job("unit") | |||
|         args = {"application": "TEST", "application": "ENV01", "modus": "unit", "loglevel": "debug", | |||
|                 "tool": "job_tool", "tdtyp": "csv", "tdsrc": "implement", "tdname": "firstunit", | |||
|                 "modus": "unit"} | |||
|         job.par.setParameterArgs(args) | |||
|         filename = str(job.conf.confs["paths"]["testdata"]) + "/" + getattr(job.par, "tdsrc") + "/" + getattr(job.par, "tdname") + ".csv" | |||
|         tdata = t.readCsv(filename) | |||
|         self.assertEqual(1, 1) | |||
| 
 | |||
| 
 | |||
| if __name__ == '__main__': | |||
|     unittest.main() | |||
| @ -0,0 +1,185 @@ | |||
| # managing the components | |||
| # ----------------------------------------------------------------------------- | |||
| """ | |||
| component has to be created in relation of the application (basis.yml). | |||
| Each componente could be created mostly once, but not everytime: | |||
| * the same instance of a component is used in different contexts | |||
| * there could be exist more instances | |||
| * there could be alternatives of an instance | |||
| Each kind of instance has its component-class and for each use should be an object be created. | |||
| Each crated component-onject are documented in the parameter-file. | |||
| """ | |||
| import utils.config_tool | |||
| import utils.conn_tool | |||
| import ulrich.program | |||
| import ulrich.message | |||
| import components.component | |||
| import importlib | |||
| import copy | |||
| components = {} | |||
| PARAM_NOSUBNODE = [ "artifact", "components", "instance" ] | |||
| 
 | |||
| class ComponentManager: | |||
|     __instance = None | |||
|     """  | |||
|     initializes the Manager with all necessary components   | |||
|     """ | |||
|     def __init__(self): | |||
|         job = ulrich.program.Job.getInstance() | |||
|         job.m.logDebug("applicationscomponente -- " + str(type(job.par)) ) | |||
|         self.components = {} | |||
| 
 | |||
|     def initComponents(self): | |||
|         # sets components the first time | |||
|         # afterwards set components from parameter-file | |||
|         job = ulrich.program.Job.getInstance() | |||
|         anw = job.par.application | |||
|         job.m.logDebug("applicationscomponente -- " + str(type(job.par)) ) | |||
|         if not job.conf.confs["applicationen"].get(anw): | |||
|             job.m.setFatal("application " + job.par.application + " is not configured") | |||
|             return | |||
|         for k in job.conf.confs["applicationen"].get(anw): | |||
|             job.m.logDebug("applicationscomponente -- " + k + ":" ) | |||
|             self.createComponents(k, 0, "") | |||
| 
 | |||
| 
 | |||
|     def setComponents(self): | |||
|         # set components from parameter-file | |||
|         job = ulrich.program.Job.getInstance() | |||
|         job.m.logDebug("applicationscomponente -- " + str(type(job.par)) ) | |||
| 
 | |||
|     def getComponent(self, compobjname): | |||
|         job = ulrich.program.Job.getInstance() | |||
|         verify=-2+job.getDebugLevel("job_tool") | |||
|         job.debug(verify, "getComponents " + compobjname) | |||
|         return components[compobjname] | |||
| 
 | |||
|     def getComponents(self, mainfct): | |||
|         job = ulrich.program.Job.getInstance() | |||
|         verify=-2+job.getDebugLevel("job_tool") | |||
|         job.debug(verify, "getComponents " + mainfct) | |||
|         out = [] | |||
|         for c in components: | |||
|             job.debug(verify, "getComponents " + c + ": " + str(components[c].conf)) | |||
|             print("getComponents " + c + ": " + str(components[c].conf)) | |||
|             if mainfct in components[c].conf["function"]: | |||
|                 out.append(c) | |||
|         return out | |||
| 
 | |||
|     @staticmethod | |||
|     def getInstance(): | |||
|         if (ComponentManager.__instance is not None): | |||
|             return ComponentManager.__instance | |||
|         else: | |||
|             raise Exception("Klasse noch nicht initialisiert") | |||
| 
 | |||
|     def createComponents(self, componentName, nr, suffix): | |||
|         """ | |||
|         in order to create a component it must be loaded | |||
|         * knogwedge of the application - which components should be created | |||
|         * technical-knowledge of the instanciated component, especially the connection, user, password | |||
|         * business-knowledge of the component, especially of their interfaces resp. artifacts | |||
|         :param componentName: Name of the component | |||
|         :param nr: | |||
|         :param add: | |||
|         :return: | |||
|         """ | |||
|         job = ulrich.program.Job.getInstance() | |||
|         verify=job.getDebugLevel("job_tool") | |||
|         componentName = componentName.lower() | |||
|         print("createComponent " + componentName) | |||
|         confs = utils.config_tool.getConfig("comp", componentName) | |||
|         conns = utils.conn_tool.getConnections(componentName) | |||
|         print("createComponent -91- " + componentName + " : " + str(confs)) | |||
|         if nr > 0 and int(confs["conf"]["instance"]["count"]) > 1: | |||
|             job.m.setError("for multiple callers are multiple calls not implemented ") | |||
|         if nr > 0 and len(conns) == 0: | |||
|             job.m.setError("for multiple calls has only one call configured") | |||
|         print(confs) | |||
|         print("createComponent 1 " + componentName) | |||
|         print(getComponentPath(componentName)) | |||
|         print("createComponent 2 " + componentName) | |||
|         cmodul = importlib.import_module(getComponentPath(componentName)) | |||
|         class_ = getattr(cmodul, getComponentClass(componentName)) | |||
|         readedPar = job.loadParameter() | |||
|         if len(conns) == 1: | |||
|             print("createComponent 3 a " + componentName) | |||
|             if nr > 0 and confs["conf"]["instance"]["single"] == "n": | |||
|                 name = componentName + "_0" + str(nr) | |||
|             else: | |||
|                 name = componentName | |||
|             c = class_() | |||
|             c.name = name | |||
|             c.conf = confs["conf"] | |||
|             c.conf["conn"] = conns[0] | |||
|             c.m = ulrich.message.Message(ulrich.message.LIMIT_DEBUG, "logTime", name) | |||
|             c.init() | |||
|             print("createComponent 4 a " + componentName) | |||
|             print(vars(c)) | |||
|             print(vars(c.m)) | |||
|             if readedPar is not None: | |||
|                 print("createComponent 5 a " + name + " : "+ str(readedPar)) | |||
|                 for k in readedPar["components"][name].keys(): | |||
|                     c.conf[k] = readedPar["components"][name][k] | |||
|             components[name] = c | |||
|             self.createComponent(c, nr, suffix) | |||
|         else: | |||
|             i = 1 | |||
|             print("createComponent 3 b " + componentName) | |||
|             for cn in conns: | |||
|                 name = componentName+ "_0"+str(i) | |||
|                 c = class_() | |||
|                 c.name = name | |||
|                 c.conf = confs["conf"] | |||
|                 c.conf["conn"] = conns[0] | |||
|                 c.m = ulrich.message.Message(ulrich.message.LIMIT_DEBUG, "logTime", name) | |||
|                 c.init() | |||
|                 print("createComponent 4 b " + componentName) | |||
|                 print(vars(c)) | |||
|                 if readedPar is not None: | |||
|                     for k in readedPar["components"][name].keys(): | |||
|                         c.conf[k] = readedPar["components"][name][k] | |||
|                 components[name] = c | |||
|                 self.createComponent(c, i, suffix) | |||
|                 i = i + 1 | |||
|         print("createComponent 9 " + componentName) | |||
|         print(components) | |||
| 
 | |||
|     def createComponent(self, comp, nr, suffix): | |||
|         job = ulrich.program.Job.getInstance() | |||
|         verify = -2 + job.getDebugLevel("job_tool") | |||
|         job.debug(verify, "getComponents " + str(comp.conf["components"])) | |||
|         for c in comp.conf["components"].keys(): | |||
|             if c == "none": | |||
|                 continue | |||
|             self.createComponents(c, nr, suffix) | |||
| 
 | |||
| def getComponentFolder(comp): | |||
|     return comp.lower() | |||
| def getComponentModul(comp): | |||
|     return comp[0:1].upper() + comp[1:].lower() | |||
| def getComponentClass(comp): | |||
|     return comp[0:1].upper() + comp[1:].lower() | |||
| def getComponentPath(comp): | |||
|     return "components." + getComponentFolder(comp) + "." + getComponentModul(comp) | |||
| 
 | |||
| def getComponentDict(): | |||
|     job = ulrich.program.Job.getInstance() | |||
|     verify=-2+job.getDebugLevel("job_tool") | |||
|     job.debug(verify, "getComponents ") | |||
|     out = {} | |||
|     for c in components: | |||
|         out[components[c].name] = {} | |||
|         print("getCompDict " + components[c].name) | |||
|         for k in components[c].confs.keys(): | |||
|             print("getCompDict " + k) | |||
|             if isParameterSubnode(k): # "artifact" in k or "components" in k or "instance" in k: | |||
|                 print("getCompDict -b- " + k) | |||
|                 out[components[c].name][k] = copy.deepcopy(components[c].confs[k]) | |||
|     return out | |||
| 
 | |||
| def isParameterSubnode(key): | |||
|     for k in PARAM_NOSUBNODE: | |||
|         if key in k: | |||
|             return False | |||
|     return True | |||
| @ -0,0 +1,233 @@ | |||
| # function for collecting and writing messages i.e. logging and calculate the return-code | |||
| # ------------------------------------------------------------------------ | |||
| """ | |||
| there are two types of logging: | |||
| * log   everything relevant to document the test-run in relation of the test-system and the test-effort | |||
|         should be logged in order to archive these logfiles | |||
| * debug everything to know how this automatism is running should log into a debug-file. This file can be | |||
|         removed after a few days | |||
| the logging is parametrized by the log-level (fatal ... trace). Especially the debug- and trace-message can be | |||
| switched on/of en detail in the functions and over special settings (parameter tool, component: these debugs should be switched on) | |||
| there are three types of functions: | |||
| * setFatal|Error|...() it logs, sets the top-message and return-code | |||
| * logFatal|Error|...() it logs without any effect for the program-result | |||
| * log()|debug(int)     it logs depending on the special level-setting | |||
| at the end of a program there are some results: | |||
| * for each component there is a return-code, a top-message for documentation in the parameter-file, and a list of collected messages | |||
| + for the main-program the result (return-code, top-message) will be summarized (the most relevant message will used) | |||
| """ | |||
| import ulrich.program | |||
| import os | |||
| import math | |||
| from datetime import datetime | |||
| import utils.path_tool | |||
| 
 | |||
| LIMIT_FATAL = 0 | |||
| LIMIT_ERROR = 4 | |||
| LIMIT_WARN = 8 | |||
| LIMIT_MSG = 12 | |||
| LIMIT_INFO = 16 | |||
| LIMIT_DEBUG = 20 | |||
| LIMIT_TRACE = 24 | |||
| 
 | |||
| RC_OFFSET = 4 | |||
| RC_FATAL = 8 | |||
| RC_ERROR = 6 | |||
| RC_WARN = 5 | |||
| RC_MSG = 4 | |||
| RC_INFO = 3 | |||
| RC_DEBUG = 2 | |||
| RC_TRACE = 1 | |||
| 
 | |||
| class Message: | |||
|     """ | |||
|     Ausgaben erfolgen prioritaeten-gesteuert anhand | |||
|     * Typ (fatal..trace) | |||
|     * Einstellung (a) ueber Parameter ODER (b) in Funktion | |||
|     Im Funktionskopf wird Einstellung gesetzt, z.B. verify=job.getDebugLevel (ggf keine Debug-Ausgabe) bzw. verify=job.getDebugLevel-1 (eingeschaltete Debug-Ausgabe) | |||
|         "fatal": "4",   # Abbruchfehlker, wird immer in debug und log ausgegeben, setzt RC | |||
|         "error": "8",   # Fehler, wird immer in debug und log ausgegeben, setzt RC | |||
|         "warn": "12",   # Warnung, wird immer in debug und log ausgegeben, setzt RC | |||
|         "msg": "16",    # Ergebnis, wird immer in debug und log ausgegeben, setzt RC | |||
|         "info": "20",   # Info, wird ggf. in debug und log ausgegeben, setzt RC | |||
|         "debug": "24",  # wird nur in debug ausgegeben, wenn log-level hoechstens auf eingestelltem job-level steht | |||
|         "trace": "28",  # wird nur in debug ausgegeben, wenn log-level hoechstens auf eingestelltem job-level steht | |||
|     """ | |||
|     def __init__(self, level, logTime, componente): | |||
|         # (self, componente, out, level): | |||
|         self.componente = componente  # dezantrales Logsystem | |||
|         #self.level = level  # Vorgabe zu level zum Filtern, ob auszugebe | |||
|         job = ulrich.program.Job.getInstance() | |||
|         print(vars(job)) | |||
|         print(globals()) | |||
|         # exit(5) | |||
|         verify = LIMIT_DEBUG | |||
|         self.initErrorTyp() | |||
|         self.rc = RC_INFO | |||
|         if (level == 0): | |||
|             self.level = LIMIT_DEBUG | |||
|         else: | |||
|             self.level = level | |||
|         # init debugfile - except for each component | |||
|         if componente is not None: # use general debugfile | |||
|             self.debugfile = job.m.debugfile | |||
|             self.debug(verify, "> > > debugfile uebernommen zu " + str(componente)) | |||
|         else: | |||
|             debugpath = job.conf.confs["paths"]["debugs"] + "/debug_" + logTime[0:-4] + "00.txt" | |||
|             self.debugfile = open(debugpath, "a") | |||
|             self.debug(verify, "> > > debugfile geoeffnet zu " + job.program + " mit " + debugpath) | |||
|         # init logfile - except for components or unittest | |||
|         self.logDebug("logfile " + str(componente) + ", " + str(job.par.basedir)) | |||
|         if componente is not None: # | |||
|             self.logfile = self.debugfile | |||
|         elif job.program == "unit": | |||
|             self.logfile = self.debugfile | |||
|         else: | |||
|             basedir = job.par.basedir | |||
|             basedir = basedir.replace("base", "log") | |||
|             # basedir = utils.path_tool.composePath(basedir, None) | |||
|             basedir = utils.path_tool.composePath(basedir, None) | |||
|             os.makedirs(basedir, exist_ok=True) | |||
|             logpath = basedir + "/protokoll_" + logTime + ".txt" | |||
|             self.logDebug("logfile " + logpath) | |||
|             self.logfile = open(logpath, "w") | |||
|         self.topmessage = "" | |||
|         self.messages = [] | |||
| 
 | |||
|         print("message initialisiert mit level " + str(self.level)) | |||
| 
 | |||
|     def initErrorTyp(self): | |||
|         self.CONST_ERRTYP = { | |||
|             "fatal": "4",  # wird immer in debug und log ausgegeben, setzt RC | |||
|             "error": "8",  # wird immer in debug und log ausgegeben, setzt RC | |||
|             "warn": "12",  # wird immer in debug und log ausgegeben, setzt RC | |||
|             "msg": "16",  # wird immer in debug und log ausgegeben, setzt RC | |||
|             "info": "20",  # wird immer in debug und log ausgegeben, setzt RC | |||
|             "debug": "24",  # wird nur in debug ausgegeben, wenn log-level hoechstens auf eingestelltem job-level steht | |||
|             "trace": "28",  # wird nur in debug ausgegeben, wenn log-level hoechstens auf eingestelltem job-level steht | |||
|             "rc1": "fatal", | |||
|             "rc2": "error", | |||
|             "rc3": "warn", | |||
|             "rc4": "info", | |||
|             "rc5": "debug", | |||
|             "rc6": "trace", | |||
|             "1": "fatal", | |||
|             "2": "error", | |||
|             "3": "warn", | |||
|             "4": "info", | |||
|             "5": "debug", | |||
|             "6": "trace" | |||
|         } | |||
| 
 | |||
|     def getErrortyp(self, prio): | |||
|         if prio <= LIMIT_FATAL: | |||
|             return "FATAL" | |||
|         elif prio <= LIMIT_ERROR: | |||
|             return "ERROR" | |||
|         elif prio <= LIMIT_WARN: | |||
|             return "WARN" | |||
|         elif prio <= LIMIT_MSG: | |||
|             return "MESSAGE" | |||
|         elif prio <= LIMIT_INFO: | |||
|             return "INFO" | |||
|         elif prio <= LIMIT_DEBUG: | |||
|             return "DEBUG" | |||
|         elif prio <= LIMIT_TRACE: | |||
|             return "TRACE" | |||
|         else: | |||
|             return "NDEF" | |||
| 
 | |||
|     def closeMessage(self) : | |||
|         self.debug(LIMIT_INFO, "closeMessage ------------------------------------------- \n") | |||
|         self.logfile.close() | |||
|         self.debugfile.close() | |||
| 
 | |||
|     def setRc(self, rc, text): | |||
|         job = ulrich.program.Job.getInstance() | |||
|         verify = -0+LIMIT_DEBUG | |||
|         self.debug(verify, "setRc " + str(rc) + " " + str(self.rc)+ "\n") | |||
|         if (int(rc) > self.rc): | |||
|             self.rc = rc | |||
|             self.topmessage = self.CONST_ERRTYP["rc"+str(rc)].upper() + ": " + text | |||
|         elif (int(rc) == self.rc): | |||
|             self.topmessage = self.CONST_ERRTYP["rc"+str(rc)].upper() + ": " + text | |||
| 
 | |||
|     def isRc(self, rc): | |||
|         rcId = int(int(self.CONST_ERRTYP[rc]) / 4 - RC_OFFSET) | |||
|         print("< < < isRc " + str(self.rc) + " <=? " + str(rcId)) | |||
|         if self.rc <= int(rcId): | |||
|             print("return True") | |||
|             return True | |||
|         else: | |||
|             print("return False") | |||
|             return False | |||
| 
 | |||
|     def getFinalRc(self): | |||
|         if (self.rc <= RC_OFFSET): | |||
|             return 0 | |||
|         else: | |||
|             return int(int(self.rc) - RC_OFFSET) | |||
| 
 | |||
|     def setFatal(self, text): | |||
|         """ Routine zum Setzen des RC und gleichzeitigem Schreiben des Logs """ | |||
|         self.setRc(RC_FATAL, text) | |||
|         self.logFatal(text) | |||
| 
 | |||
|     def setError(self, text): | |||
|         """ Routine zum Setzen des RC und gleichzeitigem Schreiben des Logs """ | |||
|         self.setRc(RC_ERROR, text) | |||
|         self.logError(text) | |||
| 
 | |||
|     def setWarn(self, text): | |||
|         """ Routine zum Setzen des RC und gleichzeitigem Schreiben des Logs """ | |||
|         self.setRc(RC_WARN, text) | |||
|         self.logWarn(text) | |||
| 
 | |||
|     def setMsg(self, text): | |||
|         """ Routine zum Setzen des RC und gleichzeitigem Schreiben des Logs """ | |||
|         self.setRc(RC_MSG, text) | |||
|         self.logInfo(text) | |||
| 
 | |||
|     def logFatal(self, text): | |||
|         self.log(LIMIT_FATAL, "FATAL: " + text) | |||
|         self.debug(LIMIT_FATAL, "FATAL: " + text) | |||
| 
 | |||
|     def logError(self, text): | |||
|         self.log(LIMIT_ERROR, "ERROR: " + text) | |||
|         self.debug(LIMIT_ERROR, "ERROR: " + text) | |||
| 
 | |||
|     def logWarn(self, text): | |||
|         self.log(LIMIT_WARN, "WARN: " + text) | |||
| 
 | |||
|     def logMsg(self, text): | |||
|         self.log(LIMIT_MSG, text) | |||
|         self.log(LIMIT_MSG, "MSG: " + text) | |||
| 
 | |||
|     def logInfo(self, text): | |||
|         self.log(LIMIT_INFO, text) | |||
| 
 | |||
|     def logDebug(self, text): | |||
|         self.debug(LIMIT_DEBUG, text) | |||
| 
 | |||
|     def logTrace(self, text): | |||
|         self.debug(LIMIT_TRACE, text) | |||
| 
 | |||
|     def log(self, prio, text): | |||
|         """ eigentliche Schreibroutine: hierin wird debug-Level beruecksichtgigt""" | |||
|         if (int(prio) <= int(self.level)) and (self.componente is None): | |||
|             self.logfile.write(text + "\n") | |||
|         elif (int(prio) <= int(self.level)): | |||
|             self.messages.append(text) | |||
|         else: | |||
|             self.debug(prio, self.getErrortyp(prio) + ": " + text) | |||
| 
 | |||
|     def debug(self, prio, text): | |||
|         """ eigentliche Schreibroutine: hierin wird debug-Level beruecksichtgigt""" | |||
|         if (int(prio) < int(self.level)+1): | |||
|             print ("debugfile " + str(self.debugfile)) | |||
|             self.debugfile.write(text + "\n") | |||
| 
 | |||
|     def merge(self, submsg): | |||
|         self.setRc(submsg.getFinalRc(), submsg.topmessage) | |||
|         text = "\n".join(submsg.messages) | |||
|         self.logInfo("\n"+text+"\n") | |||
| @ -0,0 +1,295 @@ | |||
| #!/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") | |||
| @ -0,0 +1,9 @@ | |||
| # | |||
| # ------------------------------------------------- | |||
| """ | |||
| Toolmanager | |||
| """ | |||
| class ToolManager: | |||
|     # for c job.conf.toolscls | |||
|     #   c = importlib. [c].capital(c()) | |||
|     pass | |||
| @ -0,0 +1,17 @@ | |||
| # | |||
| # ---------------------------------------------------------- | |||
| """ | |||
| This program is created for the business-test on the level of unit testing. On this level there is an intensive test-set up to a carthesian product possible. | |||
| The test-specification is written in a yaml-config in the data-directory. | |||
| workflow: | |||
| 1. generate test-cases with all inputs into a csv-file of the spec-yaml | |||
| 2. run the csv-file and collect all results into a new result-csv-file with all inputs and outputs | |||
| 3. check the result-csv-file and declare it as a target-results | |||
| OR instead 2 and 3 on test-first-strategy: | |||
| 3. create manually the target-result with your inputs and the target system-outputs | |||
| 4. run and compare the actual-result with the target-result | |||
| 5. at the end you get an xls-sheet like your result-csv-file but additionally with comparsion-result as detailed result and the only counts of passed and failed tests as minimum-result which can be inserted into management-tools | |||
| """ | |||
| # Press the green button in the gutter to run the script. | |||
| if __name__ == '__main__': | |||
|     print ("start") | |||
| @ -0,0 +1,90 @@ | |||
| # | |||
| # -------------------------------------------------------------- | |||
| import sys | |||
| try: | |||
|     import ulrich.program | |||
| except ImportError: | |||
|     print("ImportError: " + str(ImportError.with_traceback())) | |||
|     pass | |||
| import yaml | |||
| import ulrich.componentHandling | |||
| import utils.path_tool | |||
| import os.path | |||
| 
 | |||
| def getConfigPath(modul, name): | |||
|     """ | |||
|     gets the most specified configuration of different sources | |||
|     Parameter: | |||
|     * typ  -- (basic, comp, tool) | |||
|     * name -- the specific class | |||
|     sources: | |||
|     * programm   << | |||
|     * install    << | |||
|     * environ    << basis-conf | |||
|     * release    << basis-conf | |||
|     * testset    << parameter/environ | |||
|     * testcase   << parameter | |||
|     """ | |||
|     job = ulrich.program.Job.getInstance() | |||
|     verify = job.getDebugLevel("config_tool") | |||
|     job.debug(verify, "getConfig " + modul + ", " + name) | |||
|     if modul == "tool": | |||
|         pathname = job.conf.confs.get("paths").get("home") + "/configs/tool_" + name + ".yml" | |||
|         job.debug(verify, "1 " + pathname) | |||
|         if os.path.exists(pathname): | |||
|             return pathname | |||
|         pathname = job.conf.confs.get("paths").get("program") + "/utils/configs/" + name + ".yml" | |||
|         job.debug(verify, "2 " + pathname) | |||
|         if os.path.exists(pathname): | |||
|             return pathname | |||
|         pathname = job.conf.confs.get("paths").get("environment") + "/" + job.par.environment + "/configs/tool_" + name + ".yml" | |||
|         job.debug(verify, "3 " + pathname) | |||
|         if os.path.exists(pathname): | |||
|             return pathname | |||
|         job.debug(verify, "3x " + pathname) | |||
|     elif modul == "comp": | |||
|         pathname = job.conf.confs.get("paths").get("home") + "/configs/comp_" + name + ".yml" | |||
|         job.debug(verify, "4 " + pathname) | |||
|         if os.path.exists(pathname): | |||
|             return pathname | |||
|         pathname = job.conf.confs.get("paths").get("program") + "/components/" + ulrich.componentHandling.getComponentFolder(name) + "/CONFIG.yml" | |||
|         job.debug(verify, "5 " + pathname) | |||
|         if os.path.exists(pathname): | |||
|             return pathname | |||
|         job.debug(verify, "6 " + pathname) | |||
|     else: | |||
|         pathname = utils.path_tool.composePath("tcparfile") | |||
|         job.debug(verify, "7 " + pathname) | |||
|         if os.path.exists(pathname): | |||
|             return pathname | |||
|         pathname = utils.path_tool.composePath("tsparfile") | |||
|         job.debug(verify, "8 " + pathname) | |||
|         if os.path.exists(pathname): | |||
|             return pathname | |||
|         pathname = job.conf.confs.get("paths").get("release") + "/configs/basis.yml" | |||
|         job.debug(verify, "9 " + pathname) | |||
|         if os.path.exists(pathname): | |||
|             return pathname | |||
|         pathname = job.conf.confs.get("paths").get("environment") + "/configs/basis.yml" | |||
|         job.debug(verify, "10 " + pathname) | |||
|         if os.path.exists(pathname): | |||
|             return pathname | |||
|         pathname = job.conf.confs.get("paths").get("home") + "/config/basis.yml" | |||
|         job.debug(verify, "11 " + pathname) | |||
|         if os.path.exists(pathname): | |||
|             return pathname | |||
|         job.debug(verify, "12 " + pathname) | |||
| 
 | |||
| def getConfig(modul, name): | |||
|     job = ulrich.program.Job.getInstance() | |||
|     verify = job.getDebugLevel("config_tool") | |||
|     pathname = getConfigPath(modul, name) | |||
|     confs = {} | |||
|     job.debug(verify, "getConfig " + pathname) | |||
|     with open(pathname, "r") as file: | |||
|         job.debug(verify, "openfile") | |||
|         doc = yaml.full_load(file) | |||
|         for i, v in doc.items(): | |||
|             job.debug(verify, "item " + str(i) + ": " + str(v)) | |||
|             confs[i] = v | |||
|     return confs | |||
| @ -0,0 +1,44 @@ | |||
| # | |||
| pattern: | |||
|   # Keywords | |||
|   log:       log | |||
|   parfile:   PARAMETER_{job.par.application}_{job.par.environment}.yml | |||
|   precond:   vorher | |||
|   postcond:  nachher | |||
|   diff:      diff_fach | |||
|   prediff:   diff_init | |||
|   rundiff:   diff_ablauf | |||
|   result:    Ergebnisse/{comp.name} | |||
|   origin:    original | |||
|   parts:     teilergebnisse | |||
|   sumfile:   xxx | |||
|   backup:    backup | |||
|   reffile:   Herkunft.txt | |||
|   tc:        testfall | |||
|   ts:        testlauf | |||
|   debugname: debug | |||
|   logname:   log | |||
|   debugs:    "{job.conf.home}/test/log" | |||
|   # environment | |||
|   envbase:   "{job.conf.environment}/{job.par.environment}" | |||
|   envlog:    "{envbase}/{log}" | |||
|   envparfile: "{envbase}/{parfile}" | |||
|   # testcase | |||
|   tcbase:    "{job.conf.archiv}/{job.par.release}/{job.par.testcase}/{job.par.tctime}" | |||
|   tclog:     "{tcbase}/{log}" | |||
|   tcresult:  "{tcbase}/{result}" | |||
|   tcparfile: "{tcbase}/{parfile}" | |||
|   tcdiff:    "{tcresult}/{diff}" | |||
|   tcprediff: "{tcresult}/{prediff}" | |||
|   tcrundiff: "{tcresult}/{rundiff}" | |||
|   tcprecond:   "{tcresult}/vorher" | |||
|   tcpostcond:  "{tcresult}/nachher" | |||
|   # testset | |||
|   tsbase:    "{job.conf.archiv}/{job.par.release}/{job.par.usecase}_{job.par.tltime}" | |||
|   tslog:     "{tsbase}/{log}" | |||
|   tsparfile: "{tsbase}/{parfile}" | |||
|   tssum:     "{tsbase}/Ergebnis" | |||
|   # target-result rs | |||
|   rsbase:    "{job.conf.results}/{job.par.branch}" | |||
|   rsresult:  "{rsbase}/{result}" | |||
|   rsbackup:  "{rsbase}/{result}" | |||
| @ -0,0 +1,35 @@ | |||
| # | |||
| pattern: | |||
|   # Keywords | |||
|   log:       Protokolle | |||
|   parfile:   PARAMETER_{job.par.application}_{job.par.environ}.yml | |||
|   precond:   vorher | |||
|   postcond:  nachher | |||
|   diff:      diff_fach | |||
|   prediff:   diff_init | |||
|   rundiff:   diff_ablauf | |||
|   result:    Ergebnisse/{comp.name} | |||
|   origin:    original | |||
|   parts:     teilergebnisse | |||
|   sumfile: | |||
|   backup:    backup | |||
|   reffile:   Herkunft.txt | |||
|   tc:        testfall | |||
|   ts:        testlauf | |||
|   # testcase | |||
|   tcbase:    {job.conf.archiv}/{job.par.release}/{job.par.testcase}/{job.par.tctime} | |||
|   tcresult:  {tcbase}/{result} | |||
|   tcparfile: {tcbase}/{parfile} | |||
|   tcdiff:    {tcresult}/{diff} | |||
|   tcprediff: {tcresult}/{prediff} | |||
|   tcrundiff: {tcresult}/{rundiff} | |||
|   precond:   {tcresult}/vorher | |||
|   postcond:  {tcresult}/nachher | |||
|   # testset | |||
|   tsbase:    {job.conf.archiv}/{job.par.release}/{job.par.usecase}_{job.par.tltime} | |||
|   tsparfile: {tsbase}/{parfile} | |||
|   tssum:     {tsbase}/Ergebnis | |||
|   # target-result rs | |||
|   rsbase:    {job.conf.results}/{job.par.branch} | |||
|   rsresult:  {rsbase}/{result} | |||
|   rsbackup:  {rsbase}/{result} | |||
| @ -0,0 +1,46 @@ | |||
| # functions about connections to other instances | |||
| # ------------------------------------------------------------------- | |||
| """ | |||
| 
 | |||
| """ | |||
| import ulrich.program | |||
| import utils.config_tool | |||
| def getConnection(comp, nr): | |||
|     job = ulrich.program.Job.getInstance() | |||
|     verify = job.getDebugLevel("conn_tool") | |||
|     conn = {} | |||
|     if job.conf.confs.get("tools").get("connsrc") == "yml": | |||
|         conn = utils.config_tool.getConfig("tool", "conn") | |||
|         instnr = "inst" + str(nr) | |||
|         if conn["env"][comp][instnr]: | |||
|             return conn["env"][comp][instnr] | |||
|         else: | |||
|             job.m.setFatal("Conn-Tool: Comp not configured " + comp + " " + str(nr)) | |||
|     elif job.conf.confs.get("tools").get("connsrc") == "db": | |||
|         pass | |||
|     elif job.conf.confs.get("tools").get("connsrc") == "csv": | |||
|         pass | |||
|     return None | |||
| 
 | |||
| def getConnections(comp): | |||
|     job = ulrich.program.Job.getInstance() | |||
|     verify = job.getDebugLevel("conn_tool") | |||
|     print("getConnections " + comp) | |||
|     conn = {} | |||
|     conns = [] | |||
|     if job.conf.confs.get("tools").get("connsrc") == "yml": | |||
|         conn = utils.config_tool.getConfig("tool", "conn") | |||
|         if not comp in conn["env"]: | |||
|             job.m.setFatal("Conn-Tool: Comp not configured " + comp) | |||
|     elif job.conf.confs.get("tools").get("connsrc") == "db": | |||
|         pass | |||
|     elif job.conf.confs.get("tools").get("connsrc") == "csv": | |||
|         pass | |||
|     print(comp) | |||
|     print(conn["env"].keys()) | |||
|     print(conn["env"][comp]["instance"]) | |||
|     for i in range(conn["env"][comp]["instance"]): | |||
|         print("range " + str(i+1)) | |||
|         instnr = "inst" + str(i+1) | |||
|         conns.append(conn["env"][comp][instnr]) | |||
|     return conns | |||
| @ -0,0 +1,12 @@ | |||
| # functions related to Date-fields | |||
| # ----------------------------------------------------- | |||
| """ | |||
| additionally functions for calculating date with formulas like [DATE+2M] and for comparison of date related on two reference-dates | |||
| """ | |||
| import datetime | |||
| 
 | |||
| F_DIR = "%Y-%m-%d_%H-%M-%S" | |||
| def getActdate(format): | |||
|     return getFormatdate(datetime.datetime.now(), format) | |||
| def getFormatdate(date, format): | |||
|     return date.strftime(format) | |||
| @ -0,0 +1,90 @@ | |||
| # Funktionen zum Dateizugriff mit Suchen, Lesen, Schreiben | |||
| # ------------------------------------------------------------ | |||
| """ | |||
| 
 | |||
| """ | |||
| import os | |||
| import os.path | |||
| import re | |||
| from ulrich.message import Message | |||
| from ulrich.program import Job | |||
| from pprint import pp | |||
| def getDump(obj): | |||
|     result="" | |||
|     print (str(type(obj))) | |||
|     result = vars(obj) | |||
|     return str(result) | |||
| #    if type(obj) == "__dict__" | |||
| 
 | |||
| def getFiles(msg: Message, path, pattern, conn): | |||
|     """ | |||
|     search filenames in the directory - if conn is set search remote | |||
|     :param msg:     -- msg-Objekt | |||
|     :param path:    -- Pfad - String | |||
|     :param pattern: -- Dateiname als Pattern | |||
|     :param conn: | |||
|     :return: Array mit gefundenen Dateien, nur Dateiname | |||
|     """ | |||
|     if conn is not None: | |||
|         return getRemoteFiles(msg, path, pattern, conn) | |||
|     job = Job.getInstance() | |||
|     verify = int(job.getDebugLevel("file_tool")) | |||
|     out = [] | |||
|     msg.debug(verify, "getFiles " + path + " , " + pattern) | |||
|     for f in os.listdir(path): | |||
|         msg.debug(verify, "getFiles " + f) | |||
|         if re.search(pattern, f): | |||
|             msg.debug(verify, "match " + f) | |||
|             out.append(f) | |||
|     return out | |||
| 
 | |||
| def getRemoteFiles(msg: Message, path, pattern, conn): | |||
|     """ | |||
|     search filenames in the directory - if conn is set search remote | |||
|     :param msg:     -- msg-Objekt | |||
|     :param path:    -- Pfad - String | |||
|     :param pattern: -- Dateiname als Pattern | |||
|     :param conn: | |||
|     :return: Array mit gefundenen Dateien, nur Dateiname | |||
|     """ | |||
|      | |||
| 
 | |||
| def getFilesRec(msg: Message, path, pattern): | |||
|     """ | |||
|     Sucht Dateien im Verzeichnis rekursiv | |||
|     :param msg:     -- msg-Objekt | |||
|     :param path:    -- Pfad - String | |||
|     :param pattern: -- Dateiname als Pattern | |||
|     :return: Array mit gefundenen Dateien, absoluter Pfad | |||
|     """ | |||
|     job = Job.getInstance() | |||
|     verify = int(job.getDebugLevel("file_tool")) | |||
|     out = [] | |||
|     msg.debug(verify, "getFilesRec " + path + " , " + pattern) | |||
|     for (r, dirs, files) in os.walk(path): | |||
|         for f in files: | |||
|             msg.debug(verify, "getFilesRec " + f) | |||
|             if re.search(pattern, f): | |||
|                 msg.debug(verify, "match " + f) | |||
|                 out.append(os.path.join(r, f)) | |||
|     return out | |||
| 
 | |||
| def getTree(msg: Message, pfad): | |||
|     job = Job.getInstance() | |||
|     verify = int(job.getDebugLevel("file_tool")) | |||
|     msg.debug(verify, "getTree " + pfad ) | |||
|     tree = {} | |||
|     files = [] | |||
|     for f in os.listdir(pfad): | |||
|         if os.path.isDir(os.path.join(pfad, f)): | |||
|             tree[f] = getTree(msg, os.path.join(pfad, f)) | |||
|         elif os.path.isFile(os.path.join(pfad, f)): | |||
|             files.append(f) | |||
|     tree["_files_"] = files | |||
|     return tree | |||
| 
 | |||
| def mkPaths(msg, pfad): | |||
|     job = Job.getInstance() | |||
|     verify = int(job.getDebugLevel("file_tool")) | |||
|     modus = job.conf.confs["paths"]["mode"] | |||
|     os.makedirs(pfad, exist_ok=True) | |||
| @ -0,0 +1,31 @@ | |||
| # GrundFunktionen zur Ablaufsteuerung | |||
| # | |||
| # -------------------------------------------------------- | |||
| """ | |||
| 1. Programm -- implementiert in Main-Klasse | |||
| 2. Anwndung -- steuert zu pruefende System [ in basis_Config ] | |||
| 3. application -- 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. Laufart -- 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. Modul    -- schraenkt Verarbeitung auf parametriserte componenten ein | |||
| 12. Funktion -- schraenkt Verarbeitung auf parametriserte Funktionen ein | |||
| 13. Tool     -- schraenkt Protokollierung/Verarbeitung auf parametriserte Tools ein | |||
| """ | |||
| from ulrich.program import Job | |||
| def hasModul(komp): | |||
|     job = Job.getInstance() | |||
|     return False | |||
| def hasFunction(fct): | |||
|     job = Job.getInstance() | |||
|     return False | |||
| def hasTool(tool): | |||
|     job = Job.getInstance() | |||
|     return False | |||
| @ -0,0 +1,98 @@ | |||
| # | |||
| # ------------------------------------------------------------ | |||
| """ | |||
| 
 | |||
| """ | |||
| class Matching(): | |||
|     def __init__(self, comp): | |||
|         self.comp = comp | |||
|         self.elements = {} | |||
|         self.resultFiles = comp.resultFiles | |||
|         self.targetFiles = comp.targetFiles | |||
|         self.assignedFiles = {} | |||
|         pass | |||
| 
 | |||
| def matchFiles(matching): | |||
|     """ | |||
| 
 | |||
|     post: | |||
|     :param matching: | |||
|     :return: | |||
|     """ | |||
|     pass | |||
| 
 | |||
| def matchBestfit(matching): | |||
|     """ | |||
|     in this strategy the difference-score of all elements of both sides will be calculated. | |||
|     the best fit will assigned together until nothing is | |||
|     * the elements can be each kind of object | |||
|     * the count of elements should not be high | |||
|     :param matching: | |||
|     :return: | |||
|     """ | |||
|     hits = {} | |||
|     output = [] | |||
|     results = {} | |||
|     targets = {} | |||
|     for tg in matching.elements["tgelement"]: | |||
|         targets[tg] = True | |||
|     for rs in matching.elements["rselement"]: | |||
|         results[rs] = True | |||
|         for tg in matching.elements["tgelement"]: | |||
|             acthit = matching.comp.getHitscore(matching.elementtyp, matching.elements["rselement"][rs], matching.elements["tgelement"][tg]) | |||
|             while acthit in hits.keys(): | |||
|                 acthit = getNextHitscore(acthit) | |||
|             hits[acthit] = {} | |||
|             hits[acthit]["result"] = rs | |||
|             hits[acthit]["target"] = tg | |||
|     for h in sorted(hits.keys()): | |||
|         if results[h]["result"] and targets[h]["target"]: | |||
|             results[h]["result"] = False | |||
|             targets[h]["target"] = False | |||
|             output.append((hits[acthit]["result"], hits[acthit]["target"])) | |||
|     for rs in results.keys(): | |||
|         if results[rs]: | |||
|             output.append((matching.elements["rselement"][rs], None)) | |||
|     for tg in targets.keys(): | |||
|         if results[rs]: | |||
|             output.append((matching.elements["tgelement"][tg], None)) | |||
|     return output | |||
| 
 | |||
| # -------------------------------------------------------------------------- | |||
| 
 | |||
| def matchTree(matching): | |||
|     """ | |||
| 
 | |||
|     :param matching: | |||
|     :return: | |||
|     """ | |||
|     pass | |||
| 
 | |||
|     def matchElement(matching, rs, tg): | |||
|         if "array" in type(rs) and "array" in type(tg): | |||
|             return matchArray(matching, rs, tg) | |||
|         elif "dict" in type(rs) and "dict" in type(tg): | |||
|             return matchDict(matching, rs, tg) | |||
|         else: | |||
|             pass | |||
| 
 | |||
|     def matchDict(matching, rs, tg): | |||
|         pass | |||
|     def matchArray(matching, rs, tg): | |||
|         pass # matchBest | |||
| 
 | |||
| # -------------------------------------------------------------------------- | |||
| def matchLines(matching): | |||
|     pass | |||
| 
 | |||
| # -------------------------------------------------------------------------- | |||
| 
 | |||
| def getScoreint(score): | |||
|     if score.is_integer(): | |||
|         return score | |||
|     elif "h_" in score: | |||
|         return int(score[2:]) | |||
| def getHitscore(score): | |||
|     return "h_" + ':04d'.format(getScoreint(score)) | |||
| def getNextHitscore(score): | |||
|     return "h_" + ':04d'.format(getScoreint(score)+1) | |||
| @ -0,0 +1,148 @@ | |||
| # All functions related to the full path. | |||
| # It implements the team conventions of the directory structure | |||
| # ----------------------------------------------------------------------- | |||
| """ In diesem Modul werden alle Funktionen zusammengefasst zur Generierung und Ermittlung von pathsn """ | |||
| import sys | |||
| import ulrich.program | |||
| import utils.config_tool | |||
| import re | |||
| 
 | |||
| 
 | |||
| def getKeyValue(key): | |||
|     job = ulrich.program.Job.getInstance() | |||
|     verify = job.getDebugLevel("path_tool") | |||
|     pt = PathConf.getInstance() | |||
|     print("getKeyValue " + key) | |||
|     if 'job.par' in key: | |||
|         neu = job.getParameter(key[8:]) | |||
|         return neu | |||
|     elif 'job.conf' in key: | |||
|         neu = job.conf.confs["paths"][key[9:]] | |||
|         print(neu) | |||
|         return neu | |||
|         # return job.conf.confs["paths"][key[9:]] | |||
|     elif (pt.pattern): | |||
|         return pt.pattern[key] | |||
|         print("pt exists") | |||
|     else: | |||
|         return "xx-"+key+"-xx" | |||
| 
 | |||
| def composePath(pathname, comp): | |||
|     job = ulrich.program.Job.getInstance() | |||
|     verify = job.getDebugLevel("path_tool") | |||
|     pt = PathConf.getInstance() | |||
|     print("composePath " + pathname + " zu " + str(pt) + "mit ") | |||
|     print(pt.pattern) | |||
|     if pt.pattern[pathname]: | |||
|         return composePatttern(pt.pattern[pathname], comp) | |||
|     else: | |||
|         print("in Pattern nicht vorhanden: " + pathname) | |||
| 
 | |||
| def composePatttern(pattern, comp): | |||
|     job = ulrich.program.Job.getInstance() | |||
|     verify = job.getDebugLevel("path_tool") | |||
|     print("composePattern " + pattern) | |||
|     max=5 | |||
|     l = re.findall('\{.*?\}', pattern) | |||
|     print(l) | |||
|     for pat in l: | |||
|         pit = getKeyValue(pat[1:-1]) | |||
|         print(str(max) + ": " + pattern + ": " + pat + ": " + pit) | |||
|         pattern = pattern.replace(pat, pit) | |||
|         print(str(max) + ": " + pattern + ": " + pat + ": " + pit) | |||
|     while ("{" in pattern): | |||
|         max = max-1 | |||
|         print(str(max) + ": " + pattern + ": " + pat + ": " + pit) | |||
|         pattern = composePatttern(pattern, comp) | |||
|         print(str(max) + ": " + pattern + ": " + pat + ": " + pit) | |||
|         if (max < 3) : | |||
|             break | |||
|     return pattern | |||
| 
 | |||
| def extractPattern(pathtyp): | |||
|     job = ulrich.program.Job.getInstance() | |||
|     out = [] | |||
|     pt = PathConf.getInstance() | |||
|     pattern = pt.pattern[pathtyp] | |||
|     work = pattern | |||
|     while "{" in work: | |||
|         i = work.index("{") | |||
|         j = work.index("}") | |||
|         pre = work[0:i] | |||
|         pat = work[i+1:j] | |||
|         print (work + " von " + str(i) + "-" + str(j) + " pre " + pre + "pat " + pat) | |||
|         pit = getKeyValue(pat) | |||
|         tup = (pre, pat, pit) | |||
|         out.append(tup) | |||
|         work = work[j+1:] | |||
|     return out | |||
| 
 | |||
| def extractPath(pathtyp, pathname): | |||
|     job = ulrich.program.Job.getInstance() | |||
|     patterlist = extractPattern(pathtyp) | |||
|     work = pathname | |||
|     i = 0 | |||
|     print("-- extractPatternList -- " + pathtyp + ":" + str(patterlist)) | |||
|     for p in patterlist: | |||
|         delim = p[0] | |||
|         key = p[1] | |||
|         val = p[2] | |||
|         nextdelim = "" | |||
|         if i >= len(patterlist) - 1: | |||
|             nextdelim = "" | |||
|         else: | |||
|             nextdelim = patterlist[i+1][0] | |||
|         print("xPath delim " + delim + " " + str(len(delim)) + ", " + nextdelim + " work " + work) | |||
|         work = work[len(delim):] | |||
|         print("xPath key " + key + " i " + str(i) + " work " + work) | |||
|         if val is not None: | |||
|             print("val not none " + val) | |||
|             if val in work: | |||
|                 print("val ok") | |||
|                 work = work.replace(val, "") | |||
|             elif "time" in key and "job.par" in key: | |||
|                 prop = "" | |||
|                 if i < len(patterlist) - 1: | |||
|                     prop = work[0:work.index(nextdelim)] | |||
|                 else: | |||
|                     prop = work | |||
|                 key = key[8:] | |||
|                 print("setprop " + key + " = " + prop) | |||
|                 if hasattr(job.par, key): delattr(job.par, key) | |||
|                 setattr(job.par, key, val) | |||
|             else: | |||
|                 print("val not not ok " + val + " zu " + key) | |||
|         elif "job.par" in key: | |||
|             prop = "" | |||
|             if i < len(patterlist) - 1: | |||
|                 print("job.par nextdelim " + nextdelim) | |||
|                 prop = work[0:work.index(nextdelim)] | |||
|             else: | |||
|                 prop = work | |||
|             key = key[8:] | |||
|             print("setprop " + key + " = " + prop) | |||
|             if hasattr(job.par, key): delattr(job.par, key) | |||
|             setattr(job.par, key, prop) | |||
|             work = work.replace(prop, "") | |||
|         else: | |||
|             print("val is none " + key) | |||
|         i = i +1 | |||
| 
 | |||
| 
 | |||
| class PathConf: | |||
|     __instance = None | |||
|     def __init__(self): | |||
|         print('init pathConf') | |||
|         confs = utils.config_tool.getConfig("tool", "path") | |||
|         self.pattern = confs["pattern"] | |||
|         print(self.pattern) | |||
|         PathConf.__instance = self | |||
| 
 | |||
|     @staticmethod | |||
|     def getInstance(): | |||
|         #print("PathConf getInstance " + str(PathConf.__instance)) | |||
|         if (PathConf.__instance is None): | |||
|             PathConf() | |||
|         #print("PathConf getInstance " + str(PathConf.__instance)) | |||
|         return PathConf.__instance | |||
| 
 | |||
| @ -0,0 +1,58 @@ | |||
| # functions in order to report the summaries | |||
| # ------------------------------------------------------- | |||
| """ | |||
| the reporting-system in bottom-up | |||
| (0) raw-data | |||
| (0.1) artificats created from test-system - raw-files up to work-files - | |||
| (0.2) in logs all contacts to test-system - raw-info - | |||
| (1) comparison-result | |||
| (1.1) comparison-result as difference for each file-comparison in html-files in testcases - diff-files - | |||
| (1.2) extraction of diff-files (only not accepted differences) as html-file in test-set - result-report - | |||
| (2) result-code | |||
| (2.1) result-code of each test-step for each component in testcases - parameter-file - | |||
| (2.2) transfer of the summary result-code of each testcase to an extern reporting-system - protocol - | |||
| (2.3) visualization of final result-code of each component and each testcase in test-set - result-report - | |||
| (2.4) visualization of statistical result-codes of each component and each test-set in test-context - result-report - | |||
| """ | |||
| import ulrich.program | |||
| 
 | |||
| def getTcExtraction(tcpath, comp): | |||
|     """ | |||
|     extracts the pure differences of diff-files | |||
|     :param comp: | |||
|     :return: html-code with links to diff-files | |||
|     """ | |||
|     job = ulrich.program.Job.getInstance() | |||
|     verify = -0 + job.getDebugLevel("report_tool") | |||
|     job.debug(verify, "writeDataTable " + str(comp)) | |||
|     body = '<div class="diff"><p>' | |||
|     # for f in diff-files: | |||
|     #   body = body + extractDiffLines | |||
|     body = body + '</p></div>' | |||
|     return body | |||
| 
 | |||
| def getTcBody(tcpath): | |||
|     """ | |||
| 
 | |||
|     :param tcpath: | |||
|     :return: | |||
|     """ | |||
|     job = ulrich.program.Job.getInstance() | |||
|     verify = -0+job.getDebugLevel("report_tool") | |||
|     job.debug(verify, "writeDataTable " + str(tcpath)) | |||
|     body = '<div class="diff"><p>' | |||
|     # for c in comps: | |||
|     # | |||
|     body = body + '</p></div>' | |||
|     return body | |||
| 
 | |||
| def getTcHeader(tcpath): | |||
|     """ | |||
|     creates header | |||
|     :param tcpath: | |||
|     :return: html-code with result-codes of each component | |||
|     """ | |||
|     job = ulrich.program.Job.getInstance() | |||
|     verify = -0+job.getDebugLevel("report_tool") | |||
|     job.debug(verify, "writeDataTable " + str(tcpath)) | |||
| 
 | |||
| @ -0,0 +1,46 @@ | |||
| # | |||
| # ---------------------------------------------------------- | |||
| """ | |||
| 
 | |||
| """ | |||
| import os | |||
| 
 | |||
| import ulrich | |||
| import paramiko | |||
| 
 | |||
| def getRemoteClass(comp): | |||
|     job = ulrich.program.Job.getInstance() | |||
|     verify = job.getDebugLevel("config_tool") | |||
|     if job.conf.confs.get("tools").get("remotetyp") == "ssh": | |||
|         return SshCmd(comp) | |||
| 
 | |||
| class RemoteCmd: | |||
|     def __init__(self): | |||
|         self.rc = 0 | |||
|         self.sysout = "" | |||
|     pass | |||
| 
 | |||
| class SshCmd(RemoteCmd): | |||
|     def __init__(self, comp): | |||
|         self.conn = comp | |||
| 
 | |||
|     def execCmd(self, cmds): | |||
|         """ | |||
| 
 | |||
|         :param cmds: | |||
|         :return: | |||
|         """ | |||
|         ssh = paramiko.SSHClient() | |||
|         ssh.load_system_host_keys(os.path.expanduser('~/.ssh/known_hosts')) | |||
|         if self.conn["password"]: | |||
|             ssh.connect(self.conn["host"], username=self.conn["user"], password=self.conn["password"]) | |||
|         else: | |||
|             ssh.connect(self.conn["host"], username=self.conn["user"]) | |||
|         shell = ssh.invoke_shell() | |||
|         for cmd in cmds: | |||
|             stdin, stdout, stderr = ssh.exec_command(cmd + "\n") | |||
|             self.sysout = stdout.read() | |||
|             stdin.close() | |||
|             stderr.close() | |||
|             stdout.close() | |||
|         ssh.close() | |||
| @ -0,0 +1,135 @@ | |||
| # | |||
| # --------------------------------------------------------------------- | |||
| """ | |||
| the issue of this tool is to transform extern data to the internal structure and the internal structure into extern data - i.e. mostly test-results. | |||
| * * * * * * * * | |||
| the testdata have several elements | |||
| * parameter (-td --tdata) : to identify which testdata should be loaded | |||
| * source (db: dbname / dir: filename) : always structured in a table (easy to specify) with columns | |||
|   * node : where the rows are | |||
|   * action : what should be done - default insert | |||
|   + fields : dates in relation of a reference<day or a formula | |||
| * interface : configured in components and used in comparison with attributes to each field: | |||
|   * ignored - if it should be ignored on differences, it is necessary on technical ID-fields | |||
|   * id-field - necessary | |||
| * * * * * * * * | |||
| the testdata itself which are written in different artifacts of modern applications are mostly stored as tree | |||
| - so as xml, json, always with plain data in the leaf. So the intern structure should be also a tree - in python: dictionary. | |||
| """ | |||
| import ulrich.program | |||
| import csv | |||
| 
 | |||
| def getSourcefile(filename): | |||
|     pass | |||
| 
 | |||
| def getTestdata(): | |||
|     job = ulrich.program.Job.getInstance() | |||
|     reftyp = getattr(job.par, "tdtyp") | |||
|     source = getattr(job.par, "tdsrc") | |||
|     criteria = getattr(job.par, "tdname") | |||
|     tdata = {"reftyp": reftyp, "source": source, "criteria": criteria} | |||
|     if reftyp == "db": | |||
|         # read data-structure with sourcename | |||
|         # connect to source | |||
|         # select with all data with datastructure | |||
|         job.m.setInfo("Test-Data readed from " + reftyp + " for " + criteria) | |||
|     elif reftyp == "csv": | |||
|         # read file in testdata | |||
|         job.m.logInfo("Test-Data readed from " + reftyp + " for " + criteria) | |||
|     else: | |||
|         job.m.setFatal("test-Data: reftyp " + reftyp + " is not implemented") | |||
|     return tdata | |||
| 
 | |||
| def readCsv(filename): | |||
|     job = ulrich.program.Job.getInstance() | |||
|     verify = -1+job.getDebugLevel("tdata_tool") | |||
|     job.debug(verify, "readCsv " + filename) | |||
|     fields = [] | |||
|     nodes = [] | |||
|     columns = [] | |||
|     output = {} | |||
|     state = 0 | |||
|     data = [] | |||
|     cnt = 0 | |||
|     with open(filename, 'r') as file: | |||
|         lines = file.read().splitlines() | |||
|     for line in lines: | |||
|         # while (line := file.readline().rstrip()): | |||
|         fields = line.split(';') | |||
|         testline = line.replace(";", "") | |||
|         job.debug(verify, str(state) + " line " + line + " :" + str(len(fields)) + ": " + str(fields)) | |||
|         if len(testline) < 2 and state < 1: | |||
|             state = 0 | |||
|         elif fields[0].lower() == "node": | |||
|             state = 2 | |||
|             columns = [] | |||
|             cnt = len(fields) | |||
|             job.debug(verify, str(state) + " cnt " + str(cnt)) | |||
|             j = 0 | |||
|             for i in range(2, cnt-1): | |||
|                 job.debug(verify, str(i) + " cnt " + str(fields[i])) | |||
|                 if len(fields[i]) > 0: | |||
|                     columns.append(fields[i]) | |||
|                     j = j + 1 | |||
|                 cnt = j | |||
|             job.debug(verify, str(state) + " " + str(cnt) + " cols " + str(columns)) | |||
|         elif state >= 2 and len(testline) > 2: | |||
|             if state == 2: | |||
|                 nodes = fields[0].split(":") | |||
|                 job.debug(verify, str(state) + " nodes " + str(nodes)) | |||
|             state = 3 | |||
|             row = {} | |||
|             for i in range(2, cnt-1): | |||
|                 row[columns[i-2]] = fields[i] | |||
|             job.debug(verify, str(state) + " row " + str(row)) | |||
|             data.append(row) | |||
|         elif state == 3: | |||
|             job.debug(verify, "structure " + str(state) + ": " + str(nodes)) | |||
|             output = setSubnode(0, nodes, data, output) | |||
|             data = [] | |||
|             state = 0 | |||
|             print(str(output)) | |||
|     print(str(output)) | |||
|     output = setSubnode(0, nodes, data, output) | |||
|     print(str(output)) | |||
|     file.close() | |||
|     return output | |||
| 
 | |||
| def setSubnode(i, nodes, data, tree): | |||
|     print("setSubnode " + str(i) + ": " + ": " + str(tree)) | |||
|     if i >= len(nodes): | |||
|         print("setSubnode a " + str(i)) | |||
|         tree["data"] = data | |||
|     elif tree is not None and nodes[i] in tree.keys(): | |||
|         print("setSubnode b " + str(i)) | |||
|         tree[nodes[i]] = setSubnode(i+1, nodes, data, tree[nodes[i]]) | |||
|     else: | |||
|         print("setSubnode c " + str(i)) | |||
|         tree[nodes[i]] = setSubnode((i + 1), nodes, data, {}) | |||
|     return tree | |||
| 
 | |||
| def getDataStructure(comp): | |||
|     # gets data-structure from the vml in the component-folder | |||
|     job = ulrich.program.Job.getInstance() | |||
|     verify = -1+job.getDebugLevel("tdata_tool") | |||
|     job.debug(verify, "getDataStructure " + comp) | |||
| 
 | |||
| def normalizeDataRow(dstruct, xpathtupel, row, referencedate): | |||
|     # normalize data of the row if necessary | |||
|     # raw-value is saved as new field with _raw as suffix | |||
|     job = ulrich.program.Job.getInstance() | |||
|     verify = -1+job.getDebugLevel("tdata_tool") | |||
|     job.debug(verify, "calcDataRow " + row) | |||
| 
 | |||
| def writeDataTable(teststatus, tdata, comp): | |||
|     """ | |||
|     writes the testdata into a csv-file for documentation of the test-run | |||
|     :param teststatus: | |||
|     :param tdata: | |||
|     :param comp: if specific else None | |||
|     :return: | |||
|     """ | |||
|     job = ulrich.program.Job.getInstance() | |||
|     verify = -1+job.getDebugLevel("tdata_tool") | |||
|     job.debug(verify, "writeDataTable " + str(comp)) | |||
| 
 | |||
					Loading…
					
					
				
		Reference in new issue