etcd-discovery 0.1.5 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/etcd-discovery.rb +1 -1
- data/lib/etcd-discovery/host.rb +22 -0
- data/lib/etcd-discovery/registrar.rb +54 -7
- data/lib/etcd-discovery/registration.rb +7 -0
- data/lib/etcd-discovery/service.rb +51 -6
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 894c96cbadf49bdddf6f499c50be5f8bd68ef95f
|
4
|
+
data.tar.gz: 7df1a2709784aaaea0838d36186f75aec034875c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6f67fd59fe7ecf4c7301d60f5263be4a2a1304be7b06d6716bd85e289d6a6c52e45b4fb385fd26e4163cc0b5ae1f6bc5a70a926077b34d582e457ee376a2c248
|
7
|
+
data.tar.gz: 1316ad6bf0935b9d9958017c1e3c8c3c16b32dd22067ff8daa4ca51db024b34f3fc7dd28d827c3e9b76e1290851b935b29232bf89a8b524a4babb0dea41cf686
|
data/lib/etcd-discovery.rb
CHANGED
data/lib/etcd-discovery/host.rb
CHANGED
@@ -37,6 +37,28 @@ module EtcdDiscovery
|
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
|
+
def to_private_uri(schemes = ["https", "http"])
|
41
|
+
a = attributes
|
42
|
+
if a['private_hostname'].empty?
|
43
|
+
return self.to_uri(schemes)
|
44
|
+
end
|
45
|
+
schemes = [schemes] if !schemes.is_a?(Array)
|
46
|
+
scheme = schemes.select{ |s|
|
47
|
+
!a['private_ports'][s].nil?
|
48
|
+
}.first
|
49
|
+
|
50
|
+
if a['user'].empty?
|
51
|
+
URI("#{scheme}://#{a['private_hostname']}:#{a['private_ports'][scheme]}")
|
52
|
+
else
|
53
|
+
URI("#{scheme}://#{a['user']}:#{a['password']}@#{a['private_hostname']}:#{a['private_ports'][scheme]}")
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def set_credentials(user, password)
|
58
|
+
@attributes['user'] = user
|
59
|
+
@attributes['password'] = password
|
60
|
+
end
|
61
|
+
|
40
62
|
def to_s
|
41
63
|
self.to_uri.to_s
|
42
64
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'securerandom'
|
2
|
+
|
1
3
|
module EtcdDiscovery
|
2
4
|
class InvalidStateError < StandardError
|
3
5
|
def initialize(current, expected)
|
@@ -13,21 +15,27 @@ module EtcdDiscovery
|
|
13
15
|
class Registrar
|
14
16
|
attr_reader :state
|
15
17
|
attr_reader :thread
|
18
|
+
attr_reader :watcher
|
16
19
|
attr_reader :host
|
20
|
+
attr_reader :service
|
21
|
+
attr_reader :user
|
22
|
+
attr_reader :password
|
17
23
|
|
18
24
|
def initialize(service, host)
|
19
25
|
@logger = Logger.new($stdout)
|
20
26
|
|
21
27
|
if host.is_a? Hash
|
22
|
-
@host = Host.new host
|
28
|
+
@host = Host.new host.merge('service_name' => service, 'uuid' => SecureRandom.uuid)
|
23
29
|
elsif host.is_a? EtcdDiscovery::Host
|
24
30
|
@host = host
|
25
31
|
else
|
26
32
|
raise TypeError, "host should be a Hash or a Etcd::Host, is a #{host.class}"
|
27
33
|
end
|
28
34
|
|
29
|
-
@service =
|
35
|
+
@service = EtcdDiscovery::Service.new service_params
|
30
36
|
@state = :new
|
37
|
+
@user = @host.attributes['user']
|
38
|
+
@password = @host.attributes['password']
|
31
39
|
end
|
32
40
|
|
33
41
|
def register
|
@@ -37,13 +45,33 @@ module EtcdDiscovery
|
|
37
45
|
end
|
38
46
|
|
39
47
|
@state = :started
|
40
|
-
value = @host.to_json
|
41
48
|
|
49
|
+
service_value = @service.to_json
|
50
|
+
|
51
|
+
# Do not start credentials synchro if the service is not public or has no credentials
|
52
|
+
if @service.attributes['public'] && (@service.attributes['user'].present? || @service.attributes['password'].present?)
|
53
|
+
@watcher = Thread.new {
|
54
|
+
@logger.warn "Watcher #{@service.attributes['name']} started"
|
55
|
+
index = 0
|
56
|
+
while @state == :started
|
57
|
+
resp = client.watch service_key, {index: index}
|
58
|
+
value = JSON.parse resp.node.value
|
59
|
+
@user = value['user']
|
60
|
+
@password = value['password']
|
61
|
+
@host.set_credentials user, password
|
62
|
+
@service.set_credentials user, password
|
63
|
+
index = resp.etcd_index
|
64
|
+
end
|
65
|
+
}
|
66
|
+
end
|
67
|
+
|
68
|
+
client.set(service_key, value: service_value)
|
42
69
|
@thread = Thread.new {
|
43
70
|
@logger.warn "Register '#{@service}' started"
|
44
71
|
while @state == :started
|
72
|
+
value = @host.to_json
|
45
73
|
begin
|
46
|
-
client.set(
|
74
|
+
client.set(host_key, value: value, ttl: config.register_ttl)
|
47
75
|
rescue => e
|
48
76
|
@logger.warn "Fail to set #{key}: #{e}, #{e.message}, #{e.class}"
|
49
77
|
end
|
@@ -51,7 +79,9 @@ module EtcdDiscovery
|
|
51
79
|
end
|
52
80
|
@logger.warn "Register '#{@service}' stopped"
|
53
81
|
}
|
54
|
-
|
82
|
+
|
83
|
+
|
84
|
+
return self
|
55
85
|
end
|
56
86
|
|
57
87
|
def stop
|
@@ -70,8 +100,25 @@ module EtcdDiscovery
|
|
70
100
|
EtcdDiscovery.config
|
71
101
|
end
|
72
102
|
|
73
|
-
def
|
74
|
-
"/services/#{@service}/#{@host.attributes['
|
103
|
+
def host_key
|
104
|
+
"/services/#{@service.attributes['name']}/#{@host.attributes['uuid']}"
|
105
|
+
end
|
106
|
+
|
107
|
+
def service_key
|
108
|
+
"/services_infos/#{@service.attributes['name']}"
|
109
|
+
end
|
110
|
+
|
111
|
+
def service_params
|
112
|
+
params = {
|
113
|
+
'name' => host.attributes['service_name'],
|
114
|
+
'critical' => host.attributes['critical'],
|
115
|
+
'user' => host.attributes['user'],
|
116
|
+
'password' => host.attributes['password'],
|
117
|
+
'public' => host.attributes['public']
|
118
|
+
}
|
119
|
+
params['hostname'] = host.attributes['name']if params['public']
|
120
|
+
params['ports'] = host.attributes['ports'] if params['public']
|
121
|
+
return params
|
75
122
|
end
|
76
123
|
end
|
77
124
|
end
|
@@ -3,19 +3,40 @@ module EtcdDiscovery
|
|
3
3
|
end
|
4
4
|
|
5
5
|
class Service
|
6
|
+
attr_accessor :attributes
|
7
|
+
|
8
|
+
def initialize(arg)
|
9
|
+
if arg.is_a? Etcd::Node
|
10
|
+
@attributes = JSON.parse arg.value
|
11
|
+
elsif arg.is_a? Hash
|
12
|
+
@attributes = arg
|
13
|
+
else
|
14
|
+
raise TypeError, "requires a Etcd::Node or a Hash, not a #{arg.class}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
6
18
|
def self.get(service)
|
7
19
|
raise TypeError, "service should be a String, is a #{service.class}" unless service.is_a? String
|
8
20
|
|
9
21
|
client = EtcdDiscovery.config.client
|
10
22
|
begin
|
11
|
-
|
23
|
+
service = client.get("/services_infos/#{service}")
|
24
|
+
return self.new service.node
|
25
|
+
rescue Etcd::KeyNotFound
|
26
|
+
return self.new name: 'service'
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def all
|
31
|
+
client = EtcdDiscovery.config.client
|
32
|
+
begin
|
33
|
+
node = client.get("/services/#{attributes['name']}", recursive: true).node
|
12
34
|
rescue Etcd::KeyNotFound
|
13
|
-
raise ServiceNotFound,
|
35
|
+
raise ServiceNotFound, attributes['name']
|
14
36
|
end
|
15
37
|
if node.children.length == 0
|
16
|
-
raise ServiceNotFound,
|
38
|
+
raise ServiceNotFound, attributes['name']
|
17
39
|
end
|
18
|
-
|
19
40
|
hosts = []
|
20
41
|
node.children.each do |c|
|
21
42
|
hosts << Host.new(c)
|
@@ -23,8 +44,32 @@ module EtcdDiscovery
|
|
23
44
|
return hosts
|
24
45
|
end
|
25
46
|
|
26
|
-
def
|
27
|
-
|
47
|
+
def one
|
48
|
+
all.sample
|
49
|
+
end
|
50
|
+
|
51
|
+
def to_uri(schemes = ["https", "http"])
|
52
|
+
a = attributes
|
53
|
+
return one.to_uri(schemes) unless a['public']
|
54
|
+
|
55
|
+
schemes = [schemes] if !schemes.is_a?(Array)
|
56
|
+
scheme = schemes.select{|s|
|
57
|
+
!a['ports'][s].nil?
|
58
|
+
}.first
|
59
|
+
if a['user'].empty?
|
60
|
+
URI("#{scheme}://#{a['hostname']}:#{a['ports'][scheme]}")
|
61
|
+
else
|
62
|
+
URI("#{scheme}://#{a['user']}:#{a['password']}@#{a['hostname']}:#{a['ports'][scheme]}")
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def to_json
|
67
|
+
attributes.to_json
|
68
|
+
end
|
69
|
+
|
70
|
+
def set_credentials(user, password)
|
71
|
+
@attributes['user'] = user
|
72
|
+
@attributes['password'] = password
|
28
73
|
end
|
29
74
|
end
|
30
75
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: etcd-discovery
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Léo Unbekandt
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-06-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: etcd
|
@@ -35,6 +35,7 @@ files:
|
|
35
35
|
- lib/etcd-discovery/config.rb
|
36
36
|
- lib/etcd-discovery/host.rb
|
37
37
|
- lib/etcd-discovery/registrar.rb
|
38
|
+
- lib/etcd-discovery/registration.rb
|
38
39
|
- lib/etcd-discovery/service.rb
|
39
40
|
- spec/etcd-discovery/registrar_spec.rb
|
40
41
|
- spec/spec_helper.rb
|
@@ -58,9 +59,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
58
59
|
version: '0'
|
59
60
|
requirements: []
|
60
61
|
rubyforge_project:
|
61
|
-
rubygems_version: 2.5.
|
62
|
+
rubygems_version: 2.5.2
|
62
63
|
signing_key:
|
63
64
|
specification_version: 4
|
64
65
|
summary: Service discovery based on etcd
|
65
66
|
test_files: []
|
66
|
-
has_rdoc:
|