ManageIQ/manageiq-providers-amazon

View on GitHub
app/models/manageiq/providers/amazon/agent_coordinator_worker/runner.rb

Summary

Maintainability
A
0 mins
Test Coverage
class ManageIQ::Providers::Amazon::AgentCoordinatorWorker::Runner < MiqWorker::Runner
  include ResponseThread
  def do_before_work_loop
    @coordinators = self.class.all_agent_coordinators_in_zone
    @coordinators.each(&:cleanup_agents)

    @coordinators_mutex = Mutex.new
    start_response_thread
  end

  def do_work
    @coordinators.each do |m|
      alive_agents = m.alive_agent_ids

      _log.info("Alive agents in EMS(guid=#{m.ems.guid}): #{alive_agents}.")

      # Only setup agents when:
      # 1. there is no running agents;
      # 2. get new requests;
      # 3. coordinator is not in deploying agent state;
      m.startup_agent if alive_agents.empty? && !m.request_queue_empty? && !m.deploying?

      # Turn flag off if deploying is done.
      m.deploying = false unless alive_agents.empty?
    end

    # Amazon providers may be added/removed. Keep monitor and update if needed.
    latest_ems_guids = self.class.amazon_ems_guids
    @coordinators_mutex.synchronize do
      coordinator_guids = @coordinators.collect { |m| m.ems.guid }
      self.class.refresh_coordinators(@coordinators, coordinator_guids, latest_ems_guids)
    end
  end

  def before_exit(_message, _exit_code)
    _log.info("Do cleanup before worker exits.")
    @coordinators.each(&:cleanup_agents)
  end

  def self.agent_coordinator_by_guid(guid)
    all_agent_coordinators_in_zone.find { |e| e.ems.guid == guid }
  end

  def self.ems_by_guid(guid)
    all_valid_ems_in_zone.detect { |e| e.guid == guid }
  end

  def self.amazon_ems_guids
    all_amazon_ems_in_zone.collect(&:guid)
  end

  def self.all_ems_in_zone
    MiqServer.my_server.zone.ext_management_systems
  end

  def self.all_valid_ems_in_zone
    all_ems_in_zone.select { |e| e.enabled && e.authentication_status_ok? }
  end

  def self.all_amazon_ems_in_zone
    all_valid_ems_in_zone.select { |e| e.kind_of?(ManageIQ::Providers::Amazon::CloudManager) }
  end

  def self.all_agent_coordinators_in_zone
    all_amazon_ems_in_zone.collect { |e| ManageIQ::Providers::Amazon::AgentCoordinator.new(e) }
  end

  def self.refresh_coordinators(coordinators, old_guids, new_guids)
    to_delete = old_guids - new_guids
    coordinators.delete_if { |m| to_delete.include?(m.ems.guid) } if to_delete.any?

    to_create = new_guids - old_guids
    to_create.each { |guid| coordinators << ManageIQ::Providers::Amazon::AgentCoordinator.new(ems_by_guid(guid)) }
  end
end