class Ruboty::Handlers::Cloudfront

Public Instance Methods

list_distributuions(message) click to toggle source
# File lib/ruboty/handlers/cloudfront.rb, line 26
def list_distributuions(message)
  maximum_domain_length = prefixes.map(&:first).sort_by(&:size).last.size
  maximum_id_length = prefixes.map { |p| p[1] }.sort_by(&:size).last.size

  lines = prefixes.map do |prefix|
    [
      prefix[0].ljust(maximum_domain_length),
      prefix[1].ljust(maximum_id_length),
      prefix[2]
    ].join(' ')
  end

  message.reply(
    "We have #{prefixes.count} distributions\n" + lines.join("\n"),
    code: true
  )
end
list_invalidations(message) click to toggle source
# File lib/ruboty/handlers/cloudfront.rb, line 44
def list_invalidations(message)
  invalidations = []
  prefixes.map { |p| p[1] }.uniq.each do |prefix|
    resp = cloudfront.list_invalidations(distribution_id: prefix)
    resp.invalidation_list.items.each do |invalidation|
      next unless invalidation.status != 'Completed'
      iresp = cloudfront.get_invalidation(distribution_id: prefix, id: invalidation.id)
      iresp.invalidation.invalidation_batch.paths.items.each do |path|
        invalidations << "#{path} : #{invalidation.status} / #{domains_by(prefix).join(', ')}"
      end
    end
  end

  message.reply(
    "We have #{invalidations.count} invalidations\n" + invalidations.join("\n"),
    code: true
  )
end
purge_url(message) click to toggle source
# File lib/ruboty/handlers/cloudfront.rb, line 63
def purge_url(message)
  uri = URI.parse(message[:url])

  dist = prefixes.bsearch { |p| p[0] == uri.host }

  unless dist
    message.reply('Distribution not found')
    return
  end

  cloudfront.create_invalidation(distribution_id: dist[1],
                                 invalidation_batch: {
                                   paths: {
                                     quantity: 1,
                                     items: [uri.path]
                                   },
                                   caller_reference: SecureRandom.uuid
                                 })

  message.reply("Started #{uri.path} invalidation of #{dist[1]} / #{dist[0]}")
end

Private Instance Methods

cloudfront() click to toggle source
# File lib/ruboty/handlers/cloudfront.rb, line 87
def cloudfront
  @cloudfront ||= Aws::CloudFront::Client.new(region: 'us-east-1')
end
distributions() click to toggle source
# File lib/ruboty/handlers/cloudfront.rb, line 91
def distributions
  cloudfront.list_distributions.distribution_list
rescue Aws::Errors::ServiceError
  nil
end
domains_by(id) click to toggle source
# File lib/ruboty/handlers/cloudfront.rb, line 110
def domains_by(id)
  prefixes.select { |p| p[1] == id }.map(&:first)
end
prefixes() click to toggle source
# File lib/ruboty/handlers/cloudfront.rb, line 97
def prefixes
  return @prefixes if @prefixes

  @prefixes = []
  distributions.items.each do |dist|
    @prefixes << [dist.domain_name, dist.id, dist.status]
    dist.aliases.items.each do |domain|
      @prefixes << [domain, dist.id, dist.status]
    end
  end
  @prefixes
end