From 1c6afd4f64c4498ce98a759a8f7e74f8f27bd06b Mon Sep 17 00:00:00 2001 From: Fabricio Aguiar Date: Tue, 27 Apr 2021 17:04:40 -0300 Subject: [PATCH] Fix requirements.yml parser for pinned collection version https://pulp.plan.io/issues/8627 closes #8627 (cherry picked from commit 84e1c2244eea744c74d2b34b1b789d9786a0afc5) --- CHANGES/8627.bugfix | 1 + pulp_ansible/app/tasks/collections.py | 12 +++++- .../functional/api/collection/v2/test_sync.py | 38 ++++++++++++++++++- .../api/collection/v3/test_serializers.py | 3 +- 4 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 CHANGES/8627.bugfix diff --git a/CHANGES/8627.bugfix b/CHANGES/8627.bugfix new file mode 100644 index 000000000..3e19f4137 --- /dev/null +++ b/CHANGES/8627.bugfix @@ -0,0 +1 @@ +Fix requirements.yml parser for pinned collection version diff --git a/pulp_ansible/app/tasks/collections.py b/pulp_ansible/app/tasks/collections.py index 91b693eee..81d2e8e03 100644 --- a/pulp_ansible/app/tasks/collections.py +++ b/pulp_ansible/app/tasks/collections.py @@ -535,7 +535,17 @@ async def _fetch_collection_metadata(self, requirements_entry): if requirements_entry.version == "*": requirement_version = Requirement.parse("collection") else: - requirement_version = Requirement.parse(f"collection{requirements_entry.version}") + # We need specifiers to enforce Requirement object criteria + # https://setuptools.readthedocs.io/en/latest/pkg_resources.html#requirements-parsing + # https://setuptools.readthedocs.io/en/latest/pkg_resources.html#requirement-methods-and-attributes + # If requirements_entry.version is a valid version, adds == specifier to the requirement + try: + Version(requirements_entry.version) + req_to_parse = f"collection=={requirements_entry.version}" + except ValueError: + req_to_parse = f"collection{requirements_entry.version}" + + requirement_version = Requirement.parse(req_to_parse) namespace, name = requirements_entry.name.split(".") diff --git a/pulp_ansible/tests/functional/api/collection/v2/test_sync.py b/pulp_ansible/tests/functional/api/collection/v2/test_sync.py index 27d48b8e3..b12e790f9 100644 --- a/pulp_ansible/tests/functional/api/collection/v2/test_sync.py +++ b/pulp_ansible/tests/functional/api/collection/v2/test_sync.py @@ -43,6 +43,40 @@ def test_sync_with_slash(self): content = self.cv_api.list(repository_version=f"{repo.pulp_href}versions/1/") self.assertEqual(len(content.results), 1) + def test_sync_with_specific_version(self): + """Sync with simple requirements file, expected to download one CollectionVersion.""" + body = gen_ansible_remote( + url="https://galaxy.ansible.com", + requirements_file="collections:\n - name: arista.avd\n version: 2.0.0", + sync_dependencies=False, + ) + remote = self.remote_collection_api.create(body) + self.addCleanup(self.remote_collection_api.delete, remote.pulp_href) + + repo = self._create_repo_and_sync_with_remote(remote) + distribution = self._create_distribution_from_repo(repo) + + versions = self.collections_versions_v3api.list("avd", "arista", distribution.base_path) + + self.assertEqual(versions.meta.count, 1) + + def test_sync_all_versions(self): + """Sync with simple requirements file, expected to download CollectionVersion.""" + body = gen_ansible_remote( + url="https://galaxy.ansible.com", + requirements_file="collections:\n - name: arista.avd", + sync_dependencies=False, + ) + remote = self.remote_collection_api.create(body) + self.addCleanup(self.remote_collection_api.delete, remote.pulp_href) + + repo = self._create_repo_and_sync_with_remote(remote) + distribution = self._create_distribution_from_repo(repo) + + versions = self.collections_versions_v3api.list("avd", "arista", distribution.base_path) + + self.assertGreater(versions.meta.count, 1) + def test_sync_with_attached_remote(self): """Sync with a CollectionRemote attached to the repository.""" body = gen_ansible_remote( @@ -141,9 +175,9 @@ def test_sync_with_two_equality_entries_on_different_lines(self): "---\n" "collections:\n" "- name: robertdebock.ansible_development_environment\n" - ' version: "==1.0.1"\n' + ' version: "1.0.1"\n' "- name: robertdebock.ansible_development_environment\n" - ' version: "==1.0.0"\n' + ' version: "1.0.0"\n' ) body = gen_ansible_remote( url="https://galaxy.ansible.com", diff --git a/pulp_ansible/tests/functional/api/collection/v3/test_serializers.py b/pulp_ansible/tests/functional/api/collection/v3/test_serializers.py index 9648f17f6..eb521d147 100644 --- a/pulp_ansible/tests/functional/api/collection/v3/test_serializers.py +++ b/pulp_ansible/tests/functional/api/collection/v3/test_serializers.py @@ -70,7 +70,8 @@ def test_v3_collection_version_from_synced_data(self): """Test Collection Versions V3 endpoint fields.""" body = gen_ansible_remote( url="https://galaxy.ansible.com", - requirements_file="collections:\n - name: cisco.nxos\n version: ==1.4.0", + requirements_file="collections:\n - name: cisco.nxos\n version: 1.4.0", + sync_dependencies=False, ) remote = self.remote_collection_api.create(body)