From 7ab10a9c9a85f4da631e01dd1b82a7214fe3bdf5 Mon Sep 17 00:00:00 2001 From: Sorin Sbarnea Date: Sat, 20 Feb 2021 11:15:56 +0000 Subject: [PATCH] Add ability to install v1 requiremets.yml Fixes: #1376 --- examples/reqs_v1/requirements.yml | 2 ++ examples/reqs_v2/requirements.yml | 5 ++++ src/ansiblelint/_prerun.py | 48 +++++++++++++++++------------- src/ansiblelint/rules/RoleNames.py | 2 +- test/test_prerun.py | 30 +++++++++++++++++++ 5 files changed, 65 insertions(+), 22 deletions(-) create mode 100644 examples/reqs_v1/requirements.yml create mode 100644 examples/reqs_v2/requirements.yml create mode 100644 test/test_prerun.py diff --git a/examples/reqs_v1/requirements.yml b/examples/reqs_v1/requirements.yml new file mode 100644 index 0000000000..e9c7041560 --- /dev/null +++ b/examples/reqs_v1/requirements.yml @@ -0,0 +1,2 @@ +# v1 requirements test file +- src: geerlingguy.mysql diff --git a/examples/reqs_v2/requirements.yml b/examples/reqs_v2/requirements.yml new file mode 100644 index 0000000000..e8a836c501 --- /dev/null +++ b/examples/reqs_v2/requirements.yml @@ -0,0 +1,5 @@ +--- +roles: + - name: geerlingguy.mysql +collections: + - name: ssbarnea.molecule diff --git a/src/ansiblelint/_prerun.py b/src/ansiblelint/_prerun.py index ad7adde2cb..21427ba8bb 100644 --- a/src/ansiblelint/_prerun.py +++ b/src/ansiblelint/_prerun.py @@ -102,6 +102,7 @@ def prepare_environment() -> None: cmd = [ "ansible-galaxy", + "role", "install", "--roles-path", ".cache/roles", @@ -115,31 +116,36 @@ def prepare_environment() -> None: universal_newlines=True, check=False, stdout=subprocess.PIPE, - stderr=subprocess.PIPE, + stderr=subprocess.STDOUT, ) if run.returncode != 0: + print(run.stdout, file=sys.stderr) sys.exit(run.returncode) - cmd = [ - "ansible-galaxy", - "collection", - "install", - "-p", - ".cache/collections", - "-vr", - "requirements.yml", - ] - - print("Running %s" % " ".join(cmd)) - run = subprocess.run( - cmd, - universal_newlines=True, - check=False, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - ) - if run.returncode != 0: - sys.exit(run.returncode) + # Run galaxy collection install works on v2 requirements.yml + if "collections" in yaml_from_file("requirements.yml"): + + cmd = [ + "ansible-galaxy", + "collection", + "install", + "-p", + ".cache/collections", + "-vr", + "requirements.yml", + ] + + print("Running %s" % " ".join(cmd)) + run = subprocess.run( + cmd, + universal_newlines=True, + check=False, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + ) + if run.returncode != 0: + print(run.stdout, file=sys.stderr) + sys.exit(run.returncode) _install_galaxy_role() _perform_mockings() diff --git a/src/ansiblelint/rules/RoleNames.py b/src/ansiblelint/rules/RoleNames.py index f3e90b228f..4abc3860ee 100644 --- a/src/ansiblelint/rules/RoleNames.py +++ b/src/ansiblelint/rules/RoleNames.py @@ -76,7 +76,7 @@ def matchyaml(self, file: Lintable) -> List["MatchError"]: role_name = _remove_prefix(role_name, "ansible-role-") if role_name not in self.done: self.done.append(role_name) - if not self._re.match(role_name): + if role_name and not self._re.match(role_name): result.append( self.create_matcherror( filename=str(file.path), diff --git a/test/test_prerun.py b/test/test_prerun.py new file mode 100644 index 0000000000..6786c48141 --- /dev/null +++ b/test/test_prerun.py @@ -0,0 +1,30 @@ +"""Tests related to prerun part of the linter.""" +import os + +from ansiblelint.testing import run_ansible_lint + + +def test_prerun_reqs_v1() -> None: + """Checks that the linter can auto-install requirements v1 when found.""" + cwd = os.path.realpath( + os.path.join( + os.path.dirname(os.path.realpath(__file__)), "..", "examples", "reqs_v1" + ) + ) + result = run_ansible_lint(".", cwd=cwd) + assert "Running ansible-galaxy role install" in result.stdout + assert "Running ansible-galaxy collection install" not in result.stdout + assert result.returncode == 0 + + +def test_prerun_reqs_v2() -> None: + """Checks that the linter can auto-install requirements v2 when found.""" + cwd = os.path.realpath( + os.path.join( + os.path.dirname(os.path.realpath(__file__)), "..", "examples", "reqs_v2" + ) + ) + result = run_ansible_lint(".", cwd=cwd) + assert "Running ansible-galaxy role install" in result.stdout + assert "Running ansible-galaxy collection install" in result.stdout + assert result.returncode == 0