blob: 1a8217976f6579c612422290b3be43e7330ffbae [file] [log] [blame]
# Import python libs
import logging
import glob
import os
import yaml
# Import salt modules
import salt.client
# Import third party libs
from jsonschema import validate
from jsonschema.validators import validator_for
from jsonschema.exceptions import SchemaError
__virtualname__ = 'modelschema'
LOG = logging.getLogger(__name__)
BASE_DIR = '/usr/share/salt-formulas/env/_formulas'
def _get_schemas():
'''
Method will return all known schemas.
'''
output = {}
schemas = glob.glob('{}/*/schemas/*.yaml'.format(BASE_DIR))
for schema in schemas:
if os.path.exists(schema):
filename = schema.split('/')[-1].replace('.yaml', '')
service_name, role_name = filename.split('-')
if service_name not in output:
output[service_name] = {}
with open(schema, 'r') as stream:
try:
data = yaml.load(stream)
except yaml.YAMLError as exc:
data = None
LOG.error(exc)
output[service_name][role_name] = data
return output
def validate_node_model(target, service, role):
'''
Validates pillar by schema for given given minion, service and role.
If no service and role is specified, method will validate all
defined services on minion.
CLI Example:
.. code-block:: bash
salt-run modelschema.validate_node_model
'''
client = salt.client.LocalClient(__opts__['conf_file'])
schema = _get_schemas()[service][role]
result = {}
validator = validator_for(schema)
try:
validator.check_schema(schema)
except SchemaError as exception:
LOG.error(exception)
return result
minions = client.cmd(target, 'pillar.data', timeout=1)
for minion, pillar in minions.items():
model = pillar[service][role]
validation_result = validator(schema).validate(model)
result[minion] = validation_result
return result