From fec4b312224ea0845561c2b5a3b3e0a16cf5c0fa Mon Sep 17 00:00:00 2001 From: Maggie Dreyer Date: Thu, 1 Jul 2021 13:57:20 -0700 Subject: [PATCH] (RK-135) Improve error message when no published mod versions exist This previously would throw an undefined method error when `current_release` was nil. Now, we check for that case and raise something that will be meaningful to the user. --- CHANGELOG.mkd | 1 + .../negative/neg_specify_deleted_forge_module.rb | 12 +++--------- lib/r10k/module/forge.rb | 6 +++++- spec/unit/module/forge_spec.rb | 9 ++++++++- 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.mkd b/CHANGELOG.mkd index a0c55b6af..19edb55e3 100644 --- a/CHANGELOG.mkd +++ b/CHANGELOG.mkd @@ -3,6 +3,7 @@ CHANGELOG Unreleased +- Attempting to download the latest version for a module that has no Forge releases will now issue a meaningful error. - Added an interface to R10K::Source::Base named `reload!` for updating the environments list for a given deployment; `reload!` is called before deployment purges to make r10k deploy pools more threadsafe. [#1172](https://github.com/puppetlabs/r10k/pull/1172) ---------- diff --git a/integration/tests/user_scenario/basic_workflow/negative/neg_specify_deleted_forge_module.rb b/integration/tests/user_scenario/basic_workflow/negative/neg_specify_deleted_forge_module.rb index 98fbd0530..0211c86ef 100644 --- a/integration/tests/user_scenario/basic_workflow/negative/neg_specify_deleted_forge_module.rb +++ b/integration/tests/user_scenario/basic_workflow/negative/neg_specify_deleted_forge_module.rb @@ -10,7 +10,7 @@ r10k_fqp = get_r10k_fqp(master) #Verification -error_notification_regex = /Does 'puppetlabs-regret' have at least one published release?/ +error_notification_regex = /The module puppetlabs-regret does not appear to have any published releases/ #File puppet_file = <<-PUPPETFILE @@ -40,12 +40,6 @@ #Tests step "Deploy production environment via r10k with specified module deleted" -on(master, "#{r10k_fqp} deploy environment -p -v", :acceptable_exit_codes => 1) do |result| - if get_puppet_version(master) < 4.0 - assert_match(error_notification_regex, result.stderr, 'Unexpected error was detected!') - else - expect_failure('expected to fail due to RK-135') do - assert_match(error_notification_regex, result.stderr, 'Unexpected error was detected!') - end - end +on(master, "#{r10k_fqp} deploy environment -p -v --trace", :acceptable_exit_codes => 1) do |result| + assert_match(error_notification_regex, result.stderr, 'Unexpected error was detected!') end diff --git a/lib/r10k/module/forge.rb b/lib/r10k/module/forge.rb index a1c8f9878..35ef8888c 100644 --- a/lib/r10k/module/forge.rb +++ b/lib/r10k/module/forge.rb @@ -83,7 +83,11 @@ def properties def expected_version if @expected_version == :latest begin - @expected_version = @v3_module.current_release.version + if @v3_module.current_release + @expected_version = @v3_module.current_release.version + else + raise PuppetForge::ReleaseNotFound, _("The module %{title} does not appear to have any published releases, cannot determine latest version.") % { title: @title } + end rescue Faraday::ResourceNotFound => e raise PuppetForge::ReleaseNotFound, _("The module %{title} does not exist on %{url}.") % {title: @title, url: PuppetForge::V3::Release.conn.url_prefix}, e.backtrace end diff --git a/spec/unit/module/forge_spec.rb b/spec/unit/module/forge_spec.rb index b82964beb..a7b877e17 100644 --- a/spec/unit/module/forge_spec.rb +++ b/spec/unit/module/forge_spec.rb @@ -104,9 +104,16 @@ it "uses the latest version from the forge when the version is :latest" do subject = described_class.new('branan/eight_hundred', fixture_modulepath, { version: :latest }) - expect(subject.v3_module).to receive_message_chain(:current_release, :version).and_return('8.8.8') + release = double("Module Release", version: '8.8.8') + expect(subject.v3_module).to receive(:current_release).and_return(release).twice expect(subject.expected_version).to eq '8.8.8' end + + it "throws when there are no available versions" do + subject = described_class.new('branan/eight_hundred', fixture_modulepath, { version: :latest }) + expect(subject.v3_module).to receive(:current_release).and_return(nil) + expect { subject.expected_version }.to raise_error(PuppetForge::ReleaseNotFound) + end end describe "determining the status" do