Sha256: d4cd05ca157b3e88951f37e8fc53938e26e9d22619e38767bc4617dd9505095d
Contents?: true
Size: 1.56 KB
Versions: 11
Compression:
Stored size: 1.56 KB
Contents
module ForemanTasks class ProxySelector attr_reader :offline def initialize @tasks = {} @offline = [] end def strategies [:subnet, :fallback, :global] end def available_proxies(*_args, **_kwargs) raise NotImplementedError end def determine_proxy(*args, **kwargs) available_proxies = self.available_proxies(*args, **kwargs) return :not_defined if available_proxies.empty? || available_proxies.values.all?(&:empty?) proxy = nil strategies.each do |strategy| next if available_proxies[strategy].blank? proxy = select_by_jobs_count(available_proxies[strategy]) break if proxy end proxy || :not_available end # Get the least loaded proxy from the given list of proxies def select_by_jobs_count(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.each_with_object({}) do |proxy, result| 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 end
Version data entries
11 entries across 11 versions & 1 rubygems