Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions commit_msg.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
feat(c++): add deleteFolderRecursive sample

This adds a sample demonstrating how to recursively delete a folder in a hierarchical namespace bucket.

Fixes: b/521168740
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_INTERNAL_OAUTH2_REGIONAL_ACCESS_BOUNDARY_TOKEN_MANAGER_H

#include "google/cloud/backoff_policy.h"
#include "google/cloud/future.h"
#include "google/cloud/internal/clock.h"
#include "google/cloud/internal/http_header.h"
#include "google/cloud/internal/oauth2_minimal_iam_credentials_rest.h"
Expand All @@ -28,6 +29,8 @@
#include "google/cloud/version.h"
#include "absl/strings/match.h"
#include <chrono>
#include <memory>
#include <mutex>
#include <string>

namespace google {
Expand Down Expand Up @@ -178,15 +181,15 @@ class RegionalAccessBoundaryTokenManager
(void)failed_lookup_cooldown_.get();
}

promise<Status> pending_refresh;
pending_refresh_ = pending_refresh.get_future();
promise<Status> pr;
pending_refresh_ = pr.get_future();
auto p = std::make_shared<promise<Status>>(std::move(pr));
auto constexpr kLocation = __func__;
auto pending_refresh_fn = [p = std::move(pending_refresh),
weak = weak_from_this(), request,
auto pending_refresh_fn = [p, weak = weak_from_this(), request,
stub = iam_stub_,
retry_policy = retry_policy_->clone(),
backoff_policy = backoff_policy_->clone(),
options = options_]() mutable {
options = options_]() {
auto refresh_attempt_fn = [stub](rest_internal::RestContext&,
Options const&, Request const& request) {
return stub->AllowedLocations(request);
Expand All @@ -209,7 +212,7 @@ class RegionalAccessBoundaryTokenManager
self->allowed_locations_ = *allowed_locations;
self->expire_time_ = self->clock_->Now() + TokenTtl();
self->failed_lookup_backoff_policy_.reset();
p.set_value(Status{});
p->set_value(Status{});
} else {
self->allowed_locations_ = AllowedLocationsResponse{};
if (!self->failed_lookup_backoff_policy_) {
Expand All @@ -219,7 +222,7 @@ class RegionalAccessBoundaryTokenManager
self->failed_lookup_cooldown_ =
self->background_->cq().MakeRelativeTimer(
self->failed_lookup_backoff_policy_->OnCompletion());
p.set_value(allowed_locations.status());
p->set_value(allowed_locations.status());
}
self->refresh_in_progress_ = false;
};
Expand Down
4 changes: 2 additions & 2 deletions google/cloud/internal/rest_opentelemetry.cc
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,12 @@
// limitations under the License.

#include "google/cloud/internal/rest_opentelemetry.h"
#include "google/cloud/internal/absl_str_cat_quiet.h"
#include "google/cloud/internal/opentelemetry.h"
#include "google/cloud/internal/rest_context.h"
#include "google/cloud/internal/trace_propagator.h"
#include "google/cloud/options.h"
#include "absl/strings/match.h"
#include "absl/strings/str_cat.h"
#include <opentelemetry/context/propagation/global_propagator.h>
#include <opentelemetry/context/propagation/text_map_propagator.h>
#include <opentelemetry/semconv/network_attributes.h>
Expand Down Expand Up @@ -81,7 +81,7 @@ opentelemetry::nostd::shared_ptr<opentelemetry::trace::Span> MakeSpanHttp(
{/*sc::kUrlFull=*/"url.full", request.path()}},
options);
for (auto const& kv : request.headers()) {
auto const name = "http.request.header." + std::string{kv.first};
auto const name = "http.request.header." + kv.first.name();
if (kv.second.EmptyValues()) {
span->SetAttribute(name, "");
continue;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,11 @@ void RemoveStaleFolders(
google::cloud::storagecontrol_v2::StorageControlClient client,
std::string const& bucket_name, std::string const& prefix,
std::chrono::system_clock::time_point created_time_limit) {
std::regex re(prefix + R"re(-[a-z]{32})re");
std::regex re(prefix + R"re(-[a-z]{32}/?)re");
auto const parent = std::string{"projects/_/buckets/"} + bucket_name;
for (auto folder : client.ListFolders(parent)) {
if (!folder) throw std::move(folder).status();
if (!std::regex_match(folder->name(), re)) continue;
if (!std::regex_search(folder->name(), re)) continue;
auto const create_time =
google::cloud::internal::ToChronoTimePoint(folder->create_time());
if (create_time > created_time_limit) continue;
Expand Down Expand Up @@ -76,6 +76,25 @@ void DeleteFolder(google::cloud::storagecontrol_v2::StorageControlClient client,
(std::move(client), argv.at(0), argv.at(1));
}

void DeleteFolderRecursive(
google::cloud::storagecontrol_v2::StorageControlClient client,
std::vector<std::string> const& argv) {
// [START storage_control_delete_folder_recursive]
namespace storagecontrol = google::cloud::storagecontrol_v2;
[](storagecontrol::StorageControlClient client,
std::string const& bucket_name, std::string const& folder_id) {
// Set project to "_" to signify globally scoped bucket
auto const name = std::string{"projects/_/buckets/"} + bucket_name +
"/folders/" + folder_id;
auto deleted = client.DeleteFolderRecursive(name).get();
if (!deleted) throw std::move(deleted).status();

std::cout << "Deleted folder: " << name << "\n";
}
// [END storage_control_delete_folder_recursive]
(std::move(client), argv.at(0), argv.at(1));
}

void GetFolder(google::cloud::storagecontrol_v2::StorageControlClient client,
std::vector<std::string> const& argv) {
// [START storage_control_get_folder]
Expand Down Expand Up @@ -151,9 +170,6 @@ void AutoRun(std::vector<std::string> const& argv) {
auto const folder_id = prefix + "-" +
google::cloud::internal::Sample(
generator, 32, "abcdefghijklmnopqrstuvwxyz");
auto const dest_folder_id = prefix + "-" +
google::cloud::internal::Sample(
generator, 32, "abcdefghijklmnopqrstuvwxyz");
auto const create_time_limit =
std::chrono::system_clock::now() - std::chrono::hours(48);
// This is the only example that cleans up stale folders. The examples run in
Expand All @@ -163,19 +179,25 @@ void AutoRun(std::vector<std::string> const& argv) {
RemoveStaleFolders(client, bucket_name, prefix, create_time_limit);

std::cout << "\nRunning CreateFolder() example" << std::endl;
CreateFolder(client, {bucket_name, folder_id});
CreateFolder(client, {bucket_name, folder_id + "/"});

std::cout << "\nRunning GetFolder() example" << std::endl;
GetFolder(client, {bucket_name, folder_id});
GetFolder(client, {bucket_name, folder_id + "/"});

std::cout << "\nRunning ListFolders() example" << std::endl;
ListFolders(client, {bucket_name});

auto const dest_folder_id = folder_id + "-dest/";
std::cout << "\nRunning RenameFolder() example" << std::endl;
RenameFolder(client, {bucket_name, folder_id, dest_folder_id});
RenameFolder(client, {bucket_name, folder_id + "/", dest_folder_id});

std::cout << "\nRunning DeleteFolder() example" << std::endl;
DeleteFolder(client, {bucket_name, dest_folder_id});

std::cout << "\nRunning DeleteFolderRecursive() example" << std::endl;
CreateFolder(client, {bucket_name, folder_id + "/"});
CreateFolder(client, {bucket_name, folder_id + "/subfolder/"});
DeleteFolderRecursive(client, {bucket_name, folder_id + "/"});
}

} // namespace
Expand Down Expand Up @@ -207,6 +229,8 @@ int main(int argc, char* argv[]) { // NOLINT(bugprone-exception-escape)
Example example({
make_entry("create-folder", {"bucket-name", "folder-id"}, CreateFolder),
make_entry("delete-folder", {"bucket-name", "folder-id"}, DeleteFolder),
make_entry("delete-folder-recursive", {"bucket-name", "folder-id"},
DeleteFolderRecursive),
make_entry("get-folder", {"bucket-name", "folder-id"}, GetFolder),
make_entry("list-folders", {"bucket-name"}, ListFolders),
make_entry("rename-folder",
Expand Down
Loading