From 32508158178f04681ee18b40e9fbc1e1ed53fe28 Mon Sep 17 00:00:00 2001 From: Gerrod Ubben Date: Wed, 12 Oct 2022 16:18:39 -0400 Subject: [PATCH] Ensure collection deletion is done in one repository version fixes: #1274 Required PR: https://github.com/pulp/pulpcore/pull/3300 --- CHANGES/1274.bugfix | 1 + pulp_ansible/app/tasks/deletion.py | 22 +++++++++++-------- .../api/collection/v3/test_deletion.py | 3 ++- 3 files changed, 16 insertions(+), 10 deletions(-) create mode 100644 CHANGES/1274.bugfix diff --git a/CHANGES/1274.bugfix b/CHANGES/1274.bugfix new file mode 100644 index 000000000..160c40d80 --- /dev/null +++ b/CHANGES/1274.bugfix @@ -0,0 +1 @@ +Fixed unnecessary creation of intermediate repository versions when performing a collection delete. diff --git a/pulp_ansible/app/tasks/deletion.py b/pulp_ansible/app/tasks/deletion.py index 63ec7d4b2..c664dbc1e 100644 --- a/pulp_ansible/app/tasks/deletion.py +++ b/pulp_ansible/app/tasks/deletion.py @@ -14,6 +14,7 @@ """ import logging +from collections import defaultdict from pulp_ansible.app.models import Collection, CollectionVersion from pulpcore.plugin.tasking import add_and_remove, orphan_cleanup @@ -27,10 +28,14 @@ def _cleanup_old_versions(repo): version.delete() -def _remove_collection_version_from_repos(collection_version): - """Remove CollectionVersion from latest RepositoryVersion of each repo.""" - for repo in collection_version.repositories.all(): - add_and_remove(repo.pk, add_content_units=[], remove_content_units=[collection_version.pk]) +def _remove_collection_version_from_repos(collection_versions): + """Remove CollectionVersions from latest RepositoryVersion of each repo.""" + repos_with_collections_to_delete = defaultdict(list) + for collection_version in collection_versions: + for repo in collection_version.repositories.all(): + repos_with_collections_to_delete[repo].append(collection_version.pk) + for repo, collections in repos_with_collections_to_delete.items(): + add_and_remove(repo.pk, add_content_units=[], remove_content_units=collections) _cleanup_old_versions(repo) @@ -45,7 +50,7 @@ def delete_collection_version(collection_version_pk): collection_version = CollectionVersion.objects.get(pk=collection_version_pk) collection = collection_version.collection - _remove_collection_version_from_repos(collection_version) + _remove_collection_version_from_repos([collection_version]) log.info("Running orphan_cleanup to delete CollectionVersion object and artifact") # Running orphan_protection_time=0 should be safe since we're specifying the content @@ -67,10 +72,9 @@ def delete_collection(collection_pk): 3. Delete Collection """ collection = Collection.objects.get(pk=collection_pk) - version_pks = [] - for version in collection.versions.all(): - _remove_collection_version_from_repos(version) - version_pks.append(version.pk) + versions = collection.versions.all() + _remove_collection_version_from_repos(versions) + version_pks = versions.values_list("pk", flat=True) log.info("Running orphan_cleanup to delete CollectionVersion objects and artifacts") # Running orphan_protection_time=0 should be safe since we're specifying the content diff --git a/pulp_ansible/tests/functional/api/collection/v3/test_deletion.py b/pulp_ansible/tests/functional/api/collection/v3/test_deletion.py index 24606a9b7..efc0441cc 100644 --- a/pulp_ansible/tests/functional/api/collection/v3/test_deletion.py +++ b/pulp_ansible/tests/functional/api/collection/v3/test_deletion.py @@ -36,7 +36,8 @@ def test_collection_deletion(self): name=self.collection_name, namespace=self.collection_namespace, ) - monitor_task(resp.task) + task = monitor_task(resp.task) + assert len(task.created_resources) == 1 collections = self.collections_v3api.list(self.distribution.base_path) assert collections.meta.count == 0