class Forger::S3::Bucket

Constants

STACK_NAME

Public Class Methods

ensure_exists!() click to toggle source
# File lib/forger/s3/bucket.rb, line 22
def ensure_exists!
  bucket = new
  return if bucket.exist?
  bucket.create
end
name() click to toggle source
# File lib/forger/s3/bucket.rb, line 11
def name
  return @@name if @@name # only memoize once bucket has been created

  stack = new.find_stack
  return unless stack

  resp = cfn.describe_stack_resources(stack_name: STACK_NAME)
  bucket = resp.stack_resources.find { |r| r.logical_resource_id == "Bucket" }
  @@name = bucket.physical_resource_id # actual bucket name
end
new(options={}) click to toggle source
# File lib/forger/s3/bucket.rb, line 29
def initialize(options={})
  @options = options
end

Public Instance Methods

bucket_name() click to toggle source
# File lib/forger/s3/bucket.rb, line 46
def bucket_name
  self.class.name
end
create() click to toggle source

Launches a cloudformation to create an s3 bucket

# File lib/forger/s3/bucket.rb, line 59
def create
  puts "Creating #{STACK_NAME} stack with the s3 bucket"
  cfn.create_stack(stack_name: STACK_NAME, template_body: template_body)
  status = CfnStatus.new(STACK_NAME)
  status.wait
end
delete() click to toggle source
# File lib/forger/s3/bucket.rb, line 73
def delete
  are_you_sure?

  puts "Deleting #{STACK_NAME} stack with the s3 bucket"
  empty_bucket!
  cfn.delete_stack(stack_name: STACK_NAME)
end
deploy() click to toggle source
# File lib/forger/s3/bucket.rb, line 33
def deploy
  stack = find_stack
  if stack
    update
  else
    create
  end
end
exist?() click to toggle source
# File lib/forger/s3/bucket.rb, line 42
def exist?
  !!bucket_name
end
find_stack() click to toggle source
# File lib/forger/s3/bucket.rb, line 81
def find_stack
  resp = cfn.describe_stacks(stack_name: STACK_NAME)
  resp.stacks.first
rescue Aws::CloudFormation::Errors::ValidationError
  nil
end
show() click to toggle source
# File lib/forger/s3/bucket.rb, line 50
def show
  if bucket_name
    puts "Forger bucket name: #{bucket_name}"
  else
    puts "Forger bucket does not exist yet."
  end
end
update() click to toggle source
# File lib/forger/s3/bucket.rb, line 66
def update
  puts "Updating #{STACK_NAME} stack with the s3 bucket"
  cfn.update_stack(stack_name: STACK_NAME, template_body: template_body)
rescue Aws::CloudFormation::Errors::ValidationError => e
  raise unless e.message.include?("No updates are to be performed")
end

Private Instance Methods

are_you_sure?() click to toggle source
# File lib/forger/s3/bucket.rb, line 107
def are_you_sure?
  return true if @options[:sure]

  puts "Are you sure you want the forger bucket #{bucket_name.color(:green)} to be emptied and deleted? (y/N)"
  sure = $stdin.gets.strip
  yes = sure =~ /^Y/i
  unless yes
    puts "Phew that was close."
    exit
  end
end
empty_bucket!() click to toggle source
# File lib/forger/s3/bucket.rb, line 90
def empty_bucket!
  resp = s3.list_objects(bucket: bucket_name)
  if resp.contents.size > 0
    # IE: objects = [{key: "objectkey1"}, {key: "objectkey2"}]
    objects = resp.contents.map { |item| {key: item.key} }
    s3.delete_objects(
      bucket: bucket_name,
      delete: {
        objects: objects,
        quiet: false,
      }
    )
    empty_bucket! # keep deleting objects until bucket is empty
  end
end
template_body() click to toggle source
# File lib/forger/s3/bucket.rb, line 119
    def template_body
      <<~YAML
        Resources:
          Bucket:
            Type: AWS::S3::Bucket
            Properties:
              Tags:
                - Key: Name
                  Value: forger
      YAML
    end