evt-event_store-http 0.0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/event_store/http/cluster/member_state.rb +28 -0
- data/lib/event_store/http/connect/defaults.rb +11 -0
- data/lib/event_store/http/connect/leader.rb +37 -0
- data/lib/event_store/http/connect.rb +69 -0
- data/lib/event_store/http/controls/cluster/current_members.rb +52 -0
- data/lib/event_store/http/controls/cluster/size.rb +13 -0
- data/lib/event_store/http/controls/event.rb +43 -0
- data/lib/event_store/http/controls/gossip/response/json.rb +91 -0
- data/lib/event_store/http/controls/gossip/response/member.rb +114 -0
- data/lib/event_store/http/controls/gossip/response.rb +17 -0
- data/lib/event_store/http/controls/hostname/cluster.rb +67 -0
- data/lib/event_store/http/controls/hostname/resolution.rb +61 -0
- data/lib/event_store/http/controls/hostname.rb +35 -0
- data/lib/event_store/http/controls/info/response/json.rb +25 -0
- data/lib/event_store/http/controls/info/response.rb +21 -0
- data/lib/event_store/http/controls/ip_address/cluster.rb +77 -0
- data/lib/event_store/http/controls/ip_address.rb +23 -0
- data/lib/event_store/http/controls/json.rb +27 -0
- data/lib/event_store/http/controls/media_types/atom/event/content.rb +47 -0
- data/lib/event_store/http/controls/media_types/atom/event/json.rb +52 -0
- data/lib/event_store/http/controls/media_types/atom/event/links.rb +28 -0
- data/lib/event_store/http/controls/media_types/atom/event.rb +46 -0
- data/lib/event_store/http/controls/media_types/atom/page/entries.rb +131 -0
- data/lib/event_store/http/controls/media_types/atom/page/json/backward.rb +115 -0
- data/lib/event_store/http/controls/media_types/atom/page/json/embed/body.rb +150 -0
- data/lib/event_store/http/controls/media_types/atom/page/json/embed/rich.rb +144 -0
- data/lib/event_store/http/controls/media_types/atom/page/json.rb +113 -0
- data/lib/event_store/http/controls/media_types/atom/page/links.rb +70 -0
- data/lib/event_store/http/controls/media_types/atom/page.rb +43 -0
- data/lib/event_store/http/controls/media_types/events/json.rb +25 -0
- data/lib/event_store/http/controls/media_types/events.rb +39 -0
- data/lib/event_store/http/controls/net_http/host_header.rb +41 -0
- data/lib/event_store/http/controls/net_http/request/post.rb +36 -0
- data/lib/event_store/http/controls/net_http/request.rb +13 -0
- data/lib/event_store/http/controls/net_http.rb +14 -0
- data/lib/event_store/http/controls/port.rb +29 -0
- data/lib/event_store/http/controls/read_event/output_schema.rb +43 -0
- data/lib/event_store/http/controls/read_stream/output_schema/optimized.rb +66 -0
- data/lib/event_store/http/controls/read_stream/output_schema.rb +50 -0
- data/lib/event_store/http/controls/session_type.rb +15 -0
- data/lib/event_store/http/controls/stream.rb +17 -0
- data/lib/event_store/http/controls/time.rb +7 -0
- data/lib/event_store/http/controls/uri/event.rb +24 -0
- data/lib/event_store/http/controls/uuid.rb +7 -0
- data/lib/event_store/http/controls/write.rb +22 -0
- data/lib/event_store/http/controls.rb +59 -0
- data/lib/event_store/http/gossip/response/member.rb +40 -0
- data/lib/event_store/http/gossip/response/transformer.rb +49 -0
- data/lib/event_store/http/gossip/response.rb +25 -0
- data/lib/event_store/http/gossip.rb +28 -0
- data/lib/event_store/http/info/response/transformer.rb +28 -0
- data/lib/event_store/http/info/response.rb +25 -0
- data/lib/event_store/http/info.rb +28 -0
- data/lib/event_store/http/json/deserialize.rb +25 -0
- data/lib/event_store/http/json/serialize.rb +20 -0
- data/lib/event_store/http/log.rb +20 -0
- data/lib/event_store/http/media_types/atom/event/transformer.rb +44 -0
- data/lib/event_store/http/media_types/atom/event.rb +28 -0
- data/lib/event_store/http/media_types/atom/links.rb +18 -0
- data/lib/event_store/http/media_types/atom/page/embed/body/transformer.rb +43 -0
- data/lib/event_store/http/media_types/atom/page/embed/none/transformer.rb +45 -0
- data/lib/event_store/http/media_types/atom/page/embed/rich/event.rb +33 -0
- data/lib/event_store/http/media_types/atom/page/embed/rich/transformer.rb +63 -0
- data/lib/event_store/http/media_types/atom/page/transformer.rb +11 -0
- data/lib/event_store/http/media_types/atom/page.rb +17 -0
- data/lib/event_store/http/media_types/atom.rb +11 -0
- data/lib/event_store/http/media_types/events/data.rb +46 -0
- data/lib/event_store/http/media_types/events.rb +11 -0
- data/lib/event_store/http/net_http/extensions.rb +34 -0
- data/lib/event_store/http/net_http/substitute/telemetry.rb +19 -0
- data/lib/event_store/http/net_http/substitute.rb +112 -0
- data/lib/event_store/http/net_http.rb +11 -0
- data/lib/event_store/http/read_event/log_text.rb +17 -0
- data/lib/event_store/http/read_event/substitute.rb +35 -0
- data/lib/event_store/http/read_event.rb +72 -0
- data/lib/event_store/http/read_stream/defaults.rb +31 -0
- data/lib/event_store/http/read_stream/log_text.rb +17 -0
- data/lib/event_store/http/read_stream/substitute.rb +90 -0
- data/lib/event_store/http/read_stream.rb +100 -0
- data/lib/event_store/http/request.rb +48 -0
- data/lib/event_store/http/retry/substitute.rb +44 -0
- data/lib/event_store/http/retry/telemetry.rb +15 -0
- data/lib/event_store/http/retry.rb +98 -0
- data/lib/event_store/http/session/any_member.rb +9 -0
- data/lib/event_store/http/session/defaults.rb +11 -0
- data/lib/event_store/http/session/factory.rb +74 -0
- data/lib/event_store/http/session/leader.rb +33 -0
- data/lib/event_store/http/session/log_text.rb +41 -0
- data/lib/event_store/http/session/read.rb +22 -0
- data/lib/event_store/http/session.rb +100 -0
- data/lib/event_store/http/settings/read.rb +29 -0
- data/lib/event_store/http/settings.rb +27 -0
- data/lib/event_store/http/write/log_text.rb +17 -0
- data/lib/event_store/http/write/substitute.rb +52 -0
- data/lib/event_store/http/write.rb +82 -0
- data/lib/event_store/http.rb +77 -0
- metadata +237 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 6d7bca7367ca57a54b68cb4c3d83dee13eee09aa
|
4
|
+
data.tar.gz: d05d8c2d740c53b428b7ce446de231d8489e26a9
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2aff6940e662a82b5600b3c614b3ffa1d8493c6b8bd3b391a5648b9c765ce0fa5d9ddd9fddfde6063bd210c7eb2d577328abeaf845f28b38fe7a666fdcbf11dc
|
7
|
+
data.tar.gz: c09751131798df128ff02926714a52b750dcf21d854616668abe6bc61d5e42d8fb4338ce0f7e0cc88cf4404cd652353fe7f0ea0bbbf38fbad2d93552bc3d9ddb
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module EventStore
|
2
|
+
module HTTP
|
3
|
+
module Cluster
|
4
|
+
module MemberState
|
5
|
+
def self.leader
|
6
|
+
'Master'
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.follower
|
10
|
+
'Slave'
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.unknown
|
14
|
+
'Unknown'
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.digest(state)
|
18
|
+
case state
|
19
|
+
when leader then 'Leader'
|
20
|
+
when follower then 'Follower'
|
21
|
+
when unknown then 'Unknown'
|
22
|
+
else state
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module EventStore
|
2
|
+
module HTTP
|
3
|
+
class Connect
|
4
|
+
module Leader
|
5
|
+
def self.build(settings=nil, namespace: nil)
|
6
|
+
instance = Connect.build settings, namespace: namespace
|
7
|
+
instance.extend self
|
8
|
+
instance
|
9
|
+
end
|
10
|
+
|
11
|
+
def connect(net_http=nil)
|
12
|
+
net_http ||= super()
|
13
|
+
|
14
|
+
member_info = Info.(connection: net_http)
|
15
|
+
|
16
|
+
return net_http if member_info.leader?
|
17
|
+
|
18
|
+
cluster_status = Gossip.(connection: net_http)
|
19
|
+
|
20
|
+
cluster_status.leader ||= cluster_status.unknown.first
|
21
|
+
|
22
|
+
if cluster_status.leader.nil?
|
23
|
+
error_message = "Leader is unavailable (Host: #{host}, Port: #{port})"
|
24
|
+
logger.error { error_message }
|
25
|
+
raise LeaderUnavailableError, error_message
|
26
|
+
end
|
27
|
+
|
28
|
+
leader_ip_address = cluster_status.leader.external_http_ip
|
29
|
+
|
30
|
+
raw leader_ip_address
|
31
|
+
end
|
32
|
+
|
33
|
+
LeaderUnavailableError = Class.new StandardError
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
module EventStore
|
2
|
+
module HTTP
|
3
|
+
class Connect
|
4
|
+
include Log::Dependency
|
5
|
+
|
6
|
+
configure :connect
|
7
|
+
|
8
|
+
setting :host
|
9
|
+
setting :port
|
10
|
+
|
11
|
+
setting :keep_alive_timeout
|
12
|
+
setting :open_timeout
|
13
|
+
setting :read_timeout
|
14
|
+
|
15
|
+
def port
|
16
|
+
@port ||= Defaults.port
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.build(settings=nil, namespace: nil)
|
20
|
+
settings ||= Settings.instance
|
21
|
+
namespace ||= Array(namespace)
|
22
|
+
|
23
|
+
instance = new
|
24
|
+
settings.set instance, namespace
|
25
|
+
instance
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.call(ip_address=nil, settings: nil, namespace: nil)
|
29
|
+
instance = build settings, namespace: namespace
|
30
|
+
instance.(ip_address)
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.configure_connection(receiver, settings=nil, connection: nil, attr_name: nil, **arguments)
|
34
|
+
attr_name ||= :connection
|
35
|
+
|
36
|
+
connection ||= self.(settings: settings, **arguments)
|
37
|
+
receiver.public_send "#{attr_name}=", connection
|
38
|
+
connection
|
39
|
+
end
|
40
|
+
|
41
|
+
def call(ip_address=nil)
|
42
|
+
if ip_address.nil?
|
43
|
+
connect
|
44
|
+
else
|
45
|
+
raw ip_address
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def connect
|
50
|
+
raw host
|
51
|
+
end
|
52
|
+
|
53
|
+
def raw(ip_address)
|
54
|
+
logger.trace { "Building Net::HTTP connection (IPAddress: #{ip_address}, Port: #{port})" }
|
55
|
+
|
56
|
+
net_http = Net::HTTP.new ip_address, port
|
57
|
+
net_http.keep_alive_timeout = keep_alive_timeout unless keep_alive_timeout.nil?
|
58
|
+
net_http.open_timeout = open_timeout unless open_timeout.nil?
|
59
|
+
net_http.read_timeout = read_timeout unless read_timeout.nil?
|
60
|
+
|
61
|
+
logger.debug { "Net::HTTP connection built (IPAddress: #{ip_address}, Port: #{port})" }
|
62
|
+
|
63
|
+
net_http.extend NetHTTP::Extensions
|
64
|
+
|
65
|
+
net_http
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module EventStore
|
2
|
+
module HTTP
|
3
|
+
module Controls
|
4
|
+
module Cluster
|
5
|
+
module CurrentMembers
|
6
|
+
def self.get
|
7
|
+
port = Port.example
|
8
|
+
|
9
|
+
ip_address = IPAddress::Cluster.list.detect do |ip_address|
|
10
|
+
begin
|
11
|
+
socket = TCPSocket.new ip_address, port
|
12
|
+
socket.close
|
13
|
+
true
|
14
|
+
rescue SystemCallError
|
15
|
+
false
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
leader_ip_address = nil
|
20
|
+
follower_ip_addresses = []
|
21
|
+
|
22
|
+
Net::HTTP.start ip_address, port do |connection|
|
23
|
+
connection.read_timeout = 0.1
|
24
|
+
|
25
|
+
response = connection.request_get '/gossip', { 'Accept' => 'application/json' }
|
26
|
+
|
27
|
+
fail unless response.code == '200'
|
28
|
+
|
29
|
+
json_text = response.body
|
30
|
+
|
31
|
+
gossip_status = ::JSON.parse json_text
|
32
|
+
|
33
|
+
members = gossip_status['members']
|
34
|
+
|
35
|
+
members.each do |member|
|
36
|
+
ip_address = member['externalHttpIp']
|
37
|
+
|
38
|
+
if member['state'] == 'Master'
|
39
|
+
leader_ip_address = ip_address
|
40
|
+
else
|
41
|
+
follower_ip_addresses << ip_address
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
return leader_ip_address, *follower_ip_addresses
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module EventStore
|
2
|
+
module HTTP
|
3
|
+
module Controls
|
4
|
+
module Event
|
5
|
+
module ID
|
6
|
+
def self.example(i=nil)
|
7
|
+
UUID.example i
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module Type
|
12
|
+
def self.example
|
13
|
+
'SomeType'
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
module Data
|
18
|
+
def self.example(i=nil)
|
19
|
+
i ||= 0
|
20
|
+
|
21
|
+
{ :some_attribute => "some-value-#{i}" }
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.text(i=nil)
|
25
|
+
::JSON.generate example(i)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
module Metadata
|
30
|
+
def self.example(i=nil)
|
31
|
+
i ||= 0
|
32
|
+
|
33
|
+
{ :some_meta_attribute => "some-meta-value-#{i}" }
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.text(i=nil)
|
37
|
+
::JSON.generate example(i)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
module EventStore
|
2
|
+
module HTTP
|
3
|
+
module Controls
|
4
|
+
module Gossip
|
5
|
+
module Response
|
6
|
+
module JSON
|
7
|
+
def self.text(unavailable: nil)
|
8
|
+
<<-JSON
|
9
|
+
{
|
10
|
+
"members": [
|
11
|
+
{
|
12
|
+
"instanceId": "00000101-0000-4000-8000-000000000000",
|
13
|
+
"timeStamp": "2000-01-01T00:00:00.000000Z",
|
14
|
+
"state": "#{unavailable ? 'Unknown' : 'Master'}",
|
15
|
+
"isAlive": true,
|
16
|
+
"internalTcpIp": "127.0.111.1",
|
17
|
+
"internalTcpPort": 1112,
|
18
|
+
"internalSecureTcpPort": 0,
|
19
|
+
"externalTcpIp": "127.0.111.1",
|
20
|
+
"externalTcpPort": 1113,
|
21
|
+
"externalSecureTcpPort": 0,
|
22
|
+
"internalHttpIp": "127.0.111.1",
|
23
|
+
"internalHttpPort": 2112,
|
24
|
+
"externalHttpIp": "127.0.111.1",
|
25
|
+
"externalHttpPort": 2113,
|
26
|
+
"lastCommitPosition": 1111,
|
27
|
+
"writerCheckpoint": 111,
|
28
|
+
"chaserCheckpoint": 11,
|
29
|
+
"epochPosition": 222,
|
30
|
+
"epochNumber": 22,
|
31
|
+
"epochId": "00000001-0000-4000-8000-000000000000",
|
32
|
+
"nodePriority": 0
|
33
|
+
},
|
34
|
+
{
|
35
|
+
"instanceId": "00000102-0000-4000-8000-000000000000",
|
36
|
+
"timeStamp": "2000-01-01T00:00:00.000000Z",
|
37
|
+
"state": "Slave",
|
38
|
+
"isAlive": true,
|
39
|
+
"internalTcpIp": "127.0.111.2",
|
40
|
+
"internalTcpPort": 1112,
|
41
|
+
"internalSecureTcpPort": 0,
|
42
|
+
"externalTcpIp": "127.0.111.2",
|
43
|
+
"externalTcpPort": 1113,
|
44
|
+
"externalSecureTcpPort": 0,
|
45
|
+
"internalHttpIp": "127.0.111.2",
|
46
|
+
"internalHttpPort": 2112,
|
47
|
+
"externalHttpIp": "127.0.111.2",
|
48
|
+
"externalHttpPort": 2113,
|
49
|
+
"lastCommitPosition": 1111,
|
50
|
+
"writerCheckpoint": 111,
|
51
|
+
"chaserCheckpoint": 11,
|
52
|
+
"epochPosition": 222,
|
53
|
+
"epochNumber": 22,
|
54
|
+
"epochId": "00000001-0000-4000-8000-000000000000",
|
55
|
+
"nodePriority": 0
|
56
|
+
},
|
57
|
+
{
|
58
|
+
"instanceId": "00000103-0000-4000-8000-000000000000",
|
59
|
+
"timeStamp": "2000-01-01T00:00:00.000000Z",
|
60
|
+
"state": "Slave",
|
61
|
+
"isAlive": false,
|
62
|
+
"internalTcpIp": "127.0.111.3",
|
63
|
+
"internalTcpPort": 1112,
|
64
|
+
"internalSecureTcpPort": 0,
|
65
|
+
"externalTcpIp": "127.0.111.3",
|
66
|
+
"externalTcpPort": 1113,
|
67
|
+
"externalSecureTcpPort": 0,
|
68
|
+
"internalHttpIp": "127.0.111.3",
|
69
|
+
"internalHttpPort": 2112,
|
70
|
+
"externalHttpIp": "127.0.111.3",
|
71
|
+
"externalHttpPort": 2113,
|
72
|
+
"lastCommitPosition": 1111,
|
73
|
+
"writerCheckpoint": 111,
|
74
|
+
"chaserCheckpoint": 11,
|
75
|
+
"epochPosition": 222,
|
76
|
+
"epochNumber": 22,
|
77
|
+
"epochId": "00000001-0000-4000-8000-000000000000",
|
78
|
+
"nodePriority": 0
|
79
|
+
}
|
80
|
+
],
|
81
|
+
"serverIp": "127.0.111.1",
|
82
|
+
"serverPort": 2112
|
83
|
+
}
|
84
|
+
JSON
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
module EventStore
|
2
|
+
module HTTP
|
3
|
+
module Controls
|
4
|
+
module Gossip
|
5
|
+
module Response
|
6
|
+
module Member
|
7
|
+
def self.instance_id(member_index=nil)
|
8
|
+
member_index ||= 1
|
9
|
+
|
10
|
+
UUID.example member_index + 100
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.time_stamp
|
14
|
+
Controls::Time::Raw.example.iso8601 6
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.state(member_index=nil)
|
18
|
+
member_index ||= 1
|
19
|
+
|
20
|
+
if member_index == 1
|
21
|
+
State.leader
|
22
|
+
else
|
23
|
+
State.follower
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.is_alive(member_index=nil)
|
28
|
+
if member_index == 3
|
29
|
+
false
|
30
|
+
else
|
31
|
+
true
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.internal_tcp_ip(member_index=nil)
|
36
|
+
IPAddress::Cluster.example member_index
|
37
|
+
end
|
38
|
+
singleton_class.send :alias_method, :external_tcp_ip, :internal_tcp_ip
|
39
|
+
singleton_class.send :alias_method, :internal_http_ip, :internal_tcp_ip
|
40
|
+
singleton_class.send :alias_method, :external_http_ip, :internal_tcp_ip
|
41
|
+
|
42
|
+
def self.internal_tcp_port
|
43
|
+
Port::TCP::Internal.example
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.internal_secure_tcp_port
|
47
|
+
0
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.external_tcp_port
|
51
|
+
Port::TCP::External.example
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.external_secure_tcp_port
|
55
|
+
0
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.internal_http_port
|
59
|
+
Port::Internal.example
|
60
|
+
end
|
61
|
+
|
62
|
+
def self.external_http_port
|
63
|
+
Port.example
|
64
|
+
end
|
65
|
+
|
66
|
+
def self.last_commit_position
|
67
|
+
1111
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.writer_checkpoint
|
71
|
+
111
|
72
|
+
end
|
73
|
+
|
74
|
+
def self.chaser_checkpoint
|
75
|
+
11
|
76
|
+
end
|
77
|
+
|
78
|
+
def self.epoch_position
|
79
|
+
222
|
80
|
+
end
|
81
|
+
|
82
|
+
def self.epoch_number
|
83
|
+
22
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.epoch_id
|
87
|
+
UUID.example
|
88
|
+
end
|
89
|
+
|
90
|
+
def self.node_priority
|
91
|
+
0
|
92
|
+
end
|
93
|
+
|
94
|
+
Leader = self
|
95
|
+
|
96
|
+
State = EventStore::HTTP::Cluster::MemberState
|
97
|
+
|
98
|
+
module Index
|
99
|
+
def self.leader
|
100
|
+
1
|
101
|
+
end
|
102
|
+
|
103
|
+
def self.follower(follower_index=nil)
|
104
|
+
follower_index ||= 1
|
105
|
+
|
106
|
+
self.leader + follower_index
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module EventStore
|
2
|
+
module HTTP
|
3
|
+
module Controls
|
4
|
+
module Hostname
|
5
|
+
module Cluster
|
6
|
+
def self.example
|
7
|
+
Available.example
|
8
|
+
end
|
9
|
+
|
10
|
+
module Leader
|
11
|
+
def self.example
|
12
|
+
'leader.eventstore-cluster.local'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
module Followers
|
17
|
+
def self.example
|
18
|
+
'followers.eventstore-cluster.local'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
module Available
|
23
|
+
def self.example
|
24
|
+
'eventstore-cluster.local'
|
25
|
+
end
|
26
|
+
|
27
|
+
module Member
|
28
|
+
def self.example(member_index=nil)
|
29
|
+
member_index ||= 1
|
30
|
+
|
31
|
+
"eventstore-cluster-#{member_index}.local"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
module Unavailable
|
37
|
+
def self.example
|
38
|
+
'unavailable.eventstore-cluster.local'
|
39
|
+
end
|
40
|
+
|
41
|
+
module Member
|
42
|
+
def self.example(member_index=nil)
|
43
|
+
member_index ||= 1
|
44
|
+
|
45
|
+
"unavailable.eventstore-cluster-#{member_index}.local"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
module PartiallyAvailable
|
51
|
+
def self.example
|
52
|
+
'partially-available.eventstore-cluster.local'
|
53
|
+
end
|
54
|
+
|
55
|
+
module Member
|
56
|
+
def self.example(member_index=nil)
|
57
|
+
member_index ||= 1
|
58
|
+
|
59
|
+
"partially-available.eventstore-cluster-#{member_index}.local"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module EventStore
|
2
|
+
module HTTP
|
3
|
+
module Controls
|
4
|
+
module Hostname
|
5
|
+
module Resolution
|
6
|
+
def self.activate
|
7
|
+
require 'resolv-replace'
|
8
|
+
|
9
|
+
hosts_path = HostsFile.get
|
10
|
+
|
11
|
+
hosts_resolver = Resolv::Hosts.new hosts_path
|
12
|
+
|
13
|
+
Resolv::DefaultResolver.replace_resolvers [hosts_resolver]
|
14
|
+
end
|
15
|
+
|
16
|
+
module HostsFile
|
17
|
+
def self.get
|
18
|
+
tempfile = Tempfile.new 'hosts'
|
19
|
+
tempfile.write text
|
20
|
+
tempfile.close
|
21
|
+
|
22
|
+
at_exit { tempfile.unlink }
|
23
|
+
|
24
|
+
tempfile.path
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.text
|
28
|
+
leader_ip_address, *follower_ip_addresses = Controls::Cluster::CurrentMembers.get
|
29
|
+
|
30
|
+
ERB.new(<<~ERB, 0, '>').result binding
|
31
|
+
<%= IPAddress::Available.example %> <%= Hostname::Available.example %>\n
|
32
|
+
<%= IPAddress::Available.example %> <%= Hostname::Available::Other.example %>\n
|
33
|
+
<%= IPAddress::Unavailable.example %> <%= Hostname::Unavailable.example %>\n
|
34
|
+
|
35
|
+
<% (1..Controls::Cluster::Size.example).each do |member_index| %>
|
36
|
+
<%= IPAddress::Cluster::Available.example member_index %> <%= Hostname::Cluster::Available.example %>\n
|
37
|
+
<%= IPAddress::Cluster::Available.example member_index %> <%= Hostname::Cluster::Available::Member.example member_index %>\n
|
38
|
+
<% end %>
|
39
|
+
|
40
|
+
<% (1..Controls::Cluster::Size.example).each do |member_index| %>
|
41
|
+
<%= IPAddress::Cluster::Unavailable.example member_index %> <%= Hostname::Cluster::Unavailable.example %>\n
|
42
|
+
<%= IPAddress::Cluster::Unavailable.example member_index %> <%= Hostname::Cluster::Unavailable::Member.example member_index %>\n
|
43
|
+
<% end %>
|
44
|
+
|
45
|
+
<% (1..Controls::Cluster::Size.example).each do |member_index| %>
|
46
|
+
<%= IPAddress::Cluster::PartiallyAvailable.example member_index %> <%= Hostname::Cluster::PartiallyAvailable.example %>\n
|
47
|
+
<%= IPAddress::Cluster::PartiallyAvailable.example member_index %> <%= Hostname::Cluster::PartiallyAvailable::Member.example member_index %>\n
|
48
|
+
<% end %>
|
49
|
+
|
50
|
+
<%= leader_ip_address %> <%= Hostname::Cluster::Leader.example %>\n
|
51
|
+
<% follower_ip_addresses.each do |follower_ip_address| %>
|
52
|
+
<%= follower_ip_address %> <%= Hostname::Cluster::Followers.example %>\n
|
53
|
+
<% end %>
|
54
|
+
ERB
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module EventStore
|
2
|
+
module HTTP
|
3
|
+
module Controls
|
4
|
+
module Hostname
|
5
|
+
def self.example
|
6
|
+
Available.example
|
7
|
+
end
|
8
|
+
|
9
|
+
module Other
|
10
|
+
def self.example
|
11
|
+
Available::Other.example
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
module Available
|
16
|
+
def self.example
|
17
|
+
'eventstore.local'
|
18
|
+
end
|
19
|
+
|
20
|
+
module Other
|
21
|
+
def self.example
|
22
|
+
'alternate.eventstore.local'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
module Unavailable
|
28
|
+
def self.example
|
29
|
+
'unavailable.eventstore.local'
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module EventStore
|
2
|
+
module HTTP
|
3
|
+
module Controls
|
4
|
+
module Info
|
5
|
+
module Response
|
6
|
+
module JSON
|
7
|
+
def self.text(state: nil)
|
8
|
+
state ||= :leader
|
9
|
+
|
10
|
+
state = EventStore::HTTP::Cluster::MemberState.public_send state
|
11
|
+
|
12
|
+
<<~JSON
|
13
|
+
{
|
14
|
+
"esVersion": "1.1.1",
|
15
|
+
"state": "#{state}",
|
16
|
+
"projectionsMode": "some-mode"
|
17
|
+
}
|
18
|
+
JSON
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|