Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'rubocop/cop/redis_queue_usage.rb')
-rw-r--r--rubocop/cop/redis_queue_usage.rb38
1 files changed, 38 insertions, 0 deletions
diff --git a/rubocop/cop/redis_queue_usage.rb b/rubocop/cop/redis_queue_usage.rb
new file mode 100644
index 00000000000..d993abc6327
--- /dev/null
+++ b/rubocop/cop/redis_queue_usage.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+module RuboCop
+ module Cop
+ # This class complements Rubocop::Cop::SidekiqRedisCall by disallowing the use of
+ # Gitlab::Redis::Queues with the exception of initialising Sidekiq and monitoring.
+ class RedisQueueUsage < RuboCop::Cop::Base
+ MSG = 'Gitlab::Redis::Queues should only be used by Sidekiq initializers. '\
+ 'Assignments or using its params to initialise another connection is not allowed.'
+
+ def_node_matcher :calling_redis_queue_module_methods?, <<~PATTERN
+ (send (const (const (const nil? :Gitlab) :Redis) :Queues) ...)
+ PATTERN
+
+ def_node_matcher :using_redis_queue_module_as_parameter?, <<~PATTERN
+ (send ... (const (const (const nil? :Gitlab) :Redis) :Queues))
+ PATTERN
+
+ def_node_matcher :redis_queue_assignment?, <<~PATTERN
+ ({lvasgn | ivasgn | cvasgn | gvasgn | casgn | masgn | op_asgn | or_asgn | and_asgn } ...
+ `(const (const (const nil? :Gitlab) :Redis) :Queues))
+ PATTERN
+
+ def on_send(node)
+ return unless using_redis_queue_module_as_parameter?(node) || calling_redis_queue_module_methods?(node)
+
+ add_offense(node, message: MSG)
+ end
+
+ # offenses caught in assignment may overlap with on_send
+ %i[on_lvasgn on_ivasgn on_cvasgn on_gvasgn on_casgn on_masgn on_op_asgn on_or_asgn on_and_asgn].each do |name|
+ define_method(name) do |node|
+ add_offense(node, message: MSG) if redis_queue_assignment?(node)
+ end
+ end
+ end
+ end
+end