3scale_toolbox 0.12.4 → 0.17.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.
Files changed (121) hide show
  1. checksums.yaml +4 -4
  2. data/3scale_toolbox.gemspec +4 -3
  3. data/README.md +31 -10
  4. data/lib/3scale_toolbox.rb +5 -2
  5. data/lib/3scale_toolbox/attribute_filters.rb +2 -0
  6. data/lib/3scale_toolbox/attribute_filters/attribute_filter.rb +9 -0
  7. data/lib/3scale_toolbox/attribute_filters/service_id_from_ref_filter.rb +30 -0
  8. data/lib/3scale_toolbox/cli.rb +4 -0
  9. data/lib/3scale_toolbox/cli/custom_table_printer.rb +32 -0
  10. data/lib/3scale_toolbox/cli/error_handler.rb +17 -14
  11. data/lib/3scale_toolbox/cli/json_printer.rb +13 -0
  12. data/lib/3scale_toolbox/cli/output_flag.rb +20 -0
  13. data/lib/3scale_toolbox/cli/yaml_printer.rb +13 -0
  14. data/lib/3scale_toolbox/commands.rb +5 -1
  15. data/lib/3scale_toolbox/commands/activedocs_command/apply_command.rb +34 -11
  16. data/lib/3scale_toolbox/commands/activedocs_command/create_command.rb +22 -7
  17. data/lib/3scale_toolbox/commands/activedocs_command/list_command.rb +21 -11
  18. data/lib/3scale_toolbox/commands/application_command/apply_command.rb +27 -4
  19. data/lib/3scale_toolbox/commands/application_command/create_command.rb +16 -1
  20. data/lib/3scale_toolbox/commands/application_command/list_command.rb +10 -13
  21. data/lib/3scale_toolbox/commands/application_command/show_command.rb +8 -14
  22. data/lib/3scale_toolbox/commands/backend_command.rb +22 -0
  23. data/lib/3scale_toolbox/commands/backend_command/copy_command.rb +65 -0
  24. data/lib/3scale_toolbox/commands/backend_command/copy_command/copy_mapping_rules_task.rb +52 -0
  25. data/lib/3scale_toolbox/commands/backend_command/copy_command/copy_methods_task.rb +40 -0
  26. data/lib/3scale_toolbox/commands/backend_command/copy_command/copy_metrics_task.rb +30 -0
  27. data/lib/3scale_toolbox/commands/backend_command/copy_command/create_or_update_target_backend_task.rb +45 -0
  28. data/lib/3scale_toolbox/commands/backend_command/copy_command/task.rb +89 -0
  29. data/lib/3scale_toolbox/commands/copy_command.rb +2 -2
  30. data/lib/3scale_toolbox/commands/copy_command/service_command.rb +40 -0
  31. data/lib/3scale_toolbox/commands/import_command/openapi.rb +29 -7
  32. data/lib/3scale_toolbox/commands/import_command/openapi/create_activedocs_step.rb +4 -17
  33. data/lib/3scale_toolbox/commands/import_command/openapi/create_service_step.rb +1 -5
  34. data/lib/3scale_toolbox/commands/import_command/openapi/mapping_rule.rb +3 -2
  35. data/lib/3scale_toolbox/commands/import_command/openapi/step.rb +43 -5
  36. data/lib/3scale_toolbox/commands/import_command/openapi/update_policies_step.rb +9 -10
  37. data/lib/3scale_toolbox/commands/import_command/openapi/update_service_oidc_conf_step.rb +2 -17
  38. data/lib/3scale_toolbox/commands/import_command/openapi/update_service_proxy_step.rb +10 -10
  39. data/lib/3scale_toolbox/commands/methods_command/apply_command.rb +26 -4
  40. data/lib/3scale_toolbox/commands/methods_command/create_command.rb +23 -1
  41. data/lib/3scale_toolbox/commands/methods_command/list_command.rb +11 -9
  42. data/lib/3scale_toolbox/commands/metrics_command/apply_command.rb +26 -4
  43. data/lib/3scale_toolbox/commands/metrics_command/create_command.rb +23 -1
  44. data/lib/3scale_toolbox/commands/metrics_command/list_command.rb +7 -12
  45. data/lib/3scale_toolbox/commands/plans_command/apply_command.rb +36 -7
  46. data/lib/3scale_toolbox/commands/plans_command/create_command.rb +23 -1
  47. data/lib/3scale_toolbox/commands/plans_command/import/import_plan_limits_step.rb +11 -12
  48. data/lib/3scale_toolbox/commands/plans_command/import/import_plan_pricing_rules_step.rb +11 -12
  49. data/lib/3scale_toolbox/commands/plans_command/list_command.rb +8 -13
  50. data/lib/3scale_toolbox/commands/plans_command/show_command.rb +6 -14
  51. data/lib/3scale_toolbox/commands/product_command.rb +22 -0
  52. data/lib/3scale_toolbox/commands/product_command/copy_command.rb +78 -0
  53. data/lib/3scale_toolbox/commands/product_command/copy_command/copy_backends_task.rb +71 -0
  54. data/lib/3scale_toolbox/commands/product_command/copy_command/delete_target_backend_usages_task.rb +48 -0
  55. data/lib/3scale_toolbox/commands/proxy_config_command.rb +3 -0
  56. data/lib/3scale_toolbox/commands/proxy_config_command/export_command.rb +74 -0
  57. data/lib/3scale_toolbox/commands/proxy_config_command/helper.rb +15 -0
  58. data/lib/3scale_toolbox/commands/proxy_config_command/list_command.rb +13 -29
  59. data/lib/3scale_toolbox/commands/proxy_config_command/show_command.rb +20 -23
  60. data/lib/3scale_toolbox/commands/service_command.rb +7 -5
  61. data/lib/3scale_toolbox/commands/service_command/apply_command.rb +69 -58
  62. data/lib/3scale_toolbox/commands/service_command/copy_command.rb +95 -0
  63. data/lib/3scale_toolbox/commands/service_command/copy_command/bump_proxy_version_task.rb +36 -0
  64. data/lib/3scale_toolbox/commands/service_command/copy_command/copy_activedocs_task.rb +46 -0
  65. data/lib/3scale_toolbox/commands/service_command/copy_command/copy_app_plans_task.rb +35 -0
  66. data/lib/3scale_toolbox/commands/service_command/copy_command/copy_limits_task.rb +39 -0
  67. data/lib/3scale_toolbox/commands/service_command/copy_command/copy_mapping_rules_task.rb +35 -0
  68. data/lib/3scale_toolbox/commands/service_command/copy_command/copy_methods_task.rb +40 -0
  69. data/lib/3scale_toolbox/commands/service_command/copy_command/copy_metrics_task.rb +37 -0
  70. data/lib/3scale_toolbox/commands/service_command/copy_command/copy_policies_task.rb +17 -0
  71. data/lib/3scale_toolbox/commands/service_command/copy_command/copy_pricingrules_task.rb +44 -0
  72. data/lib/3scale_toolbox/commands/service_command/copy_command/copy_service_proxy_task.rb +32 -0
  73. data/lib/3scale_toolbox/commands/service_command/copy_command/create_or_update_service_task.rb +48 -0
  74. data/lib/3scale_toolbox/commands/service_command/copy_command/destroy_mapping_rules_task.rb +34 -0
  75. data/lib/3scale_toolbox/commands/service_command/copy_command/task.rb +99 -0
  76. data/lib/3scale_toolbox/commands/service_command/create_command.rb +58 -44
  77. data/lib/3scale_toolbox/commands/service_command/delete_command.rb +31 -33
  78. data/lib/3scale_toolbox/commands/service_command/list_command.rb +24 -34
  79. data/lib/3scale_toolbox/commands/service_command/show_command.rb +39 -44
  80. data/lib/3scale_toolbox/commands/update_command.rb +3 -3
  81. data/lib/3scale_toolbox/commands/update_command/{update_service.rb → service_command.rb} +22 -18
  82. data/lib/3scale_toolbox/commands/update_command/service_command/copy_service_settings_task.rb +35 -0
  83. data/lib/3scale_toolbox/commands/update_command/service_command/delete_activedocs_task.rb +26 -0
  84. data/lib/3scale_toolbox/entities.rb +5 -0
  85. data/lib/3scale_toolbox/entities/application_plan.rb +31 -4
  86. data/lib/3scale_toolbox/entities/backend.rb +152 -0
  87. data/lib/3scale_toolbox/entities/backend_mapping_rule.rb +76 -0
  88. data/lib/3scale_toolbox/entities/backend_method.rb +90 -0
  89. data/lib/3scale_toolbox/entities/backend_metric.rb +88 -0
  90. data/lib/3scale_toolbox/entities/backend_usage.rb +99 -0
  91. data/lib/3scale_toolbox/entities/service.rb +18 -3
  92. data/lib/3scale_toolbox/error.rb +53 -0
  93. data/lib/3scale_toolbox/helper.rb +20 -0
  94. data/lib/3scale_toolbox/openapi.rb +2 -0
  95. data/lib/3scale_toolbox/openapi/oas3.rb +232 -0
  96. data/lib/3scale_toolbox/openapi/swagger.rb +192 -0
  97. data/lib/3scale_toolbox/proxy_logger.rb +1 -1
  98. data/lib/3scale_toolbox/version.rb +1 -1
  99. data/licenses.xml +190 -20
  100. data/resources/oas3_meta_schema.json +1654 -0
  101. metadata +69 -30
  102. data/lib/3scale_toolbox/commands/copy_command/copy_service.rb +0 -142
  103. data/lib/3scale_toolbox/commands/import_command/openapi/threescale_api_spec.rb +0 -80
  104. data/lib/3scale_toolbox/swagger.rb +0 -1
  105. data/lib/3scale_toolbox/swagger/swagger.rb +0 -123
  106. data/lib/3scale_toolbox/tasks.rb +0 -15
  107. data/lib/3scale_toolbox/tasks/bump_proxy_version_task.rb +0 -32
  108. data/lib/3scale_toolbox/tasks/copy_activedocs_task.rb +0 -42
  109. data/lib/3scale_toolbox/tasks/copy_app_plans_task.rb +0 -31
  110. data/lib/3scale_toolbox/tasks/copy_limits_task.rb +0 -36
  111. data/lib/3scale_toolbox/tasks/copy_mapping_rules_task.rb +0 -32
  112. data/lib/3scale_toolbox/tasks/copy_methods_task.rb +0 -36
  113. data/lib/3scale_toolbox/tasks/copy_metrics_task.rb +0 -33
  114. data/lib/3scale_toolbox/tasks/copy_policies_task.rb +0 -13
  115. data/lib/3scale_toolbox/tasks/copy_pricingrules_task.rb +0 -41
  116. data/lib/3scale_toolbox/tasks/copy_service_proxy_task.rb +0 -12
  117. data/lib/3scale_toolbox/tasks/copy_service_settings_task.rb +0 -38
  118. data/lib/3scale_toolbox/tasks/copy_task.rb +0 -66
  119. data/lib/3scale_toolbox/tasks/delete_activedocs_task.rb +0 -22
  120. data/lib/3scale_toolbox/tasks/destroy_mapping_rules_task.rb +0 -22
  121. 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/copy_service'
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(CopyServiceSubcommand)
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 << Tasks::DestroyMappingRulesTask.new(context)
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
- Tasks::BumpProxyVersionTask.new(service: context[:target]).call
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: ThreeScaleApiSpec.new(load_openapi(openapi_resource), options[:'override-public-basepath']),
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 load_openapi(openapi_resource)
90
- Swagger.build(openapi_resource, validate: !options[:'skip-openapi-validation'])
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
- activedocs['basePath'] = api_spec.public_base_path
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.type == 'oauth2' && !oidc_issuer_endpoint.nil?
67
- # authorizationURL
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'] = 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
@@ -17,8 +17,9 @@ module ThreeScaleToolbox
17
17
  end
18
18
 
19
19
  def pattern
20
- # apply strict matching
21
- "#{raw_pattern}$"
20
+ res = "#{raw_pattern}"
21
+ res = "#{res}$" if !operation[:prefix_matching] # apply strict matching
22
+ res
22
23
  end
23
24
 
24
25
  def raw_pattern
@@ -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] ||= api_spec.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