evt-event_store-cluster-leader_status 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/cluster/leader_status.rb +14 -0
- data/lib/event_store/cluster/leader_status/controls.rb +16 -0
- data/lib/event_store/cluster/leader_status/controls/cluster_size.rb +13 -0
- data/lib/event_store/cluster/leader_status/controls/connect_http.rb +16 -0
- data/lib/event_store/cluster/leader_status/controls/current_members.rb +43 -0
- data/lib/event_store/cluster/leader_status/controls/gossip_endpoint/response.rb +111 -0
- data/lib/event_store/cluster/leader_status/controls/gossip_endpoint/response/member.rb +112 -0
- data/lib/event_store/cluster/leader_status/controls/hostname.rb +17 -0
- data/lib/event_store/cluster/leader_status/controls/ip_address.rb +27 -0
- data/lib/event_store/cluster/leader_status/controls/port.rb +33 -0
- data/lib/event_store/cluster/leader_status/controls/resolve_host.rb +9 -0
- data/lib/event_store/cluster/leader_status/controls/time.rb +9 -0
- data/lib/event_store/cluster/leader_status/controls/uuid.rb +9 -0
- data/lib/event_store/cluster/leader_status/data.rb +15 -0
- data/lib/event_store/cluster/leader_status/get.rb +54 -0
- data/lib/event_store/cluster/leader_status/gossip_endpoint/get.rb +95 -0
- data/lib/event_store/cluster/leader_status/gossip_endpoint/response.rb +24 -0
- data/lib/event_store/cluster/leader_status/gossip_endpoint/response/member.rb +42 -0
- data/lib/event_store/cluster/leader_status/gossip_endpoint/response/state.rb +19 -0
- data/lib/event_store/cluster/leader_status/gossip_endpoint/response/transformer.rb +61 -0
- data/lib/event_store/cluster/leader_status/log.rb +13 -0
- metadata +134 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 718dd84c0ac14c746c5056ded4fd7d1d2bf900f6
|
4
|
+
data.tar.gz: b1dabd36f48acecb20223183e8caf4003a4f0a81
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2d74d2ae9ea5d893607d4c138415a21d546470164142f28a323cef8a160c50cbe7d5dfc0064ec6156b3a8db74d534710a19912dffad6155f9bd3d7eff59a2252
|
7
|
+
data.tar.gz: 651ae4ae3bd74fd6cb6fd453bf6bf61eba291942261409190d03628796bb828d1330bd69470bdf96efd7e2592b64eb7525382623c3995a6a9dd9ccf4cf141885
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'event_store/http/connect'
|
2
|
+
require 'schema'
|
3
|
+
require 'transform'
|
4
|
+
|
5
|
+
require 'event_store/cluster/leader_status/log'
|
6
|
+
|
7
|
+
require 'event_store/cluster/leader_status/gossip_endpoint/get'
|
8
|
+
require 'event_store/cluster/leader_status/gossip_endpoint/response/member'
|
9
|
+
require 'event_store/cluster/leader_status/gossip_endpoint/response/transformer'
|
10
|
+
require 'event_store/cluster/leader_status/gossip_endpoint/response/state'
|
11
|
+
require 'event_store/cluster/leader_status/gossip_endpoint/response'
|
12
|
+
|
13
|
+
require 'event_store/cluster/leader_status/data'
|
14
|
+
require 'event_store/cluster/leader_status/get'
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'clock/controls'
|
2
|
+
require 'identifier/uuid/controls'
|
3
|
+
require 'event_store/http/connect/controls'
|
4
|
+
|
5
|
+
require 'event_store/cluster/leader_status/controls/connect_http'
|
6
|
+
require 'event_store/cluster/leader_status/controls/cluster_size'
|
7
|
+
require 'event_store/cluster/leader_status/controls/current_members'
|
8
|
+
require 'event_store/cluster/leader_status/controls/hostname'
|
9
|
+
require 'event_store/cluster/leader_status/controls/ip_address'
|
10
|
+
require 'event_store/cluster/leader_status/controls/resolve_host'
|
11
|
+
require 'event_store/cluster/leader_status/controls/port'
|
12
|
+
require 'event_store/cluster/leader_status/controls/uuid'
|
13
|
+
require 'event_store/cluster/leader_status/controls/time'
|
14
|
+
|
15
|
+
require 'event_store/cluster/leader_status/controls/gossip_endpoint/response'
|
16
|
+
require 'event_store/cluster/leader_status/controls/gossip_endpoint/response/member'
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module EventStore
|
2
|
+
module Cluster
|
3
|
+
module LeaderStatus
|
4
|
+
module Controls
|
5
|
+
module ConnectHTTP
|
6
|
+
def self.example(host: nil, ip_addresses: nil)
|
7
|
+
connect = EventStore::HTTP::Connect.build
|
8
|
+
connect.host = host if host
|
9
|
+
ResolveHost.configure connect, host: host, ip_addresses: ip_addresses
|
10
|
+
connect
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module EventStore
|
2
|
+
module Cluster
|
3
|
+
module LeaderStatus
|
4
|
+
module Controls
|
5
|
+
module CurrentMembers
|
6
|
+
def self.get
|
7
|
+
ip_address = IPAddress.example
|
8
|
+
port = Port::HTTP.example
|
9
|
+
|
10
|
+
leader_ip_address = nil
|
11
|
+
follower_ip_addresses = []
|
12
|
+
|
13
|
+
Net::HTTP.start ip_address, port do |connection|
|
14
|
+
connection.read_timeout = 0.1
|
15
|
+
|
16
|
+
response = connection.request_get '/gossip', { 'Accept' => 'application/json' }
|
17
|
+
|
18
|
+
fail unless response.code == '200'
|
19
|
+
|
20
|
+
json_text = response.body
|
21
|
+
|
22
|
+
gossip_status = JSON.parse json_text
|
23
|
+
|
24
|
+
members = gossip_status['members']
|
25
|
+
|
26
|
+
members.each do |member|
|
27
|
+
ip_address = member['externalHttpIp']
|
28
|
+
|
29
|
+
if member['state'] == 'Master'
|
30
|
+
leader_ip_address = ip_address
|
31
|
+
else
|
32
|
+
follower_ip_addresses << ip_address
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
return leader_ip_address, *follower_ip_addresses
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
module EventStore
|
2
|
+
module Cluster
|
3
|
+
module LeaderStatus
|
4
|
+
module Controls
|
5
|
+
module GossipEndpoint
|
6
|
+
module Response
|
7
|
+
def self.server_ip
|
8
|
+
IPAddress.example
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.server_port
|
12
|
+
Port::HTTP::Internal.example
|
13
|
+
end
|
14
|
+
|
15
|
+
module State
|
16
|
+
def self.leader
|
17
|
+
'Master'
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.follower
|
21
|
+
'Slave'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
module JSON
|
26
|
+
def self.text
|
27
|
+
<<-JSON
|
28
|
+
{
|
29
|
+
"members": [
|
30
|
+
{
|
31
|
+
"instanceId": "00000101-0000-4000-8000-000000000000",
|
32
|
+
"timeStamp": "2000-01-01T00:00:00.000000Z",
|
33
|
+
"state": "Master",
|
34
|
+
"isAlive": true,
|
35
|
+
"internalTcpIp": "127.0.111.1",
|
36
|
+
"internalTcpPort": 1112,
|
37
|
+
"internalSecureTcpPort": 0,
|
38
|
+
"externalTcpIp": "127.0.111.1",
|
39
|
+
"externalTcpPort": 1113,
|
40
|
+
"externalSecureTcpPort": 0,
|
41
|
+
"internalHttpIp": "127.0.111.1",
|
42
|
+
"internalHttpPort": 2112,
|
43
|
+
"externalHttpIp": "127.0.111.1",
|
44
|
+
"externalHttpPort": 2113,
|
45
|
+
"lastCommitPosition": 1111,
|
46
|
+
"writerCheckpoint": 111,
|
47
|
+
"chaserCheckpoint": 11,
|
48
|
+
"epochPosition": 222,
|
49
|
+
"epochNumber": 22,
|
50
|
+
"epochId": "00000001-0000-4000-8000-000000000000",
|
51
|
+
"nodePriority": 0
|
52
|
+
},
|
53
|
+
{
|
54
|
+
"instanceId": "00000102-0000-4000-8000-000000000000",
|
55
|
+
"timeStamp": "2000-01-01T00:00:00.000000Z",
|
56
|
+
"state": "Slave",
|
57
|
+
"isAlive": true,
|
58
|
+
"internalTcpIp": "127.0.111.2",
|
59
|
+
"internalTcpPort": 1112,
|
60
|
+
"internalSecureTcpPort": 0,
|
61
|
+
"externalTcpIp": "127.0.111.2",
|
62
|
+
"externalTcpPort": 1113,
|
63
|
+
"externalSecureTcpPort": 0,
|
64
|
+
"internalHttpIp": "127.0.111.2",
|
65
|
+
"internalHttpPort": 2112,
|
66
|
+
"externalHttpIp": "127.0.111.2",
|
67
|
+
"externalHttpPort": 2113,
|
68
|
+
"lastCommitPosition": 1111,
|
69
|
+
"writerCheckpoint": 111,
|
70
|
+
"chaserCheckpoint": 11,
|
71
|
+
"epochPosition": 222,
|
72
|
+
"epochNumber": 22,
|
73
|
+
"epochId": "00000001-0000-4000-8000-000000000000",
|
74
|
+
"nodePriority": 0
|
75
|
+
},
|
76
|
+
{
|
77
|
+
"instanceId": "00000103-0000-4000-8000-000000000000",
|
78
|
+
"timeStamp": "2000-01-01T00:00:00.000000Z",
|
79
|
+
"state": "Slave",
|
80
|
+
"isAlive": false,
|
81
|
+
"internalTcpIp": "127.0.111.3",
|
82
|
+
"internalTcpPort": 1112,
|
83
|
+
"internalSecureTcpPort": 0,
|
84
|
+
"externalTcpIp": "127.0.111.3",
|
85
|
+
"externalTcpPort": 1113,
|
86
|
+
"externalSecureTcpPort": 0,
|
87
|
+
"internalHttpIp": "127.0.111.3",
|
88
|
+
"internalHttpPort": 2112,
|
89
|
+
"externalHttpIp": "127.0.111.3",
|
90
|
+
"externalHttpPort": 2113,
|
91
|
+
"lastCommitPosition": 1111,
|
92
|
+
"writerCheckpoint": 111,
|
93
|
+
"chaserCheckpoint": 11,
|
94
|
+
"epochPosition": 222,
|
95
|
+
"epochNumber": 22,
|
96
|
+
"epochId": "00000001-0000-4000-8000-000000000000",
|
97
|
+
"nodePriority": 0
|
98
|
+
}
|
99
|
+
],
|
100
|
+
"serverIp": "127.0.111.1",
|
101
|
+
"serverPort": 2112
|
102
|
+
}
|
103
|
+
JSON
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
module EventStore
|
2
|
+
module Cluster
|
3
|
+
module LeaderStatus
|
4
|
+
module Controls
|
5
|
+
module GossipEndpoint
|
6
|
+
module Response
|
7
|
+
module Member
|
8
|
+
def self.instance_id(member_index=nil)
|
9
|
+
member_index ||= 1
|
10
|
+
|
11
|
+
UUID.example member_index + 100
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.time_stamp
|
15
|
+
Controls::Time::Raw.example.iso8601 6
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.state(member_index=nil)
|
19
|
+
member_index ||= 1
|
20
|
+
|
21
|
+
if member_index == 1
|
22
|
+
State.leader
|
23
|
+
else
|
24
|
+
State.follower
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.is_alive(member_index=nil)
|
29
|
+
if member_index == 3
|
30
|
+
false
|
31
|
+
else
|
32
|
+
true
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.internal_tcp_ip(member_index=nil)
|
37
|
+
IPAddress.example member_index
|
38
|
+
end
|
39
|
+
singleton_class.send :alias_method, :external_tcp_ip, :internal_tcp_ip
|
40
|
+
singleton_class.send :alias_method, :internal_http_ip, :internal_tcp_ip
|
41
|
+
singleton_class.send :alias_method, :external_http_ip, :internal_tcp_ip
|
42
|
+
|
43
|
+
def self.internal_tcp_port
|
44
|
+
Port::TCP::Internal.example
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.internal_secure_tcp_port
|
48
|
+
0
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.external_tcp_port
|
52
|
+
Port::TCP::External.example
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.external_secure_tcp_port
|
56
|
+
0
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.internal_http_port
|
60
|
+
Port::HTTP::Internal.example
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.external_http_port
|
64
|
+
Port::HTTP.example
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.last_commit_position
|
68
|
+
1111
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.writer_checkpoint
|
72
|
+
111
|
73
|
+
end
|
74
|
+
|
75
|
+
def self.chaser_checkpoint
|
76
|
+
11
|
77
|
+
end
|
78
|
+
|
79
|
+
def self.epoch_position
|
80
|
+
222
|
81
|
+
end
|
82
|
+
|
83
|
+
def self.epoch_number
|
84
|
+
22
|
85
|
+
end
|
86
|
+
|
87
|
+
def self.epoch_id
|
88
|
+
UUID.example
|
89
|
+
end
|
90
|
+
|
91
|
+
def self.node_priority
|
92
|
+
0
|
93
|
+
end
|
94
|
+
|
95
|
+
module Index
|
96
|
+
def self.leader
|
97
|
+
1
|
98
|
+
end
|
99
|
+
|
100
|
+
def self.follower(follower_index=nil)
|
101
|
+
follower_index ||= 1
|
102
|
+
|
103
|
+
self.leader + follower_index
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module EventStore
|
2
|
+
module Cluster
|
3
|
+
module LeaderStatus
|
4
|
+
module Controls
|
5
|
+
Hostname = EventStore::HTTP::Connect::Controls::Cluster::Hostname
|
6
|
+
|
7
|
+
module Hostname
|
8
|
+
module NonCluster
|
9
|
+
def self.example
|
10
|
+
EventStore::HTTP::Connect::Controls::Hostname.example
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module EventStore
|
2
|
+
module Cluster
|
3
|
+
module LeaderStatus
|
4
|
+
module Controls
|
5
|
+
IPAddress = EventStore::HTTP::Connect::Controls::Cluster::IPAddress
|
6
|
+
|
7
|
+
module IPAddress
|
8
|
+
module Leader
|
9
|
+
def self.example
|
10
|
+
IPAddress.example member_index
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.member_index
|
14
|
+
2
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
module NonCluster
|
19
|
+
def self.example
|
20
|
+
EventStore::HTTP::Connect::Controls::IPAddress.example
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module EventStore
|
2
|
+
module Cluster
|
3
|
+
module LeaderStatus
|
4
|
+
module Controls
|
5
|
+
module Port
|
6
|
+
module TCP
|
7
|
+
def self.example
|
8
|
+
1113
|
9
|
+
end
|
10
|
+
|
11
|
+
module Internal
|
12
|
+
def self.example
|
13
|
+
TCP.example - 1
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
module HTTP
|
19
|
+
def self.example
|
20
|
+
EventStore::HTTP::Connect::Controls::Port.example
|
21
|
+
end
|
22
|
+
|
23
|
+
module Internal
|
24
|
+
def self.example
|
25
|
+
HTTP.example - 1
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module EventStore
|
2
|
+
module Cluster
|
3
|
+
module LeaderStatus
|
4
|
+
class Data
|
5
|
+
include Schema::DataStructure
|
6
|
+
|
7
|
+
attribute :tcp_ip_address, String
|
8
|
+
attribute :tcp_port, Integer
|
9
|
+
|
10
|
+
attribute :http_ip_address, String
|
11
|
+
attribute :http_port, Integer
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module EventStore
|
2
|
+
module Cluster
|
3
|
+
module LeaderStatus
|
4
|
+
class Get
|
5
|
+
include Log::Dependency
|
6
|
+
|
7
|
+
configure :get_leader_status
|
8
|
+
|
9
|
+
dependency :get_gossip_endpoint, GossipEndpoint::Get
|
10
|
+
|
11
|
+
def self.build(connect_http=nil)
|
12
|
+
instance = new
|
13
|
+
|
14
|
+
GossipEndpoint::Get.configure instance, connect_http
|
15
|
+
|
16
|
+
instance
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.call(*arguments)
|
20
|
+
instance = build *arguments
|
21
|
+
instance.()
|
22
|
+
end
|
23
|
+
|
24
|
+
def call
|
25
|
+
logger.trace { "Getting leader" }
|
26
|
+
|
27
|
+
gossip_response = get_gossip_endpoint.()
|
28
|
+
|
29
|
+
if gossip_response.nil?
|
30
|
+
logger.info { "Get leader done; EventStore is non-clustered" }
|
31
|
+
return nil
|
32
|
+
end
|
33
|
+
|
34
|
+
data = Data.new
|
35
|
+
|
36
|
+
SetAttributes.(
|
37
|
+
data,
|
38
|
+
gossip_response.leader,
|
39
|
+
copy: [
|
40
|
+
{ :external_tcp_ip => :tcp_ip_address },
|
41
|
+
{ :external_tcp_port => :tcp_port },
|
42
|
+
{ :external_http_ip => :http_ip_address },
|
43
|
+
{ :external_http_port => :http_port }
|
44
|
+
]
|
45
|
+
)
|
46
|
+
|
47
|
+
logger.info { "Get leader done (TCP: #{data.tcp_ip_address}:#{data.tcp_port}, HTTP: #{data.http_ip_address}:#{data.http_port})" }
|
48
|
+
|
49
|
+
data
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
module EventStore
|
2
|
+
module Cluster
|
3
|
+
module LeaderStatus
|
4
|
+
module GossipEndpoint
|
5
|
+
class Get
|
6
|
+
include Log::Dependency
|
7
|
+
|
8
|
+
configure :get_gossip_endpoint
|
9
|
+
|
10
|
+
dependency :connect_http, EventStore::HTTP::Connect
|
11
|
+
|
12
|
+
def self.build(connect_http=nil)
|
13
|
+
instance = new
|
14
|
+
|
15
|
+
connect_http = EventStore::HTTP::Connect.configure(
|
16
|
+
instance,
|
17
|
+
connect: connect_http,
|
18
|
+
attr_name: :connect_http
|
19
|
+
)
|
20
|
+
|
21
|
+
instance
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.call(host=nil, connect_http=nil)
|
25
|
+
instance = build connect_http
|
26
|
+
instance.(host)
|
27
|
+
end
|
28
|
+
|
29
|
+
def call(host=nil)
|
30
|
+
log_attributes = LogAttributes.get self, host: host
|
31
|
+
|
32
|
+
logger.trace { "GET gossip endpoint (#{log_attributes})" }
|
33
|
+
|
34
|
+
connection_telemetry = EventStore::HTTP::Connect.register_telemetry_sink connect_http
|
35
|
+
|
36
|
+
connect_http.(host) do |connection|
|
37
|
+
begin
|
38
|
+
response = connection.request_get uri_path, http_headers
|
39
|
+
rescue Net::ReadTimeout
|
40
|
+
response = nil
|
41
|
+
end
|
42
|
+
|
43
|
+
if response
|
44
|
+
log_attributes << ", StatusCode: #{response.code}, ReasonPhrase: #{response.message}"
|
45
|
+
|
46
|
+
logger.debug { "GET gossip endpoint done (#{log_attributes})" }
|
47
|
+
logger.trace { "Data: \n\n#{response.body}" }
|
48
|
+
end
|
49
|
+
|
50
|
+
if response.nil? or non_cluster? response
|
51
|
+
error_message = "GET gossip endpoint made against non-clustered EventStore (#{log_attributes})"
|
52
|
+
logger.error error_message
|
53
|
+
raise NonClusterError, error_message
|
54
|
+
end
|
55
|
+
|
56
|
+
response = Transform::Read.(response.body, :json, Response)
|
57
|
+
|
58
|
+
return response
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def uri_path
|
63
|
+
'/gossip'
|
64
|
+
end
|
65
|
+
|
66
|
+
def http_headers
|
67
|
+
{ 'Accept' => 'application/json' }
|
68
|
+
end
|
69
|
+
|
70
|
+
def non_cluster?(response)
|
71
|
+
response.code == '408' and response.message == "Server was unable to handle request in time"
|
72
|
+
end
|
73
|
+
|
74
|
+
NonClusterError = Class.new StandardError
|
75
|
+
|
76
|
+
module LogAttributes
|
77
|
+
def self.get(get_instance, host: nil)
|
78
|
+
host_setting = get_instance.connect_http.host
|
79
|
+
|
80
|
+
if host.nil?
|
81
|
+
host_text = host_setting
|
82
|
+
else
|
83
|
+
host_text = "#{host} [Overriding setting: [#{host_setting}]]"
|
84
|
+
end
|
85
|
+
|
86
|
+
get_instance.instance_exec do
|
87
|
+
"Host: #{host_text}"
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module EventStore
|
2
|
+
module Cluster
|
3
|
+
module LeaderStatus
|
4
|
+
module GossipEndpoint
|
5
|
+
class Response
|
6
|
+
include Schema::DataStructure
|
7
|
+
|
8
|
+
attribute :server_ip, String
|
9
|
+
attribute :server_port, Integer
|
10
|
+
attribute :leader, Member
|
11
|
+
attribute :followers, Array, default: ->{ Array.new }
|
12
|
+
|
13
|
+
def add_member(member)
|
14
|
+
if member.state == State.leader
|
15
|
+
self.leader = member
|
16
|
+
else
|
17
|
+
followers << member
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module EventStore
|
2
|
+
module Cluster
|
3
|
+
module LeaderStatus
|
4
|
+
module GossipEndpoint
|
5
|
+
class Response
|
6
|
+
class Member
|
7
|
+
include Schema::DataStructure
|
8
|
+
|
9
|
+
attribute :instance_id, String
|
10
|
+
attribute :time_stamp, String
|
11
|
+
attribute :state, String
|
12
|
+
attribute :is_alive
|
13
|
+
|
14
|
+
attribute :internal_tcp_ip, String
|
15
|
+
attribute :internal_tcp_port, Integer
|
16
|
+
attribute :internal_secure_tcp_port, Integer
|
17
|
+
|
18
|
+
attribute :external_tcp_ip, String
|
19
|
+
attribute :external_tcp_port, Integer
|
20
|
+
attribute :external_secure_tcp_port, Integer
|
21
|
+
|
22
|
+
attribute :internal_http_ip, String
|
23
|
+
attribute :internal_http_port, Integer
|
24
|
+
|
25
|
+
attribute :external_http_ip, String
|
26
|
+
attribute :external_http_port, Integer
|
27
|
+
|
28
|
+
attribute :last_commit_position, Integer
|
29
|
+
attribute :writer_checkpoint, Integer
|
30
|
+
attribute :chaser_checkpoint, Integer
|
31
|
+
|
32
|
+
attribute :epoch_position, Integer
|
33
|
+
attribute :epoch_number, Integer
|
34
|
+
attribute :epoch_id, String
|
35
|
+
|
36
|
+
attribute :node_priority, Integer
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module EventStore
|
2
|
+
module Cluster
|
3
|
+
module LeaderStatus
|
4
|
+
module GossipEndpoint
|
5
|
+
class Response
|
6
|
+
module Transformer
|
7
|
+
def self.json
|
8
|
+
JSON
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.instance(raw_data)
|
12
|
+
response = Response.new
|
13
|
+
|
14
|
+
SetAttributes.(response, raw_data)
|
15
|
+
|
16
|
+
raw_data[:members].each do |member_data|
|
17
|
+
member = member_instance member_data
|
18
|
+
|
19
|
+
response.add_member member
|
20
|
+
end
|
21
|
+
|
22
|
+
response
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.member_instance(member_data)
|
26
|
+
member = Response::Member.new
|
27
|
+
|
28
|
+
SetAttributes.(
|
29
|
+
member,
|
30
|
+
member_data,
|
31
|
+
strict: true
|
32
|
+
)
|
33
|
+
|
34
|
+
member
|
35
|
+
end
|
36
|
+
|
37
|
+
module Status
|
38
|
+
def self.leader
|
39
|
+
'Master'
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.follower
|
43
|
+
'Slave'
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
module JSON
|
48
|
+
def self.read(text)
|
49
|
+
formatted_data = ::JSON.parse text, symbolize_names: true
|
50
|
+
|
51
|
+
raw_data = Casing::Underscore.(formatted_data)
|
52
|
+
|
53
|
+
raw_data
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
metadata
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: evt-event_store-cluster-leader_status
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- The Eventide Project
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-01-05 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: evt-event_store-http-connect
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: evt-identifier-uuid
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: evt-schema
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: evt-transform
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: test_bench
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
description: " "
|
84
|
+
email: opensource@eventide-project.org
|
85
|
+
executables: []
|
86
|
+
extensions: []
|
87
|
+
extra_rdoc_files: []
|
88
|
+
files:
|
89
|
+
- lib/event_store/cluster/leader_status.rb
|
90
|
+
- lib/event_store/cluster/leader_status/controls.rb
|
91
|
+
- lib/event_store/cluster/leader_status/controls/cluster_size.rb
|
92
|
+
- lib/event_store/cluster/leader_status/controls/connect_http.rb
|
93
|
+
- lib/event_store/cluster/leader_status/controls/current_members.rb
|
94
|
+
- lib/event_store/cluster/leader_status/controls/gossip_endpoint/response.rb
|
95
|
+
- lib/event_store/cluster/leader_status/controls/gossip_endpoint/response/member.rb
|
96
|
+
- lib/event_store/cluster/leader_status/controls/hostname.rb
|
97
|
+
- lib/event_store/cluster/leader_status/controls/ip_address.rb
|
98
|
+
- lib/event_store/cluster/leader_status/controls/port.rb
|
99
|
+
- lib/event_store/cluster/leader_status/controls/resolve_host.rb
|
100
|
+
- lib/event_store/cluster/leader_status/controls/time.rb
|
101
|
+
- lib/event_store/cluster/leader_status/controls/uuid.rb
|
102
|
+
- lib/event_store/cluster/leader_status/data.rb
|
103
|
+
- lib/event_store/cluster/leader_status/get.rb
|
104
|
+
- lib/event_store/cluster/leader_status/gossip_endpoint/get.rb
|
105
|
+
- lib/event_store/cluster/leader_status/gossip_endpoint/response.rb
|
106
|
+
- lib/event_store/cluster/leader_status/gossip_endpoint/response/member.rb
|
107
|
+
- lib/event_store/cluster/leader_status/gossip_endpoint/response/state.rb
|
108
|
+
- lib/event_store/cluster/leader_status/gossip_endpoint/response/transformer.rb
|
109
|
+
- lib/event_store/cluster/leader_status/log.rb
|
110
|
+
homepage: https://github.com/eventide-project/event-store-clustering
|
111
|
+
licenses:
|
112
|
+
- MIT
|
113
|
+
metadata: {}
|
114
|
+
post_install_message:
|
115
|
+
rdoc_options: []
|
116
|
+
require_paths:
|
117
|
+
- lib
|
118
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
119
|
+
requirements:
|
120
|
+
- - ">="
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: 2.3.3
|
123
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
124
|
+
requirements:
|
125
|
+
- - ">="
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
version: '0'
|
128
|
+
requirements: []
|
129
|
+
rubyforge_project:
|
130
|
+
rubygems_version: 2.6.8
|
131
|
+
signing_key:
|
132
|
+
specification_version: 4
|
133
|
+
summary: Cluster leader status support for EventStore
|
134
|
+
test_files: []
|