spanner/database_leader_placement_samples.rb (138 lines of code) (raw):
# Copyright 2021 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.
def instance_config project_id:, instance_config_id:
# [START spanner_get_instance_config]
# project_id = "Your Google Cloud project ID"
# instance_config_id = "Spanner instance config ID"
require "google/cloud/spanner"
require "google/cloud/spanner/admin/instance"
instance_admin_client = Google::Cloud::Spanner::Admin::Instance.instance_admin
instance_config_path = instance_admin_client.instance_config_path \
project: project_id, instance_config: instance_config_id
config = instance_admin_client.get_instance_config name: instance_config_path
puts "Available leader options for instance config #{config.name} : #{config.leader_options}"
# [END spanner_get_instance_config]
end
def list_instance_configs project_id:
# [START spanner_list_instance_configs]
# project_id = "Your Google Cloud project ID"
require "google/cloud/spanner"
require "google/cloud/spanner/admin/instance"
instance_admin_client = Google::Cloud::Spanner::Admin::Instance.instance_admin
project_path = instance_admin_client.project_path project: project_id
configs = instance_admin_client.list_instance_configs parent: project_path
configs.each do |c|
puts "Available leader options for instance config #{c.name} : #{c.leader_options}"
end
# [END spanner_list_instance_configs]
end
def list_databases project_id:, instance_id:
# [START spanner_list_databases]
# project_id = "Your Google Cloud project ID"
# instance_id = "Your Spanner instance ID"
require "google/cloud/spanner"
require "google/cloud/spanner/admin/database"
db_admin_client = Google::Cloud::Spanner::Admin::Database.database_admin project_id: project_id
instance_path = db_admin_client.instance_path project: project_id,
instance: instance_id
databases = db_admin_client.list_databases parent: instance_path
databases.each do |db|
puts "#{db.name} : default leader #{db.default_leader}"
end
# [END spanner_list_databases]
end
def create_database_with_default_leader \
project_id:, instance_id:, database_id:, default_leader:
# [START spanner_create_database_with_default_leader]
# project_id = "Your Google Cloud project ID"
# instance_id = "Your Spanner instance ID"
# database_id = "Your Spanner database ID"
# default_leader = "Spanner database default leader"
require "google/cloud/spanner"
require "google/cloud/spanner/admin/database"
db_admin_client = Google::Cloud::Spanner::Admin::Database.database_admin project_id: project_id
instance_path = \
db_admin_client.instance_path project: project_id, instance: instance_id
statements = [
"CREATE TABLE Singers (
SingerId INT64 NOT NULL,
FirstName STRING(1024),
LastName STRING(1024),
SingerInfo BYTES(MAX)
) PRIMARY KEY (SingerId)",
"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",
"ALTER DATABASE `#{database_id}` SET OPTIONS (
default_leader = '#{default_leader}'
)"
]
job = db_admin_client.create_database \
parent: instance_path,
create_statement: "CREATE DATABASE `#{database_id}`",
extra_statements: statements
job.wait_until_done!
database = job.results
puts "Created database [#{database.name}] with default leader: #{database.default_leader}"
# [END spanner_create_database_with_default_leader]
end
def update_database_with_default_leader \
project_id:, instance_id:, database_id:, default_leader:
# [START spanner_update_database_with_default_leader]
# project_id = "Your Google Cloud project ID"
# instance_id = "Your Spanner instance ID"
# database_id = "Your Spanner database ID"
# default_leader = "Spanner database default leader"
require "google/cloud/spanner"
require "google/cloud/spanner/admin/database"
db_admin_client = Google::Cloud::Spanner::Admin::Database.database_admin project_id: project_id
db_path = db_admin_client.database_path project: project_id,
instance: instance_id,
database: database_id
statements = [
"ALTER DATABASE `#{database_id}` SET OPTIONS (
default_leader = '#{default_leader}'
)"
]
job = db_admin_client.update_database_ddl database: db_path,
statements: statements
job.wait_until_done!
database = job.results
puts "Updated default leader"
# [END spanner_update_database_with_default_leader]
end
def database_ddl project_id:, instance_id:, database_id:
# [START spanner_get_database_ddl]
# project_id = "Your Google Cloud project ID"
# instance_id = "Your Spanner instance ID"
# database_id = "Your Spanner database ID"
require "google/cloud/spanner"
require "google/cloud/spanner/admin/database"
db_admin_client = Google::Cloud::Spanner::Admin::Database.database_admin project_id: project_id
db_path = db_admin_client.database_path project: project_id,
instance: instance_id,
database: database_id
ddl = db_admin_client.get_database_ddl database: db_path
puts ddl.statements
# [END spanner_get_database_ddl]
end
def query_information_schema_database_options \
project_id:, instance_id:, database_id:
# [START spanner_query_information_schema_database_options]
# project_id = "Your Google Cloud project ID"
# instance_id = "Your Spanner instance ID"
# database_id = "Your Spanner database ID
require "google/cloud/spanner"
spanner = Google::Cloud::Spanner.new project: project_id
client = spanner.client instance_id, database_id
client.execute(
"SELECT s.OPTION_NAME, s.OPTION_VALUE " \
"FROM INFORMATION_SCHEMA.DATABASE_OPTIONS s " \
"WHERE s.OPTION_NAME = 'default_leader'"
).rows.each do |row|
puts row
end
# [END spanner_query_information_schema_database_options]
end
def usage
puts <<~USAGE
Usage: bundle exec ruby database_leader_placement_samples.rb [command] [arguments]
Commands:
instance_config <instance_config_id> Get instance config
list_instance_configs List instance configs
list_databases <instance_id> List databases
create_database_with_default_leader <instance_id> <database_id> <default_leader> Create database with default leader
update_database_with_default_leader <instance_id> <database_id> <default_leader> Update database default leader
database_ddl <instance_id> <database_id> Get database DDL statements
query_information_schema_database_options <instance_id> <database_id> Get database information schema using option name
Environment variables:
GOOGLE_CLOUD_PROJECT must be set to your Google Cloud project ID
USAGE
end
def run_sample arguments
commands = [
"instance_config", "list_instance_configs", "list_databases",
"create_database_with_default_leader",
"update_database_with_default_leader", "database_ddl",
"query_information_schema_database_options"
]
command = arguments.shift
project_id = ENV["GOOGLE_CLOUD_PROJECT"]
return usage unless commands.include? command
sample_method = method command
parameters = { project_id: project_id }
sample_method.parameters.each do |paramater|
next if paramater.last == :project_id
parameters[paramater.last] = arguments.shift
end
sample_method.call(**parameters)
end
run_sample ARGV if $PROGRAM_NAME == __FILE__