From 6f9d66767b294e7216d5d46b953604b6855e3e73 Mon Sep 17 00:00:00 2001 From: Gabriel Schowe Date: Mon, 23 Sep 2024 13:21:54 +0200 Subject: [PATCH] Add: Script to use delete by tag --- pontos/github/api/packages.py | 4 +- .../github/scripts/delete-package-with-tag.py | 44 +++++++++++++++++++ tests/github/api/test_packages.py | 12 ++--- 3 files changed, 54 insertions(+), 6 deletions(-) create mode 100644 pontos/github/scripts/delete-package-with-tag.py diff --git a/pontos/github/api/packages.py b/pontos/github/api/packages.py index f561f407..ff47f6d9 100644 --- a/pontos/github/api/packages.py +++ b/pontos/github/api/packages.py @@ -245,7 +245,7 @@ async def package_version_tags( if not response.is_success: raise GitHubApiError(response) resp = response.json() - return resp["tags"] + return resp["metadata"]["container"]["tags"] async def delete_package( self, organization: str, package_type: PackageType, package_name: str @@ -355,9 +355,11 @@ async def delete_package_with_tag( async for package_version in self.package_versions( organization, package_type, package_name ): + print("in the loop") if tag in await self.package_version_tags( organization, package_type, package_name, package_version.id ): + print("tag found") api = f"/orgs/{organization}/packages/{package_type}/{package_name}/versions/{package_version.id}" response = await self._client.delete(api) if not response.is_success: diff --git a/pontos/github/scripts/delete-package-with-tag.py b/pontos/github/scripts/delete-package-with-tag.py new file mode 100644 index 00000000..0b444be2 --- /dev/null +++ b/pontos/github/scripts/delete-package-with-tag.py @@ -0,0 +1,44 @@ +""" +This script delete a package from a repository, if it contains the specified tag. +""" + +from argparse import ArgumentParser, Namespace + +from pontos.github.api import GitHubAsyncRESTApi +from pontos.github.models.packages import PackageType + +def package_type(value: str) -> PackageType: + if isinstance(value, PackageType): + return value + return PackageType(value.lower()) + +def add_script_arguments(parser: ArgumentParser) -> None: + parser.add_argument("organization", help="organization name") + parser.add_argument("package", help="package name") + parser.add_argument( + "--package-type", + type=package_type, + help="package type", + default=PackageType.CONTAINER, + ) + parser.add_argument('tag', help='The tag to be deleted.') + +async def github_script(api: GitHubAsyncRESTApi, args: Namespace) -> None: + if not await api.packages.exists( + organization=args.organization, + package_name=args.package, + package_type=args.package_type, + ): + print( + f"Package {args.package} does not exist in organization {args.organization}" + ) + return 1 + print(f"Found package {args.package} in organization {args.organization}") + + await api.packages.delete_package_with_tag( + organization=args.organization, + package_name=args.package, + package_type=args.package_type, + tag=args.tag, + ) + print(f"Deleted tag {args.tag} from package {args.package} in organization {args.organization}") diff --git a/tests/github/api/test_packages.py b/tests/github/api/test_packages.py index a6b38766..d99a1f65 100644 --- a/tests/github/api/test_packages.py +++ b/tests/github/api/test_packages.py @@ -164,7 +164,7 @@ async def test_package_version(self): async def test_package_version_tags(self): response = create_response() - response.json.return_value = {"tags": ["latest", "stable"]} + response.json.return_value = {"metadata": {"container": {"tags": ["latest", "stable"]}}} self.client.get.return_value = response @@ -243,17 +243,19 @@ async def test_delete_package_with_tag(self): package_version_response = create_response() package_version_response.json.return_value = [PACKAGE_VERSION] - self.client.get_all.return_value = AsyncIteratorMock([package_version_response]) + self.client.get_all.return_value = AsyncIteratorMock( + [package_version_response] + ) tags_response = create_response() - tags_response.json.return_value = {"tags": ["latest", "stable"]} + tags_response.json.return_value = {"metadata": {"container": {"tags": ["latest", "stable"]}}} self.client.get.return_value = tags_response await self.api.delete_package_with_tag( organization="foo", package_type=PackageType.CONTAINER, package_name="bar", - tag="latest" + tag="latest", ) self.client.get_all.assert_called_once_with( @@ -264,4 +266,4 @@ async def test_delete_package_with_tag(self): ) self.client.delete.assert_awaited_once_with( "/orgs/foo/packages/container/bar/versions/1" - ) \ No newline at end of file + )