dominicsayers/foreplay

View on GitHub
lib/foreplay/engine.rb

Summary

Maintainability
A
0 mins
Test Coverage
module Foreplay
  class Engine
    autoload :Defaults, 'foreplay/engine/defaults'
    autoload :Logger, 'foreplay/engine/logger'
    autoload :Port, 'foreplay/engine/port'
    autoload :Remote, 'foreplay/engine/remote'
    autoload :Role, 'foreplay/engine/role'
    autoload :Secrets, 'foreplay/engine/secrets'
    autoload :Server, 'foreplay/engine/server'
    autoload :Step, 'foreplay/engine/step'

    include Foreplay::Engine::Defaults
    attr_reader :mode, :environment, :filters

    def initialize(e, f)
      @environment  = e
      @filters      = f

      @defaults = nil
      @roles_all = nil
    end

    %i[deploy check].each { |m| define_method(m) { execute m } }

    def execute(m)
      @mode = m
      puts "#{mode.capitalize}ing #{environment.dup.yellow} environment, "\
           "#{explanatory_text(filters, 'role')}, #{explanatory_text(filters, 'server')}"

      actionable_roles.map { |role, instructions| threads(role, instructions) }.flatten.each(&:join)

      puts mode == :deploy ? 'Finished deployment' : 'Deployment configuration check was successful'
    end

    private

    def actionable_roles
      roles.select { |role, _i| role != DEFAULTS_KEY && (filters.key?('role') ? role == filters['role'] : true) }
    end

    def threads(role, instructions)
      Foreplay::Engine::Role.new(
        environment,
        mode,
        build_instructions(role, instructions)
      ).threads
    end

    def explanatory_text(hsh, key)
      hsh.key?(key) ? "#{hsh[key].dup.yellow} #{key}" : "all #{key}s"
    end

    def build_instructions(role, additional_instructions)
      instructions            = defaults.supermerge(additional_instructions)
      instructions['role']    = role
      instructions['verbose'] = verbose
      required_keys           = %w[name environment role servers path repository]

      required_keys.each do |key|
        next if instructions.key? key
        terminate("Required key #{key} not found in instructions for #{environment} environment.\nCheck #{config_file}")
      end

      # Apply server filter
      instructions['servers'] &= server_filter if server_filter
      instructions
    end

    def server_filter
      @server_filter ||= filters['server'].split(',') if filters.key?('server')
    end

    def verbose
      @verbose ||= filters.key?('verbose')
    end
  end
end