36 lines
1.2 KiB
Ruby
36 lines
1.2 KiB
Ruby
require_relative 'servers_bootstrapper'
|
|
|
|
# Bootstrap groups of servers based on priorities: higher first.
|
|
# Doesn't start bootstrap of next group if bootstrap of previous group failed.
|
|
class PrioritizedGroupsBootstrapper
|
|
include PutsAndFlush
|
|
attr_reader :out
|
|
|
|
def initialize(out, jid, servers_with_priorities)
|
|
@out, @jid, @servers_with_priorities = out, jid, servers_with_priorities
|
|
end
|
|
|
|
# @param servers_with_priorities [Hash] is a Hash like
|
|
# {1 => [server1, server2]}
|
|
# Starts bootstrapping another group only after successful bootstrapping of previous.
|
|
def bootstrap_servers_by_priority
|
|
sorted_priorities.each do |priority|
|
|
puts_and_flush "Bootstrap servers with priority '#{priority}':"
|
|
bootstrapper = ServersBootstrapper.new(@out, @jid, @servers_with_priorities[priority])
|
|
bootstrap_results = bootstrapper.bootstrap_group
|
|
error = most_critical_error(bootstrap_results)
|
|
return error if error
|
|
end
|
|
ServersBootstrapper::Result.from_reason(:ok)
|
|
end
|
|
|
|
private
|
|
|
|
def sorted_priorities
|
|
@servers_with_priorities.keys.sort.reverse
|
|
end
|
|
|
|
def most_critical_error(results)
|
|
results.detect(&:bootstrap_error?) || results.detect(&:failed?)
|
|
end
|
|
end |