diff --git a/lib/mrsk/configuration.rb b/lib/mrsk/configuration.rb index f95de700..074c7cf3 100644 --- a/lib/mrsk/configuration.rb +++ b/lib/mrsk/configuration.rb @@ -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 diff --git a/lib/mrsk/configuration/role.rb b/lib/mrsk/configuration/role.rb index f3e20e9a..bfc42fbe 100644 --- a/lib/mrsk/configuration/role.rb +++ b/lib/mrsk/configuration/role.rb @@ -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 diff --git a/test/configuration_test.rb b/test/configuration_test.rb index 30c4b049..ee381449 100644 --- a/test/configuration_test.rb +++ b/test/configuration_test.rb @@ -26,14 +26,19 @@ class ConfigurationTest < ActiveSupport::TestCase ENV.delete("VERSION") end - test "ensure valid keys" 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) }) + %i[ service image registry ].each do |key| + test "#{key} config required" do + assert_raise(ArgumentError) do + 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