From 58a50370726bb05469f17ee745403b070e57b53e Mon Sep 17 00:00:00 2001 From: Sorin Sbarnea Date: Tue, 1 Nov 2022 14:12:57 +0000 Subject: [PATCH] Avoid running galaxy on offline mode (#180) --- .pre-commit-config.yaml | 3 ++- src/ansible_compat/runtime.py | 37 ++++++++++++++++++++--------------- test/test_runtime.py | 9 ++++++++- 3 files changed, 31 insertions(+), 18 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index bf9176e6..6dfbba4b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -85,13 +85,14 @@ repos: additional_dependencies: - cached_property - flaky + - jinja2 - packaging - pytest - pytest-mock - subprocess-tee>=0.3.5 - types-PyYAML - - types-pkg_resources - types-jsonschema>=4.4.9 + - types-pkg_resources - repo: https://github.com/pycqa/pylint rev: v2.15.3 hooks: diff --git a/src/ansible_compat/runtime.py b/src/ansible_compat/runtime.py index 37d3bd8d..a0b097ec 100644 --- a/src/ansible_compat/runtime.py +++ b/src/ansible_compat/runtime.py @@ -269,6 +269,7 @@ def install_collection_from_disk( force=True, ) + # pylint: disable=too-many-branches def install_requirements( self, requirement: str, retry: bool = False, offline: bool = False ) -> None: @@ -294,13 +295,14 @@ def install_requirements( if offline: _logger.warning( - "Offline mode ignored because `ansible-galaxy role install` command does not support it." + "Role installation skipped because `ansible-galaxy role install` command does not support an offline mode." ) - _logger.info("Running %s", " ".join(cmd)) - result = self.exec(cmd, retry=retry) - if result.returncode != 0: - _logger.error(result.stdout) - raise AnsibleCommandError(result) + else: + _logger.info("Running %s", " ".join(cmd)) + result = self.exec(cmd, retry=retry) + if result.returncode != 0: + _logger.error(result.stdout) + raise AnsibleCommandError(result) # Run galaxy collection install works on v2 requirements.yml if "collections" in reqs_yaml: @@ -311,22 +313,25 @@ def install_requirements( "install", "-v", ] + skip = False if offline: if self.version_in_range(upper="2.14"): _logger.warning( - "Offline mode ignored because it is not supported by ansible versions before 2.14." + "Collection install skipped because ansible versions before 2.14 do not support an offline mode." ) + skip = True else: cmd.append("--offline") - cmd.extend(["-r", requirement]) - if self.cache_dir: - cmd.extend(["-p", f"{self.cache_dir}/collections"]) - _logger.info("Running %s", " ".join(cmd)) - result = self.exec(cmd, retry=retry) - if result.returncode != 0: - _logger.error(result.stdout) - _logger.error(result.stderr) - raise AnsibleCommandError(result) + if not skip: + cmd.extend(["-r", requirement]) + if self.cache_dir: + cmd.extend(["-p", f"{self.cache_dir}/collections"]) + _logger.info("Running %s", " ".join(cmd)) + result = self.exec(cmd, retry=retry) + if result.returncode != 0: + _logger.error(result.stdout) + _logger.error(result.stderr) + raise AnsibleCommandError(result) def prepare_environment( # noqa: C901 self, diff --git a/test/test_runtime.py b/test/test_runtime.py index aa31ce89..15960843 100644 --- a/test/test_runtime.py +++ b/test/test_runtime.py @@ -662,7 +662,14 @@ def test_prepare_environment_offline_role() -> None: """Ensure that we can make use of offline roles.""" with remember_cwd("test/roles/acme.missing_deps"): runtime = Runtime(isolated=True) - with pytest.raises(AnsibleCommandError): + if runtime.version_in_range(lower="2.14"): + # starting with 2.14 we can properly fail because this role has + # some missing collections in its requirements. We pass the offline + # but install will fail because there are not really offline + # requirements. + with pytest.raises(AnsibleCommandError): + runtime.prepare_environment(install_local=True, offline=True) + else: runtime.prepare_environment(install_local=True, offline=True)