3scale_toolbox 0.13.0 → 0.17.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/3scale_toolbox.gemspec +4 -3
- data/README.md +31 -10
- data/lib/3scale_toolbox.rb +5 -2
- data/lib/3scale_toolbox/attribute_filters.rb +2 -0
- data/lib/3scale_toolbox/attribute_filters/attribute_filter.rb +9 -0
- data/lib/3scale_toolbox/attribute_filters/service_id_from_ref_filter.rb +30 -0
- data/lib/3scale_toolbox/cli.rb +4 -0
- data/lib/3scale_toolbox/cli/custom_table_printer.rb +32 -0
- data/lib/3scale_toolbox/cli/error_handler.rb +17 -14
- data/lib/3scale_toolbox/cli/json_printer.rb +13 -0
- data/lib/3scale_toolbox/cli/output_flag.rb +20 -0
- data/lib/3scale_toolbox/cli/yaml_printer.rb +13 -0
- data/lib/3scale_toolbox/commands.rb +5 -1
- data/lib/3scale_toolbox/commands/activedocs_command/apply_command.rb +34 -11
- data/lib/3scale_toolbox/commands/activedocs_command/create_command.rb +22 -7
- data/lib/3scale_toolbox/commands/activedocs_command/list_command.rb +21 -11
- data/lib/3scale_toolbox/commands/application_command/apply_command.rb +27 -4
- data/lib/3scale_toolbox/commands/application_command/create_command.rb +16 -1
- data/lib/3scale_toolbox/commands/application_command/list_command.rb +10 -13
- data/lib/3scale_toolbox/commands/application_command/show_command.rb +8 -14
- data/lib/3scale_toolbox/commands/backend_command.rb +22 -0
- data/lib/3scale_toolbox/commands/backend_command/copy_command.rb +65 -0
- data/lib/3scale_toolbox/commands/backend_command/copy_command/copy_mapping_rules_task.rb +52 -0
- data/lib/3scale_toolbox/commands/backend_command/copy_command/copy_methods_task.rb +40 -0
- data/lib/3scale_toolbox/commands/backend_command/copy_command/copy_metrics_task.rb +30 -0
- data/lib/3scale_toolbox/commands/backend_command/copy_command/create_or_update_target_backend_task.rb +45 -0
- data/lib/3scale_toolbox/commands/backend_command/copy_command/task.rb +89 -0
- data/lib/3scale_toolbox/commands/copy_command.rb +2 -2
- data/lib/3scale_toolbox/commands/copy_command/service_command.rb +40 -0
- data/lib/3scale_toolbox/commands/import_command/openapi.rb +29 -7
- data/lib/3scale_toolbox/commands/import_command/openapi/create_activedocs_step.rb +4 -17
- data/lib/3scale_toolbox/commands/import_command/openapi/create_service_step.rb +1 -5
- data/lib/3scale_toolbox/commands/import_command/openapi/mapping_rule.rb +3 -2
- data/lib/3scale_toolbox/commands/import_command/openapi/step.rb +43 -5
- data/lib/3scale_toolbox/commands/import_command/openapi/update_policies_step.rb +9 -10
- data/lib/3scale_toolbox/commands/import_command/openapi/update_service_oidc_conf_step.rb +2 -17
- data/lib/3scale_toolbox/commands/import_command/openapi/update_service_proxy_step.rb +10 -10
- data/lib/3scale_toolbox/commands/methods_command/apply_command.rb +26 -4
- data/lib/3scale_toolbox/commands/methods_command/create_command.rb +23 -1
- data/lib/3scale_toolbox/commands/methods_command/list_command.rb +11 -9
- data/lib/3scale_toolbox/commands/metrics_command/apply_command.rb +26 -4
- data/lib/3scale_toolbox/commands/metrics_command/create_command.rb +23 -1
- data/lib/3scale_toolbox/commands/metrics_command/list_command.rb +7 -12
- data/lib/3scale_toolbox/commands/plans_command/apply_command.rb +36 -7
- data/lib/3scale_toolbox/commands/plans_command/create_command.rb +23 -1
- data/lib/3scale_toolbox/commands/plans_command/import/import_plan_limits_step.rb +11 -12
- data/lib/3scale_toolbox/commands/plans_command/import/import_plan_pricing_rules_step.rb +11 -12
- data/lib/3scale_toolbox/commands/plans_command/list_command.rb +8 -13
- data/lib/3scale_toolbox/commands/plans_command/show_command.rb +6 -14
- data/lib/3scale_toolbox/commands/product_command.rb +22 -0
- data/lib/3scale_toolbox/commands/product_command/copy_command.rb +78 -0
- data/lib/3scale_toolbox/commands/product_command/copy_command/copy_backends_task.rb +71 -0
- data/lib/3scale_toolbox/commands/product_command/copy_command/delete_target_backend_usages_task.rb +48 -0
- data/lib/3scale_toolbox/commands/proxy_config_command.rb +3 -0
- data/lib/3scale_toolbox/commands/proxy_config_command/export_command.rb +74 -0
- data/lib/3scale_toolbox/commands/proxy_config_command/helper.rb +15 -0
- data/lib/3scale_toolbox/commands/proxy_config_command/list_command.rb +13 -29
- data/lib/3scale_toolbox/commands/proxy_config_command/show_command.rb +20 -23
- data/lib/3scale_toolbox/commands/service_command.rb +7 -5
- data/lib/3scale_toolbox/commands/service_command/apply_command.rb +69 -58
- data/lib/3scale_toolbox/commands/service_command/copy_command.rb +95 -0
- data/lib/3scale_toolbox/commands/service_command/copy_command/bump_proxy_version_task.rb +36 -0
- data/lib/3scale_toolbox/commands/service_command/copy_command/copy_activedocs_task.rb +46 -0
- data/lib/3scale_toolbox/commands/service_command/copy_command/copy_app_plans_task.rb +35 -0
- data/lib/3scale_toolbox/commands/service_command/copy_command/copy_limits_task.rb +39 -0
- data/lib/3scale_toolbox/commands/service_command/copy_command/copy_mapping_rules_task.rb +35 -0
- data/lib/3scale_toolbox/commands/service_command/copy_command/copy_methods_task.rb +40 -0
- data/lib/3scale_toolbox/commands/service_command/copy_command/copy_metrics_task.rb +37 -0
- data/lib/3scale_toolbox/commands/service_command/copy_command/copy_policies_task.rb +17 -0
- data/lib/3scale_toolbox/commands/service_command/copy_command/copy_pricingrules_task.rb +44 -0
- data/lib/3scale_toolbox/commands/service_command/copy_command/copy_service_proxy_task.rb +32 -0
- data/lib/3scale_toolbox/commands/service_command/copy_command/create_or_update_service_task.rb +48 -0
- data/lib/3scale_toolbox/commands/service_command/copy_command/destroy_mapping_rules_task.rb +34 -0
- data/lib/3scale_toolbox/commands/service_command/copy_command/task.rb +99 -0
- data/lib/3scale_toolbox/commands/service_command/create_command.rb +58 -44
- data/lib/3scale_toolbox/commands/service_command/delete_command.rb +31 -33
- data/lib/3scale_toolbox/commands/service_command/list_command.rb +24 -34
- data/lib/3scale_toolbox/commands/service_command/show_command.rb +39 -44
- data/lib/3scale_toolbox/commands/update_command.rb +3 -3
- data/lib/3scale_toolbox/commands/update_command/{update_service.rb → service_command.rb} +22 -18
- data/lib/3scale_toolbox/commands/update_command/service_command/copy_service_settings_task.rb +35 -0
- data/lib/3scale_toolbox/commands/update_command/service_command/delete_activedocs_task.rb +26 -0
- data/lib/3scale_toolbox/entities.rb +5 -0
- data/lib/3scale_toolbox/entities/application_plan.rb +31 -4
- data/lib/3scale_toolbox/entities/backend.rb +152 -0
- data/lib/3scale_toolbox/entities/backend_mapping_rule.rb +76 -0
- data/lib/3scale_toolbox/entities/backend_method.rb +90 -0
- data/lib/3scale_toolbox/entities/backend_metric.rb +88 -0
- data/lib/3scale_toolbox/entities/backend_usage.rb +99 -0
- data/lib/3scale_toolbox/entities/service.rb +18 -3
- data/lib/3scale_toolbox/error.rb +53 -0
- data/lib/3scale_toolbox/helper.rb +20 -0
- data/lib/3scale_toolbox/openapi.rb +2 -0
- data/lib/3scale_toolbox/openapi/oas3.rb +232 -0
- data/lib/3scale_toolbox/openapi/swagger.rb +192 -0
- data/lib/3scale_toolbox/proxy_logger.rb +1 -1
- data/lib/3scale_toolbox/version.rb +1 -1
- data/licenses.xml +188 -18
- data/resources/oas3_meta_schema.json +1654 -0
- metadata +68 -28
- data/lib/3scale_toolbox/commands/copy_command/copy_service.rb +0 -144
- data/lib/3scale_toolbox/commands/import_command/openapi/threescale_api_spec.rb +0 -80
- data/lib/3scale_toolbox/swagger.rb +0 -1
- data/lib/3scale_toolbox/swagger/swagger.rb +0 -123
- data/lib/3scale_toolbox/tasks.rb +0 -15
- data/lib/3scale_toolbox/tasks/bump_proxy_version_task.rb +0 -32
- data/lib/3scale_toolbox/tasks/copy_activedocs_task.rb +0 -42
- data/lib/3scale_toolbox/tasks/copy_app_plans_task.rb +0 -31
- data/lib/3scale_toolbox/tasks/copy_limits_task.rb +0 -36
- data/lib/3scale_toolbox/tasks/copy_mapping_rules_task.rb +0 -32
- data/lib/3scale_toolbox/tasks/copy_methods_task.rb +0 -36
- data/lib/3scale_toolbox/tasks/copy_metrics_task.rb +0 -33
- data/lib/3scale_toolbox/tasks/copy_policies_task.rb +0 -13
- data/lib/3scale_toolbox/tasks/copy_pricingrules_task.rb +0 -41
- data/lib/3scale_toolbox/tasks/copy_service_proxy_task.rb +0 -12
- data/lib/3scale_toolbox/tasks/copy_service_settings_task.rb +0 -38
- data/lib/3scale_toolbox/tasks/copy_task.rb +0 -66
- data/lib/3scale_toolbox/tasks/delete_activedocs_task.rb +0 -22
- data/lib/3scale_toolbox/tasks/destroy_mapping_rules_task.rb +0 -22
- data/lib/3scale_toolbox/tasks/helper_task.rb +0 -25
@@ -0,0 +1,40 @@
|
|
1
|
+
module ThreeScaleToolbox
|
2
|
+
module Commands
|
3
|
+
module BackendCommand
|
4
|
+
module CopyCommand
|
5
|
+
class CopyMethodsTask
|
6
|
+
include Task
|
7
|
+
|
8
|
+
# entrypoint
|
9
|
+
def run
|
10
|
+
missing_methods.each(&method(:create_method))
|
11
|
+
puts "created #{missing_methods.size} missing methods"
|
12
|
+
invalidate_target_methods if missing_methods.size.positive?
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def create_method(method)
|
18
|
+
# return silently if target metric hits does not exist
|
19
|
+
return if target_hits.nil?
|
20
|
+
|
21
|
+
Entities::BackendMethod.create(backend: target_backend,
|
22
|
+
parent_id: target_hits.id,
|
23
|
+
attrs: method.attrs)
|
24
|
+
rescue ThreeScaleToolbox::ThreeScaleApiError => e
|
25
|
+
raise e unless ThreeScaleToolbox::Helper.system_name_already_taken_error?(e.apierrors)
|
26
|
+
|
27
|
+
warn "[WARN] backend method #{method.attrs.fetch('system_name')} not created. " \
|
28
|
+
'Backend metric with the same system_name exists.'
|
29
|
+
end
|
30
|
+
|
31
|
+
def missing_methods
|
32
|
+
@missing_methods ||= ThreeScaleToolbox::Helper.array_difference(source_methods, target_methods) do |source, target|
|
33
|
+
source.system_name == target.system_name
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module ThreeScaleToolbox
|
2
|
+
module Commands
|
3
|
+
module BackendCommand
|
4
|
+
module CopyCommand
|
5
|
+
class CopyMetricsTask
|
6
|
+
include Task
|
7
|
+
|
8
|
+
# entrypoint
|
9
|
+
def run
|
10
|
+
missing_metrics.each(&method(:create_metric))
|
11
|
+
puts "created #{missing_metrics.size} missing metrics"
|
12
|
+
invalidate_target_metrics if missing_metrics.size.positive?
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def create_metric(metric)
|
18
|
+
Entities::BackendMetric.create(backend: target_backend, attrs: metric.attrs)
|
19
|
+
end
|
20
|
+
|
21
|
+
def missing_metrics
|
22
|
+
@missing_metrics ||= ThreeScaleToolbox::Helper.array_difference(source_metrics, target_metrics) do |source, target|
|
23
|
+
source.system_name == target.system_name
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module ThreeScaleToolbox
|
2
|
+
module Commands
|
3
|
+
module BackendCommand
|
4
|
+
module CopyCommand
|
5
|
+
class CreateOrUpdateTargetBackendTask
|
6
|
+
include Task
|
7
|
+
|
8
|
+
# entrypoint
|
9
|
+
def run
|
10
|
+
backend = Entities::Backend.find(remote: target_remote, ref: target_backend_ref)
|
11
|
+
|
12
|
+
if backend.nil?
|
13
|
+
backend = Entities::Backend.create(remote: target_remote,
|
14
|
+
attrs: create_attrs)
|
15
|
+
elsif backend == source_backend
|
16
|
+
message = 'source and destination backends are the same: ' \
|
17
|
+
"ID: #{source_backend.id} system_name: #{source_backend.attrs['system_name']}"
|
18
|
+
warn "\e[1m\e[31mWarning: #{message}\e[0m"
|
19
|
+
else
|
20
|
+
backend.update update_attrs
|
21
|
+
end
|
22
|
+
|
23
|
+
# assign target backend for other tasks to have it available
|
24
|
+
self.target_backend = backend
|
25
|
+
|
26
|
+
puts "source backend ID: #{source_backend.id} system_name: #{source_backend.attrs['system_name']}"
|
27
|
+
puts "target backend ID: #{target_backend.id} system_name: #{target_backend.attrs['system_name']}"
|
28
|
+
end
|
29
|
+
|
30
|
+
def create_attrs
|
31
|
+
source_backend.attrs.merge('system_name' => target_backend_ref)
|
32
|
+
end
|
33
|
+
|
34
|
+
def update_attrs
|
35
|
+
source_backend.attrs.merge('system_name' => target_backend_ref)
|
36
|
+
end
|
37
|
+
|
38
|
+
def target_backend_ref
|
39
|
+
option_target_system_name || source_backend.attrs.fetch('system_name')
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
module ThreeScaleToolbox
|
2
|
+
module Commands
|
3
|
+
module BackendCommand
|
4
|
+
module CopyCommand
|
5
|
+
module Task
|
6
|
+
attr_reader :context
|
7
|
+
|
8
|
+
def initialize(context)
|
9
|
+
@context = context
|
10
|
+
end
|
11
|
+
|
12
|
+
def call
|
13
|
+
run
|
14
|
+
end
|
15
|
+
|
16
|
+
def target_backend=(target)
|
17
|
+
context[:target_backend] = target
|
18
|
+
end
|
19
|
+
|
20
|
+
def target_backend
|
21
|
+
context[:target_backend] ||= raise ThreeScaleToolbox::Error, 'Unexpected error. ' \
|
22
|
+
'Target backend should have been created or updated'
|
23
|
+
end
|
24
|
+
|
25
|
+
def source_backend
|
26
|
+
context[:source_backend] ||= find_source_backend
|
27
|
+
end
|
28
|
+
|
29
|
+
def source_methods
|
30
|
+
context[:source_methods] ||= source_backend.methods(source_hits)
|
31
|
+
end
|
32
|
+
|
33
|
+
def source_hits
|
34
|
+
context[:source_hits] ||= source_backend.hits
|
35
|
+
end
|
36
|
+
|
37
|
+
def source_metrics
|
38
|
+
context[:source_metrics] ||= source_backend.metrics
|
39
|
+
end
|
40
|
+
|
41
|
+
def target_metrics
|
42
|
+
context[:target_metrics] ||= target_backend.metrics
|
43
|
+
end
|
44
|
+
|
45
|
+
def target_hits
|
46
|
+
context[:target_hits] ||= target_backend.hits
|
47
|
+
end
|
48
|
+
|
49
|
+
def target_methods
|
50
|
+
context[:target_methods] ||= target_backend.methods(target_hits)
|
51
|
+
end
|
52
|
+
|
53
|
+
def invalidate_target_methods
|
54
|
+
context[:target_methods] = nil
|
55
|
+
end
|
56
|
+
|
57
|
+
def invalidate_target_metrics
|
58
|
+
context[:target_metrics] = nil
|
59
|
+
end
|
60
|
+
|
61
|
+
def source_remote
|
62
|
+
context[:source_remote]
|
63
|
+
end
|
64
|
+
|
65
|
+
def target_remote
|
66
|
+
context[:target_remote]
|
67
|
+
end
|
68
|
+
|
69
|
+
def source_backend_ref
|
70
|
+
context[:source_backend_ref] ||= raise ThreeScaleToolbox::Error, 'Unexpected error. ' \
|
71
|
+
'source_backend_ref not found'
|
72
|
+
end
|
73
|
+
|
74
|
+
def option_target_system_name
|
75
|
+
context[:option_target_system_name]
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
79
|
+
|
80
|
+
def find_source_backend
|
81
|
+
Entities::Backend.find(remote: source_remote, ref: source_backend_ref).tap do |backend|
|
82
|
+
raise ThreeScaleToolbox::Error, "Backend #{source_backend_ref} does not exist" if backend.nil?
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require '3scale_toolbox/commands/copy_command/
|
1
|
+
require '3scale_toolbox/commands/copy_command/service_command'
|
2
2
|
|
3
3
|
module ThreeScaleToolbox
|
4
4
|
module Commands
|
@@ -16,7 +16,7 @@ module ThreeScaleToolbox
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
19
|
-
add_subcommand(
|
19
|
+
add_subcommand(ServiceSubcommand)
|
20
20
|
end
|
21
21
|
end
|
22
22
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module ThreeScaleToolbox
|
2
|
+
module Commands
|
3
|
+
module CopyCommand
|
4
|
+
class ServiceSubcommand < Cri::CommandRunner
|
5
|
+
include ThreeScaleToolbox::Command
|
6
|
+
|
7
|
+
def self.command
|
8
|
+
Cri::Command.define do
|
9
|
+
name 'service'
|
10
|
+
usage 'service [opts] -s <src> -d <dst> <source-service>'
|
11
|
+
summary 'copy service'
|
12
|
+
description <<-HEREDOC
|
13
|
+
This command makes a copy of the referenced service.
|
14
|
+
Target service will be searched by source service system name. System name can be overriden with `--target_system_name` option.
|
15
|
+
If a service with the selected `system_name` is not found, it will be created.
|
16
|
+
\n Components of the service being copied:
|
17
|
+
\nservice settings
|
18
|
+
\nproxy settings
|
19
|
+
\npricing rules
|
20
|
+
\nactivedocs
|
21
|
+
\nmetrics
|
22
|
+
\nmethods
|
23
|
+
\napplication plans
|
24
|
+
\nmapping rules
|
25
|
+
HEREDOC
|
26
|
+
|
27
|
+
option :s, :source, '3scale source instance. Url or remote name', argument: :required
|
28
|
+
option :d, :destination, '3scale target instance. Url or remote name', argument: :required
|
29
|
+
option :t, 'target_system_name', 'Target system name. Default to source system name', argument: :required
|
30
|
+
flag :f, :force, 'Overwrites the mapping rules by deleting all rules from target service first'
|
31
|
+
flag :r, 'rules-only', 'Only mapping rules are copied'
|
32
|
+
param :source_service
|
33
|
+
|
34
|
+
runner Commands::ServiceCommand::CopySubcommand
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -2,7 +2,6 @@ require '3scale_toolbox/commands/import_command/openapi/method'
|
|
2
2
|
require '3scale_toolbox/commands/import_command/openapi/mapping_rule'
|
3
3
|
require '3scale_toolbox/commands/import_command/openapi/operation'
|
4
4
|
require '3scale_toolbox/commands/import_command/openapi/step'
|
5
|
-
require '3scale_toolbox/commands/import_command/openapi/threescale_api_spec'
|
6
5
|
require '3scale_toolbox/commands/import_command/openapi/create_method_step'
|
7
6
|
require '3scale_toolbox/commands/import_command/openapi/create_mapping_rule_step'
|
8
7
|
require '3scale_toolbox/commands/import_command/openapi/create_service_step'
|
@@ -30,6 +29,7 @@ module ThreeScaleToolbox
|
|
30
29
|
option :t, 'target_system_name', 'Target system name', argument: :required
|
31
30
|
flag nil, 'activedocs-hidden', 'Create ActiveDocs in hidden state'
|
32
31
|
flag nil, 'skip-openapi-validation', 'Skip OpenAPI schema validation'
|
32
|
+
flag nil, 'prefix-matching', 'Use prefix matching instead of strict matching on mapping rules derived from openapi operations'
|
33
33
|
option nil, 'oidc-issuer-endpoint', 'OIDC Issuer Endpoint', argument: :required
|
34
34
|
option nil, 'default-credentials-userkey', 'Default credentials policy userkey', argument: :required
|
35
35
|
option nil, 'override-private-basepath', 'Override the basepath for the private URLs', argument: :required
|
@@ -37,6 +37,8 @@ module ThreeScaleToolbox
|
|
37
37
|
option nil, 'staging-public-base-url', 'Custom public staging URL', argument: :required
|
38
38
|
option nil, 'production-public-base-url', 'Custom public production URL', argument: :required
|
39
39
|
option nil, 'override-private-base-url', 'Custom private base URL', argument: :required
|
40
|
+
option nil, 'backend-api-secret-token', 'Custom secret token sent by the API gateway to the backend API',argument: :required
|
41
|
+
option nil, 'backend-api-host-header', 'Custom host header sent by the API gateway to the backend API', argument: :required
|
40
42
|
param :openapi_resource
|
41
43
|
|
42
44
|
runner OpenAPISubcommand
|
@@ -49,7 +51,7 @@ module ThreeScaleToolbox
|
|
49
51
|
# other tasks might read proxy settings (CreateActiveDocsStep does)
|
50
52
|
tasks << UpdateServiceProxyStep.new(context)
|
51
53
|
tasks << CreateMethodsStep.new(context)
|
52
|
-
tasks <<
|
54
|
+
tasks << ThreeScaleToolbox::Commands::ServiceCommand::CopyCommand::DestroyMappingRulesTask.new(context)
|
53
55
|
tasks << CreateMappingRulesStep.new(context)
|
54
56
|
tasks << CreateActiveDocsStep.new(context)
|
55
57
|
tasks << UpdateServiceOidcConfStep.new(context)
|
@@ -59,7 +61,7 @@ module ThreeScaleToolbox
|
|
59
61
|
tasks.each(&:call)
|
60
62
|
|
61
63
|
# This should be the last step
|
62
|
-
|
64
|
+
ThreeScaleToolbox::Commands::ServiceCommand::CopyCommand::BumpProxyVersionTask.new(service: context[:target]).call
|
63
65
|
end
|
64
66
|
|
65
67
|
private
|
@@ -69,10 +71,9 @@ module ThreeScaleToolbox
|
|
69
71
|
end
|
70
72
|
|
71
73
|
def create_context
|
72
|
-
openapi_resource = load_resource(arguments[:openapi_resource])
|
73
74
|
{
|
74
75
|
api_spec_resource: openapi_resource,
|
75
|
-
api_spec:
|
76
|
+
api_spec: openapi_parser,
|
76
77
|
threescale_client: threescale_client(fetch_required_option(:destination)),
|
77
78
|
target_system_name: options[:target_system_name],
|
78
79
|
activedocs_published: !options[:'activedocs-hidden'],
|
@@ -80,14 +81,35 @@ module ThreeScaleToolbox
|
|
80
81
|
default_credentials_userkey: options[:'default-credentials-userkey'],
|
81
82
|
skip_openapi_validation: options[:'skip-openapi-validation'],
|
82
83
|
override_private_basepath: options[:'override-private-basepath'],
|
84
|
+
override_public_basepath: options[:'override-public-basepath'],
|
83
85
|
production_public_base_url: options[:'production-public-base-url'],
|
84
86
|
staging_public_base_url: options[:'staging-public-base-url'],
|
85
87
|
override_private_base_url: options[:'override-private-base-url'],
|
88
|
+
backend_api_secret_token: options[:'backend-api-secret-token'],
|
89
|
+
backend_api_host_header: options[:'backend-api-host-header'],
|
90
|
+
prefix_matching: options[:'prefix-matching'],
|
91
|
+
delete_mapping_rules: true,
|
86
92
|
}
|
87
93
|
end
|
88
94
|
|
89
|
-
def
|
90
|
-
|
95
|
+
def openapi_resource
|
96
|
+
@openapi_resource ||= load_resource(openapi_path)
|
97
|
+
end
|
98
|
+
|
99
|
+
def openapi_path
|
100
|
+
arguments[:openapi_resource]
|
101
|
+
end
|
102
|
+
|
103
|
+
def validate
|
104
|
+
!options[:'skip-openapi-validation']
|
105
|
+
end
|
106
|
+
|
107
|
+
def openapi_parser
|
108
|
+
if openapi_resource.key?('openapi')
|
109
|
+
ThreeScaleToolbox::OpenAPI::OAS3.build(openapi_path, openapi_resource, validate: validate)
|
110
|
+
else
|
111
|
+
ThreeScaleToolbox::OpenAPI::Swagger.build(openapi_resource, validate: validate)
|
112
|
+
end
|
91
113
|
rescue JSON::Schema::ValidationError => e
|
92
114
|
raise ThreeScaleToolbox::Error, "OpenAPI schema validation failed: #{e.message}"
|
93
115
|
end
|
@@ -53,26 +53,13 @@ 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.proxy.fetch('endpoint')).tap do |uri|
|
57
|
-
activedocs['host'] = "#{uri.host}:#{uri.port}"
|
58
|
-
activedocs['schemes'] = [uri.scheme]
|
59
|
-
end
|
60
|
-
|
61
56
|
# the basePath field is updated to a new value only when overriden by optional param
|
62
|
-
|
63
|
-
|
57
|
+
api_spec.set_server_url(activedocs,
|
58
|
+
URI.join(service.proxy.fetch('endpoint'), public_base_path))
|
64
59
|
# security definitions
|
65
60
|
# just valid for oauth2 when oidc_issuer_endpoint is supplied
|
66
|
-
if !security.nil? && security
|
67
|
-
|
68
|
-
if %w[implicit accessCode].include?(security.flow)
|
69
|
-
activedocs['securityDefinitions'][security.id]['authorizationUrl'] = authorization_url
|
70
|
-
end
|
71
|
-
|
72
|
-
# tokenUrl
|
73
|
-
if %w[password application accessCode].include?(security.flow)
|
74
|
-
activedocs['securityDefinitions'][security.id]['tokenUrl'] = token_url
|
75
|
-
end
|
61
|
+
if !api_spec.security.nil? && api_spec.security[:type] == 'oauth2' && !oidc_issuer_endpoint.nil?
|
62
|
+
api_spec.set_oauth2_urls(activedocs, api_spec.security[:id], authorization_url, token_url)
|
76
63
|
end
|
77
64
|
end
|
78
65
|
end
|
@@ -33,7 +33,7 @@ module ThreeScaleToolbox
|
|
33
33
|
default_service_settings.tap do |svc|
|
34
34
|
svc['name'] = service_name
|
35
35
|
svc['description'] = service_description
|
36
|
-
svc['backend_version'] =
|
36
|
+
svc['backend_version'] = api_spec.service_backend_version
|
37
37
|
svc['system_name'] = service_system_name
|
38
38
|
svc['deployment_option'] = 'self_managed' if !production_public_base_url.nil? || !staging_public_base_url.nil?
|
39
39
|
end
|
@@ -50,10 +50,6 @@ module ThreeScaleToolbox
|
|
50
50
|
def service_description
|
51
51
|
api_spec.description
|
52
52
|
end
|
53
|
-
|
54
|
-
def backend_version
|
55
|
-
api_spec.backend_version
|
56
|
-
end
|
57
53
|
end
|
58
54
|
end
|
59
55
|
end
|
@@ -31,7 +31,21 @@ module ThreeScaleToolbox
|
|
31
31
|
# api_spec.operations are readonly
|
32
32
|
# store operations in context
|
33
33
|
# each operation can be extended with extra information to be used later
|
34
|
-
context[:operations] ||=
|
34
|
+
context[:operations] ||= build_3scale_operations
|
35
|
+
end
|
36
|
+
|
37
|
+
def build_3scale_operations
|
38
|
+
api_spec.operations.map do |op|
|
39
|
+
Operation.new(
|
40
|
+
base_path: base_path,
|
41
|
+
public_base_path: public_base_path,
|
42
|
+
path: op[:path],
|
43
|
+
verb: op[:verb],
|
44
|
+
operationId: op[:operation_id],
|
45
|
+
description: op[:description],
|
46
|
+
prefix_matching: prefix_matching,
|
47
|
+
)
|
48
|
+
end
|
35
49
|
end
|
36
50
|
|
37
51
|
def target_system_name
|
@@ -43,10 +57,6 @@ module ThreeScaleToolbox
|
|
43
57
|
context[:api_spec_resource]
|
44
58
|
end
|
45
59
|
|
46
|
-
def security
|
47
|
-
api_spec.security
|
48
|
-
end
|
49
|
-
|
50
60
|
def oidc_issuer_endpoint
|
51
61
|
context[:oidc_issuer_endpoint]
|
52
62
|
end
|
@@ -59,6 +69,10 @@ module ThreeScaleToolbox
|
|
59
69
|
context[:override_private_basepath]
|
60
70
|
end
|
61
71
|
|
72
|
+
def override_public_basepath
|
73
|
+
context[:override_public_basepath]
|
74
|
+
end
|
75
|
+
|
62
76
|
def production_public_base_url
|
63
77
|
context[:production_public_base_url]
|
64
78
|
end
|
@@ -70,6 +84,30 @@ module ThreeScaleToolbox
|
|
70
84
|
def override_private_base_url
|
71
85
|
context[:override_private_base_url]
|
72
86
|
end
|
87
|
+
|
88
|
+
def backend_api_secret_token
|
89
|
+
context[:backend_api_secret_token]
|
90
|
+
end
|
91
|
+
|
92
|
+
def backend_api_host_header
|
93
|
+
context[:backend_api_host_header]
|
94
|
+
end
|
95
|
+
|
96
|
+
def prefix_matching
|
97
|
+
context[:prefix_matching]
|
98
|
+
end
|
99
|
+
|
100
|
+
def base_path
|
101
|
+
api_spec.base_path || '/'
|
102
|
+
end
|
103
|
+
|
104
|
+
def public_base_path
|
105
|
+
override_public_basepath || base_path
|
106
|
+
end
|
107
|
+
|
108
|
+
def private_base_path
|
109
|
+
override_private_basepath || base_path
|
110
|
+
end
|
73
111
|
end
|
74
112
|
end
|
75
113
|
end
|