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:
@ -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)
|
||||||
|
8
tests.py
8
tests.py
@ -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):
|
||||||
|
Reference in New Issue
Block a user