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.
- checksums.yaml +4 -4
- data/3scale_toolbox.gemspec +1 -1
- data/README.md +6 -3
- data/lib/3scale_toolbox.rb +3 -0
- data/lib/3scale_toolbox/3scale_client_factory.rb +3 -4
- data/lib/3scale_toolbox/commands.rb +2 -0
- data/lib/3scale_toolbox/commands/backend_command/copy_command/copy_mapping_rules_task.rb +11 -27
- data/lib/3scale_toolbox/commands/backend_command/copy_command/copy_methods_task.rb +5 -10
- data/lib/3scale_toolbox/commands/backend_command/copy_command/copy_metrics_task.rb +4 -4
- data/lib/3scale_toolbox/commands/backend_command/copy_command/create_or_update_target_backend_task.rb +3 -2
- data/lib/3scale_toolbox/commands/backend_command/copy_command/task.rb +10 -32
- data/lib/3scale_toolbox/commands/import_command/issuer_type_transformer.rb +16 -0
- data/lib/3scale_toolbox/commands/import_command/openapi.rb +3 -0
- 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 +3 -12
- 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 +2 -4
- data/lib/3scale_toolbox/commands/methods_command/create_command.rb +0 -2
- data/lib/3scale_toolbox/commands/methods_command/delete_command.rb +1 -1
- data/lib/3scale_toolbox/commands/methods_command/list_command.rb +1 -9
- data/lib/3scale_toolbox/commands/metrics_command/list_command.rb +1 -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 +7 -8
- 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 +8 -15
- data/lib/3scale_toolbox/commands/plans_command/import/step.rb +2 -22
- data/lib/3scale_toolbox/commands/plans_command/list_command.rb +1 -1
- data/lib/3scale_toolbox/commands/plans_command/show_command.rb +1 -1
- 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 +4 -0
- data/lib/3scale_toolbox/commands/product_command/copy_command.rb +7 -3
- data/lib/3scale_toolbox/commands/product_command/copy_command/copy_backends_task.rb +22 -5
- 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 +2 -0
- data/lib/3scale_toolbox/commands/proxy_config_command/deploy_command.rb +54 -0
- data/lib/3scale_toolbox/commands/service_command/copy_command/copy_activedocs_task.rb +15 -12
- data/lib/3scale_toolbox/commands/service_command/copy_command/copy_app_plans_task.rb +15 -15
- data/lib/3scale_toolbox/commands/service_command/copy_command/copy_limits_task.rb +12 -13
- data/lib/3scale_toolbox/commands/service_command/copy_command/copy_mapping_rules_task.rb +11 -11
- data/lib/3scale_toolbox/commands/service_command/copy_command/copy_methods_task.rb +8 -9
- data/lib/3scale_toolbox/commands/service_command/copy_command/copy_metrics_task.rb +8 -8
- data/lib/3scale_toolbox/commands/service_command/copy_command/copy_policies_task.rb +1 -1
- data/lib/3scale_toolbox/commands/service_command/copy_command/copy_pricingrules_task.rb +15 -18
- data/lib/3scale_toolbox/commands/service_command/copy_command/copy_service_proxy_task.rb +2 -2
- data/lib/3scale_toolbox/commands/service_command/copy_command/create_or_update_service_task.rb +2 -1
- data/lib/3scale_toolbox/commands/service_command/copy_command/destroy_mapping_rules_task.rb +9 -5
- data/lib/3scale_toolbox/commands/service_command/copy_command/task.rb +20 -34
- data/lib/3scale_toolbox/commands/update_command/service_command/delete_activedocs_task.rb +1 -3
- 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 +3 -0
- data/lib/3scale_toolbox/entities/activedocs.rb +12 -0
- data/lib/3scale_toolbox/entities/application_plan.rb +54 -46
- data/lib/3scale_toolbox/entities/backend.rb +65 -30
- data/lib/3scale_toolbox/entities/backend_mapping_rule.rb +29 -3
- data/lib/3scale_toolbox/entities/backend_method.rb +25 -16
- data/lib/3scale_toolbox/entities/backend_metric.rb +12 -2
- data/lib/3scale_toolbox/entities/backend_usage.rb +7 -1
- 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 +149 -46
- data/lib/3scale_toolbox/helper.rb +13 -16
- data/lib/3scale_toolbox/proxy_logger.rb +4 -0
- 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 +58 -50
- metadata +33 -6
|
@@ -23,19 +23,11 @@ module ThreeScaleToolbox
|
|
|
23
23
|
end
|
|
24
24
|
|
|
25
25
|
def run
|
|
26
|
-
printer.print_collection
|
|
26
|
+
printer.print_collection service.methods.map(&:attrs)
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
private
|
|
30
30
|
|
|
31
|
-
def service_methods
|
|
32
|
-
@service_methods ||= service.methods service_hits_id
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
def service_hits_id
|
|
36
|
-
@service_hits_id ||= service.hits.fetch('id')
|
|
37
|
-
end
|
|
38
|
-
|
|
39
31
|
def service
|
|
40
32
|
@service ||= find_service
|
|
41
33
|
end
|
|
@@ -9,7 +9,7 @@ module ThreeScaleToolbox
|
|
|
9
9
|
# add metric system_name out of metric_id
|
|
10
10
|
def call
|
|
11
11
|
result[:limits] = plan.limits.map do |limit|
|
|
12
|
-
limit.
|
|
12
|
+
limit.attrs.merge('metric' => metric_info(limit, 'Limit'))
|
|
13
13
|
end
|
|
14
14
|
end
|
|
15
15
|
end
|
|
@@ -21,7 +21,7 @@ module ThreeScaleToolbox
|
|
|
21
21
|
filtered_limit_methods.each_with_object({}) do |elem, acc|
|
|
22
22
|
# find_method should not return nil.
|
|
23
23
|
# It is assumed that metric_id refers to existing element from previous steps
|
|
24
|
-
acc[elem['metric_id']] = find_method(elem['metric_id'])
|
|
24
|
+
acc[elem['metric_id']] = find_method(elem['metric_id']).attrs
|
|
25
25
|
end
|
|
26
26
|
end
|
|
27
27
|
|
|
@@ -33,7 +33,7 @@ module ThreeScaleToolbox
|
|
|
33
33
|
filtered_pricing_rule_methods.each_with_object({}) do |elem, acc|
|
|
34
34
|
# find_method should not return nil.
|
|
35
35
|
# It is assumed that metric_id refers to existing element from previous steps
|
|
36
|
-
acc[elem['metric_id']] = find_method(elem['metric_id'])
|
|
36
|
+
acc[elem['metric_id']] = find_method(elem['metric_id']).attrs
|
|
37
37
|
end
|
|
38
38
|
end
|
|
39
39
|
|
|
@@ -21,7 +21,7 @@ module ThreeScaleToolbox
|
|
|
21
21
|
filtered_limit_metrics.each_with_object({}) do |elem, acc|
|
|
22
22
|
# find_metric should not return nil.
|
|
23
23
|
# It is assumed that metric_id refers to existing element from previous steps
|
|
24
|
-
acc[elem['metric_id']] = find_metric(elem['metric_id'])
|
|
24
|
+
acc[elem['metric_id']] = find_metric(elem['metric_id']).attrs
|
|
25
25
|
end
|
|
26
26
|
end
|
|
27
27
|
|
|
@@ -33,7 +33,7 @@ module ThreeScaleToolbox
|
|
|
33
33
|
filtered_pricing_rule_metrics.each_with_object({}) do |elem, acc|
|
|
34
34
|
# find_metric should not return nil.
|
|
35
35
|
# It is assumed that metric_id refers to existing element from previous steps
|
|
36
|
-
acc[elem['metric_id']] = find_metric(elem['metric_id'])
|
|
36
|
+
acc[elem['metric_id']] = find_metric(elem['metric_id']).attrs
|
|
37
37
|
end
|
|
38
38
|
end
|
|
39
39
|
|
|
@@ -9,8 +9,7 @@ module ThreeScaleToolbox
|
|
|
9
9
|
# add metric system_name out of metric_id
|
|
10
10
|
def call
|
|
11
11
|
result[:pricingrules] = plan.pricing_rules.map do |pr|
|
|
12
|
-
pr.merge('metric' => metric_info(pr, 'PricingRule'),
|
|
13
|
-
'cost_per_unit' => pr.fetch('cost_per_unit').to_f)
|
|
12
|
+
pr.attrs.merge('metric' => metric_info(pr, 'PricingRule'), 'cost_per_unit' => pr.cost_per_unit.to_f)
|
|
14
13
|
end
|
|
15
14
|
end
|
|
16
15
|
end
|
|
@@ -45,22 +45,14 @@ module ThreeScaleToolbox
|
|
|
45
45
|
context[:plan] ||= find_plan
|
|
46
46
|
end
|
|
47
47
|
|
|
48
|
-
def service_metrics
|
|
49
|
-
context[:service_metrics] ||= service.metrics
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
def service_methods
|
|
53
|
-
context[:service_methods] ||= service.methods(service_hits['id'])
|
|
54
|
-
end
|
|
55
|
-
|
|
56
48
|
def metric_info(elem, elem_name)
|
|
57
|
-
if (method = find_method(elem.
|
|
58
|
-
{ 'type' => 'method', 'system_name' => method.
|
|
59
|
-
elsif (metric = find_metric(elem.
|
|
60
|
-
{ 'type' => 'metric', 'system_name' => metric.
|
|
49
|
+
if (method = find_method(elem.metric_id))
|
|
50
|
+
{ 'type' => 'method', 'system_name' => method.system_name }
|
|
51
|
+
elsif (metric = find_metric(elem.metric_id))
|
|
52
|
+
{ 'type' => 'metric', 'system_name' => metric.system_name }
|
|
61
53
|
else
|
|
62
|
-
raise ThreeScaleToolbox::Error, "Unexpected error. #{elem_name} #{elem
|
|
63
|
-
"referencing to metric id #{elem.
|
|
54
|
+
raise ThreeScaleToolbox::Error, "Unexpected error. #{elem_name} #{elem.id} " \
|
|
55
|
+
"referencing to metric id #{elem.metric_id} which has not been found"
|
|
64
56
|
end
|
|
65
57
|
end
|
|
66
58
|
|
|
@@ -80,15 +72,11 @@ module ThreeScaleToolbox
|
|
|
80
72
|
end
|
|
81
73
|
|
|
82
74
|
def find_metric(id)
|
|
83
|
-
|
|
75
|
+
service.metrics.find { |metric| metric.id == id }
|
|
84
76
|
end
|
|
85
77
|
|
|
86
78
|
def find_method(id)
|
|
87
|
-
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
def service_hits
|
|
91
|
-
context[:service_hits] ||= service.hits
|
|
79
|
+
service.methods.find { |method| method.id == id }
|
|
92
80
|
end
|
|
93
81
|
end
|
|
94
82
|
end
|
|
@@ -11,15 +11,14 @@ module ThreeScaleToolbox
|
|
|
11
11
|
# First, delete existing limits
|
|
12
12
|
# Second, add new limits
|
|
13
13
|
plan.limits.each do |limit|
|
|
14
|
-
|
|
15
|
-
plan.
|
|
16
|
-
puts "Deleted existing plan limit: [metric: #{metric_id}, #{limit}]"
|
|
14
|
+
limit.delete()
|
|
15
|
+
puts "Deleted existing plan limit: [metric: #{limit.metric_id}, #{limit.attrs}]"
|
|
17
16
|
end
|
|
18
17
|
|
|
19
|
-
resource_limits_processed.each do |
|
|
20
|
-
metric_id =
|
|
21
|
-
plan.create_limit(metric_id,
|
|
22
|
-
puts "Created plan limit: [metric: #{metric_id}, #{
|
|
18
|
+
resource_limits_processed.each do |limit_attrs|
|
|
19
|
+
metric_id = limit_attrs.delete('metric_id')
|
|
20
|
+
plan.create_limit(metric_id, limit_attrs)
|
|
21
|
+
puts "Created plan limit: [metric: #{metric_id}, #{limit_attrs}]"
|
|
23
22
|
end
|
|
24
23
|
end
|
|
25
24
|
|
|
@@ -30,7 +29,7 @@ module ThreeScaleToolbox
|
|
|
30
29
|
metric = find_metric_by_system_name(limit.delete('metric_system_name'))
|
|
31
30
|
# this ImportMetricLimitsStep step is assuming all metrics/methods have been created
|
|
32
31
|
# in previous step, so finding metric should always succeed.
|
|
33
|
-
limit.merge('metric_id' => metric.
|
|
32
|
+
limit.merge('metric_id' => metric.id)
|
|
34
33
|
end
|
|
35
34
|
end
|
|
36
35
|
end
|
|
@@ -9,36 +9,29 @@ module ThreeScaleToolbox
|
|
|
9
9
|
def call
|
|
10
10
|
missing_metrics.each(&method(:create_metric))
|
|
11
11
|
missing_methods.each(&method(:create_method))
|
|
12
|
-
|
|
13
|
-
# invalidate memoized methods and metrics
|
|
14
|
-
invalidate_service_methods
|
|
15
|
-
invalidate_service_metrics
|
|
16
12
|
end
|
|
17
13
|
|
|
18
14
|
private
|
|
19
15
|
|
|
20
16
|
def missing_metrics
|
|
21
|
-
ThreeScaleToolbox::Helper.array_difference(resource_metrics,
|
|
22
|
-
|
|
17
|
+
ThreeScaleToolbox::Helper.array_difference(resource_metrics, service.metrics) do |a, b|
|
|
18
|
+
a['system_name'] == b.system_name
|
|
23
19
|
end
|
|
24
20
|
end
|
|
25
21
|
|
|
26
22
|
def missing_methods
|
|
27
|
-
ThreeScaleToolbox::Helper.array_difference(resource_methods,
|
|
28
|
-
|
|
23
|
+
ThreeScaleToolbox::Helper.array_difference(resource_methods, service.methods) do |a, b|
|
|
24
|
+
a['system_name'] == b.system_name
|
|
29
25
|
end
|
|
30
26
|
end
|
|
31
27
|
|
|
32
28
|
def create_metric(metric_attrs)
|
|
33
|
-
metric = ThreeScaleToolbox::Entities::Metric.create(service: service,
|
|
34
|
-
attrs: metric_attrs)
|
|
29
|
+
metric = ThreeScaleToolbox::Entities::Metric.create(service: service, attrs: metric_attrs)
|
|
35
30
|
puts "Created metric: #{metric.attrs['system_name']}"
|
|
36
31
|
end
|
|
37
32
|
|
|
38
33
|
def create_method(method_attrs)
|
|
39
|
-
method = ThreeScaleToolbox::Entities::Method.create(service: service,
|
|
40
|
-
parent_id: service_hits['id'],
|
|
41
|
-
attrs: method_attrs)
|
|
34
|
+
method = ThreeScaleToolbox::Entities::Method.create(service: service, attrs: method_attrs)
|
|
42
35
|
puts "Created method: #{method.attrs['system_name']}"
|
|
43
36
|
end
|
|
44
37
|
end
|
|
@@ -10,31 +10,24 @@ module ThreeScaleToolbox
|
|
|
10
10
|
# SET semantics
|
|
11
11
|
# First, delete existing pricing rules
|
|
12
12
|
# Second, add new pricing rules
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
plan.
|
|
16
|
-
puts "Deleted existing plan pricing rule: [metric: #{metric_id}, #{pr}]"
|
|
13
|
+
plan.pricing_rules.each do |pr|
|
|
14
|
+
pr.delete()
|
|
15
|
+
puts "Deleted existing plan pricing rule: [metric: #{pr.metric_id}, #{pr.attrs}]"
|
|
17
16
|
end
|
|
18
17
|
|
|
19
|
-
resource_pr_processed.each do |
|
|
20
|
-
metric_id =
|
|
21
|
-
plan.create_pricing_rule(metric_id,
|
|
22
|
-
puts "Created plan pricing rule: [metric: #{metric_id}, #{
|
|
18
|
+
resource_pr_processed.each do |pr_attrs|
|
|
19
|
+
metric_id = pr_attrs.delete('metric_id')
|
|
20
|
+
plan.create_pricing_rule(metric_id, pr_attrs)
|
|
21
|
+
puts "Created plan pricing rule: [metric: #{metric_id}, #{pr_attrs}]"
|
|
23
22
|
end
|
|
24
23
|
end
|
|
25
24
|
|
|
26
25
|
private
|
|
27
26
|
|
|
28
|
-
def remote_pr_processed
|
|
29
|
-
plan.pricing_rules.map do |pr|
|
|
30
|
-
pr.merge('cost_per_unit' => pr.fetch('cost_per_unit').to_f)
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
|
|
34
27
|
def resource_pr_processed
|
|
35
28
|
resource_pricing_rules.map do |pr|
|
|
36
29
|
metric = find_metric_by_system_name(pr.delete('metric_system_name'))
|
|
37
|
-
pr.merge('metric_id' => metric.
|
|
30
|
+
pr.merge('metric_id' => metric.id,
|
|
38
31
|
'cost_per_unit' => pr.fetch('cost_per_unit').to_f)
|
|
39
32
|
end
|
|
40
33
|
end
|
|
@@ -65,28 +65,8 @@ module ThreeScaleToolbox
|
|
|
65
65
|
artifacts_resource['plan_features'] || []
|
|
66
66
|
end
|
|
67
67
|
|
|
68
|
-
def service_metrics
|
|
69
|
-
context[:service_metrics] ||= service.metrics
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
def invalidate_service_metrics
|
|
73
|
-
context[:service_metrics] = nil
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
def service_hits
|
|
77
|
-
context[:service_hits] ||= service.hits
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
def service_methods
|
|
81
|
-
context[:service_methods] ||= service.methods(service_hits['id'])
|
|
82
|
-
end
|
|
83
|
-
|
|
84
68
|
def service_metrics_and_methods
|
|
85
|
-
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
def invalidate_service_methods
|
|
89
|
-
context[:service_methods] = nil
|
|
69
|
+
service.metrics + service.methods
|
|
90
70
|
end
|
|
91
71
|
|
|
92
72
|
def service_features
|
|
@@ -103,7 +83,7 @@ module ThreeScaleToolbox
|
|
|
103
83
|
end
|
|
104
84
|
|
|
105
85
|
def find_metric_by_system_name(system_name)
|
|
106
|
-
service_metrics_and_methods.find { |metric| metric
|
|
86
|
+
service_metrics_and_methods.find { |metric| metric.system_name == system_name }
|
|
107
87
|
end
|
|
108
88
|
|
|
109
89
|
private
|
|
@@ -5,7 +5,7 @@ module ThreeScaleToolbox
|
|
|
5
5
|
class ShowSubcommand < Cri::CommandRunner
|
|
6
6
|
include ThreeScaleToolbox::Command
|
|
7
7
|
|
|
8
|
-
FIELDS_TO_SHOW = %w[id name system_name approval_required
|
|
8
|
+
FIELDS_TO_SHOW = %w[id name system_name approval_required
|
|
9
9
|
cost_per_month setup_fee trial_period_days].freeze
|
|
10
10
|
|
|
11
11
|
def self.command
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
require '3scale_toolbox/commands/policies_command/export_command'
|
|
2
|
+
require '3scale_toolbox/commands/policies_command/import_command'
|
|
3
|
+
|
|
4
|
+
module ThreeScaleToolbox
|
|
5
|
+
module Commands
|
|
6
|
+
module PoliciesCommand
|
|
7
|
+
include ThreeScaleToolbox::Command
|
|
8
|
+
def self.command
|
|
9
|
+
Cri::Command.define do
|
|
10
|
+
name 'policies'
|
|
11
|
+
usage 'policies <sub-command> [options]'
|
|
12
|
+
summary 'policies super command'
|
|
13
|
+
description 'Policies commands'
|
|
14
|
+
|
|
15
|
+
run do |_opts, _args, cmd|
|
|
16
|
+
puts cmd.help
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
add_subcommand(ExportSubcommand)
|
|
21
|
+
add_subcommand(ImportSubcommand)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
module ThreeScaleToolbox
|
|
2
|
+
module Commands
|
|
3
|
+
module PoliciesCommand
|
|
4
|
+
class ExportSubcommand < Cri::CommandRunner
|
|
5
|
+
include ThreeScaleToolbox::Command
|
|
6
|
+
|
|
7
|
+
class JSONSerializer
|
|
8
|
+
def call(object)
|
|
9
|
+
JSON.pretty_generate(object)
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
class YAMLSerializer
|
|
14
|
+
def call(object)
|
|
15
|
+
YAML.dump(object)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
class SerializerTransformer
|
|
20
|
+
def call(output_format)
|
|
21
|
+
raise unless %w[yaml json].include?(output_format)
|
|
22
|
+
|
|
23
|
+
case output_format
|
|
24
|
+
when 'yaml'
|
|
25
|
+
YAMLSerializer.new
|
|
26
|
+
when 'json'
|
|
27
|
+
JSONSerializer.new
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def self.command
|
|
33
|
+
Cri::Command.define do
|
|
34
|
+
name 'export'
|
|
35
|
+
usage 'export [opts] <remote> <product>'
|
|
36
|
+
summary 'export product policy chain'
|
|
37
|
+
description 'export product policy chain'
|
|
38
|
+
|
|
39
|
+
option :f, :file, 'Write to file instead of stdout', argument: :required
|
|
40
|
+
option :o, :output, 'Output format. One of: json|yaml', argument: :required, transform: SerializerTransformer.new
|
|
41
|
+
param :remote
|
|
42
|
+
param :service_ref
|
|
43
|
+
|
|
44
|
+
runner ExportSubcommand
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def run
|
|
49
|
+
select_output do |output|
|
|
50
|
+
output.write(serializer.call(product.policies))
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
private
|
|
55
|
+
|
|
56
|
+
def remote
|
|
57
|
+
@remote ||= threescale_client(arguments[:remote])
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def product
|
|
61
|
+
@product ||= find_product
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def service_ref
|
|
65
|
+
arguments[:service_ref]
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def find_product
|
|
69
|
+
Entities::Service.find(remote: remote,
|
|
70
|
+
ref: service_ref).tap do |svc|
|
|
71
|
+
raise ThreeScaleToolbox::Error, "Product #{service_ref} does not exist" if svc.nil?
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def file
|
|
76
|
+
options[:file]
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def select_output
|
|
80
|
+
ios = if file
|
|
81
|
+
File.open(file, 'w')
|
|
82
|
+
else
|
|
83
|
+
$stdout
|
|
84
|
+
end
|
|
85
|
+
begin
|
|
86
|
+
yield(ios)
|
|
87
|
+
ensure
|
|
88
|
+
ios.close
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def serializer
|
|
93
|
+
options.fetch(:output, YAMLSerializer.new)
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
module ThreeScaleToolbox
|
|
2
|
+
module Commands
|
|
3
|
+
module PoliciesCommand
|
|
4
|
+
class ImportSubcommand < Cri::CommandRunner
|
|
5
|
+
include ThreeScaleToolbox::Command
|
|
6
|
+
include ThreeScaleToolbox::ResourceReader
|
|
7
|
+
|
|
8
|
+
def self.command
|
|
9
|
+
Cri::Command.define do
|
|
10
|
+
name 'import'
|
|
11
|
+
usage 'import [opts] <remote> <product>'
|
|
12
|
+
summary 'import product policy chain'
|
|
13
|
+
description 'import product policy chain'
|
|
14
|
+
|
|
15
|
+
option :f, :file, 'Read from file', argument: :required
|
|
16
|
+
option :u, :url, 'Read from url', argument: :required
|
|
17
|
+
param :remote
|
|
18
|
+
param :service_ref
|
|
19
|
+
|
|
20
|
+
runner ImportSubcommand
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def run
|
|
25
|
+
res = product.update_policies('policies_config' => policies)
|
|
26
|
+
if res.is_a?(Hash) && (errors = res['errors'])
|
|
27
|
+
raise ThreeScaleToolbox::Error, "Product policies have not been imported. #{errors}"
|
|
28
|
+
end
|
|
29
|
+
if res.is_a?(Array) && (error_item = res.find { |i| i.key?('errors') })
|
|
30
|
+
raise ThreeScaleToolbox::Error, "Product policies have not been imported. #{error_item['errors']}"
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
def remote
|
|
37
|
+
@remote ||= threescale_client(arguments[:remote])
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def service_ref
|
|
41
|
+
arguments[:service_ref]
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def product
|
|
45
|
+
@product ||= find_product
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def find_product
|
|
49
|
+
Entities::Service.find(remote: remote,
|
|
50
|
+
ref: service_ref).tap do |svc|
|
|
51
|
+
raise ThreeScaleToolbox::Error, "Product #{service_ref} does not exist" if svc.nil?
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def policies
|
|
56
|
+
@policies ||= load_resource(options[:file] || options[:url] || '-')
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|