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