3scale_toolbox 0.5.1 → 0.6.0
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 +143 -23
- data/exe/3scale +10 -3
- data/lib/3scale_toolbox.rb +18 -0
- data/lib/3scale_toolbox/3scale_client_factory.rb +33 -0
- data/lib/3scale_toolbox/base_command.rb +52 -14
- data/lib/3scale_toolbox/cli.rb +26 -5
- data/lib/3scale_toolbox/cli/error_handler.rb +120 -0
- data/lib/3scale_toolbox/commands.rb +3 -9
- data/lib/3scale_toolbox/commands/3scale_command.rb +8 -6
- data/lib/3scale_toolbox/commands/copy_command.rb +4 -4
- data/lib/3scale_toolbox/commands/copy_command/copy_service.rb +40 -193
- data/lib/3scale_toolbox/commands/help_command.rb +1 -1
- data/lib/3scale_toolbox/commands/import_command.rb +6 -4
- data/lib/3scale_toolbox/commands/import_command/import_csv.rb +15 -41
- data/lib/3scale_toolbox/commands/import_command/openapi.rb +70 -0
- data/lib/3scale_toolbox/commands/import_command/openapi/create_mapping_rule_step.rb +18 -0
- data/lib/3scale_toolbox/commands/import_command/openapi/create_method_step.rb +39 -0
- data/lib/3scale_toolbox/commands/import_command/openapi/create_service_step.rb +69 -0
- data/lib/3scale_toolbox/commands/import_command/openapi/mapping_rule.rb +35 -0
- data/lib/3scale_toolbox/commands/import_command/openapi/method.rb +25 -0
- data/lib/3scale_toolbox/commands/import_command/openapi/operation.rb +22 -0
- data/lib/3scale_toolbox/commands/import_command/openapi/resource_reader.rb +49 -0
- data/lib/3scale_toolbox/commands/import_command/openapi/step.rb +45 -0
- data/lib/3scale_toolbox/commands/import_command/openapi/threescale_api_spec.rb +33 -0
- data/lib/3scale_toolbox/commands/remote_command.rb +36 -0
- data/lib/3scale_toolbox/commands/remote_command/remote_add.rb +47 -0
- data/lib/3scale_toolbox/commands/remote_command/remote_list.rb +29 -0
- data/lib/3scale_toolbox/commands/remote_command/remote_remove.rb +26 -0
- data/lib/3scale_toolbox/commands/remote_command/remote_rename.rb +42 -0
- data/lib/3scale_toolbox/commands/update_command.rb +4 -4
- data/lib/3scale_toolbox/commands/update_command/update_service.rb +45 -235
- data/lib/3scale_toolbox/configuration.rb +35 -0
- data/lib/3scale_toolbox/entities.rb +1 -0
- data/lib/3scale_toolbox/entities/service.rb +113 -0
- data/lib/3scale_toolbox/error.rb +8 -0
- data/lib/3scale_toolbox/helper.rb +37 -0
- data/lib/3scale_toolbox/remotes.rb +93 -0
- data/lib/3scale_toolbox/tasks.rb +10 -0
- data/lib/3scale_toolbox/tasks/copy_app_plans_task.rb +31 -0
- data/lib/3scale_toolbox/tasks/copy_limits_task.rb +36 -0
- data/lib/3scale_toolbox/tasks/copy_mapping_rules_task.rb +29 -0
- data/lib/3scale_toolbox/tasks/copy_methods_task.rb +29 -0
- data/lib/3scale_toolbox/tasks/copy_metrics_task.rb +33 -0
- data/lib/3scale_toolbox/tasks/copy_service_proxy_task.rb +12 -0
- data/lib/3scale_toolbox/tasks/copy_task.rb +26 -0
- data/lib/3scale_toolbox/tasks/destroy_mapping_rules_task.rb +22 -0
- data/lib/3scale_toolbox/tasks/helper_task.rb +25 -0
- data/lib/3scale_toolbox/tasks/update_service_settings_task.rb +32 -0
- data/lib/3scale_toolbox/version.rb +1 -1
- metadata +87 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ae4791c3e86318f973f54abefb9df823abc7efe7ede820ca736697b23cd10653
|
4
|
+
data.tar.gz: 68cb54b32c6286593464dc1d7302343684cd4d2df043e18a5b3ff777e61f2920
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f36923df1c9961cb9a209a6228ecc50cd5e00b8b1d853384e561b3280d59550125c1793124a95cc7a9553cc42bea4453e898de2135496858d11b200333811242
|
7
|
+
data.tar.gz: 955e042f2a2b8cc62c56ce8bcedaa4de8a7800a16f39dbb83e37a6969a178b13ff4fdf94104d8240d2b402ab488ce7eb44400fceba0d58c8c7af5ef94a310ef3
|
data/README.md
CHANGED
@@ -8,13 +8,17 @@
|
|
8
8
|
* [Copy a service](#copy-a-service)
|
9
9
|
* [Update a service](#update-a-service)
|
10
10
|
* [Import from CSV](#import-from-csv)
|
11
|
+
* [Import from OpenAPI definition](#import-openapi)
|
12
|
+
* [Remotes](#remotes)
|
11
13
|
* [Development](#development)
|
14
|
+
* [Testing](#testing)
|
15
|
+
* [Develop your own core command](#develop-core-command)
|
12
16
|
* [Plugins](#plugins)
|
13
17
|
* [Troubleshooting](#troubleshooting)
|
14
18
|
* [Contributing](#contributing)
|
15
19
|
|
16
20
|
## Installation
|
17
|
-
Install the
|
21
|
+
Install the toolbox:
|
18
22
|
|
19
23
|
$ gem install 3scale_toolbox
|
20
24
|
|
@@ -23,28 +27,34 @@ Install the CLI:
|
|
23
27
|
```shell
|
24
28
|
$ 3scale help
|
25
29
|
NAME
|
26
|
-
3scale - 3scale
|
30
|
+
3scale - 3scale toolbox
|
27
31
|
|
28
32
|
USAGE
|
29
|
-
3scale <command> [options]
|
33
|
+
3scale <sub-command> [options]
|
30
34
|
|
31
35
|
DESCRIPTION
|
32
|
-
3scale
|
36
|
+
3scale toolbox to manage your API from the terminal.
|
33
37
|
|
34
38
|
COMMANDS
|
35
|
-
copy
|
39
|
+
copy copy super command
|
36
40
|
help show help
|
37
|
-
import
|
38
|
-
|
41
|
+
import import super command
|
42
|
+
remote remotes super command
|
43
|
+
update update super command
|
39
44
|
|
40
45
|
OPTIONS
|
41
|
-
-
|
42
|
-
|
43
|
-
-
|
46
|
+
-c --config-file=<value> 3scale toolbox configuration file (default:
|
47
|
+
/home/eguzki/.3scalerc.yaml)
|
48
|
+
-h --help show help for this command
|
49
|
+
-k --insecure Proceed and operate even for server
|
50
|
+
connections otherwise considered insecure
|
51
|
+
-v --version Prints the version of this command
|
44
52
|
```
|
45
53
|
|
46
54
|
### Copy a service
|
47
|
-
Will create a new
|
55
|
+
Will create a new service, copy existing proxy settings, metrics, methods, application plans and mapping rules.
|
56
|
+
|
57
|
+
3scale instances can be either a [URL](docs/remotes.md#remote-urls) or the name of a [remote](docs/remotes.md).
|
48
58
|
|
49
59
|
Help message:
|
50
60
|
|
@@ -62,10 +72,10 @@ DESCRIPTION
|
|
62
72
|
methods, application plans and mapping rules.
|
63
73
|
|
64
74
|
OPTIONS
|
65
|
-
-d --destination=<value> 3scale target instance.
|
66
|
-
|
67
|
-
-s --source=<value> 3scale source instance.
|
68
|
-
|
75
|
+
-d --destination=<value> 3scale target instance. Url or
|
76
|
+
remote name
|
77
|
+
-s --source=<value> 3scale source instance. Url or
|
78
|
+
remote name
|
69
79
|
-t --target_system_name=<value> Target system name
|
70
80
|
|
71
81
|
OPTIONS FOR COPY
|
@@ -77,13 +87,15 @@ OPTIONS FOR COPY
|
|
77
87
|
```
|
78
88
|
|
79
89
|
```shell
|
80
|
-
3scale copy service NUMBER --source=
|
90
|
+
3scale copy service NUMBER --source=foo --destination=https://access_token@foo2-admin.3scale.net
|
81
91
|
```
|
82
92
|
|
83
93
|
### Update a service
|
84
94
|
|
85
95
|
Will update existing service, update proxy settings, metrics, methods, application plans and mapping rules.
|
86
96
|
|
97
|
+
3scale instances can be either a [URL](docs/remotes.md#remote-urls) or the name of a [remote](docs/remotes.md).
|
98
|
+
|
87
99
|
Help message:
|
88
100
|
|
89
101
|
```shell
|
@@ -99,13 +111,13 @@ DESCRIPTION
|
|
99
111
|
application plans and mapping rules.
|
100
112
|
|
101
113
|
OPTIONS
|
102
|
-
-d --destination=<value> 3scale target instance.
|
103
|
-
|
114
|
+
-d --destination=<value> 3scale target instance. Url or
|
115
|
+
remote name
|
104
116
|
-f --force Overwrites the mapping rules by deleting
|
105
117
|
all rules from target service first
|
106
118
|
-r --rules-only Updates only the mapping rules
|
107
|
-
-s --source=<value> 3scale source instance.
|
108
|
-
|
119
|
+
-s --source=<value> 3scale source instance. Url or
|
120
|
+
remote name
|
109
121
|
|
110
122
|
OPTIONS FOR UPDATE
|
111
123
|
-h --help show help for this command
|
@@ -117,13 +129,15 @@ OPTIONS FOR UPDATE
|
|
117
129
|
Example:
|
118
130
|
|
119
131
|
```shell
|
120
|
-
$ 3scale update service -s https://9874598743@source.example.com -d
|
132
|
+
$ 3scale update service -s https://9874598743@source.example.com -d foo 3 2
|
121
133
|
```
|
122
134
|
|
123
135
|
### Import from CSV
|
124
136
|
|
125
137
|
Will create new services, metrics, methods, and mapping rules having as source comma separated values (CSV) formatted file.
|
126
138
|
|
139
|
+
3scale instances can be either a [URL](docs/remotes.md#remote-urls) or the name of a [remote](docs/remotes.md).
|
140
|
+
|
127
141
|
CSV header
|
128
142
|
|
129
143
|
```csv
|
@@ -153,8 +167,7 @@ DESCRIPTION
|
|
153
167
|
formatted file
|
154
168
|
|
155
169
|
OPTIONS
|
156
|
-
-d --destination=<value> 3scale target instance.
|
157
|
-
"http[s]://<provider_key>@3scale_url"
|
170
|
+
-d --destination=<value> 3scale target instance. Url or remote name
|
158
171
|
-f --file=<value> CSV formatted file
|
159
172
|
|
160
173
|
OPTIONS FOR IMPORT
|
@@ -170,12 +183,119 @@ Example:
|
|
170
183
|
3scale import csv --destination=https://provider_key@user-admin.3scale.net --file=examples/import_example.csv
|
171
184
|
```
|
172
185
|
|
186
|
+
### Import OpenAPI
|
187
|
+
|
188
|
+
Using an API definition format like OpenAPI, import to your 3scale API
|
189
|
+
|
190
|
+
Currently, only OpenAPI __2.0__ specification (f.k.a. __swagger__) is supported.
|
191
|
+
|
192
|
+
[Import from OpenAPI](docs/openapi.md)
|
193
|
+
|
194
|
+
### Remotes
|
195
|
+
|
196
|
+
Manage set of 3scale instances.
|
197
|
+
|
198
|
+
[Howto](docs/remotes.md)
|
199
|
+
|
173
200
|
## Development
|
174
201
|
|
175
202
|
After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment. Run `bundle exec 3scale` to use the gem in this directory, ignoring other installed copies of this gem.
|
176
203
|
|
177
204
|
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
178
205
|
|
206
|
+
### Testing
|
207
|
+
|
208
|
+
To run all tests run `rake`.
|
209
|
+
|
210
|
+
There are two kinds of tests:
|
211
|
+
* unit (see [spec/unit](spec/unit))
|
212
|
+
```bash
|
213
|
+
rake spec:unit
|
214
|
+
```
|
215
|
+
|
216
|
+
* integration (see [spec/integration](spec/integration)).
|
217
|
+
```bash
|
218
|
+
rake spec:integration
|
219
|
+
```
|
220
|
+
|
221
|
+
Integration tests can be run locally or against a real 3scale account.
|
222
|
+
When details of the account are set via environment variables,
|
223
|
+
integration tests are run agains given account.
|
224
|
+
Otherwise, tests are run locally with mocked 3scale clients.
|
225
|
+
|
226
|
+
The easiest way to set everything up is it to have a `.env` file in the root of the project with the following environment variables (set your own values):
|
227
|
+
|
228
|
+
```
|
229
|
+
ENDPOINT=https://your-domain-admin.3scaledomain
|
230
|
+
PROVIDER_KEY=abc123
|
231
|
+
VERIFY_SSL=true (by default true)
|
232
|
+
```
|
233
|
+
### Develop Core Command
|
234
|
+
|
235
|
+
Very simple core command to list existing services.
|
236
|
+
Helps to illustrate basic command code structure and helper methods to deal with remotes.
|
237
|
+
|
238
|
+
```
|
239
|
+
$ cat lib/3scale_toolbox/commands/service_list_command.rb
|
240
|
+
module ThreeScaleToolbox
|
241
|
+
module Commands
|
242
|
+
class ServiceListCommand < Cri::CommandRunner
|
243
|
+
include ThreeScaleToolbox::Command
|
244
|
+
|
245
|
+
def self.command
|
246
|
+
Cri::Command.define do
|
247
|
+
name 'service_list'
|
248
|
+
usage 'service_list <3scale_remote>'
|
249
|
+
summary 'service list'
|
250
|
+
description 'list available services'
|
251
|
+
param :remote
|
252
|
+
runner ServiceListCommand
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
def run
|
257
|
+
puts threescale_client(arguments[:remote]).list_services
|
258
|
+
end
|
259
|
+
end
|
260
|
+
end
|
261
|
+
end
|
262
|
+
```
|
263
|
+
A few things worth highlighting:
|
264
|
+
- Your module must include the *ThreeScaleToolbox::Command* module. It allows your command to be added to the toobox command tree.
|
265
|
+
- You must implement the `command` module function and return an instance of `Cri::Command` from [cri](https://github.com/ddfreyne/cri)
|
266
|
+
- `threescale_client` helper method returns *3scale API* client instance. All the process remote parsing, fetching from remote list and client instantiation is done out of the box.
|
267
|
+
|
268
|
+
Then register the core command in `lib/3scale_toolbox/commands.rb`
|
269
|
+
```
|
270
|
+
--- a/lib/3scale_toolbox/commands.rb
|
271
|
+
+++ b/lib/3scale_toolbox/commands.rb
|
272
|
+
@@ -4,6 +4,7 @@ require '3scale_toolbox/commands/copy_command'
|
273
|
+
require '3scale_toolbox/commands/import_command'
|
274
|
+
require '3scale_toolbox/commands/update_command'
|
275
|
+
require '3scale_toolbox/commands/remote_command'
|
276
|
+
+require '3scale_toolbox/commands/service_list_command'
|
277
|
+
|
278
|
+
module ThreeScaleToolbox
|
279
|
+
module Commands
|
280
|
+
@@ -12,7 +13,8 @@ module ThreeScaleToolbox
|
281
|
+
ThreeScaleToolbox::Commands::CopyCommand,
|
282
|
+
ThreeScaleToolbox::Commands::ImportCommand,
|
283
|
+
ThreeScaleToolbox::Commands::UpdateCommand,
|
284
|
+
- ThreeScaleToolbox::Commands::RemoteCommand::RemoteCommand
|
285
|
+
+ ThreeScaleToolbox::Commands::RemoteCommand::RemoteCommand,
|
286
|
+
+ ThreeScaleToolbox::Commands::ServiceListCommand
|
287
|
+
].freeze
|
288
|
+
end
|
289
|
+
end
|
290
|
+
```
|
291
|
+
|
292
|
+
Running the new core command:
|
293
|
+
|
294
|
+
```shell
|
295
|
+
$ 3scale service_list my-3scale-instance
|
296
|
+
{ ... }
|
297
|
+
```
|
298
|
+
|
179
299
|
## Plugins
|
180
300
|
|
181
301
|
As of 3scale Toolbox 0.5.0, 3scale Toolbox will load plugins installed in gems or $LOAD_PATH. Plugins are discovered via Gem::find_files then loaded.
|
data/exe/3scale
CHANGED
@@ -1,8 +1,15 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
def suppress_warnings
|
4
|
+
original_verbosity = $VERBOSE
|
5
|
+
$VERBOSE = nil
|
6
|
+
yield
|
7
|
+
ensure
|
8
|
+
$VERBOSE = original_verbosity
|
9
|
+
end
|
10
|
+
|
11
|
+
suppress_warnings { require '3scale_toolbox' }
|
5
12
|
|
6
13
|
args = ARGV.clone
|
7
14
|
|
8
|
-
ThreeScaleToolbox::CLI.run
|
15
|
+
exit(ThreeScaleToolbox::CLI.run(args))
|
data/lib/3scale_toolbox.rb
CHANGED
@@ -1,4 +1,17 @@
|
|
1
|
+
require '3scale_toolbox/version'
|
2
|
+
require '3scale_toolbox/helper'
|
3
|
+
require '3scale_toolbox/error'
|
4
|
+
require '3scale_toolbox/configuration'
|
5
|
+
require '3scale_toolbox/remotes'
|
6
|
+
require '3scale_toolbox/3scale_client_factory'
|
7
|
+
require '3scale_toolbox/entities'
|
8
|
+
require '3scale_toolbox/tasks'
|
9
|
+
require '3scale_toolbox/base_command'
|
10
|
+
require '3scale_toolbox/commands'
|
11
|
+
require '3scale_toolbox/cli'
|
12
|
+
|
1
13
|
module ThreeScaleToolbox
|
14
|
+
|
2
15
|
def self.load_plugins
|
3
16
|
plugin_paths.each { |plugin_path| require plugin_path }
|
4
17
|
end
|
@@ -6,4 +19,9 @@ module ThreeScaleToolbox
|
|
6
19
|
def self.plugin_paths
|
7
20
|
Gem.find_files('3scale_toolbox_plugin')
|
8
21
|
end
|
22
|
+
|
23
|
+
def self.default_config_file
|
24
|
+
# THREESCALE_CLI_CONFIG env var has priority over $HOME/.3scalerc.yaml file
|
25
|
+
ENV['THREESCALE_CLI_CONFIG'] || File.join(Gem.user_home, '.3scalerc.yaml')
|
26
|
+
end
|
9
27
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module ThreeScaleToolbox
|
2
|
+
class ThreeScaleClientFactory
|
3
|
+
class << self
|
4
|
+
def get(remotes, remote_str, verify_ssl)
|
5
|
+
new(remotes, remote_str, verify_ssl).call
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
attr_reader :remotes, :remote_str, :verify_ssl
|
10
|
+
|
11
|
+
def initialize(remotes, remote_str, verify_ssl)
|
12
|
+
@remotes = remotes
|
13
|
+
@remote_str = remote_str
|
14
|
+
@verify_ssl = verify_ssl
|
15
|
+
end
|
16
|
+
|
17
|
+
def call
|
18
|
+
begin
|
19
|
+
remote = Remotes.from_uri(remote_str)
|
20
|
+
rescue InvalidUrlError
|
21
|
+
remote = remotes.fetch(remote_str)
|
22
|
+
end
|
23
|
+
|
24
|
+
remote_client(remote.merge(verify_ssl: verify_ssl))
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def remote_client(endpoint:, authentication:, verify_ssl:)
|
30
|
+
ThreeScale::API.new(endpoint: endpoint, provider_key: authentication, verify_ssl: verify_ssl)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -1,28 +1,66 @@
|
|
1
1
|
|
2
2
|
module ThreeScaleToolbox
|
3
3
|
module Command
|
4
|
-
def
|
5
|
-
|
4
|
+
def self.included(base)
|
5
|
+
base.extend(ClassMethods)
|
6
6
|
end
|
7
7
|
|
8
|
-
|
9
|
-
subcommands
|
8
|
+
module ClassMethods
|
9
|
+
def subcommands
|
10
|
+
@subcommands ||= []
|
11
|
+
end
|
12
|
+
|
13
|
+
def add_subcommand(command)
|
14
|
+
subcommands << command
|
15
|
+
end
|
16
|
+
|
17
|
+
##
|
18
|
+
# Override to command
|
19
|
+
#
|
20
|
+
def command
|
21
|
+
raise Exception, 'base command has no command definition'
|
22
|
+
end
|
23
|
+
|
24
|
+
##
|
25
|
+
# Iterate recursively over command tree
|
26
|
+
#
|
27
|
+
def build_command
|
28
|
+
subcommands.each_with_object(command) do |subcommand, root_command|
|
29
|
+
root_command.add_command(subcommand.build_command)
|
30
|
+
end
|
31
|
+
end
|
10
32
|
end
|
11
33
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
34
|
+
def config
|
35
|
+
@config ||= ThreeScaleToolbox::Configuration.new(config_file)
|
36
|
+
end
|
37
|
+
|
38
|
+
def config_file
|
39
|
+
options[:'config-file']
|
40
|
+
end
|
41
|
+
|
42
|
+
def remotes
|
43
|
+
@remotes ||= Remotes.new(config)
|
17
44
|
end
|
18
45
|
|
19
46
|
##
|
20
|
-
#
|
47
|
+
# Input param can be endpoint url or remote name
|
21
48
|
#
|
22
|
-
def
|
23
|
-
|
24
|
-
|
25
|
-
|
49
|
+
def threescale_client(str)
|
50
|
+
ThreeScaleClientFactory.get(remotes, str, verify_ssl)
|
51
|
+
end
|
52
|
+
|
53
|
+
def verify_ssl
|
54
|
+
# this is flag. It is either true or false. Cannot be nil
|
55
|
+
!options[:insecure]
|
56
|
+
end
|
57
|
+
|
58
|
+
def exit_with_message(message)
|
59
|
+
raise ThreeScaleToolbox::Error, message
|
60
|
+
end
|
61
|
+
|
62
|
+
def fetch_required_option(key)
|
63
|
+
options.fetch(key) { exit_with_message "error: Missing argument #{key}" }
|
26
64
|
end
|
27
65
|
end
|
28
66
|
end
|
data/lib/3scale_toolbox/cli.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
require '3scale_toolbox'
|
2
|
-
require '3scale_toolbox/commands'
|
1
|
+
require '3scale_toolbox/cli/error_handler'
|
3
2
|
|
4
3
|
module ThreeScaleToolbox::CLI
|
5
4
|
def self.root_command
|
@@ -14,9 +13,31 @@ module ThreeScaleToolbox::CLI
|
|
14
13
|
ThreeScaleToolbox::Commands::BUILTIN_COMMANDS.each(&method(:add_command))
|
15
14
|
end
|
16
15
|
|
16
|
+
def self.install_signal_handlers
|
17
|
+
# Set exit handler
|
18
|
+
%w[INT TERM].each do |signal|
|
19
|
+
Signal.trap(signal) do
|
20
|
+
puts
|
21
|
+
exit!(0)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Set stack trace dump handler
|
26
|
+
if !defined?(RUBY_ENGINE) || RUBY_ENGINE != 'jruby'
|
27
|
+
Signal.trap('USR1') do
|
28
|
+
puts 'Caught USR1; dumping a stack trace'
|
29
|
+
puts caller.map { |i| " #{i}" }.join("\n")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
17
34
|
def self.run(args)
|
18
|
-
|
19
|
-
|
20
|
-
|
35
|
+
install_signal_handlers
|
36
|
+
err = ErrorHandler.error_watchdog do
|
37
|
+
load_builtin_commands
|
38
|
+
ThreeScaleToolbox.load_plugins
|
39
|
+
root_command.build_command.run args
|
40
|
+
end
|
41
|
+
err.nil? ? 0 : 1
|
21
42
|
end
|
22
43
|
end
|