Sha256: 064ccd9f82ebbae67c1b9eb4ac2aeb64f2e0326639b0fcd10b4f337eb349030a

Contents?: true

Size: 850 Bytes

Versions: 10

Compression:

Stored size: 850 Bytes

Contents

class ProxyLoadBalancer
  def initialize
    @tasks   = {}
    @offline = []
  end

  # Get the least loaded proxy from the given list of proxies
  def next(proxies)
    exclude = @tasks.keys + @offline
    @tasks.merge!(get_counts(proxies - exclude))
    next_proxy = @tasks.select { |proxy, _| proxies.include?(proxy) }.min_by { |_, job_count| job_count }.try(:first)
    @tasks[next_proxy] += 1 if next_proxy.present?
    next_proxy
  end

  private

  def get_counts(proxies)
    proxies.inject({}) do |result, proxy|
      begin
        proxy_api = ProxyAPI::ForemanDynflow::DynflowProxy.new(:url => proxy.url)
        result[proxy] = proxy_api.tasks_count('running')
      rescue => e
        @offline << proxy
        Foreman::Logging.exception "Could not fetch task counts from #{proxy}, skipped.", e
      end
      result
    end
  end
end

Version data entries

10 entries across 10 versions & 1 rubygems

Version Path
foreman_remote_execution-0.3.0 app/services/proxy_load_balancer.rb
foreman_remote_execution-0.2.3 app/services/proxy_load_balancer.rb
foreman_remote_execution-0.2.2 app/services/proxy_load_balancer.rb
foreman_remote_execution-0.2.1 app/services/proxy_load_balancer.rb
foreman_remote_execution-0.1.2 app/services/proxy_load_balancer.rb
foreman_remote_execution-0.1.1 app/services/proxy_load_balancer.rb
foreman_remote_execution-0.1.0 app/services/proxy_load_balancer.rb
foreman_remote_execution-0.0.10 app/services/proxy_load_balancer.rb
foreman_remote_execution-0.0.8 app/services/proxy_load_balancer.rb
foreman_remote_execution-0.0.7 app/services/proxy_load_balancer.rb