runtime-metadata sanity test: ensure redirects are FQCRs (#78802)

* Ensure that meta/runtime.yml redirects are FQCRs.

* Avoid crash when YAML errors without context mark happen, for example if file starts with 'foo---' instead of '---'.
pull/78874/head
Felix Fontein 2 years ago committed by GitHub
parent 964e2bc6fe
commit 50dae8087e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -0,0 +1,4 @@
minor_changes:
- "ansible-test runtime-metadata sanity test - ensure that ``redirect`` entries in ``meta/runtime.yml`` contain collection names, except for ``module_utils`` plugin redirects and ``import_redirect`` redirects (https://github.com/ansible/ansible/pull/78802)."
bugfixes:
- "ansible-test runtime-metadata sanity test - do not crash on YAML parsing errors without a context mark (https://github.com/ansible/ansible/pull/78802)."

@ -2,4 +2,11 @@ requires_ansible: '>=2.11' # force ansible-doc to check the Ansible version (re
plugin_routing:
modules:
hi:
redirect: hello
redirect: ns.col2.hello
hiya:
redirect: ns.col2.package.subdir.hiya
module_utils:
hi:
redirect: ansible_collections.ns.col2.plugins.module_utils
hello:
redirect: ns.col2.hiya

@ -16,9 +16,19 @@ from voluptuous.humanize import humanize_error
from ansible.module_utils.compat.version import StrictVersion, LooseVersion
from ansible.module_utils.six import string_types
from ansible.utils.collection_loader import AnsibleCollectionRef
from ansible.utils.version import SemanticVersion
def fqcr(value):
"""Validate a FQCR."""
if not isinstance(value, string_types):
raise Invalid('Must be a string that is a FQCR')
if not AnsibleCollectionRef.is_valid_fqcr(value):
raise Invalid('Must be a FQCR')
return value
def isodate(value, check_deprecation_date=False, is_tombstone=False):
"""Validate a datetime.date or ISO 8601 date string."""
# datetime.date objects come from YAML dates, these are ok
@ -126,12 +136,15 @@ def validate_metadata_file(path, is_ansible, check_deprecation_dates=False):
with open(path, 'r', encoding='utf-8') as f_path:
routing = yaml.safe_load(f_path)
except yaml.error.MarkedYAMLError as ex:
print('%s:%d:%d: YAML load failed: %s' % (path, ex.context_mark.line +
1, ex.context_mark.column + 1, re.sub(r'\s+', ' ', str(ex))))
print('%s:%d:%d: YAML load failed: %s' % (
path,
ex.context_mark.line + 1 if ex.context_mark else 0,
ex.context_mark.column + 1 if ex.context_mark else 0,
re.sub(r'\s+', ' ', str(ex)),
))
return
except Exception as ex: # pylint: disable=broad-except
print('%s:%d:%d: YAML load failed: %s' %
(path, 0, 0, re.sub(r'\s+', ' ', str(ex))))
print('%s:%d:%d: YAML load failed: %s' % (path, 0, 0, re.sub(r'\s+', ' ', str(ex))))
return
if is_ansible:
@ -185,6 +198,15 @@ def validate_metadata_file(path, is_ansible, check_deprecation_dates=False):
)
plugin_routing_schema = Any(
Schema({
('deprecation'): Any(deprecation_schema),
('tombstone'): Any(tombstoning_schema),
('redirect'): fqcr,
}, extra=PREVENT_EXTRA),
)
# Adjusted schema for module_utils
plugin_routing_schema_mu = Any(
Schema({
('deprecation'): Any(deprecation_schema),
('tombstone'): Any(tombstoning_schema),
@ -195,6 +217,9 @@ def validate_metadata_file(path, is_ansible, check_deprecation_dates=False):
list_dict_plugin_routing_schema = [{str_type: plugin_routing_schema}
for str_type in string_types]
list_dict_plugin_routing_schema_mu = [{str_type: plugin_routing_schema_mu}
for str_type in string_types]
plugin_schema = Schema({
('action'): Any(None, *list_dict_plugin_routing_schema),
('become'): Any(None, *list_dict_plugin_routing_schema),
@ -207,7 +232,7 @@ def validate_metadata_file(path, is_ansible, check_deprecation_dates=False):
('httpapi'): Any(None, *list_dict_plugin_routing_schema),
('inventory'): Any(None, *list_dict_plugin_routing_schema),
('lookup'): Any(None, *list_dict_plugin_routing_schema),
('module_utils'): Any(None, *list_dict_plugin_routing_schema),
('module_utils'): Any(None, *list_dict_plugin_routing_schema_mu),
('modules'): Any(None, *list_dict_plugin_routing_schema),
('netconf'): Any(None, *list_dict_plugin_routing_schema),
('shell'): Any(None, *list_dict_plugin_routing_schema),

Loading…
Cancel
Save