class ForemanMaintain::UpdateRunner
Constants
- PHASES
Attributes
phase[R]
Public Class Methods
new(reporter, options = {})
click to toggle source
Calls superclass method
ForemanMaintain::Runner::new
# File lib/foreman_maintain/update_runner.rb, line 15 def initialize(reporter, options = {}) super(reporter, [], options) @scenario_cache = {} self.phase = :pre_update_checks end
Public Instance Methods
find_scenario(phase)
click to toggle source
# File lib/foreman_maintain/update_runner.rb, line 21 def find_scenario(phase) return @scenario_cache[phase] if @scenario_cache.key?(phase) condition = { :tags => [:update_scenario, phase] } matching_scenarios = find_scenarios(condition) @scenario_cache[phase] = matching_scenarios.first end
finish_update()
click to toggle source
# File lib/foreman_maintain/update_runner.rb, line 46 def finish_update @finished = true @reporter.hline @reporter.puts("Update finished.\n") end
load()
click to toggle source
deserializes the state of the run from the storage
# File lib/foreman_maintain/update_runner.rb, line 67 def load return unless storage[:serialized] load_from_hash(storage[:serialized]) end
run()
click to toggle source
# File lib/foreman_maintain/update_runner.rb, line 29 def run PHASES.each do |phase| return run_rollback if quit? run_phase(phase) end finish_update unless quit? end
run_phase(phase)
click to toggle source
# File lib/foreman_maintain/update_runner.rb, line 73 def run_phase(phase) scenario = find_scenario(phase) return if scenario.nil? || scenario.steps.empty? confirm_scenario(scenario) return if quit? self.phase = phase run_scenario(scenario) # if we started from the :pre_update_checks, ensure to ask before # continuing with the rest of the update @ask_to_confirm_update = phase == :pre_update_checks end
run_rollback()
click to toggle source
# File lib/foreman_maintain/update_runner.rb, line 39 def run_rollback # we only are able to rollback from pre_migrations phase if phase == :pre_migrations rollback_pre_migrations end end
save()
click to toggle source
serializes the state of the run to storage
# File lib/foreman_maintain/update_runner.rb, line 57 def save if @finished storage.delete(:serialized) else storage[:serialized] = to_hash end storage.save end
storage()
click to toggle source
# File lib/foreman_maintain/update_runner.rb, line 52 def storage ForemanMaintain.storage("update") end
Private Instance Methods
confirm_scenario(scenario)
click to toggle source
Calls superclass method
ForemanMaintain::Runner#confirm_scenario
# File lib/foreman_maintain/update_runner.rb, line 132 def confirm_scenario(scenario) decision = super(scenario) # we have not asked the user already about next steps if decision.nil? && @ask_to_confirm_update response = reporter.ask_decision(<<~MESSAGE.strip) The pre-update checks indicate that the system is ready for update. It's recommended to perform a backup at this stage. Confirm to continue with the modification part of the update MESSAGE if [:no, :quit].include?(response) ask_to_quit end end response ensure @ask_to_confirm_update = false end
load_from_hash(hash)
click to toggle source
# File lib/foreman_maintain/update_runner.rb, line 121 def load_from_hash(hash) unless @scenario_cache.empty? raise "Some scenarios are already initialized: #{@scenario_cache.keys}" end self.phase = hash[:phase] hash[:scenarios].each do |key, scenario_hash| @scenario_cache[key] = Scenario.new_from_hash(scenario_hash) end end
phase=(phase)
click to toggle source
# File lib/foreman_maintain/update_runner.rb, line 150 def phase=(phase) raise "Unknown phase #{phase}" unless PHASES.include?(phase) @phase = phase end
rollback_pre_migrations()
click to toggle source
# File lib/foreman_maintain/update_runner.rb, line 89 def rollback_pre_migrations raise "Unexpected phase #{phase}, expecting pre_migrations" unless phase == :pre_migrations rollback_needed = scenario(:pre_migrations).steps.any? { |s| s.executed? && s.success? } if rollback_needed @quit = false # prevent the unnecessary confirmation questions @last_scenario = nil @last_scenario_continuation_confirmed = true [:post_migrations, :post_update_checks].each do |phase| run_phase(phase) end end self.phase = :pre_update_checks # rollback finished @reporter.puts("The update failed and system was restored to pre-update state.") end
to_hash()
click to toggle source
# File lib/foreman_maintain/update_runner.rb, line 113 def to_hash ret = { :phase => phase, :scenarios => {} } @scenario_cache.each do |key, scenario| ret[:scenarios][key] = scenario.to_hash end ret end
with_non_empty_scenario(phase) { |next_scenario| ... }
click to toggle source
# File lib/foreman_maintain/update_runner.rb, line 106 def with_non_empty_scenario(phase) next_scenario = scenario(phase) unless next_scenario.nil? || next_scenario.steps.empty? yield next_scenario end end