From de45dc1b39a2f9470de7d0cf18b4ae15e82ef988 Mon Sep 17 00:00:00 2001 From: "Eric D. Helms" Date: Thu, 27 Jun 2024 10:14:51 -0400 Subject: [PATCH] Add tests for upgrade scenario --- .rubocop.yml | 3 + .../checks/foreman/check_corrupted_roles.rb | 2 +- .../foreman/check_duplicate_permission.rb | 2 +- .../foreman/validate_external_db_version.rb | 2 +- definitions/checks/system_registration.rb | 2 +- definitions/features/foreman_database.rb | 4 +- .../concerns/base_database.rb | 2 +- lib/foreman_maintain/detector.rb | 1 + .../assume_feature_dependencies_helper.rb | 4 + .../restore/reindex_databases_test.rb | 1 + .../scenarios/capsule_upgrade_test.rb | 168 ++++++++++++++ .../scenarios/satellite_upgrade_test.rb | 209 ++++++++++++++++-- test/definitions/test_helper.rb | 16 ++ 13 files changed, 395 insertions(+), 21 deletions(-) create mode 100644 test/definitions/scenarios/capsule_upgrade_test.rb diff --git a/.rubocop.yml b/.rubocop.yml index e3761e41a..a7617fec0 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -125,3 +125,6 @@ Style/StderrPuts: Metrics/ParameterLists: Max: 6 + +Style/TrailingCommaInArguments: + Enabled: false diff --git a/definitions/checks/foreman/check_corrupted_roles.rb b/definitions/checks/foreman/check_corrupted_roles.rb index 273140361..cdc2c8ea1 100644 --- a/definitions/checks/foreman/check_corrupted_roles.rb +++ b/definitions/checks/foreman/check_corrupted_roles.rb @@ -3,7 +3,7 @@ module Foreman class CheckCorruptedRoles < ForemanMaintain::Check metadata do label :corrupted_roles - for_feature :foreman_database + for_feature :foreman_server description 'Check for roles that have filters with multiple resources attached' tags :pre_upgrade end diff --git a/definitions/checks/foreman/check_duplicate_permission.rb b/definitions/checks/foreman/check_duplicate_permission.rb index 77bad7ca2..f88ebdf0c 100644 --- a/definitions/checks/foreman/check_duplicate_permission.rb +++ b/definitions/checks/foreman/check_duplicate_permission.rb @@ -3,7 +3,7 @@ module Foreman class CheckDuplicatePermissions < ForemanMaintain::Check metadata do label :duplicate_permissions - for_feature :foreman_database + for_feature :foreman_server description 'Check for duplicate permissions from database' tags :pre_upgrade end diff --git a/definitions/checks/foreman/validate_external_db_version.rb b/definitions/checks/foreman/validate_external_db_version.rb index ab8b2770e..0f604d69b 100644 --- a/definitions/checks/foreman/validate_external_db_version.rb +++ b/definitions/checks/foreman/validate_external_db_version.rb @@ -6,7 +6,7 @@ class ValidateExternalDbVersion < ForemanMaintain::Check tags :pre_upgrade label :validate_external_db_version confine do - feature(:foreman_database) && !feature(:foreman_database).local? + feature(:foreman_server) && !feature(:foreman_database).local? end end diff --git a/definitions/checks/system_registration.rb b/definitions/checks/system_registration.rb index 2dc9eb19f..5b6b6463d 100644 --- a/definitions/checks/system_registration.rb +++ b/definitions/checks/system_registration.rb @@ -5,7 +5,7 @@ class Checks::SystemRegistration < ForemanMaintain::Check tags :default confine do - file_exists?('/etc/rhsm/rhsm.conf') && feature(:instance).downstream + feature(:instance).downstream end end diff --git a/definitions/features/foreman_database.rb b/definitions/features/foreman_database.rb index fa1cd80ec..b72a9de66 100644 --- a/definitions/features/foreman_database.rb +++ b/definitions/features/foreman_database.rb @@ -7,7 +7,7 @@ class Features::ForemanDatabase < ForemanMaintain::Feature label :foreman_database confine do - file_nonzero?(FOREMAN_DB_CONFIG) + feature(:foreman_server) end end @@ -35,6 +35,8 @@ def services private def load_configuration + return {} unless File.exist?(FOREMAN_DB_CONFIG) + config = YAML.load(File.read(FOREMAN_DB_CONFIG)) @configuration = config['production'] @configuration['host'] ||= 'localhost' diff --git a/lib/foreman_maintain/concerns/base_database.rb b/lib/foreman_maintain/concerns/base_database.rb index 686a8c4af..320785576 100644 --- a/lib/foreman_maintain/concerns/base_database.rb +++ b/lib/foreman_maintain/concerns/base_database.rb @@ -42,7 +42,7 @@ def configuration end def local?(config = configuration) - ['localhost', '127.0.0.1', `hostname`.strip].include? config['host'] + ['localhost', '127.0.0.1', `hostname`.strip].include?(config['host']) || config.empty? end def query(sql, config = configuration) diff --git a/lib/foreman_maintain/detector.rb b/lib/foreman_maintain/detector.rb index 6d79fa55e..a95003b81 100644 --- a/lib/foreman_maintain/detector.rb +++ b/lib/foreman_maintain/detector.rb @@ -24,6 +24,7 @@ def refresh @all_features_scanned = false @available_checks = nil @available_scenarios = nil + @available_procedures = nil @scenarios ||= Scenario.all_sub_classes.select(&:autodetect?) end diff --git a/test/definitions/assume_feature_dependencies_helper.rb b/test/definitions/assume_feature_dependencies_helper.rb index d57f26626..e45f801e2 100644 --- a/test/definitions/assume_feature_dependencies_helper.rb +++ b/test/definitions/assume_feature_dependencies_helper.rb @@ -2,6 +2,10 @@ module AssumeFeatureDependenciesHelper def assume_satellite_present(&block) PackageManagerTestHelper.assume_package_exist('satellite') assume_feature_present(:satellite) unless block_given? + assume_feature_present(:foreman_server) unless block_given? + assume_feature_present(:katello) unless block_given? + assume_feature_present(:candlepin) unless block_given? + assume_feature_present(:foreman_tasks) unless block_given? assume_feature_present(:satellite, &block) end end diff --git a/test/definitions/procedures/restore/reindex_databases_test.rb b/test/definitions/procedures/restore/reindex_databases_test.rb index 01b894a81..c607fa2bd 100644 --- a/test/definitions/procedures/restore/reindex_databases_test.rb +++ b/test/definitions/procedures/restore/reindex_databases_test.rb @@ -10,6 +10,7 @@ before do assume_feature_present(:instance, :postgresql_local? => true) assume_feature_present(:foreman_database, :configuration => {}) + Features::Service.any_instance.expects(:handle_services) end it 'reindexes all DBs if DB is local' do diff --git a/test/definitions/scenarios/capsule_upgrade_test.rb b/test/definitions/scenarios/capsule_upgrade_test.rb new file mode 100644 index 000000000..f3a012725 --- /dev/null +++ b/test/definitions/scenarios/capsule_upgrade_test.rb @@ -0,0 +1,168 @@ +require 'test_helper' + +describe "capsule upgrade scenarios" do + include DefinitionsTestHelper + + before(:each) do + assume_feature_present(:capsule) + ForemanMaintain.config.stubs(:manage_crond).returns(true) + end + + describe Scenarios::Satellite::PreUpgradeCheck do + let(:scenario) do + Scenarios::Satellite::PreUpgradeCheck.new + end + + it 'composes all steps for Satellite on EL8' do + Scenarios::Satellite::PreUpgradeCheck.any_instance.stubs(:el_major_version).returns(8) + + assert_scenario_has_steps( + scenario, + Checks::ServerPing, + Checks::ServicesUp, + Checks::SystemRegistration, + Checks::CheckHotfixInstalled, + Checks::CheckTmout, + Checks::CheckUpstreamRepository, + Checks::Disk::AvailableSpace, + Checks::NonRhPackages, + Checks::PackageManager::Dnf::ValidateDnfConfig, + Checks::Repositories::CheckNonRhRepository, + Checks::CheckIpv6Disable, + Checks::Disk::AvailableSpacePostgresql13, + Checks::CheckOrganizationContentAccessMode, + Checks::Repositories::Validate, + ) + end + + it 'composes all steps for Satellite on EL9' do + Scenarios::Satellite::PreUpgradeCheck.any_instance.stubs(:el_major_version).returns(9) + + assert_scenario_has_steps( + scenario, + Checks::ServerPing, + Checks::ServicesUp, + Checks::SystemRegistration, + Checks::CheckHotfixInstalled, + Checks::CheckTmout, + Checks::CheckUpstreamRepository, + Checks::Disk::AvailableSpace, + Checks::NonRhPackages, + Checks::PackageManager::Dnf::ValidateDnfConfig, + Checks::Repositories::CheckNonRhRepository, + Checks::CheckIpv6Disable, + Checks::Disk::AvailableSpacePostgresql13, + Checks::CheckOrganizationContentAccessMode, + Checks::Repositories::Validate, + ) + end + end + + describe Scenarios::Satellite::PreMigrations do + let(:scenario) do + Scenarios::Satellite::PreMigrations.new + end + + it 'composes all steps for Satellite on EL8' do + Scenarios::Satellite::PreMigrations.any_instance.stubs(:el_major_version).returns(8) + + assert_scenario_has_steps( + scenario, + Procedures::MaintenanceMode::EnableMaintenanceMode, + Procedures::Crond::Stop, + ) + end + + it 'composes all steps for Satellite on EL9' do + Scenarios::Satellite::PreMigrations.any_instance.stubs(:el_major_version).returns(9) + + assert_scenario_has_steps( + scenario, + Procedures::MaintenanceMode::EnableMaintenanceMode, + Procedures::Crond::Stop, + ) + end + end + + describe Scenarios::Satellite::Migrations do + let(:scenario) do + Scenarios::Satellite::Migrations.new + end + + it 'composes all steps for Capsule on EL8' do + Scenarios::Satellite::Migrations.any_instance.stubs(:el_major_version).returns(8) + assert_scenario_has_step(scenario, Procedures::Packages::EnableModules) do |step| + assert_equal(['satellite-capsule:el8'], step.options['module_names']) + end + end + + it 'composes all steps for Capsule on EL9' do + Scenarios::Satellite::Migrations.any_instance.stubs(:el_major_version).returns(9) + refute_scenario_has_step(scenario, Procedures::Packages::EnableModules) + end + end + + describe Scenarios::Satellite::PostMigrations do + let(:scenario) do + Scenarios::Satellite::PostMigrations.new + end + + it 'composes all steps for Satellite on EL8' do + Scenarios::Satellite::PostMigrations.any_instance.stubs(:el_major_version).returns(8) + + assert_scenario_has_steps( + scenario, + Procedures::RefreshFeatures, + Procedures::Service::Start, + Procedures::Crond::Start, + Procedures::MaintenanceMode::DisableMaintenanceMode, + ) + end + + it 'composes all steps for Satellite on EL9' do + Scenarios::Satellite::PostMigrations.any_instance.stubs(:el_major_version).returns(9) + + assert_scenario_has_steps( + scenario, + Procedures::RefreshFeatures, + Procedures::Service::Start, + Procedures::Crond::Start, + Procedures::MaintenanceMode::DisableMaintenanceMode, + ) + end + end + + describe Scenarios::Satellite::PostUpgradeChecks do + let(:scenario) do + Scenarios::Satellite::PostUpgradeChecks.new + end + + it 'composes all steps for Satellite on EL8' do + Scenarios::Satellite::PostUpgradeChecks.any_instance.stubs(:el_major_version).returns(8) + + assert_scenario_has_steps( + scenario, + Checks::ServerPing, + Checks::ServicesUp, + Checks::SystemRegistration, + Procedures::Packages::CheckForReboot, + Procedures::Pulpcore::ContainerHandleImageMetadata, + Procedures::Repositories::IndexKatelloRepositoriesContainerMetatdata, + ) + end + + it 'composes all steps for Satellite on EL9' do + Scenarios::Satellite::PostUpgradeChecks.any_instance.stubs(:el_major_version).returns(9) + + assert_scenario_has_steps( + scenario, + Checks::ServerPing, + Checks::ServicesUp, + Checks::SystemRegistration, + Procedures::Packages::CheckForReboot, + Procedures::Pulpcore::ContainerHandleImageMetadata, + Procedures::Repositories::IndexKatelloRepositoriesContainerMetatdata, + ) + end + end +end diff --git a/test/definitions/scenarios/satellite_upgrade_test.rb b/test/definitions/scenarios/satellite_upgrade_test.rb index 54fb60d33..a394386b5 100644 --- a/test/definitions/scenarios/satellite_upgrade_test.rb +++ b/test/definitions/scenarios/satellite_upgrade_test.rb @@ -1,39 +1,218 @@ require 'test_helper' -module Scenarios - describe Scenarios::Satellite::Migrations do - include DefinitionsTestHelper +describe "satellite upgrade scenarios" do + include DefinitionsTestHelper + + before(:each) do + assume_satellite_present + ForemanMaintain.config.stubs(:manage_crond).returns(true) + end + + describe Scenarios::Satellite::PreUpgradeCheck do + let(:scenario) do + Scenarios::Satellite::PreUpgradeCheck.new + end + + it 'composes all steps for Satellite on EL8' do + Scenarios::Satellite::PreUpgradeCheck.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::Disk::AvailableSpacePostgresql13, + Checks::CheckOrganizationContentAccessMode, + Checks::Repositories::Validate, + ) + end + + it 'composes all steps for Satellite on EL9' do + Scenarios::Satellite::PreUpgradeCheck.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::Disk::AvailableSpacePostgresql13, + Checks::CheckOrganizationContentAccessMode, + Checks::Repositories::Validate, + ) + end + end + + describe Scenarios::Satellite::PreMigrations do + let(:scenario) do + Scenarios::Satellite::PreMigrations.new + end + + it 'composes all steps for Satellite on EL8' do + Scenarios::Satellite::PreMigrations.any_instance.stubs(:el_major_version).returns(8) + + assert_scenario_has_steps( + scenario, + Procedures::MaintenanceMode::EnableMaintenanceMode, + Procedures::Crond::Stop, + Procedures::SyncPlans::Disable, + ) + end + + it 'composes all steps for Satellite on EL9' do + Scenarios::Satellite::PreMigrations.any_instance.stubs(:el_major_version).returns(9) + assert_scenario_has_steps( + scenario, + Procedures::MaintenanceMode::EnableMaintenanceMode, + Procedures::Crond::Stop, + Procedures::SyncPlans::Disable, + ) + end + end + + describe Scenarios::Satellite::Migrations do let(:scenario) do Scenarios::Satellite::Migrations.new end it 'composes all steps for Satellite on EL8' do - assume_feature_present(:satellite) Scenarios::Satellite::Migrations.any_instance.stubs(:el_major_version).returns(8) assert_scenario_has_step(scenario, Procedures::Packages::EnableModules) do |step| assert_equal(['satellite:el8'], step.options['module_names']) end + + assert_scenario_has_steps( + scenario, + Procedures::Repositories::Setup, + Procedures::Packages::SwitchModules, + Procedures::Packages::EnableModules, + Procedures::Packages::Update, + Procedures::Service::Stop, + Procedures::Packages::Update, + Procedures::Installer::Run, + Procedures::Installer::UpgradeRakeTask, + ) end it 'composes all steps for Satellite on EL9' do - assume_feature_present(:satellite) Scenarios::Satellite::Migrations.any_instance.stubs(:el_major_version).returns(9) refute_scenario_has_step(scenario, Procedures::Packages::EnableModules) + + assert_scenario_has_steps( + scenario, + Procedures::Repositories::Setup, + Procedures::Packages::Update, + Procedures::Service::Stop, + Procedures::Packages::Update, + Procedures::Installer::Run, + Procedures::Installer::UpgradeRakeTask, + ) end + end - it 'composes all steps for Capsule on EL8' do - assume_feature_present(:capsule) - Scenarios::Satellite::Migrations.any_instance.stubs(:el_major_version).returns(8) - assert_scenario_has_step(scenario, Procedures::Packages::EnableModules) do |step| - assert_equal(['satellite-capsule:el8'], step.options['module_names']) - end + describe Scenarios::Satellite::PostMigrations do + let(:scenario) do + Scenarios::Satellite::PostMigrations.new end - it 'composes all steps for Capsule on EL9' do - assume_feature_present(:capsule) - Scenarios::Satellite::Migrations.any_instance.stubs(:el_major_version).returns(9) - refute_scenario_has_step(scenario, Procedures::Packages::EnableModules) + it 'composes all steps for Satellite on EL8' do + Scenarios::Satellite::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 for Satellite on EL9' do + Scenarios::Satellite::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::Satellite::PostUpgradeChecks do + let(:scenario) do + Scenarios::Satellite::PostUpgradeChecks.new + end + + it 'composes all steps for Satellite on EL8' do + Scenarios::Satellite::PostUpgradeChecks.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, + Procedures::Pulpcore::ContainerHandleImageMetadata, + Procedures::Repositories::IndexKatelloRepositoriesContainerMetatdata, + ) + end + + it 'composes all steps for Satellite on EL9' do + Scenarios::Satellite::PostUpgradeChecks.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, + Procedures::Pulpcore::ContainerHandleImageMetadata, + Procedures::Repositories::IndexKatelloRepositoriesContainerMetatdata, + ) end end end diff --git a/test/definitions/test_helper.rb b/test/definitions/test_helper.rb index c4fd85cbd..1e2eeebec 100644 --- a/test/definitions/test_helper.rb +++ b/test/definitions/test_helper.rb @@ -110,6 +110,22 @@ def assert_scenario_has_step(scenario, scenario_step) yield step if block_given? end + def assert_scenario_has_steps(scenario, *expected_steps) + expected_steps.each do |step| + assert_scenario_has_step(scenario, step) + end + + missing = scenario.steps.filter do |step| + !expected_steps.include?(step.class) + end + + assert_equal( + 0, + missing.length, + "\nExpected: #{expected_steps}\nActual: #{scenario.steps.map(&:class)}\nMissing: #{missing}" + ) + end + def refute_scenario_has_step(scenario, scenario_step) refute(scenario.steps.find { |step| step.is_a? scenario_step }, "Expected scenario not to have #{scenario_step}")