lib/outliers/evaluation.rb
module Outliers
class Evaluation
attr_reader :resource_collection, :provider_name, :provider_name_array
def initialize(args)
@run = args[:run]
@name = args[:name]
end
def connect(account_name, options={})
@account_name = account_name
@provider_name = merged_account(account_name, options).fetch 'provider'
logger.info "Connecting via '#{account_name}' to '#{@provider_name}'."
logger.info "Including connection options '#{options.map {|k,v| "#{k}=#{v}"}.join(',')}'." if options.any?
set_provider_name_array
@provider = Outliers::Provider.connect_to merged_account(account_name, options)
end
def resources(name, targets=nil)
logger.debug "Loading '#{name}' resource collection."
@resource_name = name
@resource_collection = collection_object name
load_targets targets
resource_collection
end
def filter(action, args)
resource_collection.filter action, args.keys_to_s
end
def verify(verification_name, arguments=nil)
@resources_loaded ||= resource_collection.load_all
args_to_send = convert_verification_arguments arguments
verification_result = resource_collection.verify verification_name, args_to_send
result = Outliers::Result.new account_name: @account_name,
resources: verification_result.fetch(:resources),
passing: verification_result.fetch(:passing),
name: @name,
arguments: Array(args_to_send),
provider_name: @provider_name,
resource_name: @resource_name,
verification_name: verification_name
logger.info "Verification '#{verification_name}' #{result.passed? ? 'passed' : 'failed'}."
@run.results << result
end
private
def load_targets(targets)
case targets.class.to_s
when "Hash"
t = targets.keys_to_sym
if t.has_key? :include
list = Array(t.fetch :include)
logger.info "Targeting '#{list.join(', ')}' from '#{@resource_name}' collection."
resource_collection.targets = list
elsif t.has_key? :exclude
list = Array(t.fetch :exclude)
logger.info "Excluding '#{list.join(', ')}' from '#{@resource_name}' collection."
resource_collection.exclude_by_key list
else
logger.info "Targeting all resources in '#{@resource_name}' collection."
end
when "String", "Array"
list = Array(targets)
logger.info "Targeting '#{list.join(', ')}' from '#{@resource_name}' collection."
resource_collection.targets = list
when "Nil"
logger.info "Targeting all resources in '#{@resource_name}' collection."
end
end
def convert_verification_arguments(arguments)
return Array(arguments) if arguments.is_a?(Array) || arguments.is_a?(String) || arguments.is_a?(Integer)
return nil if arguments.is_a?(NilClass)
raise Outliers::Exceptions::InvalidArguments.new "Verification arguments '#{arguments}' invalid. Must be a string, integer or array."
end
def set_provider_name_array
begin
array = Outliers::Providers.name_map.fetch(provider_name).to_s.split('::')
@provider_name_array = array[2..array.size]
rescue KeyError
raise Outliers::Exceptions::UnknownProvider.new "Unkown provider '#{provider_name}'"
end
end
def collection_object(name)
collection_object = name.split('_').map {|c| c.capitalize}.join('') + 'Collection'
collection_array = ['Outliers', 'Resources'] + provider_name_array + [collection_object]
collection_array.inject(Object) {|o,c| o.const_get c}.new(@provider)
rescue NameError
raise Outliers::Exceptions::UnknownCollection.new "Unknown collection '#{name}'."
end
def account(name)
account = @run.account.fetch name, nil
raise Outliers::Exceptions::UnknownAccount.new "Unkown account '#{name}'." unless account
account
end
def merged_account(name, options)
account(name).merge! options.keys_to_s
account(name).merge :name => name
end
def logger
@logger ||= Outliers.logger
end
end
end