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