px4-firmware/Tools/validate_yaml.py

69 lines
1.9 KiB
Python
Executable File

#! /usr/bin/env python3
""" Script to validate YAML file(s) against a YAML schema file """
from __future__ import print_function
import argparse
import sys
try:
import yaml
except ImportError as e:
print("Failed to import yaml: " + str(e))
print("")
print("You may need to install it using:")
print(" pip3 install --user pyyaml")
print("")
sys.exit(1)
try:
import cerberus
except ImportError as e:
print("Failed to import cerberus: " + str(e))
print("")
print("You may need to install it using:")
print(" pip3 install --user cerberus")
print("")
sys.exit(1)
parser = argparse.ArgumentParser(description='Validate YAML file(s) against a schema')
parser.add_argument('yaml_file', nargs='+', help='YAML config file(s)')
parser.add_argument('--schema-file', type=str, action='store',
help='YAML schema file', required=True)
parser.add_argument('-v', '--verbose', dest='verbose', action='store_true',
help='Verbose Output')
args = parser.parse_args()
schema_file = args.schema_file
yaml_files = args.yaml_file
verbose = args.verbose
def load_yaml_file(file_name):
with open(file_name, 'r') as stream:
try:
return yaml.safe_load(stream)
except yaml.YAMLError as exc:
print(exc)
raise
# load the schema
schema = load_yaml_file(schema_file)
validator = cerberus.Validator(schema)
# validate yaml files
for yaml_file in yaml_files:
if verbose: print("Validating {:}".format(yaml_file))
document = load_yaml_file(yaml_file)
# ignore top-level entries prefixed with __
for key in list(document.keys()):
if key.startswith('__'): del document[key]
if not validator.validate(document):
print("Validation Errors:")
print(validator.errors)
print("")
raise Exception("Validation of {:} failed".format(yaml_file))