class Foghorn::Horn

This is the class that interacts with fog

Attributes

active_servers[R]
context[R]

Public Class Methods

new(cxt) click to toggle source
# File lib/foghorn.rb, line 14
def initialize(cxt)
  if cxt.respond_to? :[]
    @context = cxt
  else
    @context = ->(v) {cxt.fetch(v) }
  end
  @fog = Fog::Compute.new(@context['foghorn_config'])
  @active_servers = Set.new
end

Public Instance Methods

safeguard() click to toggle source

Safeguards against forgetting to tag a server

# File lib/foghorn.rb, line 48
def safeguard
  servers
    .reject { |server| server.tags['Roles'] }
    .each do |server|
      fail "Server #{server.tags['Name']} has no tagged Roles! "\
        'Add a Roles tag to this server before deploying.'
    end
end
servers(*roles) click to toggle source

Get list of servers, optionally filtered by a list of roles

# File lib/foghorn.rb, line 27
def servers(*roles)
  if @servers.nil?
    @servers = @fog.servers
    @servers_by_role = Hash.new { |h, k| h[k] = [] }
    @servers.each do |server|
      Foghorn.roles_for(server).each do |role|
        @servers_by_role[role] << server
      end
    end
  end
  if roles.empty?
    return @servers
  else
    roles = roles.flatten(1) if roles.length == 1
    return roles
      .map { |role| @servers_by_role[role.to_s] }
      .inject([], :|)
  end
end
snapshots() click to toggle source

Creates snapshots of all active servers

# File lib/foghorn.rb, line 58
def snapshots
  active_servers.each do |server|
    next unless server.tags['Snapshot']

    server.volumes.each.with_index do |volume, index|
      date = Time.now.strftime('%Y%m%d-%H%M')

      name = "#{server.tags['Name']}-volume#{index}-#{date}"

      snapshot             = @fog.snapshots.new
      snapshot.description = name
      snapshot.volume_id   = volume.id

      #puts "Saving snapshot #{name}"
      snapshot.save
      snapshot.reload # to get id for tags

      {
        Name: name,
        Time: Time.now.to_i,
        Server: server.tags['Name'],
        Revision: context['current_revision']
      }.each do |key, value|
        @fog.tags.create resource_id: snapshot.id, key: key, value: value
      end
    end
  end
end
snapshots_cleanup() click to toggle source

Delete old snapshots - all but 2

# File lib/foghorn.rb, line 88
def snapshots_cleanup
  server_names = servers
    .select { |server| server.tags['Snapshot']}
    .map { |server| server.tags['Name'] }

  snaps_by_server = Hash.new { |h, k| h[k] = [] }
  @fog.snapshots
    .select { |snapshot| server_names.include? snapshot.tags['Server'] }
    .each do |snapshot|
      snaps_by_server[snapshot.tags['Server']] << snapshot
    end

  snaps_by_server.each do |_server, snapshots|
    snapshots.sort_by! do |snapshot|
      (snapshot.tags['Time'] || 0).to_i * -1
    end

    snapshots.shift 2

    snapshots.each do |snapshot|
      begin
        #puts "Deleting snapshot #{snapshot.tags['Name']}"
        @fog.delete_snapshot snapshot.id
      rescue => e
        puts e.message
      end
    end
  end
end