Validate that all roles have hosts

This commit is contained in:
Jeremy Daer
2023-03-22 18:56:57 -07:00
parent 1887a6518e
commit 035e4afff7
3 changed files with 57 additions and 9 deletions

View File

@@ -80,7 +80,7 @@ class Mrsk::Configuration
end
def primary_web_host
role(:web).hosts.first
role(:web).primary_host
end
def traefik_hosts
@@ -196,6 +196,12 @@ class Mrsk::Configuration
raise ArgumentError, "You must specify a password for the registry in config/deploy.yml (or set the ENV variable if that's used)"
end
roles.each do |role|
if role.hosts.empty?
raise ArgumentError, "No servers specified for the #{role.name} role"
end
end
true
end

View File

@@ -7,6 +7,10 @@ class Mrsk::Configuration::Role
@name, @config = name.inquiry, config
end
def primary_host
hosts.first
end
def hosts
@hosts ||= extract_hosts_from_config
end
@@ -55,7 +59,7 @@ class Mrsk::Configuration::Role
config.servers
else
servers = config.servers[name]
servers.is_a?(Array) ? servers : servers["hosts"]
servers.is_a?(Array) ? servers : Array(servers["hosts"])
end
end

View File

@@ -26,14 +26,19 @@ class ConfigurationTest < ActiveSupport::TestCase
ENV.delete("VERSION")
end
test "ensure valid keys" do
%i[ service image registry ].each do |key|
test "#{key} config required" do
assert_raise(ArgumentError) do
Mrsk::Configuration.new(@deploy.tap { _1.delete(:service) })
Mrsk::Configuration.new(@deploy.tap { _1.delete(:image) })
Mrsk::Configuration.new(@deploy.tap { _1.delete(:registry) })
Mrsk::Configuration.new @deploy.tap { _1.delete key }
end
end
end
Mrsk::Configuration.new(@deploy.tap { _1[:registry].delete("username") })
Mrsk::Configuration.new(@deploy.tap { _1[:registry].delete("password") })
%w[ username password ].each do |key|
test "registry #{key} required" do
assert_raise(ArgumentError) do
Mrsk::Configuration.new @deploy.tap { _1[:registry].delete key }
end
end
end
@@ -148,6 +153,39 @@ class ConfigurationTest < ActiveSupport::TestCase
test "valid config" do
assert @config.valid?
assert @config_with_roles.valid?
end
test "hosts required for all roles" do
# Empty server list for implied web role
assert_raises(ArgumentError) do
Mrsk::Configuration.new @deploy.merge(servers: [])
end
# Empty server list
assert_raises(ArgumentError) do
Mrsk::Configuration.new @deploy.merge(servers: { "web" => [] })
end
# Missing hosts key
assert_raises(ArgumentError) do
Mrsk::Configuration.new @deploy.merge(servers: { "web" => {} })
end
# Empty hosts list
assert_raises(ArgumentError) do
Mrsk::Configuration.new @deploy.merge(servers: { "web" => { "hosts" => [] } })
end
# Nil hosts
assert_raises(ArgumentError) do
Mrsk::Configuration.new @deploy.merge(servers: { "web" => { "hosts" => nil } })
end
# One role with hosts, one without
assert_raises(ArgumentError) do
Mrsk::Configuration.new @deploy.merge(servers: { "web" => %w[ web ], "workers" => { "hosts" => %w[ ] } })
end
end
test "ssh options" do