From 1abe58204d5caa7bf1cba4075bc9627772c10e2a Mon Sep 17 00:00:00 2001 From: Chris Roberts Date: Wed, 27 Feb 2019 14:01:25 +0100 Subject: [PATCH] Fixes #26047 - Add check for puppet in cvv export. --- .../content_view_version.rb | 27 +--------- .../cv_import_export_helper.rb | 36 +++++++++++++ .../content_view/version/export_test.rb | 51 +++++++++++++++++-- 3 files changed, 85 insertions(+), 29 deletions(-) diff --git a/lib/hammer_cli_katello/content_view_version.rb b/lib/hammer_cli_katello/content_view_version.rb index 62bcacef..29987356 100644 --- a/lib/hammer_cli_katello/content_view_version.rb +++ b/lib/hammer_cli_katello/content_view_version.rb @@ -301,6 +301,7 @@ def execute export_json_options[:repositories] = [] else repositories = fetch_cvv_repositories(cvv) + puppet_check(cvv) check_repo_type(repositories) check_repo_download_policy(repositories) @@ -349,32 +350,6 @@ def create_tar(cv, cvv, repositories, json) FileUtils.rm_rf(export_prefix) end end - - def check_repo_type(repositories) - repositories.select do |repo| - if repo['content_type'] != 'yum' - raise _("The Repository '#{repo['name']}' is a non-yum repository."\ - " Only Yum is supported at this time."\ - " Please remove the repository from the Content View,"\ - " republish and try the export again.") - end - end - end - - def check_repo_download_policy(repositories) - non_immediate = repositories.select do |repo| - show(:repositories, 'id' => repo['library_instance_id'])['download_policy'] != 'immediate' - end - return true if non_immediate.empty? - - non_immediate_names = repositories.collect { |repo| repo['name'] } - msg = <<~MSG - All exported repositories must be set to an immediate download policy and re-synced. - The following repositories need action: - #{non_immediate_names.join(', ')} - MSG - raise _(msg) - end end class ImportCommand < HammerCLIForeman::Command diff --git a/lib/hammer_cli_katello/cv_import_export_helper.rb b/lib/hammer_cli_katello/cv_import_export_helper.rb index 5e74917c..54dee191 100644 --- a/lib/hammer_cli_katello/cv_import_export_helper.rb +++ b/lib/hammer_cli_katello/cv_import_export_helper.rb @@ -1,3 +1,4 @@ +# rubocop:disable Metrics/ModuleLength module HammerCLIKatello module CVImportExportHelper PUBLISHED_REPOS_DIR = "/var/lib/pulp/published/yum/https/repos/".freeze @@ -22,6 +23,41 @@ def find_local_component_id(component_from_export) found_composite_version.first['id'] end + def puppet_check(cvv) + unless cvv['puppet_modules'].empty? + raise _("The Content View '#{cvv['content_view']['label']}'"\ + " contains Puppet modules, this is not supported at this time."\ + " Please remove the modules, publish a new version"\ + " and try the export again.") + end + end + + def check_repo_type(repositories) + repositories.select do |repo| + if repo['content_type'] != 'yum' + raise _("The Repository '#{repo['name']}' is a non-yum repository."\ + " Only Yum is supported at this time."\ + " Please remove the repository from the Content View,"\ + " republish and try the export again.") + end + end + end + + def check_repo_download_policy(repositories) + non_immediate = repositories.select do |repo| + show(:repositories, 'id' => repo['library_instance_id'])['download_policy'] != 'immediate' + end + unless non_immediate.empty? + non_immediate_names = repositories.collect { |repo| repo['name'] } + msg = <<~MSG + All exported repositories must be set to an immediate download policy and re-synced. + The following repositories need action: + #{non_immediate_names.join(', ')} + MSG + raise _(msg) + end + end + def import_checks(cv, import_cv, major, minor) version = "#{major}.#{minor}".to_f diff --git a/test/functional/content_view/version/export_test.rb b/test/functional/content_view/version/export_test.rb index 9330c104..3ee3d945 100644 --- a/test/functional/content_view/version/export_test.rb +++ b/test/functional/content_view/version/export_test.rb @@ -20,7 +20,9 @@ 'major' => 1, 'minor' => 0, 'content_view' => {'name' => 'cv'}, - 'content_view_id' => 4321 + 'content_view_id' => 4321, + 'puppet_modules' => [] + ) ex = api_expects(:content_views, :show) @@ -108,7 +110,8 @@ 'major' => 1, 'minor' => 0, 'content_view' => {'name' => 'cv'}, - 'content_view_id' => 4321 + 'content_view_id' => 4321, + 'puppet_modules' => [] ) ex = api_expects(:content_views, :show) @@ -139,6 +142,47 @@ assert_equal(HammerCLI::EX_SOFTWARE, result.exit_code) end + it "fails export if cvv contains puppet module" do + params = [ + '--id=5', + '--export-dir=/tmp/exports' + ] + + ex = api_expects(:content_view_versions, :show) + ex.returns( + 'id' => '5', + 'repositories' => [{'id' => '2'}], + 'major' => 1, + 'minor' => 0, + 'content_view' => {'name' => 'cv'}, + 'content_view_id' => 4321, + 'puppet_modules' => [{'id' => '1'}] + ) + + ex = api_expects(:content_views, :show) + ex.returns( + 'id' => '4321', + 'composite' => false, + 'puppet_modules' => [{'id' => '1'}] + ) + + ex = api_expects(:repositories, :show).with_params('id' => '2') + ex.returns( + 'id' => '2', + 'label' => 'Test_Repo', + 'content_type' => 'yum', + 'backend_identifier' => 'Default_Organization-Library-Test_Repo', + 'relative_path' => 'Default_Organization/Library/Test_Repo', + 'library_instance_id' => '1' + ) + + File.expects(:exist?).with('/usr/share/foreman').returns(true) + File.stubs(:exist?).with('/var/log/hammer/hammer.log._copy_').returns(false) + + result = run_cmd(@cmd + params) + assert_equal(result.exit_code, 70) + end + it "fails export if any repository is set to on_demand" do params = [ '--id=5', @@ -152,7 +196,8 @@ 'major' => 1, 'minor' => 0, 'content_view' => {'name' => 'cv'}, - 'content_view_id' => 4321 + 'content_view_id' => 4321, + 'puppet_modules' => [] ) ex = api_expects(:content_views, :show)