3scale_toolbox 0.9.0 → 0.10.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 +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
|