diff --git a/lib/mail_room/arbitration/redis.rb b/lib/mail_room/arbitration/redis.rb index e68214f..6d43089 100644 --- a/lib/mail_room/arbitration/redis.rb +++ b/lib/mail_room/arbitration/redis.rb @@ -3,11 +3,13 @@ module MailRoom module Arbitration class Redis - Options = Struct.new(:redis_url, :namespace, :sentinels) do + Options = Struct.new(:redis_url, :namespace, :sentinels, :sentinel_username, :sentinel_password) do def initialize(mailbox) redis_url = mailbox.arbitration_options[:redis_url] || "redis://localhost:6379" namespace = mailbox.arbitration_options[:namespace] sentinels = mailbox.arbitration_options[:sentinels] + sentinel_username = mailbox.arbitration_options[:sentinel_username] + sentinel_password = mailbox.arbitration_options[:sentinel_password] if namespace warn <<~MSG @@ -16,7 +18,7 @@ def initialize(mailbox) MSG end - super(redis_url, namespace, sentinels) + super(redis_url, namespace, sentinels, sentinel_username, sentinel_password) end end @@ -48,6 +50,8 @@ def client sentinels = options.sentinels redis_options = { url: options.redis_url } redis_options[:sentinels] = sentinels if sentinels + redis_options[:sentinel_username] = options.sentinel_username if options.sentinel_username + redis_options[:sentinel_password] = options.sentinel_password if options.sentinel_password redis = ::Redis.new(redis_options) diff --git a/lib/mail_room/delivery/sidekiq.rb b/lib/mail_room/delivery/sidekiq.rb index b1e456f..a5e28ed 100644 --- a/lib/mail_room/delivery/sidekiq.rb +++ b/lib/mail_room/delivery/sidekiq.rb @@ -8,12 +8,14 @@ module Delivery # Sidekiq Delivery method # @author Douwe Maan class Sidekiq - Options = Struct.new(:redis_url, :namespace, :sentinels, :queue, :worker, :logger, :redis_db) do + Options = Struct.new(:redis_url, :namespace, :sentinels, :queue, :worker, :logger, :redis_db, :sentinel_username, :sentinel_password) do def initialize(mailbox) redis_url = mailbox.delivery_options[:redis_url] || "redis://localhost:6379" redis_db = mailbox.delivery_options[:redis_db] || 0 namespace = mailbox.delivery_options[:namespace] sentinels = mailbox.delivery_options[:sentinels] + sentinel_username = mailbox.delivery_options[:sentinel_username] + sentinel_password = mailbox.delivery_options[:sentinel_password] queue = mailbox.delivery_options[:queue] || "default" worker = mailbox.delivery_options[:worker] logger = mailbox.logger @@ -25,7 +27,7 @@ def initialize(mailbox) MSG end - super(redis_url, namespace, sentinels, queue, worker, logger, redis_db) + super(redis_url, namespace, sentinels, queue, worker, logger, redis_db, sentinel_username, sentinel_password) end end @@ -55,6 +57,8 @@ def client sentinels = options.sentinels redis_options = { url: options.redis_url, db: options.redis_db } redis_options[:sentinels] = sentinels if sentinels + redis_options[:sentinel_username] = options.sentinel_username if options.sentinel_username + redis_options[:sentinel_password] = options.sentinel_password if options.sentinel_password redis = ::Redis.new(redis_options) diff --git a/spec/lib/arbitration/redis_spec.rb b/spec/lib/arbitration/redis_spec.rb index d228e6f..bdf0f45 100644 --- a/spec/lib/arbitration/redis_spec.rb +++ b/spec/lib/arbitration/redis_spec.rb @@ -144,6 +144,30 @@ expect(raw_client.config.password).to eq('mypassword') expect(raw_client.config.sentinels.map(&:server_url)).to eq(["redis://10.0.0.1:26379"]) end + + context 'with separate Sentinel username and password' do + let(:sentinel_username) { 'my-sentinel-user' } + let(:sentinel_password) { 'my-sentinel-pass' } + let(:mailbox) { + build_mailbox( + arbitration_options: { + redis_url: redis_url, + sentinels: sentinels, + sentinel_username: sentinel_username, + sentinel_password: sentinel_password + } + ) + } + + it 'client uses Sentinel username and password' do + expect(raw_client.config).to be_a RedisClient::SentinelConfig + expect(raw_client.config.password).to eq('mypassword') + + sentinels = raw_client.config.sentinels + expect(sentinels.map(&:username).uniq).to eq([sentinel_username]) + expect(sentinels.map(&:password).uniq).to eq([sentinel_password]) + end + end end end end diff --git a/spec/lib/delivery/sidekiq_spec.rb b/spec/lib/delivery/sidekiq_spec.rb index 6552912..c2fabe9 100644 --- a/spec/lib/delivery/sidekiq_spec.rb +++ b/spec/lib/delivery/sidekiq_spec.rb @@ -93,7 +93,32 @@ expect(raw_client.config.password).to eq('mypassword') expect(raw_client.config.sentinels.map(&:server_url)).to eq(["redis://10.0.0.1:26379"]) end - end + context 'with separate Sentinel username and password' do + let(:sentinel_username) { 'my-sentinel-user' } + let(:sentinel_password) { 'my-sentinel-pass' } + let(:mailbox) { + build_mailbox( + delivery_method: :sidekiq, + delivery_options: { + redis_url: redis_url, + sentinels: sentinels, + sentinel_username: sentinel_username, + sentinel_password: sentinel_password + } + ) + } + + it 'client uses Sentinel username and password' do + expect(raw_client.config).to be_a RedisClient::SentinelConfig + expect(raw_client.config.password).to eq('mypassword') + + sentinels = raw_client.config.sentinels + + expect(sentinels.map(&:username).uniq).to eq([sentinel_username]) + expect(sentinels.map(&:password).uniq).to eq([sentinel_password]) + end + end + end end end