lib/percheron/actions/start.rb in percheron-0.8.0 vs lib/percheron/actions/start.rb in percheron-0.8.1

- old
+ new

@@ -1,43 +1,63 @@ module Percheron module Actions class Start include Base - def initialize(unit, needed_units: [], cmd: false, exec_scripts: true) + def initialize(unit, needed_units: [], create: true, cmd: false, exec_scripts: true) @unit = unit @needed_units = needed_units + @create = create @cmd = cmd @exec_scripts = exec_scripts end def execute! - results = [] - results << create! - unless unit.running? + return nil if unit.running? + results = [ create! ] + if unit.startable? results << start! results << execute_post_start_scripts! end results.compact.empty? ? nil : unit end private - attr_reader :unit, :needed_units, :cmd, :exec_scripts + attr_reader :unit, :needed_units, :create, :cmd, :exec_scripts + alias_method :create?, :create def exec_scripts? !unit.post_start_scripts.empty? && exec_scripts end def create! - return nil if unit.exists? + return nil unless create? Create.new(unit, cmd: cmd).execute! end def start! - return nil if !unit.startable? || unit.running? - $logger.info "Starting '#{unit.display_name}' unit" - unit.container.start! + return nil if unit_running? + if needed_unit_names_not_running.empty? + $logger.info "Starting '#{unit.display_name}' unit" + unit.container.start! + else + $logger.error "Cannot start '%s' unit, %s not running" % + [ unit.display_name, needed_unit_names_not_running ] + end + end + + def unit_running? + !unit.startable? || unit.running? + end + + def needed_unit_names_not_running + @needed_unit_names_not_running ||= begin + unit.startable_needed_units.each_with_object([]) do |unit_tuple, all| + _, unit = unit_tuple + all << unit.name unless unit.running? + end + end end def execute_post_start_scripts! scripts = unit.post_start_scripts Exec.new(unit, needed_units, scripts, 'POST start').execute! if exec_scripts?