Class: Kontejner::Resolver
- Inherits:
-
Object
- Object
- Kontejner::Resolver
- Includes:
- MonitorMixin
- Defined in:
- lib/kontejner/resolver.rb
Constant Summary collapse
- CACHE_TTL =
600- CACHE_OPTIONS =
{ ttl: CACHE_TTL, race_condition_ttl: CACHE_TTL/100 }.freeze
Instance Method Summary collapse
- #handle_event(event) ⇒ Object
- #id(name) ⇒ Object
-
#initialize(docker:) ⇒ Resolver
constructor
A new instance of Resolver.
- #ip(id) ⇒ Object
- #listen_event_stream ⇒ Object
- #resolve(name) ⇒ Object
Constructor Details
#initialize(docker:) ⇒ Resolver
Returns a new instance of Resolver.
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# 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 |
Instance Method Details
#handle_event(event) ⇒ Object
37 38 39 40 41 42 43 44 45 46 47 48 49 |
# 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) ⇒ Object
63 64 65 66 67 68 69 70 71 72 73 74 |
# 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) ⇒ Object
76 77 78 79 80 81 82 83 84 85 86 |
# 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 ⇒ Object
29 30 31 32 33 34 35 |
# 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) ⇒ Object
51 52 53 54 55 56 57 58 59 60 61 |
# 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 |