From 7c72dfcb5d0b6374a528231a915f2be7a98aa57b Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Mon, 30 Jan 2023 13:50:15 +0100 Subject: [PATCH] Include env validation of new config So we fail fast when required ENVs are missing! --- lib/mrsk/configuration.rb | 19 ++++++++++++++++++- test/configuration_test.rb | 12 +++++++----- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/lib/mrsk/configuration.rb b/lib/mrsk/configuration.rb index 8cbe2b87..c57f1610 100644 --- a/lib/mrsk/configuration.rb +++ b/lib/mrsk/configuration.rb @@ -39,7 +39,7 @@ class Mrsk::Configuration def initialize(raw_config, version: "missing", validate: true) @raw_config = ActiveSupport::InheritableOptions.new(raw_config) @version = version - ensure_required_keys_present if validate + valid? if validate end @@ -120,6 +120,12 @@ class Mrsk::Configuration end end + + def valid? + ensure_required_keys_present && ensure_env_available + end + + def to_h { roles: role_names, @@ -139,6 +145,7 @@ class Mrsk::Configuration private + # Will raise ArgumentError if any required config keys are missing def ensure_required_keys_present %i[ service image registry servers ].each do |key| raise ArgumentError, "Missing required configuration for #{key}" unless raw_config[key].present? @@ -151,6 +158,16 @@ class Mrsk::Configuration if raw_config.registry["password"].blank? raise ArgumentError, "You must specify a password for the registry in config/deploy.yml (or set the ENV variable if that's used)" end + + true + end + + # Will raise KeyError if any secret ENVs are missing + def ensure_env_available + env_args + roles.each(&:env_args) + + true end def role_names diff --git a/test/configuration_test.rb b/test/configuration_test.rb index 1a275c35..1cd45fcb 100644 --- a/test/configuration_test.rb +++ b/test/configuration_test.rb @@ -126,15 +126,17 @@ class ConfigurationTest < ActiveSupport::TestCase end test "env args with missing secret" do - config = Mrsk::Configuration.new(@deploy.tap { |c| c.merge!({ - env: { "secret" => [ "PASSWORD" ] } - }) }) - assert_raises(KeyError) do - assert_equal [ "-e", "PASSWORD=secret123" ], config.env_args + config = Mrsk::Configuration.new(@deploy.tap { |c| c.merge!({ + env: { "secret" => [ "PASSWORD" ] } + }) }) end end + test "valid config" do + assert @config.valid? + end + test "ssh options" do assert_equal "root", @config.ssh_options[:user]