Extract Kamal::Commander::Specifics to deal with host and role setup and ensure that primary hosts and roles always come first. This means that in a rolling deploy we deploy to the primary ones first. This will be important when we remove the healthcheck step as we want to confirm the primary host can be deployed to before completing a deployment for other roles. By setting the hosts and roles all together in one place we can sort the primary ones to the front without creating infinite loops.
50 lines
1.5 KiB
Ruby
50 lines
1.5 KiB
Ruby
class Kamal::Commander::Specifics
|
|
attr_reader :primary_host, :primary_role, :hosts, :roles
|
|
delegate :stable_sort!, to: Kamal::Utils
|
|
|
|
def initialize(config, specific_hosts, specific_roles)
|
|
@config, @specific_hosts, @specific_roles = config, specific_hosts, specific_roles
|
|
|
|
@roles, @hosts = specified_roles, specified_hosts
|
|
|
|
@primary_host = specific_hosts&.first || primary_specific_role&.primary_host || config.primary_host
|
|
@primary_role = primary_or_first_role(roles_on(primary_host))
|
|
|
|
stable_sort!(roles) { |role| role == primary_role ? 0 : 1 }
|
|
stable_sort!(hosts) { |host| roles_on(host).any? { |role| role == primary_role } ? 0 : 1 }
|
|
end
|
|
|
|
def roles_on(host)
|
|
roles.select { |role| role.hosts.include?(host.to_s) }
|
|
end
|
|
|
|
def traefik_hosts
|
|
specific_hosts || config.traefik_hosts
|
|
end
|
|
|
|
def accessory_hosts
|
|
specific_hosts || config.accessories.flat_map(&:hosts)
|
|
end
|
|
|
|
private
|
|
attr_reader :config, :specific_hosts, :specific_roles
|
|
|
|
def primary_specific_role
|
|
primary_or_first_role(specific_roles) if specific_roles.present?
|
|
end
|
|
|
|
def primary_or_first_role(roles)
|
|
roles.detect { |role| role == config.primary_role } || roles.first
|
|
end
|
|
|
|
def specified_roles
|
|
(specific_roles || config.roles) \
|
|
.select { |role| ((specific_hosts || config.all_hosts) & role.hosts).any? }
|
|
end
|
|
|
|
def specified_hosts
|
|
(specific_hosts || config.all_hosts) \
|
|
.select { |host| (specific_roles || config.roles).flat_map(&:hosts).include?(host) }
|
|
end
|
|
end
|