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.
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