3scale_toolbox 0.10.0 → 0.11.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 (61) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +21 -144
  3. data/lib/3scale_toolbox.rb +0 -1
  4. data/lib/3scale_toolbox/commands.rb +12 -0
  5. data/lib/3scale_toolbox/commands/3scale_command.rb +1 -1
  6. data/lib/3scale_toolbox/commands/account_command.rb +23 -0
  7. data/lib/3scale_toolbox/commands/account_command/find_command.rb +41 -0
  8. data/lib/3scale_toolbox/commands/activedocs_command.rb +32 -0
  9. data/lib/3scale_toolbox/commands/activedocs_command/apply_command.rb +127 -0
  10. data/lib/3scale_toolbox/commands/activedocs_command/create_command.rb +65 -0
  11. data/lib/3scale_toolbox/commands/activedocs_command/delete_command.rb +49 -0
  12. data/lib/3scale_toolbox/commands/activedocs_command/list_command.rb +54 -0
  13. data/lib/3scale_toolbox/commands/application_command.rb +30 -0
  14. data/lib/3scale_toolbox/commands/application_command/apply_command.rb +179 -0
  15. data/lib/3scale_toolbox/commands/application_command/create_command.rb +110 -0
  16. data/lib/3scale_toolbox/commands/application_command/delete_command.rb +57 -0
  17. data/lib/3scale_toolbox/commands/application_command/list_command.rb +124 -0
  18. data/lib/3scale_toolbox/commands/application_command/show_command.rb +72 -0
  19. data/lib/3scale_toolbox/commands/copy_command/copy_service.rb +97 -28
  20. data/lib/3scale_toolbox/commands/import_command/import_csv.rb +16 -17
  21. data/lib/3scale_toolbox/commands/import_command/openapi.rb +14 -10
  22. data/lib/3scale_toolbox/commands/import_command/openapi/create_service_step.rb +3 -2
  23. data/lib/3scale_toolbox/commands/import_command/openapi/method.rb +0 -1
  24. data/lib/3scale_toolbox/commands/import_command/openapi/step.rb +8 -1
  25. data/lib/3scale_toolbox/commands/import_command/openapi/update_service_proxy_step.rb +17 -7
  26. data/lib/3scale_toolbox/commands/methods_command.rb +4 -4
  27. data/lib/3scale_toolbox/commands/methods_command/apply_command.rb +2 -2
  28. data/lib/3scale_toolbox/commands/methods_command/create_command.rb +1 -1
  29. data/lib/3scale_toolbox/commands/metrics_command.rb +4 -4
  30. data/lib/3scale_toolbox/commands/metrics_command/apply_command.rb +2 -2
  31. data/lib/3scale_toolbox/commands/metrics_command/create_command.rb +1 -1
  32. data/lib/3scale_toolbox/commands/plans_command/apply_command.rb +7 -7
  33. data/lib/3scale_toolbox/commands/plans_command/create_command.rb +5 -5
  34. data/lib/3scale_toolbox/commands/policy_registry_command.rb +22 -0
  35. data/lib/3scale_toolbox/commands/policy_registry_command/copy_command.rb +85 -0
  36. data/lib/3scale_toolbox/commands/proxy_config_command.rb +30 -0
  37. data/lib/3scale_toolbox/commands/proxy_config_command/list_command.rb +78 -0
  38. data/lib/3scale_toolbox/commands/proxy_config_command/promote_command.rb +68 -0
  39. data/lib/3scale_toolbox/commands/proxy_config_command/show_command.rb +88 -0
  40. data/lib/3scale_toolbox/commands/service_command.rb +34 -0
  41. data/lib/3scale_toolbox/commands/service_command/apply_command.rb +77 -0
  42. data/lib/3scale_toolbox/commands/service_command/create_command.rb +59 -0
  43. data/lib/3scale_toolbox/commands/service_command/delete_command.rb +49 -0
  44. data/lib/3scale_toolbox/commands/service_command/list_command.rb +50 -0
  45. data/lib/3scale_toolbox/commands/service_command/show_command.rb +63 -0
  46. data/lib/3scale_toolbox/commands/update_command/update_service.rb +6 -3
  47. data/lib/3scale_toolbox/entities.rb +4 -0
  48. data/lib/3scale_toolbox/entities/account.rb +63 -0
  49. data/lib/3scale_toolbox/entities/activedocs.rb +88 -0
  50. data/lib/3scale_toolbox/entities/application.rb +124 -0
  51. data/lib/3scale_toolbox/entities/application_plan.rb +28 -4
  52. data/lib/3scale_toolbox/entities/base_entity.rb +44 -0
  53. data/lib/3scale_toolbox/entities/proxy_config.rb +58 -0
  54. data/lib/3scale_toolbox/entities/service.rb +42 -8
  55. data/lib/3scale_toolbox/error.rb +8 -0
  56. data/lib/3scale_toolbox/tasks.rb +2 -1
  57. data/lib/3scale_toolbox/tasks/bump_proxy_version_task.rb +32 -0
  58. data/lib/3scale_toolbox/tasks/copy_service_settings_task.rb +38 -0
  59. data/lib/3scale_toolbox/version.rb +1 -1
  60. metadata +36 -5
  61. data/lib/3scale_toolbox/tasks/update_service_settings_task.rb +0 -49
@@ -22,9 +22,9 @@ module ThreeScaleToolbox
22
22
  def self.command
23
23
  Cri::Command.define do
24
24
  name 'openapi'
25
- usage 'openapi [opts] -d <dst> <spec>'
26
- summary 'Import API defintion in OpenAPI specification'
27
- description 'Using an API definition format like OpenAPI, import to your 3scale API'
25
+ usage 'openapi [opts] -d <destination> <spec> (/path/to/your/spec/file.[json|yaml|yml] OR http[s]://domain/resource/path.[json|yaml|yml])'
26
+ summary 'Import API defintion in OpenAPI specification from a local file or URL'
27
+ description 'Using an API definition format like OpenAPI, import to your 3scale API directly from a local OpenAPI spec compliant file or a remote URL'
28
28
 
29
29
  option :d, :destination, '3scale target instance. Format: "http[s]://<authentication>@3scale_domain"', argument: :required
30
30
  option :t, 'target_system_name', 'Target system name', argument: :required
@@ -34,6 +34,8 @@ module ThreeScaleToolbox
34
34
  option nil, 'default-credentials-userkey', 'Default credentials policy userkey', argument: :required
35
35
  option nil, 'override-private-basepath', 'Override the basepath for the public URLs', argument: :required
36
36
  option nil, 'override-public-basepath', 'Override the basepath for the private URLs', argument: :required
37
+ option nil, 'staging-public-base-url', 'Custom public staging URL', argument: :required
38
+ option nil, 'production-public-base-url', 'Custom public production URL', argument: :required
37
39
  param :openapi_resource
38
40
 
39
41
  runner OpenAPISubcommand
@@ -43,20 +45,20 @@ module ThreeScaleToolbox
43
45
  def run
44
46
  tasks = []
45
47
  tasks << CreateServiceStep.new(context)
48
+ # other tasks might read proxy settings (CreateActiveDocsStep does)
49
+ tasks << UpdateServiceProxyStep.new(context)
46
50
  tasks << CreateMethodsStep.new(context)
47
- tasks << ThreeScaleToolbox::Tasks::DestroyMappingRulesTask.new(context)
51
+ tasks << Tasks::DestroyMappingRulesTask.new(context)
48
52
  tasks << CreateMappingRulesStep.new(context)
49
53
  tasks << CreateActiveDocsStep.new(context)
50
54
  tasks << UpdateServiceOidcConfStep.new(context)
51
55
  tasks << UpdatePoliciesStep.new(context)
52
- # Update proxy must be the last step
53
- # Proxy update is the mechanism to increase version of the proxy,
54
- # Hence propagating (mapping rules, poicies, oidc, auth) update to
55
- # latest proxy config, making available to gateway.
56
- tasks << UpdateServiceProxyStep.new(context)
57
56
 
58
57
  # run tasks
59
58
  tasks.each(&:call)
59
+
60
+ # This should be the last step
61
+ Tasks::BumpProxyVersionTask.new(service: context[:target]).call
60
62
  end
61
63
 
62
64
  private
@@ -76,7 +78,9 @@ module ThreeScaleToolbox
76
78
  oidc_issuer_endpoint: options[:'oidc-issuer-endpoint'],
77
79
  default_credentials_userkey: options[:'default-credentials-userkey'],
78
80
  skip_openapi_validation: options[:'skip-openapi-validation'],
79
- override_private_basepath: options[:'override-private-basepath']
81
+ override_private_basepath: options[:'override-private-basepath'],
82
+ production_public_base_url: options[:'production-public-base-url'],
83
+ staging_public_base_url: options[:'staging-public-base-url']
80
84
  }
81
85
  end
82
86
 
@@ -15,8 +15,7 @@ module ThreeScaleToolbox
15
15
  if service.nil?
16
16
  # Create service and update context
17
17
  self.service = Entities::Service.create(remote: threescale_client,
18
- service: service_settings,
19
- system_name: service_system_name)
18
+ service_params: service_settings)
20
19
  puts "Created service id: #{service.id}, name: #{service_name}"
21
20
  else
22
21
  service.update(service_settings)
@@ -35,6 +34,8 @@ module ThreeScaleToolbox
35
34
  svc['name'] = service_name
36
35
  svc['description'] = service_description
37
36
  svc['backend_version'] = backend_version
37
+ svc['system_name'] = service_system_name
38
+ svc['deployment_option'] = 'self_managed' if !production_public_base_url.nil? || !staging_public_base_url.nil?
38
39
  end
39
40
  end
40
41
 
@@ -3,7 +3,6 @@ module ThreeScaleToolbox
3
3
  module ImportCommand
4
4
  module OpenAPI
5
5
  module Method
6
-
7
6
  def method
8
7
  {
9
8
  'friendly_name' => friendly_name,
@@ -43,7 +43,6 @@ module ThreeScaleToolbox
43
43
  context[:api_spec_resource]
44
44
  end
45
45
 
46
-
47
46
  def security
48
47
  api_spec.security
49
48
  end
@@ -59,6 +58,14 @@ module ThreeScaleToolbox
59
58
  def override_private_basepath
60
59
  context[:override_private_basepath]
61
60
  end
61
+
62
+ def production_public_base_url
63
+ context[:production_public_base_url]
64
+ end
65
+
66
+ def staging_public_base_url
67
+ context[:staging_public_base_url]
68
+ end
62
69
  end
63
70
  end
64
71
  end
@@ -8,17 +8,15 @@ module ThreeScaleToolbox
8
8
  ##
9
9
  # Updates Proxy config
10
10
  def call
11
- # setting required attrs, operation is idempotent
12
- proxy_settings = {
13
- # Adding harmless attribute to avoid empty body
14
- # update_proxy cannot be done with empty body
15
- # and must be done to increase proxy version
16
- service_id: service.id
17
- }
11
+ proxy_settings = {}
18
12
 
13
+ add_endpoint_settings(proxy_settings)
14
+ add_sandbox_endpoint_settings(proxy_settings)
19
15
  add_api_backend_settings(proxy_settings)
20
16
  add_security_proxy_settings(proxy_settings)
21
17
 
18
+ return unless proxy_settings.size.positive?
19
+
22
20
  res = service.update_proxy proxy_settings
23
21
  if (errors = res['errors'])
24
22
  raise ThreeScaleToolbox::Error, "Service proxy has not been updated. #{errors}"
@@ -29,6 +27,18 @@ module ThreeScaleToolbox
29
27
 
30
28
  private
31
29
 
30
+ def add_endpoint_settings(settings)
31
+ return if production_public_base_url.nil?
32
+
33
+ settings[:endpoint] = production_public_base_url
34
+ end
35
+
36
+ def add_sandbox_endpoint_settings(settings)
37
+ return if staging_public_base_url.nil?
38
+
39
+ settings[:sandbox_endpoint] = staging_public_base_url
40
+ end
41
+
32
42
  def add_api_backend_settings(settings)
33
43
  return if api_spec.host.nil?
34
44
 
@@ -9,10 +9,10 @@ module ThreeScaleToolbox
9
9
  include ThreeScaleToolbox::Command
10
10
  def self.command
11
11
  Cri::Command.define do
12
- name 'methods'
13
- usage 'methods <sub-command> [options]'
14
- summary 'methods super command'
15
- description 'Methods commands'
12
+ name 'method'
13
+ usage 'method <sub-command> [options]'
14
+ summary 'method super command'
15
+ description 'Method commands'
16
16
 
17
17
  run do |_opts, _args, cmd|
18
18
  puts cmd.help
@@ -65,11 +65,11 @@ module ThreeScaleToolbox
65
65
  end
66
66
 
67
67
  def option_enabled
68
- !options[:enabled].nil?
68
+ options.fetch(:enabled, false)
69
69
  end
70
70
 
71
71
  def option_disabled
72
- !options[:disabled].nil?
72
+ options.fetch(:disabled, false)
73
73
  end
74
74
 
75
75
  def service
@@ -45,7 +45,7 @@ module ThreeScaleToolbox
45
45
  end
46
46
 
47
47
  def option_disabled
48
- !options[:disabled].nil?
48
+ options.fetch(:disabled, false)
49
49
  end
50
50
 
51
51
  def service
@@ -9,10 +9,10 @@ module ThreeScaleToolbox
9
9
  include ThreeScaleToolbox::Command
10
10
  def self.command
11
11
  Cri::Command.define do
12
- name 'metrics'
13
- usage 'metrics <sub-command> [options]'
14
- summary 'metrics super command'
15
- description 'Metrics commands'
12
+ name 'metric'
13
+ usage 'metric <sub-command> [options]'
14
+ summary 'metric super command'
15
+ description 'Metric commands'
16
16
 
17
17
  run do |_opts, _args, cmd|
18
18
  puts cmd.help
@@ -66,11 +66,11 @@ module ThreeScaleToolbox
66
66
  end
67
67
 
68
68
  def option_enabled
69
- !options[:enabled].nil?
69
+ options.fetch(:enabled, false)
70
70
  end
71
71
 
72
72
  def option_disabled
73
- !options[:disabled].nil?
73
+ options.fetch(:disabled, false)
74
74
  end
75
75
 
76
76
  def service
@@ -49,7 +49,7 @@ module ThreeScaleToolbox
49
49
  end
50
50
 
51
51
  def option_disabled
52
- !options[:disabled].nil?
52
+ options.fetch(:disabled, false)
53
53
  end
54
54
 
55
55
  def service
@@ -19,8 +19,8 @@ module ThreeScaleToolbox
19
19
  flag :p, :publish, 'Publish application plan'
20
20
  flag nil, :hide, 'Hide application plan'
21
21
  option nil, 'approval-required', 'Applications require approval. true or false', argument: :required, transform: ThreeScaleToolbox::Helper::BooleanTransformer.new
22
- option nil, 'cost-per-month', 'Cost per month', argument: :required, transform: method(:Integer)
23
- option nil, 'setup-fee', 'Setup fee', argument: :required, transform: method(:Integer)
22
+ option nil, 'cost-per-month', 'Cost per month', argument: :required, transform: method(:Float)
23
+ option nil, 'setup-fee', 'Setup fee', argument: :required, transform: method(:Float)
24
24
  option nil, 'trial-period-days', 'Trial period days', argument: :required, transform: method(:Integer)
25
25
  option nil, 'end-user-required', 'End user required. true or false', argument: :required, transform: ThreeScaleToolbox::Helper::BooleanTransformer.new
26
26
  param :remote
@@ -88,23 +88,23 @@ module ThreeScaleToolbox
88
88
  end
89
89
 
90
90
  def option_default
91
- !options[:default].nil?
91
+ options.fetch(:default, false)
92
92
  end
93
93
 
94
94
  def option_enabled
95
- !options[:enabled].nil?
95
+ options.fetch(:enabled, false)
96
96
  end
97
97
 
98
98
  def option_disabled
99
- !options[:disabled].nil?
99
+ options.fetch(:disabled, false)
100
100
  end
101
101
 
102
102
  def option_publish
103
- !options[:publish].nil?
103
+ options.fetch(:publish, false)
104
104
  end
105
105
 
106
106
  def option_hide
107
- !options[:hide].nil?
107
+ options.fetch(:hide, false)
108
108
  end
109
109
 
110
110
  def service
@@ -17,8 +17,8 @@ module ThreeScaleToolbox
17
17
  flag nil, :disabled, 'Disables all methods and metrics in this application plan'
18
18
  flag :p, :publish, 'Publish application plan'
19
19
  option nil, 'approval-required', 'Applications require approval. true or false', argument: :required, transform: ThreeScaleToolbox::Helper::BooleanTransformer.new
20
- option nil, 'cost-per-month', 'Cost per month', argument: :required, transform: method(:Integer)
21
- option nil, 'setup-fee', 'Setup fee', argument: :required, transform: method(:Integer)
20
+ option nil, 'cost-per-month', 'Cost per month', argument: :required, transform: method(:Float)
21
+ option nil, 'setup-fee', 'Setup fee', argument: :required, transform: method(:Float)
22
22
  option nil, 'trial-period-days', 'Trial period days', argument: :required, transform: method(:Integer)
23
23
  option nil, 'end-user-required', 'End user required. true or false', argument: :required, transform: ThreeScaleToolbox::Helper::BooleanTransformer.new
24
24
  param :remote
@@ -64,15 +64,15 @@ module ThreeScaleToolbox
64
64
  end
65
65
 
66
66
  def option_default
67
- !options[:default].nil?
67
+ options.fetch(:default, false)
68
68
  end
69
69
 
70
70
  def option_disabled
71
- !options[:disabled].nil?
71
+ options.fetch(:disabled, false)
72
72
  end
73
73
 
74
74
  def option_publish
75
- !options[:publish].nil?
75
+ options.fetch(:publish, false)
76
76
  end
77
77
 
78
78
  def service
@@ -0,0 +1,22 @@
1
+ require '3scale_toolbox/commands/policy_registry_command/copy_command'
2
+
3
+ module ThreeScaleToolbox
4
+ module Commands
5
+ module PolicyRegistryCommand
6
+ include ThreeScaleToolbox::Command
7
+ def self.command
8
+ Cri::Command.define do
9
+ name 'policy-registry'
10
+ usage 'policy-registry <sub-command> [options]'
11
+ summary 'policy-registry super command'
12
+ description 'Pôlicy Registry commands'
13
+
14
+ run do |_opts, _args, cmd|
15
+ puts cmd.help
16
+ end
17
+ end
18
+ end
19
+ add_subcommand(Copy::CopySubcommand)
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,85 @@
1
+ module ThreeScaleToolbox
2
+ module Commands
3
+ module PolicyRegistryCommand
4
+ module Copy
5
+ class CopySubcommand < Cri::CommandRunner
6
+ include ThreeScaleToolbox::Command
7
+
8
+ def self.command
9
+ Cri::Command.define do
10
+ name 'copy'
11
+ usage 'copy [opts] <source_remote> <target_remote>'
12
+ summary 'Copy policy registry'
13
+ description 'Copy policy registry'
14
+
15
+ param :source_remote
16
+ param :target_remote
17
+
18
+ runner CopySubcommand
19
+ end
20
+ end
21
+
22
+ def run
23
+ source_policies = source_remote.list_policy_registry
24
+ if source_policies.respond_to?(:has_key?) && (errors = source_policies['errors'])
25
+ raise ThreeScaleToolbox::ThreeScaleApiError.new('Could not list source policy registry', errors)
26
+ end
27
+
28
+ target_policies = target_remote.list_policy_registry
29
+ if target_policies.respond_to?(:has_key?) && (errors = target_policies['errors'])
30
+ raise ThreeScaleToolbox::ThreeScaleApiError.new('Could not list target policy registry', errors)
31
+ end
32
+
33
+ # Create missing
34
+ missing = missing_policies(source_policies, target_policies)
35
+ missing.each do |policy|
36
+ new_policy_registry = target_remote.create_policy_registry(policy)
37
+ if (errors = new_policy_registry['errors'])
38
+ raise ThreeScaleToolbox::ThreeScaleApiError.new('Could not create target policy registry', errors)
39
+ end
40
+ end
41
+
42
+ # Update those matching
43
+ matching = matching_policies(source_policies, target_policies)
44
+ matching.each do |policy|
45
+ updated_policy = target_remote.update_policy_registry(
46
+ "#{policy['name']}-#{policy['version']}", policy
47
+ )
48
+ if (errors = updated_policy['errors'])
49
+ raise ThreeScaleToolbox::ThreeScaleApiError.new('Could not update target policy registry', errors)
50
+ end
51
+ end
52
+
53
+ puts "Created #{missing.size} missing policies on target tenant"
54
+ puts "Updated #{matching.size} matching policies on target tenant"
55
+ end
56
+
57
+ private
58
+
59
+ def missing_policies(source_policies, target_policies)
60
+ ThreeScaleToolbox::Helper.array_difference(source_policies,
61
+ target_policies) do |source, target|
62
+ ThreeScaleToolbox::Helper.compare_hashes(source, target, %w[name version])
63
+ end
64
+ end
65
+
66
+ def matching_policies(source_policies, target_policies)
67
+ source_policies.select do |source|
68
+ target_policies.find do |target|
69
+ ThreeScaleToolbox::Helper.compare_hashes(source, target, %w[name version])
70
+ end
71
+ end
72
+ end
73
+
74
+ def source_remote
75
+ @source_remote ||= threescale_client(arguments[:source_remote])
76
+ end
77
+
78
+ def target_remote
79
+ @target_remote ||= threescale_client(arguments[:target_remote])
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,30 @@
1
+ require 'cri'
2
+ require '3scale_toolbox/base_command'
3
+ require '3scale_toolbox/commands/proxy_config_command/list_command'
4
+ require '3scale_toolbox/commands/proxy_config_command/show_command'
5
+ require '3scale_toolbox/commands/proxy_config_command/promote_command'
6
+
7
+ module ThreeScaleToolbox
8
+ module Commands
9
+ module ProxyConfigCommand
10
+ include ThreeScaleToolbox::Command
11
+
12
+ def self.command
13
+ Cri::Command.define do
14
+ name 'proxy-config'
15
+ usage 'proxy-config <sub-command> [options]'
16
+ summary 'proxy-config super command'
17
+ description 'Manage your Proxy Configurations'
18
+
19
+ run do |_opts, _args, cmd|
20
+ puts cmd.help
21
+ end
22
+ end
23
+ end
24
+
25
+ add_subcommand(List::ListSubcommand)
26
+ add_subcommand(Show::ShowSubcommand)
27
+ add_subcommand(Promote::PromoteSubcommand)
28
+ end
29
+ end
30
+ end