| |
| # 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 |