diff --git a/google-cloud-storage/samples/acceptance/buckets_test.rb b/google-cloud-storage/samples/acceptance/buckets_test.rb index f4f416744fd1..95e44b9b8110 100644 --- a/google-cloud-storage/samples/acceptance/buckets_test.rb +++ b/google-cloud-storage/samples/acceptance/buckets_test.rb @@ -40,8 +40,10 @@ require_relative "../storage_get_public_access_prevention" require_relative "../storage_get_requester_pays_status" require_relative "../storage_get_retention_policy" +require_relative "../storage_get_soft_deleted_bucket" require_relative "../storage_get_uniform_bucket_level_access" require_relative "../storage_list_buckets" +require_relative "../storage_list_soft_deleted_buckets" require_relative "../storage_lock_retention_policy" require_relative "../storage_remove_bucket_label" require_relative "../storage_remove_cors_configuration" @@ -119,6 +121,45 @@ end end + describe "storage_soft_deleted_bucket" do + let(:new_bucket_name) { random_bucket_name } + + it "get soft deleted bucket, its soft_delete_time and hard_delete_time" do + new_bucket = storage_client.create_bucket new_bucket_name + new_bucket.retention_period = retention_period + new_generation = new_bucket.generation + puts storage_client.service_account_email + puts new_bucket.policy.roles + + # ensuring bucket is created + assert new_bucket.exists?, "Bucket #{new_bucket_name} should exist" + + # fetching bucket + check_bucket = storage_client.bucket new_bucket_name + puts "new bucket name-- #{check_bucket.name}" + puts "new bucket generation-- #{check_bucket.generation}" + puts "new bucket retention period-- #{check_bucket.retention_period}" + + delete_bucket_helper new_bucket_name + # Check if the bucket is deleted + deleted_bucket = storage_client.bucket new_bucket_name + refute deleted_bucket, "Bucket #{new_bucket_name} should not exist" + + # fetching a soft deleted bucket + output, _err = capture_io do + get_soft_deleted_bucket bucket_name: new_bucket_name, generation: new_generation + end + assert_includes output, "soft_delete_time for #{new_bucket_name} is" + end + + it "lists soft deleted buckets" do + list_deleted_bucket, _err = capture_io do + list_soft_deleted_buckets + end + assert list_deleted_bucket, "List of soft deleted bucket should not be blank" + end + end + describe "storage_create_bucket_dual_region" do it "creates dual region bucket" do location = "US" diff --git a/google-cloud-storage/samples/acceptance/project_test.rb b/google-cloud-storage/samples/acceptance/project_test.rb index 2de54569a0ba..c297418674b0 100644 --- a/google-cloud-storage/samples/acceptance/project_test.rb +++ b/google-cloud-storage/samples/acceptance/project_test.rb @@ -14,9 +14,13 @@ require_relative "helper" require_relative "../storage_get_service_account" +require_relative "../storage_restore_bucket" describe "Storage Quickstart" do let(:project) { Google::Cloud::Storage.new } + let(:bucket) { fixture_bucket } + let(:generation) { bucket.generation } + let(:new_bucket_name) { random_bucket_name } it "get_service_account" do email = nil @@ -28,3 +32,16 @@ assert_includes out, "@gs-project-accounts.iam.gserviceaccount.com" end end + +describe "storage_soft_deleted_bucket" do + let(:generation) { bucket.generation } + let(:bucket) { fixture_bucket } + + it "restores a soft deleted bucket" do + delete_bucket_helper bucket.name + _out, _err = capture_io do + restore_bucket bucket_name: bucket.name, generation: generation + end + assert "#{bucket.name} Bucket restored" + end +end diff --git a/google-cloud-storage/samples/storage_get_soft_deleted_bucket.rb b/google-cloud-storage/samples/storage_get_soft_deleted_bucket.rb new file mode 100644 index 000000000000..b5ed6c743e19 --- /dev/null +++ b/google-cloud-storage/samples/storage_get_soft_deleted_bucket.rb @@ -0,0 +1,41 @@ +# Copyright 2024 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 +# +# http://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. + +# [START storage_get_soft_deleted_bucket] +def get_soft_deleted_bucket bucket_name:, generation: + # The ID of your GCS bucket + # bucket_name = "your-unique-bucket-name" + # The generation no of your GCS bucket + # generation = "1234567896987" + + require "google/cloud/storage" + + storage = Google::Cloud::Storage.new + # fetching soft deleted bucket with soft_delete_time and hard_delete_time + deleted_bucket_fetch = storage.bucket bucket_name, generation: generation, soft_deleted: true + + soft_delete_time = deleted_bucket_fetch.soft_delete_time + hard_delete_time = deleted_bucket_fetch.hard_delete_time + + if (soft_delete_time && hard_delete_time).nil? + puts "Not Found" + else + puts "soft_delete_time for #{deleted_bucket_fetch.name} is - #{soft_delete_time}" + puts "hard_delete_time for #{deleted_bucket_fetch.name} is - #{hard_delete_time}" + end +end +# [END storage_get_soft_deleted_bucket] + + +get_soft_deleted_bucket bucket_name: ARGV.shift, generation: ARGV.shift if $PROGRAM_NAME == __FILE__ diff --git a/google-cloud-storage/samples/storage_list_soft_deleted_buckets.rb b/google-cloud-storage/samples/storage_list_soft_deleted_buckets.rb new file mode 100644 index 000000000000..4869fb70d7fc --- /dev/null +++ b/google-cloud-storage/samples/storage_list_soft_deleted_buckets.rb @@ -0,0 +1,30 @@ +# Copyright 2024 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 +# +# http://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. + +# [START storage_list_soft_deleted_buckets] +def list_soft_deleted_buckets + require "google/cloud/storage" + + storage = Google::Cloud::Storage.new + + # fetching soft deleted bucket list + deleted_buckets = storage.buckets soft_deleted: true + + deleted_buckets.each do |bucket| + puts bucket.name + end +end +# [END storage_list_soft_deleted_buckets] + +list_soft_deleted_buckets if $PROGRAM_NAME == __FILE__ diff --git a/google-cloud-storage/samples/storage_restore_bucket.rb b/google-cloud-storage/samples/storage_restore_bucket.rb new file mode 100644 index 000000000000..c2cee7944174 --- /dev/null +++ b/google-cloud-storage/samples/storage_restore_bucket.rb @@ -0,0 +1,36 @@ +# Copyright 2024 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 +# +# http://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. + +# [START storage_restore_bucket] +def restore_bucket bucket_name:, generation: + # The ID of your GCS bucket + # bucket_name = "your-unique-bucket-name" + # The generation no of your GCS bucket + # generation = "1234567896987" + + require "google/cloud/storage" + + storage = Google::Cloud::Storage.new + + bucket_restored = storage.restore_bucket bucket_name, generation + + if bucket_restored.name == bucket_name + puts "#{bucket_name} Bucket restored" + else + puts "#{bucket_name} Bucket not restored" + end +end +# [END storage_restore_bucket] + +restore_bucket bucket_name: ARGV.shift, generation: ARGV.shift if $PROGRAM_NAME == __FILE__