class StackMaster::ParameterResolver

Constants

InvalidParameter
ResolverNotFound

Public Class Methods

new(config, stack_definition, parameters) click to toggle source
# File lib/stack_master/parameter_resolver.rb, line 10
def initialize(config, stack_definition, parameters)
  @config = config
  @stack_definition = stack_definition
  @parameters = parameters
  @resolvers = {}
end
resolve(config, stack_definition, parameters) click to toggle source
# File lib/stack_master/parameter_resolver.rb, line 6
def self.resolve(config, stack_definition, parameters)
  new(config, stack_definition, parameters).resolve
end

Public Instance Methods

resolve() click to toggle source
# File lib/stack_master/parameter_resolver.rb, line 17
def resolve
  @parameters.reduce({}) do |parameters, (key, value)|
    begin
      parameters[key] = resolve_parameter_value(key, value)
    rescue InvalidParameter
      raise InvalidParameter, "Unable to resolve parameter #{key.inspect} value causing error: #{$!.message}"
    end
    parameters
  end
end

Private Instance Methods

assume_role_if_present(account, role, key) { || ... } click to toggle source
# File lib/stack_master/parameter_resolver.rb, line 75
def assume_role_if_present(account, role, key)
  return yield if account.nil? && role.nil?
  if account.nil? || role.nil?
    raise InvalidParameter, "Both 'account' and 'role' are required to assume role for parameter '#{key}'"
  end
  role_assumer.assume_role(account, role) do
    yield
  end
end
call_resolver(class_name, value) click to toggle source
# File lib/stack_master/parameter_resolver.rb, line 91
def call_resolver(class_name, value)
  resolver_class(class_name).resolve(value)
end
load_parameter_resolver(class_name) click to toggle source
# File lib/stack_master/parameter_resolver.rb, line 40
def load_parameter_resolver(class_name)
  # Check if the class name already exists
  resolver_class_const(class_name)
rescue NameError
  # If it doesn't, try to load it
  require_parameter_resolver(class_name.underscore)
end
require_parameter_resolver(file_name) click to toggle source
# File lib/stack_master/parameter_resolver.rb, line 30
def require_parameter_resolver(file_name)
  require "stack_master/parameter_resolvers/#{file_name}"
rescue LoadError
  if file_name == file_name.singularize
    raise ResolverNotFound.new(file_name)
  else
    require_parameter_resolver(file_name.singularize)
  end
end
resolve_array_parameter_values(key, parameter_values) click to toggle source
# File lib/stack_master/parameter_resolver.rb, line 85
def resolve_array_parameter_values(key, parameter_values)
  parameter_values.reduce([]) do |values, parameter_value|
    values << resolve_parameter_value(key, parameter_value)
  end
end
resolve_parameter_resolver_hash(key, parameter_value) click to toggle source
# File lib/stack_master/parameter_resolver.rb, line 57
def resolve_parameter_resolver_hash(key, parameter_value)
  # strip out account and role
  resolver_hash = parameter_value.except('account', 'role')
  account, role = parameter_value.values_at('account', 'role')

  validate_parameter_value!(key, resolver_hash)

  resolver_name = resolver_hash.keys.first.to_s
  load_parameter_resolver(resolver_name)

  value = resolver_hash.values.first
  resolver_class_name = resolver_name.camelize

  assume_role_if_present(account, role, key) do
    call_resolver(resolver_class_name, value)
  end
end
resolve_parameter_value(key, parameter_value) click to toggle source
# File lib/stack_master/parameter_resolver.rb, line 48
def resolve_parameter_value(key, parameter_value)
  return parameter_value.to_s if Numeric === parameter_value || parameter_value == true || parameter_value == false
  return resolve_array_parameter_values(key, parameter_value).join(',') if Array === parameter_value
  return parameter_value unless Hash === parameter_value
  resolve_parameter_resolver_hash(key, parameter_value)
rescue Aws::CloudFormation::Errors::ValidationError
  raise InvalidParameter, $!.message
end
resolver_class(class_name) click to toggle source
# File lib/stack_master/parameter_resolver.rb, line 103
def resolver_class(class_name)
  @resolvers.fetch(class_name) do
    begin
      @resolvers[class_name] = resolver_class_const(class_name).new(@config, @stack_definition)
    rescue NameError
      raise ResolverNotFound, "Could not find parameter resolver called #{class_name}, please double check your configuration"
    end
  end
end
resolver_class_const(class_name) click to toggle source
# File lib/stack_master/parameter_resolver.rb, line 99
def resolver_class_const(class_name)
  Kernel.const_get(resolver_class_name(class_name))
end
resolver_class_name(class_name) click to toggle source
# File lib/stack_master/parameter_resolver.rb, line 95
def resolver_class_name(class_name)
  "StackMaster::ParameterResolvers::#{class_name.camelize}"
end
role_assumer() click to toggle source
# File lib/stack_master/parameter_resolver.rb, line 119
def role_assumer
  @role_assumer ||= RoleAssumer.new
end
validate_parameter_value!(key, parameter_value) click to toggle source
# File lib/stack_master/parameter_resolver.rb, line 113
def validate_parameter_value!(key, parameter_value)
  if parameter_value.keys.size != 1
    raise InvalidParameter, "#{key} hash contained more than one key: #{parameter_value.inspect}"
  end
end