teamd-discover 0.2.0 → 0.3.0
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 +4 -4
- data/lib/queue_with_timeout.rb +29 -0
- data/lib/teamd/discover/cli.rb +6 -3
- data/lib/teamd/discover/peer.rb +16 -11
- data/lib/teamd/discover/registry.rb +1 -1
- data/lib/teamd/discover/version.rb +1 -1
- data/lib/teamd/discover.rb +13 -0
- metadata +2 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c06635e4f5ca0c56cd1467cafd4c262de1776918
|
|
4
|
+
data.tar.gz: 8d66e2d83f34f57f43ef6e7bc10393e4eb48bd6d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 269219ef0493dde5ee5eeb39cd6d908ede5a8c13b6cfd35fdbdee75b818c972650cb3f25db584cc3c9c6573907ff4455b707116f7d51e174bc7f7e59747bb0e7
|
|
7
|
+
data.tar.gz: 675229be6ff062034698bc285382584473505036f688a6cebb1bc87cf7cabb3a35b67910c59616b7f6dcbe417de56c8ac5009ff82b25a94ee48350141d274463
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
class QueueWithTimeout
|
|
2
|
+
def initialize
|
|
3
|
+
@mutex = Mutex.new
|
|
4
|
+
@queue = []
|
|
5
|
+
@recieved = ConditionVariable.new
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def push(x)
|
|
9
|
+
@mutex.synchronize do
|
|
10
|
+
@queue.push x
|
|
11
|
+
@recieved.signal
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def pop(non_block = false)
|
|
16
|
+
pop_with_timeout(non_block ? 0 : nil)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def pop_with_timeout(timeout = nil)
|
|
20
|
+
@mutex.synchronize do
|
|
21
|
+
if @queue.empty?
|
|
22
|
+
@recieved.wait(@mutex, timeout) if timeout != 0
|
|
23
|
+
#if we're still empty after the timeout, raise exception
|
|
24
|
+
raise ThreadError, "queue empty" if @queue.empty?
|
|
25
|
+
end
|
|
26
|
+
@queue.shift
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
data/lib/teamd/discover/cli.rb
CHANGED
|
@@ -18,9 +18,12 @@ module Teamd
|
|
|
18
18
|
end
|
|
19
19
|
desc "discover","One shot discovery"
|
|
20
20
|
def discover
|
|
21
|
-
token = Cli.peer.discover
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
if token = Cli.peer.discover
|
|
22
|
+
url = "ETCD_DISCOVERY=https://discovery.etcd.io/#{token}"
|
|
23
|
+
puts url
|
|
24
|
+
else
|
|
25
|
+
exit(1)
|
|
26
|
+
end
|
|
24
27
|
end
|
|
25
28
|
end
|
|
26
29
|
end
|
data/lib/teamd/discover/peer.rb
CHANGED
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
require "socket"
|
|
2
2
|
require "securerandom"
|
|
3
|
+
require "queue_with_timeout"
|
|
3
4
|
|
|
4
5
|
module Teamd
|
|
5
6
|
module Discover
|
|
6
7
|
class Peer
|
|
8
|
+
class Timeout < Exception; end
|
|
7
9
|
class << self
|
|
8
10
|
def tid
|
|
9
11
|
@tid ||= SecureRandom.hex(8)
|
|
10
12
|
end
|
|
13
|
+
def domain
|
|
14
|
+
Socket.gethostname.split(".",2).last
|
|
15
|
+
end
|
|
11
16
|
end
|
|
12
17
|
def initialize
|
|
13
18
|
@transport ||= Teamd::Discover::Transport.new
|
|
@@ -21,9 +26,8 @@ module Teamd
|
|
|
21
26
|
process_announcement(message) if message.is_a? Message::ClusterAnnouncement
|
|
22
27
|
end
|
|
23
28
|
end
|
|
24
|
-
def discover timeout=
|
|
25
|
-
input
|
|
26
|
-
wait timeout
|
|
29
|
+
def discover timeout=3
|
|
30
|
+
input = QueueWithTimeout.new
|
|
27
31
|
Thread.new do
|
|
28
32
|
begin
|
|
29
33
|
message = @transport.receive
|
|
@@ -36,24 +40,25 @@ module Teamd
|
|
|
36
40
|
retry
|
|
37
41
|
end
|
|
38
42
|
end
|
|
39
|
-
# i,o=IO.pipe
|
|
40
43
|
Thread.new do
|
|
41
44
|
loop do
|
|
42
45
|
@transport.transmit Message.build("discovery" => true)
|
|
43
46
|
sleep 1
|
|
44
47
|
end
|
|
45
48
|
end
|
|
46
|
-
|
|
49
|
+
begin
|
|
50
|
+
input.pop_with_timeout timeout
|
|
51
|
+
rescue ThreadError
|
|
52
|
+
nil
|
|
53
|
+
end
|
|
47
54
|
end
|
|
48
|
-
def announce
|
|
49
|
-
@
|
|
55
|
+
def announce token=nil
|
|
56
|
+
@registry.add(Cluster.new(token: token,name:Peer.domain)) if token
|
|
57
|
+
@transport.transmit Message::ClusterAnnouncement.new clusters: @registry.pack
|
|
50
58
|
end
|
|
51
59
|
private
|
|
52
60
|
def keep_alive
|
|
53
|
-
Thread.new{
|
|
54
|
-
end
|
|
55
|
-
def wait timeout
|
|
56
|
-
Thread.new{sleep(timeout); exit(1);}
|
|
61
|
+
Thread.new{IO.select([IO.pipe[0]])}
|
|
57
62
|
end
|
|
58
63
|
def process_discovery message
|
|
59
64
|
packet = Message::ClusterAnnouncement.new clusters: @registry.pack
|
|
@@ -31,7 +31,7 @@ module Teamd
|
|
|
31
31
|
def add_cluster_from_environment
|
|
32
32
|
uri = URI ENV['ETCD_DISCOVERY'] rescue nil
|
|
33
33
|
token = uri.path.split("/").last rescue nil
|
|
34
|
-
domain =
|
|
34
|
+
domain = Peer.domain rescue ""
|
|
35
35
|
add Cluster.new(name: domain, token: token) if token && domain
|
|
36
36
|
end
|
|
37
37
|
def add_clusters_from_files pattern
|
data/lib/teamd/discover.rb
CHANGED
|
@@ -6,3 +6,16 @@ require "teamd/discover/peer"
|
|
|
6
6
|
require "teamd/discover/protocol"
|
|
7
7
|
require "teamd/discover/registry"
|
|
8
8
|
require "teamd/discover/transport"
|
|
9
|
+
|
|
10
|
+
module Teamd
|
|
11
|
+
module Discover
|
|
12
|
+
class << self
|
|
13
|
+
def discover timeout=15
|
|
14
|
+
Teamd::Discover::Peer.new.discover timeout
|
|
15
|
+
end
|
|
16
|
+
def announce token
|
|
17
|
+
Teamd::Discover::Peer.new.announce token
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: teamd-discover
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.3.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Mathias Kaufmann
|
|
@@ -126,6 +126,7 @@ files:
|
|
|
126
126
|
- bin/console
|
|
127
127
|
- bin/setup
|
|
128
128
|
- exe/teamd-discover
|
|
129
|
+
- lib/queue_with_timeout.rb
|
|
129
130
|
- lib/teamd/discover.rb
|
|
130
131
|
- lib/teamd/discover/cli.rb
|
|
131
132
|
- lib/teamd/discover/cluster.rb
|