class Flapjack::CLI::Simulate

Public Class Methods

new(global_options, options) click to toggle source
# File lib/flapjack/cli/simulate.rb, line 12
def initialize(global_options, options)
  @global_options = global_options
  @options = options

  if @global_options[:'force-utf8']
    Encoding.default_external = 'UTF-8'
    Encoding.default_internal = 'UTF-8'
  end

  config = Flapjack::Configuration.new
  config.load(global_options[:config])
  @config_env = config.all

  if @config_env.nil? || @config_env.empty?
    exit_now! "No config data found in '#{global_options[:config]}'"
  end

  Flapjack::RedisProxy.config = config.for_redis
  Zermelo.redis = Flapjack.redis
end

Public Instance Methods

_fail() click to toggle source
# File lib/flapjack/cli/simulate.rb, line 33
def _fail
  events(:state => @options[:state], :recover => false,
    :check => @options[:check], :minutes => @options[:time].to_f,
    :interval => @options[:interval].to_f)
end
fail_and_recover() click to toggle source
# File lib/flapjack/cli/simulate.rb, line 39
def fail_and_recover
  events(:state => @options[:state], :recover => true,
    :check => @options[:check], :minutes => @options[:time].to_f,
    :interval => @options[:interval].to_f)
end
ok() click to toggle source
# File lib/flapjack/cli/simulate.rb, line 45
def ok
  events(:state => 'ok', :recover => false,
    :check => @options[:check], :minutes => @options[:time].to_f,
    :interval => @options[:interval].to_f)
end

Private Instance Methods

events(opts = {}) click to toggle source
# File lib/flapjack/cli/simulate.rb, line 53
def events(opts = {})
  stop_after = (opts[:minutes] * 60).to_i
  recover = opts[:recover]
  state = opts[:state] || 'critical'
  event = {
    'check'  => opts[:check] || 'HTTP',
    'type'   => 'service'
  }
  failure  = event.merge('state' => state, 'summary' => 'Simulated check output (test by operator)')
  recovery = event.merge('state' => 'ok', 'summary' => 'Simulated check output (test by operator)')
  key = event['check']

  lock = Monitor.new
  stop_cond = lock.new_cond
  @finish = false

  failer = Thread.new do
    fin = nil

    loop do
      lock.synchronize do
        unless fin = @finish
          puts "#{Time.now}: sending failure event (#{state}) for #{key}"
          Flapjack::Data::Event.push('events', failure.merge('time' => Time.now.to_i))
          stop_cond.wait(opts[:interval])
        end
      end
      break if fin
    end
  end

  stopper = Thread.new do
    sleep stop_after
    lock.synchronize do
      puts "#{Time.now}: stopping"
      if recover
        puts "#{Time.now}: sending recovery event for #{key}"
        Flapjack::Data::Event.push('events', recovery.merge('time' => Time.now.to_i))
      end
      @finish = true
      stop_cond.signal
    end
  end

  stopper.join
  failer.join

  Flapjack.redis.quit
end