diff --git a/definitions/features/satellite.rb b/definitions/features/satellite.rb index 724535497..cb17444de 100644 --- a/definitions/features/satellite.rb +++ b/definitions/features/satellite.rb @@ -11,7 +11,7 @@ class Features::Satellite < ForemanMaintain::Feature end def target_version - '6.16' + satellite_maintain_target_version end def current_version diff --git a/definitions/scenarios/satellite_upgrade.rb b/definitions/scenarios/satellite_upgrade.rb index 6036aac82..ae8de8f00 100644 --- a/definitions/scenarios/satellite_upgrade.rb +++ b/definitions/scenarios/satellite_upgrade.rb @@ -4,15 +4,14 @@ def self.upgrade_metadata(&block) metadata do tags :upgrade_scenario confine do - (feature(:instance).downstream&.current_minor_version == '6.15' || \ - ForemanMaintain.upgrade_in_progress == '6.16') + feature(:instance).downstream&.satellite_upgrade_allowed? end instance_eval(&block) end end def target_version - '6.16' + feature(:instance).downstream&.satellite_maintain_target_version end end diff --git a/lib/foreman_maintain/concerns/downstream.rb b/lib/foreman_maintain/concerns/downstream.rb index f96f1e04f..ae738debe 100644 --- a/lib/foreman_maintain/concerns/downstream.rb +++ b/lib/foreman_maintain/concerns/downstream.rb @@ -1,6 +1,8 @@ module ForemanMaintain module Concerns module Downstream + SATELLITE_MAINTAIN_CONFIG = '/usr/share/satellite-maintain/config.yml'.freeze + def current_version raise NotImplementedError end @@ -46,8 +48,25 @@ def fm_pkg_and_cmd_name %w[satellite-maintain satellite-maintain] end + def satellite_maintain_target_version + satellite_maintain_config['current_satellite_version'] + end + + def satellite_upgrade_allowed? + current_minor_version == satellite_maintain_config['previous_satellite_version'] || + ForemanMaintain.upgrade_in_progress == satellite_maintain_target_version + end + private + def satellite_maintain_config + if File.exist?(SATELLITE_MAINTAIN_CONFIG) + YAML.load_file(SATELLITE_MAINTAIN_CONFIG) + else + raise "Could not load satellite-maintain configuration file #{SATELLITE_MAINTAIN_CONFIG}." + end + end + def rh_repos(server_version) server_version = version(server_version) rh_repos = main_rh_repos diff --git a/test/definitions/scenarios/capsule_upgrade_test.rb b/test/definitions/scenarios/capsule_upgrade_test.rb index aeac1ccc7..b1854caf0 100644 --- a/test/definitions/scenarios/capsule_upgrade_test.rb +++ b/test/definitions/scenarios/capsule_upgrade_test.rb @@ -5,6 +5,7 @@ before(:each) do assume_feature_present(:capsule) + mock_satellite_maintain_config end describe Scenarios::Satellite::PreUpgradeCheck do diff --git a/test/definitions/scenarios/satellite_upgrade_test.rb b/test/definitions/scenarios/satellite_upgrade_test.rb index 39f7791fb..0002b9292 100644 --- a/test/definitions/scenarios/satellite_upgrade_test.rb +++ b/test/definitions/scenarios/satellite_upgrade_test.rb @@ -5,6 +5,54 @@ before(:each) do assume_satellite_present + mock_satellite_maintain_config + end + + describe Scenarios::Satellite::Abstract do + let(:expected_scenarios) do + [Scenarios::Satellite::Migrations, Scenarios::Satellite::PostMigrations, + Scenarios::Satellite::PostUpgradeChecks, Scenarios::Satellite::PreMigrations, + Scenarios::Satellite::PreUpgradeCheck] + end + + it 'is present when running 6.15' do + Features::Satellite.any_instance.stubs(:current_version).returns('6.15') + + scenarios = find_scenarios({ :tags => [:upgrade_scenario] }) + + expected_scenarios.each do |exp| + assert scenarios.find { |s| s.is_a? exp }, "Expected #{exp} to be present" + end + end + + it 'is not present when already on 6.16' do + Features::Satellite.any_instance.stubs(:current_version).returns('6.16') + + scenarios = find_scenarios({ :tags => [:upgrade_scenario] }) + + assert_empty scenarios + end + + it 'is present when 6.16 upgrade in progress' do + Features::Satellite.any_instance.stubs(:current_version).returns('6.16') + ForemanMaintain.stubs(:upgrade_in_progress).returns('6.16') + + scenarios = find_scenarios({ :tags => [:upgrade_scenario] }) + + expected_scenarios.each do |exp| + assert scenarios.find { |s| s.is_a? exp }, "Expected #{exp} to be present" + end + end + + it 'sets target_version to 6.16' do + Features::Satellite.any_instance.stubs(:current_version).returns('6.15') + + scenarios = find_scenarios({ :tags => [:upgrade_scenario] }) + + scenarios.each do |scenario| + assert_equal '6.16', scenario.target_version + end + end end describe Scenarios::Satellite::PreUpgradeCheck do diff --git a/test/definitions/scenarios/self_upgrade_test.rb b/test/definitions/scenarios/self_upgrade_test.rb index a5077be55..6984323e9 100644 --- a/test/definitions/scenarios/self_upgrade_test.rb +++ b/test/definitions/scenarios/self_upgrade_test.rb @@ -7,6 +7,7 @@ before do File.stubs(:exist?).with('/etc/redhat-release').returns(true) + mock_satellite_maintain_config end let(:scenario) do @@ -59,6 +60,7 @@ before do File.stubs(:exist?).with('/etc/redhat-release').returns(true) + mock_satellite_maintain_config end it 'runs successfully for downstream Satellite' do diff --git a/test/definitions/scenarios/update_test.rb b/test/definitions/scenarios/update_test.rb index 39b9700e5..ef7376499 100644 --- a/test/definitions/scenarios/update_test.rb +++ b/test/definitions/scenarios/update_test.rb @@ -3,6 +3,10 @@ describe "update scenarios" do include DefinitionsTestHelper + before(:each) do + mock_satellite_maintain_config + end + it 'runs if versions match' do assume_satellite_present Features::Instance.any_instance.expects(:current_version).returns('6.16') diff --git a/test/definitions/test_helper.rb b/test/definitions/test_helper.rb index 0099aff5c..d6b6848a2 100644 --- a/test/definitions/test_helper.rb +++ b/test/definitions/test_helper.rb @@ -209,6 +209,15 @@ def assume_service_missing(name, priority = 30) yield service if block_given? end end + + def mock_satellite_maintain_config + config = { + 'current_satellite_version' => '6.16', + 'previous_satellite_version' => '6.15', + } + Features::Satellite.any_instance.stubs(:satellite_maintain_config).returns(config) + Features::Capsule.any_instance.stubs(:satellite_maintain_config).returns(config) + end end TEST_DIR = File.dirname(__FILE__)