aptible-cli 0.17.0 → 0.18.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/aptible-cli.gemspec +4 -0
- data/lib/aptible/cli/agent.rb +0 -2
- data/lib/aptible/cli/resource_formatter.rb +20 -0
- data/lib/aptible/cli/subcommands/db.rb +27 -2
- data/lib/aptible/cli/version.rb +1 -1
- data/spec/aptible/cli/resource_formatter_spec.rb +1 -0
- data/spec/aptible/cli/subcommands/apps_spec.rb +10 -4
- data/spec/aptible/cli/subcommands/db_spec.rb +72 -0
- data/spec/aptible/cli/subcommands/environment_spec.rb +4 -2
- data/spec/fabricators/account_fabricator.rb +1 -0
- data/spec/fabricators/app_fabricator.rb +1 -0
- data/spec/fabricators/database_disk_fabricator.rb +8 -0
- data/spec/fabricators/database_fabricator.rb +3 -0
- data/spec/fabricators/service_fabricator.rb +1 -0
- data/spec/fabricators/vhost_fabricator.rb +1 -0
- data/spec/spec_helper.rb +4 -0
- metadata +5 -4
- data/lib/aptible/cli/subcommands/ps.rb +0 -30
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cf958faed8401636f811f03296e187e9af011fef3d6ce6aa3bc7f2aee315d5c8
|
4
|
+
data.tar.gz: 36214902974167a2748685d63fa9d1d659c64d4f752e3b813aeb7adb907f601b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a1a85e655dd7e0d3267035baca9c8c5898193f524a3ac842961ec62aa0e3b4f951c89a0a1dd5a1adcf80b840b729dafb90238214d6224eff1fd524a54fb90b21
|
7
|
+
data.tar.gz: d85e946cb9adee2314f31078029033bd62ea44a0ef23d673c434e422817c17cf7094bff714ce5b6862c52135f30b030ae7d52a4f72e8052f2fc99b372b3016ca
|
data/README.md
CHANGED
@@ -48,9 +48,10 @@ Commands:
|
|
48
48
|
aptible db:dump HANDLE [pg_dump options] # Dump a remote database to file
|
49
49
|
aptible db:execute HANDLE SQL_FILE [--on-error-stop] # Executes sql against a database
|
50
50
|
aptible db:list # List all databases
|
51
|
+
aptible db:modify HANDLE [--iops IOPS] [--volume-type [gp2, gp3]] # Modify a database disk
|
51
52
|
aptible db:reload HANDLE # Reload a database
|
52
53
|
aptible db:replicate HANDLE REPLICA_HANDLE [--container-size SIZE_MB] [--disk-size SIZE_GB] [--logical --version VERSION] [--key-arn KEY_ARN] # Create a replica/follower of a database
|
53
|
-
aptible db:restart HANDLE [--container-size SIZE_MB] [--disk-size SIZE_GB]
|
54
|
+
aptible db:restart HANDLE [--container-size SIZE_MB] [--disk-size SIZE_GB][--iops IOPS] [--volume-type [gp2, gp3]] # Restart a database
|
54
55
|
aptible db:tunnel HANDLE # Create a local tunnel to a database
|
55
56
|
aptible db:url HANDLE # Display a database URL
|
56
57
|
aptible db:versions # List available database versions
|
@@ -72,7 +73,6 @@ Commands:
|
|
72
73
|
aptible login # Log in to Aptible
|
73
74
|
aptible logs [--app APP | --database DATABASE] # Follows logs from a running app or database
|
74
75
|
aptible operation:cancel OPERATION_ID # Cancel a running operation
|
75
|
-
aptible ps # Display running processes for an app - DEPRECATED
|
76
76
|
aptible rebuild # Rebuild an app, and restart its services
|
77
77
|
aptible restart # Restart all services associated with an app
|
78
78
|
aptible services # List Services for an App
|
data/aptible-cli.gemspec
CHANGED
@@ -28,7 +28,11 @@ Gem::Specification.new do |spec|
|
|
28
28
|
spec.add_dependency 'git'
|
29
29
|
spec.add_dependency 'term-ansicolor'
|
30
30
|
spec.add_dependency 'chronic_duration', '~> 0.10.6'
|
31
|
+
|
32
|
+
# Temporarily pin ffi until https://github.com/ffi/ffi/issues/868 is fixed
|
33
|
+
spec.add_dependency 'ffi', '<= 1.14.1' if Gem.win_platform?
|
31
34
|
spec.add_dependency 'win32-process' if Gem.win_platform?
|
35
|
+
|
32
36
|
spec.add_dependency 'activesupport', '>= 4.0', '< 6.0'
|
33
37
|
spec.add_development_dependency 'bundler', '~> 1.3'
|
34
38
|
spec.add_development_dependency 'aptible-tasks', '~> 0.5.8'
|
data/lib/aptible/cli/agent.rb
CHANGED
@@ -25,7 +25,6 @@ require_relative 'subcommands/db'
|
|
25
25
|
require_relative 'subcommands/domains'
|
26
26
|
require_relative 'subcommands/environment'
|
27
27
|
require_relative 'subcommands/logs'
|
28
|
-
require_relative 'subcommands/ps'
|
29
28
|
require_relative 'subcommands/rebuild'
|
30
29
|
require_relative 'subcommands/deploy'
|
31
30
|
require_relative 'subcommands/restart'
|
@@ -50,7 +49,6 @@ module Aptible
|
|
50
49
|
include Subcommands::Domains
|
51
50
|
include Subcommands::Environment
|
52
51
|
include Subcommands::Logs
|
53
|
-
include Subcommands::Ps
|
54
52
|
include Subcommands::Rebuild
|
55
53
|
include Subcommands::Deploy
|
56
54
|
include Subcommands::Restart
|
@@ -43,6 +43,7 @@ module Aptible
|
|
43
43
|
def inject_account(node, account)
|
44
44
|
node.value('id', account.id)
|
45
45
|
node.value('handle', account.handle)
|
46
|
+
node.value('created_at', account.created_at)
|
46
47
|
end
|
47
48
|
|
48
49
|
def inject_operation(node, operation)
|
@@ -56,6 +57,7 @@ module Aptible
|
|
56
57
|
def inject_app(node, app, account)
|
57
58
|
node.value('id', app.id)
|
58
59
|
node.value('handle', app.handle)
|
60
|
+
node.value('created_at', app.created_at)
|
59
61
|
|
60
62
|
node.value('status', app.status)
|
61
63
|
node.value('git_remote', app.git_repo)
|
@@ -80,8 +82,10 @@ module Aptible
|
|
80
82
|
def inject_database(node, database, account)
|
81
83
|
node.value('id', database.id)
|
82
84
|
node.value('handle', database.handle)
|
85
|
+
node.value('created_at', database.created_at)
|
83
86
|
|
84
87
|
node.value('type', database.type)
|
88
|
+
node.value('version', database.database_image.version)
|
85
89
|
node.value('status', database.status)
|
86
90
|
|
87
91
|
node.value('connection_url', database.connection_url)
|
@@ -92,6 +96,20 @@ module Aptible
|
|
92
96
|
end
|
93
97
|
end
|
94
98
|
attach_account(node, account)
|
99
|
+
|
100
|
+
if database.disk
|
101
|
+
node.value('disk_type', database.disk.ebs_volume_type)
|
102
|
+
node.value('disk_size', database.disk.size)
|
103
|
+
node.value('disk_modification_progress',
|
104
|
+
database.disk.modification_progress)
|
105
|
+
node.value('disk_modification_status', database.disk.status)
|
106
|
+
node.value('disk_provisioned_iops', database.disk.baseline_iops)
|
107
|
+
end
|
108
|
+
|
109
|
+
if database.service
|
110
|
+
node.value('container_size', \
|
111
|
+
database.service.container_memory_limit_mb)
|
112
|
+
end
|
95
113
|
end
|
96
114
|
|
97
115
|
def inject_credential(node, credential)
|
@@ -105,6 +123,7 @@ module Aptible
|
|
105
123
|
def inject_service(node, service, app)
|
106
124
|
node.value('id', service.id)
|
107
125
|
node.value('service', service.process_type)
|
126
|
+
node.value('created_at', service.created_at)
|
108
127
|
|
109
128
|
node.value('command', service.command || 'CMD')
|
110
129
|
node.value('container_count', service.container_count)
|
@@ -117,6 +136,7 @@ module Aptible
|
|
117
136
|
node.value('id', vhost.id)
|
118
137
|
node.value('hostname', vhost.external_host)
|
119
138
|
node.value('status', vhost.status)
|
139
|
+
node.value('created_at', vhost.created_at)
|
120
140
|
|
121
141
|
case vhost.type
|
122
142
|
when 'tcp', 'tls'
|
@@ -279,19 +279,24 @@ module Aptible
|
|
279
279
|
end
|
280
280
|
|
281
281
|
desc 'db:restart HANDLE ' \
|
282
|
-
'[--container-size SIZE_MB] [--disk-size SIZE_GB]'
|
282
|
+
'[--container-size SIZE_MB] [--disk-size SIZE_GB]' \
|
283
|
+
'[--iops IOPS] [--volume-type [gp2, gp3]]',
|
283
284
|
'Restart a database'
|
284
285
|
option :environment
|
285
286
|
option :container_size, type: :numeric
|
286
287
|
option :disk_size, type: :numeric
|
287
288
|
option :size, type: :numeric
|
289
|
+
option :iops, type: :numeric
|
290
|
+
option :volume_type
|
288
291
|
define_method 'db:restart' do |handle|
|
289
292
|
database = ensure_database(options.merge(db: handle))
|
290
293
|
|
291
294
|
opts = {
|
292
295
|
type: 'restart',
|
293
296
|
container_size: options[:container_size],
|
294
|
-
disk_size: options[:disk_size] || options[:size]
|
297
|
+
disk_size: options[:disk_size] || options[:size],
|
298
|
+
provisioned_iops: options[:iops],
|
299
|
+
ebs_volume_type: options[:volume_type]
|
295
300
|
}.delete_if { |_, v| v.nil? }
|
296
301
|
|
297
302
|
CLI.logger.warn([
|
@@ -305,6 +310,26 @@ module Aptible
|
|
305
310
|
attach_to_operation_logs(op)
|
306
311
|
end
|
307
312
|
|
313
|
+
desc 'db:modify HANDLE ' \
|
314
|
+
'[--iops IOPS] [--volume-type [gp2, gp3]]',
|
315
|
+
'Modify a database disk'
|
316
|
+
option :environment
|
317
|
+
option :iops, type: :numeric
|
318
|
+
option :volume_type
|
319
|
+
define_method 'db:modify' do |handle|
|
320
|
+
database = ensure_database(options.merge(db: handle))
|
321
|
+
|
322
|
+
opts = {
|
323
|
+
type: 'modify',
|
324
|
+
provisioned_iops: options[:iops],
|
325
|
+
ebs_volume_type: options[:volume_type]
|
326
|
+
}.delete_if { |_, v| v.nil? }
|
327
|
+
|
328
|
+
CLI.logger.info "Modifying #{database.handle}..."
|
329
|
+
op = database.create_operation!(opts)
|
330
|
+
attach_to_operation_logs(op)
|
331
|
+
end
|
332
|
+
|
308
333
|
desc 'db:url HANDLE', 'Display a database URL'
|
309
334
|
option :environment
|
310
335
|
option :type, type: :string
|
data/lib/aptible/cli/version.rb
CHANGED
@@ -104,26 +104,30 @@ describe Aptible::CLI::Agent do
|
|
104
104
|
{
|
105
105
|
'environment' => {
|
106
106
|
'id' => account.id,
|
107
|
-
'handle' => account.handle
|
107
|
+
'handle' => account.handle,
|
108
|
+
'created_at' => fmt_time(account.created_at)
|
108
109
|
},
|
109
110
|
'handle' => app.handle,
|
110
111
|
'id' => app.id,
|
111
112
|
'status' => app.status,
|
112
113
|
'git_remote' => app.git_repo,
|
114
|
+
'created_at' => fmt_time(app.created_at),
|
113
115
|
'services' => [
|
114
116
|
{
|
115
117
|
'service' => s1.process_type,
|
116
118
|
'id' => s1.id,
|
117
119
|
'command' => s1.command,
|
118
120
|
'container_count' => s1.container_count,
|
119
|
-
'container_size' => s1.container_memory_limit_mb
|
121
|
+
'container_size' => s1.container_memory_limit_mb,
|
122
|
+
'created_at' => fmt_time(s1.created_at)
|
120
123
|
},
|
121
124
|
{
|
122
125
|
'service' => s2.process_type,
|
123
126
|
'id' => s2.id,
|
124
127
|
'command' => 'CMD',
|
125
128
|
'container_count' => s2.container_count,
|
126
|
-
'container_size' => s2.container_memory_limit_mb
|
129
|
+
'container_size' => s2.container_memory_limit_mb,
|
130
|
+
'created_at' => fmt_time(s2.created_at)
|
127
131
|
}
|
128
132
|
]
|
129
133
|
}
|
@@ -145,12 +149,14 @@ describe Aptible::CLI::Agent do
|
|
145
149
|
{
|
146
150
|
'environment' => {
|
147
151
|
'id' => account.id,
|
148
|
-
'handle' => account.handle
|
152
|
+
'handle' => account.handle,
|
153
|
+
'created_at' => fmt_time(account.created_at)
|
149
154
|
},
|
150
155
|
'handle' => app.handle,
|
151
156
|
'id' => app.id,
|
152
157
|
'status' => app.status,
|
153
158
|
'git_remote' => app.git_repo,
|
159
|
+
'created_at' => fmt_time(app.created_at),
|
154
160
|
'last_deploy_operation' =>
|
155
161
|
{
|
156
162
|
'id' => op.id,
|
@@ -389,6 +389,31 @@ describe Aptible::CLI::Agent do
|
|
389
389
|
expect(captured_logs).to match(/restarting foobar/i)
|
390
390
|
end
|
391
391
|
|
392
|
+
it 'allows restarting a database with provisioned iops' do
|
393
|
+
expect(database).to receive(:create_operation!)
|
394
|
+
.with(type: 'restart', provisioned_iops: 3001)
|
395
|
+
.and_return(op)
|
396
|
+
|
397
|
+
expect(subject).to receive(:attach_to_operation_logs).with(op)
|
398
|
+
|
399
|
+
subject.options = { iops: 3001 }
|
400
|
+
subject.send('db:restart', handle)
|
401
|
+
|
402
|
+
expect(captured_logs).to match(/restarting foobar/i)
|
403
|
+
end
|
404
|
+
|
405
|
+
it 'allows restarting a database with ebs volume type' do
|
406
|
+
expect(database).to receive(:create_operation!)
|
407
|
+
.with(type: 'restart', ebs_volume_type: 'gp2').and_return(op)
|
408
|
+
|
409
|
+
expect(subject).to receive(:attach_to_operation_logs).with(op)
|
410
|
+
|
411
|
+
subject.options = { volume_type: 'gp2' }
|
412
|
+
subject.send('db:restart', handle)
|
413
|
+
|
414
|
+
expect(captured_logs).to match(/restarting foobar/i)
|
415
|
+
end
|
416
|
+
|
392
417
|
it 'allows restarting a database with (implicitly disk) size' do
|
393
418
|
expect(database).to receive(:create_operation!)
|
394
419
|
.with(type: 'restart', disk_size: 40).and_return(op)
|
@@ -419,6 +444,53 @@ describe Aptible::CLI::Agent do
|
|
419
444
|
end
|
420
445
|
end
|
421
446
|
|
447
|
+
describe '#db:modify' do
|
448
|
+
before { allow(Aptible::Api::Account).to receive(:all) { [account] } }
|
449
|
+
before { allow(Aptible::Api::Database).to receive(:all) { [database] } }
|
450
|
+
|
451
|
+
let(:op) { Fabricate(:operation) }
|
452
|
+
|
453
|
+
it 'allows modifying a database' do
|
454
|
+
expect(database).to receive(:create_operation!)
|
455
|
+
.with(type: 'modify').and_return(op)
|
456
|
+
|
457
|
+
expect(subject).to receive(:attach_to_operation_logs).with(op)
|
458
|
+
|
459
|
+
subject.send('db:modify', handle)
|
460
|
+
|
461
|
+
expect(captured_logs).to match(/modifying foobar/i)
|
462
|
+
end
|
463
|
+
|
464
|
+
it 'allows modifying a database with provisioned iops' do
|
465
|
+
expect(database).to receive(:create_operation!)
|
466
|
+
.with(type: 'modify', provisioned_iops: 3001).and_return(op)
|
467
|
+
|
468
|
+
expect(subject).to receive(:attach_to_operation_logs).with(op)
|
469
|
+
|
470
|
+
subject.options = { iops: 3001 }
|
471
|
+
subject.send('db:modify', handle)
|
472
|
+
|
473
|
+
expect(captured_logs).to match(/modifying foobar/i)
|
474
|
+
end
|
475
|
+
|
476
|
+
it 'allows modifying a database with ebs volume type' do
|
477
|
+
expect(database).to receive(:create_operation!)
|
478
|
+
.with(type: 'modify', ebs_volume_type: 'gp2').and_return(op)
|
479
|
+
|
480
|
+
expect(subject).to receive(:attach_to_operation_logs).with(op)
|
481
|
+
|
482
|
+
subject.options = { volume_type: 'gp2' }
|
483
|
+
subject.send('db:modify', handle)
|
484
|
+
|
485
|
+
expect(captured_logs).to match(/modifying foobar/i)
|
486
|
+
end
|
487
|
+
|
488
|
+
it 'fails if the DB is not found' do
|
489
|
+
expect { subject.send('db:modify', 'nope') }
|
490
|
+
.to raise_error(Thor::Error, 'Could not find database nope')
|
491
|
+
end
|
492
|
+
end
|
493
|
+
|
422
494
|
describe '#db:url' do
|
423
495
|
let(:databases) { [database] }
|
424
496
|
before { expect(Aptible::Api::Database).to receive(:all) { databases } }
|
@@ -32,11 +32,13 @@ describe Aptible::CLI::Agent do
|
|
32
32
|
expected_accounts = [
|
33
33
|
{
|
34
34
|
'handle' => 'foo',
|
35
|
-
'ca_body' => 'account 1 cert'
|
35
|
+
'ca_body' => 'account 1 cert',
|
36
|
+
'created_at' => fmt_time(a1.created_at)
|
36
37
|
},
|
37
38
|
{
|
38
39
|
'handle' => 'bar',
|
39
|
-
'ca_body' => '--account 2 cert--'
|
40
|
+
'ca_body' => '--account 2 cert--',
|
41
|
+
'created_at' => fmt_time(a2.created_at)
|
40
42
|
}
|
41
43
|
]
|
42
44
|
expect(captured_output_json.map! { |account| account.except('id') })
|
@@ -16,10 +16,13 @@ Fabricator(:database, from: :stub_database) do
|
|
16
16
|
status 'provisioned'
|
17
17
|
connection_url 'postgresql://aptible:password@10.252.1.125:49158/db'
|
18
18
|
account
|
19
|
+
database_image
|
20
|
+
disk { Fabricate(:database_disk) }
|
19
21
|
service { nil }
|
20
22
|
|
21
23
|
backups { [] }
|
22
24
|
database_credentials { [] }
|
25
|
+
created_at { Time.now }
|
23
26
|
|
24
27
|
after_create do |database, transients|
|
25
28
|
database.account.databases << database
|
data/spec/spec_helper.rb
CHANGED
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.
|
4
|
+
version: 0.18.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Frank Macreery
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-06-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aptible-resource
|
@@ -300,7 +300,6 @@ files:
|
|
300
300
|
- lib/aptible/cli/subcommands/inspect.rb
|
301
301
|
- lib/aptible/cli/subcommands/logs.rb
|
302
302
|
- lib/aptible/cli/subcommands/operation.rb
|
303
|
-
- lib/aptible/cli/subcommands/ps.rb
|
304
303
|
- lib/aptible/cli/subcommands/rebuild.rb
|
305
304
|
- lib/aptible/cli/subcommands/restart.rb
|
306
305
|
- lib/aptible/cli/subcommands/services.rb
|
@@ -341,6 +340,7 @@ files:
|
|
341
340
|
- spec/fabricators/certificate_fabricator.rb
|
342
341
|
- spec/fabricators/configuration_fabricator.rb
|
343
342
|
- spec/fabricators/database_credential_fabricator.rb
|
343
|
+
- spec/fabricators/database_disk_fabricator.rb
|
344
344
|
- spec/fabricators/database_fabricator.rb
|
345
345
|
- spec/fabricators/database_image_fabricator.rb
|
346
346
|
- spec/fabricators/operation_fabricator.rb
|
@@ -376,7 +376,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
376
376
|
- !ruby/object:Gem::Version
|
377
377
|
version: '0'
|
378
378
|
requirements: []
|
379
|
-
rubygems_version: 3.0.
|
379
|
+
rubygems_version: 3.0.3
|
380
380
|
signing_key:
|
381
381
|
specification_version: 4
|
382
382
|
summary: Command-line interface for Aptible services
|
@@ -415,6 +415,7 @@ test_files:
|
|
415
415
|
- spec/fabricators/certificate_fabricator.rb
|
416
416
|
- spec/fabricators/configuration_fabricator.rb
|
417
417
|
- spec/fabricators/database_credential_fabricator.rb
|
418
|
+
- spec/fabricators/database_disk_fabricator.rb
|
418
419
|
- spec/fabricators/database_fabricator.rb
|
419
420
|
- spec/fabricators/database_image_fabricator.rb
|
420
421
|
- spec/fabricators/operation_fabricator.rb
|
@@ -1,30 +0,0 @@
|
|
1
|
-
require 'shellwords'
|
2
|
-
|
3
|
-
module Aptible
|
4
|
-
module CLI
|
5
|
-
module Subcommands
|
6
|
-
module Ps
|
7
|
-
def self.included(thor)
|
8
|
-
thor.class_eval do
|
9
|
-
include Helpers::Operation
|
10
|
-
include Helpers::App
|
11
|
-
|
12
|
-
desc 'ps', 'Display running processes for an app - DEPRECATED'
|
13
|
-
app_options
|
14
|
-
def ps
|
15
|
-
deprecated('This command is deprecated on Aptible v2 stacks.')
|
16
|
-
|
17
|
-
app = ensure_app(options)
|
18
|
-
|
19
|
-
op = app.create_operation!(type: 'ps', status: 'succeeded')
|
20
|
-
|
21
|
-
ENV['ACCESS_TOKEN'] = fetch_token
|
22
|
-
opts = ['-o', 'SendEnv=ACCESS_TOKEN']
|
23
|
-
exit_with_ssh_portal(op, *opts)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|