class Hygroscope::Payload

Attributes

archive[R]
bucket[R]
key[R]
path[R]
prefix[W]

Public Class Methods

new(path, region, profile) click to toggle source
# File lib/hygroscope/payload.rb, line 9
def initialize(path, region, profile)
  @path = path
  @region = region
  @profile = profile
  @credentials = Aws::SharedCredentials.new(profile_name: @profile)

  # 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(region: @region, credentials: @credentials).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(region: @region, credentials: @credentials)
end

Public Instance Methods

create_bucket() click to toggle source
# File lib/hygroscope/payload.rb, line 34
def create_bucket
  # Returns success if bucket already exists
  @client.create_bucket(bucket: @bucket, acl: 'private')
end
generate_url(_timeout = 3600) click to toggle source
# File lib/hygroscope/payload.rb, line 63
def generate_url(_timeout = 3600)
  signer = Aws::S3::Presigner.new(client: @client)
  signer.presigned_url(:get_object, bucket: @bucket, key: key)
end
prefix() click to toggle source
# File lib/hygroscope/payload.rb, line 26
def prefix
  @prefix || File.dirname(File.dirname(@path))
end
prepare() click to toggle source
# File lib/hygroscope/payload.rb, line 39
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
send() click to toggle source
# File lib/hygroscope/payload.rb, line 47
def send
  @client.put_object(
    bucket: @bucket,
    key:    key,
    body:   @archive
  )
end
upload!() click to toggle source
# File lib/hygroscope/payload.rb, line 55
def upload!
  create_bucket
  prepare
  send

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