From 81292350316fdaefa140a31f63139c74ceb2ba21 Mon Sep 17 00:00:00 2001 From: Pim van Pelt Date: Thu, 24 Mar 2022 12:14:26 +0000 Subject: [PATCH] Clean up logging a little bit --- .gitignore | 1 + validator/__init__.py | 23 +++++++++++++++++------ validator/bondethernet.py | 7 +------ validator/bridgedomain.py | 7 +------ validator/interface.py | 6 +----- validator/loopback.py | 6 +----- validator/vxlan_tunnel.py | 7 +------ vpp/vppapi.py | 14 ++++---------- vppcfg | 12 +++++------- 9 files changed, 32 insertions(+), 51 deletions(-) diff --git a/.gitignore b/.gitignore index 545fd19..737a057 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ build/ dist/ +hippo*.yaml __pycache__ diff --git a/validator/__init__.py b/validator/__init__.py index 83edc39..7d9eab6 100644 --- a/validator/__init__.py +++ b/validator/__init__.py @@ -60,15 +60,10 @@ class IPInterfaceWithPrefixLength(Validator): -class NullHandler(logging.Handler): - def emit(self, record): - pass - - class Validator(object): def __init__(self, schema): self.logger = logging.getLogger('vppcfg.validator') - self.logger.addHandler(NullHandler()) + self.logger.addHandler(logging.NullHandler()) self.schema = schema @@ -131,3 +126,19 @@ class Validator(object): if ret_rv: self.logger.debug("Semantics correctly validated") return ret_rv, ret_msgs + + def valid_config(self, yaml): + """ Validate the given YAML configuration in 'yaml' against syntax + validation given in the yamale 'schema', and all semantic validators. + + Returns True if the configuration is valid, False otherwise. + """ + + rv, msgs = self.validate(yaml) + if not rv: + for m in msgs: + self.logger.error(m) + return False + + self.logger.info("Configuration validated successfully") + return True diff --git a/validator/bondethernet.py b/validator/bondethernet.py index dfaaa6e..1e77c29 100644 --- a/validator/bondethernet.py +++ b/validator/bondethernet.py @@ -14,11 +14,6 @@ import logging import validator.interface as interface -class NullHandler(logging.Handler): - def emit(self, record): - pass - - def get_by_name(yaml, ifname): """ Return the BondEthernet by name, if it exists. Return None,None otherwise. """ try: @@ -52,7 +47,7 @@ def validate_bondethernets(yaml): result = True msgs = [] logger = logging.getLogger('vppcfg.validator') - logger.addHandler(NullHandler()) + logger.addHandler(logging.NullHandler()) if not 'bondethernets' in yaml: return result, msgs diff --git a/validator/bridgedomain.py b/validator/bridgedomain.py index 2f956bb..38e08de 100644 --- a/validator/bridgedomain.py +++ b/validator/bridgedomain.py @@ -16,11 +16,6 @@ import validator.interface as interface import validator.lcp as lcp import validator.address as address -class NullHandler(logging.Handler): - def emit(self, record): - pass - - def get_bridgedomains(yaml): """ Return a list of all bridgedomains. """ ret = [] @@ -94,7 +89,7 @@ def validate_bridgedomains(yaml): result = True msgs = [] logger = logging.getLogger('vppcfg.validator') - logger.addHandler(NullHandler()) + logger.addHandler(logging.NullHandler()) if not 'bridgedomains' in yaml: return result, msgs diff --git a/validator/interface.py b/validator/interface.py index 0698062..fd0c427 100644 --- a/validator/interface.py +++ b/validator/interface.py @@ -19,10 +19,6 @@ import validator.vxlan_tunnel as vxlan_tunnel import validator.lcp as lcp import validator.address as address -class NullHandler(logging.Handler): - def emit(self, record): - pass - def get_qinx_parent_by_name(yaml, ifname): """ Returns the sub-interface which matches a QinAD or QinQ outer tag, or None,None if that sub-interface doesn't exist. """ @@ -389,7 +385,7 @@ def validate_interfaces(yaml): result = True msgs = [] logger = logging.getLogger('vppcfg.validator') - logger.addHandler(NullHandler()) + logger.addHandler(logging.NullHandler()) if not 'interfaces' in yaml: return result, msgs diff --git a/validator/loopback.py b/validator/loopback.py index dd235c8..27d1e5a 100644 --- a/validator/loopback.py +++ b/validator/loopback.py @@ -15,10 +15,6 @@ import logging import validator.lcp as lcp import validator.address as address -class NullHandler(logging.Handler): - def emit(self, record): - pass - def get_loopbacks(yaml): """ Return a list of all loopbacks. """ ret = [] @@ -48,7 +44,7 @@ def validate_loopbacks(yaml): result = True msgs = [] logger = logging.getLogger('vppcfg.validator') - logger.addHandler(NullHandler()) + logger.addHandler(logging.NullHandler()) if not 'loopbacks' in yaml: return result, msgs diff --git a/validator/vxlan_tunnel.py b/validator/vxlan_tunnel.py index 6438b51..ae85439 100644 --- a/validator/vxlan_tunnel.py +++ b/validator/vxlan_tunnel.py @@ -15,11 +15,6 @@ import logging import validator.interface as interface import ipaddress -class NullHandler(logging.Handler): - def emit(self, record): - pass - - def get_by_name(yaml, ifname): """ Return the VXLAN by name, if it exists. Return None otherwise. """ try: @@ -64,7 +59,7 @@ def validate_vxlan_tunnels(yaml): result = True msgs = [] logger = logging.getLogger('vppcfg.validator') - logger.addHandler(NullHandler()) + logger.addHandler(logging.NullHandler()) if not 'vxlan_tunnels' in yaml: return result, msgs diff --git a/vpp/vppapi.py b/vpp/vppapi.py index 0f64cd1..3a4d1e5 100644 --- a/vpp/vppapi.py +++ b/vpp/vppapi.py @@ -9,22 +9,16 @@ import fnmatch import logging import socket - -class NullHandler(logging.Handler): - def emit(self, record): - pass - class VPPApi(): def __init__(self, address='/run/vpp/api.sock', clientname='vppcfg'): - self.logger = logging.getLogger('%s.vppapi' % clientname) - self.logger.addHandler(NullHandler()) + self.logger = logging.getLogger('vppcfg.vppapi') + self.logger.addHandler(logging.NullHandler()) self.address = address self.connected = False self.clientname = clientname self.vpp = None - self.config = {} - self.clearconfig() + self.config = self.clearconfig() def connect(self): @@ -66,7 +60,7 @@ class VPPApi(): return True def clearconfig(self): - self.config = {"lcps": {}, "interfaces": {}, "interface_addresses": {}, + return {"lcps": {}, "interfaces": {}, "interface_addresses": {}, "bondethernets": {}, "bondethernet_members": {}, "bridgedomains": {}, "vxlan_tunnels": {}, "l2xcs": {}} diff --git a/vppcfg b/vppcfg index 81add00..b91beb3 100755 --- a/vppcfg +++ b/vppcfg @@ -35,6 +35,7 @@ def main(): parser.add_argument('-q', '--quiet', dest='quiet', action='store_true', help="""Be quiet (only log warnings/errors), default False""") args = parser.parse_args() + level = logging.INFO if args.debug: level = logging.DEBUG @@ -51,13 +52,10 @@ def main(): logging.error("Couldn't read config from %s" % args.config) sys.exit(-1) - v = Validator(schema=args.schema) - rv, msgs = v.validate(cfg) - if not rv: - for m in msgs: - logging.error(m) - else: - logging.info("Configuration validated successfully") + validator = Validator(schema=args.schema) + if not validator.valid_config(cfg): + logging.error("Configuration is not valid, bailing") + sys.exit(-2) vpp = VPPApi() vpp.readconfig()