evt-event_store-http 0.0.0.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 +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
|