aptible-cli 0.16.0 → 0.16.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b00cbbd2d4b78975a40cbfad564c786b8b8207f607f9aaefb7f3bc6a51c3d236
4
- data.tar.gz: af11c4fc2c3de4eaabfe2388219f1dc1a96b07bb1a31d6863230b939419a184c
3
+ metadata.gz: d7a82ca8dc7db1d4eb55e92d7a78f8dda19f3b0e868d913695f9a974079cdf45
4
+ data.tar.gz: b043caa7662d1406a445e53e02daecdeb08e17a2fadeb448f94155091ac8c6d8
5
5
  SHA512:
6
- metadata.gz: c7036bfeb4453f5981de53598a6fb7306775d40fe4d4c93c251876e0528cf6ed7ddbc5ec7322ee8829fbe4d449264fba799ba4451b42c7258ab038b19f3985e3
7
- data.tar.gz: 43079246baff7cac2611d2f14c145d3e5bb2956dff8514839c473afc59dc80db1239aaabf9c1bedc587591d34d3983f19a2b44b78061d349a15cf2eebbde4314
6
+ metadata.gz: 1d70a4ebaf642e840db0ec5bdfc287a5ca692cf4113173251e6480818b29ad70ee83792672f601a41495b8c55312196835a3e7b12b9364290f95191fae1c2f7c
7
+ data.tar.gz: f3c1b30a29637d5f872349e45d54d8ce0856a2a467039483bb4cfac872204c15cb2d249650acb5debb7274584aa176459750473ca5cc2d6dc01e63435ce6042b
data/README.md CHANGED
@@ -44,7 +44,7 @@ Commands:
44
44
  aptible db:clone SOURCE DEST # Clone a database to create a new one
45
45
  aptible db:create HANDLE [--type TYPE] [--version VERSION] [--container-size SIZE_MB] [--size SIZE_GB] # Create a new database
46
46
  aptible db:deprovision HANDLE # Deprovision a database
47
- aptible db:dump HANDLE # Dump a remote database to file
47
+ aptible db:dump HANDLE [pg_dump options] # Dump a remote database to file
48
48
  aptible db:execute HANDLE SQL_FILE # Executes sql against a database
49
49
  aptible db:list # List all databases
50
50
  aptible db:reload HANDLE # Reload a database
@@ -9,6 +9,14 @@ module Aptible
9
9
  node.value('handle', account.handle)
10
10
  end
11
11
 
12
+ def inject_operation(node, operation)
13
+ node.value('id', operation.id)
14
+ node.value('status', operation.status)
15
+ node.value('git_ref', operation.git_ref)
16
+ node.value('user_email', operation.user_email)
17
+ node.value('created_at', operation.created_at)
18
+ end
19
+
12
20
  def inject_app(node, app, account)
13
21
  node.value('id', app.id)
14
22
  node.value('handle', app.handle)
@@ -16,6 +24,12 @@ module Aptible
16
24
  node.value('status', app.status)
17
25
  node.value('git_remote', app.git_repo)
18
26
 
27
+ if app.last_deploy_operation
28
+ node.keyed_object('last_deploy_operation', 'id') do |n|
29
+ inject_operation(n, app.last_deploy_operation)
30
+ end
31
+ end
32
+
19
33
  node.list('services') do |services_list|
20
34
  app.each_service do |service|
21
35
  services_list.object do |n|
@@ -119,7 +119,15 @@ module Aptible
119
119
  define_method 'apps:deprovision' do
120
120
  app = ensure_app(options)
121
121
  CLI.logger.info "Deprovisioning #{app.handle}..."
122
- app.create_operation!(type: 'deprovision')
122
+ op = app.create_operation!(type: 'deprovision')
123
+ begin
124
+ attach_to_operation_logs(op)
125
+ rescue HyperResource::ClientError => e
126
+ # A 404 here means that the operation completed successfully,
127
+ # and was removed faster than attach_to_operation_logs
128
+ # could attach to the logs.
129
+ raise if e.response.status != 404
130
+ end
123
131
  end
124
132
  end
125
133
  end
@@ -113,14 +113,15 @@ module Aptible
113
113
  render_database(database, database.account)
114
114
  end
115
115
 
116
- desc 'db:dump HANDLE', 'Dump a remote database to file'
116
+ desc 'db:dump HANDLE [pg_dump options]',
117
+ 'Dump a remote database to file'
117
118
  option :environment
118
- define_method 'db:dump' do |handle|
119
+ define_method 'db:dump' do |handle, *dump_options|
119
120
  database = ensure_database(options.merge(db: handle))
120
121
  with_postgres_tunnel(database) do |url|
121
122
  filename = "#{handle}.dump"
122
123
  CLI.logger.info "Dumping to #{filename}"
123
- `pg_dump #{url} > #{filename}`
124
+ `pg_dump #{url} #{dump_options.shelljoin} > #{filename}`
124
125
  end
125
126
  end
126
127
 
@@ -184,7 +185,15 @@ module Aptible
184
185
  define_method 'db:deprovision' do |handle|
185
186
  database = ensure_database(options.merge(db: handle))
186
187
  CLI.logger.info "Deprovisioning #{database.handle}..."
187
- database.create_operation!(type: 'deprovision')
188
+ op = database.create_operation!(type: 'deprovision')
189
+ begin
190
+ attach_to_operation_logs(op)
191
+ rescue HyperResource::ClientError => e
192
+ # A 404 here means that the operation completed successfully,
193
+ # and was removed faster than attach_to_operation_logs
194
+ # could attach to the logs.
195
+ raise if e.response.status != 404
196
+ end
188
197
  end
189
198
 
190
199
  desc 'db:backup HANDLE', 'Backup a database'
@@ -1,5 +1,5 @@
1
1
  module Aptible
2
2
  module CLI
3
- VERSION = '0.16.0'.freeze
3
+ VERSION = '0.16.1'.freeze
4
4
  end
5
5
  end
@@ -133,6 +133,40 @@ describe Aptible::CLI::Agent do
133
133
 
134
134
  expect(captured_output_json).to eq(expected_json)
135
135
  end
136
+
137
+ it 'includes the last deploy operation in JSON' do
138
+ account = Fabricate(:account, handle: 'account')
139
+ op = Fabricate(:operation, type: 'deploy', status: 'succeeded')
140
+ app = Fabricate(:app, account: account, handle: 'app',
141
+ last_deploy_operation: op)
142
+ allow(Aptible::Api::Account).to receive(:all).and_return([account])
143
+
144
+ expected_json = [
145
+ {
146
+ 'environment' => {
147
+ 'id' => account.id,
148
+ 'handle' => account.handle
149
+ },
150
+ 'handle' => app.handle,
151
+ 'id' => app.id,
152
+ 'status' => app.status,
153
+ 'git_remote' => app.git_repo,
154
+ 'last_deploy_operation' =>
155
+ {
156
+ 'id' => op.id,
157
+ 'status' => op.status,
158
+ 'git_ref' => op.git_ref,
159
+ 'user_email' => op.user_email,
160
+ 'created_at' => op.created_at
161
+ },
162
+ 'services' => []
163
+ }
164
+ ]
165
+
166
+ subject.send('apps')
167
+
168
+ expect(captured_output_json).to eq(expected_json)
169
+ end
136
170
  end
137
171
 
138
172
  describe '#apps:create' do
@@ -305,7 +339,18 @@ describe Aptible::CLI::Agent do
305
339
  expect(app).to receive(:create_operation!)
306
340
  .with(type: 'deprovision').and_return(operation)
307
341
 
308
- expect(subject).not_to receive(:attach_to_operation_logs)
342
+ expect(subject).to receive(:attach_to_operation_logs).with(operation)
343
+
344
+ subject.send('apps:deprovision')
345
+ end
346
+ it 'does not fail if the operation cannot be found' do
347
+ expect(app).to receive(:create_operation!)
348
+ .with(type: 'deprovision').and_return(operation)
349
+
350
+ response = Faraday::Response.new(status: 404)
351
+ error = HyperResource::ClientError.new('Not Found', response: response)
352
+ expect(subject).to receive(:attach_to_operation_logs).with(operation)
353
+ .and_raise(error)
309
354
 
310
355
  subject.send('apps:deprovision')
311
356
  end
@@ -439,6 +439,73 @@ describe Aptible::CLI::Agent do
439
439
  end
440
440
  end
441
441
 
442
+ describe '#db:dump' do
443
+ it 'should fail if database is non-existent' do
444
+ allow(Aptible::Api::Database).to receive(:all) { [] }
445
+ expect do
446
+ subject.send('db:dump', handle)
447
+ end.to raise_error("Could not find database #{handle}")
448
+ end
449
+
450
+ context 'valid database' do
451
+ before do
452
+ allow(Aptible::Api::Database).to receive(:all) { [database] }
453
+ allow(subject).to receive(:`).with(/pg_dump .*/)
454
+ end
455
+
456
+ it 'prints a message indicating the dump is happening' do
457
+ cred = Fabricate(:database_credential, default: true, type: 'foo',
458
+ database: database)
459
+
460
+ expect(subject).to receive(:with_local_tunnel).with(cred)
461
+ .and_yield(socat_helper)
462
+
463
+ subject.send('db:dump', handle)
464
+
465
+ expect(captured_logs)
466
+ .to match(/Dumping to foobar.dump/i)
467
+ end
468
+
469
+ it 'invokes pg_dump with the tunnel url' do
470
+ cred = Fabricate(:database_credential, default: true, type: 'foo',
471
+ database: database)
472
+
473
+ expect(subject).to receive(:with_local_tunnel).with(cred)
474
+ .and_yield(socat_helper)
475
+
476
+ local_url = 'postgresql://aptible:password@localhost.aptible.in:4242/db'
477
+
478
+ expect(subject).to receive(:`)
479
+ .with(/pg_dump #{local_url} > foobar.dump/)
480
+
481
+ subject.send('db:dump', handle)
482
+ end
483
+
484
+ it 'sends extra options if given' do
485
+ cred = Fabricate(:database_credential, default: true, type: 'foo',
486
+ database: database)
487
+
488
+ expect(subject).to receive(:with_local_tunnel).with(cred)
489
+ .and_yield(socat_helper)
490
+
491
+ pg_dump_options = '--exclude-table-data=events ' \
492
+ '--exclude-table-data=versions'
493
+ allow(subject).to receive(:`).with(/pg_dump .* #{pg_dump_options} .*/)
494
+
495
+ subject.send('db:dump', handle,
496
+ '--exclude-table-data=events',
497
+ '--exclude-table-data=versions')
498
+ end
499
+
500
+ it 'fails when the database is not provisioned' do
501
+ allow(database).to receive(:status) { 'pending' }
502
+
503
+ expect { subject.send('db:dump', handle) }
504
+ .to raise_error(/foobar is not provisioned/im)
505
+ end
506
+ end
507
+ end
508
+
442
509
  describe '#db:deprovision' do
443
510
  before { expect(Aptible::Api::Database).to receive(:all) { [database] } }
444
511
 
@@ -448,7 +515,18 @@ describe Aptible::CLI::Agent do
448
515
  expect(database).to receive(:create_operation!)
449
516
  .with(type: 'deprovision').and_return(operation)
450
517
 
451
- expect(subject).not_to receive(:attach_to_operation_logs)
518
+ expect(subject).to receive(:attach_to_operation_logs).with(operation)
519
+
520
+ subject.send('db:deprovision', handle)
521
+ end
522
+
523
+ it 'does not fail if the operation cannot be found' do
524
+ expect(database).to receive(:create_operation!)
525
+ .with(type: 'deprovision').and_return(operation)
526
+ response = Faraday::Response.new(status: 404)
527
+ error = HyperResource::ClientError.new('Not Found', response: response)
528
+ expect(subject).to receive(:attach_to_operation_logs).with(operation)
529
+ .and_raise(error)
452
530
 
453
531
  subject.send('db:deprovision', handle)
454
532
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aptible-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.16.0
4
+ version: 0.16.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Frank Macreery
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-05-15 00:00:00.000000000 Z
11
+ date: 2018-07-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aptible-resource