summaryrefslogtreecommitdiff
path: root/lib/gitlab/sidekiq_config.rb
blob: dc9886732b59cef8f6bc7060e7492fbd73145b6d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
require 'yaml'

module Gitlab
  module SidekiqConfig
    def self.redis_queues
      @redis_queues ||= Sidekiq::Queue.all.map(&:name)
    end

    # This method is called by `bin/sidekiq-cluster` in EE, which runs outside
    # of bundler/Rails context, so we cannot use any gem or Rails methods.
    def self.config_queues(rails_path = Rails.root.to_s)
      @config_queues ||= begin
        config = YAML.load_file(File.join(rails_path, 'config', 'sidekiq_queues.yml'))
        config[:queues].map(&:first)
      end
    end

    def self.cron_workers
      @cron_workers ||= Settings.cron_jobs.map { |job_name, options| options['job_class'].constantize }
    end

    def self.workers
      @workers ||= find_workers(Rails.root.join('app', 'workers'))
    end

    def self.default_queues
      [ActionMailer::DeliveryJob.queue_name, 'default']
    end

    def self.worker_queues
      @worker_queues ||= (workers.map(&:queue) + default_queues).uniq
    end

    def self.find_workers(root)
      concerns = root.join('concerns').to_s

      workers = Dir[root.join('**', '*.rb')]
        .reject { |path| path.start_with?(concerns) }

      workers.map! do |path|
        ns = Pathname.new(path).relative_path_from(root).to_s.gsub('.rb', '')

        ns.camelize.constantize
      end

      # Skip concerns
      workers.select { |w| w < Sidekiq::Worker }
    end
  end
end