diff --git a/app/models/miq_worker.rb b/app/models/miq_worker.rb index 5effc09fd1c..90bcc329da7 100644 --- a/app/models/miq_worker.rb +++ b/app/models/miq_worker.rb @@ -61,16 +61,18 @@ def self.workers_configured_count end def self.has_minimal_env_option? - return false if MiqServer.minimal_env_options.empty? || required_roles.blank? + roles = if required_roles.kind_of?(Proc) + required_roles.call + else + required_roles + end - case required_roles - when String - MiqServer.minimal_env_options.include?(required_roles) - when Array - required_roles.any? { |role| MiqServer.minimal_env_options.include?(role) } - else - raise _("Unexpected type: ") - end + return false if MiqServer.minimal_env_options.empty? || roles.blank? + + roles = Array(roles) if roles.kind_of?(String) + raise _("Unexpected type: ") unless roles.kind_of?(Array) + + roles.any? { |role| MiqServer.minimal_env_options.include?(role) } end class_attribute :check_for_minimal_role, :default_queue_name, :required_roles, :maximum_workers_count, :include_stopping_workers_on_synchronize @@ -121,16 +123,18 @@ def self.find_alive(server_id = nil) end def self.has_required_role? - return true if required_roles.blank? + roles = if required_roles.kind_of?(Proc) + required_roles.call + else + required_roles + end - case required_roles - when String - MiqServer.my_server.has_active_role?(required_roles) - when Array - required_roles.any? { |role| MiqServer.my_server.has_active_role?(role) } - else - raise _("Unexpected type: ") - end + return true if roles.blank? + + roles = Array(roles) if roles.kind_of?(String) + raise _("Unexpected type: ") unless roles.kind_of?(Array) + + roles.any? { |role| MiqServer.my_server.has_active_role?(role) } end def self.enough_resource_to_start_worker? diff --git a/spec/models/miq_worker_spec.rb b/spec/models/miq_worker_spec.rb index 704d0218cbe..f78153ef3ce 100644 --- a/spec/models/miq_worker_spec.rb +++ b/spec/models/miq_worker_spec.rb @@ -117,6 +117,20 @@ def check_has_required_role(worker_role_names, expected_result) check_has_required_role(["bah"], false) end end + + context "when worker roles is a lambda" do + it "that is empty" do + check_has_required_role(-> { [] }, true) + end + + it "that is a subset of server roles" do + check_has_required_role(-> { ["foo"] }, true) + end + + it "that is not a subset of server roles" do + check_has_required_role(-> { ["bah"] }, false) + end + end end context ".workers_configured_count" do