improve error handling in router building

This commit is contained in:
Bastian Schroll 2019-03-01 22:46:28 +01:00
parent f487bfc104
commit 4ac4bc5faa
2 changed files with 39 additions and 30 deletions

View file

@ -67,16 +67,24 @@ class RouterManager:
# destroy all routers (also destroys all instances of modules/plugins) # destroy all routers (also destroys all instances of modules/plugins)
del self._routerDict del self._routerDict
def buildRouter(self, config): def buildRouter(self, config): # todo validation
self._routerDict = {} # all routers and instances of modules/plugins would be destroyed self._routerDict = {} # all routers and instances of modules/plugins would be destroyed
routerDict_tmp = {}
logging.debug("build routers") logging.debug("build routers")
# first we have to init all routers # first we have to init all routers
# because a router can be a valid target and we need his reference # because a router can be a valid target and we need his reference
for router in config.get("router"): for router in config.get("router"):
self._routerDict[router.get("name")] = _Router(router.get("name")) if router.get("name") in self._routerDict:
logging.error("duplicated router name: %s", router.get("name"))
return False
routerDict_tmp[router.get("name")] = _Router(router.get("name"))
for router in config.get("router"): for router in config.get("router"):
if router.get("name") is None or router.get("route") is None:
logging.error("name or route not found in router: %s", router)
return False
for route in router.get("route"): for route in router.get("route"):
routerName = router.get("name") routerName = router.get("name")
@ -84,31 +92,35 @@ class RouterManager:
routeName = route.get("name") routeName = route.get("name")
if routeType is None or routeName is None: if routeType is None or routeName is None:
logging.error("type or name error in config: %s", route) logging.error("type or name not found in route: %s", route)
continue return False
try: try:
if routeType == "plugin": if routeType == "plugin":
importedFile = importlib.import_module(routeType + "." + routeName) importedFile = importlib.import_module(routeType + "." + routeName)
loadedClass = importedFile.BoswatchPlugin(route.get("config")) loadedClass = importedFile.BoswatchPlugin(route.get("config"))
self._routerDict[routerName].addRoute(loadedClass._run) routerDict_tmp[routerName].addRoute(loadedClass._run)
elif routeType == "module": elif routeType == "module":
importedFile = importlib.import_module(routeType + "." + routeName) importedFile = importlib.import_module(routeType + "." + routeName)
loadedClass = importedFile.BoswatchModule(route.get("config")) loadedClass = importedFile.BoswatchModule(route.get("config"))
self._routerDict[routerName].addRoute(loadedClass._run) routerDict_tmp[routerName].addRoute(loadedClass._run)
elif routeType == "router": elif routeType == "router":
self._routerDict[routerName].addRoute(self._routerDict[routeName].runRouter) routerDict_tmp[routerName].addRoute(routerDict_tmp[routeName].runRouter)
else: else:
logging.warning("unknown type: %s", routeType) logging.error("unknown type '%s' in %s", routeType, route)
return False
except ModuleNotFoundError: except ModuleNotFoundError:
logging.error("%s not found: %s", route.get("type"), route.get("name")) logging.error("%s not found: %s", route.get("type"), route.get("name"))
return False
logging.debug("finished building routers") logging.debug("finished building routers")
self._routerDict = routerDict_tmp
self._showRouterRoute() self._showRouterRoute()
return True
def runRouter(self, routerList, bwPacket): def runRouter(self, routerList, bwPacket):
if type(routerList) is str: # convert single string name to list if type(routerList) is str: # convert single string name to list

View file

@ -17,8 +17,7 @@ alarmRouter:
- Test - Test
router: router:
- name: Router 1
- name: Router 1
route: route:
- type: module - type: module
name: template_module name: template_module
@ -33,9 +32,7 @@ router:
config: config:
user: test user: test
pass: test pass: test
db: test - name: Router 2
- name: Router 2
route: route:
- type: module - type: module
name: template_module name: template_module