3scale_toolbox 0.15.0 → 0.18.2
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 +2 -2
- data/README.md +15 -9
- data/lib/3scale_toolbox.rb +3 -1
- data/lib/3scale_toolbox/3scale_client_factory.rb +3 -4
- 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 +7 -1
- data/lib/3scale_toolbox/commands/activedocs_command/apply_command.rb +33 -10
- data/lib/3scale_toolbox/commands/activedocs_command/create_command.rb +22 -7
- data/lib/3scale_toolbox/commands/activedocs_command/list_command.rb +10 -17
- 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 +36 -0
- data/lib/3scale_toolbox/commands/backend_command/copy_command/copy_methods_task.rb +35 -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 +46 -0
- data/lib/3scale_toolbox/commands/backend_command/copy_command/task.rb +67 -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/issuer_type_transformer.rb +16 -0
- data/lib/3scale_toolbox/commands/import_command/openapi.rb +6 -2
- data/lib/3scale_toolbox/commands/import_command/openapi/create_mapping_rule_step.rb +2 -1
- data/lib/3scale_toolbox/commands/import_command/openapi/create_method_step.rb +5 -14
- data/lib/3scale_toolbox/commands/import_command/openapi/step.rb +4 -0
- data/lib/3scale_toolbox/commands/import_command/openapi/update_service_proxy_step.rb +1 -0
- data/lib/3scale_toolbox/commands/methods_command/apply_command.rb +28 -8
- data/lib/3scale_toolbox/commands/methods_command/create_command.rb +23 -3
- data/lib/3scale_toolbox/commands/methods_command/delete_command.rb +1 -1
- data/lib/3scale_toolbox/commands/methods_command/list_command.rb +7 -13
- 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/export/read_plan_limits_step.rb +1 -1
- data/lib/3scale_toolbox/commands/plans_command/export/read_plan_methods_step.rb +2 -2
- data/lib/3scale_toolbox/commands/plans_command/export/read_plan_metrics_step.rb +2 -2
- data/lib/3scale_toolbox/commands/plans_command/export/read_plan_pricing_rules_step.rb +1 -2
- data/lib/3scale_toolbox/commands/plans_command/export/step.rb +8 -20
- data/lib/3scale_toolbox/commands/plans_command/import/import_plan_limits_step.rb +12 -14
- data/lib/3scale_toolbox/commands/plans_command/import/import_plan_metrics_step.rb +6 -13
- data/lib/3scale_toolbox/commands/plans_command/import/import_plan_pricing_rules_step.rb +12 -20
- data/lib/3scale_toolbox/commands/plans_command/import/step.rb +2 -22
- data/lib/3scale_toolbox/commands/plans_command/list_command.rb +8 -13
- data/lib/3scale_toolbox/commands/plans_command/show_command.rb +7 -15
- data/lib/3scale_toolbox/commands/policies_command.rb +24 -0
- data/lib/3scale_toolbox/commands/policies_command/export_command.rb +98 -0
- data/lib/3scale_toolbox/commands/policies_command/import_command.rb +61 -0
- data/lib/3scale_toolbox/commands/product_command.rb +26 -0
- data/lib/3scale_toolbox/commands/product_command/copy_command.rb +82 -0
- data/lib/3scale_toolbox/commands/product_command/copy_command/copy_backends_task.rb +88 -0
- data/lib/3scale_toolbox/commands/product_command/copy_command/delete_target_backend_usages_task.rb +48 -0
- data/lib/3scale_toolbox/commands/product_command/export_command.rb +81 -0
- data/lib/3scale_toolbox/commands/product_command/import_command.rb +125 -0
- data/lib/3scale_toolbox/commands/proxy_config_command.rb +5 -0
- data/lib/3scale_toolbox/commands/proxy_config_command/deploy_command.rb +54 -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 +49 -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 +38 -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 +37 -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 +41 -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 +49 -0
- data/lib/3scale_toolbox/commands/service_command/copy_command/destroy_mapping_rules_task.rb +38 -0
- data/lib/3scale_toolbox/commands/service_command/copy_command/task.rb +85 -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 +24 -0
- data/lib/3scale_toolbox/crds.rb +16 -0
- data/lib/3scale_toolbox/crds/application_plan_dump.rb +19 -0
- data/lib/3scale_toolbox/crds/backend_dump.rb +39 -0
- data/lib/3scale_toolbox/crds/backend_mapping_rule_dump.rb +26 -0
- data/lib/3scale_toolbox/crds/backend_method_dump.rb +12 -0
- data/lib/3scale_toolbox/crds/backend_metric_dump.rb +13 -0
- data/lib/3scale_toolbox/crds/backend_parser.rb +55 -0
- data/lib/3scale_toolbox/crds/backend_usage_dump.rb +11 -0
- data/lib/3scale_toolbox/crds/limit_dump.rb +37 -0
- data/lib/3scale_toolbox/crds/mapping_rule_dump.rb +26 -0
- data/lib/3scale_toolbox/crds/method_dump.rb +12 -0
- data/lib/3scale_toolbox/crds/metric_dump.rb +13 -0
- data/lib/3scale_toolbox/crds/pricing_rule_dump.rb +38 -0
- data/lib/3scale_toolbox/crds/product_deployment_parser.rb +329 -0
- data/lib/3scale_toolbox/crds/product_dump.rb +157 -0
- data/lib/3scale_toolbox/crds/product_parser.rb +114 -0
- data/lib/3scale_toolbox/crds/remote.rb +682 -0
- data/lib/3scale_toolbox/entities.rb +8 -0
- data/lib/3scale_toolbox/entities/activedocs.rb +12 -0
- data/lib/3scale_toolbox/entities/application_plan.rb +74 -39
- data/lib/3scale_toolbox/entities/backend.rb +187 -0
- data/lib/3scale_toolbox/entities/backend_mapping_rule.rb +102 -0
- data/lib/3scale_toolbox/entities/backend_method.rb +99 -0
- data/lib/3scale_toolbox/entities/backend_metric.rb +98 -0
- data/lib/3scale_toolbox/entities/backend_usage.rb +105 -0
- data/lib/3scale_toolbox/entities/limit.rb +71 -0
- data/lib/3scale_toolbox/entities/mapping_rule.rb +90 -0
- data/lib/3scale_toolbox/entities/method.rb +33 -19
- data/lib/3scale_toolbox/entities/metric.rb +29 -18
- data/lib/3scale_toolbox/entities/pricing_rule.rb +63 -0
- data/lib/3scale_toolbox/entities/proxy_config.rb +0 -1
- data/lib/3scale_toolbox/entities/service.rb +166 -48
- data/lib/3scale_toolbox/error.rb +53 -0
- data/lib/3scale_toolbox/helper.rb +17 -0
- data/lib/3scale_toolbox/openapi/oas3.rb +1 -1
- data/lib/3scale_toolbox/proxy_logger.rb +5 -1
- data/lib/3scale_toolbox/remote_cache.rb +157 -0
- data/lib/3scale_toolbox/remotes.rb +2 -2
- data/lib/3scale_toolbox/version.rb +1 -1
- data/licenses.xml +113 -45
- metadata +75 -26
- data/lib/3scale_toolbox/commands/copy_command/copy_service.rb +0 -144
- 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 -13
- 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,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
|
@@ -0,0 +1,157 @@
|
|
1
|
+
module ThreeScaleToolbox
|
2
|
+
module CRD
|
3
|
+
module ProductSerializer
|
4
|
+
def to_cr
|
5
|
+
{
|
6
|
+
'apiVersion' => 'capabilities.3scale.net/v1beta1',
|
7
|
+
'kind' => 'Product',
|
8
|
+
'metadata' => {
|
9
|
+
'annotations' => {
|
10
|
+
'3scale_toolbox_created_at' => Time.now.utc.iso8601,
|
11
|
+
'3scale_toolbox_version' => ThreeScaleToolbox::VERSION
|
12
|
+
},
|
13
|
+
'name' => cr_name
|
14
|
+
},
|
15
|
+
'spec' => {
|
16
|
+
'name' => name,
|
17
|
+
'systemName' => system_name,
|
18
|
+
'description' => description,
|
19
|
+
'mappingRules' => mapping_rules.map(&:to_cr),
|
20
|
+
'metrics' => metrics.each_with_object({}) do |metric, hash|
|
21
|
+
hash[metric.system_name] = metric.to_cr
|
22
|
+
end,
|
23
|
+
'methods' => methods.each_with_object({}) do |method, hash|
|
24
|
+
hash[method.system_name] = method.to_cr
|
25
|
+
end,
|
26
|
+
'policies' => policies,
|
27
|
+
'applicationPlans' => plans.each_with_object({}) do |app_plan, hash|
|
28
|
+
hash[app_plan.system_name] = app_plan.to_cr
|
29
|
+
end,
|
30
|
+
'backendUsages' => backend_usage_list.each_with_object({}) do |backend_usage, hash|
|
31
|
+
hash[backend_usage.backend.system_name] = backend_usage.to_cr
|
32
|
+
end,
|
33
|
+
'deployment' => deployment_to_cr
|
34
|
+
}
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
def cr_name
|
39
|
+
# Should be DNS1123 subdomain name
|
40
|
+
# TODO run validation for DNS1123
|
41
|
+
# https://kubernetes.io/docs/concepts/overview/working-with-objects/names/
|
42
|
+
"#{system_name.gsub(/[^[a-zA-Z0-9\-\.]]/, '.')}.#{Helper.random_lowercase_name}"
|
43
|
+
end
|
44
|
+
|
45
|
+
def deployment_to_cr
|
46
|
+
case deployment_option
|
47
|
+
when 'hosted'
|
48
|
+
hosted_deployment_to_cr
|
49
|
+
when 'self_managed'
|
50
|
+
self_managed_deployment_to_cr
|
51
|
+
else
|
52
|
+
raise ThreeScaleToolbox::Error, "Unknown deployment option: #{deployment_option}"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def hosted_deployment_to_cr
|
57
|
+
{
|
58
|
+
'apicastHosted' => { 'authentication' => authentication_to_cr }
|
59
|
+
}
|
60
|
+
end
|
61
|
+
|
62
|
+
def self_managed_deployment_to_cr
|
63
|
+
{
|
64
|
+
'apicastSelfManaged' => {
|
65
|
+
'authentication' => authentication_to_cr,
|
66
|
+
'stagingPublicBaseURL' => cached_proxy['sandbox_endpoint'],
|
67
|
+
'productionPublicBaseURL' => cached_proxy['endpoint']
|
68
|
+
}
|
69
|
+
}
|
70
|
+
end
|
71
|
+
|
72
|
+
def authentication_to_cr
|
73
|
+
case backend_version
|
74
|
+
when '1'
|
75
|
+
userkey_authentication_to_cr
|
76
|
+
when '2'
|
77
|
+
appkey_authentication_to_cr
|
78
|
+
when 'oidc'
|
79
|
+
oidc_authentication_to_cr
|
80
|
+
else
|
81
|
+
raise ThreeScaleToolbox::Error, "Unknown backend_version: #{backend_version}"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def userkey_authentication_to_cr
|
86
|
+
{
|
87
|
+
'userkey' => {
|
88
|
+
'authUserKey' => cached_proxy['auth_user_key'],
|
89
|
+
'credentials' => cached_proxy['credentials_location'],
|
90
|
+
'security' => security_to_cr,
|
91
|
+
'gatewayResponse' => gateway_response_to_cr
|
92
|
+
}
|
93
|
+
}
|
94
|
+
end
|
95
|
+
|
96
|
+
def appkey_authentication_to_cr
|
97
|
+
{
|
98
|
+
'appKeyAppID' => {
|
99
|
+
'appID' => cached_proxy['auth_app_id'],
|
100
|
+
'appKey' => cached_proxy['auth_app_key'],
|
101
|
+
'credentials' => cached_proxy['credentials_location'],
|
102
|
+
'security' => security_to_cr,
|
103
|
+
'gatewayResponse' => gateway_response_to_cr
|
104
|
+
}
|
105
|
+
}
|
106
|
+
end
|
107
|
+
|
108
|
+
def oidc_authentication_to_cr
|
109
|
+
{
|
110
|
+
'oidc' => {
|
111
|
+
'issuerType' => cached_proxy['oidc_issuer_type'],
|
112
|
+
'issuerEndpoint' => cached_proxy['oidc_issuer_endpoint'],
|
113
|
+
'jwtClaimWithClientID' => cached_proxy['jwt_claim_with_client_id'],
|
114
|
+
'jwtClaimWithClientIDType' => cached_proxy['jwt_claim_with_client_id_type'],
|
115
|
+
'authenticationFlow' => oidc_flow_to_cr,
|
116
|
+
'credentials' => cached_proxy['credentials_location'],
|
117
|
+
'security' => security_to_cr,
|
118
|
+
'gatewayResponse' => gateway_response_to_cr
|
119
|
+
}
|
120
|
+
}
|
121
|
+
end
|
122
|
+
|
123
|
+
def oidc_flow_to_cr
|
124
|
+
{
|
125
|
+
'standardFlowEnabled' => cached_oidc['standard_flow_enabled'],
|
126
|
+
'implicitFlowEnabled' => cached_oidc['implicit_flow_enabled'],
|
127
|
+
'serviceAccountsEnabled' => cached_oidc['service_accounts_enabled'],
|
128
|
+
'directAccessGrantsEnabled' => cached_oidc['direct_access_grants_enabled']
|
129
|
+
}
|
130
|
+
end
|
131
|
+
|
132
|
+
def security_to_cr
|
133
|
+
{
|
134
|
+
'hostHeader' => cached_proxy['hostname_rewrite'],
|
135
|
+
'secretToken' => cached_proxy['secret_token']
|
136
|
+
}
|
137
|
+
end
|
138
|
+
|
139
|
+
def gateway_response_to_cr
|
140
|
+
{
|
141
|
+
'errorStatusAuthFailed' => cached_proxy['error_status_auth_failed'],
|
142
|
+
'errorHeadersAuthFailed' => cached_proxy['error_headers_auth_failed'],
|
143
|
+
'errorAuthFailed' => cached_proxy['error_auth_failed'],
|
144
|
+
'errorStatusAuthMissing' => cached_proxy['error_status_auth_missing'],
|
145
|
+
'errorHeadersAuthMissing' => cached_proxy['error_headers_auth_missing'],
|
146
|
+
'errorAuthMissing' => cached_proxy['error_auth_missing'],
|
147
|
+
'errorStatusNoMatch' => cached_proxy['error_status_no_match'],
|
148
|
+
'errorHeadersNoMatch' => cached_proxy['error_headers_no_match'],
|
149
|
+
'errorNoMatch' => cached_proxy['error_no_match'],
|
150
|
+
'errorStatusLimitsExceeded' => cached_proxy['error_status_limits_exceeded'],
|
151
|
+
'errorHeadersLimitsExceeded' => cached_proxy['error_headers_limits_exceeded'],
|
152
|
+
'errorLimitsExceeded' => cached_proxy['error_limits_exceeded']
|
153
|
+
}
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|