apisonator 2.100.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 (173) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +317 -0
  3. data/Gemfile +11 -0
  4. data/Gemfile.base +65 -0
  5. data/Gemfile.lock +319 -0
  6. data/Gemfile.on_prem +1 -0
  7. data/Gemfile.on_prem.lock +297 -0
  8. data/LICENSE +202 -0
  9. data/NOTICE +15 -0
  10. data/README.md +230 -0
  11. data/Rakefile +287 -0
  12. data/apisonator.gemspec +47 -0
  13. data/app/api/api.rb +13 -0
  14. data/app/api/internal/alert_limits.rb +32 -0
  15. data/app/api/internal/application_keys.rb +49 -0
  16. data/app/api/internal/application_referrer_filters.rb +43 -0
  17. data/app/api/internal/applications.rb +77 -0
  18. data/app/api/internal/errors.rb +54 -0
  19. data/app/api/internal/events.rb +42 -0
  20. data/app/api/internal/internal.rb +104 -0
  21. data/app/api/internal/metrics.rb +40 -0
  22. data/app/api/internal/service_tokens.rb +46 -0
  23. data/app/api/internal/services.rb +58 -0
  24. data/app/api/internal/stats.rb +42 -0
  25. data/app/api/internal/usagelimits.rb +62 -0
  26. data/app/api/internal/utilization.rb +23 -0
  27. data/bin/3scale_backend +223 -0
  28. data/bin/3scale_backend_worker +26 -0
  29. data/config.ru +4 -0
  30. data/config/puma.rb +192 -0
  31. data/config/schedule.rb +9 -0
  32. data/ext/mkrf_conf.rb +64 -0
  33. data/lib/3scale/backend.rb +67 -0
  34. data/lib/3scale/backend/alert_limit.rb +56 -0
  35. data/lib/3scale/backend/alerts.rb +137 -0
  36. data/lib/3scale/backend/analytics/kinesis.rb +3 -0
  37. data/lib/3scale/backend/analytics/kinesis/adapter.rb +180 -0
  38. data/lib/3scale/backend/analytics/kinesis/exporter.rb +86 -0
  39. data/lib/3scale/backend/analytics/kinesis/job.rb +135 -0
  40. data/lib/3scale/backend/analytics/redshift.rb +3 -0
  41. data/lib/3scale/backend/analytics/redshift/adapter.rb +367 -0
  42. data/lib/3scale/backend/analytics/redshift/importer.rb +83 -0
  43. data/lib/3scale/backend/analytics/redshift/job.rb +33 -0
  44. data/lib/3scale/backend/application.rb +330 -0
  45. data/lib/3scale/backend/application_events.rb +76 -0
  46. data/lib/3scale/backend/background_job.rb +65 -0
  47. data/lib/3scale/backend/configurable.rb +20 -0
  48. data/lib/3scale/backend/configuration.rb +151 -0
  49. data/lib/3scale/backend/configuration/loader.rb +42 -0
  50. data/lib/3scale/backend/constants.rb +19 -0
  51. data/lib/3scale/backend/cors.rb +84 -0
  52. data/lib/3scale/backend/distributed_lock.rb +67 -0
  53. data/lib/3scale/backend/environment.rb +21 -0
  54. data/lib/3scale/backend/error_storage.rb +52 -0
  55. data/lib/3scale/backend/errors.rb +343 -0
  56. data/lib/3scale/backend/event_storage.rb +120 -0
  57. data/lib/3scale/backend/experiment.rb +84 -0
  58. data/lib/3scale/backend/extensions.rb +5 -0
  59. data/lib/3scale/backend/extensions/array.rb +19 -0
  60. data/lib/3scale/backend/extensions/hash.rb +26 -0
  61. data/lib/3scale/backend/extensions/nil_class.rb +13 -0
  62. data/lib/3scale/backend/extensions/redis.rb +44 -0
  63. data/lib/3scale/backend/extensions/string.rb +13 -0
  64. data/lib/3scale/backend/extensions/time.rb +110 -0
  65. data/lib/3scale/backend/failed_jobs_scheduler.rb +141 -0
  66. data/lib/3scale/backend/job_fetcher.rb +122 -0
  67. data/lib/3scale/backend/listener.rb +728 -0
  68. data/lib/3scale/backend/listener_metrics.rb +99 -0
  69. data/lib/3scale/backend/logging.rb +48 -0
  70. data/lib/3scale/backend/logging/external.rb +44 -0
  71. data/lib/3scale/backend/logging/external/impl.rb +93 -0
  72. data/lib/3scale/backend/logging/external/impl/airbrake.rb +66 -0
  73. data/lib/3scale/backend/logging/external/impl/bugsnag.rb +69 -0
  74. data/lib/3scale/backend/logging/external/impl/default.rb +18 -0
  75. data/lib/3scale/backend/logging/external/resque.rb +57 -0
  76. data/lib/3scale/backend/logging/logger.rb +18 -0
  77. data/lib/3scale/backend/logging/middleware.rb +62 -0
  78. data/lib/3scale/backend/logging/middleware/json_writer.rb +21 -0
  79. data/lib/3scale/backend/logging/middleware/text_writer.rb +60 -0
  80. data/lib/3scale/backend/logging/middleware/writer.rb +143 -0
  81. data/lib/3scale/backend/logging/worker.rb +107 -0
  82. data/lib/3scale/backend/manifest.rb +80 -0
  83. data/lib/3scale/backend/memoizer.rb +277 -0
  84. data/lib/3scale/backend/metric.rb +275 -0
  85. data/lib/3scale/backend/metric/collection.rb +91 -0
  86. data/lib/3scale/backend/oauth.rb +4 -0
  87. data/lib/3scale/backend/oauth/token.rb +26 -0
  88. data/lib/3scale/backend/oauth/token_key.rb +30 -0
  89. data/lib/3scale/backend/oauth/token_storage.rb +313 -0
  90. data/lib/3scale/backend/oauth/token_value.rb +25 -0
  91. data/lib/3scale/backend/period.rb +3 -0
  92. data/lib/3scale/backend/period/boundary.rb +107 -0
  93. data/lib/3scale/backend/period/cache.rb +28 -0
  94. data/lib/3scale/backend/period/period.rb +402 -0
  95. data/lib/3scale/backend/queue_storage.rb +16 -0
  96. data/lib/3scale/backend/rack.rb +49 -0
  97. data/lib/3scale/backend/rack/exception_catcher.rb +136 -0
  98. data/lib/3scale/backend/rack/internal_error_catcher.rb +23 -0
  99. data/lib/3scale/backend/rack/prometheus.rb +19 -0
  100. data/lib/3scale/backend/saas.rb +6 -0
  101. data/lib/3scale/backend/saas_analytics.rb +4 -0
  102. data/lib/3scale/backend/server.rb +30 -0
  103. data/lib/3scale/backend/server/falcon.rb +52 -0
  104. data/lib/3scale/backend/server/puma.rb +71 -0
  105. data/lib/3scale/backend/service.rb +317 -0
  106. data/lib/3scale/backend/service_token.rb +97 -0
  107. data/lib/3scale/backend/stats.rb +8 -0
  108. data/lib/3scale/backend/stats/aggregator.rb +170 -0
  109. data/lib/3scale/backend/stats/aggregators/base.rb +72 -0
  110. data/lib/3scale/backend/stats/aggregators/response_code.rb +58 -0
  111. data/lib/3scale/backend/stats/aggregators/usage.rb +34 -0
  112. data/lib/3scale/backend/stats/bucket_reader.rb +135 -0
  113. data/lib/3scale/backend/stats/bucket_storage.rb +108 -0
  114. data/lib/3scale/backend/stats/cleaner.rb +195 -0
  115. data/lib/3scale/backend/stats/codes_commons.rb +14 -0
  116. data/lib/3scale/backend/stats/delete_job_def.rb +60 -0
  117. data/lib/3scale/backend/stats/key_generator.rb +73 -0
  118. data/lib/3scale/backend/stats/keys.rb +104 -0
  119. data/lib/3scale/backend/stats/partition_eraser_job.rb +58 -0
  120. data/lib/3scale/backend/stats/partition_generator_job.rb +46 -0
  121. data/lib/3scale/backend/stats/period_commons.rb +34 -0
  122. data/lib/3scale/backend/stats/stats_parser.rb +141 -0
  123. data/lib/3scale/backend/stats/storage.rb +113 -0
  124. data/lib/3scale/backend/statsd.rb +14 -0
  125. data/lib/3scale/backend/storable.rb +35 -0
  126. data/lib/3scale/backend/storage.rb +40 -0
  127. data/lib/3scale/backend/storage_async.rb +4 -0
  128. data/lib/3scale/backend/storage_async/async_redis.rb +21 -0
  129. data/lib/3scale/backend/storage_async/client.rb +205 -0
  130. data/lib/3scale/backend/storage_async/pipeline.rb +79 -0
  131. data/lib/3scale/backend/storage_async/resque_extensions.rb +30 -0
  132. data/lib/3scale/backend/storage_helpers.rb +278 -0
  133. data/lib/3scale/backend/storage_key_helpers.rb +9 -0
  134. data/lib/3scale/backend/storage_sync.rb +43 -0
  135. data/lib/3scale/backend/transaction.rb +62 -0
  136. data/lib/3scale/backend/transactor.rb +177 -0
  137. data/lib/3scale/backend/transactor/limit_headers.rb +54 -0
  138. data/lib/3scale/backend/transactor/notify_batcher.rb +139 -0
  139. data/lib/3scale/backend/transactor/notify_job.rb +47 -0
  140. data/lib/3scale/backend/transactor/process_job.rb +33 -0
  141. data/lib/3scale/backend/transactor/report_job.rb +84 -0
  142. data/lib/3scale/backend/transactor/status.rb +236 -0
  143. data/lib/3scale/backend/transactor/usage_report.rb +182 -0
  144. data/lib/3scale/backend/usage.rb +63 -0
  145. data/lib/3scale/backend/usage_limit.rb +115 -0
  146. data/lib/3scale/backend/use_cases/provider_key_change_use_case.rb +60 -0
  147. data/lib/3scale/backend/util.rb +17 -0
  148. data/lib/3scale/backend/validators.rb +26 -0
  149. data/lib/3scale/backend/validators/base.rb +36 -0
  150. data/lib/3scale/backend/validators/key.rb +17 -0
  151. data/lib/3scale/backend/validators/limits.rb +57 -0
  152. data/lib/3scale/backend/validators/oauth_key.rb +15 -0
  153. data/lib/3scale/backend/validators/oauth_setting.rb +15 -0
  154. data/lib/3scale/backend/validators/redirect_uri.rb +33 -0
  155. data/lib/3scale/backend/validators/referrer.rb +60 -0
  156. data/lib/3scale/backend/validators/service_state.rb +15 -0
  157. data/lib/3scale/backend/validators/state.rb +15 -0
  158. data/lib/3scale/backend/version.rb +5 -0
  159. data/lib/3scale/backend/views/oauth_access_tokens.builder +14 -0
  160. data/lib/3scale/backend/views/oauth_app_id_by_token.builder +4 -0
  161. data/lib/3scale/backend/worker.rb +87 -0
  162. data/lib/3scale/backend/worker_async.rb +88 -0
  163. data/lib/3scale/backend/worker_metrics.rb +44 -0
  164. data/lib/3scale/backend/worker_sync.rb +32 -0
  165. data/lib/3scale/bundler_shim.rb +17 -0
  166. data/lib/3scale/prometheus_server.rb +10 -0
  167. data/lib/3scale/tasks/connectivity.rake +41 -0
  168. data/lib/3scale/tasks/helpers.rb +3 -0
  169. data/lib/3scale/tasks/helpers/environment.rb +23 -0
  170. data/lib/3scale/tasks/stats.rake +131 -0
  171. data/lib/3scale/tasks/swagger.rake +46 -0
  172. data/licenses.xml +1215 -0
  173. metadata +227 -0
@@ -0,0 +1,60 @@
1
+ module ThreeScale
2
+ module Backend
3
+ module Validators
4
+ class Referrer < Base
5
+
6
+ # There are some users that depend on a previous version of the
7
+ # pattern_matches? method. We make this configurable to avoid breaking
8
+ # changes for those users.
9
+
10
+ class << self
11
+ def define_pattern_match(legacy)
12
+ class_eval do
13
+ if legacy
14
+ def pattern_matches?(pattern, value)
15
+ /#{pattern}/ =~ value
16
+ end
17
+ else
18
+ def pattern_matches?(pattern, value)
19
+ /\A#{pattern}\z/ =~ value
20
+ end
21
+ end
22
+ end
23
+ end
24
+ private :define_pattern_match
25
+
26
+ def behave_as_legacy(legacy)
27
+ # don't blow up if we still didn't define it
28
+ remove_method :pattern_matches? rescue NameError
29
+ define_pattern_match legacy
30
+ end
31
+ private :behave_as_legacy unless ThreeScale::Backend.test? # leave it public for tests
32
+ end
33
+
34
+ behave_as_legacy ThreeScale::Backend.configuration.legacy_referrer_filters
35
+
36
+ BYPASS = '*'.freeze
37
+ private_constant :BYPASS
38
+
39
+ def apply
40
+ if service.referrer_filters_required? && application.has_referrer_filters?
41
+ if application.referrer_filters.any? { |filter| matches?(filter, params[:referrer]) }
42
+ succeed!
43
+ else
44
+ fail!(ReferrerNotAllowed.new(params[:referrer]))
45
+ end
46
+ else
47
+ succeed!
48
+ end
49
+ end
50
+
51
+ private
52
+
53
+ def matches?(pattern, value)
54
+ return true if value == BYPASS
55
+ pattern_matches?(Regexp.escape(pattern).gsub('\*', '.*'), value)
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,15 @@
1
+ module ThreeScale
2
+ module Backend
3
+ module Validators
4
+ class ServiceState < Base
5
+ def apply
6
+ if service.active?
7
+ succeed!
8
+ else
9
+ fail!(ServiceNotActive.new)
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module ThreeScale
2
+ module Backend
3
+ module Validators
4
+ class State < Base
5
+ def apply
6
+ if application.active?
7
+ succeed!
8
+ else
9
+ fail!(ApplicationNotActive.new)
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,5 @@
1
+ module ThreeScale
2
+ module Backend
3
+ VERSION = '2.100.0'
4
+ end
5
+ end
@@ -0,0 +1,14 @@
1
+ xml.instruct!
2
+ xml.oauth_access_tokens do
3
+ @tokens.each do |t|
4
+ # Some bright head leaked the -1 that Redis uses to indicate there is no TTL
5
+ # associated with a key. The behaviour is inconsistent because somehow we
6
+ # BOTH expect that a token with no TTL does not have a "ttl" attribute in
7
+ # the generated XML and at the same time we expect (in some tests) that such
8
+ # tokens have this field with a -1 value.
9
+ #
10
+ # Just enforce the ttl to be -1 when there is none.
11
+ attrs = { :ttl => t.ttl || -1 }
12
+ xml.oauth_access_token t.token, attrs
13
+ end
14
+ end
@@ -0,0 +1,4 @@
1
+ xml.instruct!
2
+ xml.application do
3
+ xml.app_id @token_to_app_id
4
+ end
@@ -0,0 +1,87 @@
1
+ require '3scale/backend/configuration'
2
+ require '3scale/backend/logging/worker'
3
+ require '3scale/backend/logging/external'
4
+
5
+ module ThreeScale
6
+ module Backend
7
+ # Worker for working off background jobs. This is very stripped down version of the
8
+ # default resque worker with parts of code shamelessly stolen from it. The reason for
9
+ # this stripping is that the resque one does fork before processing each job, and that
10
+ # is too slow.
11
+
12
+ # This is a module that's meant to be included from the different workers.
13
+ # Now we have WorkerSync and WorkerAsync. Those classes need to implement
14
+ # #work, which is responsible for fetching jobs from the queue and running
15
+ # them by calling perform(job).
16
+ module Worker
17
+ include Resque::Helpers
18
+ include Configurable
19
+
20
+ def self.new(options = {})
21
+ Logging::Worker.configure_logging(self, options[:log_file])
22
+ Logging::External.setup_worker
23
+
24
+ if configuration.worker_prometheus_metrics.enabled
25
+ require '3scale/backend/worker_metrics'
26
+ WorkerMetrics.start_metrics_server
27
+ end
28
+
29
+ if options[:async]
30
+ # Conditional require is done to require async-* libs only when
31
+ # needed and avoid possible side-effects.
32
+ require '3scale/backend/worker_async'
33
+ WorkerAsync.new(options)
34
+ else
35
+ require '3scale/backend/worker_sync'
36
+ WorkerSync.new(options)
37
+ end
38
+ end
39
+
40
+ # == Options
41
+ #
42
+ # - :one_off - if true, will process one job, then quit
43
+ #
44
+ def self.work(options = {})
45
+ Process.setproctitle("3scale_backend_worker #{Backend::VERSION}")
46
+ options[:async] = configuration.redis.async
47
+ new(options).work
48
+ end
49
+
50
+ def work
51
+ raise 'Missing implementation of #work'
52
+ end
53
+
54
+ def shutdown
55
+ @shutdown = true
56
+ end
57
+
58
+ def to_s
59
+ @to_s ||= "#{hostname}:#{Process.pid}"
60
+ end
61
+
62
+ def one_off?
63
+ @one_off
64
+ end
65
+
66
+ private
67
+
68
+ def perform(job)
69
+ job.perform
70
+ rescue Exception => e
71
+ job.fail(e)
72
+ end
73
+
74
+ def register_worker
75
+ redis.sadd(:workers, self)
76
+ end
77
+
78
+ def unregister_worker
79
+ redis.srem(:workers, self)
80
+ end
81
+
82
+ def hostname
83
+ @hostname ||= (ENV['HOSTNAME'] || `hostname`.chomp)
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,88 @@
1
+ require 'async'
2
+ require '3scale/backend/job_fetcher'
3
+
4
+ module ThreeScale
5
+ module Backend
6
+ class WorkerAsync
7
+ include Backend::Worker
8
+ include Configurable
9
+
10
+ DEFAULT_MAX_CONCURRENT_JOBS = 20
11
+ private_constant :DEFAULT_MAX_CONCURRENT_JOBS
12
+
13
+ def initialize(options = {})
14
+ trap('TERM') { shutdown }
15
+ trap('INT') { shutdown }
16
+
17
+ @one_off = options[:one_off]
18
+ @jobs = Queue.new # Thread-safe queue
19
+
20
+ @job_fetcher = options[:job_fetcher] || JobFetcher.new
21
+
22
+ @max_concurrent_jobs = configuration.async_worker.max_concurrent_jobs ||
23
+ DEFAULT_MAX_CONCURRENT_JOBS
24
+
25
+ @reactor = Async::Reactor.new
26
+ end
27
+
28
+ def work
29
+ if one_off?
30
+ Async { process_one }
31
+ return
32
+ end
33
+
34
+ Async { register_worker }
35
+
36
+ fetch_jobs_thread = start_thread_to_fetch_jobs
37
+
38
+ loop do
39
+ break if @shutdown
40
+ schedule_jobs
41
+ @reactor.run
42
+ end
43
+
44
+ fetch_jobs_thread.join
45
+
46
+ # Ensure that we do not leave any jobs in memory
47
+ @reactor.async { perform(@jobs.pop) } until @jobs.empty?
48
+ @reactor.run
49
+
50
+ Async { unregister_worker }
51
+ end
52
+
53
+ def shutdown
54
+ @job_fetcher.shutdown
55
+ @shutdown = true
56
+ end
57
+
58
+ private
59
+
60
+ def schedule_jobs
61
+ scheduled = 0
62
+
63
+ loop do
64
+ # unblocks when there are new jobs or when .close() is called
65
+ job = @jobs.pop
66
+
67
+ break if @shutdown
68
+
69
+ @reactor.async { perform(job) }
70
+ scheduled += 1
71
+
72
+ break if @jobs.empty? or scheduled >= @max_concurrent_jobs
73
+ end
74
+ end
75
+
76
+ def process_one
77
+ job = @job_fetcher.fetch
78
+ perform(job) if job
79
+ end
80
+
81
+ def start_thread_to_fetch_jobs
82
+ Thread.new do
83
+ Async { @job_fetcher.start(@jobs) }
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,44 @@
1
+ require 'yabeda/prometheus'
2
+
3
+ Yabeda.configure do
4
+ group :apisonator_worker do
5
+ counter :job_count do
6
+ comment "Total number of jobs processed"
7
+ tags %i[type]
8
+ end
9
+
10
+ histogram :job_runtime do
11
+ comment "How long jobs take to run"
12
+ unit :seconds
13
+ tags %i[type]
14
+ buckets [0.005, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1]
15
+ end
16
+ end
17
+ end
18
+ Yabeda.configure!
19
+
20
+ module ThreeScale
21
+ module Backend
22
+ class WorkerMetrics
23
+ include Configurable
24
+
25
+ def self.start_metrics_server
26
+ # Yabeda does not accept the port as a param
27
+ port = configuration.worker_prometheus_metrics.port
28
+ ENV['PROMETHEUS_EXPORTER_PORT'] = port.to_s if port
29
+
30
+ Yabeda::Prometheus::Exporter.start_metrics_server!
31
+ end
32
+
33
+ def self.increase_job_count(job_class_name)
34
+ Yabeda.apisonator_worker.job_count.increment(
35
+ { type: job_class_name }, by: 1
36
+ )
37
+ end
38
+
39
+ def self.report_runtime(job_class_name, runtime)
40
+ Yabeda.apisonator_worker.job_runtime.measure({ type: job_class_name }, runtime)
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,32 @@
1
+ require '3scale/backend/job_fetcher'
2
+
3
+ module ThreeScale
4
+ module Backend
5
+ class WorkerSync
6
+ include Backend::Worker
7
+
8
+ def initialize(options = {})
9
+ trap('TERM') { shutdown }
10
+ trap('INT') { shutdown }
11
+
12
+ @one_off = options[:one_off]
13
+ @job_fetcher = options[:job_fetcher] || JobFetcher.new
14
+ end
15
+
16
+ def work
17
+ register_worker
18
+
19
+ loop do
20
+ break if @shutdown
21
+
22
+ job = @job_fetcher.fetch
23
+ perform(job) if job
24
+
25
+ break if one_off?
26
+ end
27
+
28
+ unregister_worker
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,17 @@
1
+ # Setup bundler if present before anything else.
2
+ #
3
+ # We are not guaranteed to be running in a Bundler context, so make sure we get
4
+ # the correct environment set up to require the correct code.
5
+ begin
6
+ require 'bundler/setup'
7
+ if !Bundler::SharedHelpers.in_bundle?
8
+ # Gemfile not found, try with relative Gemfile from us
9
+ require 'pathname'
10
+ ENV['BUNDLE_GEMFILE'] = File.expand_path(File.join('..', '..', '..', 'Gemfile'),
11
+ Pathname.new(__FILE__).realpath)
12
+ require 'bundler'
13
+ Bundler.setup
14
+ end
15
+ rescue LoadError, Bundler::BundlerError => e
16
+ STDERR.puts "CRITICAL: Bundler could not be loaded properly - #{e.message}"
17
+ end
@@ -0,0 +1,10 @@
1
+ # When required, starts the prometheus metrics server for the listener if the
2
+ # CONFIG_LISTENER_PROMETHEUS_METRICS_ENABLED env is set to true.
3
+
4
+ require_relative '../3scale/backend/listener_metrics'
5
+
6
+ # Config is not loaded at this point, so read ENV instead.
7
+ if ENV['CONFIG_LISTENER_PROMETHEUS_METRICS_ENABLED'].to_s == 'true'
8
+ prometheus_port = ENV['CONFIG_LISTENER_PROMETHEUS_METRICS_PORT']
9
+ ThreeScale::Backend::ListenerMetrics.start_metrics_server(prometheus_port)
10
+ end
@@ -0,0 +1,41 @@
1
+ namespace :connectivity do
2
+ desc 'Check connectivity of Redis Storage'
3
+ task :redis_storage_check do
4
+ redis_instance = ThreeScale::Backend::Storage.instance
5
+
6
+ if Environment.using_async_redis?
7
+ async_ping(redis_instance, 'storage')
8
+ else
9
+ ping(redis_instance, 'storage')
10
+ end
11
+ end
12
+
13
+ desc 'Check connectivity of Redis Queue Storage'
14
+ task :redis_storage_queue_check do
15
+ redis_instance = ThreeScale::Backend::QueueStorage.connection(
16
+ ThreeScale::Backend.environment,
17
+ ThreeScale::Backend.configuration,
18
+ )
19
+
20
+ if Environment.using_async_redis?
21
+ async_ping(redis_instance, 'queue storage')
22
+ else
23
+ ping(redis_instance, 'queue storage')
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ def async_ping(redis_instance, storage_type)
30
+ Async { ping(redis_instance, storage_type) }
31
+ end
32
+
33
+ def ping(redis_instance, storage_type)
34
+ redis_instance.ping
35
+ rescue => e
36
+ warn "Error connecting to Redis #{storage_type}: #{e}"
37
+ exit(false)
38
+ else
39
+ puts "Connection to Redis #{storage_type} performed successfully"
40
+ end
41
+ end