3scale_toolbox 0.9.0 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +5 -23
- data/lib/3scale_toolbox/base_command.rb +0 -1
- data/lib/3scale_toolbox/commands.rb +4 -0
- data/lib/3scale_toolbox/commands/copy_command/copy_service.rb +1 -1
- data/lib/3scale_toolbox/commands/import_command/openapi/create_activedocs_step.rb +2 -2
- data/lib/3scale_toolbox/commands/import_command/openapi/create_method_step.rb +21 -15
- data/lib/3scale_toolbox/commands/import_command/openapi/create_service_step.rb +10 -13
- data/lib/3scale_toolbox/commands/methods_command.rb +28 -0
- data/lib/3scale_toolbox/commands/methods_command/apply_command.rb +101 -0
- data/lib/3scale_toolbox/commands/methods_command/create_command.rb +73 -0
- data/lib/3scale_toolbox/commands/methods_command/delete_command.rb +67 -0
- data/lib/3scale_toolbox/commands/methods_command/list_command.rb +64 -0
- data/lib/3scale_toolbox/commands/metrics_command.rb +28 -0
- data/lib/3scale_toolbox/commands/metrics_command/apply_command.rb +102 -0
- data/lib/3scale_toolbox/commands/metrics_command/create_command.rb +77 -0
- data/lib/3scale_toolbox/commands/metrics_command/delete_command.rb +66 -0
- data/lib/3scale_toolbox/commands/metrics_command/list_command.rb +70 -0
- data/lib/3scale_toolbox/commands/plans_command/create_command.rb +1 -1
- data/lib/3scale_toolbox/commands/plans_command/export/read_app_plan_step.rb +1 -1
- data/lib/3scale_toolbox/commands/plans_command/export/step.rb +5 -1
- data/lib/3scale_toolbox/commands/plans_command/import/import_plan_metrics_step.rb +7 -13
- data/lib/3scale_toolbox/commands/plans_command/import/step.rb +2 -8
- data/lib/3scale_toolbox/commands/plans_command/show_command.rb +1 -1
- data/lib/3scale_toolbox/commands/remote_command/remote_add.rb +1 -1
- data/lib/3scale_toolbox/entities.rb +2 -0
- data/lib/3scale_toolbox/entities/application_plan.rb +47 -14
- data/lib/3scale_toolbox/entities/method.rb +80 -0
- data/lib/3scale_toolbox/entities/metric.rb +113 -0
- data/lib/3scale_toolbox/entities/service.rb +112 -38
- data/lib/3scale_toolbox/error.rb +13 -0
- data/lib/3scale_toolbox/tasks/copy_activedocs_task.rb +1 -1
- data/lib/3scale_toolbox/tasks/copy_methods_task.rb +11 -8
- data/lib/3scale_toolbox/tasks/copy_metrics_task.rb +1 -1
- data/lib/3scale_toolbox/tasks/copy_service_proxy_task.rb +1 -1
- data/lib/3scale_toolbox/tasks/delete_activedocs_task.rb +1 -1
- data/lib/3scale_toolbox/tasks/update_service_settings_task.rb +3 -3
- data/lib/3scale_toolbox/version.rb +1 -1
- metadata +16 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a7b198d2a14662823d04de18bf2cc15b4e08b8b18e9900c888e54d2f7a72a3bb
|
4
|
+
data.tar.gz: fcda8a6926e72cd0a44485f912fc89debd59369e3296420c172f1a899546688b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 95cbd6fb8d874ea31120d282d67ba5c61d3c5ef0a1d5df844844b7b0dfb8fd266dc0b62d486c2152896a692ff2243ee132a1617fc0ec07a94b21a13fab4251f9
|
7
|
+
data.tar.gz: 93a97483feb149fd5fc27049d75a883f8cae1bf95787e0b80cae14585db37396f46d55b7ef8614a016fd73c25e552a2bc82ea625c48ec6c502e07709fd12458c
|
data/README.md
CHANGED
@@ -14,10 +14,12 @@ See the LICENSE and NOTICE files that should have been provided along with this
|
|
14
14
|
* [Copy a service](#copy-a-service)
|
15
15
|
* [Update a service](#update-a-service)
|
16
16
|
* [Import from CSV](#import-from-csv)
|
17
|
-
* [Import from OpenAPI definition](
|
18
|
-
* [Export/Import Application Plan](
|
17
|
+
* [Import from OpenAPI definition](docs/openapi.md)
|
18
|
+
* [Export/Import Application Plan](docs/export-import-app-plan.md)
|
19
19
|
* Create, Apply, List, Show, Delete [Application plan](docs/app-plan.md)
|
20
|
-
* [
|
20
|
+
* Create, Apply, List, Delete [Metric](docs/metric.md)
|
21
|
+
* Create, Apply, List, Delete [Method](docs/method.md)
|
22
|
+
* [Remotes](docs/remotes.md)
|
21
23
|
* [Development](#development)
|
22
24
|
* [Testing](#testing)
|
23
25
|
* [Develop your own core command](#develop-core-command)
|
@@ -196,26 +198,6 @@ Example:
|
|
196
198
|
3scale import csv --destination=https://provider_key@user-admin.3scale.net --file=examples/import_example.csv
|
197
199
|
```
|
198
200
|
|
199
|
-
### Import OpenAPI
|
200
|
-
|
201
|
-
Using an API definition format like OpenAPI, import to your 3scale API
|
202
|
-
|
203
|
-
Currently, only OpenAPI __2.0__ specification (f.k.a. __swagger__) is supported.
|
204
|
-
|
205
|
-
[Import from OpenAPI](docs/openapi.md)
|
206
|
-
|
207
|
-
### Export Import Application Plan
|
208
|
-
|
209
|
-
A single application plan can be exported/imported as `yaml` format.
|
210
|
-
|
211
|
-
[Export/Import Application Plan](docs/export-import-app-plan.md)
|
212
|
-
|
213
|
-
### Remotes
|
214
|
-
|
215
|
-
Manage set of 3scale instances.
|
216
|
-
|
217
|
-
[Howto](docs/remotes.md)
|
218
|
-
|
219
201
|
## Development
|
220
202
|
|
221
203
|
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.
|
@@ -5,6 +5,8 @@ require '3scale_toolbox/commands/import_command'
|
|
5
5
|
require '3scale_toolbox/commands/update_command'
|
6
6
|
require '3scale_toolbox/commands/remote_command'
|
7
7
|
require '3scale_toolbox/commands/plans_command'
|
8
|
+
require '3scale_toolbox/commands/metrics_command'
|
9
|
+
require '3scale_toolbox/commands/methods_command'
|
8
10
|
|
9
11
|
module ThreeScaleToolbox
|
10
12
|
module Commands
|
@@ -15,6 +17,8 @@ module ThreeScaleToolbox
|
|
15
17
|
ThreeScaleToolbox::Commands::UpdateCommand,
|
16
18
|
ThreeScaleToolbox::Commands::RemoteCommand::RemoteCommand,
|
17
19
|
ThreeScaleToolbox::Commands::PlansCommand,
|
20
|
+
ThreeScaleToolbox::Commands::MetricsCommand,
|
21
|
+
ThreeScaleToolbox::Commands::MethodsCommand,
|
18
22
|
].freeze
|
19
23
|
end
|
20
24
|
end
|
@@ -26,7 +26,7 @@ module ThreeScaleToolbox
|
|
26
26
|
|
27
27
|
source_service = Entities::Service.new(id: arguments[:service_id],
|
28
28
|
remote: threescale_client(source))
|
29
|
-
target_service = create_new_service(source_service.
|
29
|
+
target_service = create_new_service(source_service.attrs, destination)
|
30
30
|
puts "new service id #{target_service.id}"
|
31
31
|
context = create_context(source_service, target_service)
|
32
32
|
tasks = [
|
@@ -32,7 +32,7 @@ module ThreeScaleToolbox
|
|
32
32
|
private
|
33
33
|
|
34
34
|
def activedocs_system_name
|
35
|
-
@activedocs_system_name ||= service.
|
35
|
+
@activedocs_system_name ||= service.attrs['system_name']
|
36
36
|
end
|
37
37
|
|
38
38
|
def find_activedocs_id
|
@@ -53,7 +53,7 @@ module ThreeScaleToolbox
|
|
53
53
|
# Other processing steps can work with original openapi spec
|
54
54
|
Helper.hash_deep_dup(resource).tap do |activedocs|
|
55
55
|
# public production base URL
|
56
|
-
URI(service.
|
56
|
+
URI(service.proxy.fetch('endpoint')).tap do |uri|
|
57
57
|
activedocs['host'] = "#{uri.host}:#{uri.port}"
|
58
58
|
activedocs['schemes'] = [uri.scheme]
|
59
59
|
end
|
@@ -6,30 +6,36 @@ module ThreeScaleToolbox
|
|
6
6
|
include Step
|
7
7
|
|
8
8
|
def call
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
metric_id
|
13
|
-
|
14
|
-
# Make operation indempotent
|
15
|
-
if (errors = res['errors'])
|
16
|
-
raise ThreeScaleToolbox::Error, "Metohd has not been saved. #{errors}" \
|
17
|
-
unless ThreeScaleToolbox::Helper.system_name_already_taken_error? errors
|
18
|
-
|
19
|
-
metric_id = method_id_by_system_name[op.method['system_name']]
|
20
|
-
end
|
9
|
+
missing_operations.each do |op|
|
10
|
+
method = Entities::Method.create(service: service, parent_id: hits_metric_id,
|
11
|
+
attrs: op.method)
|
12
|
+
op.set(:metric_id, method.id)
|
13
|
+
end
|
21
14
|
|
22
|
-
|
15
|
+
existing_operations.each do |op|
|
16
|
+
op.set(:metric_id, service_methods_index.fetch(op.method['system_name']))
|
23
17
|
end
|
24
18
|
end
|
25
19
|
|
26
20
|
private
|
27
21
|
|
28
|
-
def
|
29
|
-
@
|
22
|
+
def hits_metric_id
|
23
|
+
@hits_metric_id ||= service.hits['id']
|
24
|
+
end
|
25
|
+
|
26
|
+
def service_methods_index
|
27
|
+
@service_methods_index ||= service.methods(hits_metric_id).each_with_object({}) do |method, acc|
|
30
28
|
acc[method['system_name']] = method['id']
|
31
29
|
end
|
32
30
|
end
|
31
|
+
|
32
|
+
def missing_operations
|
33
|
+
operations.reject { |op| service_methods_index.key? op.method['system_name'] }
|
34
|
+
end
|
35
|
+
|
36
|
+
def existing_operations
|
37
|
+
operations.select { |op| service_methods_index.key? op.method['system_name'] }
|
38
|
+
end
|
33
39
|
end
|
34
40
|
end
|
35
41
|
end
|
@@ -9,22 +9,19 @@ module ThreeScaleToolbox
|
|
9
9
|
# Creates service with a given system_name
|
10
10
|
# If service already exists, update basic settings like name and description
|
11
11
|
def call
|
12
|
-
# Create service and update context
|
13
|
-
self.service = Entities::Service.create(remote: threescale_client,
|
14
|
-
service: service_settings,
|
15
|
-
system_name: service_system_name)
|
16
|
-
puts "Created service id: #{service.id}, name: #{service_name}"
|
17
|
-
rescue ThreeScaleToolbox::Error => e
|
18
|
-
raise unless e.message =~ /"system_name"=>\["has already been taken"\]/
|
19
|
-
|
20
12
|
# Update service and update context
|
21
13
|
self.service = Entities::Service.find_by_system_name(remote: threescale_client,
|
22
14
|
system_name: service_system_name)
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
15
|
+
if service.nil?
|
16
|
+
# Create service and update context
|
17
|
+
self.service = Entities::Service.create(remote: threescale_client,
|
18
|
+
service: service_settings,
|
19
|
+
system_name: service_system_name)
|
20
|
+
puts "Created service id: #{service.id}, name: #{service_name}"
|
21
|
+
else
|
22
|
+
service.update(service_settings)
|
23
|
+
puts "Updated service id: #{service.id}, name: #{service_name}"
|
24
|
+
end
|
28
25
|
end
|
29
26
|
|
30
27
|
private
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require '3scale_toolbox/commands/methods_command/create_command'
|
2
|
+
require '3scale_toolbox/commands/methods_command/list_command'
|
3
|
+
require '3scale_toolbox/commands/methods_command/apply_command'
|
4
|
+
require '3scale_toolbox/commands/methods_command/delete_command'
|
5
|
+
|
6
|
+
module ThreeScaleToolbox
|
7
|
+
module Commands
|
8
|
+
module MethodsCommand
|
9
|
+
include ThreeScaleToolbox::Command
|
10
|
+
def self.command
|
11
|
+
Cri::Command.define do
|
12
|
+
name 'methods'
|
13
|
+
usage 'methods <sub-command> [options]'
|
14
|
+
summary 'methods super command'
|
15
|
+
description 'Methods commands'
|
16
|
+
|
17
|
+
run do |_opts, _args, cmd|
|
18
|
+
puts cmd.help
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
add_subcommand(Create::CreateSubcommand)
|
23
|
+
add_subcommand(List::ListSubcommand)
|
24
|
+
add_subcommand(Apply::ApplySubcommand)
|
25
|
+
add_subcommand(Delete::DeleteSubcommand)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
module ThreeScaleToolbox
|
2
|
+
module Commands
|
3
|
+
module MethodsCommand
|
4
|
+
module Apply
|
5
|
+
class ApplySubcommand < Cri::CommandRunner
|
6
|
+
include ThreeScaleToolbox::Command
|
7
|
+
|
8
|
+
def self.command
|
9
|
+
Cri::Command.define do
|
10
|
+
name 'apply'
|
11
|
+
usage 'apply [opts] <remote> <service> <method>'
|
12
|
+
summary 'Update method'
|
13
|
+
description 'Update (create if it does not exist) method'
|
14
|
+
|
15
|
+
option :n, :name, 'Method name', argument: :required
|
16
|
+
flag nil, :disabled, 'Disables this method in all application plans'
|
17
|
+
flag nil, :enabled, 'Enables this method in all application plans'
|
18
|
+
option nil, :description, 'Method description', argument: :required
|
19
|
+
param :remote
|
20
|
+
param :service_ref
|
21
|
+
param :method_ref
|
22
|
+
|
23
|
+
runner ApplySubcommand
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def run
|
28
|
+
validate_option_params
|
29
|
+
hits = service.hits
|
30
|
+
method = Entities::Method.find(service: service, parent_id: hits.fetch('id'),
|
31
|
+
ref: method_ref)
|
32
|
+
if method.nil?
|
33
|
+
method = Entities::Method.create(service: service, parent_id: hits.fetch('id'),
|
34
|
+
attrs: create_method_attrs)
|
35
|
+
else
|
36
|
+
method.update(method_attrs) unless method_attrs.empty?
|
37
|
+
end
|
38
|
+
|
39
|
+
method.disable if option_disabled
|
40
|
+
method.enable if option_enabled
|
41
|
+
|
42
|
+
output_msg_array = ["Applied method id: #{method.id}"]
|
43
|
+
output_msg_array << 'Disabled' if option_disabled
|
44
|
+
output_msg_array << 'Enabled' if option_enabled
|
45
|
+
puts output_msg_array.join('; ')
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def validate_option_params
|
51
|
+
raise ThreeScaleToolbox::Error, '--disabled and --enabled are mutually exclusive' \
|
52
|
+
if option_enabled && option_disabled
|
53
|
+
end
|
54
|
+
|
55
|
+
def create_method_attrs
|
56
|
+
method_attrs.merge('system_name' => method_ref,
|
57
|
+
'friendly_name' => method_ref) { |_key, oldval, _newval| oldval }
|
58
|
+
end
|
59
|
+
|
60
|
+
def method_attrs
|
61
|
+
{
|
62
|
+
'friendly_name' => options[:name],
|
63
|
+
'description' => options[:description]
|
64
|
+
}.compact
|
65
|
+
end
|
66
|
+
|
67
|
+
def option_enabled
|
68
|
+
!options[:enabled].nil?
|
69
|
+
end
|
70
|
+
|
71
|
+
def option_disabled
|
72
|
+
!options[:disabled].nil?
|
73
|
+
end
|
74
|
+
|
75
|
+
def service
|
76
|
+
@service ||= find_service
|
77
|
+
end
|
78
|
+
|
79
|
+
def find_service
|
80
|
+
Entities::Service.find(remote: remote,
|
81
|
+
ref: service_ref).tap do |svc|
|
82
|
+
raise ThreeScaleToolbox::Error, "Service #{service_ref} does not exist" if svc.nil?
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def remote
|
87
|
+
@remote ||= threescale_client(arguments[:remote])
|
88
|
+
end
|
89
|
+
|
90
|
+
def service_ref
|
91
|
+
arguments[:service_ref]
|
92
|
+
end
|
93
|
+
|
94
|
+
def method_ref
|
95
|
+
arguments[:method_ref]
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
module ThreeScaleToolbox
|
2
|
+
module Commands
|
3
|
+
module MethodsCommand
|
4
|
+
module Create
|
5
|
+
class CreateSubcommand < Cri::CommandRunner
|
6
|
+
include ThreeScaleToolbox::Command
|
7
|
+
|
8
|
+
def self.command
|
9
|
+
Cri::Command.define do
|
10
|
+
name 'create'
|
11
|
+
usage 'create [opts] <remote> <service> <method-name>'
|
12
|
+
summary 'create method'
|
13
|
+
description 'Create method'
|
14
|
+
|
15
|
+
option :t, 'system-name', 'Method system name', argument: :required
|
16
|
+
flag nil, :disabled, 'Disables this method in all application plans'
|
17
|
+
option nil, :description, 'Method description', argument: :required
|
18
|
+
param :remote
|
19
|
+
param :service_ref
|
20
|
+
param :method_name
|
21
|
+
|
22
|
+
runner CreateSubcommand
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def run
|
27
|
+
hits = service.hits
|
28
|
+
method = ThreeScaleToolbox::Entities::Method.create(
|
29
|
+
service: service,
|
30
|
+
parent_id: hits.fetch('id'),
|
31
|
+
attrs: method_attrs
|
32
|
+
)
|
33
|
+
method.disable if option_disabled
|
34
|
+
puts "Created method id: #{method.id}. Disabled: #{option_disabled}"
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def method_attrs
|
40
|
+
{
|
41
|
+
'system_name' => options[:'system-name'],
|
42
|
+
'friendly_name' => arguments[:method_name],
|
43
|
+
'description' => options[:description]
|
44
|
+
}.compact
|
45
|
+
end
|
46
|
+
|
47
|
+
def option_disabled
|
48
|
+
!options[:disabled].nil?
|
49
|
+
end
|
50
|
+
|
51
|
+
def service
|
52
|
+
@service ||= find_service
|
53
|
+
end
|
54
|
+
|
55
|
+
def find_service
|
56
|
+
Entities::Service.find(remote: remote,
|
57
|
+
ref: service_ref).tap do |svc|
|
58
|
+
raise ThreeScaleToolbox::Error, "Service #{service_ref} does not exist" if svc.nil?
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def remote
|
63
|
+
@remote ||= threescale_client(arguments[:remote])
|
64
|
+
end
|
65
|
+
|
66
|
+
def service_ref
|
67
|
+
arguments[:service_ref]
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module ThreeScaleToolbox
|
2
|
+
module Commands
|
3
|
+
module MethodsCommand
|
4
|
+
module Delete
|
5
|
+
class DeleteSubcommand < Cri::CommandRunner
|
6
|
+
include ThreeScaleToolbox::Command
|
7
|
+
|
8
|
+
def self.command
|
9
|
+
Cri::Command.define do
|
10
|
+
name 'delete'
|
11
|
+
usage 'delete [opts] <remote> <service> <method>'
|
12
|
+
summary 'delete method'
|
13
|
+
description 'Delete method'
|
14
|
+
|
15
|
+
param :remote
|
16
|
+
param :service_ref
|
17
|
+
param :method_ref
|
18
|
+
|
19
|
+
runner DeleteSubcommand
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def run
|
24
|
+
method.delete
|
25
|
+
puts "Method id: #{method.id} deleted"
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def service
|
31
|
+
@service ||= find_service
|
32
|
+
end
|
33
|
+
|
34
|
+
def method
|
35
|
+
@method ||= find_method
|
36
|
+
end
|
37
|
+
|
38
|
+
def find_service
|
39
|
+
Entities::Service.find(remote: remote,
|
40
|
+
ref: service_ref).tap do |svc|
|
41
|
+
raise ThreeScaleToolbox::Error, "Service #{service_ref} does not exist" if svc.nil?
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def find_method
|
46
|
+
hits = service.hits
|
47
|
+
Entities::Method.find(service: service, parent_id: hits.fetch('id'), ref: method_ref).tap do |p|
|
48
|
+
raise ThreeScaleToolbox::Error, "Method #{method_ref} does not exist" if p.nil?
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def remote
|
53
|
+
@remote ||= threescale_client(arguments[:remote])
|
54
|
+
end
|
55
|
+
|
56
|
+
def service_ref
|
57
|
+
arguments[:service_ref]
|
58
|
+
end
|
59
|
+
|
60
|
+
def method_ref
|
61
|
+
arguments[:method_ref]
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|