Sha256: c667dba5328608d48e86d24bf98122d09ad24b67c5674ea1685fbee3ddbad5f5

Contents?: true

Size: 1.67 KB

Versions: 5

Compression:

Stored size: 1.67 KB

Contents

module CfnFlow
  class Template

    # Tag for JSON/YAML loading errors
    module Error; end

    attr_reader :local_path
    def initialize(local_path)
      @local_path = local_path
    end

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

    def json?
      ! yaml?
    end

    # Determine if this file is a CFN template
    def is_cfn_template?
      local_data.is_a?(Hash) && local_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

    ##
    # S3 methods
    def key(release)
      # Replace leading './' in local_path
      clean_path = local_path.sub(/\A\.\//, '')
      File.join(*[s3_prefix, release, clean_path].compact)
    end

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

    def url(release)
      s3_object(release).public_url
    end

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

    def local_data
      # We *could* load JSON as YAML, but that would generate confusing errors
      # in the case of a JSON syntax error.
      @local_data ||= yaml? ? YAML.load_file(local_path) : MultiJson.load(File.read(local_path))
    rescue Exception => error
      # Tag & re-raise any error
      error.extend(CfnFlow::Template::Error)
      raise error
    end

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

    def bucket
      CfnFlow.template_s3_bucket
    end

    def s3_prefix
      CfnFlow.template_s3_prefix
    end

    private
    def cfn
      CfnFlow.cfn_client
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
cfn-flow-0.10.0 lib/cfn_flow/template.rb
cfn-flow-0.9.0 lib/cfn_flow/template.rb
cfn-flow-0.8.0 lib/cfn_flow/template.rb
cfn-flow-0.7.0 lib/cfn-flow/template.rb
cfn-flow-0.5.0 lib/cfn-flow/template.rb