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
@@ -23,19 +23,11 @@ module ThreeScaleToolbox
23
23
  end
24
24
 
25
25
  def run
26
- printer.print_collection service_methods
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
@@ -23,7 +23,7 @@ module ThreeScaleToolbox
23
23
  end
24
24
 
25
25
  def run
26
- printer.print_collection service.metrics
26
+ printer.print_collection service.metrics.map(&:attrs)
27
27
  end
28
28
 
29
29
  private
@@ -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.tap { |l| l['metric'] = metric_info(l, '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.fetch('metric_id')))
58
- { 'type' => 'method', 'system_name' => method.fetch('system_name') }
59
- elsif (metric = find_metric(elem.fetch('metric_id')))
60
- { 'type' => 'metric', 'system_name' => metric.fetch('system_name') }
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['id']} " \
63
- "referencing to metric id #{elem.fetch('metric_id')} which has not been found"
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
- service_metrics.find { |metric| metric['id'] == id }
75
+ service.metrics.find { |metric| metric.id == id }
84
76
  end
85
77
 
86
78
  def find_method(id)
87
- service_methods.find { |method| method['id'] == id }
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
- metric_id = limit.fetch('metric_id')
15
- plan.delete_limit metric_id, limit.fetch('id')
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 |limit|
20
- metric_id = limit.delete('metric_id')
21
- plan.create_limit(metric_id, limit)
22
- puts "Created plan limit: [metric: #{metric_id}, #{limit}]"
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.fetch('id'))
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, service_metrics) do |a, b|
22
- ThreeScaleToolbox::Helper.compare_hashes(a, b, ['system_name'])
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, service_methods) do |a, b|
28
- ThreeScaleToolbox::Helper.compare_hashes(a, b, ['system_name'])
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
- remote_pr_processed.each do |pr|
14
- metric_id = pr.fetch('metric_id')
15
- plan.delete_pricing_rule metric_id, pr.fetch('id')
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 |pr|
20
- metric_id = pr.delete('metric_id')
21
- plan.create_pricing_rule(metric_id, pr)
22
- puts "Created plan pricing rule: [metric: #{metric_id}, #{pr}]"
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.fetch('id'),
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
- service_metrics + service_methods
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['system_name'] == system_name }
86
+ service_metrics_and_methods.find { |metric| metric.system_name == system_name }
107
87
  end
108
88
 
109
89
  private
@@ -23,7 +23,7 @@ module ThreeScaleToolbox
23
23
  end
24
24
 
25
25
  def run
26
- printer.print_collection service.plans
26
+ printer.print_collection service.plans.map(&:attrs)
27
27
  end
28
28
 
29
29
  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 end_user_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