Sha256: 8c1da16fbf9f65945c45b2f352f23325f84e4682b3e303619ead5758c4cad13e

Contents?: true

Size: 1.53 KB

Versions: 1

Compression:

Stored size: 1.53 KB

Contents

require 'hygroscope'
require 'archive/zip'

module Hygroscope
  class Payload
    attr_writer :prefix
    attr_reader :path, :bucket, :archive, :key

    def initialize(path)
      @path = path

      # TODO: This will fail if using root creds or lacking GetUser priv,
      # neither of which should be the case when using hygroscope -- but
      # we should check and error before getting to this point.
      @account_id = Aws::IAM::Client.new.get_user.user.arn.split(':')[4]
      @region = ENV['AWS_REGION'] || 'us-east-1'
      @bucket = "hygroscope-payloads-#{@account_id}-#{@region}"
      @name = "payload-#{Time.new.to_i}.zip"

      @client = Aws::S3::Client.new
    end

    def prefix
      @prefix || File.dirname(File.dirname(@path))
    end

    def key
      "#{@prefix}/#{@name}"
    end

    def create_bucket
      # Returns success if bucket already exists
      @client.create_bucket(bucket: @bucket, acl: 'private')
    end

    def prepare
      archive_path = File.join(Dir.tmpdir, @name)
      Archive::Zip.archive(archive_path, "#{@path}/.")

      @archive = File.open(archive_path)
      at_exit { File.unlink(@archive) }
    end

    def send
      @client.put_object(
        bucket: @bucket,
        key: key,
        body: @archive
      )
    end

    def upload!
      create_bucket
      prepare
      send

      "s3://#{@bucket}/#{key}"
    end

    def generate_url(_timeout = 3600)
      signer = Aws::S3::Presigner.new(client: @client)
      signer.presigned_url(:get_object, bucket: @bucket, key: key)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
hygroscope-1.1.7 lib/hygroscope/payload.rb