class ParameterSubstitution

Constants

PARAMETERS
PARAMETER_KEY
PARAMETER_VALUE

Public Instance Methods

apply_parameter_values(cfn_model, parameter_values_json) click to toggle source
# File lib/cfn-model/parser/parameter_substitution.rb, line 10
def apply_parameter_values(cfn_model, parameter_values_json)
  unless parameter_values_json.nil?
    parameter_values = JSON.load parameter_values_json
    if is_aws_format?(parameter_values)
      parameter_values = convert_aws_to_legacy_format(parameter_values)
    elsif !is_legacy_format?(parameter_values)
      format_error = "JSON parameters must be a dictionary with key \"#{PARAMETERS}\" "\
                     "or an array of ParameterKey/ParameterValue dictionaries"
      raise JSON::ParserError.new(format_error)
    end
    apply_parameter_values_impl cfn_model, parameter_values
  end
end

Private Instance Methods

apply_parameter_values_impl(cfn_model, parameter_values) click to toggle source
# File lib/cfn-model/parser/parameter_substitution.rb, line 63
def apply_parameter_values_impl(cfn_model, parameter_values)
  parameter_values[PARAMETERS].each do |parameter_name, parameter_value|
    if cfn_model.parameters.has_key?(parameter_name)
      cfn_model.parameters[parameter_name].synthesized_value = parameter_value.to_s
    end
    # not going to complain if there are extra parameters in JSON.... if doing a scan
    # you only have one file for all the templates
  end

  # any leftovers get default value
  # if external values were specified, we take that as a cue to consider defaults
  # if no external values, we will ignore default values
  cfn_model.parameters.each do |_, parameter|
    if parameter.synthesized_value.nil? && !parameter.default.nil?
      parameter.synthesized_value = parameter.default.to_s
    end
  end
  apply_pseudo_parameter_values(cfn_model, parameter_values)
end
apply_pseudo_parameter_values(cfn_model, parameter_values) click to toggle source
# File lib/cfn-model/parser/parameter_substitution.rb, line 36
def apply_pseudo_parameter_values(cfn_model, parameter_values)
  # leave out 'AWS::NoValue'? not sure - we explicitly check it in some places...
  # might make sense to substitute here?
  pseudo_function_defaults = {
    'AWS::URLSuffix' => 'amazonaws.com',
    'AWS::Partition' => 'aws',
    'AWS::NotificationARNs' => '',
    'AWS::AccountId' => '111111111111',
    'AWS::Region' => 'us-east-1',
    'AWS::StackId' => 'arn:aws:cloudformation:us-east-1:111111111111:stack/stackname/51af3dc0-da77-11e4-872e-1234567db123',
    'AWS::StackName' => 'stackname',
    'AWS::NumberAZs' => 2
  }
  pseudo_function_defaults.each do |function_name, default_value|
    parameter = Parameter.new
    parameter.id = function_name
    parameter.type = 'String'
    cfn_model.parameters[function_name] = parameter

    if parameter_values[PARAMETERS].has_key?(function_name)
      parameter.synthesized_value = parameter_values[PARAMETERS][function_name]
    else
      parameter.synthesized_value = default_value
    end
  end
end
convert_aws_to_legacy_format(parameter_values) click to toggle source
# File lib/cfn-model/parser/parameter_substitution.rb, line 26
def convert_aws_to_legacy_format(parameter_values)
  legacy_format = {
    PARAMETERS => {}
  }
  parameter_values.reduce(legacy_format) do |result, parameter_value|
    result[PARAMETERS][parameter_value[PARAMETER_KEY]] = parameter_value[PARAMETER_VALUE]
    result
  end
end
is_aws_format?(parameter_values) click to toggle source
# File lib/cfn-model/parser/parameter_substitution.rb, line 83
def is_aws_format?(parameter_values)
  return false unless parameter_values.is_a?(Array)
  !parameter_values.find do |parameter_value|
    !parameter_value['ParameterKey'] || !parameter_value['ParameterValue']
  end
end
is_legacy_format?(parameter_values) click to toggle source
# File lib/cfn-model/parser/parameter_substitution.rb, line 90
def is_legacy_format?(parameter_values)
  parameter_values.is_a?(Hash) && parameter_values.has_key?(PARAMETERS)
end