kontejner 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dbaa3f962384589a3f874a95a9562efcded6cf21
4
- data.tar.gz: f2f96e863e696e2b19ad22699c84e1ddb77996fe
3
+ metadata.gz: e894cba528f5cbf2897cd28ff7dc0f2abfc33a4f
4
+ data.tar.gz: ca53c7661403f39873a5f449175392559f7a7706
5
5
  SHA512:
6
- metadata.gz: b748acbb71776e0dda218bd42012e613f484264824209f2d690a80d3a7b7a88d8b18c3d0bbf676d0ce366485afcccc2a99b52d9bb8afdefe1468b6fca1c7168e
7
- data.tar.gz: f3a3d05fffb1bcdf9ac3864266b1bb484692104503f2b69d7f82e2a42dc3e0367d3a342a0f470a986afe62fc5542339ebb635e957b0a76e17ec090ec25358c9a
6
+ metadata.gz: 99c51bc973b50bd23d23863e96e92e9d9d9bb094bf546bc6b202a13aa597bee0d41eadd380f41432f13c92d60f44b0b7101bd379c2b57d9be00ec2d040ea6a85
7
+ data.tar.gz: 4e0e07ec2eec4458328bfa7cdc7d0d95964217050d6653cbfe3d98a6af71035044b76dde864c04e5e3c271919b04b8d8e1a05b941e50177c1998afc047ec2003
data/Dockerfile CHANGED
@@ -3,6 +3,11 @@ FROM ubuntu:trusty
3
3
  RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 80F70E11F0F0D5F10CB20E62F5DA5F09C3173AA6 \
4
4
  && echo 'deb http://ppa.launchpad.net/brightbox/ruby-ng/ubuntu precise main' > /etc/apt/sources.list.d/ruby-ng.list \
5
5
  && apt-get -y -q update \
6
- && apt-get -y -q install git-core ruby2.1 rubygems ruby-switch \
7
- && ruby-switch --set ruby2.1 \
8
- && gem install bundler --no-rdoc --no-ri
6
+ && apt-get -y -q install git-core ruby2.1 ruby2.1-dev rubygems ruby-switch \
7
+ && ruby-switch --set ruby2.1
8
+
9
+ RUN gem install kontejner --no-rdoc --no-ri
10
+
11
+ EXPOSE 53
12
+ ENTRYPOINT ["kontejner"]
13
+ CMD ["start"]
data/README.md CHANGED
@@ -1,28 +1,25 @@
1
1
  # Kontejner
2
2
 
3
- TODO: Write a gem description
3
+ Like [skydock](https://github.com/crosbymichael/skydock) + [skydns](https://github.com/skynetservices/skydns1), but in Ruby.
4
4
 
5
5
  ## Installation
6
6
 
7
- Add this line to your application's Gemfile:
8
-
9
- gem 'kontejner'
10
-
11
- And then execute:
12
-
13
- $ bundle
14
-
15
- Or install it yourself as:
7
+ Install it yourself as:
16
8
 
17
9
  $ gem install kontejner
18
10
 
11
+ Then run it like:
12
+ ```bash
13
+ kontejner start --domain=docker --port=7079 --docker=$DOCKER_HOST
14
+ ```
15
+
19
16
  ## Usage
20
17
 
21
- TODO: Write usage instructions here
18
+ * Use EventMachine http client rather than blocking excon in Docker Api
22
19
 
23
20
  ## Contributing
24
21
 
25
- 1. Fork it ( https://github.com/[my-github-username]/kontejner/fork )
22
+ 1. Fork it ( https://github.com/mikz/kontejner/fork )
26
23
  2. Create your feature branch (`git checkout -b my-new-feature`)
27
24
  3. Commit your changes (`git commit -am 'Add some feature'`)
28
25
  4. Push to the branch (`git push origin my-new-feature`)
@@ -1,21 +1,90 @@
1
1
  require 'docker'
2
2
  require 'active_support/cache'
3
+ require 'monitor'
4
+ require 'logger'
3
5
 
4
6
  module Kontejner
5
7
  class Resolver
8
+ include MonitorMixin
9
+
10
+ CACHE_TTL = 600
11
+ CACHE_OPTIONS = { ttl: CACHE_TTL, race_condition_ttl: CACHE_TTL/100 }.freeze
12
+
6
13
  def initialize(docker:)
7
- @connection = Docker::Connection.new(docker, {})
8
- @cache = ActiveSupport::Cache::MemoryStore.new
14
+ @logger = Logger.new($stdout)
15
+
16
+ @connection = ::Docker::Connection.new(docker, {})
17
+ @id_cache = ::ActiveSupport::Cache::MemoryStore.new
18
+ @ip_cache = ::ActiveSupport::Cache::MemoryStore.new
19
+
20
+ super()
21
+
22
+ @updater = Thread.new do
23
+ loop do
24
+ listen_event_stream
25
+ end
26
+ end
27
+ end
28
+
29
+ def listen_event_stream
30
+ ::Docker::Event.stream({}, @connection) do |event|
31
+ handle_event(event)
32
+ end
33
+ rescue
34
+ @logger.error('EvenStream') { $ERROR_INFO }
35
+ end
36
+
37
+ def handle_event(event)
38
+ @logger.debug("Processing event #{event}")
39
+
40
+ case event.status
41
+ when 'die'.freeze
42
+ @id_cache.clear
43
+ @ip_cache.delete(event.id)
44
+ when 'start'.freeze
45
+ @id_cache.clear
46
+ @ip_cache.write(event.id, ip(event.id))
47
+ when 'create'.freeze
48
+ end
9
49
  end
10
50
 
11
51
  def resolve(name)
12
- @cache.fetch(name, expires_in: 60) { fetch(name) }
52
+ id = id(name)
53
+
54
+ @logger.debug("#{name} has id #{id}")
55
+ @ip_cache.fetch(id, CACHE_OPTIONS) do
56
+ ip(id)
57
+ end
13
58
  rescue Docker::Error::NotFoundError
59
+ @logger.warn("#{name} could not be found")
60
+ false
14
61
  end
15
62
 
16
- def fetch(name)
17
- container = Docker::Container.get(name, {}, @connection)
18
- container.json['NetworkSettings']['IPAddress']
63
+ def id(name)
64
+ case name.length
65
+ when 64
66
+ name
67
+ else
68
+ @id_cache.fetch(name, CACHE_OPTIONS) do
69
+ container = Docker::Container.get(name, {}, @connection)
70
+ @logger.debug("Resolved #{name} to #{container.id}")
71
+ container.id
72
+ end
73
+ end
19
74
  end
75
+
76
+ def ip(id)
77
+ container = Docker::Container.get(id, {}, @connection)
78
+ json = container.json
79
+ unless json['State']['Running']
80
+ @logger.warn("#{id} is not running")
81
+ raise Docker::Error::NotFoundError
82
+ end
83
+ ip = json['NetworkSettings']['IPAddress']
84
+ @logger.debug("#{id} has ip #{ip}")
85
+ ip
86
+ end
87
+
88
+ private
20
89
  end
21
90
  end
@@ -3,33 +3,46 @@ require 'kontejner/resolver'
3
3
 
4
4
  module Kontejner
5
5
  class Server
6
- GOOGLE_SERVERS = [ [:udp, '8.8.8.8', 53], [:tcp, '8.8.8.8', 53], [:udp, '8.8.4.4', 53], [:udp, '8.8.4.4', 53] ]
6
+ GOOGLE_SERVERS = [ [:udp, '8.8.8.8', 53], [:tcp, '8.8.8.8', 53], [:udp, '8.8.4.4', 53], [:tcp, '8.8.4.4', 53] ]
7
7
 
8
8
  IN = Resolv::DNS::Resource::IN
9
9
 
10
10
  def initialize(domain:,docker:,ttl:)
11
+ @dns = RubyDNS::RuleBasedServer.new
12
+
13
+ @logger = @dns.logger
14
+ @logger.level = Logger::DEBUG
15
+
16
+ @matcher = /(?<subdomain>[^.]+)\.#{domain}$/
17
+ @ttl = ttl
18
+
11
19
  @upstream = RubyDNS::Resolver.new(GOOGLE_SERVERS)
12
20
  @docker = Kontejner::Resolver.new(docker: docker)
13
21
 
14
- @dns = RubyDNS::RuleBasedServer.new
15
- @dns.logger.level = Logger::INFO
22
+ @logger.info("Docker Connection #{docker}")
23
+ end
24
+
25
+ def start(**options)
26
+ @logger.debug("Matching #{@matcher}")
16
27
 
17
- @dns.match(/(?<subdomain>[^.]+)\.#{domain}$/, IN::A) do |t, match|
28
+ @dns.match(@matcher, IN::A) do |t, match|
18
29
  ip = @docker.resolve(match[:subdomain])
19
30
 
20
31
  if ip
21
- t.respond!(ip, ttl: ttl)
32
+ t.respond!(ip, ttl: @ttl)
22
33
  else
23
- t.fail! :NoError
34
+ t.fail! :NXDomain
24
35
  end
25
36
  end
26
37
 
27
38
  @dns.otherwise do |q|
28
39
  q.passthrough!(@upstream)
29
40
  end
41
+
42
+ run(options)
30
43
  end
31
44
 
32
- def start(**options)
45
+ def run(options)
33
46
  EventMachine.run do
34
47
  trap("INT") do
35
48
  EventMachine.stop
@@ -1,3 +1,3 @@
1
1
  module Kontejner
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kontejner
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michal Cichra
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-11 00:00:00.000000000 Z
11
+ date: 2014-08-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler