class Kontejner::Resolver

Constants

CACHE_OPTIONS
CACHE_TTL

Public Class Methods

new(docker:) click to toggle source
Calls superclass method
# File lib/kontejner/resolver.rb, line 13
def initialize(docker:)
  @logger = Logger.new($stdout)

  @connection = ::Docker::Connection.new(docker, {})
  @id_cache = ::ActiveSupport::Cache::MemoryStore.new
  @ip_cache = ::ActiveSupport::Cache::MemoryStore.new

  super()

  @updater = Thread.new do
    loop do
      listen_event_stream
    end
  end
end

Public Instance Methods

handle_event(event) click to toggle source
# File lib/kontejner/resolver.rb, line 37
def handle_event(event)
  @logger.debug("Processing event #{event}")

  case event.status
    when 'die'.freeze
      @id_cache.clear
      @ip_cache.delete(event.id)
    when 'start'.freeze
      @id_cache.clear
      @ip_cache.write(event.id, ip(event.id))
    when 'create'.freeze
  end
end
id(name) click to toggle source
# File lib/kontejner/resolver.rb, line 63
def id(name)
  case name.length
    when 64
      name
    else
      @id_cache.fetch(name, CACHE_OPTIONS) do
        container = Docker::Container.get(name, {}, @connection)
        @logger.debug("Resolved #{name} to #{container.id}")
        container.id
      end
  end
end
ip(id) click to toggle source
# File lib/kontejner/resolver.rb, line 76
def ip(id)
  container = Docker::Container.get(id, {}, @connection)
  json = container.json
  unless json['State']['Running']
    @logger.warn("#{id} is not running")
    raise Docker::Error::NotFoundError
  end
  ip = json['NetworkSettings']['IPAddress']
  @logger.debug("#{id} has ip #{ip}")
  ip
end
listen_event_stream() click to toggle source
# File lib/kontejner/resolver.rb, line 29
def listen_event_stream
  ::Docker::Event.stream({}, @connection) do |event|
    handle_event(event)
  end
rescue
  @logger.error('EvenStream') { $ERROR_INFO }
end
resolve(name) click to toggle source
# File lib/kontejner/resolver.rb, line 51
def resolve(name)
  id = id(name)

  @logger.debug("#{name} has id #{id}")
  @ip_cache.fetch(id, CACHE_OPTIONS) do
    ip(id)
  end
rescue Docker::Error::NotFoundError
  @logger.warn("#{name} could not be found")
  false
end