Class: Kontejner::Resolver

Inherits:
Object
  • Object
show all
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

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_streamObject



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