aptible-cli 0.16.7 → 0.17.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/.gitignore +1 -1
- data/.travis.yml +1 -0
- data/Gemfile +0 -1
- data/README.md +49 -49
- data/appveyor.yml +1 -7
- data/aptible-cli.gemspec +5 -1
- data/bin/aptible +1 -1
- data/lib/aptible/cli/agent.rb +16 -2
- data/lib/aptible/cli/helpers/database.rb +5 -3
- data/lib/aptible/cli/resource_formatter.rb +12 -0
- data/lib/aptible/cli/subcommands/backup.rb +5 -2
- data/lib/aptible/cli/subcommands/db.rb +9 -4
- data/lib/aptible/cli/subcommands/environment.rb +49 -0
- data/lib/aptible/cli/version.rb +1 -1
- data/spec/aptible/cli/subcommands/db_spec.rb +3 -1
- data/spec/aptible/cli/subcommands/environment_spec.rb +54 -0
- data/spec/fabricators/account_fabricator.rb +1 -0
- data/spec/fabricators/database_disk_fabricator.rb +7 -0
- data/spec/fabricators/database_fabricator.rb +2 -0
- data/spec/spec_helper.rb +0 -8
- metadata +12 -8
- 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: ec0eedcd128407794469d7da0f0b89edcbc60b659118cab8a278166440d00e9b
|
|
4
|
+
data.tar.gz: ed5663f602a43c54b6a13930a9f271face5c30e65c6d70d4c48eb633abb7ba63
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a77a1f7c55957bd2f08e00ee3cd98d7d29c2058e989b152c7939be33b7e385c0a75dc95db6682948477f4c400654a5a1aa629476f12ff94c5b17e17103cb18e2
|
|
7
|
+
data.tar.gz: a9fdc5310c266fe98565ff1c2aa363a16d3b58f6943f1d5fac7184717ac9c4f0d62229b7ad651cfc71d03849d1eb3d80d72ae2fafa14b4beaacb168426cf1156
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
[](https://rubygems.org/gems/aptible-cli)
|
|
4
4
|
[](https://travis-ci.org/aptible/aptible-cli)
|
|
5
5
|
[](https://gemnasium.com/aptible/aptible-cli)
|
|
6
|
-
[](https://codecov.io/gh/aptible/aptible-cli)
|
|
7
6
|
[](http://waffle.io/aptible/aptible-cli)
|
|
8
7
|
|
|
9
8
|
Command-line interface for Aptible services.
|
|
@@ -29,54 +28,55 @@ From `aptible help`:
|
|
|
29
28
|
<!-- BEGIN USAGE -->
|
|
30
29
|
```
|
|
31
30
|
Commands:
|
|
32
|
-
aptible apps
|
|
33
|
-
aptible apps:create HANDLE
|
|
34
|
-
aptible apps:deprovision
|
|
35
|
-
aptible apps:scale SERVICE [--container-count COUNT] [--container-size SIZE_MB]
|
|
36
|
-
aptible backup:list DB_HANDLE
|
|
37
|
-
aptible backup:orphaned
|
|
38
|
-
aptible backup:purge BACKUP_ID
|
|
39
|
-
aptible backup:restore BACKUP_ID [--environment ENVIRONMENT_HANDLE] [--handle HANDLE] [--container-size SIZE_MB] [--disk-size SIZE_GB] # Restore a backup
|
|
40
|
-
aptible config
|
|
41
|
-
aptible config:add [VAR1=VAL1] [VAR2=VAL2] [...]
|
|
42
|
-
aptible config:rm [VAR1] [VAR2] [...]
|
|
43
|
-
aptible config:set [VAR1=VAL1] [VAR2=VAL2] [...]
|
|
44
|
-
aptible config:unset [VAR1] [VAR2] [...]
|
|
45
|
-
aptible db:backup HANDLE
|
|
46
|
-
aptible db:clone SOURCE DEST
|
|
47
|
-
aptible db:create HANDLE [--type TYPE] [--version VERSION] [--container-size SIZE_MB] [--disk-size SIZE_GB] # Create a new database
|
|
48
|
-
aptible db:deprovision HANDLE
|
|
49
|
-
aptible db:dump HANDLE [pg_dump options]
|
|
50
|
-
aptible db:execute HANDLE SQL_FILE [--on-error-stop]
|
|
51
|
-
aptible db:list
|
|
52
|
-
aptible db:reload HANDLE
|
|
53
|
-
aptible db:replicate HANDLE REPLICA_HANDLE [--container-size SIZE_MB] [--disk-size SIZE_GB] [--logical --version VERSION] # Create a replica/follower of a database
|
|
54
|
-
aptible db:restart HANDLE [--container-size SIZE_MB] [--disk-size SIZE_GB]
|
|
55
|
-
aptible db:tunnel HANDLE
|
|
56
|
-
aptible db:url HANDLE
|
|
57
|
-
aptible db:versions
|
|
58
|
-
aptible deploy [OPTIONS] [VAR1=VAL1] [VAR2=VAL2] [...]
|
|
59
|
-
aptible domains
|
|
60
|
-
aptible endpoints:database:create DATABASE
|
|
61
|
-
aptible endpoints:deprovision [--app APP | --database DATABASE] ENDPOINT_HOSTNAME
|
|
62
|
-
aptible endpoints:https:create [--app APP] SERVICE
|
|
63
|
-
aptible endpoints:https:modify [--app APP] ENDPOINT_HOSTNAME
|
|
64
|
-
aptible endpoints:list [--app APP | --database DATABASE]
|
|
65
|
-
aptible endpoints:renew [--app APP] ENDPOINT_HOSTNAME
|
|
66
|
-
aptible endpoints:tcp:create [--app APP] SERVICE
|
|
67
|
-
aptible endpoints:tcp:modify [--app APP] ENDPOINT_HOSTNAME
|
|
68
|
-
aptible endpoints:tls:create [--app APP] SERVICE
|
|
69
|
-
aptible endpoints:tls:modify [--app APP] ENDPOINT_HOSTNAME
|
|
70
|
-
aptible
|
|
71
|
-
aptible
|
|
72
|
-
aptible
|
|
73
|
-
aptible
|
|
74
|
-
aptible
|
|
75
|
-
aptible
|
|
76
|
-
aptible
|
|
77
|
-
aptible
|
|
78
|
-
aptible
|
|
79
|
-
aptible
|
|
31
|
+
aptible apps # List all applications
|
|
32
|
+
aptible apps:create HANDLE # Create a new application
|
|
33
|
+
aptible apps:deprovision # Deprovision an app
|
|
34
|
+
aptible apps:scale SERVICE [--container-count COUNT] [--container-size SIZE_MB] # Scale a service
|
|
35
|
+
aptible backup:list DB_HANDLE # List backups for a database
|
|
36
|
+
aptible backup:orphaned # List backups associated with deprovisioned databases
|
|
37
|
+
aptible backup:purge BACKUP_ID # Permanently delete a backup and any copies of it
|
|
38
|
+
aptible backup:restore BACKUP_ID [--environment ENVIRONMENT_HANDLE] [--handle HANDLE] [--container-size SIZE_MB] [--disk-size SIZE_GB] [--key-arn KEY_ARN] # Restore a backup
|
|
39
|
+
aptible config # Print an app's current configuration
|
|
40
|
+
aptible config:add [VAR1=VAL1] [VAR2=VAL2] [...] # Add an ENV variable to an app
|
|
41
|
+
aptible config:rm [VAR1] [VAR2] [...] # Remove an ENV variable from an app
|
|
42
|
+
aptible config:set [VAR1=VAL1] [VAR2=VAL2] [...] # Add an ENV variable to an app
|
|
43
|
+
aptible config:unset [VAR1] [VAR2] [...] # Remove an ENV variable from an app
|
|
44
|
+
aptible db:backup HANDLE # Backup a database
|
|
45
|
+
aptible db:clone SOURCE DEST # Clone a database to create a new one
|
|
46
|
+
aptible db:create HANDLE [--type TYPE] [--version VERSION] [--container-size SIZE_MB] [--disk-size SIZE_GB] [--key-arn KEY_ARN] # Create a new database
|
|
47
|
+
aptible db:deprovision HANDLE # Deprovision a database
|
|
48
|
+
aptible db:dump HANDLE [pg_dump options] # Dump a remote database to file
|
|
49
|
+
aptible db:execute HANDLE SQL_FILE [--on-error-stop] # Executes sql against a database
|
|
50
|
+
aptible db:list # List all databases
|
|
51
|
+
aptible db:reload HANDLE # Reload a database
|
|
52
|
+
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] # Restart a database
|
|
54
|
+
aptible db:tunnel HANDLE # Create a local tunnel to a database
|
|
55
|
+
aptible db:url HANDLE # Display a database URL
|
|
56
|
+
aptible db:versions # List available database versions
|
|
57
|
+
aptible deploy [OPTIONS] [VAR1=VAL1] [VAR2=VAL2] [...] # Deploy an app
|
|
58
|
+
aptible domains # Print an app's current virtual domains - DEPRECATED
|
|
59
|
+
aptible endpoints:database:create DATABASE # Create a Database Endpoint
|
|
60
|
+
aptible endpoints:deprovision [--app APP | --database DATABASE] ENDPOINT_HOSTNAME # Deprovision an App or Database Endpoint
|
|
61
|
+
aptible endpoints:https:create [--app APP] SERVICE # Create an App HTTPS Endpoint
|
|
62
|
+
aptible endpoints:https:modify [--app APP] ENDPOINT_HOSTNAME # Modify an App HTTPS Endpoint
|
|
63
|
+
aptible endpoints:list [--app APP | --database DATABASE] # List Endpoints for an App or Database
|
|
64
|
+
aptible endpoints:renew [--app APP] ENDPOINT_HOSTNAME # Renew an App Managed TLS Endpoint
|
|
65
|
+
aptible endpoints:tcp:create [--app APP] SERVICE # Create an App TCP Endpoint
|
|
66
|
+
aptible endpoints:tcp:modify [--app APP] ENDPOINT_HOSTNAME # Modify an App TCP Endpoint
|
|
67
|
+
aptible endpoints:tls:create [--app APP] SERVICE # Create an App TLS Endpoint
|
|
68
|
+
aptible endpoints:tls:modify [--app APP] ENDPOINT_HOSTNAME # Modify an App TLS Endpoint
|
|
69
|
+
aptible environment:ca_cert # Retrieve the CA certificate associated with the environment
|
|
70
|
+
aptible environment:list # List all environments
|
|
71
|
+
aptible help [COMMAND] # Describe available commands or one specific command
|
|
72
|
+
aptible login # Log in to Aptible
|
|
73
|
+
aptible logs [--app APP | --database DATABASE] # Follows logs from a running app or database
|
|
74
|
+
aptible operation:cancel OPERATION_ID # Cancel a running operation
|
|
75
|
+
aptible rebuild # Rebuild an app, and restart its services
|
|
76
|
+
aptible restart # Restart all services associated with an app
|
|
77
|
+
aptible services # List Services for an App
|
|
78
|
+
aptible ssh [COMMAND] # Run a command against an app
|
|
79
|
+
aptible version # Print Aptible CLI version
|
|
80
80
|
```
|
|
81
81
|
<!-- END USAGE -->
|
|
82
82
|
|
data/appveyor.yml
CHANGED
|
@@ -8,12 +8,6 @@ environment:
|
|
|
8
8
|
- RUBY_VERSION: 23
|
|
9
9
|
|
|
10
10
|
install:
|
|
11
|
-
# The SSL_CERT_* environment variables are here since otherwise calls to
|
|
12
|
-
# codecov.io wtill not work. These variables do have to be set in order for
|
|
13
|
-
# the gem to make calls to the Aptible API, since otherwise Ruby will fail
|
|
14
|
-
# with a certificate verification error.
|
|
15
|
-
- set SSL_CERT_DIR=%PROGRAMFILES%\Git\mingw64\ssl\certs
|
|
16
|
-
- set SSL_CERT_FILE=%PROGRAMFILES%\Git\mingw64\ssl\cert.pem
|
|
17
11
|
# Override PATHEXT so our ssh bat file has a higher precedence.
|
|
18
12
|
- set PATHEXT=.BAT;.COM;.EXE;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
|
|
19
13
|
- set PATH=C:\Ruby%RUBY_VERSION%-x64\bin;%PATH%
|
|
@@ -28,4 +22,4 @@ before_test:
|
|
|
28
22
|
- bundle -v
|
|
29
23
|
|
|
30
24
|
test_script:
|
|
31
|
-
- bundle exec rake ci
|
|
25
|
+
- bundle exec rake ci
|
data/aptible-cli.gemspec
CHANGED
|
@@ -22,13 +22,17 @@ Gem::Specification.new do |spec|
|
|
|
22
22
|
|
|
23
23
|
spec.add_dependency 'aptible-resource', '~> 1.1'
|
|
24
24
|
spec.add_dependency 'aptible-api', '~> 1.2'
|
|
25
|
-
spec.add_dependency 'aptible-auth', '~> 1.
|
|
25
|
+
spec.add_dependency 'aptible-auth', '~> 1.2.3'
|
|
26
26
|
spec.add_dependency 'aptible-billing', '~> 1.0'
|
|
27
27
|
spec.add_dependency 'thor', '~> 0.20.0'
|
|
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/bin/aptible
CHANGED
|
@@ -10,7 +10,7 @@ end
|
|
|
10
10
|
begin
|
|
11
11
|
Aptible::CLI::Agent.start
|
|
12
12
|
rescue HyperResource::ClientError => e
|
|
13
|
-
m = if e.body['error']
|
|
13
|
+
m = if %w(invalid_token expired_token).include? e.body['error']
|
|
14
14
|
'API authentication error: please run aptible login'
|
|
15
15
|
else
|
|
16
16
|
"An error occurred: #{e.body['message']}"
|
data/lib/aptible/cli/agent.rb
CHANGED
|
@@ -23,8 +23,8 @@ require_relative 'subcommands/apps'
|
|
|
23
23
|
require_relative 'subcommands/config'
|
|
24
24
|
require_relative 'subcommands/db'
|
|
25
25
|
require_relative 'subcommands/domains'
|
|
26
|
+
require_relative 'subcommands/environment'
|
|
26
27
|
require_relative 'subcommands/logs'
|
|
27
|
-
require_relative 'subcommands/ps'
|
|
28
28
|
require_relative 'subcommands/rebuild'
|
|
29
29
|
require_relative 'subcommands/deploy'
|
|
30
30
|
require_relative 'subcommands/restart'
|
|
@@ -47,8 +47,8 @@ module Aptible
|
|
|
47
47
|
include Subcommands::Config
|
|
48
48
|
include Subcommands::DB
|
|
49
49
|
include Subcommands::Domains
|
|
50
|
+
include Subcommands::Environment
|
|
50
51
|
include Subcommands::Logs
|
|
51
|
-
include Subcommands::Ps
|
|
52
52
|
include Subcommands::Rebuild
|
|
53
53
|
include Subcommands::Deploy
|
|
54
54
|
include Subcommands::Restart
|
|
@@ -67,6 +67,7 @@ module Aptible
|
|
|
67
67
|
def initialize(*)
|
|
68
68
|
nag_toolbelt unless toolbelt?
|
|
69
69
|
Aptible::Resource.configure { |conf| conf.user_agent = version_string }
|
|
70
|
+
warn_sso_enforcement
|
|
70
71
|
super
|
|
71
72
|
end
|
|
72
73
|
|
|
@@ -232,6 +233,19 @@ module Aptible
|
|
|
232
233
|
end
|
|
233
234
|
end
|
|
234
235
|
|
|
236
|
+
def warn_sso_enforcement
|
|
237
|
+
# If the user is also a member of
|
|
238
|
+
token = fetch_token
|
|
239
|
+
reauth = Aptible::Auth::ReauthenticateOrganization.all(token: token)
|
|
240
|
+
return if reauth.empty?
|
|
241
|
+
|
|
242
|
+
CLI.logger.warn(['WARNING: You will need to use the appropriate',
|
|
243
|
+
'login method (SSO or Aptible credentials) to access',
|
|
244
|
+
'these organizations:',
|
|
245
|
+
reauth.map(&:name)].join(' '))
|
|
246
|
+
rescue StandardError
|
|
247
|
+
end
|
|
248
|
+
|
|
235
249
|
def version_string
|
|
236
250
|
bits = [
|
|
237
251
|
'aptible-cli',
|
|
@@ -51,7 +51,8 @@ module Aptible
|
|
|
51
51
|
replication_params = {
|
|
52
52
|
handle: dest_handle,
|
|
53
53
|
container_size: options[:container_size],
|
|
54
|
-
disk_size: options[:size]
|
|
54
|
+
disk_size: options[:size],
|
|
55
|
+
key_arn: options[:key_arn]
|
|
55
56
|
}.reject { |_, v| v.nil? }
|
|
56
57
|
|
|
57
58
|
if options[:logical]
|
|
@@ -104,10 +105,11 @@ module Aptible
|
|
|
104
105
|
|
|
105
106
|
def local_url(credential, local_port)
|
|
106
107
|
remote_url = credential.connection_url
|
|
107
|
-
uri = URI.parse(remote_url)
|
|
108
108
|
|
|
109
|
+
uri = URI.parse(remote_url)
|
|
110
|
+
domain = credential.database.account.stack.internal_domain
|
|
109
111
|
"#{uri.scheme}://#{uri.user}:#{uri.password}@" \
|
|
110
|
-
"localhost
|
|
112
|
+
"localhost.#{domain}:#{local_port}#{uri.path}"
|
|
111
113
|
end
|
|
112
114
|
|
|
113
115
|
def find_credential(database, type = nil)
|
|
@@ -23,6 +23,7 @@ module Aptible
|
|
|
23
23
|
node.value('created_at', backup.created_at)
|
|
24
24
|
node.value('region', backup.aws_region)
|
|
25
25
|
node.value('size', backup.size)
|
|
26
|
+
node.value('manual', backup.manual)
|
|
26
27
|
|
|
27
28
|
if backup.copied_from
|
|
28
29
|
node.keyed_object('copied_from', 'description') do |n|
|
|
@@ -81,6 +82,7 @@ module Aptible
|
|
|
81
82
|
node.value('handle', database.handle)
|
|
82
83
|
|
|
83
84
|
node.value('type', database.type)
|
|
85
|
+
node.value('version', database.database_image.version)
|
|
84
86
|
node.value('status', database.status)
|
|
85
87
|
|
|
86
88
|
node.value('connection_url', database.connection_url)
|
|
@@ -91,6 +93,16 @@ module Aptible
|
|
|
91
93
|
end
|
|
92
94
|
end
|
|
93
95
|
attach_account(node, account)
|
|
96
|
+
|
|
97
|
+
if database.disk
|
|
98
|
+
node.value('disk_type', database.disk.ebs_volume_type)
|
|
99
|
+
node.value('disk_size', database.disk.size)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
if database.service
|
|
103
|
+
node.value('container_size', \
|
|
104
|
+
database.service.container_memory_limit_mb)
|
|
105
|
+
end
|
|
94
106
|
end
|
|
95
107
|
|
|
96
108
|
def inject_credential(node, credential)
|
|
@@ -9,13 +9,15 @@ module Aptible
|
|
|
9
9
|
|
|
10
10
|
desc 'backup:restore BACKUP_ID ' \
|
|
11
11
|
'[--environment ENVIRONMENT_HANDLE] [--handle HANDLE] ' \
|
|
12
|
-
'[--container-size SIZE_MB] [--disk-size SIZE_GB]'
|
|
12
|
+
'[--container-size SIZE_MB] [--disk-size SIZE_GB] ' \
|
|
13
|
+
'[--key-arn KEY_ARN]',
|
|
13
14
|
'Restore a backup'
|
|
14
15
|
option :handle, desc: 'a name to use for the new database'
|
|
15
16
|
option :environment, desc: 'a different environment to restore to'
|
|
16
17
|
option :container_size, type: :numeric
|
|
17
18
|
option :size, type: :numeric
|
|
18
19
|
option :disk_size, type: :numeric
|
|
20
|
+
option :key_arn, type: :string
|
|
19
21
|
define_method 'backup:restore' do |backup_id|
|
|
20
22
|
backup = Aptible::Api::Backup.find(backup_id, token: fetch_token)
|
|
21
23
|
raise Thor::Error, "Backup ##{backup_id} not found" if backup.nil?
|
|
@@ -38,7 +40,8 @@ module Aptible
|
|
|
38
40
|
handle: handle,
|
|
39
41
|
container_size: options[:container_size],
|
|
40
42
|
disk_size: options[:disk_size] || options[:size],
|
|
41
|
-
destination_account: destination_account
|
|
43
|
+
destination_account: destination_account,
|
|
44
|
+
key_arn: options[:key_arn]
|
|
42
45
|
}.delete_if { |_, v| v.nil? }
|
|
43
46
|
|
|
44
47
|
CLI.logger.warn([
|
|
@@ -53,13 +53,15 @@ module Aptible
|
|
|
53
53
|
|
|
54
54
|
desc 'db:create HANDLE ' \
|
|
55
55
|
'[--type TYPE] [--version VERSION] ' \
|
|
56
|
-
'[--container-size SIZE_MB] [--disk-size SIZE_GB]'
|
|
56
|
+
'[--container-size SIZE_MB] [--disk-size SIZE_GB] ' \
|
|
57
|
+
'[--key-arn KEY_ARN]',
|
|
57
58
|
'Create a new database'
|
|
58
59
|
option :type, type: :string
|
|
59
60
|
option :version, type: :string
|
|
60
61
|
option :container_size, type: :numeric
|
|
61
62
|
option :size, type: :numeric
|
|
62
63
|
option :disk_size, default: 10, type: :numeric
|
|
64
|
+
option :key_arn, type: :string
|
|
63
65
|
option :environment
|
|
64
66
|
define_method 'db:create' do |handle|
|
|
65
67
|
account = ensure_environment(options)
|
|
@@ -67,7 +69,8 @@ module Aptible
|
|
|
67
69
|
db_opts = {
|
|
68
70
|
handle: handle,
|
|
69
71
|
initial_container_size: options[:container_size],
|
|
70
|
-
initial_disk_size: options[:disk_size] || options[:size]
|
|
72
|
+
initial_disk_size: options[:disk_size] || options[:size],
|
|
73
|
+
current_kms_arn: options[:key_arn]
|
|
71
74
|
}.delete_if { |_, v| v.nil? }
|
|
72
75
|
|
|
73
76
|
CLI.logger.warn([
|
|
@@ -123,7 +126,7 @@ module Aptible
|
|
|
123
126
|
|
|
124
127
|
desc 'db:replicate HANDLE REPLICA_HANDLE ' \
|
|
125
128
|
'[--container-size SIZE_MB] [--disk-size SIZE_GB] ' \
|
|
126
|
-
'[--logical --version VERSION]',
|
|
129
|
+
'[--logical --version VERSION] [--key-arn KEY_ARN]',
|
|
127
130
|
'Create a replica/follower of a database'
|
|
128
131
|
option :environment
|
|
129
132
|
option :container_size, type: :numeric
|
|
@@ -131,6 +134,7 @@ module Aptible
|
|
|
131
134
|
option :disk_size, type: :numeric
|
|
132
135
|
option :logical, type: :boolean
|
|
133
136
|
option :version, type: :string
|
|
137
|
+
option :key_arn, type: :string
|
|
134
138
|
define_method 'db:replicate' do |source_handle, dest_handle|
|
|
135
139
|
source = ensure_database(options.merge(db: source_handle))
|
|
136
140
|
|
|
@@ -154,7 +158,8 @@ module Aptible
|
|
|
154
158
|
container_size: options[:container_size],
|
|
155
159
|
size: options[:disk_size] || options[:size],
|
|
156
160
|
logical: options[:logical],
|
|
157
|
-
database_image: image || nil
|
|
161
|
+
database_image: image || nil,
|
|
162
|
+
key_arn: options[:key_arn]
|
|
158
163
|
}.delete_if { |_, v| v.nil? }
|
|
159
164
|
|
|
160
165
|
CLI.logger.warn([
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
module Aptible
|
|
2
|
+
module CLI
|
|
3
|
+
module Subcommands
|
|
4
|
+
module Environment
|
|
5
|
+
def self.included(thor)
|
|
6
|
+
thor.class_eval do
|
|
7
|
+
include Helpers::Environment
|
|
8
|
+
include Helpers::Token
|
|
9
|
+
|
|
10
|
+
desc 'environment:list', 'List all environments'
|
|
11
|
+
option :environment
|
|
12
|
+
define_method 'environment:list' do
|
|
13
|
+
Formatter.render(Renderer.current) do |root|
|
|
14
|
+
root.keyed_list(
|
|
15
|
+
'handle'
|
|
16
|
+
) do |node|
|
|
17
|
+
scoped_environments(options).each do |account|
|
|
18
|
+
node.object do |n|
|
|
19
|
+
ResourceFormatter.inject_account(n, account)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
desc 'environment:ca_cert',
|
|
27
|
+
'Retrieve the CA certificate associated with the environment'
|
|
28
|
+
option :environment
|
|
29
|
+
define_method 'environment:ca_cert' do
|
|
30
|
+
Formatter.render(Renderer.current) do |root|
|
|
31
|
+
root.grouped_keyed_list(
|
|
32
|
+
'handle',
|
|
33
|
+
'ca_body'
|
|
34
|
+
) do |node|
|
|
35
|
+
scoped_environments(options).each do |account|
|
|
36
|
+
node.object do |n|
|
|
37
|
+
n.value('ca_body', account.ca_body)
|
|
38
|
+
ResourceFormatter.inject_account(n, account)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
data/lib/aptible/cli/version.rb
CHANGED
|
@@ -13,7 +13,9 @@ describe Aptible::CLI::Agent do
|
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
let(:handle) { 'foobar' }
|
|
16
|
-
let(:
|
|
16
|
+
let(:stack) { Fabricate(:stack, internal_domain: 'aptible.in') }
|
|
17
|
+
let(:account) { Fabricate(:account, stack: stack) }
|
|
18
|
+
let(:database) { Fabricate(:database, handle: handle, account: account) }
|
|
17
19
|
let(:socat_helper) { SocatHelperMock.new(port: 4242) }
|
|
18
20
|
|
|
19
21
|
describe '#db:create' do
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Aptible::CLI::Agent do
|
|
4
|
+
let!(:a1) do
|
|
5
|
+
Fabricate(:account, handle: 'foo', ca_body: 'account 1 cert')
|
|
6
|
+
end
|
|
7
|
+
let!(:a2) do
|
|
8
|
+
Fabricate(:account, handle: 'bar', ca_body: '--account 2 cert--')
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
let(:token) { double 'token' }
|
|
12
|
+
|
|
13
|
+
before do
|
|
14
|
+
allow(subject).to receive(:fetch_token) { token }
|
|
15
|
+
allow(Aptible::Api::Account).to receive(:all).with(token: token)
|
|
16
|
+
.and_return([a1, a2])
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it 'lists avaliable environments' do
|
|
20
|
+
subject.send('environment:list')
|
|
21
|
+
|
|
22
|
+
expect(captured_output_text.split("\n")).to include('foo')
|
|
23
|
+
expect(captured_output_text.split("\n")).to include('bar')
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it 'fetches certs for all avaliable environments' do
|
|
27
|
+
subject.send('environment:ca_cert')
|
|
28
|
+
|
|
29
|
+
expect(captured_output_text.split("\n")).to include('account 1 cert')
|
|
30
|
+
expect(captured_output_text.split("\n")).to include('--account 2 cert--')
|
|
31
|
+
|
|
32
|
+
expected_accounts = [
|
|
33
|
+
{
|
|
34
|
+
'handle' => 'foo',
|
|
35
|
+
'ca_body' => 'account 1 cert'
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
'handle' => 'bar',
|
|
39
|
+
'ca_body' => '--account 2 cert--'
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
expect(captured_output_json.map! { |account| account.except('id') })
|
|
43
|
+
.to eq(expected_accounts)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it 'fetches certs for specified environment' do
|
|
47
|
+
subject.options = { environment: 'foo' }
|
|
48
|
+
subject.send('environment:ca_cert')
|
|
49
|
+
|
|
50
|
+
expect(captured_output_text.split("\n")).to include('account 1 cert')
|
|
51
|
+
expect(captured_output_text.split("\n"))
|
|
52
|
+
.to_not include('--account 2 cert--')
|
|
53
|
+
end
|
|
54
|
+
end
|
data/spec/spec_helper.rb
CHANGED
|
@@ -3,14 +3,6 @@ $LOAD_PATH.unshift(File.dirname(__FILE__))
|
|
|
3
3
|
|
|
4
4
|
Bundler.require :development
|
|
5
5
|
|
|
6
|
-
require 'simplecov'
|
|
7
|
-
SimpleCov.start
|
|
8
|
-
|
|
9
|
-
if ENV['CI']
|
|
10
|
-
require 'codecov'
|
|
11
|
-
SimpleCov.formatter = SimpleCov::Formatter::Codecov
|
|
12
|
-
end
|
|
13
|
-
|
|
14
6
|
# Load shared spec files
|
|
15
7
|
Dir["#{File.dirname(__FILE__)}/shared/**/*.rb"].each do |file|
|
|
16
8
|
require file
|
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.17.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Frank Macreery
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2021-03-17 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: aptible-resource
|
|
@@ -44,14 +44,14 @@ dependencies:
|
|
|
44
44
|
requirements:
|
|
45
45
|
- - "~>"
|
|
46
46
|
- !ruby/object:Gem::Version
|
|
47
|
-
version: 1.
|
|
47
|
+
version: 1.2.3
|
|
48
48
|
type: :runtime
|
|
49
49
|
prerelease: false
|
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
51
|
requirements:
|
|
52
52
|
- - "~>"
|
|
53
53
|
- !ruby/object:Gem::Version
|
|
54
|
-
version: 1.
|
|
54
|
+
version: 1.2.3
|
|
55
55
|
- !ruby/object:Gem::Dependency
|
|
56
56
|
name: aptible-billing
|
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -296,10 +296,10 @@ files:
|
|
|
296
296
|
- lib/aptible/cli/subcommands/deploy.rb
|
|
297
297
|
- lib/aptible/cli/subcommands/domains.rb
|
|
298
298
|
- lib/aptible/cli/subcommands/endpoints.rb
|
|
299
|
+
- lib/aptible/cli/subcommands/environment.rb
|
|
299
300
|
- lib/aptible/cli/subcommands/inspect.rb
|
|
300
301
|
- lib/aptible/cli/subcommands/logs.rb
|
|
301
302
|
- lib/aptible/cli/subcommands/operation.rb
|
|
302
|
-
- lib/aptible/cli/subcommands/ps.rb
|
|
303
303
|
- lib/aptible/cli/subcommands/rebuild.rb
|
|
304
304
|
- lib/aptible/cli/subcommands/restart.rb
|
|
305
305
|
- lib/aptible/cli/subcommands/services.rb
|
|
@@ -325,6 +325,7 @@ files:
|
|
|
325
325
|
- spec/aptible/cli/subcommands/deploy_spec.rb
|
|
326
326
|
- spec/aptible/cli/subcommands/domains_spec.rb
|
|
327
327
|
- spec/aptible/cli/subcommands/endpoints_spec.rb
|
|
328
|
+
- spec/aptible/cli/subcommands/environment_spec.rb
|
|
328
329
|
- spec/aptible/cli/subcommands/inspect_spec.rb
|
|
329
330
|
- spec/aptible/cli/subcommands/logs_spec.rb
|
|
330
331
|
- spec/aptible/cli/subcommands/operation_spec.rb
|
|
@@ -339,6 +340,7 @@ files:
|
|
|
339
340
|
- spec/fabricators/certificate_fabricator.rb
|
|
340
341
|
- spec/fabricators/configuration_fabricator.rb
|
|
341
342
|
- spec/fabricators/database_credential_fabricator.rb
|
|
343
|
+
- spec/fabricators/database_disk_fabricator.rb
|
|
342
344
|
- spec/fabricators/database_fabricator.rb
|
|
343
345
|
- spec/fabricators/database_image_fabricator.rb
|
|
344
346
|
- spec/fabricators/operation_fabricator.rb
|
|
@@ -359,7 +361,7 @@ homepage: https://github.com/aptible/aptible-cli
|
|
|
359
361
|
licenses:
|
|
360
362
|
- MIT
|
|
361
363
|
metadata: {}
|
|
362
|
-
post_install_message:
|
|
364
|
+
post_install_message:
|
|
363
365
|
rdoc_options: []
|
|
364
366
|
require_paths:
|
|
365
367
|
- lib
|
|
@@ -375,7 +377,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
375
377
|
version: '0'
|
|
376
378
|
requirements: []
|
|
377
379
|
rubygems_version: 3.0.3
|
|
378
|
-
signing_key:
|
|
380
|
+
signing_key:
|
|
379
381
|
specification_version: 4
|
|
380
382
|
summary: Command-line interface for Aptible services
|
|
381
383
|
test_files:
|
|
@@ -398,6 +400,7 @@ test_files:
|
|
|
398
400
|
- spec/aptible/cli/subcommands/deploy_spec.rb
|
|
399
401
|
- spec/aptible/cli/subcommands/domains_spec.rb
|
|
400
402
|
- spec/aptible/cli/subcommands/endpoints_spec.rb
|
|
403
|
+
- spec/aptible/cli/subcommands/environment_spec.rb
|
|
401
404
|
- spec/aptible/cli/subcommands/inspect_spec.rb
|
|
402
405
|
- spec/aptible/cli/subcommands/logs_spec.rb
|
|
403
406
|
- spec/aptible/cli/subcommands/operation_spec.rb
|
|
@@ -412,6 +415,7 @@ test_files:
|
|
|
412
415
|
- spec/fabricators/certificate_fabricator.rb
|
|
413
416
|
- spec/fabricators/configuration_fabricator.rb
|
|
414
417
|
- spec/fabricators/database_credential_fabricator.rb
|
|
418
|
+
- spec/fabricators/database_disk_fabricator.rb
|
|
415
419
|
- spec/fabricators/database_fabricator.rb
|
|
416
420
|
- spec/fabricators/database_image_fabricator.rb
|
|
417
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
|