Refactor validators into a list, and add a custom validator function, which is passed the YAML as an argument, and will return (rv,msgs) to signal custom semantic validation results

This commit is contained in:
Pim van Pelt
2022-04-09 20:12:21 +00:00
parent d6e3496809
commit 1230e04c3e
2 changed files with 29 additions and 35 deletions

View File

@ -69,6 +69,13 @@ class Validator(object):
self.logger.addHandler(logging.NullHandler()) self.logger.addHandler(logging.NullHandler())
self.schema = schema self.schema = schema
self.validators = [
validate_bondethernets,
validate_interfaces,
validate_loopbacks,
validate_bridgedomains,
validate_vxlan_tunnels,
validate_taps ]
def validate(self, yaml): def validate(self, yaml):
ret_rv = True ret_rv = True
@ -107,41 +114,12 @@ class Validator(object):
self.logger.debug("Validating Semantics...") self.logger.debug("Validating Semantics...")
rv, msgs = validate_bondethernets(yaml) for v in self.validators:
if msgs: rv, msgs = v(yaml)
ret_msgs.extend(msgs) if msgs:
if not rv: ret_msgs.extend(msgs)
ret_rv = False if not rv:
ret_rv = False
rv, msgs = validate_interfaces(yaml)
if msgs:
ret_msgs.extend(msgs)
if not rv:
ret_rv = False
rv, msgs = validate_loopbacks(yaml)
if msgs:
ret_msgs.extend(msgs)
if not rv:
ret_rv = False
rv, msgs = validate_bridgedomains(yaml)
if msgs:
ret_msgs.extend(msgs)
if not rv:
ret_rv = False
rv, msgs = validate_vxlan_tunnels(yaml)
if msgs:
ret_msgs.extend(msgs)
if not rv:
ret_rv = False
rv, msgs = validate_taps(yaml)
if msgs:
ret_msgs.extend(msgs)
if not rv:
ret_rv = False
if ret_rv: if ret_rv:
self.logger.debug("Semantics correctly validated") self.logger.debug("Semantics correctly validated")
@ -162,3 +140,11 @@ class Validator(object):
self.logger.info("Configuration validated successfully") self.logger.info("Configuration validated successfully")
return True return True
def add_validator(self, func):
""" Add a validator function, which strictly takes the prototype
rv, msgs = func(yaml)
returning a Boolean success value in rv and a List of strings
in msgs. The function will be passed the configuration YAML and
gets to opine if it's valid or not. """
self.validators.append(func)

View File

@ -27,6 +27,14 @@ except ImportError:
print("ERROR: install argparse manually: sudo pip install argparse") print("ERROR: install argparse manually: sudo pip install argparse")
sys.exit(-2) sys.exit(-2)
def example_validator(yaml):
""" A simple example validator that takes the YAML configuration file as an input,
and returns a tuple of rv (return value, True is success), and a list of string
messages to the validation framework. """
rv = True
msgs = []
return rv, msgs
class YAMLTest(unittest.TestCase): class YAMLTest(unittest.TestCase):
def __init__(self, testName, yaml_filename, yaml_schema): def __init__(self, testName, yaml_filename, yaml_schema):