Skip to content

Commit 8ece366

Browse files
author
Yalin Li
authored
[ACR] Just accept digest in delete_blob() (Azure#29548)
1 parent 76cc6a2 commit 8ece366

File tree

6 files changed

+62
-16
lines changed

6 files changed

+62
-16
lines changed

sdk/containerregistry/azure-containerregistry/CHANGELOG.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
### Features Added
66

77
### Breaking Changes
8+
- Suppress the response error with status code `404` in `delete_blob()`.
89

910
### Bugs Fixed
1011

@@ -17,11 +18,11 @@
1718
- Fixed a `TypeError` when call `list_manifest()` in an empty repository. ([#28432](https://github.com/Azure/azure-sdk-for-python/issues/28432))
1819

1920
### Other Changes
20-
* Added default value `"https://management.azure.com"` to kwarg `audience` in `ContainerRegistryClient`. ([#22229](https://github.com/Azure/azure-sdk-for-python/issues/22229))
21-
* Python 3.6 is no longer supported. Please use Python version 3.7 or later.
22-
* Bumped minimum dependency on `azure-core` to `>=1.24.0`
23-
* Dropped `msrest` requirement.
24-
* Added dependency `isodate` with version range `>=0.6.0`(`isodate` was required by `msrest`).
21+
- Added default value `"https://management.azure.com"` to kwarg `audience` in `ContainerRegistryClient`. ([#22229](https://github.com/Azure/azure-sdk-for-python/issues/22229))
22+
- Python 3.6 is no longer supported. Please use Python version 3.7 or later.
23+
- Bumped minimum dependency on `azure-core` to `>=1.24.0`
24+
- Dropped `msrest` requirement.
25+
- Added dependency `isodate` with version range `>=0.6.0`(`isodate` was required by `msrest`).
2526

2627
## 1.1.0b1 (2022-05-10)
2728

sdk/containerregistry/azure-containerregistry/assets.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
"AssetsRepo": "Azure/azure-sdk-assets",
33
"AssetsRepoPrefixPath": "python",
44
"TagPrefix": "python/containerregistry/azure-containerregistry",
5-
"Tag": "python/containerregistry/azure-containerregistry_ea5ba77c3e"
5+
"Tag": "python/containerregistry/azure-containerregistry_b29296432a"
66
}

sdk/containerregistry/azure-containerregistry/azure/containerregistry/_container_registry_client.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1020,14 +1020,13 @@ def delete_manifest(self, repository: str, tag_or_digest: str, **kwargs) -> None
10201020
self._client.container_registry.delete_manifest(repository, tag_or_digest, **kwargs)
10211021

10221022
@distributed_trace
1023-
def delete_blob(self, repository: str, tag_or_digest: str, **kwargs) -> None:
1023+
def delete_blob(self, repository: str, digest: str, **kwargs) -> None:
10241024
"""Delete a blob. If the blob cannot be found or a response status code of
10251025
404 is returned an error will not be raised.
10261026
10271027
:param str repository: Name of the repository the manifest belongs to
1028-
:param str tag_or_digest: Tag or digest of the blob to be deleted
1028+
:param str digest: Digest of the blob to be deleted
10291029
:returns: None
1030-
:raises: ~azure.core.exceptions.HttpResponseError
10311030
10321031
Example
10331032
@@ -1037,9 +1036,11 @@ def delete_blob(self, repository: str, tag_or_digest: str, **kwargs) -> None:
10371036
from azure.identity import DefaultAzureCredential
10381037
endpoint = os.environ["CONTAINERREGISTRY_ENDPOINT"]
10391038
client = ContainerRegistryClient(endpoint, DefaultAzureCredential(), audience="my_audience")
1040-
client.delete_blob("my_repository", "my_tag_or_digest")
1039+
client.delete_blob("my_repository", "my_digest")
10411040
"""
1042-
if _is_tag(tag_or_digest):
1043-
tag_or_digest = self._get_digest_from_tag(repository, tag_or_digest)
1044-
1045-
self._client.container_registry_blob.delete_blob(repository, tag_or_digest, **kwargs)
1041+
try:
1042+
self._client.container_registry_blob.delete_blob(repository, digest, **kwargs)
1043+
except HttpResponseError as error:
1044+
if error.status_code == 404:
1045+
return
1046+
raise

sdk/containerregistry/azure-containerregistry/azure/containerregistry/aio/_async_container_registry_client.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -864,3 +864,29 @@ async def delete_manifest(self, repository: str, tag_or_digest: str, **kwargs) -
864864
tag_or_digest = await self._get_digest_from_tag(repository, tag_or_digest)
865865

866866
await self._client.container_registry.delete_manifest(repository, tag_or_digest, **kwargs)
867+
868+
@distributed_trace_async
869+
async def delete_blob(self, repository: str, digest: str, **kwargs) -> None:
870+
"""Delete a blob. If the blob cannot be found or a response status code of
871+
404 is returned an error will not be raised.
872+
873+
:param str repository: Name of the repository the manifest belongs to
874+
:param str digest: Digest of the blob to be deleted
875+
:returns: None
876+
877+
Example
878+
879+
.. code-block:: python
880+
881+
from azure.containerregistry.aio import ContainerRegistryClient
882+
from azure.identity.aio import DefaultAzureCredential
883+
endpoint = os.environ["CONTAINERREGISTRY_ENDPOINT"]
884+
client = ContainerRegistryClient(endpoint, DefaultAzureCredential(), audience="my_audience")
885+
await client.delete_blob("my_repository", "my_digest")
886+
"""
887+
try:
888+
await self._client.container_registry_blob.delete_blob(repository, digest, **kwargs)
889+
except HttpResponseError as error:
890+
if error.status_code == 404:
891+
return
892+
raise

sdk/containerregistry/azure-containerregistry/tests/test_container_registry_client.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import os
88
import pytest
99
import six
10-
10+
import hashlib
1111
from azure.containerregistry import (
1212
RepositoryProperties,
1313
ArtifactManifestProperties,
@@ -568,6 +568,15 @@ def test_upload_blob(self, containerregistry_endpoint):
568568

569569
# Cleanup
570570
client.delete_repository(repo)
571+
572+
@acr_preparer()
573+
@recorded_by_proxy
574+
def test_delete_blob_does_not_exist(self, containerregistry_endpoint):
575+
repo = self.get_resource_name("repo")
576+
hash_value = hashlib.sha256(b"test").hexdigest()
577+
digest = f"sha256:{hash_value}"
578+
with self.create_registry_client(containerregistry_endpoint) as client:
579+
client.delete_blob(repo, digest)
571580

572581
@acr_preparer()
573582
@recorded_by_proxy

sdk/containerregistry/azure-containerregistry/tests/test_container_registry_client_async.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from datetime import datetime
77
import pytest
88
import six
9-
9+
import hashlib
1010
from azure.containerregistry import (
1111
RepositoryProperties,
1212
ArtifactManifestProperties,
@@ -451,6 +451,15 @@ async def test_get_misspell_property(self, containerregistry_endpoint):
451451
last_updated_on = properties.last_updated_on
452452
assert last_udpated_on == last_updated_on
453453

454+
@acr_preparer()
455+
@recorded_by_proxy_async
456+
async def test_delete_blob_does_not_exist(self, containerregistry_endpoint):
457+
repo = self.get_resource_name("repo")
458+
hash_value = hashlib.sha256(b"test").hexdigest()
459+
digest = f"sha256:{hash_value}"
460+
async with self.create_registry_client(containerregistry_endpoint) as client:
461+
await client.delete_blob(repo, digest)
462+
454463
@acr_preparer()
455464
@recorded_by_proxy_async
456465
async def test_set_audience(self, containerregistry_endpoint):

0 commit comments

Comments
 (0)