"""A provisioning spec file validator."""
import logging
import os
import pprint
from pathlib import Path
from typing import Any, List
from jsonschema.validators import validator_for
from mac_maker import config
from mac_maker.profile.spec_file.exceptions import SpecFileValidationError
from mac_maker.utilities.mixins.json_file import JSONFileReader
[docs]class SpecFileValidator(JSONFileReader):
"""Validator for spec file json content.
:param spec_file_json_content: The spec file content to validate.
"""
class Messages:
spec_invalid = 'SpecFileValidator: The loaded spec file is invalid!'
schema_definition = (
Path(os.path.dirname(__file__)).parent.parent / "schemas" /
"spec_file_v1.json"
)
def __init__(self, spec_file_json_content: Any) -> None:
self.log = logging.getLogger(config.LOGGER_NAME)
self.schema = self.load_json_file(self.schema_definition)
self.spec_file_json_content = spec_file_json_content
[docs] def validate(self) -> None:
"""Validate the loaded spec file.
:raises: :class:`SpecFileValidationError`
"""
errors = self._validate_with_schema(self.schema)
if errors:
self.log.error(self.Messages.spec_invalid)
formatted_errors = pprint.pformat(errors)
raise SpecFileValidationError(formatted_errors)
def _validate_with_schema(
self,
schema: Any,
) -> List[str]:
validator_class = validator_for(schema)
validator = validator_class(schema)
errors = []
for error in validator.iter_errors(self.spec_file_json_content):
errors.append(error.message)
return sorted(errors)