diff --git a/storagecontrol/delete_folder_recursive.py b/storagecontrol/delete_folder_recursive.py new file mode 100644 index 0000000000..fb13a9c47e --- /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 218a3b7f26..3557828ff7 100644 --- a/storagecontrol/snippets_test.py +++ b/storagecontrol/snippets_test.py @@ -12,21 +12,19 @@ # 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 === # @@ -103,3 +101,24 @@ 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: + 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