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.
Files changed (98) hide show
  1. checksums.yaml +7 -0
  2. data/lib/event_store/http/cluster/member_state.rb +28 -0
  3. data/lib/event_store/http/connect/defaults.rb +11 -0
  4. data/lib/event_store/http/connect/leader.rb +37 -0
  5. data/lib/event_store/http/connect.rb +69 -0
  6. data/lib/event_store/http/controls/cluster/current_members.rb +52 -0
  7. data/lib/event_store/http/controls/cluster/size.rb +13 -0
  8. data/lib/event_store/http/controls/event.rb +43 -0
  9. data/lib/event_store/http/controls/gossip/response/json.rb +91 -0
  10. data/lib/event_store/http/controls/gossip/response/member.rb +114 -0
  11. data/lib/event_store/http/controls/gossip/response.rb +17 -0
  12. data/lib/event_store/http/controls/hostname/cluster.rb +67 -0
  13. data/lib/event_store/http/controls/hostname/resolution.rb +61 -0
  14. data/lib/event_store/http/controls/hostname.rb +35 -0
  15. data/lib/event_store/http/controls/info/response/json.rb +25 -0
  16. data/lib/event_store/http/controls/info/response.rb +21 -0
  17. data/lib/event_store/http/controls/ip_address/cluster.rb +77 -0
  18. data/lib/event_store/http/controls/ip_address.rb +23 -0
  19. data/lib/event_store/http/controls/json.rb +27 -0
  20. data/lib/event_store/http/controls/media_types/atom/event/content.rb +47 -0
  21. data/lib/event_store/http/controls/media_types/atom/event/json.rb +52 -0
  22. data/lib/event_store/http/controls/media_types/atom/event/links.rb +28 -0
  23. data/lib/event_store/http/controls/media_types/atom/event.rb +46 -0
  24. data/lib/event_store/http/controls/media_types/atom/page/entries.rb +131 -0
  25. data/lib/event_store/http/controls/media_types/atom/page/json/backward.rb +115 -0
  26. data/lib/event_store/http/controls/media_types/atom/page/json/embed/body.rb +150 -0
  27. data/lib/event_store/http/controls/media_types/atom/page/json/embed/rich.rb +144 -0
  28. data/lib/event_store/http/controls/media_types/atom/page/json.rb +113 -0
  29. data/lib/event_store/http/controls/media_types/atom/page/links.rb +70 -0
  30. data/lib/event_store/http/controls/media_types/atom/page.rb +43 -0
  31. data/lib/event_store/http/controls/media_types/events/json.rb +25 -0
  32. data/lib/event_store/http/controls/media_types/events.rb +39 -0
  33. data/lib/event_store/http/controls/net_http/host_header.rb +41 -0
  34. data/lib/event_store/http/controls/net_http/request/post.rb +36 -0
  35. data/lib/event_store/http/controls/net_http/request.rb +13 -0
  36. data/lib/event_store/http/controls/net_http.rb +14 -0
  37. data/lib/event_store/http/controls/port.rb +29 -0
  38. data/lib/event_store/http/controls/read_event/output_schema.rb +43 -0
  39. data/lib/event_store/http/controls/read_stream/output_schema/optimized.rb +66 -0
  40. data/lib/event_store/http/controls/read_stream/output_schema.rb +50 -0
  41. data/lib/event_store/http/controls/session_type.rb +15 -0
  42. data/lib/event_store/http/controls/stream.rb +17 -0
  43. data/lib/event_store/http/controls/time.rb +7 -0
  44. data/lib/event_store/http/controls/uri/event.rb +24 -0
  45. data/lib/event_store/http/controls/uuid.rb +7 -0
  46. data/lib/event_store/http/controls/write.rb +22 -0
  47. data/lib/event_store/http/controls.rb +59 -0
  48. data/lib/event_store/http/gossip/response/member.rb +40 -0
  49. data/lib/event_store/http/gossip/response/transformer.rb +49 -0
  50. data/lib/event_store/http/gossip/response.rb +25 -0
  51. data/lib/event_store/http/gossip.rb +28 -0
  52. data/lib/event_store/http/info/response/transformer.rb +28 -0
  53. data/lib/event_store/http/info/response.rb +25 -0
  54. data/lib/event_store/http/info.rb +28 -0
  55. data/lib/event_store/http/json/deserialize.rb +25 -0
  56. data/lib/event_store/http/json/serialize.rb +20 -0
  57. data/lib/event_store/http/log.rb +20 -0
  58. data/lib/event_store/http/media_types/atom/event/transformer.rb +44 -0
  59. data/lib/event_store/http/media_types/atom/event.rb +28 -0
  60. data/lib/event_store/http/media_types/atom/links.rb +18 -0
  61. data/lib/event_store/http/media_types/atom/page/embed/body/transformer.rb +43 -0
  62. data/lib/event_store/http/media_types/atom/page/embed/none/transformer.rb +45 -0
  63. data/lib/event_store/http/media_types/atom/page/embed/rich/event.rb +33 -0
  64. data/lib/event_store/http/media_types/atom/page/embed/rich/transformer.rb +63 -0
  65. data/lib/event_store/http/media_types/atom/page/transformer.rb +11 -0
  66. data/lib/event_store/http/media_types/atom/page.rb +17 -0
  67. data/lib/event_store/http/media_types/atom.rb +11 -0
  68. data/lib/event_store/http/media_types/events/data.rb +46 -0
  69. data/lib/event_store/http/media_types/events.rb +11 -0
  70. data/lib/event_store/http/net_http/extensions.rb +34 -0
  71. data/lib/event_store/http/net_http/substitute/telemetry.rb +19 -0
  72. data/lib/event_store/http/net_http/substitute.rb +112 -0
  73. data/lib/event_store/http/net_http.rb +11 -0
  74. data/lib/event_store/http/read_event/log_text.rb +17 -0
  75. data/lib/event_store/http/read_event/substitute.rb +35 -0
  76. data/lib/event_store/http/read_event.rb +72 -0
  77. data/lib/event_store/http/read_stream/defaults.rb +31 -0
  78. data/lib/event_store/http/read_stream/log_text.rb +17 -0
  79. data/lib/event_store/http/read_stream/substitute.rb +90 -0
  80. data/lib/event_store/http/read_stream.rb +100 -0
  81. data/lib/event_store/http/request.rb +48 -0
  82. data/lib/event_store/http/retry/substitute.rb +44 -0
  83. data/lib/event_store/http/retry/telemetry.rb +15 -0
  84. data/lib/event_store/http/retry.rb +98 -0
  85. data/lib/event_store/http/session/any_member.rb +9 -0
  86. data/lib/event_store/http/session/defaults.rb +11 -0
  87. data/lib/event_store/http/session/factory.rb +74 -0
  88. data/lib/event_store/http/session/leader.rb +33 -0
  89. data/lib/event_store/http/session/log_text.rb +41 -0
  90. data/lib/event_store/http/session/read.rb +22 -0
  91. data/lib/event_store/http/session.rb +100 -0
  92. data/lib/event_store/http/settings/read.rb +29 -0
  93. data/lib/event_store/http/settings.rb +27 -0
  94. data/lib/event_store/http/write/log_text.rb +17 -0
  95. data/lib/event_store/http/write/substitute.rb +52 -0
  96. data/lib/event_store/http/write.rb +82 -0
  97. data/lib/event_store/http.rb +77 -0
  98. 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,11 @@
1
+ module EventStore
2
+ module HTTP
3
+ class Connect
4
+ module Defaults
5
+ def self.port
6
+ 2113
7
+ end
8
+ end
9
+ end
10
+ end
11
+ 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,13 @@
1
+ module EventStore
2
+ module HTTP
3
+ module Controls
4
+ module Cluster
5
+ module Size
6
+ def self.example
7
+ 3
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
13
+ 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,17 @@
1
+ module EventStore
2
+ module HTTP
3
+ module Controls
4
+ module Gossip
5
+ module Response
6
+ def self.server_ip
7
+ IPAddress::Cluster.example
8
+ end
9
+
10
+ def self.server_port
11
+ Port::Internal.example
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ 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