diff options
author | Frank A. Zdarsky <fzdarsky@redhat.com> | 2017-01-20 12:53:52 +0100 |
---|---|---|
committer | Frank A. Zdarsky <fzdarsky@redhat.com> | 2017-07-12 22:57:34 +0200 |
commit | 9ef9a7a92dc7af2a7d54affd68aaa37539296dd4 (patch) | |
tree | fda32c5c2bf1bca4cea722840dbead1db020be18 /os_net_config/cli.py | |
parent | 03d3a5dea1b70c62d585dd6de5e3f9c04345e58b (diff) |
Add schema-based config data validation
This patch adds a jsonschema for os-net-config's configuration data
and a library function to validate configuration data based on this
schema. Adding schema-based validation allows catching a larger class of
errors (typos, missing required parameters, etc.) for all devices
configurable through os-net-config.
The validation is run in the os-net-config CLI after loading the config
file. If the config file fails to validate, the current default is to
just log a warning and try to continue. By providing the new CLI option
'--exit-on-validation-errors', this can be changed to log an error and
exist instead.
This validation is meant to be reusable, for example for pre-deployment
validation of network environments (see change
Ic16ee0bc353c46f8fe512454176a07ee95347346). Packaging with os-net-config
makes it easier to keep object model and schema in sync.
Change-Id: Ie4a905863b2d46c88d9cd6c3afc50e7d0a877090
Signed-off-by: Frank A. Zdarsky <fzdarsky@redhat.com>
Diffstat (limited to 'os_net_config/cli.py')
-rw-r--r-- | os_net_config/cli.py | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/os_net_config/cli.py b/os_net_config/cli.py index 479b3a3..341dcdd 100644 --- a/os_net_config/cli.py +++ b/os_net_config/cli.py @@ -25,6 +25,7 @@ from os_net_config import impl_eni from os_net_config import impl_ifcfg from os_net_config import impl_iproute from os_net_config import objects +from os_net_config import validator from os_net_config import version @@ -55,6 +56,14 @@ def parse_opts(argv): """that files were modified.""" """Disabled by default.""", default=False) + + parser.add_argument( + '--exit-on-validation-errors', + action='store_true', + help="Exit with an error if configuration file validation fails. " + "Without this option, just log a warning and continue.", + default=False) + parser.add_argument( '-d', '--debug', dest="debug", @@ -181,6 +190,16 @@ def main(argv=sys.argv): for iface_json in iface_array: iface_json.update({'nic_mapping': iface_mapping}) iface_json.update({'persist_mapping': persist_mapping}) + + validation_errors = validator.validate_config(iface_array) + if validation_errors: + if opts.exit_on_validation_errors: + logger.error('\n'.join(validation_errors)) + return 1 + else: + logger.warning('\n'.join(validation_errors)) + + for iface_json in iface_array: obj = objects.object_from_json(iface_json) provider.add_object(obj) files_changed = provider.apply(cleanup=opts.cleanup, |