From 5f449fdb2658269ebdfd1aab976354d1b2e3168d Mon Sep 17 00:00:00 2001 From: "Eric D. Helms" Date: Mon, 5 Aug 2024 08:38:20 -0400 Subject: [PATCH] Only allow update scenario if target and current versions match --- definitions/scenarios/update.rb | 5 + test/definitions/scenarios/update_test.rb | 616 ++++++++++++++++++++++ 2 files changed, 621 insertions(+) create mode 100644 test/definitions/scenarios/update_test.rb diff --git a/definitions/scenarios/update.rb b/definitions/scenarios/update.rb index a39df7c9e..67403092c 100644 --- a/definitions/scenarios/update.rb +++ b/definitions/scenarios/update.rb @@ -3,6 +3,11 @@ class Abstract < ForemanMaintain::Scenario def self.update_metadata(&block) metadata do tags :update_scenario + + confine do + feature(:instance).target_version == feature(:instance).current_version.to_s[/^\d+\.\d+/] + end + instance_eval(&block) end end diff --git a/test/definitions/scenarios/update_test.rb b/test/definitions/scenarios/update_test.rb new file mode 100644 index 000000000..58f7179aa --- /dev/null +++ b/test/definitions/scenarios/update_test.rb @@ -0,0 +1,616 @@ +require 'test_helper' + +describe "update scenarios" do + include DefinitionsTestHelper + + it 'runs if versions match' do + assume_satellite_present + Features::Instance.any_instance.expects(:current_version).returns('6.16') + + assert Scenarios::Update::PreUpdateCheck.present? + end + + it 'does not run if versions mis-match' do + assume_satellite_present + Features::Instance.any_instance.expects(:current_version).returns('6.17') + + refute Scenarios::Update::PreUpdateCheck.present? + end + + context 'Satellite update' do + before(:each) do + assume_satellite_present + ForemanMaintain.config.stubs(:manage_crond).returns(true) + end + + describe Scenarios::Update::PreUpdateCheck do + let(:scenario) do + Scenarios::Update::PreUpdateCheck.new + end + + it 'composes all steps on EL8' do + Scenarios::Update::PreUpdateCheck.any_instance.stubs(:el_major_version).returns(8) + + assert_scenario_has_steps( + scenario, + Checks::Foreman::FactsNames, + Checks::ForemanTasks::NotPaused, + Checks::ServerPing, + Checks::ServicesUp, + Checks::SystemRegistration, + Checks::CheckHotfixInstalled, + Checks::CheckTmout, + Checks::CheckUpstreamRepository, + Checks::Disk::AvailableSpace, + Checks::Disk::AvailableSpaceCandlepin, + Checks::Foreman::CheckCorruptedRoles, + Checks::Foreman::CheckDuplicatePermissions, + Checks::Foreman::TuningRequirements, + Checks::ForemanTasks::Invalid::CheckOld, + Checks::ForemanTasks::Invalid::CheckPendingState, + Checks::ForemanTasks::Invalid::CheckPlanningState, + Checks::ForemanTasks::NotRunning, + Checks::NonRhPackages, + Checks::PackageManager::Dnf::ValidateDnfConfig, + Checks::Repositories::CheckNonRhRepository, + Checks::CheckIpv6Disable, + Checks::Repositories::Validate, + ) + end + + it 'composes all steps on EL9' do + Scenarios::Update::PreUpdateCheck.any_instance.stubs(:el_major_version).returns(9) + + assert_scenario_has_steps( + scenario, + Checks::Foreman::FactsNames, + Checks::ForemanTasks::NotPaused, + Checks::ServerPing, + Checks::ServicesUp, + Checks::SystemRegistration, + Checks::CheckHotfixInstalled, + Checks::CheckTmout, + Checks::CheckUpstreamRepository, + Checks::Disk::AvailableSpace, + Checks::Disk::AvailableSpaceCandlepin, + Checks::Foreman::CheckCorruptedRoles, + Checks::Foreman::CheckDuplicatePermissions, + Checks::Foreman::TuningRequirements, + Checks::ForemanTasks::Invalid::CheckOld, + Checks::ForemanTasks::Invalid::CheckPendingState, + Checks::ForemanTasks::Invalid::CheckPlanningState, + Checks::ForemanTasks::NotRunning, + Checks::NonRhPackages, + Checks::PackageManager::Dnf::ValidateDnfConfig, + Checks::Repositories::CheckNonRhRepository, + Checks::CheckIpv6Disable, + Checks::Repositories::Validate, + ) + end + end + + describe Scenarios::Update::PreMigrations do + let(:scenario) do + Scenarios::Update::PreMigrations.new + end + + it 'composes all steps on EL8' do + Scenarios::Update::PreMigrations.any_instance.stubs(:el_major_version).returns(8) + + assert_scenario_has_steps( + scenario, + Procedures::Packages::Update, + Procedures::MaintenanceMode::EnableMaintenanceMode, + Procedures::Crond::Stop, + Procedures::SyncPlans::Disable, + ) + end + + it 'composes all steps on EL9' do + Scenarios::Update::PreMigrations.any_instance.stubs(:el_major_version).returns(9) + + assert_scenario_has_steps( + scenario, + Procedures::Packages::Update, + Procedures::MaintenanceMode::EnableMaintenanceMode, + Procedures::Crond::Stop, + Procedures::SyncPlans::Disable, + ) + end + end + + describe Scenarios::Update::Migrations do + let(:scenario) do + Scenarios::Update::Migrations.new + end + + it 'composes all steps on EL8' do + Scenarios::Update::Migrations.any_instance.stubs(:el_major_version).returns(8) + + assert_scenario_has_steps( + scenario, + Procedures::Service::Stop, + Procedures::Packages::Update, + Procedures::Installer::Run, + Procedures::Installer::UpgradeRakeTask, + ) + end + + it 'composes all steps on EL9' do + Scenarios::Update::Migrations.any_instance.stubs(:el_major_version).returns(9) + + assert_scenario_has_steps( + scenario, + Procedures::Service::Stop, + Procedures::Packages::Update, + Procedures::Installer::Run, + Procedures::Installer::UpgradeRakeTask, + ) + end + end + + describe Scenarios::Update::PostMigrations do + let(:scenario) do + Scenarios::Update::PostMigrations.new + end + + it 'composes all steps on EL8' do + Scenarios::Update::PostMigrations.any_instance.stubs(:el_major_version).returns(8) + + assert_scenario_has_steps( + scenario, + Procedures::RefreshFeatures, + Procedures::Service::Start, + Procedures::Crond::Start, + Procedures::SyncPlans::Enable, + Procedures::MaintenanceMode::DisableMaintenanceMode, + ) + end + + it 'composes all steps on EL9' do + Scenarios::Update::PostMigrations.any_instance.stubs(:el_major_version).returns(9) + + assert_scenario_has_steps( + scenario, + Procedures::RefreshFeatures, + Procedures::Service::Start, + Procedures::Crond::Start, + Procedures::SyncPlans::Enable, + Procedures::MaintenanceMode::DisableMaintenanceMode, + ) + end + end + + describe Scenarios::Update::PostUpdateChecks do + let(:scenario) do + Scenarios::Update::PostUpdateChecks.new + end + + it 'composes all steps on EL8' do + Scenarios::Update::PostUpdateChecks.any_instance.stubs(:el_major_version).returns(8) + + assert_scenario_has_steps( + scenario, + Checks::Foreman::FactsNames, + Checks::ForemanTasks::NotPaused, + Checks::ServerPing, + Checks::ServicesUp, + Checks::SystemRegistration, + Procedures::Packages::CheckForReboot, + ) + end + + it 'composes all steps on EL9' do + Scenarios::Update::PostUpdateChecks.any_instance.stubs(:el_major_version).returns(9) + + assert_scenario_has_steps( + scenario, + Checks::Foreman::FactsNames, + Checks::ForemanTasks::NotPaused, + Checks::ServerPing, + Checks::ServicesUp, + Checks::SystemRegistration, + Procedures::Packages::CheckForReboot, + ) + end + end + end + + context 'Foreman update' do + before(:each) do + assume_foreman_present + ForemanMaintain.config.stubs(:manage_crond).returns(true) + end + + describe Scenarios::Update::PreUpdateCheck do + let(:scenario) do + Scenarios::Update::PreUpdateCheck.new + end + + it 'composes all steps on EL8' do + Scenarios::Update::PreUpdateCheck.any_instance.stubs(:el_major_version).returns(8) + + assert_scenario_has_steps( + scenario, + Checks::Foreman::FactsNames, + Checks::ForemanTasks::NotPaused, + Checks::ServerPing, + Checks::ServicesUp, + Checks::SystemRegistration, + Checks::CheckHotfixInstalled, + Checks::CheckTmout, + Checks::CheckUpstreamRepository, + Checks::Disk::AvailableSpace, + Checks::Disk::AvailableSpaceCandlepin, + Checks::Foreman::CheckCorruptedRoles, + Checks::Foreman::CheckDuplicatePermissions, + Checks::Foreman::TuningRequirements, + Checks::ForemanTasks::Invalid::CheckOld, + Checks::ForemanTasks::Invalid::CheckPendingState, + Checks::ForemanTasks::Invalid::CheckPlanningState, + Checks::ForemanTasks::NotRunning, + Checks::NonRhPackages, + Checks::PackageManager::Dnf::ValidateDnfConfig, + Checks::Repositories::CheckNonRhRepository, + Checks::CheckIpv6Disable, + Checks::Repositories::Validate, + ) + end + + it 'composes all steps on EL9' do + Scenarios::Update::PreUpdateCheck.any_instance.stubs(:el_major_version).returns(9) + + assert_scenario_has_steps( + scenario, + Checks::Foreman::FactsNames, + Checks::ForemanTasks::NotPaused, + Checks::ServerPing, + Checks::ServicesUp, + Checks::SystemRegistration, + Checks::CheckHotfixInstalled, + Checks::CheckTmout, + Checks::CheckUpstreamRepository, + Checks::Disk::AvailableSpace, + Checks::Disk::AvailableSpaceCandlepin, + Checks::Foreman::CheckCorruptedRoles, + Checks::Foreman::CheckDuplicatePermissions, + Checks::Foreman::TuningRequirements, + Checks::ForemanTasks::Invalid::CheckOld, + Checks::ForemanTasks::Invalid::CheckPendingState, + Checks::ForemanTasks::Invalid::CheckPlanningState, + Checks::ForemanTasks::NotRunning, + Checks::NonRhPackages, + Checks::PackageManager::Dnf::ValidateDnfConfig, + Checks::Repositories::CheckNonRhRepository, + Checks::CheckIpv6Disable, + Checks::Repositories::Validate, + ) + end + end + + describe Scenarios::Update::PreMigrations do + let(:scenario) do + Scenarios::Update::PreMigrations.new + end + + it 'composes all steps on EL8' do + Scenarios::Update::PreMigrations.any_instance.stubs(:el_major_version).returns(8) + + assert_scenario_has_steps( + scenario, + Procedures::Packages::Update, + Procedures::MaintenanceMode::EnableMaintenanceMode, + Procedures::Crond::Stop, + Procedures::SyncPlans::Disable, + ) + end + + it 'composes all steps on EL9' do + Scenarios::Update::PreMigrations.any_instance.stubs(:el_major_version).returns(9) + + assert_scenario_has_steps( + scenario, + Procedures::Packages::Update, + Procedures::MaintenanceMode::EnableMaintenanceMode, + Procedures::Crond::Stop, + Procedures::SyncPlans::Disable, + ) + end + end + + describe Scenarios::Update::Migrations do + let(:scenario) do + Scenarios::Update::Migrations.new + end + + it 'composes all steps on EL8' do + Scenarios::Update::Migrations.any_instance.stubs(:el_major_version).returns(8) + + assert_scenario_has_steps( + scenario, + Procedures::Service::Stop, + Procedures::Packages::Update, + Procedures::Installer::Run, + Procedures::Installer::UpgradeRakeTask, + ) + end + + it 'composes all steps on EL9' do + Scenarios::Update::Migrations.any_instance.stubs(:el_major_version).returns(9) + + assert_scenario_has_steps( + scenario, + Procedures::Service::Stop, + Procedures::Packages::Update, + Procedures::Installer::Run, + Procedures::Installer::UpgradeRakeTask, + ) + end + end + + describe Scenarios::Update::PostMigrations do + let(:scenario) do + Scenarios::Update::PostMigrations.new + end + + it 'composes all steps on EL8' do + Scenarios::Update::PostMigrations.any_instance.stubs(:el_major_version).returns(8) + + assert_scenario_has_steps( + scenario, + Procedures::RefreshFeatures, + Procedures::Service::Start, + Procedures::Crond::Start, + Procedures::SyncPlans::Enable, + Procedures::MaintenanceMode::DisableMaintenanceMode, + ) + end + + it 'composes all steps on EL9' do + Scenarios::Update::PostMigrations.any_instance.stubs(:el_major_version).returns(9) + + assert_scenario_has_steps( + scenario, + Procedures::RefreshFeatures, + Procedures::Service::Start, + Procedures::Crond::Start, + Procedures::SyncPlans::Enable, + Procedures::MaintenanceMode::DisableMaintenanceMode, + ) + end + end + + describe Scenarios::Update::PostUpdateChecks do + let(:scenario) do + Scenarios::Update::PostUpdateChecks.new + end + + it 'composes all steps on EL8' do + Scenarios::Update::PostUpdateChecks.any_instance.stubs(:el_major_version).returns(8) + + assert_scenario_has_steps( + scenario, + Checks::Foreman::FactsNames, + Checks::ForemanTasks::NotPaused, + Checks::ServerPing, + Checks::ServicesUp, + Checks::SystemRegistration, + Procedures::Packages::CheckForReboot, + ) + end + + it 'composes all steps on EL9' do + Scenarios::Update::PostUpdateChecks.any_instance.stubs(:el_major_version).returns(9) + + assert_scenario_has_steps( + scenario, + Checks::Foreman::FactsNames, + Checks::ForemanTasks::NotPaused, + Checks::ServerPing, + Checks::ServicesUp, + Checks::SystemRegistration, + Procedures::Packages::CheckForReboot, + ) + end + end + end + + context 'Katello update' do + before(:each) do + assume_katello_present + ForemanMaintain.config.stubs(:manage_crond).returns(true) + end + + describe Scenarios::Update::PreUpdateCheck do + let(:scenario) do + Scenarios::Update::PreUpdateCheck.new + end + + it 'composes all steps on EL8' do + Scenarios::Update::PreUpdateCheck.any_instance.stubs(:el_major_version).returns(8) + + assert_scenario_has_steps( + scenario, + Checks::Foreman::FactsNames, + Checks::ForemanTasks::NotPaused, + Checks::ServerPing, + Checks::ServicesUp, + Checks::SystemRegistration, + Checks::CheckHotfixInstalled, + Checks::CheckTmout, + Checks::CheckUpstreamRepository, + Checks::Disk::AvailableSpace, + Checks::Disk::AvailableSpaceCandlepin, + Checks::Foreman::CheckCorruptedRoles, + Checks::Foreman::CheckDuplicatePermissions, + Checks::Foreman::TuningRequirements, + Checks::ForemanTasks::Invalid::CheckOld, + Checks::ForemanTasks::Invalid::CheckPendingState, + Checks::ForemanTasks::Invalid::CheckPlanningState, + Checks::ForemanTasks::NotRunning, + Checks::NonRhPackages, + Checks::PackageManager::Dnf::ValidateDnfConfig, + Checks::Repositories::CheckNonRhRepository, + Checks::CheckIpv6Disable, + Checks::Repositories::Validate, + ) + end + + it 'composes all steps on EL9' do + Scenarios::Update::PreUpdateCheck.any_instance.stubs(:el_major_version).returns(9) + + assert_scenario_has_steps( + scenario, + Checks::Foreman::FactsNames, + Checks::ForemanTasks::NotPaused, + Checks::ServerPing, + Checks::ServicesUp, + Checks::SystemRegistration, + Checks::CheckHotfixInstalled, + Checks::CheckTmout, + Checks::CheckUpstreamRepository, + Checks::Disk::AvailableSpace, + Checks::Disk::AvailableSpaceCandlepin, + Checks::Foreman::CheckCorruptedRoles, + Checks::Foreman::CheckDuplicatePermissions, + Checks::Foreman::TuningRequirements, + Checks::ForemanTasks::Invalid::CheckOld, + Checks::ForemanTasks::Invalid::CheckPendingState, + Checks::ForemanTasks::Invalid::CheckPlanningState, + Checks::ForemanTasks::NotRunning, + Checks::NonRhPackages, + Checks::PackageManager::Dnf::ValidateDnfConfig, + Checks::Repositories::CheckNonRhRepository, + Checks::CheckIpv6Disable, + Checks::Repositories::Validate, + ) + end + end + + describe Scenarios::Update::PreMigrations do + let(:scenario) do + Scenarios::Update::PreMigrations.new + end + + it 'composes all steps on EL8' do + Scenarios::Update::PreMigrations.any_instance.stubs(:el_major_version).returns(8) + + assert_scenario_has_steps( + scenario, + Procedures::Packages::Update, + Procedures::MaintenanceMode::EnableMaintenanceMode, + Procedures::Crond::Stop, + Procedures::SyncPlans::Disable, + ) + end + + it 'composes all steps on EL9' do + Scenarios::Update::PreMigrations.any_instance.stubs(:el_major_version).returns(9) + + assert_scenario_has_steps( + scenario, + Procedures::Packages::Update, + Procedures::MaintenanceMode::EnableMaintenanceMode, + Procedures::Crond::Stop, + Procedures::SyncPlans::Disable, + ) + end + end + + describe Scenarios::Update::Migrations do + let(:scenario) do + Scenarios::Update::Migrations.new + end + + it 'composes all steps on EL8' do + Scenarios::Update::Migrations.any_instance.stubs(:el_major_version).returns(8) + + assert_scenario_has_steps( + scenario, + Procedures::Service::Stop, + Procedures::Packages::Update, + Procedures::Installer::Run, + Procedures::Installer::UpgradeRakeTask, + ) + end + + it 'composes all steps on EL9' do + Scenarios::Update::Migrations.any_instance.stubs(:el_major_version).returns(9) + + assert_scenario_has_steps( + scenario, + Procedures::Service::Stop, + Procedures::Packages::Update, + Procedures::Installer::Run, + Procedures::Installer::UpgradeRakeTask, + ) + end + end + + describe Scenarios::Update::PostMigrations do + let(:scenario) do + Scenarios::Update::PostMigrations.new + end + + it 'composes all steps on EL8' do + Scenarios::Update::PostMigrations.any_instance.stubs(:el_major_version).returns(8) + + assert_scenario_has_steps( + scenario, + Procedures::RefreshFeatures, + Procedures::Service::Start, + Procedures::Crond::Start, + Procedures::SyncPlans::Enable, + Procedures::MaintenanceMode::DisableMaintenanceMode, + ) + end + + it 'composes all steps on EL9' do + Scenarios::Update::PostMigrations.any_instance.stubs(:el_major_version).returns(9) + + assert_scenario_has_steps( + scenario, + Procedures::RefreshFeatures, + Procedures::Service::Start, + Procedures::Crond::Start, + Procedures::SyncPlans::Enable, + Procedures::MaintenanceMode::DisableMaintenanceMode, + ) + end + end + + describe Scenarios::Update::PostUpdateChecks do + let(:scenario) do + Scenarios::Update::PostUpdateChecks.new + end + + it 'composes all steps on EL8' do + Scenarios::Update::PostUpdateChecks.any_instance.stubs(:el_major_version).returns(8) + + assert_scenario_has_steps( + scenario, + Checks::Foreman::FactsNames, + Checks::ForemanTasks::NotPaused, + Checks::ServerPing, + Checks::ServicesUp, + Checks::SystemRegistration, + Procedures::Packages::CheckForReboot, + ) + end + + it 'composes all steps on EL9' do + Scenarios::Update::PostUpdateChecks.any_instance.stubs(:el_major_version).returns(9) + + assert_scenario_has_steps( + scenario, + Checks::Foreman::FactsNames, + Checks::ForemanTasks::NotPaused, + Checks::ServerPing, + Checks::ServicesUp, + Checks::SystemRegistration, + Procedures::Packages::CheckForReboot, + ) + end + end + end +end