aptible-cli 0.24.10 → 0.26.1

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.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/release.yml +27 -0
  3. data/.github/workflows/test.yml +1 -1
  4. data/Dockerfile +8 -5
  5. data/Gemfile.lock +28 -17
  6. data/Makefile +50 -2
  7. data/README.md +2 -1
  8. data/aptible-cli.gemspec +5 -2
  9. data/docker-compose.yml +5 -1
  10. data/lib/aptible/cli/agent.rb +9 -0
  11. data/lib/aptible/cli/helpers/aws_account.rb +158 -0
  12. data/lib/aptible/cli/helpers/database.rb +182 -2
  13. data/lib/aptible/cli/helpers/token.rb +14 -0
  14. data/lib/aptible/cli/helpers/vhost/option_set_builder.rb +8 -15
  15. data/lib/aptible/cli/renderer/text.rb +33 -2
  16. data/lib/aptible/cli/subcommands/aws_accounts.rb +252 -0
  17. data/lib/aptible/cli/subcommands/db.rb +67 -3
  18. data/lib/aptible/cli/subcommands/deploy.rb +45 -11
  19. data/lib/aptible/cli/subcommands/endpoints.rb +0 -2
  20. data/lib/aptible/cli/subcommands/organizations.rb +55 -0
  21. data/lib/aptible/cli/subcommands/services.rb +20 -8
  22. data/lib/aptible/cli/version.rb +1 -1
  23. data/spec/aptible/cli/helpers/database_spec.rb +118 -0
  24. data/spec/aptible/cli/helpers/token_spec.rb +70 -0
  25. data/spec/aptible/cli/subcommands/db_spec.rb +553 -0
  26. data/spec/aptible/cli/subcommands/deploy_spec.rb +42 -7
  27. data/spec/aptible/cli/subcommands/external_aws_accounts_spec.rb +737 -0
  28. data/spec/aptible/cli/subcommands/organizations_spec.rb +90 -0
  29. data/spec/aptible/cli/subcommands/services_spec.rb +77 -0
  30. data/spec/fabricators/app_external_aws_rds_connection_fabricator.rb +55 -0
  31. data/spec/fabricators/external_aws_account_fabricator.rb +49 -0
  32. data/spec/fabricators/external_aws_database_credential_fabricator.rb +46 -0
  33. data/spec/fabricators/external_aws_resource_fabricator.rb +72 -0
  34. metadata +64 -6
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Aptible::CLI::Agent do
6
+ let(:token) { double('token') }
7
+ before { allow(subject).to receive(:fetch_token).and_return(token) }
8
+
9
+ describe '#organizations' do
10
+ let(:org1) { double('org1', id: 'org-1-id', name: 'Org One') }
11
+ let(:org2) { double('org2', id: 'org-2-id', name: 'Org Two') }
12
+ let(:role1) do
13
+ double('role1', id: 'role-1-id', name: 'Admin', organization: org1)
14
+ end
15
+ let(:role2) do
16
+ double('role2', id: 'role-2-id', name: 'Developer', organization: org1)
17
+ end
18
+ let(:role3) do
19
+ double('role3', id: 'role-3-id', name: 'Account Owners',
20
+ organization: org2)
21
+ end
22
+ let(:user) do
23
+ double('user', roles_with_organizations: [role1, role2, role3])
24
+ end
25
+
26
+ before do
27
+ allow(subject).to receive(:whoami).and_return(user)
28
+ end
29
+
30
+ it 'lists organizations with roles' do
31
+ subject.send('organizations')
32
+
33
+ expect(captured_output_text).to include('Id: org-1-id')
34
+ expect(captured_output_text).to include('Name: Org One')
35
+ expect(captured_output_text).to include('Id: org-2-id')
36
+ expect(captured_output_text).to include('Name: Org Two')
37
+ expect(captured_output_text).to include('Roles:')
38
+ expect(captured_output_text).to include('Name: Admin')
39
+ expect(captured_output_text).to include('Name: Developer')
40
+ expect(captured_output_text).to include('Name: Account Owners')
41
+ end
42
+
43
+ it 'handles user with no roles' do
44
+ allow(user).to receive(:roles_with_organizations).and_return([])
45
+
46
+ subject.send('organizations')
47
+
48
+ expect(captured_output_text).to eq('')
49
+ end
50
+
51
+ it 'renders JSON output' do
52
+ allow(Aptible::CLI::Renderer).to receive(:format).and_return('json')
53
+
54
+ subject.send('organizations')
55
+
56
+ json = captured_output_json
57
+ expect(json).to be_a(Array)
58
+ expect(json.length).to eq(2)
59
+
60
+ org1_json = json.find { |o| o['id'] == 'org-1-id' }
61
+ expect(org1_json['name']).to eq('Org One')
62
+ expect(org1_json['roles'].length).to eq(2)
63
+ role_names = org1_json['roles'].map { |r| r['name'] }
64
+ expect(role_names).to contain_exactly('Admin', 'Developer')
65
+
66
+ org2_json = json.find { |o| o['id'] == 'org-2-id' }
67
+ expect(org2_json['name']).to eq('Org Two')
68
+ expect(org2_json['roles'].length).to eq(1)
69
+ expect(org2_json['roles'][0]['name']).to eq('Account Owners')
70
+ end
71
+
72
+ it 'raises Thor::Error on whoami API error' do
73
+ allow(subject).to receive(:whoami)
74
+ .and_raise(Thor::Error, '401 (invalid_token) Invalid Token')
75
+
76
+ expect { subject.send('organizations') }
77
+ .to raise_error(Thor::Error, /Invalid Token/)
78
+ end
79
+
80
+ it 'raises Thor::Error on roles_with_organizations API error' do
81
+ response = Faraday::Response.new(status: 403)
82
+ error = HyperResource::ClientError.new('403 (forbidden) Access denied',
83
+ response: response)
84
+ allow(user).to receive(:roles_with_organizations).and_raise(error)
85
+
86
+ expect { subject.send('organizations') }
87
+ .to raise_error(Thor::Error, /Access denied/)
88
+ end
89
+ end
90
+ end
@@ -106,6 +106,83 @@ describe Aptible::CLI::Agent do
106
106
 
107
107
  subject.send('services:settings', 'foo')
108
108
  end
109
+
110
+ it 'allows enabling restart_free_scaling' do
111
+ stub_options(restart_free_scaling: true)
112
+ service = Fabricate(:service, app: app, process_type: 'foo')
113
+
114
+ expect(service).to receive(:update!).with(restart_free_scaling: true)
115
+
116
+ subject.send('services:settings', 'foo')
117
+ end
118
+
119
+ it 'allows disabling restart_free_scaling' do
120
+ stub_options(restart_free_scaling: false)
121
+ service = Fabricate(:service, app: app, process_type: 'foo')
122
+
123
+ expect(service).to receive(:update!).with(restart_free_scaling: false)
124
+
125
+ subject.send('services:settings', 'foo')
126
+ end
127
+
128
+ it 'allows setting restart_free_scaling with other options' do
129
+ stub_options(
130
+ restart_free_scaling: true,
131
+ force_zero_downtime: true,
132
+ stop_timeout: 45
133
+ )
134
+ service = Fabricate(:service, app: app, process_type: 'foo')
135
+
136
+ expect(service).to receive(:update!)
137
+ .with(
138
+ restart_free_scaling: true,
139
+ force_zero_downtime: true,
140
+ stop_timeout: 45
141
+ )
142
+
143
+ subject.send('services:settings', 'foo')
144
+ end
145
+
146
+ it 'does not include nil values in updates' do
147
+ stub_options(restart_free_scaling: nil, force_zero_downtime: true)
148
+ service = Fabricate(:service, app: app, process_type: 'foo')
149
+
150
+ expect(service).to receive(:update!).with(force_zero_downtime: true)
151
+
152
+ subject.send('services:settings', 'foo')
153
+ end
154
+
155
+ it 'does not call update! when no valid options are provided' do
156
+ stub_options(
157
+ restart_free_scaling: nil,
158
+ force_zero_downtime: nil,
159
+ simple_health_check: nil,
160
+ stop_timeout: nil
161
+ )
162
+ service = Fabricate(:service, app: app, process_type: 'foo')
163
+
164
+ expect(service).not_to receive(:update!)
165
+
166
+ subject.send('services:settings', 'foo')
167
+ end
168
+
169
+ it 'handles false values correctly (not treated as nil)' do
170
+ stub_options(
171
+ restart_free_scaling: false,
172
+ force_zero_downtime: false,
173
+ simple_health_check: false
174
+ )
175
+ service = Fabricate(:service, app: app, process_type: 'foo')
176
+
177
+ expect(service).to receive(:update!)
178
+ .with(
179
+ restart_free_scaling: false,
180
+ force_zero_downtime: false,
181
+ naive_health_check: false
182
+ )
183
+
184
+ subject.send('services:settings', 'foo')
185
+ end
109
186
  end
110
187
 
111
188
  describe '#services:sizing_policy' do
@@ -0,0 +1,55 @@
1
+ class StubAppExternalAwsRdsConnection < OpenStruct
2
+ def attributes
3
+ {
4
+ 'id' => id,
5
+ 'app_id' => app_id,
6
+ 'external_aws_resource_id' => external_aws_resource_id,
7
+ 'database_name' => database_name,
8
+ 'database_user' => database_user,
9
+ 'superuser' => superuser,
10
+ 'created_at' => created_at,
11
+ 'updated_at' => updated_at
12
+ }
13
+ end
14
+ end
15
+
16
+ Fabricator(:app_external_aws_rds_connection,
17
+ from: :stub_app_external_aws_rds_connection) do
18
+ id do
19
+ Fabricate.sequence(:app_external_aws_rds_connection_id) { |i| i }
20
+ end
21
+ app
22
+ external_aws_resource do
23
+ Fabricate(:external_aws_resource, resource_type: 'aws_rds_db_instance')
24
+ end
25
+
26
+ database_name { Fabricate.sequence(:db_name) { |i| "db_#{i}" } }
27
+ database_user { Fabricate.sequence(:db_user) { |i| "user_#{i}" } }
28
+ superuser { false }
29
+
30
+ created_at { Time.now }
31
+ updated_at { Time.now }
32
+
33
+ app_id do |attrs|
34
+ attrs[:app] ? attrs[:app].id : nil
35
+ end
36
+
37
+ external_aws_resource_id do |attrs|
38
+ attrs[:external_aws_resource] ? attrs[:external_aws_resource].id : nil
39
+ end
40
+
41
+ links do |attrs|
42
+ hash = {}
43
+ if attrs[:app]
44
+ hash[:app] = OpenStruct.new(
45
+ href: "/apps/#{attrs[:app].id}"
46
+ )
47
+ end
48
+ if attrs[:external_aws_resource]
49
+ hash[:external_aws_resource] = OpenStruct.new(
50
+ href: "/external_aws_resources/#{attrs[:external_aws_resource].id}"
51
+ )
52
+ end
53
+ OpenStruct.new(hash)
54
+ end
55
+ end
@@ -0,0 +1,49 @@
1
+ class StubExternalAwsAccount < OpenStruct
2
+ def attributes
3
+ {
4
+ 'aws_account_id' => aws_account_id,
5
+ 'account_name' => account_name,
6
+ 'aws_region_primary' => aws_region_primary,
7
+ 'status' => status,
8
+ 'discovery_enabled' => discovery_enabled,
9
+ 'discovery_frequency' => discovery_frequency,
10
+ 'discovery_role_arn' => discovery_role_arn,
11
+ 'account_id' => account_id,
12
+ 'created_at' => created_at,
13
+ 'updated_at' => updated_at
14
+ }
15
+ end
16
+ end
17
+
18
+ Fabricator(:external_aws_account, from: :stub_external_aws_account) do
19
+ id { Fabricate.sequence(:external_aws_account_id) { |i| i } }
20
+ account
21
+ errors { Aptible::Resource::Errors.new }
22
+
23
+ account_name { |attrs| "External AWS Account #{attrs[:id]}" }
24
+ aws_account_id do
25
+ Fabricate.sequence(:aws_account_id) do |i|
26
+ format('%012d', 10_000_000_000 + i)
27
+ end
28
+ end
29
+ discovery_role_arn do |attrs|
30
+ "arn:aws:iam::#{attrs[:aws_account_id]}:role/ExampleRole"
31
+ end
32
+ aws_region_primary 'us-east-1'
33
+ status 'active'
34
+ discovery_enabled false
35
+ discovery_frequency 'daily'
36
+ account_id { |attrs| attrs[:account] ? attrs[:account].id : nil }
37
+ created_at { Time.now }
38
+ updated_at { Time.now }
39
+
40
+ links do |attrs|
41
+ hash = {}
42
+ if attrs[:account]
43
+ hash[:account] = OpenStruct.new(
44
+ href: "/accounts/#{attrs[:account].id}"
45
+ )
46
+ end
47
+ OpenStruct.new(hash)
48
+ end
49
+ end
@@ -0,0 +1,46 @@
1
+ class StubExternalAwsDatabaseCredential < OpenStruct
2
+ def attributes
3
+ {
4
+ 'id' => id,
5
+ 'external_aws_resource_id' => external_aws_resource_id,
6
+ 'type' => type,
7
+ 'default' => default,
8
+ 'connection_url' => connection_url,
9
+ 'created_at' => created_at,
10
+ 'updated_at' => updated_at
11
+ }
12
+ end
13
+ end
14
+
15
+ Fabricator(:external_aws_database_credential,
16
+ from: :stub_external_aws_database_credential) do
17
+ id do
18
+ Fabricate.sequence(:external_aws_database_credential_id) { |i| i }
19
+ end
20
+ external_aws_resource do
21
+ Fabricate(:external_aws_resource, resource_type: 'aws_rds_db_instance')
22
+ end
23
+
24
+ type do
25
+ Fabricate.sequence(:external_aws_db_cred_type) { |i| "primary-#{i}" }
26
+ end
27
+ default { false }
28
+ connection_url { 'postgres://user:pass@host:5432/dbname' }
29
+
30
+ created_at { Time.now }
31
+ updated_at { Time.now }
32
+
33
+ external_aws_resource_id do |attrs|
34
+ attrs[:external_aws_resource] ? attrs[:external_aws_resource].id : nil
35
+ end
36
+
37
+ links do |attrs|
38
+ hash = {}
39
+ if attrs[:external_aws_resource]
40
+ hash[:external_aws_resource] = OpenStruct.new(
41
+ href: "/external_aws_resources/#{attrs[:external_aws_resource].id}"
42
+ )
43
+ end
44
+ OpenStruct.new(hash)
45
+ end
46
+ end
@@ -0,0 +1,72 @@
1
+ class StubExternalAwsResource < OpenStruct
2
+ def attributes
3
+ {
4
+ 'id' => id,
5
+ 'external_aws_account_id' => external_aws_account_id,
6
+ 'resource_type' => resource_type,
7
+ 'resource_arn' => resource_arn,
8
+ 'resource_id' => resource_id,
9
+ 'resource_name' => resource_name,
10
+ 'region' => region,
11
+ 'metadata' => metadata,
12
+ 'tags' => tags,
13
+ 'discovered_at' => discovered_at,
14
+ 'last_synced_at' => last_synced_at,
15
+ 'sync_status' => sync_status,
16
+ 'created_at' => created_at,
17
+ 'updated_at' => updated_at
18
+ }
19
+ end
20
+
21
+ def app_external_aws_rds_connections
22
+ @app_external_aws_rds_connections ||= []
23
+ end
24
+
25
+ def external_aws_database_credentials
26
+ @external_aws_database_credentials ||= []
27
+ end
28
+ end
29
+
30
+ Fabricator(:external_aws_resource, from: :stub_external_aws_resource) do
31
+ id { Fabricate.sequence(:external_aws_resource_id) { |i| i } }
32
+ external_aws_account
33
+
34
+ resource_type { 'aws_rds_db_instance' }
35
+ resource_arn do
36
+ Fabricate.sequence(:external_aws_resource_arn) do |i|
37
+ "arn:aws:rds:us-east-1:123456789012:db:example-db-#{i}"
38
+ end
39
+ end
40
+ resource_id do
41
+ Fabricate.sequence(:external_aws_resource_resource_id) do |i|
42
+ "db-EXAMPLE#{i}"
43
+ end
44
+ end
45
+ resource_name do
46
+ Fabricate.sequence(:external_aws_resource_name) { |i| "example-db-#{i}" }
47
+ end
48
+ region { 'us-east-1' }
49
+
50
+ metadata { { 'engine' => 'postgres', 'engine_version' => '14.7' } }
51
+ tags { { 'env' => 'test', 'owner' => 'spec' } }
52
+
53
+ discovered_at { Time.now }
54
+ last_synced_at { Time.now }
55
+ sync_status { 'current' }
56
+ created_at { Time.now }
57
+ updated_at { Time.now }
58
+
59
+ external_aws_account_id do |attrs|
60
+ attrs[:external_aws_account] ? attrs[:external_aws_account].id : nil
61
+ end
62
+
63
+ links do |attrs|
64
+ hash = {}
65
+ if attrs[:external_aws_account]
66
+ hash[:external_aws_account] = OpenStruct.new(
67
+ href: "/external_aws_accounts/#{attrs[:external_aws_account].id}"
68
+ )
69
+ end
70
+ OpenStruct.new(hash)
71
+ end
72
+ 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.24.10
4
+ version: 0.26.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: 2025-08-19 00:00:00.000000000 Z
11
+ date: 2026-01-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -36,28 +36,28 @@ dependencies:
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: 1.8.0
39
+ version: '1.12'
40
40
  type: :runtime
41
41
  prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: 1.8.0
46
+ version: '1.12'
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: aptible-auth
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: 1.2.5
53
+ version: '1.4'
54
54
  type: :runtime
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
- version: 1.2.5
60
+ version: '1.4'
61
61
  - !ruby/object:Gem::Dependency
62
62
  name: aptible-billing
63
63
  requirement: !ruby/object:Gem::Requirement
@@ -422,6 +422,48 @@ dependencies:
422
422
  - - "~>"
423
423
  - !ruby/object:Gem::Version
424
424
  version: 2.15.2
425
+ - !ruby/object:Gem::Dependency
426
+ name: httplog
427
+ requirement: !ruby/object:Gem::Requirement
428
+ requirements:
429
+ - - "<"
430
+ - !ruby/object:Gem::Version
431
+ version: '1.6'
432
+ type: :development
433
+ prerelease: false
434
+ version_requirements: !ruby/object:Gem::Requirement
435
+ requirements:
436
+ - - "<"
437
+ - !ruby/object:Gem::Version
438
+ version: '1.6'
439
+ - !ruby/object:Gem::Dependency
440
+ name: minitest
441
+ requirement: !ruby/object:Gem::Requirement
442
+ requirements:
443
+ - - "<"
444
+ - !ruby/object:Gem::Version
445
+ version: '5.16'
446
+ type: :development
447
+ prerelease: false
448
+ version_requirements: !ruby/object:Gem::Requirement
449
+ requirements:
450
+ - - "<"
451
+ - !ruby/object:Gem::Version
452
+ version: '5.16'
453
+ - !ruby/object:Gem::Dependency
454
+ name: hashie
455
+ requirement: !ruby/object:Gem::Requirement
456
+ requirements:
457
+ - - "<"
458
+ - !ruby/object:Gem::Version
459
+ version: '5.1'
460
+ type: :development
461
+ prerelease: false
462
+ version_requirements: !ruby/object:Gem::Requirement
463
+ requirements:
464
+ - - "<"
465
+ - !ruby/object:Gem::Version
466
+ version: '5.1'
425
467
  description: Aptible CLI
426
468
  email:
427
469
  - frank@macreery.com
@@ -432,6 +474,7 @@ extra_rdoc_files: []
432
474
  files:
433
475
  - ".dockerignore"
434
476
  - ".github/CODEOWNERS"
477
+ - ".github/workflows/release.yml"
435
478
  - ".github/workflows/test.yml"
436
479
  - ".gitignore"
437
480
  - ".rspec"
@@ -462,6 +505,7 @@ files:
462
505
  - lib/aptible/cli/formatter/value.rb
463
506
  - lib/aptible/cli/helpers/app.rb
464
507
  - lib/aptible/cli/helpers/app_or_database.rb
508
+ - lib/aptible/cli/helpers/aws_account.rb
465
509
  - lib/aptible/cli/helpers/config_path.rb
466
510
  - lib/aptible/cli/helpers/database.rb
467
511
  - lib/aptible/cli/helpers/date_helpers.rb
@@ -485,6 +529,7 @@ files:
485
529
  - lib/aptible/cli/renderer/text.rb
486
530
  - lib/aptible/cli/resource_formatter.rb
487
531
  - lib/aptible/cli/subcommands/apps.rb
532
+ - lib/aptible/cli/subcommands/aws_accounts.rb
488
533
  - lib/aptible/cli/subcommands/backup.rb
489
534
  - lib/aptible/cli/subcommands/backup_retention_policy.rb
490
535
  - lib/aptible/cli/subcommands/config.rb
@@ -498,6 +543,7 @@ files:
498
543
  - lib/aptible/cli/subcommands/maintenance.rb
499
544
  - lib/aptible/cli/subcommands/metric_drain.rb
500
545
  - lib/aptible/cli/subcommands/operation.rb
546
+ - lib/aptible/cli/subcommands/organizations.rb
501
547
  - lib/aptible/cli/subcommands/rebuild.rb
502
548
  - lib/aptible/cli/subcommands/restart.rb
503
549
  - lib/aptible/cli/subcommands/services.rb
@@ -527,18 +573,21 @@ files:
527
573
  - spec/aptible/cli/subcommands/deploy_spec.rb
528
574
  - spec/aptible/cli/subcommands/endpoints_spec.rb
529
575
  - spec/aptible/cli/subcommands/environment_spec.rb
576
+ - spec/aptible/cli/subcommands/external_aws_accounts_spec.rb
530
577
  - spec/aptible/cli/subcommands/inspect_spec.rb
531
578
  - spec/aptible/cli/subcommands/log_drain_spec.rb
532
579
  - spec/aptible/cli/subcommands/logs_spec.rb
533
580
  - spec/aptible/cli/subcommands/maintenance_spec.rb
534
581
  - spec/aptible/cli/subcommands/metric_drain_spec.rb
535
582
  - spec/aptible/cli/subcommands/operation_spec.rb
583
+ - spec/aptible/cli/subcommands/organizations_spec.rb
536
584
  - spec/aptible/cli/subcommands/rebuild_spec.rb
537
585
  - spec/aptible/cli/subcommands/restart_spec.rb
538
586
  - spec/aptible/cli/subcommands/services_spec.rb
539
587
  - spec/aptible/cli/subcommands/ssh_spec.rb
540
588
  - spec/aptible/cli_spec.rb
541
589
  - spec/fabricators/account_fabricator.rb
590
+ - spec/fabricators/app_external_aws_rds_connection_fabricator.rb
542
591
  - spec/fabricators/app_fabricator.rb
543
592
  - spec/fabricators/backup_fabricator.rb
544
593
  - spec/fabricators/backup_retention_policy_fabricator.rb
@@ -548,6 +597,9 @@ files:
548
597
  - spec/fabricators/database_disk_fabricator.rb
549
598
  - spec/fabricators/database_fabricator.rb
550
599
  - spec/fabricators/database_image_fabricator.rb
600
+ - spec/fabricators/external_aws_account_fabricator.rb
601
+ - spec/fabricators/external_aws_database_credential_fabricator.rb
602
+ - spec/fabricators/external_aws_resource_fabricator.rb
551
603
  - spec/fabricators/log_drain_fabricator.rb
552
604
  - spec/fabricators/maintenance_app_fabricator.rb
553
605
  - spec/fabricators/maintenance_database_fabricator.rb
@@ -614,18 +666,21 @@ test_files:
614
666
  - spec/aptible/cli/subcommands/deploy_spec.rb
615
667
  - spec/aptible/cli/subcommands/endpoints_spec.rb
616
668
  - spec/aptible/cli/subcommands/environment_spec.rb
669
+ - spec/aptible/cli/subcommands/external_aws_accounts_spec.rb
617
670
  - spec/aptible/cli/subcommands/inspect_spec.rb
618
671
  - spec/aptible/cli/subcommands/log_drain_spec.rb
619
672
  - spec/aptible/cli/subcommands/logs_spec.rb
620
673
  - spec/aptible/cli/subcommands/maintenance_spec.rb
621
674
  - spec/aptible/cli/subcommands/metric_drain_spec.rb
622
675
  - spec/aptible/cli/subcommands/operation_spec.rb
676
+ - spec/aptible/cli/subcommands/organizations_spec.rb
623
677
  - spec/aptible/cli/subcommands/rebuild_spec.rb
624
678
  - spec/aptible/cli/subcommands/restart_spec.rb
625
679
  - spec/aptible/cli/subcommands/services_spec.rb
626
680
  - spec/aptible/cli/subcommands/ssh_spec.rb
627
681
  - spec/aptible/cli_spec.rb
628
682
  - spec/fabricators/account_fabricator.rb
683
+ - spec/fabricators/app_external_aws_rds_connection_fabricator.rb
629
684
  - spec/fabricators/app_fabricator.rb
630
685
  - spec/fabricators/backup_fabricator.rb
631
686
  - spec/fabricators/backup_retention_policy_fabricator.rb
@@ -635,6 +690,9 @@ test_files:
635
690
  - spec/fabricators/database_disk_fabricator.rb
636
691
  - spec/fabricators/database_fabricator.rb
637
692
  - spec/fabricators/database_image_fabricator.rb
693
+ - spec/fabricators/external_aws_account_fabricator.rb
694
+ - spec/fabricators/external_aws_database_credential_fabricator.rb
695
+ - spec/fabricators/external_aws_resource_fabricator.rb
638
696
  - spec/fabricators/log_drain_fabricator.rb
639
697
  - spec/fabricators/maintenance_app_fabricator.rb
640
698
  - spec/fabricators/maintenance_database_fabricator.rb