generated from ansible-collections/collection_template
-
Notifications
You must be signed in to change notification settings - Fork 80
/
Copy pathvalidate.py
152 lines (129 loc) · 5.73 KB
/
validate.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
# -*- coding: utf-8 -*-
# Copyright 2020 Red Hat
# GNU General Public License v3.0+
# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import absolute_import, division, print_function
__metaclass__ = type
DOCUMENTATION = """
name: validate
author: Ganesh Nalawade (@ganeshrn)
version_added: "1.0.0"
short_description: Validate data with provided criteria
description:
- Validate I(data) with provided I(criteria) based on the validation I(engine).
options:
data:
type: raw
description:
- A data that will be validated against I(criteria).
- This option represents the value that is passed to test plugin as check.
For example C(config_data is ansible.utils.validate(criteria=criteria), in this case B(config_data)
represents this option.
- For the type of I(data) that represents this value refer documentation of individual validate plugins.
required: True
criteria:
type: raw
description:
- The criteria used for validation of value that represents I(data) options.
- This option is passed to the test plugin as key, value pair
For example C(config_data is ansible.utils.validate(criteria=criteria)), in
this case the value of I(criteria) key represents this criteria for data validation.
- For the type of I(criteria) that represents this value refer documentation of individual validate plugins.
required: True
engine:
type: str
description:
- The name of the validate plugin to use.
- This option can be passed in test plugin as a key, value pair
For example C(config_data is ansible.utils.validate(engine='ansible.utils.jsonschema', criteria=criteria)), in
this case the value of I(engine) key represents the engine to be use for data validation.
If the value is not provided the default value that is C(ansible.utils.jsonschema) will be used.
- The value should be in fully qualified collection name format that is
B(<org-name>.<collection-name>.<validate-plugin-name>).
default: ansible.utils.jsonschema
notes:
- For the type of options I(data) and I(criteria) refer the individual validate plugin
documentation that is represented in the value of I(engine) option.
- For additional plugin configuration options refer the individual validate plugin
documentation that is represented by the value of I(engine) option.
- The plugin configuration option can be either passed as C(key=value) pairs within test plugin
or set as environment variables.
- The precedence the validate plugin configurable option is the variable passed within test plugin
as C(key=value) pairs followed by task variables followed by environment variables.
"""
EXAMPLES = r"""
- name: set facts for data and criteria
ansible.builtin.set_fact:
data: "{{ lookup('ansible.builtin.file', './validate/data/show_interfaces_iosxr.json')}}"
criteria: "{{ lookup('ansible.builtin.file', './validate/criteria/jsonschema/show_interfaces_iosxr.json')}}"
- name: validate data in json format using jsonschema with test plugin
ansible.builtin.set_fact:
is_data_valid: "{{ data is ansible.utils.validate(engine='ansible.utils.jsonschema', criteria=criteria, draft='draft7') }}"
"""
RETURN = """
_raw:
description:
- If data is valid return C(true)
- If data is invalid return C(false)
"""
from ansible.errors import AnsibleError
from ansible.module_utils._text import to_text
from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
check_argspec,
)
from ansible_collections.ansible.utils.plugins.module_utils.common.utils import to_list
from ansible_collections.ansible.utils.plugins.plugin_utils.base.validate import _load_validator
ARGSPEC_CONDITIONALS = {}
def validate(*args, **kwargs):
if not len(args):
raise AnsibleError(
"Missing either 'data' value in test plugin input,"
"refer ansible.utils.validate test plugin documentation for details",
)
params = {"data": args[0]}
for item in ["engine", "criteria"]:
if kwargs.get(item):
params.update({item: kwargs[item]})
valid, argspec_result, updated_params = check_argspec(
DOCUMENTATION,
"validate test",
schema_conditionals=ARGSPEC_CONDITIONALS,
**params,
)
if not valid:
raise AnsibleError(
"{argspec_result} with errors: {argspec_errors}".format(
argspec_result=argspec_result.get("msg"),
argspec_errors=argspec_result.get("errors"),
),
)
validator_engine, validator_result = _load_validator(
engine=updated_params["engine"],
data=updated_params["data"],
criteria=updated_params["criteria"],
kwargs=kwargs,
)
if validator_result.get("failed"):
raise AnsibleError(
"validate lookup plugin failed with errors: %s" % validator_result.get("msg"),
)
try:
result = validator_engine.validate()
except AnsibleError as exc:
raise AnsibleError(to_text(exc, errors="surrogate_then_replace"))
except Exception as exc:
raise AnsibleError(
"Unhandled exception from validator '{validator}'. Error: {err}".format(
validator=updated_params["engine"],
err=to_text(exc, errors="surrogate_then_replace"),
),
)
errors = to_list(result.get("errors", []))
if len(errors):
return False
return True
class TestModule(object):
"""data validation test"""
test_map = {"validate": validate}
def tests(self):
return self.test_map