Sha256: a94649eb6497c19a8555a012317f5a115f5100d45b455f4f9a39705d5d1c16f7

Contents?: true

Size: 1.36 KB

Versions: 4

Compression:

Stored size: 1.36 KB

Contents

class CfnFlow::Template
  attr_reader :from, :prefix, :bucket
  def initialize(opts={})
    unless [:from, :prefix, :bucket].all? {|arg| opts.key?(arg) }
      raise ArgumentError.new("Must pass :from, :prefix, and :bucket")
    end
    @from, @prefix, @bucket = opts[:from], opts[:prefix], opts[:bucket]
  end

  def yaml?
    from.end_with?('.yml')
  end

  def json?
    ! yaml?
  end

  # Determine if this file is a CFN template
  def is_cfn_template?
    from_data.is_a?(Hash) && from_data.key?('Resources')
  end

  # Returns a response object if valid, or raises an
  # Aws::CloudFormation::Errors::ValidationError with an error message
  def validate!
    cfn.validate_template(template_body: to_json)
  end

  def key
    # Replace leading './' in from
    File.join(prefix, from.sub(/\A\.\//, ''))
  end

  def upload!
    s3_object.put(body: to_json)
  end

  def url
    s3_object.public_url
  end

  def from_data
    # We *could* load JSON as YAML, but that would generate confusing errors
    # in the case of a JSON syntax error.
    @from_data ||= yaml? ? YAML.load_file(from) : MultiJson.load(File.read(from))
  rescue
    puts "Error loading #{from}"
    raise $!
  end

  def to_json
    @to_json ||= MultiJson.dump(from_data, pretty: true)
  end

  private
  def cfn
    Aws::CloudFormation::Client.new
  end

  def s3_object
    Aws::S3::Object.new(bucket, key)
  end

end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
cfn-flow-0.2.1 lib/cfn-flow/template.rb
cfn-flow-0.2.0 lib/cfn-flow/template.rb
cfn-flow-0.1.2 lib/cfn-flow/template.rb
cfn-flow-0.1.1 lib/cfn-flow/template.rb