Source code for canarieapi.schema
# -- Standard lib ------------------------------------------------------------
import copy
import json
import logging
import os
# -- 3rd party ---------------------------------------------------------------
import jsonschema
# -- Project specific --------------------------------------------------------
from canarieapi.app_object import APP
from canarieapi.logparser import parse_log
from canarieapi.monitoring import monitor
# The schema that must be respected by the config
with open(os.path.join(os.path.dirname(__file__), "schema.json"), mode="r", encoding="utf-8") as schema_file:
[docs] CONFIGURATION_SCHEMA = json.load(schema_file)
[docs]def validate_config_schema(update_db: bool, run_jobs: bool = True) -> None:
config = APP.config
logger: logging.Logger = APP.logger
logger.info("Testing configuration...")
configuration_schema = copy.deepcopy(CONFIGURATION_SCHEMA)
if config.get("PARSE_LOGS", True):
configuration_schema["definitions"]["service_description_schema"]["required"].append("stats")
configuration_schema["definitions"]["platform_description_schema"]["required"].append("stats")
try:
jsonschema.validate(config, configuration_schema)
except jsonschema.ValidationError as exc:
raise jsonschema.ValidationError(f"The configuration is invalid : {exc!s}")
if run_jobs:
monitor(update_db=update_db)
if config.get("PARSE_LOGS", True):
access_log_fn = config["DATABASE"]["access_log"]
route_invocations = {}
file_checked = 0
try:
route_stats = parse_log(access_log_fn)
except IOError:
logger.warning("Unable to read logs from %s", access_log_fn)
else:
for route, value in route_stats.items():
route_invocations[route] = route_invocations.get(route, 0) + value["count"]
for route, invocs in route_invocations.items():
if invocs > 0:
logger.info("Found %s invocations to route %s in %s log files", invocs, route, file_checked)
else:
logger.warning("Found no invocations to route %s in %s log files", route, file_checked)
if not route_invocations:
logger.warning("Found no invocations at all in %s log files", file_checked)
logger.info("Tests completed!")