3scale_toolbox 0.18.3 → 0.19.3
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 +3 -3
- data/README.md +1 -2
- data/lib/3scale_toolbox/commands/backend_command/copy_command/delete_mapping_rules_task.rb +18 -0
- data/lib/3scale_toolbox/commands/backend_command/copy_command/task.rb +4 -0
- data/lib/3scale_toolbox/commands/backend_command/copy_command.rb +4 -1
- data/lib/3scale_toolbox/commands/import_command/import_csv.rb +8 -8
- data/lib/3scale_toolbox/commands/import_command/openapi/create_activedocs_step.rb +1 -1
- data/lib/3scale_toolbox/commands/import_command/openapi/update_policies_step.rb +23 -10
- data/lib/3scale_toolbox/commands/import_command/openapi.rb +2 -0
- data/lib/3scale_toolbox/commands/plans_command/export_command.rb +52 -29
- data/lib/3scale_toolbox/commands/plans_command/import/import_backend_metrics_step.rb +37 -0
- data/lib/3scale_toolbox/commands/plans_command/import/import_plan_limits_step.rb +11 -2
- data/lib/3scale_toolbox/commands/plans_command/import/import_plan_metrics_step.rb +2 -2
- data/lib/3scale_toolbox/commands/plans_command/import/import_plan_pricing_rules_step.rb +12 -1
- data/lib/3scale_toolbox/commands/plans_command/import/step.rb +23 -8
- data/lib/3scale_toolbox/commands/plans_command/import/validate_plan_step.rb +126 -0
- data/lib/3scale_toolbox/commands/plans_command/import_command.rb +5 -1
- data/lib/3scale_toolbox/commands/product_command/copy_command/copy_backends_task.rb +6 -0
- data/lib/3scale_toolbox/commands/product_command/copy_command.rb +3 -2
- data/lib/3scale_toolbox/commands/product_command/import_command.rb +1 -0
- data/lib/3scale_toolbox/crds/limit_dump.rb +1 -1
- data/lib/3scale_toolbox/crds/pricing_rule_dump.rb +1 -1
- data/lib/3scale_toolbox/entities/application_plan.rb +64 -0
- data/lib/3scale_toolbox/entities/backend.rb +4 -0
- data/lib/3scale_toolbox/entities/backend_method.rb +16 -0
- data/lib/3scale_toolbox/entities/backend_metric.rb +16 -0
- data/lib/3scale_toolbox/entities/limit.rb +52 -7
- data/lib/3scale_toolbox/entities/method.rb +11 -0
- data/lib/3scale_toolbox/entities/metric.rb +12 -0
- data/lib/3scale_toolbox/entities/pricing_rule.rb +52 -7
- data/lib/3scale_toolbox/entities/service.rb +4 -0
- data/lib/3scale_toolbox/proxy_logger.rb +2 -0
- data/lib/3scale_toolbox/remote_cache.rb +49 -2
- data/lib/3scale_toolbox/version.rb +1 -1
- data/licenses.xml +15 -25
- metadata +8 -13
- data/lib/3scale_toolbox/commands/plans_command/export/read_app_plan_step.rb +0 -16
- data/lib/3scale_toolbox/commands/plans_command/export/read_plan_features_step.rb +0 -16
- data/lib/3scale_toolbox/commands/plans_command/export/read_plan_limits_step.rb +0 -19
- data/lib/3scale_toolbox/commands/plans_command/export/read_plan_methods_step.rb +0 -47
- data/lib/3scale_toolbox/commands/plans_command/export/read_plan_metrics_step.rb +0 -47
- data/lib/3scale_toolbox/commands/plans_command/export/read_plan_pricing_rules_step.rb +0 -19
- data/lib/3scale_toolbox/commands/plans_command/export/step.rb +0 -85
- data/lib/3scale_toolbox/commands/plans_command/export/write_artifacts_file_step.rb +0 -84
@@ -14,13 +14,13 @@ module ThreeScaleToolbox
|
|
14
14
|
summary 'Copy product'
|
15
15
|
description <<-HEREDOC
|
16
16
|
This command makes a copy of the referenced product.
|
17
|
-
Target product will be searched by source product system name. System name can be
|
17
|
+
Target product will be searched by the source product system name. System name can be overridden with `--target-system-name` option.
|
18
18
|
If a product with the selected `system_name` is not found, it will be created.
|
19
19
|
\n Components of the product being copied:
|
20
20
|
\nproduct configuration
|
21
21
|
\nproduct settings
|
22
22
|
\nproduct methods&metrics: Only missing metrics&methods will be created.
|
23
|
-
\nproduct mapping rules:
|
23
|
+
\nproduct mapping rules: mapping rules will be replaced. Existing mapping rules will be removed.
|
24
24
|
\nproduct application plans & pricing rules & limits: Only missing application plans & pricing rules & limits will be created.
|
25
25
|
\nproduct application usage rules
|
26
26
|
\nproduct policies
|
@@ -73,6 +73,7 @@ module ThreeScaleToolbox
|
|
73
73
|
source_remote: threescale_client(fetch_required_option(:source)),
|
74
74
|
target_remote: threescale_client(fetch_required_option(:destination)),
|
75
75
|
source_service_ref: arguments[:source_product],
|
76
|
+
delete_mapping_rules: true,
|
76
77
|
option_target_system_name: options[:'target-system-name']
|
77
78
|
}
|
78
79
|
end
|
@@ -18,7 +18,7 @@ module ThreeScaleToolbox
|
|
18
18
|
{ 'systemName' => method.system_name }
|
19
19
|
elsif (metric = plan.service.metrics.find { |m| m.id == metric_id })
|
20
20
|
{ 'systemName' => metric.system_name }
|
21
|
-
elsif (backend =
|
21
|
+
elsif (backend = backend_from_metric_link)
|
22
22
|
if (backend_metric = backend.metrics.find { |m| m.id == metric_id })
|
23
23
|
{ 'systemName' => backend_metric.system_name, 'backend' => backend.system_name }
|
24
24
|
elsif (backend_method = backend.methods.find { |m| m.id == metric_id })
|
@@ -19,7 +19,7 @@ module ThreeScaleToolbox
|
|
19
19
|
{ 'systemName' => method.system_name }
|
20
20
|
elsif (metric = plan.service.metrics.find { |m| m.id == metric_id })
|
21
21
|
{ 'systemName' => metric.system_name }
|
22
|
-
elsif (backend =
|
22
|
+
elsif (backend = backend_from_metric_link)
|
23
23
|
if (backend_metric = backend.metrics.find { |m| m.id == metric_id })
|
24
24
|
{ 'systemName' => backend_metric.system_name, 'backend' => backend.system_name }
|
25
25
|
elsif (backend_method = backend.methods.find { |m| m.id == metric_id })
|
@@ -3,6 +3,9 @@ module ThreeScaleToolbox
|
|
3
3
|
class ApplicationPlan
|
4
4
|
include CRD::ApplicationPlanSerializer
|
5
5
|
|
6
|
+
APP_PLANS_BLACKLIST = %w[id links default custom created_at updated_at].freeze
|
7
|
+
PLAN_FEATURE_BLACKLIST = %w[id links created_at updated_at].freeze
|
8
|
+
|
6
9
|
class << self
|
7
10
|
def create(service:, plan_attrs:)
|
8
11
|
plan = service.remote.create_application_plan service.id, create_plan_attrs(plan_attrs)
|
@@ -209,8 +212,69 @@ module ThreeScaleToolbox
|
|
209
212
|
attrs.fetch('cost_per_month', 0.0)
|
210
213
|
end
|
211
214
|
|
215
|
+
def to_hash
|
216
|
+
{
|
217
|
+
'plan' => attrs.reject { |key, _| APP_PLANS_BLACKLIST.include? key },
|
218
|
+
'limits' => limits.map(&:to_hash),
|
219
|
+
'pricingrules' => pricing_rules.map(&:to_hash),
|
220
|
+
'plan_features' => features.map do |feature|
|
221
|
+
feature.reject { |key, _| PLAN_FEATURE_BLACKLIST.include? key }
|
222
|
+
end,
|
223
|
+
'metrics' => uniq_metrics_to_hash,
|
224
|
+
'methods' => uniq_methods_to_hash,
|
225
|
+
}
|
226
|
+
end
|
227
|
+
|
212
228
|
private
|
213
229
|
|
230
|
+
def uniq_metrics_to_hash
|
231
|
+
limit_metrics = limits.flat_map do |limit|
|
232
|
+
# one of them (or both) could be nil
|
233
|
+
[
|
234
|
+
limit.product_metric, limit.backend_metric
|
235
|
+
]
|
236
|
+
end.compact
|
237
|
+
|
238
|
+
pr_metrics = pricing_rules.flat_map do |pr|
|
239
|
+
# one of them (or both) could be nil
|
240
|
+
[
|
241
|
+
pr.product_metric, pr.backend_metric
|
242
|
+
]
|
243
|
+
end.compact
|
244
|
+
|
245
|
+
# multiple limits can reference the same metric
|
246
|
+
# multiple pricing rules can reference the same metric
|
247
|
+
uniq_metrics = limit_metrics.concat(pr_metrics).each_with_object({}) do |metric, acc|
|
248
|
+
acc[metric.enriched_key] = metric
|
249
|
+
end.values
|
250
|
+
|
251
|
+
uniq_metrics.map { |metric| metric.to_hash }
|
252
|
+
end
|
253
|
+
|
254
|
+
def uniq_methods_to_hash
|
255
|
+
limit_methods = limits.flat_map do |limit|
|
256
|
+
# one of them (or both) could be nil
|
257
|
+
[
|
258
|
+
limit.product_method, limit.backend_method
|
259
|
+
]
|
260
|
+
end.compact
|
261
|
+
|
262
|
+
pr_methods = pricing_rules.flat_map do |pr|
|
263
|
+
# one of them (or both) could be nil
|
264
|
+
[
|
265
|
+
pr.product_method, pr.backend_method
|
266
|
+
]
|
267
|
+
end.compact
|
268
|
+
|
269
|
+
# multiple limits can reference the same method
|
270
|
+
# multiple pricing rules can reference the same method
|
271
|
+
uniq_methods = limit_methods.concat(pr_methods).each_with_object({}) do |method, acc|
|
272
|
+
acc[method.enriched_key] = method
|
273
|
+
end.values
|
274
|
+
|
275
|
+
uniq_methods.map { |method| method.to_hash }
|
276
|
+
end
|
277
|
+
|
214
278
|
def read_plan_attrs
|
215
279
|
raise ThreeScaleToolbox::InvalidIdError if id.zero?
|
216
280
|
|
@@ -161,6 +161,10 @@ module ThreeScaleToolbox
|
|
161
161
|
remote.http_client.endpoint == other.remote.http_client.endpoint && id == other.id
|
162
162
|
end
|
163
163
|
|
164
|
+
def find_metric_or_method(system_name)
|
165
|
+
(metrics + methods).find { |m| m.system_name == system_name }
|
166
|
+
end
|
167
|
+
|
164
168
|
private
|
165
169
|
|
166
170
|
def metrics_and_methods
|
@@ -6,6 +6,8 @@ module ThreeScaleToolbox
|
|
6
6
|
VALID_PARAMS = %w[friendly_name system_name description].freeze
|
7
7
|
public_constant :VALID_PARAMS
|
8
8
|
|
9
|
+
METHOD_BLACKLIST = %w[id links created_at updated_at parent_id].freeze
|
10
|
+
|
9
11
|
class << self
|
10
12
|
def create(backend:, attrs:)
|
11
13
|
method = backend.remote.create_backend_method(backend.id, backend.hits.id,
|
@@ -71,6 +73,20 @@ module ThreeScaleToolbox
|
|
71
73
|
remote.delete_backend_method backend.id, hits_id, id
|
72
74
|
end
|
73
75
|
|
76
|
+
# enriched_key returns a metric key that will be unique for all
|
77
|
+
# metrics/methods from products and backends
|
78
|
+
def enriched_key
|
79
|
+
"backend.#{backend.id}.#{id}"
|
80
|
+
end
|
81
|
+
|
82
|
+
def to_hash
|
83
|
+
extra_attrs = {
|
84
|
+
'backend_system_name' => backend.system_name
|
85
|
+
}
|
86
|
+
|
87
|
+
attrs.merge(extra_attrs).reject { |key, _| METHOD_BLACKLIST.include? key }
|
88
|
+
end
|
89
|
+
|
74
90
|
private
|
75
91
|
|
76
92
|
def hits_id
|
@@ -6,6 +6,8 @@ module ThreeScaleToolbox
|
|
6
6
|
VALID_PARAMS = %w[friendly_name system_name unit description].freeze
|
7
7
|
public_constant :VALID_PARAMS
|
8
8
|
|
9
|
+
METRIC_BLACKLIST = %w[id links created_at updated_at].freeze
|
10
|
+
|
9
11
|
class << self
|
10
12
|
def create(backend:, attrs:)
|
11
13
|
metric = backend.remote.create_backend_metric(backend.id,
|
@@ -74,6 +76,20 @@ module ThreeScaleToolbox
|
|
74
76
|
remote.delete_backend_metric backend.id, id
|
75
77
|
end
|
76
78
|
|
79
|
+
# enriched_key returns a metric key that will be unique for all
|
80
|
+
# metrics from products and backends
|
81
|
+
def enriched_key
|
82
|
+
"backend.#{backend.id}.#{id}"
|
83
|
+
end
|
84
|
+
|
85
|
+
def to_hash
|
86
|
+
extra_attrs = {
|
87
|
+
'backend_system_name' => backend.system_name
|
88
|
+
}
|
89
|
+
|
90
|
+
attrs.merge(extra_attrs).reject { |key, _| METRIC_BLACKLIST.include? key }
|
91
|
+
end
|
92
|
+
|
77
93
|
private
|
78
94
|
|
79
95
|
def process_attrs(metric_attrs)
|
@@ -3,6 +3,8 @@ module ThreeScaleToolbox
|
|
3
3
|
class Limit
|
4
4
|
include CRD::Limit
|
5
5
|
|
6
|
+
LIMITS_BLACKLIST = %w[id metric_id plan_id links created_at updated_at].freeze
|
7
|
+
|
6
8
|
class << self
|
7
9
|
def create(plan:, metric_id:, attrs:)
|
8
10
|
resp_attrs = plan.remote.create_application_plan_limit plan.id, metric_id, attrs
|
@@ -37,7 +39,7 @@ module ThreeScaleToolbox
|
|
37
39
|
end
|
38
40
|
|
39
41
|
def metric_link
|
40
|
-
links.find { |link| link['rel'] == 'metric' }
|
42
|
+
links.find { |link| link['rel'] == 'metric' } || {}
|
41
43
|
end
|
42
44
|
|
43
45
|
def update(new_limit_attrs)
|
@@ -56,15 +58,58 @@ module ThreeScaleToolbox
|
|
56
58
|
remote.delete_application_plan_limit plan.id, metric_id, id
|
57
59
|
end
|
58
60
|
|
61
|
+
def product_metric
|
62
|
+
plan.service.metrics.find { |m| m.id == metric_id }
|
63
|
+
end
|
64
|
+
|
65
|
+
def product_method
|
66
|
+
plan.service.methods.find { |m| m.id == metric_id }
|
67
|
+
end
|
68
|
+
|
69
|
+
def backend_metric
|
70
|
+
if (backend = backend_from_metric_link)
|
71
|
+
return backend.metrics.find { |m| m.id == metric_id }
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def backend_method
|
76
|
+
if (backend = backend_from_metric_link)
|
77
|
+
return backend.methods.find { |m| m.id == metric_id }
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def to_hash
|
82
|
+
extra_attrs = {}
|
83
|
+
|
84
|
+
if (metric = product_metric)
|
85
|
+
extra_attrs['metric_system_name'] = metric.system_name
|
86
|
+
elsif (method = product_method)
|
87
|
+
extra_attrs['metric_system_name'] = method.system_name
|
88
|
+
elsif (metric = backend_metric)
|
89
|
+
extra_attrs['metric_system_name'] = metric.system_name
|
90
|
+
extra_attrs['metric_backend_system_name'] = metric.backend.system_name
|
91
|
+
elsif (method = backend_method)
|
92
|
+
extra_attrs['metric_system_name'] = method.system_name
|
93
|
+
extra_attrs['metric_backend_system_name'] = method.backend.system_name
|
94
|
+
else
|
95
|
+
raise_metric_not_found
|
96
|
+
end
|
97
|
+
|
98
|
+
attrs.merge(extra_attrs).reject { |key, _| LIMITS_BLACKLIST.include? key }
|
99
|
+
end
|
100
|
+
|
59
101
|
private
|
60
102
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
return if backend_id.nil?
|
103
|
+
def raise_metric_not_found
|
104
|
+
raise ThreeScaleToolbox::Error, "Unexpected error. Limit #{id} " \
|
105
|
+
"referencing to metric id #{metric_id} which has not been found"
|
106
|
+
end
|
66
107
|
|
67
|
-
|
108
|
+
# Returns the backend hosting the metric
|
109
|
+
def backend_from_metric_link
|
110
|
+
if (backend_id = Helper.backend_metric_link_parser(metric_link['href'] || ''))
|
111
|
+
return Backend.new(id: backend_id.to_i, remote: remote)
|
112
|
+
end
|
68
113
|
end
|
69
114
|
end
|
70
115
|
end
|
@@ -3,6 +3,8 @@ module ThreeScaleToolbox
|
|
3
3
|
class Method
|
4
4
|
include CRD::MethodSerializer
|
5
5
|
|
6
|
+
METHOD_BLACKLIST = %w[id links created_at updated_at parent_id].freeze
|
7
|
+
|
6
8
|
class << self
|
7
9
|
def create(service:, attrs:)
|
8
10
|
method_attrs = service.remote.create_method service.id, service.hits.id, attrs
|
@@ -74,6 +76,15 @@ module ThreeScaleToolbox
|
|
74
76
|
remote.delete_method service.id, hits_id, id
|
75
77
|
end
|
76
78
|
|
79
|
+
# enriched_key returns a metric key that will be unique for all
|
80
|
+
# metrics/methods from products and backends
|
81
|
+
def enriched_key
|
82
|
+
"product.#{service.id}.#{id}"
|
83
|
+
end
|
84
|
+
|
85
|
+
def to_hash
|
86
|
+
attrs.reject { |key, _| METHOD_BLACKLIST.include? key }
|
87
|
+
end
|
77
88
|
|
78
89
|
private
|
79
90
|
|
@@ -3,6 +3,8 @@ module ThreeScaleToolbox
|
|
3
3
|
class Metric
|
4
4
|
include CRD::MetricSerializer
|
5
5
|
|
6
|
+
METRIC_BLACKLIST = %w[id links created_at updated_at].freeze
|
7
|
+
|
6
8
|
class << self
|
7
9
|
def create(service:, attrs:)
|
8
10
|
metric = service.remote.create_metric service.id, attrs
|
@@ -92,6 +94,16 @@ module ThreeScaleToolbox
|
|
92
94
|
remote.delete_metric service.id, id
|
93
95
|
end
|
94
96
|
|
97
|
+
# enriched_key returns a metric key that will be unique for all
|
98
|
+
# metrics from products and backends
|
99
|
+
def enriched_key
|
100
|
+
"product.#{service.id}.#{id}"
|
101
|
+
end
|
102
|
+
|
103
|
+
def to_hash
|
104
|
+
attrs.reject { |key, _| METRIC_BLACKLIST.include? key }
|
105
|
+
end
|
106
|
+
|
95
107
|
private
|
96
108
|
|
97
109
|
def metric_attrs
|
@@ -3,6 +3,8 @@ module ThreeScaleToolbox
|
|
3
3
|
class PricingRule
|
4
4
|
include CRD::PricingRuleSerializer
|
5
5
|
|
6
|
+
PRICINGRULES_BLACKLIST = %w[id metric_id plan_id links created_at updated_at].freeze
|
7
|
+
|
6
8
|
class << self
|
7
9
|
def create(plan:, metric_id:, attrs:)
|
8
10
|
resp_attrs = plan.remote.create_pricingrule plan.id, metric_id, attrs
|
@@ -41,22 +43,65 @@ module ThreeScaleToolbox
|
|
41
43
|
end
|
42
44
|
|
43
45
|
def metric_link
|
44
|
-
links.find { |link| link['rel'] == 'metric' }
|
46
|
+
links.find { |link| link['rel'] == 'metric' } || {}
|
45
47
|
end
|
46
48
|
|
47
49
|
def delete
|
48
50
|
remote.delete_application_plan_pricingrule plan.id, metric_id, id
|
49
51
|
end
|
50
52
|
|
53
|
+
def product_metric
|
54
|
+
plan.service.metrics.find { |m| m.id == metric_id }
|
55
|
+
end
|
56
|
+
|
57
|
+
def product_method
|
58
|
+
plan.service.methods.find { |m| m.id == metric_id }
|
59
|
+
end
|
60
|
+
|
61
|
+
def backend_metric
|
62
|
+
if (backend = backend_from_metric_link)
|
63
|
+
return backend.metrics.find { |m| m.id == metric_id }
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def backend_method
|
68
|
+
if (backend = backend_from_metric_link)
|
69
|
+
return backend.methods.find { |m| m.id == metric_id }
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def to_hash
|
74
|
+
extra_attrs = {}
|
75
|
+
|
76
|
+
if (metric = product_metric)
|
77
|
+
extra_attrs['metric_system_name'] = metric.system_name
|
78
|
+
elsif (method = product_method)
|
79
|
+
extra_attrs['metric_system_name'] = method.system_name
|
80
|
+
elsif (metric = backend_metric)
|
81
|
+
extra_attrs['metric_system_name'] = metric.system_name
|
82
|
+
extra_attrs['metric_backend_system_name'] = metric.backend.system_name
|
83
|
+
elsif (method = backend_method)
|
84
|
+
extra_attrs['metric_system_name'] = method.system_name
|
85
|
+
extra_attrs['metric_backend_system_name'] = method.backend.system_name
|
86
|
+
else
|
87
|
+
raise_method_not_found
|
88
|
+
end
|
89
|
+
|
90
|
+
attrs.merge(extra_attrs).reject { |key, _| PRICINGRULES_BLACKLIST.include? key }
|
91
|
+
end
|
92
|
+
|
51
93
|
private
|
52
94
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
return if backend_id.nil?
|
95
|
+
def raise_method_not_found
|
96
|
+
raise ThreeScaleToolbox::Error, "Unexpected error. Pricing Rule #{id} " \
|
97
|
+
"referencing to metric id #{metric_id} which has not been found"
|
98
|
+
end
|
58
99
|
|
59
|
-
|
100
|
+
# Returns the backend hosting the metric
|
101
|
+
def backend_from_metric_link
|
102
|
+
if (backend_id = Helper.backend_metric_link_parser(metric_link['href'] || ''))
|
103
|
+
return Backend.new(id: backend_id.to_i, remote: remote)
|
104
|
+
end
|
60
105
|
end
|
61
106
|
end
|
62
107
|
end
|
@@ -367,6 +367,10 @@ module ThreeScaleToolbox
|
|
367
367
|
remote.http_client.endpoint == other.remote.http_client.endpoint && id == other.id
|
368
368
|
end
|
369
369
|
|
370
|
+
def find_metric_or_method(system_name)
|
371
|
+
(metrics + methods).find { |m| m.system_name == system_name }
|
372
|
+
end
|
373
|
+
|
370
374
|
private
|
371
375
|
|
372
376
|
def fetch_attrs
|
@@ -5,6 +5,7 @@ module ThreeScaleToolbox
|
|
5
5
|
end
|
6
6
|
|
7
7
|
def method_missing(name, *args)
|
8
|
+
# Correct delegation https://eregon.me/blog/2021/02/13/correct-delegation-in-ruby-2-27-3.html
|
8
9
|
start_time = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC)
|
9
10
|
result = @subject.public_send(name, *args)
|
10
11
|
ensure
|
@@ -12,6 +13,7 @@ module ThreeScaleToolbox
|
|
12
13
|
::Kernel.warn "-- call #{name} args |#{args.inspect[0..2000]}| response |#{result.inspect[0..2000]}| - (#{end_time}s)"
|
13
14
|
result
|
14
15
|
end
|
16
|
+
ruby2_keywords :method_missing if respond_to?(:ruby2_keywords, true)
|
15
17
|
|
16
18
|
def public_send(name, *args)
|
17
19
|
method_missing(name, *args)
|
@@ -1,7 +1,10 @@
|
|
1
1
|
module ThreeScaleToolbox
|
2
2
|
class RemoteCache < BasicObject
|
3
3
|
|
4
|
-
attr_reader :metrics_cache, :methods_cache,
|
4
|
+
attr_reader :metrics_cache, :methods_cache,
|
5
|
+
:backend_metrics_cache, :backend_methods_cache,
|
6
|
+
:backends_cache,
|
7
|
+
:subject
|
5
8
|
|
6
9
|
def initialize(subject)
|
7
10
|
@subject = subject
|
@@ -13,6 +16,8 @@ module ThreeScaleToolbox
|
|
13
16
|
@backend_metrics_cache = {}
|
14
17
|
# Backend methods cache data
|
15
18
|
@backend_methods_cache = {}
|
19
|
+
# Backends cache data
|
20
|
+
@backends_cache = {}
|
16
21
|
end
|
17
22
|
|
18
23
|
def list_metrics(service_id)
|
@@ -136,12 +141,54 @@ module ThreeScaleToolbox
|
|
136
141
|
end
|
137
142
|
end
|
138
143
|
|
144
|
+
def list_backends(params = nil)
|
145
|
+
return backends_cache[params] if backends_cache.has_key? params
|
146
|
+
|
147
|
+
subject.list_backends(params).tap do |backends|
|
148
|
+
backends_cache[params] = backends unless backends.respond_to?(:has_key?) && !backends['errors'].nil?
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
def create_backend(attributes)
|
153
|
+
subject.create_backend(attributes).tap do |backend_attrs|
|
154
|
+
backends_cache.clear unless backend_attrs.respond_to?(:has_key?) && !backend_attrs['errors'].nil?
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
def update_backend(id, attributes)
|
159
|
+
subject.update_backend(id, attributes).tap do |backend_attrs|
|
160
|
+
backends_cache.clear unless backend_attrs.respond_to?(:has_key?) && !backend_attrs['errors'].nil?
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
def delete_backend(id)
|
165
|
+
subject.delete_backend(id).tap do |resp|
|
166
|
+
backends_cache.clear unless resp.respond_to?(:has_key?) && !resp['errors'].nil?
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
def backend(id)
|
171
|
+
# if exist in the cache, return it.
|
172
|
+
# But if not, it is not populated because cache is paginated and page is unknown.
|
173
|
+
if (backend_attrs = backends_cache.values.reduce([], :concat).find { |attrs| attrs['id'] == id })
|
174
|
+
return backend_attrs
|
175
|
+
end
|
176
|
+
|
177
|
+
subject.backend(id)
|
178
|
+
end
|
179
|
+
|
139
180
|
###
|
140
181
|
# Generic methods
|
141
182
|
###
|
142
183
|
|
143
184
|
def method_missing(name, *args)
|
144
|
-
|
185
|
+
# Correct delegation https://eregon.me/blog/2021/02/13/correct-delegation-in-ruby-2-27-3.html
|
186
|
+
@subject.public_send(name, *args)
|
187
|
+
end
|
188
|
+
ruby2_keywords :method_missing if respond_to?(:ruby2_keywords, true)
|
189
|
+
|
190
|
+
def public_send(name, *args)
|
191
|
+
method_missing(name, *args)
|
145
192
|
end
|
146
193
|
|
147
194
|
def respond_to_missing?(method_name, include_private = false)
|
data/licenses.xml
CHANGED
@@ -13,7 +13,7 @@
|
|
13
13
|
</dependency>
|
14
14
|
<dependency>
|
15
15
|
<packageName>3scale_toolbox</packageName>
|
16
|
-
<version>0.
|
16
|
+
<version>0.19.3</version>
|
17
17
|
<licenses>
|
18
18
|
<license>
|
19
19
|
<name>MIT</name>
|
@@ -23,7 +23,7 @@
|
|
23
23
|
</dependency>
|
24
24
|
<dependency>
|
25
25
|
<packageName>activesupport</packageName>
|
26
|
-
<version>6.1.
|
26
|
+
<version>6.1.4.1</version>
|
27
27
|
<licenses>
|
28
28
|
<license>
|
29
29
|
<name>MIT</name>
|
@@ -33,7 +33,7 @@
|
|
33
33
|
</dependency>
|
34
34
|
<dependency>
|
35
35
|
<packageName>addressable</packageName>
|
36
|
-
<version>2.
|
36
|
+
<version>2.8.0</version>
|
37
37
|
<licenses>
|
38
38
|
<license>
|
39
39
|
<name>Apache 2.0</name>
|
@@ -53,7 +53,7 @@
|
|
53
53
|
</dependency>
|
54
54
|
<dependency>
|
55
55
|
<packageName>bundler</packageName>
|
56
|
-
<version>2.
|
56
|
+
<version>2.2.21</version>
|
57
57
|
<licenses>
|
58
58
|
<license>
|
59
59
|
<name>MIT</name>
|
@@ -63,7 +63,7 @@
|
|
63
63
|
</dependency>
|
64
64
|
<dependency>
|
65
65
|
<packageName>codecov</packageName>
|
66
|
-
<version>0.5.
|
66
|
+
<version>0.5.2</version>
|
67
67
|
<licenses>
|
68
68
|
<license>
|
69
69
|
<name>MIT</name>
|
@@ -141,7 +141,7 @@
|
|
141
141
|
</dependency>
|
142
142
|
<dependency>
|
143
143
|
<packageName>docile</packageName>
|
144
|
-
<version>1.
|
144
|
+
<version>1.4.0</version>
|
145
145
|
<licenses>
|
146
146
|
<license>
|
147
147
|
<name>MIT</name>
|
@@ -228,16 +228,6 @@
|
|
228
228
|
<url>http://opensource.org/licenses/mit-license</url>
|
229
229
|
</license>
|
230
230
|
</licenses>
|
231
|
-
</dependency>
|
232
|
-
<dependency>
|
233
|
-
<packageName>mini_portile2</packageName>
|
234
|
-
<version>2.5.3</version>
|
235
|
-
<licenses>
|
236
|
-
<license>
|
237
|
-
<name>MIT</name>
|
238
|
-
<url>http://opensource.org/licenses/mit-license</url>
|
239
|
-
</license>
|
240
|
-
</licenses>
|
241
231
|
</dependency>
|
242
232
|
<dependency>
|
243
233
|
<packageName>minitest</packageName>
|
@@ -271,7 +261,7 @@
|
|
271
261
|
</dependency>
|
272
262
|
<dependency>
|
273
263
|
<packageName>nokogiri</packageName>
|
274
|
-
<version>1.
|
264
|
+
<version>1.12.5</version>
|
275
265
|
<licenses>
|
276
266
|
<license>
|
277
267
|
<name>MIT</name>
|
@@ -301,7 +291,7 @@
|
|
301
291
|
</dependency>
|
302
292
|
<dependency>
|
303
293
|
<packageName>pry</packageName>
|
304
|
-
<version>0.
|
294
|
+
<version>0.14.1</version>
|
305
295
|
<licenses>
|
306
296
|
<license>
|
307
297
|
<name>MIT</name>
|
@@ -321,7 +311,7 @@
|
|
321
311
|
</dependency>
|
322
312
|
<dependency>
|
323
313
|
<packageName>racc</packageName>
|
324
|
-
<version>1.
|
314
|
+
<version>1.6.0</version>
|
325
315
|
<licenses>
|
326
316
|
<license>
|
327
317
|
<name>ruby</name>
|
@@ -385,7 +375,7 @@
|
|
385
375
|
</dependency>
|
386
376
|
<dependency>
|
387
377
|
<packageName>rspec-mocks</packageName>
|
388
|
-
<version>3.10.
|
378
|
+
<version>3.10.2</version>
|
389
379
|
<licenses>
|
390
380
|
<license>
|
391
381
|
<name>MIT</name>
|
@@ -395,7 +385,7 @@
|
|
395
385
|
</dependency>
|
396
386
|
<dependency>
|
397
387
|
<packageName>rspec-support</packageName>
|
398
|
-
<version>3.10.
|
388
|
+
<version>3.10.2</version>
|
399
389
|
<licenses>
|
400
390
|
<license>
|
401
391
|
<name>MIT</name>
|
@@ -405,7 +395,7 @@
|
|
405
395
|
</dependency>
|
406
396
|
<dependency>
|
407
397
|
<packageName>ruby2_keywords</packageName>
|
408
|
-
<version>0.0.
|
398
|
+
<version>0.0.5</version>
|
409
399
|
<licenses>
|
410
400
|
<license>
|
411
401
|
<name>ruby</name>
|
@@ -449,7 +439,7 @@
|
|
449
439
|
</dependency>
|
450
440
|
<dependency>
|
451
441
|
<packageName>simplecov_json_formatter</packageName>
|
452
|
-
<version>0.1.
|
442
|
+
<version>0.1.3</version>
|
453
443
|
<licenses>
|
454
444
|
<license>
|
455
445
|
<name>MIT</name>
|
@@ -489,7 +479,7 @@
|
|
489
479
|
</dependency>
|
490
480
|
<dependency>
|
491
481
|
<packageName>webmock</packageName>
|
492
|
-
<version>3.
|
482
|
+
<version>3.13.0</version>
|
493
483
|
<licenses>
|
494
484
|
<license>
|
495
485
|
<name>MIT</name>
|
@@ -519,7 +509,7 @@
|
|
519
509
|
</dependency>
|
520
510
|
<dependency>
|
521
511
|
<packageName>zeitwerk</packageName>
|
522
|
-
<version>2.
|
512
|
+
<version>2.5.1</version>
|
523
513
|
<licenses>
|
524
514
|
<license>
|
525
515
|
<name>MIT</name>
|