3scale_toolbox 0.17.1 → 0.18.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 (95) hide show
  1. checksums.yaml +4 -4
  2. data/3scale_toolbox.gemspec +1 -1
  3. data/README.md +6 -3
  4. data/lib/3scale_toolbox.rb +3 -0
  5. data/lib/3scale_toolbox/3scale_client_factory.rb +3 -4
  6. data/lib/3scale_toolbox/commands.rb +2 -0
  7. data/lib/3scale_toolbox/commands/backend_command/copy_command/copy_mapping_rules_task.rb +11 -27
  8. data/lib/3scale_toolbox/commands/backend_command/copy_command/copy_methods_task.rb +5 -10
  9. data/lib/3scale_toolbox/commands/backend_command/copy_command/copy_metrics_task.rb +4 -4
  10. data/lib/3scale_toolbox/commands/backend_command/copy_command/create_or_update_target_backend_task.rb +3 -2
  11. data/lib/3scale_toolbox/commands/backend_command/copy_command/task.rb +10 -32
  12. data/lib/3scale_toolbox/commands/import_command/issuer_type_transformer.rb +16 -0
  13. data/lib/3scale_toolbox/commands/import_command/openapi.rb +3 -0
  14. data/lib/3scale_toolbox/commands/import_command/openapi/create_mapping_rule_step.rb +2 -1
  15. data/lib/3scale_toolbox/commands/import_command/openapi/create_method_step.rb +3 -12
  16. data/lib/3scale_toolbox/commands/import_command/openapi/step.rb +4 -0
  17. data/lib/3scale_toolbox/commands/import_command/openapi/update_service_proxy_step.rb +1 -0
  18. data/lib/3scale_toolbox/commands/methods_command/apply_command.rb +2 -4
  19. data/lib/3scale_toolbox/commands/methods_command/create_command.rb +0 -2
  20. data/lib/3scale_toolbox/commands/methods_command/delete_command.rb +1 -1
  21. data/lib/3scale_toolbox/commands/methods_command/list_command.rb +1 -9
  22. data/lib/3scale_toolbox/commands/metrics_command/list_command.rb +1 -1
  23. data/lib/3scale_toolbox/commands/plans_command/export/read_plan_limits_step.rb +1 -1
  24. data/lib/3scale_toolbox/commands/plans_command/export/read_plan_methods_step.rb +2 -2
  25. data/lib/3scale_toolbox/commands/plans_command/export/read_plan_metrics_step.rb +2 -2
  26. data/lib/3scale_toolbox/commands/plans_command/export/read_plan_pricing_rules_step.rb +1 -2
  27. data/lib/3scale_toolbox/commands/plans_command/export/step.rb +8 -20
  28. data/lib/3scale_toolbox/commands/plans_command/import/import_plan_limits_step.rb +7 -8
  29. data/lib/3scale_toolbox/commands/plans_command/import/import_plan_metrics_step.rb +6 -13
  30. data/lib/3scale_toolbox/commands/plans_command/import/import_plan_pricing_rules_step.rb +8 -15
  31. data/lib/3scale_toolbox/commands/plans_command/import/step.rb +2 -22
  32. data/lib/3scale_toolbox/commands/plans_command/list_command.rb +1 -1
  33. data/lib/3scale_toolbox/commands/plans_command/show_command.rb +1 -1
  34. data/lib/3scale_toolbox/commands/policies_command.rb +24 -0
  35. data/lib/3scale_toolbox/commands/policies_command/export_command.rb +98 -0
  36. data/lib/3scale_toolbox/commands/policies_command/import_command.rb +61 -0
  37. data/lib/3scale_toolbox/commands/product_command.rb +4 -0
  38. data/lib/3scale_toolbox/commands/product_command/copy_command.rb +7 -3
  39. data/lib/3scale_toolbox/commands/product_command/copy_command/copy_backends_task.rb +22 -5
  40. data/lib/3scale_toolbox/commands/product_command/export_command.rb +81 -0
  41. data/lib/3scale_toolbox/commands/product_command/import_command.rb +125 -0
  42. data/lib/3scale_toolbox/commands/proxy_config_command.rb +2 -0
  43. data/lib/3scale_toolbox/commands/proxy_config_command/deploy_command.rb +54 -0
  44. data/lib/3scale_toolbox/commands/service_command/copy_command/copy_activedocs_task.rb +15 -12
  45. data/lib/3scale_toolbox/commands/service_command/copy_command/copy_app_plans_task.rb +15 -15
  46. data/lib/3scale_toolbox/commands/service_command/copy_command/copy_limits_task.rb +12 -13
  47. data/lib/3scale_toolbox/commands/service_command/copy_command/copy_mapping_rules_task.rb +11 -11
  48. data/lib/3scale_toolbox/commands/service_command/copy_command/copy_methods_task.rb +8 -9
  49. data/lib/3scale_toolbox/commands/service_command/copy_command/copy_metrics_task.rb +8 -8
  50. data/lib/3scale_toolbox/commands/service_command/copy_command/copy_policies_task.rb +1 -1
  51. data/lib/3scale_toolbox/commands/service_command/copy_command/copy_pricingrules_task.rb +15 -18
  52. data/lib/3scale_toolbox/commands/service_command/copy_command/copy_service_proxy_task.rb +2 -2
  53. data/lib/3scale_toolbox/commands/service_command/copy_command/create_or_update_service_task.rb +2 -1
  54. data/lib/3scale_toolbox/commands/service_command/copy_command/destroy_mapping_rules_task.rb +9 -5
  55. data/lib/3scale_toolbox/commands/service_command/copy_command/task.rb +20 -34
  56. data/lib/3scale_toolbox/commands/update_command/service_command/delete_activedocs_task.rb +1 -3
  57. data/lib/3scale_toolbox/crds.rb +16 -0
  58. data/lib/3scale_toolbox/crds/application_plan_dump.rb +19 -0
  59. data/lib/3scale_toolbox/crds/backend_dump.rb +39 -0
  60. data/lib/3scale_toolbox/crds/backend_mapping_rule_dump.rb +26 -0
  61. data/lib/3scale_toolbox/crds/backend_method_dump.rb +12 -0
  62. data/lib/3scale_toolbox/crds/backend_metric_dump.rb +13 -0
  63. data/lib/3scale_toolbox/crds/backend_parser.rb +55 -0
  64. data/lib/3scale_toolbox/crds/backend_usage_dump.rb +11 -0
  65. data/lib/3scale_toolbox/crds/limit_dump.rb +37 -0
  66. data/lib/3scale_toolbox/crds/mapping_rule_dump.rb +26 -0
  67. data/lib/3scale_toolbox/crds/method_dump.rb +12 -0
  68. data/lib/3scale_toolbox/crds/metric_dump.rb +13 -0
  69. data/lib/3scale_toolbox/crds/pricing_rule_dump.rb +38 -0
  70. data/lib/3scale_toolbox/crds/product_deployment_parser.rb +329 -0
  71. data/lib/3scale_toolbox/crds/product_dump.rb +157 -0
  72. data/lib/3scale_toolbox/crds/product_parser.rb +114 -0
  73. data/lib/3scale_toolbox/crds/remote.rb +682 -0
  74. data/lib/3scale_toolbox/entities.rb +3 -0
  75. data/lib/3scale_toolbox/entities/activedocs.rb +12 -0
  76. data/lib/3scale_toolbox/entities/application_plan.rb +54 -46
  77. data/lib/3scale_toolbox/entities/backend.rb +65 -30
  78. data/lib/3scale_toolbox/entities/backend_mapping_rule.rb +29 -3
  79. data/lib/3scale_toolbox/entities/backend_method.rb +25 -16
  80. data/lib/3scale_toolbox/entities/backend_metric.rb +12 -2
  81. data/lib/3scale_toolbox/entities/backend_usage.rb +7 -1
  82. data/lib/3scale_toolbox/entities/limit.rb +71 -0
  83. data/lib/3scale_toolbox/entities/mapping_rule.rb +90 -0
  84. data/lib/3scale_toolbox/entities/method.rb +33 -19
  85. data/lib/3scale_toolbox/entities/metric.rb +29 -18
  86. data/lib/3scale_toolbox/entities/pricing_rule.rb +63 -0
  87. data/lib/3scale_toolbox/entities/proxy_config.rb +0 -1
  88. data/lib/3scale_toolbox/entities/service.rb +149 -46
  89. data/lib/3scale_toolbox/helper.rb +13 -16
  90. data/lib/3scale_toolbox/proxy_logger.rb +4 -0
  91. data/lib/3scale_toolbox/remote_cache.rb +157 -0
  92. data/lib/3scale_toolbox/remotes.rb +2 -2
  93. data/lib/3scale_toolbox/version.rb +1 -1
  94. data/licenses.xml +58 -50
  95. metadata +33 -6
@@ -0,0 +1,12 @@
1
+ module ThreeScaleToolbox
2
+ module CRD
3
+ module BackendMethodSerializer
4
+ def to_cr
5
+ {
6
+ 'friendlyName' => friendly_name,
7
+ 'description' => description,
8
+ }
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,13 @@
1
+ module ThreeScaleToolbox
2
+ module CRD
3
+ module BackendMetricSerializer
4
+ def to_cr
5
+ {
6
+ 'friendlyName' => friendly_name,
7
+ 'unit' => unit,
8
+ 'description' => description,
9
+ }
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,55 @@
1
+ module ThreeScaleToolbox
2
+ module CRD
3
+ class BackendParser
4
+ Metric = Struct.new(:system_name, :friendly_name, :description, :unit)
5
+ Method = Struct.new(:system_name, :friendly_name, :description)
6
+ MappingRule = Struct.new(:metric_ref, :http_method, :pattern, :delta, :last)
7
+
8
+ attr_reader :cr
9
+
10
+ def initialize(cr)
11
+ @cr = cr
12
+ end
13
+
14
+ def system_name
15
+ cr.dig('spec', 'systemName')
16
+ end
17
+
18
+ def name
19
+ cr.dig('spec', 'name')
20
+ end
21
+
22
+ def description
23
+ cr.dig('spec', 'description')
24
+ end
25
+
26
+ def private_endpoint
27
+ cr.dig('spec', 'privateBaseURL')
28
+ end
29
+
30
+ def metrics
31
+ @metrics ||= (cr.dig('spec', 'metrics') || {}).map do |system_name, metric|
32
+ Metric.new(system_name, metric['friendlyName'], metric['description'], metric['unit'])
33
+ end
34
+ end
35
+
36
+ def methods
37
+ @methods ||= (cr.dig('spec', 'methods') || {}).map do |system_name, method|
38
+ Method.new(system_name, method['friendlyName'], method['description'])
39
+ end
40
+ end
41
+
42
+ def mapping_rules
43
+ @mapping_rules ||= (cr.dig('spec', 'mappingRules') || []).map do |mapping_rule|
44
+ MappingRule.new(mapping_rule['metricMethodRef'], mapping_rule['httpMethod'],
45
+ mapping_rule['pattern'], mapping_rule['increment'], mapping_rule['last'])
46
+ end
47
+ end
48
+
49
+ # Metrics and methods index by system_name
50
+ def metrics_index
51
+ @metrics_index ||= (methods + metrics).each_with_object({}) { |metric, h| h[metric.system_name] = metric }
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,11 @@
1
+ module ThreeScaleToolbox
2
+ module CRD
3
+ module BackendUsageSerializer
4
+ def to_cr
5
+ {
6
+ 'path' => path
7
+ }
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,37 @@
1
+ module ThreeScaleToolbox
2
+ module CRD
3
+ module Limit
4
+ def to_cr
5
+ {
6
+ 'period' => period,
7
+ 'value' => value,
8
+ 'metricMethodRef' => metric_system_name,
9
+ }
10
+ end
11
+
12
+ def metric_system_name
13
+ # Find in service methods
14
+ # Find in service metrics
15
+ # Find in backend methods
16
+ # Find in backend metrics
17
+ if (method = plan.service.methods.find { |m| m.id == metric_id })
18
+ { 'systemName' => method.system_name }
19
+ elsif (metric = plan.service.metrics.find { |m| m.id == metric_id })
20
+ { 'systemName' => metric.system_name }
21
+ elsif (backend = backend_from_metric)
22
+ if (backend_metric = backend.metrics.find { |m| m.id == metric_id })
23
+ { 'systemName' => backend_metric.system_name, 'backend' => backend.system_name }
24
+ elsif (backend_method = backend.methods.find { |m| m.id == metric_id })
25
+ { 'systemName' => backend_method.system_name, 'backend' => backend.system_name }
26
+ else
27
+ raise ThreeScaleToolbox::Error, "Unexpected error. Limit #{id} " \
28
+ "referencing to metric id #{metric_id} which has not been found"
29
+ end
30
+ else
31
+ raise ThreeScaleToolbox::Error, "Unexpected error. Limit #{id} " \
32
+ "referencing to metric id #{metric_id} which has not been found"
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,26 @@
1
+ module ThreeScaleToolbox
2
+ module CRD
3
+ module MappingRuleSerializer
4
+ def to_cr
5
+ {
6
+ 'httpMethod' => http_method,
7
+ 'pattern' => pattern,
8
+ 'metricMethodRef' => metric_method_ref,
9
+ 'increment' => delta,
10
+ 'last' => last,
11
+ }
12
+ end
13
+
14
+ def metric_method_ref
15
+ if (method = service.methods.find { |m| m.id == metric_id })
16
+ method.system_name
17
+ elsif (metric = service.metrics.find { |m| m.id == metric_id })
18
+ metric.system_name
19
+ else
20
+ raise ThreeScaleToolbox::Error, "Unexpected error. Service #{service.system_name} " \
21
+ "mapping rule #{id} referencing to metric id #{metric_id} which has not been found"
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,12 @@
1
+ module ThreeScaleToolbox
2
+ module CRD
3
+ module MethodSerializer
4
+ def to_cr
5
+ {
6
+ 'friendlyName' => friendly_name,
7
+ 'description' => description,
8
+ }
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,13 @@
1
+ module ThreeScaleToolbox
2
+ module CRD
3
+ module MetricSerializer
4
+ def to_cr
5
+ {
6
+ 'friendlyName' => friendly_name,
7
+ 'unit' => unit,
8
+ 'description' => description,
9
+ }
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,38 @@
1
+ module ThreeScaleToolbox
2
+ module CRD
3
+ module PricingRuleSerializer
4
+ def to_cr
5
+ {
6
+ 'from' => min,
7
+ 'to' => max,
8
+ 'pricePerUnit' => cost_per_unit,
9
+ 'metricMethodRef' => metric_system_name,
10
+ }
11
+ end
12
+
13
+ def metric_system_name
14
+ # Find in service methods
15
+ # Find in service metrics
16
+ # Find in backend methods
17
+ # Find in backend metrics
18
+ if (method = plan.service.methods.find { |m| m.id == metric_id })
19
+ { 'systemName' => method.system_name }
20
+ elsif (metric = plan.service.metrics.find { |m| m.id == metric_id })
21
+ { 'systemName' => metric.system_name }
22
+ elsif (backend = backend_from_metric)
23
+ if (backend_metric = backend.metrics.find { |m| m.id == metric_id })
24
+ { 'systemName' => backend_metric.system_name, 'backend' => backend.system_name }
25
+ elsif (backend_method = backend.methods.find { |m| m.id == metric_id })
26
+ { 'systemName' => backend_method.system_name, 'backend' => backend.system_name }
27
+ else
28
+ raise ThreeScaleToolbox::Error, "Unexpected error. PricingRule #{id} " \
29
+ "referencing to metric id #{metric_id} which has not been found"
30
+ end
31
+ else
32
+ raise ThreeScaleToolbox::Error, "Unexpected error. PricingRule #{id} " \
33
+ "referencing to metric id #{metric_id} which has not been found"
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,329 @@
1
+ module ThreeScaleToolbox
2
+ module CRD
3
+ # ProductDeploymentCRDParser parses CRD Format
4
+ # https://github.com/3scale/3scale-operator/blob/3scale-2.10.0-CR2/doc/product-reference.md#productdeploymentspec
5
+ class ProductDeploymentParser
6
+ class ApicastHostedParser
7
+ attr_reader :authentication_parser
8
+
9
+ def initialize(cr)
10
+ @authentication_parser = AuthenticationParser.new(cr.fetch('authentication', {}))
11
+ end
12
+
13
+ def deployment_option
14
+ 'hosted'
15
+ end
16
+
17
+ def method_missing(name, *args)
18
+ authentication_parser.public_send(name, *args)
19
+ end
20
+
21
+ def respond_to_missing?(method_name, include_private = false)
22
+ super
23
+ end
24
+ end
25
+
26
+ class ApicastSelfManagedParser
27
+ attr_reader :authentication_parser, :cr
28
+
29
+ def initialize(cr)
30
+ @cr = cr
31
+ @authentication_parser = AuthenticationParser.new(cr.fetch('authentication', {}))
32
+ end
33
+
34
+ def deployment_option
35
+ 'self_managed'
36
+ end
37
+
38
+ def endpoint
39
+ cr['productionPublicBaseURL']
40
+ end
41
+
42
+ def sandbox_endpoint
43
+ cr['stagingPublicBaseURL']
44
+ end
45
+
46
+ def method_missing(name, *args)
47
+ authentication_parser.public_send(name, *args)
48
+ end
49
+
50
+ def respond_to_missing?(method_name, include_private = false)
51
+ super
52
+ end
53
+ end
54
+
55
+ class AuthenticationParser
56
+ attr_reader :parser
57
+
58
+ def initialize(cr)
59
+ @parser = if cr.has_key? 'userkey'
60
+ UserKeyParser.new(cr.fetch('userkey'))
61
+ elsif cr.has_key? 'appKeyAppID'
62
+ AppKeyParser.new(cr.fetch('appKeyAppID'))
63
+ elsif cr.has_key? 'oidc'
64
+ OidcParser.new(cr.fetch('oidc'))
65
+ else
66
+ raise ThreeScaleToolbox::Error, "Unknown authentication option: #{cr.keys}"
67
+ end
68
+ end
69
+
70
+
71
+ def method_missing(name, *args)
72
+ parser.public_send(name, *args)
73
+ end
74
+
75
+ def respond_to_missing?(method_name, include_private = false)
76
+ super
77
+ end
78
+ end
79
+
80
+ class AppKeyParser
81
+
82
+ attr_reader :cr, :security_parser, :gaterway_response_parser
83
+
84
+ def initialize(cr)
85
+ @cr = cr
86
+ @security_parser = SecurityParser.new(cr.fetch('security', {}))
87
+ @gaterway_response_parser = GatewayResponseParser.new(cr.fetch('gatewayResponse', {}))
88
+ end
89
+
90
+ def auth_app_id
91
+ cr['appID']
92
+ end
93
+
94
+ def auth_app_key
95
+ cr['appKey']
96
+ end
97
+
98
+ def credentials_location
99
+ cr['credentials']
100
+ end
101
+
102
+ def backend_version
103
+ '2'
104
+ end
105
+
106
+ def method_missing(name, *args)
107
+ res = security_parser.public_send(name, *args)
108
+ return res unless res.nil?
109
+
110
+ gaterway_response_parser.public_send(name, *args)
111
+ end
112
+
113
+ def respond_to_missing?(method_name, include_private = false)
114
+ super
115
+ end
116
+ end
117
+
118
+ class UserKeyParser
119
+ attr_reader :cr, :security_parser, :gaterway_response_parser
120
+
121
+ def initialize(cr)
122
+ @cr = cr
123
+ @security_parser = SecurityParser.new(cr.fetch('security', {}))
124
+ @gaterway_response_parser = GatewayResponseParser.new(cr.fetch('gatewayResponse', {}))
125
+ end
126
+
127
+ def backend_version
128
+ '1'
129
+ end
130
+
131
+ def auth_user_key
132
+ cr['authUserKey']
133
+ end
134
+
135
+ def credentials_location
136
+ cr['credentials']
137
+ end
138
+
139
+ def method_missing(name, *args)
140
+ res = security_parser.public_send(name, *args)
141
+ return res unless res.nil?
142
+
143
+ gaterway_response_parser.public_send(name, *args)
144
+ end
145
+
146
+ def respond_to_missing?(method_name, include_private = false)
147
+ super
148
+ end
149
+ end
150
+
151
+ class OidcParser
152
+ attr_reader :cr, :security_parser, :gaterway_response_parser, :authentication_flow_parser
153
+
154
+ def initialize(cr)
155
+ @cr = cr
156
+ @security_parser = SecurityParser.new(cr.fetch('security', {}))
157
+ @gaterway_response_parser = GatewayResponseParser.new(cr.fetch('gatewayResponse', {}))
158
+ @authentication_flow_parser = AuthenticationFlowParser.new(cr.fetch('authenticationFlow', {}))
159
+ end
160
+
161
+ def backend_version
162
+ 'oidc'
163
+ end
164
+
165
+ def credentials_location
166
+ cr['credentials']
167
+ end
168
+
169
+ def oidc_issuer_endpoint
170
+ cr['issuerEndpoint']
171
+ end
172
+
173
+ def oidc_issuer_type
174
+ cr['issuerType']
175
+ end
176
+
177
+ def jwt_claim_with_client_id
178
+ cr['jwtClaimWithClientID']
179
+ end
180
+
181
+ def jwt_claim_with_client_id_type
182
+ cr['jwtClaimWithClientIDType']
183
+ end
184
+
185
+ def method_missing(name, *args)
186
+ res = authentication_flow_parser.public_send(name, *args)
187
+ return res unless res.nil?
188
+
189
+ res = security_parser.public_send(name, *args)
190
+ return res unless res.nil?
191
+
192
+ gaterway_response_parser.public_send(name, *args)
193
+ end
194
+
195
+ def respond_to_missing?(method_name, include_private = false)
196
+ super
197
+ end
198
+ end
199
+
200
+ class SecurityParser
201
+ attr_reader :cr
202
+
203
+ def initialize(cr)
204
+ @cr = cr
205
+ end
206
+
207
+ def secret_token
208
+ cr['secretToken']
209
+ end
210
+
211
+ def hostname_rewrite
212
+ cr['hostHeader']
213
+ end
214
+
215
+ def method_missing(name, *args)
216
+ nil
217
+ end
218
+ end
219
+
220
+ class GatewayResponseParser
221
+ attr_reader :cr
222
+
223
+ def initialize(cr)
224
+ @cr = cr
225
+ end
226
+
227
+ def error_auth_failed
228
+ cr['errorAuthFailed']
229
+ end
230
+
231
+ def error_auth_missing
232
+ cr['errorAuthMissing']
233
+ end
234
+
235
+ def error_status_auth_failed
236
+ cr['errorStatusAuthFailed']
237
+ end
238
+
239
+ def error_headers_auth_failed
240
+ cr['errorHeadersAuthFailed']
241
+ end
242
+
243
+ def error_status_auth_missing
244
+ cr['errorStatusAuthMissing']
245
+ end
246
+
247
+ def error_headers_auth_missing
248
+ cr['errorHeadersAuthMissing']
249
+ end
250
+
251
+ def error_no_match
252
+ cr['errorNoMatch']
253
+ end
254
+
255
+ def error_status_no_match
256
+ cr['errorStatusNoMatch']
257
+ end
258
+
259
+ def error_headers_no_match
260
+ cr['errorHeadersNoMatch']
261
+ end
262
+
263
+ def error_limits_exceeded
264
+ cr['errorLimitsExceeded']
265
+ end
266
+
267
+ def error_status_limits_exceeded
268
+ cr['errorStatusLimitsExceeded']
269
+ end
270
+
271
+ def error_headers_limits_exceeded
272
+ cr['errorHeadersLimitsExceeded']
273
+ end
274
+
275
+ def method_missing(name, *args)
276
+ nil
277
+ end
278
+ end
279
+
280
+ class AuthenticationFlowParser
281
+ attr_reader :cr
282
+
283
+ def initialize(cr)
284
+ @cr = cr
285
+ end
286
+
287
+ def standard_flow_enabled
288
+ cr.fetch('standardFlowEnabled', false)
289
+ end
290
+
291
+ def implicit_flow_enabled
292
+ cr.fetch('implicitFlowEnabled', false)
293
+ end
294
+
295
+ def service_accounts_enabled
296
+ cr.fetch('serviceAccountsEnabled', false)
297
+ end
298
+
299
+ def direct_access_grants_enabled
300
+ cr.fetch('directAccessGrantsEnabled', false)
301
+ end
302
+
303
+ def method_missing(name, *args)
304
+ nil
305
+ end
306
+ end
307
+
308
+ attr_reader :deployment_parser
309
+
310
+ def initialize(cr)
311
+ @deployment_parser = if cr.has_key? 'apicastSelfManaged'
312
+ ApicastSelfManagedParser.new(cr.fetch('apicastSelfManaged'))
313
+ elsif cr.has_key? 'apicastHosted'
314
+ ApicastHostedParser.new(cr.fetch('apicastHosted'))
315
+ else
316
+ raise ThreeScaleToolbox::Error, "Unknown deployment option: #{cr.keys}"
317
+ end
318
+ end
319
+
320
+ def method_missing(name, *args)
321
+ deployment_parser.public_send(name, *args)
322
+ end
323
+
324
+ def respond_to_missing?(method_name, include_private = false)
325
+ super
326
+ end
327
+ end
328
+ end
329
+ end