import json import jsonschema CONFIG_SCHEMA = { "$schema": "http://json-schema.org/draft-07/schema#", "definitions": { "database_credentials": { "type": "object", "properties": { "hostname": {"type": "string"}, "dbname": {"type": "string"}, "username": {"type": "string"}, "password": {"type": "string"} }, "required": ["hostname", "dbname", "username", "password"], "additionalProperties": False }, "timeout": { "type": "number", "maximum": 10, # sanity "exclusiveMinimum": 0 } }, "type": "object", "properties": { "ops-db": {"$ref": "#/definitions/database_credentials"}, "ssh": { "type": "object", "properties": { "username": {"type": "string"}, "private-key": {"type": "string"}, "known-hosts": {"type": "string"} }, "required": ["private-key", "known-hosts"], "additionalProperties": False }, "redis": { "type": "object", "properties": { "hostname": {"type": "string"}, "port": {"type": "integer"}, "socket_timeout": {"$ref": "#/definitions/timeout"} }, "required": ["hostname", "port"], "additionalProperties": False }, "sentinel": { "type": "object", "properties": { "hostname": {"type": "string"}, "port": {"type": "integer"}, "name": {"type": "string"}, "redis_socket_timeout": {"$ref": "#/definitions/timeout"}, "sentinel_socket_timeout": {"$ref": "#/definitions/timeout"} }, "required": ["hostname", "port", "name"], "additionalProperties": False }, "redis-databases": { "type": "array", "minItems": 1, "items": {"type": "integer"} }, "junosspace": { "api": {"type": "string"}, "username": {"type": "string"}, "password": {"type": "string"} }, "otrs-export": { "username": {"type": "string"}, "private-key": {"type": "string"}, "destination": {"type": "string"}, "known-hosts": {"type": "string"} }, "ims": { "api": {"type": "string"}, "username": {"type": "string"}, "password": {"type": "string"} } }, "oneOf": [ { "required": [ "ops-db", "ssh", "redis", "redis-databases", "junosspace", "otrs-export", "ims"] }, { "required": [ "ops-db", "ssh", "sentinel", "redis-databases", "junosspace", "otrs-export", "ims"] } ], "additionalProperties": False } def load(f): """ loads, validates and returns configuration parameters :param f: file-like object that produces the config file :return: """ config = json.loads(f.read()) jsonschema.validate(config, CONFIG_SCHEMA) return config