Module: Aptible::CLI::Subcommands::DB

Included in:
Agent
Defined in:
lib/aptible/cli/subcommands/db.rb

Class Method Summary collapse

Class Method Details

.included(thor) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/aptible/cli/subcommands/db.rb', line 8

def self.included(thor)
  thor.class_eval do
    include Helpers::Operation
    include Helpers::Database
    include Helpers::Token
    include Term::ANSIColor

    desc 'db:list', 'List all databases'
    option :environment
    define_method 'db:list' do
      scoped_environments(options).each do |env|
        present_environment_databases(env)
      end
    end

    desc 'db:create HANDLE', 'Create a new database'
    option :type, default: 'postgresql'
    option :size, default: 10
    option :environment
    define_method 'db:create' do |handle|
      environment = ensure_environment(options)
      database = environment.create_database(handle: handle,
                                             type: options[:type])

      if database.errors.any?
        fail Thor::Error, database.errors.full_messages.first
      else
        op = database.create_operation!(type: 'provision',
                                        disk_size: options[:size])
        attach_to_operation_logs(op)
        say database.reload.connection_url
      end
    end

    desc 'db:clone SOURCE DEST', 'Clone a database to create a new one'
    option :environment
    define_method 'db:clone' do |source_handle, dest_handle|
      source = ensure_database(options.merge(db: source_handle))
      dest = clone_database(source, dest_handle)
      say dest.connection_url
    end

    desc 'db:dump HANDLE', 'Dump a remote database to file'
    option :environment
    define_method 'db:dump' do |handle|
      database = ensure_database(options.merge(db: handle))
      with_postgres_tunnel(database) do |url|
        filename = "#{handle}.dump"
        say "Dumping to #{filename}"
        `pg_dump #{url} > #{filename}`
      end
    end

    desc 'db:execute HANDLE SQL_FILE', 'Executes sql against a database'
    option :environment
    define_method 'db:execute' do |handle, sql_path|
      database = ensure_database(options.merge(db: handle))
      with_postgres_tunnel(database) do |url|
        say "Executing #{sql_path} against #{handle}"
        `psql #{url} < #{sql_path}`
      end
    end

    desc 'db:tunnel HANDLE', 'Create a local tunnel to a database'
    option :environment
    option :port, type: :numeric
    define_method 'db:tunnel' do |handle|
      desired_port = Integer(options[:port] || 0)
      database = ensure_database(options.merge(db: handle))
      say 'Creating tunnel...', :green

      with_local_tunnel(database, desired_port) do |tunnel_helper|
        port = tunnel_helper.port
        say "Connect at #{local_url(database, port)}", :green

        uri = URI(local_url(database, port))
        db = uri.path.gsub(%r{^/}, '')
        say 'Or, use the following arguments:', :green
        say("* Host: #{uri.host}", :green)
        say("* Port: #{uri.port}", :green)
        say("* Username: #{uri.user}", :green) unless uri.user.empty?
        say("* Password: #{uri.password}", :green)
        say("* Database: #{db}", :green) unless db.empty?

        say 'Connected. Ctrl-C to close connection.'

        begin
          tunnel_helper.wait
        rescue Interrupt
          say 'Closing tunnel'
        end
      end
    end

    desc 'db:deprovision HANDLE', 'Deprovision a database'
    option :environment
    define_method 'db:deprovision' do |handle|
      database = ensure_database(options.merge(db: handle))
      say "Deprovisioning #{database.handle}..."
      database.create_operation!(type: 'deprovision')
    end

    desc 'db:backup HANDLE', 'Backup a database'
    option :environment
    define_method 'db:backup' do |handle|
      database = ensure_database(options.merge(db: handle))
      say "Backing up #{database.handle}..."
      op = database.create_operation!(type: 'backup')
      attach_to_operation_logs(op)
    end
  end
end