Data-Test-Executer Framework speziell zum Test von Datenverarbeitungen mit Datengenerierung, Systemvorbereitungen, Einspielungen, ganzheitlicher diversifizierender Vergleich
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

253 lines
9.5 KiB

#!/usr/bin/python
# -*- coding: utf-8 -*-
# ---------------------------------------------------------------------------------------------------------
# Author : Ulrich Carmesin
# Source : gitea.ucarmesin.de
# ---------------------------------------------------------------------------------------------------------
3 years ago
# 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
3 years ago
import basic.program
import basic.message
3 years ago
import components.component
import importlib
import copy
import basic.constants as B
3 years ago
comps = {}
PARAM_NOSUBNODE = [B.SUBJECT_ARTS, "components", "instance"]
3 years ago
DEFAULT_INST_CNT = 1
DEFAULT_INST_SGL = "y"
3 years ago
3 years ago
3 years ago
def getInstanceAttributes(conf):
"""
the attributes for instancing the component are set from configuration or from default
:param conf:
:return: a complete set of these attributes
"""
out = {
B.ATTR_INST_CNT: DEFAULT_INST_CNT,
B.ATTR_INST_SGL: DEFAULT_INST_SGL
}
3 years ago
if B.SUBJECT_INST in conf:
for attr in [B.ATTR_INST_CNT, B.ATTR_INST_SGL]:
if attr in conf[B.SUBJECT_INST]:
out[attr] = conf[B.SUBJECT_INST][attr]
return out
def getComponents(mainfct):
job = basic.program.Job.getInstance()
verify = -2 + job.getDebugLevel("job_tool")
job.debug(verify, "getComponents " + mainfct)
out = []
for c in comps:
job.debug(verify, "getComponents " + c + ": " + str(comps[c].conf))
print("getComponents " + c + ": " + str(comps[c].conf))
if mainfct in comps[c].conf["function"]:
out.append(c)
return out
3 years ago
class ComponentManager:
__instance = None
"""
initializes the Manager with all necessary components
"""
3 years ago
3 years ago
def __init__(self):
3 years ago
job = basic.program.Job.getInstance()
3 years ago
job.m.logDebug("applicationscomponente -- " + str(type(job.par)))
3 years ago
self.components = {}
ComponentManager.__instance = self
3 years ago
print ("init ComponentHandling "+str(self))
3 years ago
def initComponents(self):
# sets components the first time
# afterwards set components from parameter-file
3 years ago
job = basic.program.Job.getInstance()
3 years ago
anw = job.par.application
3 years ago
job.m.logDebug("applicationscomponente -- " + str(type(job.par)))
3 years ago
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):
3 years ago
job.m.logDebug("applicationscomponente -- " + k + ":")
3 years ago
self.createComponent(k, 0, "")
3 years ago
def setComponents(self):
# set components from parameter-file
3 years ago
job = basic.program.Job.getInstance()
3 years ago
job.m.logDebug("applicationscomponente -- " + str(type(job.par)))
3 years ago
def getComponent(self, compobjname):
3 years ago
job = basic.program.Job.getInstance()
3 years ago
verify = -2 + job.getDebugLevel("job_tool")
3 years ago
job.debug(verify, "getComponents " + compobjname)
3 years ago
return comps[compobjname]
3 years ago
def getComponents(self, mainfct):
3 years ago
job = basic.program.Job.getInstance()
verify = -2 + job.getDebugLevel("job_tool")
job.debug(verify, "getComponents " + mainfct)
out = []
for c in comps:
job.debug(verify, "getComponents " + c + ": " + str(comps[c].conf))
print("getComponents " + c + ": " + str(comps[c].conf))
if mainfct in comps[c].conf["function"]:
out.append(c)
return out
3 years ago
@staticmethod
def getInstance(init="N"):
3 years ago
if (ComponentManager.__instance is not None):
return ComponentManager.__instance
elif (init != "N"):
return ComponentManager()
3 years ago
else:
raise Exception(B.EXCEPT_NOT_INITIALIZED)
3 years ago
3 years ago
def createComponent(self, componentName, nr, suffix):
3 years ago
"""
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
3 years ago
:param nr: for numbered instance if component is multiple
:param suffix: suffix for specific context of the component
3 years ago
:return:
"""
3 years ago
job = basic.program.Job.getInstance()
3 years ago
verify = job.getDebugLevel("job_tool")
3 years ago
componentName = componentName.lower()
3 years ago
job.debug(verify, "createComponent " + componentName)
3 years ago
confs = utils.config_tool.getConfig("comp", componentName)
conns = utils.conn_tool.getConnections(componentName)
3 years ago
instAttr = getInstanceAttributes(confs)
job.debug(verify, "createComponent -91- " + componentName + " : " + str(confs))
if nr > 0 and int(instAttr[B.ATTR_INST_CNT]) > 1:
3 years ago
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)
3 years ago
parContent = job.loadParameter()
3 years ago
if len(conns) == 1:
3 years ago
c = self.createInstance(componentName, parContent, confs, conns, 0)
3 years ago
print("createComponent 3 a " + componentName)
3 years ago
self.createSubComponents(c, nr, suffix)
3 years ago
else:
i = 1
print("createComponent 3 b " + componentName)
for cn in conns:
3 years ago
c = self.createInstance(componentName, parContent, confs, conns, i)
self.createSubComponents(c, i, suffix)
3 years ago
i = i + 1
print("createComponent 9 " + componentName)
3 years ago
print(comps)
3 years ago
3 years ago
def createInstance(self, compName, parContent, confs, conns, nr):
"""
instance a component
:param compName: name without suffix or number
:param parContent: content of the parameter-file which is dumped from a pre-step
:param confs: configuration of the component
:param conns: connection-attributes for the specific environment
:param nr: number if component is multiple
:return: instance of the component with all necessary attributes
"""
cmodul = importlib.import_module(getComponentPath(compName))
class_ = getattr(cmodul, getComponentClass(compName))
c = class_()
if nr > 0:
name = compName + "_0" + str(nr)
i = nr - 1
else:
name = compName
i = 0
c.name = name
c.conf = confs["conf"]
c.conf[B.SUBJECT_CONN] = conns[i]
c.m = basic.message.Message(basic.message.LIMIT_DEBUG, "logTime", name)
c.init()
if parContent is not None:
print("createComponent 5 a " + name + " : " + str(parContent))
if name in parContent["comps"]:
for k in parContent["comps"][name].keys():
c.conf[k] = parContent["comps"][name][k]
if B.SUBJECT_ARTS in c.conf and B.TOPIC_NODE_DB in c.conf[B.SUBJECT_ARTS]:
if not B.DATA_NODE_DDL in c.conf:
c.conf[B.DATA_NODE_DDL] = {}
for table in c.conf[B.SUBJECT_ARTS][B.TOPIC_NODE_DB]:
if table in ["type"]:
continue
conf = utils.config_tool.getConfig("DATASTRUCTURE", c.name, table)
if "tabelle" in conf and table in conf["tabelle"]:
c.conf[B.DATA_NODE_DDL][table] = conf["tabelle"][table]
else:
c.conf[B.DATA_NODE_DDL][table] = conf
3 years ago
comps[name] = c
return c
def createSubComponents(self, comp, nr, suffix):
3 years ago
job = basic.program.Job.getInstance()
3 years ago
verify = -2 + job.getDebugLevel("job_tool")
3 years ago
job.debug(verify, "getComponents " + str(comp.conf[B.ATTR_INST_SUBCOMP]))
for c in comp.conf[B.ATTR_INST_SUBCOMP].keys():
3 years ago
if c == "none":
continue
3 years ago
self.createComponent(c, nr, suffix)
3 years ago
3 years ago
3 years ago
def getComponentFolder(comp):
return comp.lower()
3 years ago
3 years ago
def getComponentModul(comp):
return comp[0:1].upper() + comp[1:].lower()
3 years ago
3 years ago
def getComponentClass(comp):
return comp[0:1].upper() + comp[1:].lower()
3 years ago
3 years ago
def getComponentPath(comp):
return "components." + getComponentFolder(comp) + "." + getComponentModul(comp)
3 years ago
3 years ago
def getComponentDict():
3 years ago
job = basic.program.Job.getInstance()
3 years ago
verify = -2 + job.getDebugLevel("job_tool")
3 years ago
job.debug(verify, "getComponents ")
out = {}
3 years ago
for c in comps:
out[comps[c].name] = {}
for k in comps[c].conf.keys():
if isParameterSubnode(k): # B.SUBJECT_ARTS in k or "components" in k or "instance" in k:
out[comps[c].name][k] = copy.deepcopy(comps[c].conf[k])
3 years ago
return out
3 years ago
3 years ago
def isParameterSubnode(key):
for k in PARAM_NOSUBNODE:
if key in k:
return False
3 years ago
return True
3 years ago
3 years ago
3 years ago
def getPlainCompname(name):
if "_0" in name:
return name[0:-3]
return name