class Magellan::Cli::CloudsqlInstance

Constants

CREATE_OPTION_SCOPE
OPTIONS

Public Instance Methods

build_args(options, commands) click to toggle source
# File lib/magellan/cli/cloudsql_instance.rb, line 130
def build_args(options, commands)
  opts = options.dup
  OPTIONS[:removed].keys.each{|k| opts.delete(k)}
  cmd_keys = (commands + [:overwritten]).map{|cmd| OPTIONS[cmd].keys }.flatten
  opts.delete_if{|k,_| !cmd_keys.include?(k)}
  opts.map{|k,v| "--#{k}=#{v}"}
end
check_gcloud_command() click to toggle source
# File lib/magellan/cli/cloudsql_instance.rb, line 144
def check_gcloud_command
  return true unless `which gcloud`.empty?
  $stderr.puts("\e[31m%s\e[0m" % I18n.t(:gcloud_not_found, scope: [:resources, :cloudsql_instance, :messages]))
  exit(1)
end
create(instance, *args) click to toggle source
# File lib/magellan/cli/cloudsql_instance.rb, line 45
def create(instance, *args)
  $stderr.puts(I18n.t(:starting_launch, scope: [:resources, :cloudsql_instance, :messages]))
  options["format"] = "json"
  create_args = build_args(options, [:common, :create])
  create_args << "--assign-ip" unless options["skip-assign-ip"]
  res1_text = gcloud("sql instances create #{instance}", create_args + args)
  res1 = res1_text.nil? ? nil : JSON.parse(res1_text)

  # p res1
  # res1
  # {
  #   "currentDiskSize"=>"281069967", "databaseVersion"=>"MYSQL_5_6", "etag"=>"\"wEP3hMpsWqL85yYiZI8N_zVwr4g/MQ\"",
  #   "instance"=>"magellan-cli-testdbi03", "instanceType"=>"CLOUDSQL_INSTANCE",
  #   "ipAddresses"=>[{"ipAddress"=>"173.194.229.107"}],
  #   "ipv6Address"=>"2001:4860:4864:1:fb5a:76f:71c1:f2f3",
  #   "kind"=>"sql#instance", "maxDiskSize"=>"268435456000", "project"=>"scenic-doodad-617",
  #   "region"=>"asia-east1",
  #   "serverCaCert"=>{...},
  #   "settings"=>{
  #     "activationPolicy"=>"ON_DEMAND",
  #     "backupConfiguration"=>[{"binaryLogEnabled"=>false, "enabled"=>false, "id"=>"2057f912-faf7-4a5d-a16d-c5a12a9dceca", "kind"=>"sql#backupConfiguration", "startTime"=>"23:00"}],
  #     "ipConfiguration"=>{"authorizedNetworks"=>["0.0.0.0/0"], "enabled"=>true, "kind"=>"sql#ipConfiguration"},
  #     "kind"=>"sql#settings",
  #     "locationPreference"=>{"kind"=>"sql#locationPreference", "zone"=>"asia-east1-c"},
  #     "pricingPlan"=>"PACKAGE", "replicationType"=>"SYNCHRONOUS", "settingsVersion"=>"1",
  #     "tier"=>"D0"
  #   },
  #   "state"=>"RUNNABLE"
  # }

  # % gcloud sql instances create magellan-cli-testdbi06 --tier=D0 --region=asia-east1 --activation-policy=ON_DEMAND --authorized-networks=0.0.0.0/0 --gce-zone=asia-east1-c  --verbosity=debug  --assign-ip
  # DEBUG: Running gcloud.sql.instances.create with Namespace(__calliope_internal_deepest_parser=ArgumentParser(prog='gcloud.sql.instances.create', usage=None, description='Creates a new Cloud SQL instance.', version=None, formatter_class=<class 'argparse.HelpFormatter'>, conflict_handler='error', add_help=False), account=None, activation_policy='ON_DEMAND', api_version=None, assign_ip=True, async=False, authorized_gae_apps=[], authorized_networks=['0.0.0.0/0'], backup=True, backup_start_time=None, cmd_func=<bound method Command.Run of <googlecloudsdk.calliope.backend.Command object at 0x10767cc50>>, command_path=['gcloud', 'sql', 'instances', 'create'], configuration=None, database_flags=None, database_version='MYSQL_5_6', document=None, enable_bin_log=None, follow_gae_app=None, format=None, gce_zone='asia-east1-c', h=None, help=None, http_timeout=None, instance='magellan-cli-testdbi06', log_http=None, master_instance_name=None, pricing_plan='PER_USE', project=None, quiet=None, region='asia-east1', replication=None, require_ssl=None, tier='D0', trace_email=None, trace_log=False, trace_token=None, user_output_enabled=None, verbosity='debug', version=None).
  # Creating Cloud SQL instance...done.
  # Created [https://www.googleapis.com/sql/v1beta3/projects/scenic-doodad-617/instances/magellan-cli-testdbi06].
  # DEBUG: Explict Display.
  # NAME                    REGION      TIER  ADDRESS          STATUS
  # magellan-cli-testdbi06  asia-east1  D0    173.194.249.189  RUNNABLE

  host = res1['ipAddresses'].first['ipAddress']
  t = Text::Table.new
  t.head = %w[NAME REGION TIER ADDRESS STATUS]
  t.rows = [[res1['instance'], res1['region'], res1['settings']['tier'], host, res1['state']]]
  $stderr.puts t.to_s

  pw_options = options.dup
  pw_options["password"] ||= SecureRandom.hex(8)
  pw_args = build_args(pw_options, [:common, :password])
  res2 = gcloud("sql instances set-root-password #{instance}", pw_args)
  # res2.inspect #=> []
  $stderr.puts "\e[32mCOMPLETE\e[0m"

  $stderr.puts I18n.t(:env_head, scope: CREATE_OPTION_SCOPE)
  env_options = {
    scope: CREATE_OPTION_SCOPE,
    mysql_host: host,
    mysql_port: 3306,
    mysql_database: "#{instance}_production",
    mysql_username: "root",
    mysql_password: pw_options["password"],
  }
  $stdout.puts I18n.t(:env_body, env_options)
  $stderr.puts I18n.t(:env_tail, scope: CREATE_OPTION_SCOPE)
end
delete(instance, *args) click to toggle source
# File lib/magellan/cli/cloudsql_instance.rb, line 110
def delete(instance, *args)
  check_gcloud_command
  system("gcloud sql instances delete #{instance} #{args.join(' ')} 2>&1")
end
gcloud(subcommand, arguments) click to toggle source
# File lib/magellan/cli/cloudsql_instance.rb, line 138
def gcloud(subcommand, arguments)
  check_gcloud_command
  cmd = "gcloud #{subcommand} #{arguments.join(' ')}"
  LoggerPipe.run(logger, cmd, dry_run: dryrun?, returns: :stdout, logging: :stderr)
end
list(*args) click to toggle source
# File lib/magellan/cli/cloudsql_instance.rb, line 116
def list(*args)
  check_gcloud_command
  system("gcloud sql instances list #{args.join(' ')} 2>&1")
end
logger() click to toggle source
# File lib/magellan/cli/cloudsql_instance.rb, line 122
def logger
  unless @logger
    @logger = Logger.new($stderr)
    @logger.level = verbose? ? Logger::INFO : Logger::WARN
  end
  @logger
end