]> git.apps.os.sepia.ceph.com Git - ceph-ansible.git/commitdiff
plugins create an action plugin for validation using notario
authorAlfredo Deza <adeza@redhat.com>
Fri, 23 Mar 2018 13:57:28 +0000 (09:57 -0400)
committerGuillaume Abrioux <gabrioux@redhat.com>
Fri, 18 May 2018 15:58:24 +0000 (17:58 +0200)
Signed-off-by: Alfredo Deza <adeza@redhat.com>
plugins/actions/validate.py [new file with mode: 0644]

diff --git a/plugins/actions/validate.py b/plugins/actions/validate.py
new file mode 100644 (file)
index 0000000..f0b45ef
--- /dev/null
@@ -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),
+)