Skip to content

Commit 00a0dc9

Browse files
committed
GCSHook: Log NotFound error instead of raise on blob delete
Instead of raising a 404/NotFound error when calling `GCSHook.delete()`, match the behavior of `delete_bucket` and log the error.
1 parent c85246c commit 00a0dc9

File tree

2 files changed

+25
-12
lines changed
  • providers/google
    • src/airflow/providers/google/cloud/hooks
    • tests/unit/google/cloud/hooks

2 files changed

+25
-12
lines changed

providers/google/src/airflow/providers/google/cloud/hooks/gcs.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -715,12 +715,16 @@ def delete(self, bucket_name: str, object_name: str) -> None:
715715
client = self.get_conn()
716716
bucket = client.bucket(bucket_name)
717717
blob = bucket.blob(blob_name=object_name)
718-
blob.delete()
719-
get_hook_lineage_collector().add_input_asset(
720-
context=self, scheme="gs", asset_kwargs={"bucket": bucket.name, "key": blob.name}
721-
)
722718

723-
self.log.info("Blob %s deleted.", object_name)
719+
self.log.info("Deleting blob %s", object_name)
720+
try:
721+
blob.delete()
722+
get_hook_lineage_collector().add_input_asset(
723+
context=self, scheme="gs", asset_kwargs={"bucket": bucket.name, "key": blob.name}
724+
)
725+
self.log.info("Blob %s has been deleted", object_name)
726+
except NotFound:
727+
self.log.info("Blob %s does not exist", object_name)
724728

725729
def get_bucket(self, bucket_name: str) -> storage.Bucket:
726730
"""

providers/google/tests/unit/google/cloud/hooks/test_gcs.py

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -528,21 +528,26 @@ def test_rewrite_exposes_lineage(self, mock_service, hook_lineage_collector):
528528

529529
@mock.patch("google.cloud.storage.Bucket")
530530
@mock.patch(GCS_STRING.format("GCSHook.get_conn"))
531-
def test_delete(self, mock_service, mock_bucket):
531+
def test_delete(self, mock_service, mock_bucket, caplog):
532532
test_bucket = "test_bucket"
533533
test_object = "test_object"
534534
blob_to_be_deleted = storage.Blob(name=test_object, bucket=mock_bucket)
535535

536-
get_bucket_method = mock_service.return_value.get_bucket
537-
get_blob_method = get_bucket_method.return_value.get_blob
538-
delete_method = get_blob_method.return_value.delete
536+
bucket_method = mock_service.return_value.bucket
537+
blob = bucket_method.return_value.blob
538+
delete_method = blob.return_value.delete
539539
delete_method.return_value = blob_to_be_deleted
540540

541-
response = self.gcs_hook.delete(bucket_name=test_bucket, object_name=test_object)
541+
with caplog.at_level(logging.INFO):
542+
response = self.gcs_hook.delete(bucket_name=test_bucket, object_name=test_object)
542543
assert response is None
544+
bucket_method.assert_called_once_with(test_bucket)
545+
blob.assert_called_once_with(blob_name=test_object)
546+
delete_method.assert_called_once()
547+
assert "Blob test_object has been deleted" in caplog.text
543548

544549
@mock.patch(GCS_STRING.format("GCSHook.get_conn"))
545-
def test_delete_nonexisting_object(self, mock_service):
550+
def test_delete_nonexisting_object(self, mock_service, caplog):
546551
test_bucket = "test_bucket"
547552
test_object = "test_object"
548553

@@ -551,8 +556,12 @@ def test_delete_nonexisting_object(self, mock_service):
551556
delete_method = blob.return_value.delete
552557
delete_method.side_effect = NotFound(message="Not Found")
553558

554-
with pytest.raises(NotFound):
559+
with caplog.at_level(logging.INFO):
555560
self.gcs_hook.delete(bucket_name=test_bucket, object_name=test_object)
561+
bucket_method.assert_called_once_with(test_bucket)
562+
blob.assert_called_once_with(blob_name=test_object)
563+
delete_method.assert_called_once()
564+
assert "Blob test_object does not exist" in caplog.text
556565

557566
@mock.patch(GCS_STRING.format("GCSHook.get_conn"))
558567
def test_delete_exposes_lineage(self, mock_service, hook_lineage_collector):

0 commit comments

Comments
 (0)