import json import logging import re 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 } }, "type": "object", "properties": { "alarms-db": {"$ref": "#/definitions/database_credentials"}, "ops-db": {"$ref": "#/definitions/database_credentials"}, "oid_list.conf": {"type": "string"}, "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"} }, "required": ["hostname", "port"], "additionalProperties": False }, "junosspace": { "api": {"type": "string"}, "username": {"type": "string"}, "password": {"type": "string"} }, "infinera-dna": { "type": "array", "items": { "type": "object", "properties": { "name": {"type": "string"}, "address": {"type": "string"} }, "required": ["name", "address"], "additionalProperties": False } }, "coriant-tnms": { "type": "array", "items": { "type": "object", "properties": { "name": {"type": "string"}, "address": {"type": "string"} }, "required": ["name", "address"], "additionalProperties": False } } }, "required": [ "alarms-db", "ops-db", "oid_list.conf", "ssh", "redis", "junosspace", "infinera-dna", "coriant-tnms"], "additionalProperties": False } def _load_oids(config_file): """ :param config_file: file-like object :return: """ result = {} for line in config_file: m = re.match(r'^([^=]+)=(.*)\s*$', line) if m: result[m.group(1)] = m.group(2) return result # def _load_routers(config_file): # """ # :param config_file: file-like object # :return: # """ # for line in config_file: # m = re.match( # r'^([a-z\d]+\.[a-z\d]{3,4}\.[a-z\d]{2}' # r'\.(geant|eumedconnect)\d*\.net)\s*=([^,]+)\s*,(.*)\s*$', # line) # if not m: # logging.warning("malformed config file line: '%s'" % line.strip()) # continue # yield { # "hostname": m.group(1), # "community": m.group(3), # "address": m.group(4) # } 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) with open(config["oid_list.conf"]) as f: config["oids"] = _load_oids(f) # with open(config["routers_community.conf"]) as f: # config["routers"] = list(_load_routers(f)) return config