3scale_toolbox 0.10.0 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
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