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.
135 lines
4.1 KiB
Ruby
135 lines
4.1 KiB
Ruby
require "test_helper"
|
|
|
|
class CommanderTest < ActiveSupport::TestCase
|
|
setup do
|
|
configure_with(:deploy_with_roles)
|
|
end
|
|
|
|
test "lazy configuration" do
|
|
assert_equal Kamal::Configuration, @kamal.config.class
|
|
end
|
|
|
|
test "overwriting hosts" do
|
|
assert_equal [ "1.1.1.1", "1.1.1.2", "1.1.1.3", "1.1.1.4" ], @kamal.hosts
|
|
|
|
@kamal.specific_hosts = [ "1.1.1.1", "1.1.1.2" ]
|
|
assert_equal [ "1.1.1.1", "1.1.1.2" ], @kamal.hosts
|
|
|
|
@kamal.specific_hosts = [ "1.1.1.1*" ]
|
|
assert_equal [ "1.1.1.1" ], @kamal.hosts
|
|
|
|
@kamal.specific_hosts = [ "1.1.1.*", "*.1.2.*" ]
|
|
assert_equal [ "1.1.1.1", "1.1.1.2", "1.1.1.3", "1.1.1.4" ], @kamal.hosts
|
|
|
|
@kamal.specific_hosts = [ "*" ]
|
|
assert_equal [ "1.1.1.1", "1.1.1.2", "1.1.1.3", "1.1.1.4" ], @kamal.hosts
|
|
|
|
exception = assert_raises(ArgumentError) do
|
|
@kamal.specific_hosts = [ "*miss" ]
|
|
end
|
|
assert_match /hosts match for \*miss/, exception.message
|
|
end
|
|
|
|
test "filtering hosts by filtering roles" do
|
|
assert_equal [ "1.1.1.1", "1.1.1.2", "1.1.1.3", "1.1.1.4" ], @kamal.hosts
|
|
|
|
@kamal.specific_roles = [ "web" ]
|
|
assert_equal [ "1.1.1.1", "1.1.1.2" ], @kamal.hosts
|
|
|
|
exception = assert_raises(ArgumentError) do
|
|
@kamal.specific_roles = [ "*miss" ]
|
|
end
|
|
assert_match /roles match for \*miss/, exception.message
|
|
end
|
|
|
|
test "filtering roles" do
|
|
assert_equal [ "web", "workers" ], @kamal.roles.map(&:name)
|
|
|
|
@kamal.specific_roles = [ "workers" ]
|
|
assert_equal [ "workers" ], @kamal.roles.map(&:name)
|
|
|
|
@kamal.specific_roles = [ "w*" ]
|
|
assert_equal [ "web", "workers" ], @kamal.roles.map(&:name)
|
|
|
|
@kamal.specific_roles = [ "we*", "*orkers" ]
|
|
assert_equal [ "web", "workers" ], @kamal.roles.map(&:name)
|
|
|
|
@kamal.specific_roles = [ "*" ]
|
|
assert_equal [ "web", "workers" ], @kamal.roles.map(&:name)
|
|
|
|
exception = assert_raises(ArgumentError) do
|
|
@kamal.specific_roles = [ "*miss" ]
|
|
end
|
|
assert_match /roles match for \*miss/, exception.message
|
|
end
|
|
|
|
test "filtering roles by filtering hosts" do
|
|
assert_equal [ "web", "workers" ], @kamal.roles.map(&:name)
|
|
|
|
@kamal.specific_hosts = [ "1.1.1.3" ]
|
|
assert_equal [ "workers" ], @kamal.roles.map(&:name)
|
|
end
|
|
|
|
test "overwriting hosts with primary" do
|
|
assert_equal [ "1.1.1.1", "1.1.1.2", "1.1.1.3", "1.1.1.4" ], @kamal.hosts
|
|
|
|
@kamal.specific_primary!
|
|
assert_equal [ "1.1.1.1" ], @kamal.hosts
|
|
end
|
|
|
|
test "primary_host with specific hosts via role" do
|
|
@kamal.specific_roles = "workers"
|
|
assert_equal "1.1.1.3", @kamal.primary_host
|
|
end
|
|
|
|
test "primary_role" do
|
|
assert_equal "web", @kamal.primary_role.name
|
|
@kamal.specific_roles = "workers"
|
|
assert_equal "workers", @kamal.primary_role.name
|
|
end
|
|
|
|
test "roles_on" do
|
|
assert_equal [ "web" ], @kamal.roles_on("1.1.1.1").map(&:name)
|
|
assert_equal [ "workers" ], @kamal.roles_on("1.1.1.3").map(&:name)
|
|
end
|
|
|
|
test "default group strategy" do
|
|
assert_empty @kamal.boot_strategy
|
|
end
|
|
|
|
test "specific limit group strategy" do
|
|
configure_with(:deploy_with_boot_strategy)
|
|
|
|
assert_equal({ in: :groups, limit: 3, wait: 2 }, @kamal.boot_strategy)
|
|
end
|
|
|
|
test "percentage-based group strategy" do
|
|
configure_with(:deploy_with_percentage_boot_strategy)
|
|
|
|
assert_equal({ in: :groups, limit: 1, wait: 2 }, @kamal.boot_strategy)
|
|
end
|
|
|
|
test "percentage-based group strategy limit is at least 1" do
|
|
configure_with(:deploy_with_low_percentage_boot_strategy)
|
|
|
|
assert_equal({ in: :groups, limit: 1, wait: 2 }, @kamal.boot_strategy)
|
|
end
|
|
|
|
test "try to match the primary role from a list of specific roles" do
|
|
configure_with(:deploy_primary_web_role_override)
|
|
|
|
@kamal.specific_roles = [ "web_*" ]
|
|
assert_equal [ "web_tokyo", "web_chicago" ], @kamal.roles.map(&:name)
|
|
assert_equal "web_tokyo", @kamal.primary_role.name
|
|
assert_equal "1.1.1.3", @kamal.primary_host
|
|
assert_equal [ "1.1.1.3", "1.1.1.4", "1.1.1.1", "1.1.1.2" ], @kamal.hosts
|
|
end
|
|
|
|
private
|
|
def configure_with(variant)
|
|
@kamal = Kamal::Commander.new.tap do |kamal|
|
|
kamal.configure config_file: Pathname.new(File.expand_path("fixtures/#{variant}.yml", __dir__))
|
|
end
|
|
end
|
|
end
|