From 06551b17e2ec033c9b6a673bc7aa19b6a19645ec Mon Sep 17 00:00:00 2001 From: Markus Zolliker Date: Tue, 27 Apr 2021 15:56:19 +0200 Subject: [PATCH] improve more errors during startup errors from a module a combined with a header and intended details Change-Id: I4be7bc2f8455fb0e3c9346f3bb23ac88e7589604 --- secop/modules.py | 39 ++++++++++++++++++++------------------- secop/server.py | 16 ++++++++-------- 2 files changed, 28 insertions(+), 27 deletions(-) diff --git a/secop/modules.py b/secop/modules.py index 4a1d309..63dfff3 100644 --- a/secop/modules.py +++ b/secop/modules.py @@ -257,8 +257,8 @@ class Module(HasAccessibles): try: self.setProperty(key, value) except BadValueError: - errors.append('module %s, %s: value %r does not match %r!' % - (name, key, value, self.propertyDict[key].datatype)) + errors.append('%s: value %r does not match %r!' % + (key, value, self.propertyDict[key].datatype)) # 3) set automatic properties mycls = self.__class__ @@ -317,21 +317,21 @@ class Module(HasAccessibles): try: paramobj.setProperty(propname, propvalue) except KeyError: - errors.append('module %s: %s.%s does not exist' % - (self.name, paramname, propname)) + errors.append("'%s.%s' does not exist" % + (paramname, propname)) except BadValueError as e: - errors.append('module %s: %s.%s: %s' % - (self.name, paramname, propname, str(e))) + errors.append('%s.%s: %s' % + (paramname, propname, str(e))) else: - errors.append('module %s: %s not found' % (self.name, paramname)) + errors.append('%r not found' % paramname) # 3) check config for problems: # only accept remaining config items specified in parameters bad = [k for k in cfgdict if k not in self.parameters] if bad: errors.append( - 'module %s: %s does not exist (use one of %s)' % - (self.name, ', '.join(bad), ', '.join(list(self.parameters) + + '%s does not exist (use one of %s)' % + (', '.join(bad), ', '.join(list(self.parameters) + list(self.propertyDict)))) # 4) complain if a Parameter entry has no default value and @@ -349,13 +349,12 @@ class Module(HasAccessibles): pobj.value = pobj.datatype(cfgdict[pname]) self.writeDict[pname] = pobj.value except BadValueError as e: - errors.append('module %s, parameter %s: %s' % (name, pname, e)) + errors.append('%s: %s' % (pname, e)) else: if pobj.default is None: if pobj.needscfg: - errors.append('module %s, parameter %s has no default ' - 'value and was not given in config!' % - (self.name, pname)) + errors.append('%r has no default ' + 'value and was not given in config!' % pname) # we do not want to call the setter for this parameter for now, # this should happen on the first read pobj.readerror = ConfigError('not initialized') @@ -383,7 +382,7 @@ class Module(HasAccessibles): try: # this checks also for the proper datatype # note: this will NOT call write_* methods! - if hasattr(self, k): + if k in self.parameters or k in self.propertyDict: setattr(self, k, v) cfgdict.pop(k) except (ValueError, TypeError): @@ -401,14 +400,14 @@ class Module(HasAccessibles): try: self.checkProperties() except ConfigError as e: - errors.append('module %s: %s' % (name, e)) + errors.append(str(e)) for pname, p in self.parameters.items(): try: p.checkProperties() except ConfigError: - errors.append('module %s, parameter %s: %s' % (name, pname, e)) + errors.append('%s: %s' % (pname, e)) if errors: - raise ConfigError('\n'.join(errors)) + raise ConfigError(errors) # helper cfg-editor def __iter__(self): @@ -522,10 +521,12 @@ class Module(HasAccessibles): with proper error handling """ for pname in list(self.writeDict): - if pname in self.writeDict: # this might not be true with handlers + value = self.writeDict.pop(pname, Done) + # in the mean time, a poller or handler might already have done it + if value is not Done: try: self.log.debug('initialize parameter %s', pname) - getattr(self, 'write_' + pname)(self.writeDict.pop(pname)) + getattr(self, 'write_' + pname)(value) except SilentError: pass except SECoPError as e: diff --git a/secop/server.py b/secop/server.py index fbb4ae2..227dbba 100644 --- a/secop/server.py +++ b/secop/server.py @@ -245,12 +245,8 @@ class Server: continue cls = get_class(classname) except Exception as e: - if pymodule is None: - if str(e) == 'no such class': - errors.append('%s not found' % classname) - else: - raise - errors.append(repr(e)) + if str(e) == 'no such class': + errors.append('%s not found' % classname) else: failed.add(pymodule) failure_traceback = traceback.format_exc() @@ -262,9 +258,13 @@ class Server: if opts: errors.append(self.unknown_options(cls, opts)) self.modules[modname] = modobj - except Exception as e: + except ConfigError as e: + errors.append('error creating module %s:' % modname) + for errtxt in e.args[0]: + errors.append(' ' + errtxt) + except Exception: failure_traceback = traceback.format_exc() - errors.append('error creating %s: %r' % (modname, e)) + errors.append('error creating %s' % modname) poll_table = dict() # all objs created, now start them up and interconnect