aptible-cli 0.24.2 → 0.24.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/test.yml +1 -1
- data/Gemfile.lock +1 -1
- data/lib/aptible/cli/agent.rb +9 -1
- data/lib/aptible/cli/helpers/app.rb +16 -1
- data/lib/aptible/cli/helpers/database.rb +20 -5
- data/lib/aptible/cli/helpers/environment.rb +28 -3
- data/lib/aptible/cli/helpers/telemetry.rb +64 -0
- data/lib/aptible/cli/helpers/token.rb +6 -0
- data/lib/aptible/cli/renderer.rb +5 -1
- data/lib/aptible/cli/resource_formatter.rb +7 -0
- data/lib/aptible/cli/subcommands/apps.rb +31 -2
- data/lib/aptible/cli/subcommands/backup.rb +9 -0
- data/lib/aptible/cli/subcommands/backup_retention_policy.rb +5 -0
- data/lib/aptible/cli/subcommands/config.rb +11 -0
- data/lib/aptible/cli/subcommands/db.rb +68 -3
- data/lib/aptible/cli/subcommands/deploy.rb +3 -0
- data/lib/aptible/cli/subcommands/endpoints.rb +26 -0
- data/lib/aptible/cli/subcommands/environment.rb +11 -0
- data/lib/aptible/cli/subcommands/log_drain.rb +26 -5
- data/lib/aptible/cli/subcommands/logs.rb +5 -0
- data/lib/aptible/cli/subcommands/maintenance.rb +5 -0
- data/lib/aptible/cli/subcommands/metric_drain.rb +25 -5
- data/lib/aptible/cli/subcommands/operation.rb +7 -0
- data/lib/aptible/cli/subcommands/rebuild.rb +3 -0
- data/lib/aptible/cli/subcommands/restart.rb +3 -0
- data/lib/aptible/cli/subcommands/services.rb +12 -3
- data/lib/aptible/cli/subcommands/ssh.rb +3 -0
- data/lib/aptible/cli/version.rb +1 -1
- data/spec/aptible/cli/subcommands/apps_spec.rb +13 -1
- data/spec/aptible/cli/subcommands/config_spec.rb +4 -2
- data/spec/aptible/cli/subcommands/db_spec.rb +7 -1
- data/spec/aptible/cli/subcommands/endpoints_spec.rb +9 -3
- data/spec/aptible/cli/subcommands/environment_spec.rb +3 -1
- data/spec/aptible/cli/subcommands/log_drain_spec.rb +15 -2
- data/spec/aptible/cli/subcommands/maintenance_spec.rb +3 -2
- data/spec/aptible/cli/subcommands/metric_drain_spec.rb +15 -2
- data/spec/aptible/cli/subcommands/services_spec.rb +3 -1
- data/spec/fabricators/account_fabricator.rb +8 -0
- data/spec/fabricators/app_fabricator.rb +9 -0
- data/spec/fabricators/database_fabricator.rb +8 -0
- data/spec/fabricators/log_drain_fabricator.rb +8 -0
- data/spec/fabricators/metric_drain_fabricator.rb +8 -0
- data/spec/spec_helper.rb +9 -1
- metadata +6 -5
@@ -18,6 +18,7 @@ module Aptible
|
|
18
18
|
thor.class_eval do
|
19
19
|
include Helpers::Operation
|
20
20
|
include Helpers::App
|
21
|
+
include Helpers::Telemetry
|
21
22
|
|
22
23
|
desc 'deploy [OPTIONS] [VAR1=VAL1] [VAR2=VAL2] [...]',
|
23
24
|
'Deploy an app'
|
@@ -46,6 +47,8 @@ module Aptible
|
|
46
47
|
end
|
47
48
|
app_options
|
48
49
|
def deploy(*args)
|
50
|
+
telemetry(__method__, options)
|
51
|
+
|
49
52
|
app = ensure_app(options)
|
50
53
|
|
51
54
|
git_ref = options[:git_commitish]
|
@@ -10,6 +10,7 @@ module Aptible
|
|
10
10
|
include Helpers::Operation
|
11
11
|
include Helpers::AppOrDatabase
|
12
12
|
include Helpers::Vhost
|
13
|
+
include Helpers::Telemetry
|
13
14
|
|
14
15
|
database_create_flags = Helpers::Vhost::OptionSetBuilder.new do
|
15
16
|
create!
|
@@ -20,6 +21,8 @@ module Aptible
|
|
20
21
|
'Create a Database Endpoint'
|
21
22
|
database_create_flags.declare_options(self)
|
22
23
|
define_method 'endpoints:database:create' do |handle|
|
24
|
+
telemetry(__method__, options.merge(handle: handle))
|
25
|
+
|
23
26
|
database = ensure_database(options.merge(db: handle))
|
24
27
|
service = database.service
|
25
28
|
raise Thor::Error, 'Database is not provisioned' if service.nil?
|
@@ -42,6 +45,8 @@ module Aptible
|
|
42
45
|
'Modify a Database Endpoint'
|
43
46
|
database_modify_flags.declare_options(self)
|
44
47
|
define_method 'endpoints:database:modify' do |hostname|
|
48
|
+
telemetry(__method__, options.merge(hostname: hostname))
|
49
|
+
|
45
50
|
database = ensure_database(options.merge(db: options[:database]))
|
46
51
|
vhost = find_vhost(each_service(database), hostname)
|
47
52
|
vhost.update!(**database_modify_flags.prepare(database.account,
|
@@ -59,6 +64,8 @@ module Aptible
|
|
59
64
|
'Create an App TCP Endpoint'
|
60
65
|
tcp_create_flags.declare_options(self)
|
61
66
|
define_method 'endpoints:tcp:create' do |type|
|
67
|
+
telemetry(__method__, options.merge(type: type))
|
68
|
+
|
62
69
|
create_app_vhost(
|
63
70
|
tcp_create_flags, options, type,
|
64
71
|
type: 'tcp', platform: 'elb'
|
@@ -74,6 +81,8 @@ module Aptible
|
|
74
81
|
'Modify an App TCP Endpoint'
|
75
82
|
tcp_modify_flags.declare_options(self)
|
76
83
|
define_method 'endpoints:tcp:modify' do |hostname|
|
84
|
+
telemetry(__method__, options.merge(hostname: hostname))
|
85
|
+
|
77
86
|
modify_app_vhost(tcp_modify_flags, options, hostname)
|
78
87
|
end
|
79
88
|
|
@@ -88,6 +97,8 @@ module Aptible
|
|
88
97
|
'Create an App TLS Endpoint'
|
89
98
|
tls_create_flags.declare_options(self)
|
90
99
|
define_method 'endpoints:tls:create' do |type|
|
100
|
+
telemetry(__method__, options.merge(type: type))
|
101
|
+
|
91
102
|
create_app_vhost(
|
92
103
|
tls_create_flags, options, type,
|
93
104
|
type: 'tls', platform: 'elb'
|
@@ -104,6 +115,8 @@ module Aptible
|
|
104
115
|
'Modify an App TLS Endpoint'
|
105
116
|
tls_modify_flags.declare_options(self)
|
106
117
|
define_method 'endpoints:tls:modify' do |hostname|
|
118
|
+
telemetry(__method__, options.merge(hostname: hostname))
|
119
|
+
|
107
120
|
modify_app_vhost(tls_modify_flags, options, hostname)
|
108
121
|
end
|
109
122
|
|
@@ -118,6 +131,8 @@ module Aptible
|
|
118
131
|
'Create an App gRPC Endpoint'
|
119
132
|
grpc_create_flags.declare_options(self)
|
120
133
|
define_method 'endpoints:grpc:create' do |type|
|
134
|
+
telemetry(__method__, options.merge(type: type))
|
135
|
+
|
121
136
|
create_app_vhost(
|
122
137
|
grpc_create_flags, options, type,
|
123
138
|
type: 'grpc', platform: 'elb'
|
@@ -134,6 +149,8 @@ module Aptible
|
|
134
149
|
'Modify an App gRPC Endpoint'
|
135
150
|
grpc_modify_flags.declare_options(self)
|
136
151
|
define_method 'endpoints:grpc:modify' do |hostname|
|
152
|
+
telemetry(__method__, options.merge(hostname: hostname))
|
153
|
+
|
137
154
|
modify_app_vhost(grpc_modify_flags, options, hostname)
|
138
155
|
end
|
139
156
|
|
@@ -148,6 +165,8 @@ module Aptible
|
|
148
165
|
'Create an App HTTPS Endpoint'
|
149
166
|
https_create_flags.declare_options(self)
|
150
167
|
define_method 'endpoints:https:create' do |type|
|
168
|
+
telemetry(__method__, options.merge(type: type))
|
169
|
+
|
151
170
|
create_app_vhost(
|
152
171
|
https_create_flags, options, type,
|
153
172
|
type: 'http', platform: 'alb'
|
@@ -164,6 +183,7 @@ module Aptible
|
|
164
183
|
'Modify an App HTTPS Endpoint'
|
165
184
|
https_modify_flags.declare_options(self)
|
166
185
|
define_method 'endpoints:https:modify' do |hostname|
|
186
|
+
telemetry(__method__, options.merge(hostname: hostname))
|
167
187
|
modify_app_vhost(https_modify_flags, options, hostname)
|
168
188
|
end
|
169
189
|
|
@@ -171,6 +191,8 @@ module Aptible
|
|
171
191
|
'List Endpoints for an App or Database'
|
172
192
|
app_or_database_options
|
173
193
|
define_method 'endpoints:list' do
|
194
|
+
telemetry(__method__, options)
|
195
|
+
|
174
196
|
resource = ensure_app_or_database(options)
|
175
197
|
|
176
198
|
Formatter.render(Renderer.current) do |root|
|
@@ -191,6 +213,8 @@ module Aptible
|
|
191
213
|
'Deprovision an App or Database Endpoint'
|
192
214
|
app_or_database_options
|
193
215
|
define_method 'endpoints:deprovision' do |hostname|
|
216
|
+
telemetry(__method__, options.merge(hostname: hostname))
|
217
|
+
|
194
218
|
resource = ensure_app_or_database(options)
|
195
219
|
vhost = find_vhost(each_service(resource), hostname)
|
196
220
|
op = vhost.create_operation!(type: 'deprovision')
|
@@ -209,6 +233,8 @@ module Aptible
|
|
209
233
|
LONGDESC
|
210
234
|
app_options
|
211
235
|
define_method 'endpoints:renew' do |hostname|
|
236
|
+
telemetry(__method__, options.merge(hostname: hostname))
|
237
|
+
|
212
238
|
app = ensure_app(options)
|
213
239
|
vhost = find_vhost(app.each_service, hostname)
|
214
240
|
op = vhost.create_operation!(type: 'renew')
|
@@ -6,10 +6,13 @@ module Aptible
|
|
6
6
|
thor.class_eval do
|
7
7
|
include Helpers::Environment
|
8
8
|
include Helpers::Token
|
9
|
+
include Helpers::Telemetry
|
9
10
|
|
10
11
|
desc 'environment:list', 'List all environments'
|
11
12
|
option :environment, aliases: '--env'
|
12
13
|
define_method 'environment:list' do
|
14
|
+
telemetry(__method__, options)
|
15
|
+
|
13
16
|
Formatter.render(Renderer.current) do |root|
|
14
17
|
root.keyed_list(
|
15
18
|
'handle'
|
@@ -27,6 +30,8 @@ module Aptible
|
|
27
30
|
'Retrieve the CA certificate associated with the environment'
|
28
31
|
option :environment, aliases: '--env'
|
29
32
|
define_method 'environment:ca_cert' do
|
33
|
+
telemetry(__method__, options)
|
34
|
+
|
30
35
|
Formatter.render(Renderer.current) do |root|
|
31
36
|
root.grouped_keyed_list(
|
32
37
|
'handle',
|
@@ -48,6 +53,12 @@ module Aptible
|
|
48
53
|
' destinations, you must restart the apps/databases in'\
|
49
54
|
' this environment.'
|
50
55
|
define_method 'environment:rename' do |old_handle, new_handle|
|
56
|
+
opts = options.merge(
|
57
|
+
old_handle: old_handle,
|
58
|
+
new_handle: new_handle
|
59
|
+
)
|
60
|
+
telemetry(__method__, opts)
|
61
|
+
|
51
62
|
env = ensure_environment(options.merge(environment: old_handle))
|
52
63
|
env.update!(handle: new_handle)
|
53
64
|
m1 = "In order for the new environment handle (#{new_handle})"\
|
@@ -7,6 +7,7 @@ module Aptible
|
|
7
7
|
include Helpers::Token
|
8
8
|
include Helpers::Database
|
9
9
|
include Helpers::LogDrain
|
10
|
+
include Helpers::Telemetry
|
10
11
|
|
11
12
|
drain_flags = '--environment ENVIRONMENT ' \
|
12
13
|
'[--drain-apps true/false] ' \
|
@@ -25,16 +26,25 @@ module Aptible
|
|
25
26
|
desc 'log_drain:list', 'List all Log Drains'
|
26
27
|
option :environment, aliases: '--env'
|
27
28
|
define_method 'log_drain:list' do
|
29
|
+
telemetry(__method__, options)
|
30
|
+
|
28
31
|
Formatter.render(Renderer.current) do |root|
|
29
32
|
root.grouped_keyed_list(
|
30
33
|
{ 'environment' => 'handle' },
|
31
34
|
'handle'
|
32
35
|
) do |node|
|
33
|
-
scoped_environments(options)
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
36
|
+
accounts = scoped_environments(options)
|
37
|
+
acc_map = environment_map(accounts)
|
38
|
+
|
39
|
+
Aptible::Api::LogDrain.all(
|
40
|
+
token: fetch_token,
|
41
|
+
href: '/log_drains?per_page=5000'
|
42
|
+
).each do |drain|
|
43
|
+
account = acc_map[drain.links.account.href]
|
44
|
+
next if account.nil?
|
45
|
+
|
46
|
+
node.object do |n|
|
47
|
+
ResourceFormatter.inject_log_drain(n, drain, account)
|
38
48
|
end
|
39
49
|
end
|
40
50
|
end
|
@@ -49,6 +59,8 @@ module Aptible
|
|
49
59
|
option :db, type: :string
|
50
60
|
option :pipeline, type: :string
|
51
61
|
define_method 'log_drain:create:elasticsearch' do |handle|
|
62
|
+
telemetry(__method__, options.merge(handle: handle))
|
63
|
+
|
52
64
|
account = ensure_environment(options)
|
53
65
|
database = ensure_database(options)
|
54
66
|
|
@@ -73,6 +85,8 @@ module Aptible
|
|
73
85
|
drain_options
|
74
86
|
option :url, type: :string
|
75
87
|
define_method 'log_drain:create:datadog' do |handle|
|
88
|
+
telemetry(__method__, options.merge(handle: handle))
|
89
|
+
|
76
90
|
msg = 'Must be in the format of ' \
|
77
91
|
'"https://http-intake.logs.datadoghq.com' \
|
78
92
|
'/v1/input/<DD_API_KEY>".'
|
@@ -86,6 +100,7 @@ module Aptible
|
|
86
100
|
option :url, type: :string
|
87
101
|
drain_options
|
88
102
|
define_method 'log_drain:create:https' do |handle|
|
103
|
+
telemetry(__method__, options.merge(handle: handle))
|
89
104
|
create_https_based_log_drain(handle, options)
|
90
105
|
end
|
91
106
|
|
@@ -96,6 +111,7 @@ module Aptible
|
|
96
111
|
option :url, type: :string
|
97
112
|
drain_options
|
98
113
|
define_method 'log_drain:create:sumologic' do |handle|
|
114
|
+
telemetry(__method__, options.merge(handle: handle))
|
99
115
|
create_https_based_log_drain(handle, options)
|
100
116
|
end
|
101
117
|
|
@@ -106,6 +122,8 @@ module Aptible
|
|
106
122
|
option :url, type: :string
|
107
123
|
drain_options
|
108
124
|
define_method 'log_drain:create:logdna' do |handle|
|
125
|
+
telemetry(__method__, options.merge(handle: handle))
|
126
|
+
|
109
127
|
msg = 'Must be in the format of ' \
|
110
128
|
'"https://logs.logdna.com/aptible/ingest/<INGESTION KEY>".'
|
111
129
|
create_https_based_log_drain(handle, options, url_format_msg: msg)
|
@@ -119,6 +137,7 @@ module Aptible
|
|
119
137
|
option :port, type: :string
|
120
138
|
drain_options
|
121
139
|
define_method 'log_drain:create:papertrail' do |handle|
|
140
|
+
telemetry(__method__, options.merge(handle: handle))
|
122
141
|
create_syslog_based_log_drain(handle, options)
|
123
142
|
end
|
124
143
|
|
@@ -132,6 +151,7 @@ module Aptible
|
|
132
151
|
option :token, type: :string
|
133
152
|
drain_options
|
134
153
|
define_method 'log_drain:create:syslog' do |handle|
|
154
|
+
telemetry(__method__, options.merge(handle: handle))
|
135
155
|
create_syslog_based_log_drain(handle, options)
|
136
156
|
end
|
137
157
|
|
@@ -139,6 +159,7 @@ module Aptible
|
|
139
159
|
'Deprovisions a log drain'
|
140
160
|
option :environment, aliases: '--env'
|
141
161
|
define_method 'log_drain:deprovision' do |handle|
|
162
|
+
telemetry(__method__, options.merge(handle: handle))
|
142
163
|
account = ensure_environment(options)
|
143
164
|
drain = ensure_log_drain(account, handle)
|
144
165
|
op = drain.create_operation(type: :deprovision)
|
@@ -12,11 +12,14 @@ module Aptible
|
|
12
12
|
include Helpers::AppOrDatabase
|
13
13
|
include Helpers::S3LogHelpers
|
14
14
|
include Helpers::DateHelpers
|
15
|
+
include Helpers::Telemetry
|
15
16
|
|
16
17
|
desc 'logs [--app APP | --database DATABASE]',
|
17
18
|
'Follows logs from a running app or database'
|
18
19
|
app_or_database_options
|
19
20
|
def logs
|
21
|
+
telemetry(__method__, options)
|
22
|
+
|
20
23
|
resource = ensure_app_or_database(options)
|
21
24
|
|
22
25
|
unless resource.status == 'provisioned'
|
@@ -89,6 +92,8 @@ module Aptible
|
|
89
92
|
type: :string
|
90
93
|
|
91
94
|
def logs_from_archive
|
95
|
+
telemetry(__method__, options)
|
96
|
+
|
92
97
|
ensure_aws_creds
|
93
98
|
validate_log_search_options(options)
|
94
99
|
|
@@ -7,12 +7,15 @@ module Aptible
|
|
7
7
|
include Helpers::Environment
|
8
8
|
include Helpers::Maintenance
|
9
9
|
include Helpers::Token
|
10
|
+
include Helpers::Telemetry
|
10
11
|
|
11
12
|
desc 'maintenance:apps',
|
12
13
|
'List Apps impacted by maintenance schedules where '\
|
13
14
|
'restarts are required'
|
14
15
|
option :environment, aliases: '--env'
|
15
16
|
define_method 'maintenance:apps' do
|
17
|
+
telemetry(__method__, options)
|
18
|
+
|
16
19
|
found_maintenance = false
|
17
20
|
m = maintenance_apps
|
18
21
|
Formatter.render(Renderer.current) do |root|
|
@@ -48,6 +51,8 @@ module Aptible
|
|
48
51
|
'restarts are required'
|
49
52
|
option :environment, aliases: '--env'
|
50
53
|
define_method 'maintenance:dbs' do
|
54
|
+
telemetry(__method__, options)
|
55
|
+
|
51
56
|
found_maintenance = false
|
52
57
|
m = maintenance_databases
|
53
58
|
Formatter.render(Renderer.current) do |root|
|
@@ -16,20 +16,30 @@ module Aptible
|
|
16
16
|
include Helpers::Token
|
17
17
|
include Helpers::Database
|
18
18
|
include Helpers::MetricDrain
|
19
|
+
include Helpers::Telemetry
|
19
20
|
|
20
21
|
desc 'metric_drain:list', 'List all Metric Drains'
|
21
22
|
option :environment, aliases: '--env'
|
22
23
|
define_method 'metric_drain:list' do
|
24
|
+
telemetry(__method__, options)
|
25
|
+
|
23
26
|
Formatter.render(Renderer.current) do |root|
|
24
27
|
root.grouped_keyed_list(
|
25
28
|
{ 'environment' => 'handle' },
|
26
29
|
'handle'
|
27
30
|
) do |node|
|
28
|
-
scoped_environments(options)
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
31
|
+
accounts = scoped_environments(options)
|
32
|
+
acc_map = environment_map(accounts)
|
33
|
+
|
34
|
+
Aptible::Api::MetricDrain.all(
|
35
|
+
token: fetch_token,
|
36
|
+
href: '/metric_drains?per_page=5000'
|
37
|
+
).each do |drain|
|
38
|
+
account = acc_map[drain.links.account.href]
|
39
|
+
next if account.nil?
|
40
|
+
|
41
|
+
node.object do |n|
|
42
|
+
ResourceFormatter.inject_metric_drain(n, drain, account)
|
33
43
|
end
|
34
44
|
end
|
35
45
|
end
|
@@ -43,6 +53,8 @@ module Aptible
|
|
43
53
|
option :environment, aliases: '--env'
|
44
54
|
|
45
55
|
define_method 'metric_drain:create:influxdb' do |handle|
|
56
|
+
telemetry(__method__, options.merge(handle: handle))
|
57
|
+
|
46
58
|
account = ensure_environment(options)
|
47
59
|
database = ensure_database(options)
|
48
60
|
|
@@ -68,6 +80,8 @@ module Aptible
|
|
68
80
|
option :db, type: :string
|
69
81
|
option :environment, aliases: '--env'
|
70
82
|
define_method 'metric_drain:create:influxdb:custom' do |handle|
|
83
|
+
telemetry(__method__, options.merge(handle: handle))
|
84
|
+
|
71
85
|
account = ensure_environment(options)
|
72
86
|
|
73
87
|
config = {
|
@@ -97,6 +111,8 @@ module Aptible
|
|
97
111
|
option :url, type: :string
|
98
112
|
option :environment, aliases: '--env'
|
99
113
|
define_method 'metric_drain:create:influxdb:customv2' do |handle|
|
114
|
+
telemetry(__method__, options.merge(handle: handle))
|
115
|
+
|
100
116
|
account = ensure_environment(options)
|
101
117
|
|
102
118
|
config = {
|
@@ -123,6 +139,8 @@ module Aptible
|
|
123
139
|
option :site, type: :string
|
124
140
|
option :environment, aliases: '--env'
|
125
141
|
define_method 'metric_drain:create:datadog' do |handle|
|
142
|
+
telemetry(__method__, options.merge(handle: handle))
|
143
|
+
|
126
144
|
account = ensure_environment(options)
|
127
145
|
|
128
146
|
config = {
|
@@ -152,6 +170,8 @@ module Aptible
|
|
152
170
|
'Deprovisions a Metric Drain'
|
153
171
|
option :environment, aliases: '--env'
|
154
172
|
define_method 'metric_drain:deprovision' do |handle|
|
173
|
+
telemetry(__method__, options.merge(handle: handle))
|
174
|
+
|
155
175
|
account = ensure_environment(options)
|
156
176
|
drain = ensure_metric_drain(account, handle)
|
157
177
|
op = drain.create_operation(type: :deprovision)
|
@@ -6,9 +6,12 @@ module Aptible
|
|
6
6
|
thor.class_eval do
|
7
7
|
include Helpers::Token
|
8
8
|
include Helpers::Operation
|
9
|
+
include Helpers::Telemetry
|
9
10
|
|
10
11
|
desc 'operation:cancel OPERATION_ID', 'Cancel a running operation'
|
11
12
|
define_method 'operation:cancel' do |operation_id|
|
13
|
+
telemetry(__method__, options.merge(operation_id: operation_id))
|
14
|
+
|
12
15
|
o = Aptible::Api::Operation.find(operation_id, token: fetch_token)
|
13
16
|
raise "Operation ##{operation_id} not found" if o.nil?
|
14
17
|
|
@@ -20,6 +23,8 @@ module Aptible
|
|
20
23
|
desc 'operation:follow OPERATION_ID',
|
21
24
|
'Follow logs of a running operation'
|
22
25
|
define_method 'operation:follow' do |operation_id|
|
26
|
+
telemetry(__method__, options.merge(operation_id: operation_id))
|
27
|
+
|
23
28
|
o = Aptible::Api::Operation.find(operation_id, token: fetch_token)
|
24
29
|
raise "Operation ##{operation_id} not found" if o.nil?
|
25
30
|
|
@@ -37,6 +42,8 @@ module Aptible
|
|
37
42
|
|
38
43
|
desc 'operation:logs OPERATION_ID', 'View logs for given operation'
|
39
44
|
define_method 'operation:logs' do |operation_id|
|
45
|
+
telemetry(__method__, options.merge(operation_id: operation_id))
|
46
|
+
|
40
47
|
o = Aptible::Api::Operation.find(operation_id, token: fetch_token)
|
41
48
|
raise "Operation ##{operation_id} not found" if o.nil?
|
42
49
|
|
@@ -6,10 +6,13 @@ module Aptible
|
|
6
6
|
thor.class_eval do
|
7
7
|
include Helpers::Operation
|
8
8
|
include Helpers::App
|
9
|
+
include Helpers::Telemetry
|
9
10
|
|
10
11
|
desc 'rebuild', 'Rebuild an app, and restart its services'
|
11
12
|
app_options
|
12
13
|
def rebuild
|
14
|
+
telemetry(__method__, options)
|
15
|
+
|
13
16
|
app = ensure_app(options)
|
14
17
|
operation = app.create_operation!(type: 'rebuild')
|
15
18
|
CLI.logger.info 'Rebuilding app...'
|
@@ -6,6 +6,7 @@ module Aptible
|
|
6
6
|
thor.class_eval do
|
7
7
|
include Helpers::Operation
|
8
8
|
include Helpers::App
|
9
|
+
include Helpers::Telemetry
|
9
10
|
|
10
11
|
desc 'restart', 'Restart all services associated with an app'
|
11
12
|
option :simulate_oom,
|
@@ -20,6 +21,8 @@ module Aptible
|
|
20
21
|
'default.'
|
21
22
|
app_options
|
22
23
|
def restart
|
24
|
+
telemetry(__method__, options)
|
25
|
+
|
23
26
|
app = ensure_app(options)
|
24
27
|
type = 'restart'
|
25
28
|
|
@@ -5,10 +5,13 @@ module Aptible
|
|
5
5
|
def self.included(thor)
|
6
6
|
thor.class_eval do
|
7
7
|
include Helpers::App
|
8
|
+
include Helpers::Telemetry
|
8
9
|
|
9
10
|
desc 'services', 'List Services for an App'
|
10
11
|
app_options
|
11
12
|
def services
|
13
|
+
telemetry(__method__, options)
|
14
|
+
|
12
15
|
app = ensure_app(options)
|
13
16
|
|
14
17
|
Formatter.render(Renderer.current) do |root|
|
@@ -35,6 +38,8 @@ module Aptible
|
|
35
38
|
type: :boolean, default: false,
|
36
39
|
desc: 'Use a simple uptime healthcheck during deployments'
|
37
40
|
define_method 'services:settings' do |service|
|
41
|
+
telemetry(__method__, options.merge(service: service))
|
42
|
+
|
38
43
|
service = ensure_service(options, service)
|
39
44
|
updates = {}
|
40
45
|
updates[:force_zero_downtime] =
|
@@ -49,6 +54,8 @@ module Aptible
|
|
49
54
|
'Returns the associated sizing policy, if any'
|
50
55
|
app_options
|
51
56
|
define_method 'services:autoscaling_policy' do |service|
|
57
|
+
telemetry(__method__, options.merge(service: service))
|
58
|
+
|
52
59
|
service = ensure_service(options, service)
|
53
60
|
policy = service.service_sizing_policy
|
54
61
|
|
@@ -119,9 +126,9 @@ module Aptible
|
|
119
126
|
'be considered.'
|
120
127
|
option :post_release_cooldown_seconds,
|
121
128
|
type: :numeric,
|
122
|
-
desc: '(Default:
|
123
|
-
'following a deploy
|
124
|
-
'
|
129
|
+
desc: '(Default: 60) The time in seconds to ignore in '\
|
130
|
+
'metrics following a deploy to allow for service '\
|
131
|
+
'stabilization.'
|
125
132
|
option :mem_cpu_ratio_r_threshold,
|
126
133
|
type: :numeric,
|
127
134
|
desc: '(Default: 4.0) Establishes the ratio of Memory '\
|
@@ -187,6 +194,8 @@ module Aptible
|
|
187
194
|
' a value of 2 will go from 4->2->1). Container count '\
|
188
195
|
'will never exceed the configured minimum.'
|
189
196
|
define_method 'services:autoscaling_policy:set' do |service|
|
197
|
+
telemetry(__method__, options.merge(service: service))
|
198
|
+
|
190
199
|
service = ensure_service(options, service)
|
191
200
|
ignored_attrs = %i(autoscaling_type app environment remote)
|
192
201
|
args = options.except(*ignored_attrs)
|
@@ -8,6 +8,7 @@ module Aptible
|
|
8
8
|
thor.class_eval do
|
9
9
|
include Helpers::Operation
|
10
10
|
include Helpers::App
|
11
|
+
include Helpers::Telemetry
|
11
12
|
|
12
13
|
desc 'ssh [COMMAND]', 'Run a command against an app'
|
13
14
|
long_desc <<-LONGDESC
|
@@ -18,6 +19,8 @@ module Aptible
|
|
18
19
|
app_options
|
19
20
|
option :force_tty, type: :boolean
|
20
21
|
def ssh(*args)
|
22
|
+
telemetry(__method__, options)
|
23
|
+
|
21
24
|
app = ensure_app(options)
|
22
25
|
|
23
26
|
# SSH's default behavior is as follows:
|
data/lib/aptible/cli/version.rb
CHANGED
@@ -31,6 +31,9 @@ describe Aptible::CLI::Agent do
|
|
31
31
|
describe '#apps' do
|
32
32
|
it 'lists an app in an account' do
|
33
33
|
allow(Aptible::Api::Account).to receive(:all).and_return([account])
|
34
|
+
allow(Aptible::Api::App)
|
35
|
+
.to receive(:all)
|
36
|
+
.and_return([app])
|
34
37
|
subject.send('apps')
|
35
38
|
|
36
39
|
expect(captured_output_text)
|
@@ -40,8 +43,11 @@ describe Aptible::CLI::Agent do
|
|
40
43
|
it 'lists multiple apps in an account' do
|
41
44
|
allow(Aptible::Api::Account).to receive(:all).and_return([account])
|
42
45
|
app2 = Fabricate(:app, handle: 'foobar', account: account)
|
43
|
-
|
46
|
+
allow(Aptible::Api::App)
|
47
|
+
.to receive(:all)
|
48
|
+
.and_return([app, app2])
|
44
49
|
|
50
|
+
subject.send('apps')
|
45
51
|
expect(captured_output_text)
|
46
52
|
.to eq("=== #{account.handle}\n#{app.handle}\n#{app2.handle}\n")
|
47
53
|
end
|
@@ -54,6 +60,9 @@ describe Aptible::CLI::Agent do
|
|
54
60
|
app21 = Fabricate(:app, account: account2, handle: 'app21')
|
55
61
|
app22 = Fabricate(:app, account: account2, handle: 'app21')
|
56
62
|
|
63
|
+
allow(Aptible::Api::App)
|
64
|
+
.to receive(:all)
|
65
|
+
.and_return([app11, app21, app22])
|
57
66
|
allow(Aptible::Api::Account).to receive(:all)
|
58
67
|
.and_return([account1, account2])
|
59
68
|
|
@@ -77,6 +86,7 @@ describe Aptible::CLI::Agent do
|
|
77
86
|
app2 = Fabricate(:app, account: account2, handle: 'app2')
|
78
87
|
allow(subject).to receive(:options)
|
79
88
|
.and_return(environment: account2.handle)
|
89
|
+
allow(Aptible::Api::App).to receive(:all).and_return([app2])
|
80
90
|
|
81
91
|
allow(Aptible::Api::Account).to receive(:all)
|
82
92
|
.and_return([account, account2])
|
@@ -90,6 +100,7 @@ describe Aptible::CLI::Agent do
|
|
90
100
|
account = Fabricate(:account, handle: 'account')
|
91
101
|
app = Fabricate(:app, account: account, handle: 'app')
|
92
102
|
allow(Aptible::Api::Account).to receive(:all).and_return([account])
|
103
|
+
allow(Aptible::Api::App).to receive(:all).and_return([app])
|
93
104
|
|
94
105
|
s1 = Fabricate(
|
95
106
|
:service,
|
@@ -148,6 +159,7 @@ describe Aptible::CLI::Agent do
|
|
148
159
|
app = Fabricate(:app, account: account, handle: 'app',
|
149
160
|
last_deploy_operation: op)
|
150
161
|
allow(Aptible::Api::Account).to receive(:all).and_return([account])
|
162
|
+
allow(Aptible::Api::App).to receive(:all).and_return([app])
|
151
163
|
|
152
164
|
expected_json = [
|
153
165
|
{
|
@@ -9,9 +9,11 @@ describe Aptible::CLI::Agent do
|
|
9
9
|
|
10
10
|
before do
|
11
11
|
allow(Aptible::Api::App).to receive(:all)
|
12
|
-
.with(token: token)
|
12
|
+
.with(token: token, href: '/apps?per_page=5000&no_embed=true')
|
13
|
+
.and_return([app])
|
13
14
|
allow(Aptible::Api::Account).to receive(:all)
|
14
|
-
.with(token: token)
|
15
|
+
.with(token: token, href: '/apps?per_page=5000&no_embed=true')
|
16
|
+
.and_return([account])
|
15
17
|
end
|
16
18
|
|
17
19
|
before { allow(subject).to receive(:options) { { app: app.handle } } }
|
@@ -269,6 +269,7 @@ describe Aptible::CLI::Agent do
|
|
269
269
|
staging = Fabricate(:account, handle: 'staging')
|
270
270
|
prod = Fabricate(:account, handle: 'production')
|
271
271
|
|
272
|
+
dbs = []
|
272
273
|
[
|
273
274
|
[staging, 'staging-redis-db'],
|
274
275
|
[staging, 'staging-postgres-db'],
|
@@ -276,12 +277,17 @@ describe Aptible::CLI::Agent do
|
|
276
277
|
[prod, 'prod-postgres-db']
|
277
278
|
].each do |a, h|
|
278
279
|
d = Fabricate(:database, account: a, handle: h)
|
280
|
+
dbs << d
|
279
281
|
Fabricate(:database_credential, database: d)
|
280
282
|
end
|
281
283
|
|
282
284
|
token = 'the-token'
|
283
285
|
allow(subject).to receive(:fetch_token) { token }
|
284
|
-
allow(Aptible::Api::
|
286
|
+
allow(Aptible::Api::Database).to receive(:all)
|
287
|
+
.with(token: token, href: '/databases?per_page=5000&no_embed=true')
|
288
|
+
.and_return(dbs)
|
289
|
+
allow(Aptible::Api::Account).to receive(:all)
|
290
|
+
.with(token: token, href: '/accounts?per_page=5000&no_embed=true')
|
285
291
|
.and_return([staging, prod])
|
286
292
|
end
|
287
293
|
|