From 3c36c3cd455bc8e766ec701b78240b8772e64fa5 Mon Sep 17 00:00:00 2001 From: Bradley White <14679271+devbww@users.noreply.github.com> Date: Tue, 14 Sep 2021 13:15:53 -0400 Subject: [PATCH 1/2] doc(spanner): convert Spanner samples to use the generated admin APIs --- google/cloud/spanner/samples/samples.cc | 552 ++++++++++++++---------- 1 file changed, 328 insertions(+), 224 deletions(-) diff --git a/google/cloud/spanner/samples/samples.cc b/google/cloud/spanner/samples/samples.cc index dfda56312c073..cf674591b46b9 100644 --- a/google/cloud/spanner/samples/samples.cc +++ b/google/cloud/spanner/samples/samples.cc @@ -15,22 +15,24 @@ //! [START spanner_quickstart] #include "google/cloud/spanner/client.h" //! [END spanner_quickstart] +#include "google/cloud/spanner/admin/database_admin_client.h" +#include "google/cloud/spanner/admin/database_admin_options.h" +#include "google/cloud/spanner/admin/instance_admin_client.h" +#include "google/cloud/spanner/admin/instance_admin_options.h" #include "google/cloud/spanner/backoff_policy.h" #include "google/cloud/spanner/backup.h" #include "google/cloud/spanner/connection_options.h" #include "google/cloud/spanner/create_instance_request_builder.h" -#include "google/cloud/spanner/database_admin_client.h" -#include "google/cloud/spanner/instance_admin_client.h" #include "google/cloud/spanner/row.h" #include "google/cloud/spanner/testing/instance_location.h" #include "google/cloud/spanner/testing/pick_random_instance.h" -#include "google/cloud/spanner/testing/policies.h" #include "google/cloud/spanner/testing/random_backup_name.h" #include "google/cloud/spanner/testing/random_database_name.h" #include "google/cloud/spanner/testing/random_instance_name.h" #include "google/cloud/spanner/update_instance_request_builder.h" #include "google/cloud/internal/getenv.h" #include "google/cloud/internal/random.h" +#include "google/cloud/kms_key_name.h" #include "google/cloud/log.h" #include "absl/time/time.h" #include "absl/types/optional.h" @@ -45,11 +47,11 @@ namespace { //! [get-instance] -void GetInstance(google::cloud::spanner::InstanceAdminClient client, +void GetInstance(google::cloud::spanner_admin::InstanceAdminClient client, std::string const& project_id, std::string const& instance_id) { google::cloud::spanner::Instance in(project_id, instance_id); - auto instance = client.GetInstance(in); + auto instance = client.GetInstance(in.FullName()); if (!instance) throw std::runtime_error(instance.status().message()); std::cout << "The instance " << instance->name() @@ -62,13 +64,13 @@ void GetInstanceCommand(std::vector argv) { if (argv.size() != 2) { throw std::runtime_error("get-instance "); } - google::cloud::spanner::InstanceAdminClient client( - google::cloud::spanner::MakeInstanceAdminConnection()); + google::cloud::spanner_admin::InstanceAdminClient client( + google::cloud::spanner_admin::MakeInstanceAdminConnection()); GetInstance(std::move(client), argv[0], argv[1]); } //! [START spanner_create_instance] [create-instance] -void CreateInstance(google::cloud::spanner::InstanceAdminClient client, +void CreateInstance(google::cloud::spanner_admin::InstanceAdminClient client, std::string const& project_id, std::string const& instance_id, std::string const& display_name, @@ -94,7 +96,7 @@ void CreateInstance(google::cloud::spanner::InstanceAdminClient client, // [START spanner_create_instance_with_processing_units] void CreateInstanceWithProcessingUnits( - google::cloud::spanner::InstanceAdminClient client, + google::cloud::spanner_admin::InstanceAdminClient client, std::string const& project_id, std::string const& instance_id, std::string const& display_name, std::string const& config) { namespace spanner = ::google::cloud::spanner; @@ -114,7 +116,7 @@ void CreateInstanceWithProcessingUnits( if (!instance) throw std::runtime_error(instance.status().message()); std::cout << "Created instance [" << in << "]:\n" << instance->DebugString(); - instance = client.GetInstance(in); + instance = client.GetInstance(in.FullName()); if (!instance) throw std::runtime_error(instance.status().message()); std::cout << "Instance " << in << " has " << instance->processing_units() << " processing units.\n"; @@ -129,8 +131,8 @@ void CreateInstanceCommand(std::vector argv) { "create-instance [--low-cost] " " [config]"); } - google::cloud::spanner::InstanceAdminClient client( - google::cloud::spanner::MakeInstanceAdminConnection()); + google::cloud::spanner_admin::InstanceAdminClient client( + google::cloud::spanner_admin::MakeInstanceAdminConnection()); std::string config = argv.size() == 4 ? argv[3] : "regional-us-central1"; if (low_cost) { CreateInstanceWithProcessingUnits(std::move(client), argv[0], argv[1], @@ -141,7 +143,7 @@ void CreateInstanceCommand(std::vector argv) { } //! [update-instance] -void UpdateInstance(google::cloud::spanner::InstanceAdminClient client, +void UpdateInstance(google::cloud::spanner_admin::InstanceAdminClient client, std::string const& project_id, std::string const& instance_id, std::string const& new_display_name) { @@ -162,18 +164,18 @@ void UpdateInstanceCommand(std::vector argv) { throw std::runtime_error( "update-instance "); } - google::cloud::spanner::InstanceAdminClient client( - google::cloud::spanner::MakeInstanceAdminConnection()); + google::cloud::spanner_admin::InstanceAdminClient client( + google::cloud::spanner_admin::MakeInstanceAdminConnection()); UpdateInstance(std::move(client), argv[0], argv[1], argv[2]); } //! [delete-instance] -void DeleteInstance(google::cloud::spanner::InstanceAdminClient client, +void DeleteInstance(google::cloud::spanner_admin::InstanceAdminClient client, std::string const& project_id, std::string const& instance_id) { google::cloud::spanner::Instance in(project_id, instance_id); - auto status = client.DeleteInstance(in); + auto status = client.DeleteInstance(in.FullName()); if (!status.ok()) throw std::runtime_error(status.message()); std::cout << "Deleted instance [" << in << "]\n"; } @@ -183,16 +185,18 @@ void DeleteInstanceCommand(std::vector argv) { if (argv.size() != 2) { throw std::runtime_error("delete-instance "); } - google::cloud::spanner::InstanceAdminClient client( - google::cloud::spanner::MakeInstanceAdminConnection()); + google::cloud::spanner_admin::InstanceAdminClient client( + google::cloud::spanner_admin::MakeInstanceAdminConnection()); DeleteInstance(std::move(client), argv[0], argv[1]); } //! [START spanner_list_instance_configs] [list-instance-configs] -void ListInstanceConfigs(google::cloud::spanner::InstanceAdminClient client, - std::string const& project_id) { +void ListInstanceConfigs( + google::cloud::spanner_admin::InstanceAdminClient client, + std::string const& project_id) { int count = 0; - for (auto const& instance_config : client.ListInstanceConfigs(project_id)) { + for (auto const& instance_config : + client.ListInstanceConfigs("projects/" + project_id)) { if (!instance_config) { throw std::runtime_error(instance_config.status().message()); } @@ -210,13 +214,13 @@ void ListInstanceConfigsCommand(std::vector argv) { if (argv.size() != 1) { throw std::runtime_error("list-instance-configs "); } - google::cloud::spanner::InstanceAdminClient client( - google::cloud::spanner::MakeInstanceAdminConnection()); + google::cloud::spanner_admin::InstanceAdminClient client( + google::cloud::spanner_admin::MakeInstanceAdminConnection()); ListInstanceConfigs(std::move(client), argv[0]); } //! [START spanner_get_instance_config] [get-instance-config] -void GetInstanceConfig(google::cloud::spanner::InstanceAdminClient client, +void GetInstanceConfig(google::cloud::spanner_admin::InstanceAdminClient client, std::string const& project_id, std::string const& instance_config_name) { auto instance_config = client.GetInstanceConfig( @@ -236,16 +240,16 @@ void GetInstanceConfigCommand(std::vector argv) { throw std::runtime_error( "get-instance-config "); } - google::cloud::spanner::InstanceAdminClient client( - google::cloud::spanner::MakeInstanceAdminConnection()); + google::cloud::spanner_admin::InstanceAdminClient client( + google::cloud::spanner_admin::MakeInstanceAdminConnection()); GetInstanceConfig(std::move(client), argv[0], argv[1]); } //! [list-instances] -void ListInstances(google::cloud::spanner::InstanceAdminClient client, +void ListInstances(google::cloud::spanner_admin::InstanceAdminClient client, std::string const& project_id) { int count = 0; - for (auto const& instance : client.ListInstances(project_id, "")) { + for (auto const& instance : client.ListInstances("projects/" + project_id)) { if (!instance) throw std::runtime_error(instance.status().message()); ++count; std::cout << "Instance [" << count << "]:\n" << instance->DebugString(); @@ -260,17 +264,17 @@ void ListInstancesCommand(std::vector argv) { if (argv.size() != 1) { throw std::runtime_error("list-instances "); } - google::cloud::spanner::InstanceAdminClient client( - google::cloud::spanner::MakeInstanceAdminConnection()); + google::cloud::spanner_admin::InstanceAdminClient client( + google::cloud::spanner_admin::MakeInstanceAdminConnection()); ListInstances(std::move(client), argv[0]); } //! [instance-get-iam-policy] -void InstanceGetIamPolicy(google::cloud::spanner::InstanceAdminClient client, - std::string const& project_id, - std::string const& instance_id) { +void InstanceGetIamPolicy( + google::cloud::spanner_admin::InstanceAdminClient client, + std::string const& project_id, std::string const& instance_id) { google::cloud::spanner::Instance in(project_id, instance_id); - auto actual = client.GetIamPolicy(in); + auto actual = client.GetIamPolicy(in.FullName()); if (!actual) throw std::runtime_error(actual.status().message()); std::cout << "The IAM policy for instance " << instance_id << " is:\n" @@ -283,19 +287,19 @@ void InstanceGetIamPolicyCommand(std::vector argv) { throw std::runtime_error( "instance-get-iam-policy "); } - google::cloud::spanner::InstanceAdminClient client( - google::cloud::spanner::MakeInstanceAdminConnection()); + google::cloud::spanner_admin::InstanceAdminClient client( + google::cloud::spanner_admin::MakeInstanceAdminConnection()); InstanceGetIamPolicy(std::move(client), argv[0], argv[1]); } //! [add-database-reader] -void AddDatabaseReader(google::cloud::spanner::InstanceAdminClient client, +void AddDatabaseReader(google::cloud::spanner_admin::InstanceAdminClient client, std::string const& project_id, std::string const& instance_id, std::string const& new_reader) { google::cloud::spanner::Instance in(project_id, instance_id); auto result = client.SetIamPolicy( - in, + in.FullName(), [&new_reader](google::iam::v1::Policy current) -> absl::optional { // Find (or create) the binding for "roles/spanner.databaseReader". @@ -339,20 +343,20 @@ void AddDatabaseReaderCommand(std::vector argv) { throw std::runtime_error( "add-database-reader "); } - google::cloud::spanner::InstanceAdminClient client( - google::cloud::spanner::MakeInstanceAdminConnection()); + google::cloud::spanner_admin::InstanceAdminClient client( + google::cloud::spanner_admin::MakeInstanceAdminConnection()); AddDatabaseReader(std::move(client), argv[0], argv[1], argv[2]); } //! [remove-database-reader] -void RemoveDatabaseReader(google::cloud::spanner::InstanceAdminClient client, - std::string const& project_id, - std::string const& instance_id, - std::string const& reader) { +void RemoveDatabaseReader( + google::cloud::spanner_admin::InstanceAdminClient client, + std::string const& project_id, std::string const& instance_id, + std::string const& reader) { google::cloud::spanner::Instance in(project_id, instance_id); auto result = client.SetIamPolicy( - in, + in.FullName(), [&reader](google::iam::v1::Policy current) -> absl::optional { // Find the binding for "roles/spanner.databaseReader". @@ -388,17 +392,18 @@ void RemoveDatabaseReaderCommand(std::vector argv) { throw std::runtime_error( "remove-database-reader "); } - google::cloud::spanner::InstanceAdminClient client( - google::cloud::spanner::MakeInstanceAdminConnection()); + google::cloud::spanner_admin::InstanceAdminClient client( + google::cloud::spanner_admin::MakeInstanceAdminConnection()); RemoveDatabaseReader(std::move(client), argv[0], argv[1], argv[2]); } //! [instance-test-iam-permissions] void InstanceTestIamPermissions( - google::cloud::spanner::InstanceAdminClient client, + google::cloud::spanner_admin::InstanceAdminClient client, std::string const& project_id, std::string const& instance_id) { google::cloud::spanner::Instance in(project_id, instance_id); - auto actual = client.TestIamPermissions(in, {"spanner.databases.list"}); + auto actual = + client.TestIamPermissions(in.FullName(), {"spanner.databases.list"}); if (!actual) throw std::runtime_error(actual.status().message()); char const* msg = actual->permissions().empty() ? "does not" : "does"; @@ -415,8 +420,8 @@ void InstanceTestIamPermissionsCommand(std::vector argv) { throw std::runtime_error( "instance-test-iam-permissions "); } - google::cloud::spanner::InstanceAdminClient client( - google::cloud::spanner::MakeInstanceAdminConnection()); + google::cloud::spanner_admin::InstanceAdminClient client( + google::cloud::spanner_admin::MakeInstanceAdminConnection()); InstanceTestIamPermissions(std::move(client), argv[0], argv[1]); } @@ -445,28 +450,31 @@ google::cloud::spanner::Client MakeSampleClient( } //! [create-database] [START spanner_create_database] -void CreateDatabase(google::cloud::spanner::DatabaseAdminClient client, +void CreateDatabase(google::cloud::spanner_admin::DatabaseAdminClient client, std::string const& project_id, std::string const& instance_id, std::string const& database_id) { google::cloud::spanner::Database database(project_id, instance_id, database_id); - std::vector extra_statements; - extra_statements.emplace_back(R"""( + google::spanner::admin::database::v1::CreateDatabaseRequest request; + request.set_parent(database.instance().FullName()); + request.set_create_statement("CREATE DATABASE `" + database.database_id() + + "`"); + request.add_extra_statements(R"""( CREATE TABLE Singers ( SingerId INT64 NOT NULL, FirstName STRING(1024), LastName STRING(1024), SingerInfo BYTES(MAX) ) PRIMARY KEY (SingerId))"""); - extra_statements.emplace_back(R"""( + request.add_extra_statements(R"""( CREATE TABLE Albums ( SingerId INT64 NOT NULL, AlbumId INT64 NOT NULL, AlbumTitle STRING(MAX) ) PRIMARY KEY (SingerId, AlbumId), INTERLEAVE IN PARENT Singers ON DELETE CASCADE)"""); - auto db = client.CreateDatabase(database, std::move(extra_statements)).get(); + auto db = client.CreateDatabase(request).get(); if (!db) throw std::runtime_error(db.status().message()); std::cout << "Database " << db->name() << " created.\n"; } @@ -474,33 +482,37 @@ void CreateDatabase(google::cloud::spanner::DatabaseAdminClient client, // [START spanner_create_database_with_version_retention_period] void CreateDatabaseWithVersionRetentionPeriod( - google::cloud::spanner::DatabaseAdminClient client, + google::cloud::spanner_admin::DatabaseAdminClient client, std::string const& project_id, std::string const& instance_id, std::string const& database_id) { google::cloud::spanner::Database database(project_id, instance_id, database_id); - std::vector extra_statements; - extra_statements.push_back("ALTER DATABASE `" + database_id + "` " + - "SET OPTIONS (version_retention_period='2h')"); - extra_statements.emplace_back(R"""( + google::spanner::admin::database::v1::CreateDatabaseRequest request; + request.set_parent(database.instance().FullName()); + request.set_create_statement("CREATE DATABASE `" + database.database_id() + + "`"); + request.add_extra_statements("ALTER DATABASE `" + database.database_id() + + "` " + + "SET OPTIONS (version_retention_period='2h')"); + request.add_extra_statements(R"""( CREATE TABLE Singers ( SingerId INT64 NOT NULL, FirstName STRING(1024), LastName STRING(1024), SingerInfo BYTES(MAX) ) PRIMARY KEY (SingerId))"""); - extra_statements.emplace_back(R"""( + request.add_extra_statements(R"""( CREATE TABLE Albums ( SingerId INT64 NOT NULL, AlbumId INT64 NOT NULL, AlbumTitle STRING(MAX) ) PRIMARY KEY (SingerId, AlbumId), INTERLEAVE IN PARENT Singers ON DELETE CASCADE)"""); - auto db = client.CreateDatabase(database, std::move(extra_statements)).get(); + auto db = client.CreateDatabase(request).get(); if (!db) throw std::runtime_error(db.status().message()); std::cout << "Database " << db->name() << " created.\n"; - auto ddl = client.GetDatabaseDdl(database); + auto ddl = client.GetDatabaseDdl(db->name()); if (!ddl) throw std::runtime_error(ddl.status().message()); std::cout << "Database DDL is:\n" << ddl->DebugString(); } @@ -508,16 +520,19 @@ void CreateDatabaseWithVersionRetentionPeriod( // [START spanner_create_database_with_default_leader] void CreateDatabaseWithDefaultLeader( - google::cloud::spanner::DatabaseAdminClient client, + google::cloud::spanner_admin::DatabaseAdminClient client, std::string const& project_id, std::string const& instance_id, std::string const& database_id, std::string const& default_leader) { google::cloud::spanner::Database database(project_id, instance_id, database_id); - std::vector extra_statements; - extra_statements.push_back("ALTER DATABASE `" + database_id + "` " + - "SET OPTIONS (default_leader='" + default_leader + - "')"); - auto db = client.CreateDatabase(database, std::move(extra_statements)).get(); + google::spanner::admin::database::v1::CreateDatabaseRequest request; + request.set_parent(database.instance().FullName()); + request.set_create_statement("CREATE DATABASE `" + database.database_id() + + "`"); + request.add_extra_statements("ALTER DATABASE `" + database_id + "` " + + "SET OPTIONS (default_leader='" + + default_leader + "')"); + auto db = client.CreateDatabase(request).get(); if (!db) throw std::runtime_error(db.status().message()); std::cout << "Database " << db->name() << " created.\n" << db->DebugString(); } @@ -525,7 +540,7 @@ void CreateDatabaseWithDefaultLeader( // [START spanner_update_database_with_default_leader] void UpdateDatabaseWithDefaultLeader( - google::cloud::spanner::DatabaseAdminClient client, + google::cloud::spanner_admin::DatabaseAdminClient client, std::string const& project_id, std::string const& instance_id, std::string const& database_id, std::string const& default_leader) { google::cloud::spanner::Database database(project_id, instance_id, @@ -533,7 +548,9 @@ void UpdateDatabaseWithDefaultLeader( std::vector statements; statements.push_back("ALTER DATABASE `" + database_id + "` " + "SET OPTIONS (default_leader='" + default_leader + "')"); - auto metadata = client.UpdateDatabase(database, std::move(statements)).get(); + auto metadata = + client.UpdateDatabaseDdl(database.FullName(), std::move(statements)) + .get(); if (!metadata) throw std::runtime_error(metadata.status().message()); std::cout << "`default_leader` altered, new DDL metadata:\n" << metadata->DebugString(); @@ -542,13 +559,13 @@ void UpdateDatabaseWithDefaultLeader( // [START spanner_create_table_with_datatypes] void CreateTableWithDatatypes( - google::cloud::spanner::DatabaseAdminClient client, + google::cloud::spanner_admin::DatabaseAdminClient client, std::string const& project_id, std::string const& instance_id, std::string const& database_id) { google::cloud::spanner::Database database(project_id, instance_id, database_id); auto metadata = client - .UpdateDatabase(database, {R"""( + .UpdateDatabaseDdl(database.FullName(), {R"""( CREATE TABLE Venues ( VenueId INT64 NOT NULL, VenueName STRING(100), @@ -569,13 +586,13 @@ void CreateTableWithDatatypes( // [START spanner_create_table_with_timestamp_column] void CreateTableWithTimestamp( - google::cloud::spanner::DatabaseAdminClient client, + google::cloud::spanner_admin::DatabaseAdminClient client, std::string const& project_id, std::string const& instance_id, std::string const& database_id) { google::cloud::spanner::Database database(project_id, instance_id, database_id); auto metadata = client - .UpdateDatabase(database, {R"""( + .UpdateDatabaseDdl(database.FullName(), {R"""( CREATE TABLE Performances ( SingerId INT64 NOT NULL, VenueId INT64 NOT NULL, @@ -593,15 +610,15 @@ void CreateTableWithTimestamp( // [END spanner_create_table_with_timestamp_column] // [START spanner_create_index] -void AddIndex(google::cloud::spanner::DatabaseAdminClient client, +void AddIndex(google::cloud::spanner_admin::DatabaseAdminClient client, std::string const& project_id, std::string const& instance_id, std::string const& database_id) { google::cloud::spanner::Database database(project_id, instance_id, database_id); auto metadata = client - .UpdateDatabase( - database, + .UpdateDatabaseDdl( + database.FullName(), {"CREATE INDEX AlbumsByAlbumTitle ON Albums(AlbumTitle)"}) .get(); if (!metadata) throw std::runtime_error(metadata.status().message()); @@ -611,40 +628,41 @@ void AddIndex(google::cloud::spanner::DatabaseAdminClient client, // [END spanner_create_index] //! [get-database] -void GetDatabase(google::cloud::spanner::DatabaseAdminClient client, +void GetDatabase(google::cloud::spanner_admin::DatabaseAdminClient client, std::string const& project_id, std::string const& instance_id, std::string const& database_id) { namespace spanner = ::google::cloud::spanner; auto database = client.GetDatabase( - spanner::Database(project_id, instance_id, database_id)); + spanner::Database(project_id, instance_id, database_id).FullName()); if (!database) throw std::runtime_error(database.status().message()); std::cout << "Database metadata is:\n" << database->DebugString(); } //! [get-database] //! [START spanner_get_database_ddl] [get-database-ddl] -void GetDatabaseDdl(google::cloud::spanner::DatabaseAdminClient client, +void GetDatabaseDdl(google::cloud::spanner_admin::DatabaseAdminClient client, std::string const& project_id, std::string const& instance_id, std::string const& database_id) { namespace spanner = ::google::cloud::spanner; auto database = client.GetDatabaseDdl( - spanner::Database(project_id, instance_id, database_id)); + spanner::Database(project_id, instance_id, database_id).FullName()); if (!database) throw std::runtime_error(database.status().message()); std::cout << "Database metadata is:\n" << database->DebugString(); } //! [END spanner_get_database_ddl] [get-database-ddl] //! [update-database] [START spanner_add_column] -void AddColumn(google::cloud::spanner::DatabaseAdminClient client, +void AddColumn(google::cloud::spanner_admin::DatabaseAdminClient client, std::string const& project_id, std::string const& instance_id, std::string const& database_id) { google::cloud::spanner::Database database(project_id, instance_id, database_id); auto metadata = client - .UpdateDatabase( - database, {"ALTER TABLE Albums ADD COLUMN MarketingBudget INT64"}) + .UpdateDatabaseDdl( + database.FullName(), + {"ALTER TABLE Albums ADD COLUMN MarketingBudget INT64"}) .get(); if (!metadata) throw std::runtime_error(metadata.status().message()); std::cout << "Added MarketingBudget column\n"; @@ -652,16 +670,16 @@ void AddColumn(google::cloud::spanner::DatabaseAdminClient client, //! [update-database] [END spanner_add_column] // [START spanner_add_timestamp_column] -void AddTimestampColumn(google::cloud::spanner::DatabaseAdminClient client, - std::string const& project_id, - std::string const& instance_id, - std::string const& database_id) { +void AddTimestampColumn( + google::cloud::spanner_admin::DatabaseAdminClient client, + std::string const& project_id, std::string const& instance_id, + std::string const& database_id) { google::cloud::spanner::Database database(project_id, instance_id, database_id); auto metadata = client - .UpdateDatabase( - database, + .UpdateDatabaseDdl( + database.FullName(), {"ALTER TABLE Albums ADD COLUMN LastUpdateTime TIMESTAMP " "OPTIONS (allow_commit_timestamp=true)"}) .get(); @@ -671,14 +689,14 @@ void AddTimestampColumn(google::cloud::spanner::DatabaseAdminClient client, // [END spanner_add_timestamp_column] // [START spanner_create_storing_index] -void AddStoringIndex(google::cloud::spanner::DatabaseAdminClient client, +void AddStoringIndex(google::cloud::spanner_admin::DatabaseAdminClient client, std::string const& project_id, std::string const& instance_id, std::string const& database_id) { google::cloud::spanner::Database database(project_id, instance_id, database_id); auto metadata = client - .UpdateDatabase(database, {R"""( + .UpdateDatabaseDdl(database.FullName(), {R"""( CREATE INDEX AlbumsByAlbumTitle2 ON Albums(AlbumTitle) STORING (MarketingBudget))"""}) .get(); @@ -689,12 +707,12 @@ void AddStoringIndex(google::cloud::spanner::DatabaseAdminClient client, // [END spanner_create_storing_index] //! [START spanner_list_databases] [list-databases] -void ListDatabases(google::cloud::spanner::DatabaseAdminClient client, +void ListDatabases(google::cloud::spanner_admin::DatabaseAdminClient client, std::string const& project_id, std::string const& instance_id) { google::cloud::spanner::Instance in(project_id, instance_id); int count = 0; - for (auto const& database : client.ListDatabases(in)) { + for (auto const& database : client.ListDatabases(in.FullName())) { if (!database) throw std::runtime_error(database.status().message()); std::cout << "Database " << database->name() << " full metadata:\n" << database->DebugString(); @@ -711,20 +729,28 @@ void ListDatabasesCommand(std::vector argv) { if (argv.size() != 2) { throw std::runtime_error("list-databases "); } - google::cloud::spanner::DatabaseAdminClient client; + google::cloud::spanner_admin::DatabaseAdminClient client( + google::cloud::spanner_admin::MakeDatabaseAdminConnection()); ListDatabases(std::move(client), argv[0], argv[1]); } //! [create-backup] [START spanner_create_backup] -void CreateBackup(google::cloud::spanner::DatabaseAdminClient client, +void CreateBackup(google::cloud::spanner_admin::DatabaseAdminClient client, std::string const& project_id, std::string const& instance_id, std::string const& database_id, std::string const& backup_id, google::cloud::spanner::Timestamp expire_time, google::cloud::spanner::Timestamp version_time) { google::cloud::spanner::Database database(project_id, instance_id, database_id); - auto backup = - client.CreateBackup(database, backup_id, expire_time, version_time).get(); + google::spanner::admin::database::v1::CreateBackupRequest request; + request.set_parent(database.instance().FullName()); + request.set_backup_id(backup_id); + request.mutable_backup()->set_database(database.FullName()); + *request.mutable_backup()->mutable_expire_time() = + expire_time.get().value(); + *request.mutable_backup()->mutable_version_time() = + version_time.get().value(); + auto backup = client.CreateBackup(request).get(); if (!backup) throw std::runtime_error(backup.status().message()); std::cout << "Backup " << backup->name() << " of " << backup->database() @@ -740,14 +766,15 @@ void CreateBackupCommand(std::vector argv) { throw std::runtime_error( "create-backup "); } - google::cloud::spanner::DatabaseAdminClient client; + google::cloud::spanner_admin::DatabaseAdminClient client( + google::cloud::spanner_admin::MakeDatabaseAdminConnection()); auto now = DatabaseNow(MakeSampleClient(argv[0], argv[1], argv[2])); CreateBackup(std::move(client), argv[0], argv[1], argv[2], argv[3], TimestampAdd(now, absl::Hours(7)), now); } //! [restore-database] [START spanner_restore_backup] -void RestoreDatabase(google::cloud::spanner::DatabaseAdminClient client, +void RestoreDatabase(google::cloud::spanner_admin::DatabaseAdminClient client, std::string const& project_id, std::string const& instance_id, std::string const& database_id, @@ -755,7 +782,11 @@ void RestoreDatabase(google::cloud::spanner::DatabaseAdminClient client, google::cloud::spanner::Database database(project_id, instance_id, database_id); google::cloud::spanner::Backup backup(database.instance(), backup_id); - auto restored_db = client.RestoreDatabase(database, backup).get(); + auto restored_db = + client + .RestoreDatabase(database.instance().FullName(), + database.database_id(), backup.FullName()) + .get(); if (!restored_db) { throw std::runtime_error(restored_db.status().message()); } @@ -779,17 +810,18 @@ void RestoreDatabaseCommand(std::vector argv) { throw std::runtime_error( "restore-backup "); } - google::cloud::spanner::DatabaseAdminClient client; + google::cloud::spanner_admin::DatabaseAdminClient client( + google::cloud::spanner_admin::MakeDatabaseAdminConnection()); RestoreDatabase(std::move(client), argv[0], argv[1], argv[2], argv[3]); } //! [get-backup] [START spanner_get_backup] -void GetBackup(google::cloud::spanner::DatabaseAdminClient client, +void GetBackup(google::cloud::spanner_admin::DatabaseAdminClient client, std::string const& project_id, std::string const& instance_id, std::string const& backup_id) { google::cloud::spanner::Backup backup_name( google::cloud::spanner::Instance(project_id, instance_id), backup_id); - auto backup = client.GetBackup(backup_name); + auto backup = client.GetBackup(backup_name.FullName()); if (!backup) throw std::runtime_error(backup.status().message()); std::cout << "Backup " << backup->name() << " of size " << backup->size_bytes() @@ -804,18 +836,24 @@ void GetBackupCommand(std::vector argv) { throw std::runtime_error( "get-backup "); } - google::cloud::spanner::DatabaseAdminClient client; + google::cloud::spanner_admin::DatabaseAdminClient client( + google::cloud::spanner_admin::MakeDatabaseAdminConnection()); GetBackup(std::move(client), argv[0], argv[1], argv[2]); } //! [update-backup] [START spanner_update_backup] -void UpdateBackup(google::cloud::spanner::DatabaseAdminClient client, +void UpdateBackup(google::cloud::spanner_admin::DatabaseAdminClient client, std::string const& project_id, std::string const& instance_id, std::string const& backup_id, google::cloud::spanner::Timestamp expire_time) { google::cloud::spanner::Backup backup_name( google::cloud::spanner::Instance(project_id, instance_id), backup_id); - auto backup = client.UpdateBackupExpireTime(backup_name, expire_time); + google::spanner::admin::database::v1::UpdateBackupRequest request; + request.mutable_backup()->set_name(backup_name.FullName()); + *request.mutable_backup()->mutable_expire_time() = + expire_time.get().value(); + request.mutable_update_mask()->add_paths("expire_time"); + auto backup = client.UpdateBackup(request); if (!backup) throw std::runtime_error(backup.status().message()); std::cout << "Backup " << backup->name() << " updated to expire at " @@ -829,19 +867,20 @@ void UpdateBackupCommand(std::vector argv) { throw std::runtime_error( "update-backup "); } - google::cloud::spanner::DatabaseAdminClient client; + google::cloud::spanner_admin::DatabaseAdminClient client( + google::cloud::spanner_admin::MakeDatabaseAdminConnection()); auto now = DatabaseNow(MakeSampleClient(argv[0], argv[1], argv[2])); UpdateBackup(std::move(client), argv[0], argv[1], argv[2], TimestampAdd(now, absl::Hours(7))); } //! [delete-backup] [START spanner_delete_backup] -void DeleteBackup(google::cloud::spanner::DatabaseAdminClient client, +void DeleteBackup(google::cloud::spanner_admin::DatabaseAdminClient client, std::string const& project_id, std::string const& instance_id, std::string const& backup_id) { google::cloud::spanner::Backup backup( google::cloud::spanner::Instance(project_id, instance_id), backup_id); - auto status = client.DeleteBackup(backup); + auto status = client.DeleteBackup(backup.FullName()); if (!status.ok()) throw std::runtime_error(status.message()); std::cout << "Backup " << backup.FullName() << " was deleted.\n"; } @@ -852,24 +891,30 @@ void DeleteBackupCommand(std::vector argv) { throw std::runtime_error( "delete-backup "); } - google::cloud::spanner::DatabaseAdminClient client; + google::cloud::spanner_admin::DatabaseAdminClient client( + google::cloud::spanner_admin::MakeDatabaseAdminConnection()); DeleteBackup(std::move(client), argv[0], argv[1], argv[2]); } // [START spanner_cancel_backup_create] -void CreateBackupAndCancel(google::cloud::spanner::DatabaseAdminClient client, - std::string const& project_id, - std::string const& instance_id, - std::string const& database_id, - std::string const& backup_id, - google::cloud::spanner::Timestamp expire_time) { +void CreateBackupAndCancel( + google::cloud::spanner_admin::DatabaseAdminClient client, + std::string const& project_id, std::string const& instance_id, + std::string const& database_id, std::string const& backup_id, + google::cloud::spanner::Timestamp expire_time) { google::cloud::spanner::Database database(project_id, instance_id, database_id); - auto f = client.CreateBackup(database, backup_id, expire_time); + google::spanner::admin::database::v1::CreateBackupRequest request; + request.set_parent(database.instance().FullName()); + request.set_backup_id(backup_id); + request.mutable_backup()->set_database(database.FullName()); + *request.mutable_backup()->mutable_expire_time() = + expire_time.get().value(); + auto f = client.CreateBackup(request); f.cancel(); auto backup = f.get(); if (backup) { - auto status = client.DeleteBackup(*backup); + auto status = client.DeleteBackup(backup->name()); if (!status.ok()) throw std::runtime_error(status.message()); std::cout << "Backup " << backup->name() << " was deleted.\n"; } else { @@ -885,7 +930,8 @@ void CreateBackupAndCancelCommand(std::vector argv) { "create-backup-and-cancel " " "); } - google::cloud::spanner::DatabaseAdminClient client; + google::cloud::spanner_admin::DatabaseAdminClient client( + google::cloud::spanner_admin::MakeDatabaseAdminConnection()); auto now = DatabaseNow(MakeSampleClient(argv[0], argv[1], argv[2])); CreateBackupAndCancel(std::move(client), argv[0], argv[1], argv[2], argv[3], TimestampAdd(now, absl::Hours(7))); @@ -894,33 +940,33 @@ void CreateBackupAndCancelCommand(std::vector argv) { //! [create-database-with-encryption-key] // [START spanner_create_database_with_encryption_key] void CreateDatabaseWithEncryptionKey( - google::cloud::spanner::DatabaseAdminClient client, + google::cloud::spanner_admin::DatabaseAdminClient client, std::string const& project_id, std::string const& instance_id, std::string const& database_id, google::cloud::KmsKeyName const& encryption_key) { google::cloud::spanner::Database database(project_id, instance_id, database_id); - std::vector extra_statements; - extra_statements.emplace_back(R"""( + google::spanner::admin::database::v1::CreateDatabaseRequest request; + request.set_parent(database.instance().FullName()); + request.set_create_statement("CREATE DATABASE `" + database.database_id() + + "`"); + request.add_extra_statements(R"""( CREATE TABLE Singers ( SingerId INT64 NOT NULL, FirstName STRING(1024), LastName STRING(1024), SingerInfo BYTES(MAX) ) PRIMARY KEY (SingerId))"""); - extra_statements.emplace_back(R"""( + request.add_extra_statements(R"""( CREATE TABLE Albums ( SingerId INT64 NOT NULL, AlbumId INT64 NOT NULL, AlbumTitle STRING(MAX) ) PRIMARY KEY (SingerId, AlbumId), INTERLEAVE IN PARENT Singers ON DELETE CASCADE)"""); - auto db = - client - .CreateDatabase( - database, std::move(extra_statements), - google::cloud::spanner::CustomerManagedEncryption(encryption_key)) - .get(); + request.mutable_encryption_config()->set_kms_key_name( + encryption_key.FullName()); + auto db = client.CreateDatabase(request).get(); if (!db) throw std::runtime_error(db.status().message()); std::cout << "Database " << db->name() << " created"; std::cout << " using encryption key " << encryption_key.FullName(); @@ -935,7 +981,8 @@ void CreateDatabaseWithEncryptionKeyCommand(std::vector argv) { "create-database-with-encryption-key " " "); } - google::cloud::spanner::DatabaseAdminClient client; + google::cloud::spanner_admin::DatabaseAdminClient client( + google::cloud::spanner_admin::MakeDatabaseAdminConnection()); google::cloud::KmsKeyName encryption_key(/*project_id=*/argv[0], /*location=*/argv[3], /*key_ring=*/argv[4], @@ -947,7 +994,7 @@ void CreateDatabaseWithEncryptionKeyCommand(std::vector argv) { // [create-backup-with-encryption-key] // [START spanner_create_backup_with_encryption_key] void CreateBackupWithEncryptionKey( - google::cloud::spanner::DatabaseAdminClient client, + google::cloud::spanner_admin::DatabaseAdminClient client, std::string const& project_id, std::string const& instance_id, std::string const& database_id, std::string const& backup_id, google::cloud::spanner::Timestamp expire_time, @@ -955,12 +1002,20 @@ void CreateBackupWithEncryptionKey( google::cloud::KmsKeyName const& encryption_key) { google::cloud::spanner::Database database(project_id, instance_id, database_id); - auto backup = - client - .CreateBackup( - database, backup_id, expire_time, version_time, - google::cloud::spanner::CustomerManagedEncryption(encryption_key)) - .get(); + google::spanner::admin::database::v1::CreateBackupRequest request; + request.set_parent(database.instance().FullName()); + request.set_backup_id(backup_id); + request.mutable_backup()->set_database(database.FullName()); + *request.mutable_backup()->mutable_expire_time() = + expire_time.get().value(); + *request.mutable_backup()->mutable_version_time() = + version_time.get().value(); + request.mutable_encryption_config()->set_encryption_type( + google::spanner::admin::database::v1::CreateBackupEncryptionConfig:: + CUSTOMER_MANAGED_ENCRYPTION); + request.mutable_encryption_config()->set_kms_key_name( + encryption_key.FullName()); + auto backup = client.CreateBackup(request).get(); if (!backup) throw std::runtime_error(backup.status().message()); std::cout << "Backup " << backup->name() << " of " << backup->database() @@ -978,7 +1033,8 @@ void CreateBackupWithEncryptionKeyCommand(std::vector argv) { "create-backup-with-encryption-key " " "); } - google::cloud::spanner::DatabaseAdminClient client; + google::cloud::spanner_admin::DatabaseAdminClient client( + google::cloud::spanner_admin::MakeDatabaseAdminConnection()); auto now = DatabaseNow(MakeSampleClient(argv[0], argv[1], argv[2])); google::cloud::KmsKeyName encryption_key(/*project_id=*/argv[0], /*location=*/argv[4], @@ -992,19 +1048,23 @@ void CreateBackupWithEncryptionKeyCommand(std::vector argv) { // [restore-database-with-encryption-key] // [START spanner_restore_backup_with_encryption_key] void RestoreDatabaseWithEncryptionKey( - google::cloud::spanner::DatabaseAdminClient client, + google::cloud::spanner_admin::DatabaseAdminClient client, std::string const& project_id, std::string const& instance_id, std::string const& database_id, std::string const& backup_id, google::cloud::KmsKeyName const& encryption_key) { google::cloud::spanner::Database database(project_id, instance_id, database_id); google::cloud::spanner::Backup backup(database.instance(), backup_id); - auto restored_db = - client - .RestoreDatabase( - database, backup, - google::cloud::spanner::CustomerManagedEncryption(encryption_key)) - .get(); + google::spanner::admin::database::v1::RestoreDatabaseRequest request; + request.set_parent(database.instance().instance_id()); + request.set_database_id(database.database_id()); + request.set_backup(backup.FullName()); + request.mutable_encryption_config()->set_encryption_type( + google::spanner::admin::database::v1::RestoreDatabaseEncryptionConfig:: + CUSTOMER_MANAGED_ENCRYPTION); + request.mutable_encryption_config()->set_kms_key_name( + encryption_key.FullName()); + auto restored_db = client.RestoreDatabase(request).get(); if (!restored_db) { throw std::runtime_error(restored_db.status().message()); } @@ -1031,7 +1091,8 @@ void RestoreDatabaseWithEncryptionKeyCommand(std::vector argv) { "restore-database-with-encryption-key " " "); } - google::cloud::spanner::DatabaseAdminClient client; + google::cloud::spanner_admin::DatabaseAdminClient client( + google::cloud::spanner_admin::MakeDatabaseAdminConnection()); google::cloud::KmsKeyName encryption_key(/*project_id=*/argv[0], /*location=*/argv[4], /*key_ring=*/argv[5], @@ -1041,12 +1102,12 @@ void RestoreDatabaseWithEncryptionKeyCommand(std::vector argv) { } //! [list-backups] [START spanner_list_backups] -void ListBackups(google::cloud::spanner::DatabaseAdminClient client, +void ListBackups(google::cloud::spanner_admin::DatabaseAdminClient client, std::string const& project_id, std::string const& instance_id) { google::cloud::spanner::Instance in(project_id, instance_id); std::cout << "All backups:\n"; - for (auto const& backup : client.ListBackups(in)) { + for (auto const& backup : client.ListBackups(in.FullName())) { if (!backup) throw std::runtime_error(backup.status().message()); std::cout << "Backup " << backup->name() << " on database " << backup->database() << " with size : " << backup->size_bytes() @@ -1059,20 +1120,23 @@ void ListBackupsCommand(std::vector argv) { if (argv.size() != 2) { throw std::runtime_error("list-backups "); } - google::cloud::spanner::DatabaseAdminClient client; + google::cloud::spanner_admin::DatabaseAdminClient client( + google::cloud::spanner_admin::MakeDatabaseAdminConnection()); ListBackups(std::move(client), argv[0], argv[1]); } //! [list-backup-operations] [START spanner_list_backup_operations] -void ListBackupOperations(google::cloud::spanner::DatabaseAdminClient client, - std::string const& project_id, - std::string const& instance_id, - std::string const& database_id) { +void ListBackupOperations( + google::cloud::spanner_admin::DatabaseAdminClient client, + std::string const& project_id, std::string const& instance_id, + std::string const& database_id) { google::cloud::spanner::Instance in(project_id, instance_id); - auto filter = std::string("(metadata.database:") + database_id + ") AND " + - "(metadata.@type:type.googleapis.com/" + - "google.spanner.admin.database.v1.CreateBackupMetadata)"; - for (auto const& operation : client.ListBackupOperations(in, filter)) { + google::spanner::admin::database::v1::ListBackupOperationsRequest request; + request.set_parent(in.FullName()); + request.set_filter(std::string("(metadata.database:") + database_id + + ") AND " + "(metadata.@type:type.googleapis.com/" + + "google.spanner.admin.database.v1.CreateBackupMetadata)"); + for (auto const& operation : client.ListBackupOperations(request)) { if (!operation) throw std::runtime_error(operation.status().message()); google::spanner::admin::database::v1::CreateBackupMetadata metadata; operation->metadata().UnpackTo(&metadata); @@ -1085,14 +1149,16 @@ void ListBackupOperations(google::cloud::spanner::DatabaseAdminClient client, //! [list-backup-operations] [END spanner_list_backup_operations] //! [list-database-operations] [START spanner_list_database_operations] -void ListDatabaseOperations(google::cloud::spanner::DatabaseAdminClient client, - std::string const& project_id, - std::string const& instance_id) { +void ListDatabaseOperations( + google::cloud::spanner_admin::DatabaseAdminClient client, + std::string const& project_id, std::string const& instance_id) { google::cloud::spanner::Instance in(project_id, instance_id); - auto filter = std::string( + google::spanner::admin::database::v1::ListDatabaseOperationsRequest request; + request.set_parent(in.FullName()); + request.set_filter( "(metadata.@type:type.googleapis.com/" "google.spanner.admin.database.v1.OptimizeRestoredDatabaseMetadata)"); - for (auto const& operation : client.ListDatabaseOperations(in, filter)) { + for (auto const& operation : client.ListDatabaseOperations(request)) { if (!operation) throw std::runtime_error(operation.status().message()); google::spanner::admin::database::v1::OptimizeRestoredDatabaseMetadata metadata; @@ -1108,30 +1174,31 @@ void ListDatabaseOperationsCommand(std::vector argv) { throw std::runtime_error( "list-database-operations "); } - google::cloud::spanner::DatabaseAdminClient client; + google::cloud::spanner_admin::DatabaseAdminClient client( + google::cloud::spanner_admin::MakeDatabaseAdminConnection()); ListDatabaseOperations(std::move(client), argv[0], argv[1]); } //! [drop-database] [START spanner_drop_database] -void DropDatabase(google::cloud::spanner::DatabaseAdminClient client, +void DropDatabase(google::cloud::spanner_admin::DatabaseAdminClient client, std::string const& project_id, std::string const& instance_id, std::string const& database_id) { google::cloud::spanner::Database database(project_id, instance_id, database_id); - auto status = client.DropDatabase(database); + auto status = client.DropDatabase(database.FullName()); if (!status.ok()) throw std::runtime_error(status.message()); std::cout << "Database " << database << " successfully dropped\n"; } //! [drop-database] [END spanner_drop_database] //! [database-get-iam-policy] -void DatabaseGetIamPolicy(google::cloud::spanner::DatabaseAdminClient client, - std::string const& project_id, - std::string const& instance_id, - std::string const& database_id) { +void DatabaseGetIamPolicy( + google::cloud::spanner_admin::DatabaseAdminClient client, + std::string const& project_id, std::string const& instance_id, + std::string const& database_id) { google::cloud::spanner::Database database(project_id, instance_id, database_id); - auto actual = client.GetIamPolicy(database); + auto actual = client.GetIamPolicy(database.FullName()); if (!actual) throw std::runtime_error(actual.status().message()); std::cout << "The IAM policy for database " << database_id << " is:\n" @@ -1141,12 +1208,12 @@ void DatabaseGetIamPolicy(google::cloud::spanner::DatabaseAdminClient client, //! [add-database-reader-on-database] void AddDatabaseReaderOnDatabase( - google::cloud::spanner::DatabaseAdminClient client, + google::cloud::spanner_admin::DatabaseAdminClient client, std::string const& project_id, std::string const& instance_id, std::string const& database_id, std::string const& new_reader) { google::cloud::spanner::Database database(project_id, instance_id, database_id); - auto current = client.GetIamPolicy(database); + auto current = client.GetIamPolicy(database.FullName()); if (!current) throw std::runtime_error(current.status().message()); // Find (or create) the binding for "roles/spanner.databaseReader". @@ -1176,7 +1243,7 @@ void AddDatabaseReaderOnDatabase( } binding.add_members(new_reader); - auto result = client.SetIamPolicy(database, *std::move(current)); + auto result = client.SetIamPolicy(database.FullName(), *std::move(current)); if (!result) throw std::runtime_error(result.status().message()); std::cout << "Successfully added " << new_reader @@ -1191,19 +1258,19 @@ void AddDatabaseReaderOnDatabaseCommand(std::vector argv) { "add-database-reader-on-database " " "); } - google::cloud::spanner::DatabaseAdminClient client( - google::cloud::spanner::MakeDatabaseAdminConnection()); + google::cloud::spanner_admin::DatabaseAdminClient client( + google::cloud::spanner_admin::MakeDatabaseAdminConnection()); AddDatabaseReaderOnDatabase(std::move(client), argv[0], argv[1], argv[2], argv[3]); } //! [database-test-iam-permissions] void DatabaseTestIamPermissions( - google::cloud::spanner::DatabaseAdminClient client, + google::cloud::spanner_admin::DatabaseAdminClient client, std::string const& project_id, std::string const& instance_id, std::string const& database_id, std::string const& permission) { google::cloud::spanner::Database db(project_id, instance_id, database_id); - auto actual = client.TestIamPermissions(db, {permission}); + auto actual = client.TestIamPermissions(db.FullName(), {permission}); if (!actual) throw std::runtime_error(actual.status().message()); char const* msg = actual->permissions().empty() ? "does not" : "does"; @@ -1219,8 +1286,8 @@ void DatabaseTestIamPermissionsCommand(std::vector argv) { "database-test-iam-permissions " " "); } - google::cloud::spanner::DatabaseAdminClient client( - google::cloud::spanner::MakeDatabaseAdminConnection()); + google::cloud::spanner_admin::DatabaseAdminClient client( + google::cloud::spanner_admin::MakeDatabaseAdminConnection()); DatabaseTestIamPermissions(std::move(client), argv[0], argv[1], argv[2], argv[3]); } @@ -1803,14 +1870,14 @@ void QueryDataWithTimestamp(google::cloud::spanner::Client client) { // [END spanner_query_data_with_timestamp_column] // [START spanner_add_json_column] -void AddJsonColumn(google::cloud::spanner::DatabaseAdminClient client, +void AddJsonColumn(google::cloud::spanner_admin::DatabaseAdminClient client, std::string const& project_id, std::string const& instance_id, std::string const& database_id) { google::cloud::spanner::Database database(project_id, instance_id, database_id); auto metadata = client - .UpdateDatabase(database, {R"""( + .UpdateDatabaseDdl(database.FullName(), {R"""( ALTER TABLE Venues ADD COLUMN VenueDetails JSON)"""}) .get(); if (!metadata) throw std::runtime_error(metadata.status().message()); @@ -1880,14 +1947,14 @@ void QueryWithJsonParameter(google::cloud::spanner::Client client) { // [END spanner_query_with_json_parameter] // [START spanner_add_numeric_column] -void AddNumericColumn(google::cloud::spanner::DatabaseAdminClient client, +void AddNumericColumn(google::cloud::spanner_admin::DatabaseAdminClient client, std::string const& project_id, std::string const& instance_id, std::string const& database_id) { google::cloud::spanner::Database database(project_id, instance_id, database_id); auto metadata = client - .UpdateDatabase(database, {R"""( + .UpdateDatabaseDdl(database.FullName(), {R"""( ALTER TABLE Venues ADD COLUMN Revenue NUMERIC)"""}) .get(); if (!metadata) throw std::runtime_error(metadata.status().message()); @@ -2958,9 +3025,10 @@ void CustomInstanceAdminPolicies(std::vector argv) { [](std::string const& project_id) { // An instance admin client is controlled by three policies. The retry // policy determines for how long the client will retry transient failures. - auto retry_policy = spanner::LimitedTimeRetryPolicy( - /*maximum_duration=*/std::chrono::minutes(25)) - .clone(); + auto retry_policy = + google::cloud::spanner_admin::InstanceAdminLimitedTimeRetryPolicy( + /*maximum_duration=*/std::chrono::minutes(25)) + .clone(); // The backoff policy controls how long does the client waits to retry after // a transient failure. Here we configure a truncated exponential backoff // with jitter: @@ -2986,14 +3054,23 @@ void CustomInstanceAdminPolicies(std::vector argv) { /*maximum_delay=*/std::chrono::minutes(2), /*scaling=*/4.0)) .clone(); - auto client = - spanner::InstanceAdminClient(spanner::MakeInstanceAdminConnection( - spanner::ConnectionOptions{}, std::move(retry_policy), - std::move(backoff_policy), std::move(polling_policy))); + auto client = google::cloud::spanner_admin::InstanceAdminClient( + google::cloud::spanner_admin::MakeInstanceAdminConnection( + google::cloud::Options{} + .set( + std::move(retry_policy)) + .set( + std::move(backoff_policy)) + .set( + std::move(polling_policy)))); // Use the client as usual. std::cout << "Available configs for project " << project_id << "\n"; - for (auto const& cfg : client.ListInstanceConfigs(project_id)) { + for (auto const& cfg : + client.ListInstanceConfigs("projects/" + project_id)) { if (!cfg) throw std::runtime_error(cfg.status().message()); std::cout << cfg->name() << "\n"; } @@ -3013,9 +3090,10 @@ void CustomDatabaseAdminPolicies(std::vector argv) { [](std::string const& project_id, std::string const& instance_id) { // A database admin client is controlled by three policies. The retry // policy determines for how long the client will retry transient failures. - auto retry_policy = spanner::LimitedTimeRetryPolicy( - /*maximum_duration=*/std::chrono::minutes(25)) - .clone(); + auto retry_policy = + google::cloud::spanner_admin::DatabaseAdminLimitedTimeRetryPolicy( + /*maximum_duration=*/std::chrono::minutes(25)) + .clone(); // The backoff policy controls how long does the client waits to retry after // a transient failure. Here we configure a truncated exponential backoff // with jitter: @@ -3041,15 +3119,23 @@ void CustomDatabaseAdminPolicies(std::vector argv) { /*maximum_delay=*/std::chrono::minutes(2), /*scaling=*/4.0)) .clone(); - auto client = - spanner::DatabaseAdminClient(spanner::MakeDatabaseAdminConnection( - spanner::ConnectionOptions{}, std::move(retry_policy), - std::move(backoff_policy), std::move(polling_policy))); + auto client = google::cloud::spanner_admin::DatabaseAdminClient( + google::cloud::spanner_admin::MakeDatabaseAdminConnection( + google::cloud::Options{} + .set( + std::move(retry_policy)) + .set( + std::move(backoff_policy)) + .set( + std::move(polling_policy)))); // Use the client as usual. spanner::Instance instance(project_id, instance_id); std::cout << "Available databases for instance " << instance << "\n"; - for (auto const& db : client.ListDatabases(instance)) { + for (auto const& db : client.ListDatabases(instance.FullName())) { if (!db) throw std::runtime_error(db.status().message()); std::cout << db->name() << "\n"; } @@ -3291,8 +3377,8 @@ int RunOneCommand(std::vector argv) { }; using DatabaseAdminSampleFunction = - void (*)(google::cloud::spanner::DatabaseAdminClient, std::string const&, - std::string const&, std::string const&); + void (*)(google::cloud::spanner_admin::DatabaseAdminClient, + std::string const&, std::string const&, std::string const&); auto make_database_command_entry = [](std::string const& sample_name, DatabaseAdminSampleFunction sample) { auto make_command = [](std::string const& sample_name, @@ -3302,7 +3388,8 @@ int RunOneCommand(std::vector argv) { throw std::runtime_error(sample_name + " "); } - google::cloud::spanner::DatabaseAdminClient client; + google::cloud::spanner_admin::DatabaseAdminClient client( + google::cloud::spanner_admin::MakeDatabaseAdminConnection()); sample(client, argv[0], argv[1], argv[2]); }; }; @@ -3489,7 +3576,7 @@ int RunOneCommand(std::vector argv) { return 0; } -std::string PickConfig(google::cloud::spanner::InstanceAdminClient client, +std::string PickConfig(google::cloud::spanner_admin::InstanceAdminClient client, std::string const& project_id, google::cloud::internal::DefaultPRNG& generator) { // Skip non-US configs. They are too slow. @@ -3508,7 +3595,8 @@ std::string PickConfig(google::cloud::spanner::InstanceAdminClient client, std::string ret; std::string first; int i = 0; - for (auto const& instance_config : client.ListInstanceConfigs(project_id)) { + for (auto const& instance_config : + client.ListInstanceConfigs("projects/" + project_id)) { if (!instance_config) break; if (instance_config->name().rfind(config_prefix, 0) != 0) continue; auto const config = instance_config->name().substr(config_prefix.size()); @@ -3528,10 +3616,10 @@ std::string PickConfig(google::cloud::spanner::InstanceAdminClient client, } std::vector LeaderOptions( - google::cloud::spanner::InstanceAdminClient client, + google::cloud::spanner_admin::InstanceAdminClient client, std::string const& project_id, std::string const& instance_id) { google::cloud::spanner::Instance in(project_id, instance_id); - auto instance = client.GetInstance(in); + auto instance = client.GetInstance(in.FullName()); if (!instance) throw std::runtime_error(instance.status().message()); auto config = client.GetInstanceConfig(instance->config()); @@ -3544,8 +3632,8 @@ std::vector LeaderOptions( } void RunAllSlowInstanceTests( - google::cloud::spanner::InstanceAdminClient& instance_admin_client, - google::cloud::spanner::DatabaseAdminClient& database_admin_client, + google::cloud::spanner_admin::InstanceAdminClient& instance_admin_client, + google::cloud::spanner_admin::DatabaseAdminClient& database_admin_client, google::cloud::internal::DefaultPRNG& generator, std::string const& project_id, std::string const& test_iam_service_account, bool const emulator) { @@ -3732,12 +3820,20 @@ void RunAll(bool emulator) { std::string instance_id = *std::move(random_instance); std::cout << "Running samples on " << instance_id << std::endl; - google::cloud::spanner::InstanceAdminClient instance_admin_client( - google::cloud::spanner::MakeInstanceAdminConnection( - google::cloud::spanner::ConnectionOptions{}, - google::cloud::spanner_testing::TestRetryPolicy(), - google::cloud::spanner_testing::TestBackoffPolicy(), - google::cloud::spanner_testing::TestPollingPolicy())); + google::cloud::spanner_admin::InstanceAdminClient instance_admin_client( + google::cloud::spanner_admin::MakeInstanceAdminConnection( + google::cloud::Options{} + .set< + google::cloud::spanner_admin::InstanceAdminRetryPolicyOption>( + google::cloud::spanner_admin:: + InstanceAdminLimitedTimeRetryPolicy( + std::chrono::minutes(60)) + .clone()) + .set( + google::cloud::spanner::ExponentialBackoffPolicy( + std::chrono::seconds(1), std::chrono::minutes(1), 2.0) + .clone()))); std::cout << "\nRunning get-instance sample" << std::endl; GetInstance(instance_admin_client, project_id, instance_id); @@ -3760,12 +3856,20 @@ void RunAll(bool emulator) { std::string database_id = google::cloud::spanner_testing::RandomDatabaseName(generator); - google::cloud::spanner::DatabaseAdminClient database_admin_client( - MakeDatabaseAdminConnection( - google::cloud::spanner::ConnectionOptions{}, - google::cloud::spanner_testing::TestRetryPolicy(), - google::cloud::spanner_testing::TestBackoffPolicy(), - google::cloud::spanner_testing::TestPollingPolicy())); + google::cloud::spanner_admin::DatabaseAdminClient database_admin_client( + google::cloud::spanner_admin::MakeDatabaseAdminConnection( + google::cloud::Options{} + .set< + google::cloud::spanner_admin::DatabaseAdminRetryPolicyOption>( + google::cloud::spanner_admin:: + DatabaseAdminLimitedTimeRetryPolicy( + std::chrono::minutes(60)) + .clone()) + .set( + google::cloud::spanner::ExponentialBackoffPolicy( + std::chrono::seconds(1), std::chrono::minutes(1), 2.0) + .clone()))); RunAllSlowInstanceTests(instance_admin_client, database_admin_client, generator, project_id, test_iam_service_account, From bbab073546c7dc98f48b8fd10fc7023ea63cbd5b Mon Sep 17 00:00:00 2001 From: Bradley White <14679271+devbww@users.noreply.github.com> Date: Tue, 14 Sep 2021 15:45:45 -0400 Subject: [PATCH 2/2] Correct invalid RestoreDatabaseRequest. --- google/cloud/spanner/samples/samples.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/google/cloud/spanner/samples/samples.cc b/google/cloud/spanner/samples/samples.cc index cf674591b46b9..e547e3ef207ec 100644 --- a/google/cloud/spanner/samples/samples.cc +++ b/google/cloud/spanner/samples/samples.cc @@ -1056,7 +1056,7 @@ void RestoreDatabaseWithEncryptionKey( database_id); google::cloud::spanner::Backup backup(database.instance(), backup_id); google::spanner::admin::database::v1::RestoreDatabaseRequest request; - request.set_parent(database.instance().instance_id()); + request.set_parent(database.instance().FullName()); request.set_database_id(database.database_id()); request.set_backup(backup.FullName()); request.mutable_encryption_config()->set_encryption_type(