From 7287d396e2fa49739a28ce573d921c24f532caae Mon Sep 17 00:00:00 2001 From: Matt Martz Date: Mon, 26 Nov 2018 08:51:39 -0600 Subject: [PATCH] Prevent metadata changes in a stable branch (#48994) --- .../rst/dev_guide/testing_validate-modules.rst | 1 + test/sanity/validate-modules/main.py | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/docs/docsite/rst/dev_guide/testing_validate-modules.rst b/docs/docsite/rst/dev_guide/testing_validate-modules.rst index 1fe01f4c5ea..d2288f9f119 100644 --- a/docs/docsite/rst/dev_guide/testing_validate-modules.rst +++ b/docs/docsite/rst/dev_guide/testing_validate-modules.rst @@ -126,6 +126,7 @@ Errors 331 argument in argument_spec must be a dictionary/hash when used 332 ``AnsibleModule`` schema validation error 333 ``ANSIBLE_METADATA.status`` of deprecated or removed can't include other statuses + 334 ``ANSIBLE_METADATA`` cannot be changed in a point release for a stable branch .. --------- ------------------- diff --git a/test/sanity/validate-modules/main.py b/test/sanity/validate-modules/main.py index 885b0a12a9b..27a8d05ea9f 100755 --- a/test/sanity/validate-modules/main.py +++ b/test/sanity/validate-modules/main.py @@ -873,6 +873,7 @@ class ModuleValidator(Validator): filename_deprecated_or_removed = True # Have to check the metadata first so that we know if the module is removed or deprecated + metadata = None if not bool(doc_info['ANSIBLE_METADATA']['value']): self.reporter.error( path=self.object_path, @@ -880,7 +881,6 @@ class ModuleValidator(Validator): msg='No ANSIBLE_METADATA provided' ) else: - metadata = None if isinstance(doc_info['ANSIBLE_METADATA']['value'], ast.Dict): metadata = ast.literal_eval( doc_info['ANSIBLE_METADATA']['value'] @@ -998,7 +998,7 @@ class ModuleValidator(Validator): self._validate_docs_schema(doc, doc_schema(self.object_name.split('.')[0]), 'DOCUMENTATION', 305) self._check_version_added(doc) - self._check_for_new_args(doc) + self._check_for_new_args(doc, metadata) if not bool(doc_info['EXAMPLES']['value']): self.reporter.error( @@ -1309,13 +1309,13 @@ class ModuleValidator(Validator): msg='"%s" is listed in DOCUMENTATION.options, but not accepted by the module' % arg ) - def _check_for_new_args(self, doc): + def _check_for_new_args(self, doc, metadata): if not self.base_branch or self._is_new_module(): return with CaptureStd(): try: - existing_doc = get_docstring(self.base_module, fragment_loader, verbose=True)[0] + existing_doc, dummy_examples, dummy_return, existing_metadata = get_docstring(self.base_module, fragment_loader, verbose=True) existing_options = existing_doc.get('options', {}) or {} except AssertionError: fragment = doc['extends_documentation_fragment'] @@ -1346,6 +1346,14 @@ class ModuleValidator(Validator): except ValueError: mod_version_added = StrictVersion('0.0') + if self.base_branch and 'stable-' in self.base_branch: + if metadata != existing_metadata: + self.reporter.error( + path=self.object_path, + code=334, + msg=('ANSIBLE_METADATA cannot be changed in a point release for a stable branch') + ) + options = doc.get('options', {}) or {} should_be = '.'.join(ansible_version.split('.')[:2])