class DockerBoss::Engine

Public Class Methods

new(options, config) click to toggle source
# File lib/docker_boss/engine.rb, line 8
def initialize(options, config)
  @containers = []
  @options = options
  @config = config
  @mutex = Mutex.new
  @last_etcds
  @modules = []

  @config.each do |k,v|
    @modules << DockerBoss::ModuleManager[k].new(v)
  end
end

Public Instance Methods

event_loop() click to toggle source
# File lib/docker_boss/engine.rb, line 76
def event_loop
  @events = Queue.new
  threads = []
  threads << Thread.new do
    loop do
      event = @events.deq
      process_event(event)
    end
  end

  threads << Thread.new do
    loop do
      begin
        #Docker::Event.stream({}, Docker::Connection.new(Docker.url, {:nonblock => true})) do |event|
        Docker::Event.stream do |event|
          DockerBoss.logger.debug "New event on socket: #{event}"
          @events.enq({:id => event.id, :status => event.status})
        end
      rescue Docker::Error::TimeoutError
        next
      end
    end
  end

  @modules.each do |mod|
    begin
      threads << mod.run
    rescue NoMethodError
    end
  end

  ThreadsWait.new(*threads)
end
process_event(event) click to toggle source
# File lib/docker_boss/engine.rb, line 48
def process_event(event)
  DockerBoss.logger.info "Processing event: #{event}"
  case event[:status]
  when 'start' # 'create' also triggers 'start'
    @mutex.synchronize {
      if @options[:incr_refresh]
        new_container = Docker::Container.get(event[:id]).json
        @containers.delete_if { |c| c['Id'] == event[:id] }
        @containers << xform_container(new_container)
      else
        refresh_all
      end
      trigger(event[:id])
    }
  when 'die' # 'destroy', 'kill', 'stop' also trigger 'die'
    @mutex.synchronize {
      if @options[:incr_refresh]
        @containers.delete_if { |c| c['Id'] == event[:id] }
      else
        refresh_all
      end
      trigger(event[:id])
    }
  when 'pause'
  when 'unpause'
  end
end
refresh_all() click to toggle source
# File lib/docker_boss/engine.rb, line 27
def refresh_all
  @containers = Docker::Container.all.map { |c| xform_container(c.json) }
end
refresh_and_trigger() click to toggle source
# File lib/docker_boss/engine.rb, line 31
def refresh_and_trigger
  @mutex.synchronize {
    refresh_all
    trigger
  }
end
trigger(id = nil) click to toggle source
# File lib/docker_boss/engine.rb, line 21
def trigger(id = nil)
  @modules.each do |mod|
    mod.trigger(@containers, id)
  end
end
xform_container(container) click to toggle source
# File lib/docker_boss/engine.rb, line 38
def xform_container(container)
  new_env = {}
  container['Config']['Env'].each do |env|
    (k,v) = env.split('=', 2)
    new_env[k] = v || true
  end
  container['Config']['Env'] = new_env
  container
end