From e4be53aa27eb904de7068e8a503fbcd3109cced1 Mon Sep 17 00:00:00 2001 From: Nidhi Nandwani Date: Thu, 11 Jun 2026 10:57:01 +0000 Subject: [PATCH 1/2] feat(python): add deleteFolderRecursive sample This adds a sample demonstrating how to recursively delete a folder in a hierarchical namespace bucket. Fixes: b/521168740 [Generated-by: AI] --- storagecontrol/delete_folder_recursive.py | 49 +++++++++++++++++++++++ storagecontrol/snippets_test.py | 24 ++++++++++- 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 storagecontrol/delete_folder_recursive.py diff --git a/storagecontrol/delete_folder_recursive.py b/storagecontrol/delete_folder_recursive.py new file mode 100644 index 00000000000..fb13a9c47ef --- /dev/null +++ b/storagecontrol/delete_folder_recursive.py @@ -0,0 +1,49 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import sys + +# [START storage_control_delete_folder_recursive] +from google.cloud import storage_control_v2 + + +def delete_folder_recursive(bucket_name: str, folder_name: str) -> None: + # The ID of your GCS bucket + # bucket_name = "your-unique-bucket-name" + + # The name of the folder to be deleted recursively + # folder_name = "folder-name" + + storage_control_client = storage_control_v2.StorageControlClient() + # The storage bucket path uses the global access pattern, in which the "_" + # denotes this bucket exists in the global namespace. + # Set project to "_" to signify globally scoped bucket + folder_path = storage_control_client.folder_path( + project="_", bucket=bucket_name, folder=folder_name + ) + + request = storage_control_v2.DeleteFolderRecursiveRequest( + name=folder_path, + ) + operation = storage_control_client.delete_folder_recursive(request=request) + operation.result() + + print(f"Deleted folder: {folder_path}") + + +# [END storage_control_delete_folder_recursive] + + +if __name__ == "__main__": + delete_folder_recursive(bucket_name=sys.argv[1], folder_name=sys.argv[2]) diff --git a/storagecontrol/snippets_test.py b/storagecontrol/snippets_test.py index 218a3b7f26a..89de089f306 100644 --- a/storagecontrol/snippets_test.py +++ b/storagecontrol/snippets_test.py @@ -26,7 +26,6 @@ import managed_folder_list import rename_folder - # === Folders === # @@ -103,3 +102,26 @@ def test_managed_folder_create_get_list_delete( ) out, _ = capsys.readouterr() assert folder_name in out + + +def test_delete_folder_recursive( + capsys: pytest.LogCaptureFixture, hns_enabled_bucket: storage.Bucket, uuid_name: str +) -> None: + import delete_folder_recursive + + bucket_name = hns_enabled_bucket.name + folder_name = uuid_name + + # Create folder + create_folder.create_folder(bucket_name=bucket_name, folder_name=folder_name) + + # Create a nested folder + nested_folder_name = f"{folder_name}/nested_folder" + create_folder.create_folder(bucket_name=bucket_name, folder_name=nested_folder_name) + + # Test delete folder recursive + delete_folder_recursive.delete_folder_recursive( + bucket_name=bucket_name, folder_name=folder_name + ) + out, _ = capsys.readouterr() + assert folder_name in out From 54689cbaee96a1f5bd4934752172b2eaa7356802 Mon Sep 17 00:00:00 2001 From: Nidhi Nandwani Date: Thu, 11 Jun 2026 11:30:19 +0000 Subject: [PATCH 2/2] fix: resolve PR feedback for imports [Generated-by: AI] --- storagecontrol/snippets_test.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/storagecontrol/snippets_test.py b/storagecontrol/snippets_test.py index 89de089f306..3557828ff72 100644 --- a/storagecontrol/snippets_test.py +++ b/storagecontrol/snippets_test.py @@ -12,18 +12,17 @@ # See the License for the specific language governing permissions and # limitations under the License. -from google.cloud import storage - -import pytest - import create_folder import delete_folder +import delete_folder_recursive import get_folder +from google.cloud import storage import list_folders import managed_folder_create import managed_folder_delete import managed_folder_get import managed_folder_list +import pytest import rename_folder # === Folders === # @@ -107,8 +106,6 @@ def test_managed_folder_create_get_list_delete( def test_delete_folder_recursive( capsys: pytest.LogCaptureFixture, hns_enabled_bucket: storage.Bucket, uuid_name: str ) -> None: - import delete_folder_recursive - bucket_name = hns_enabled_bucket.name folder_name = uuid_name