From: Alfredo Deza Date: Fri, 23 Mar 2018 13:57:28 +0000 (-0400) Subject: plugins create an action plugin for validation using notario X-Git-Tag: v3.2.0beta1~129 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=36dc7c7862fd081085299c37ec33e5dcece2a2e0;p=ceph-ansible.git plugins create an action plugin for validation using notario Signed-off-by: Alfredo Deza --- diff --git a/plugins/actions/validate.py b/plugins/actions/validate.py new file mode 100644 index 000000000..f0b45ef2a --- /dev/null +++ b/plugins/actions/validate.py @@ -0,0 +1,53 @@ +import sys +import os + +from ansible.plugins.action import ActionBase + +import notario +from notario.exceptions import Invalid +from notario.decorators import optional +from notario.validators import types, recursive + +try: + from __main__ import display +except ImportError: + from ansible.utils.display import Display + display = Display() + + +class ActionModule(ActionBase): + + def run(self, tmp=None, task_vars=None): + # we must use hostvars, since task_vars will have un-processed variables + hostvars = task_vars['hostvars'] + mode = self._task.args.get('mode', 'permissive') + + self._supports_check_mode = False # XXX ? + self._supports_async = True + + result = {} + result['_ansible_verbose_always'] = True + + for host, _vars in hostvars.items(): + try: + notario.validate(_vars, variables, defined_keys=True) + except Invalid as error: + display.vvvv("Notario Failure: %s" % str(error)) + display.warning("[%s] Validation failed for variable: %s" % (host, error.path[-2])) + msg = "Invalid variable assignment in host: %s\n" % host + msg += " %s = %s\n" % (error.path[-2], error.path[-1]) + msg += " %s %s\n" % (" "*len(str(error.path[-2])), "^" *len(str(error.path[-1]))) + msg += "Reason: %s" % error.reason + result['failed'] = mode == 'strict' + result['msg'] = msg + result['stderr_lines'] = msg.split('\n') + + return result + +# Schemas + +variables = ( + ('ceph_conf_key_directory', types.boolean), + (optional("nfs_file_gw"), types.boolean), + (optional("osd_containerized_deployment"), types.boolean), +)