summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Martz <matt@sivel.net>2018-11-26 14:34:13 -0600
committerAlicia Cozine <879121+acozine@users.noreply.github.com>2018-11-26 14:34:13 -0600
commitedae7b0524e4be11591562fa28b1d635b9c4028e (patch)
tree5c45746b3206b45847a628d9af7e51067a2f78aa
parent47d52541a6838793ad92572f2a34dce5158fb37d (diff)
downloadansible-edae7b0524e4be11591562fa28b1d635b9c4028e.tar.gz
[stable-2.7] Prevent metadata changes in a stable branch (#48994) (#49131)
* [stable-2.7] Prevent metadata changes in a stable branch (#48994) (cherry picked from commit 7287d39) Co-authored-by: Matt Martz <matt@sivel.net> * Fix metadata comparison
-rw-r--r--docs/docsite/rst/dev_guide/testing_validate-modules.rst1
-rwxr-xr-xtest/sanity/validate-modules/main.py18
2 files changed, 15 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 1fe01f4c5e..d2288f9f11 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 1eb35f7631..fe9fd2e328 100755
--- a/test/sanity/validate-modules/main.py
+++ b/test/sanity/validate-modules/main.py
@@ -846,6 +846,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,
@@ -853,7 +854,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']
@@ -971,7 +971,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(
@@ -1286,13 +1286,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']
@@ -1323,6 +1323,16 @@ class ModuleValidator(Validator):
except ValueError:
mod_version_added = StrictVersion('0.0')
+ if self.base_branch and 'stable-' in self.base_branch:
+ metadata.pop('metadata_version', None)
+ metadata.pop('version', None)
+ 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])