@@ -134,18 +134,144 @@ func TestCluster_Hashicorp_Memberlist(t *testing.T) {
134
134
testCluster (t , conf1 , conf2 , conf3 )
135
135
}
136
136
137
+ func TestCluster_Etcd_Serf (t * testing.T ) {
138
+ bindPort1 , err := utils .GetFreePort ()
139
+ require .NoError (t , err , "Failed to get free port for node1" )
140
+ raftPort1 , err := utils .GetFreePort ()
141
+ require .NoError (t , err , "Failed to get free port for node1 Raft" )
142
+
143
+ bindPort2 , err := utils .GetFreePort ()
144
+ require .NoError (t , err , "Failed to get free port for node2" )
145
+ raftPort2 , err := utils .GetFreePort ()
146
+ require .NoError (t , err , "Failed to get free port for node2 Raft" )
147
+
148
+ bindPort3 , err := utils .GetFreePort ()
149
+ require .NoError (t , err , "Failed to get free port for node3" )
150
+ raftPort3 , err := utils .GetFreePort ()
151
+ require .NoError (t , err , "Failed to get free port for node3 Raft" )
152
+
153
+ members := []string {
154
+ "127.0.0.1:" + strconv .Itoa (bindPort1 ),
155
+ "127.0.0.1:" + strconv .Itoa (bindPort2 ),
156
+ "127.0.0.1:" + strconv .Itoa (bindPort3 ),
157
+ }
158
+
159
+ conf1 := & config.Cluster {
160
+ NodeName : "1" ,
161
+ RaftImpl : config .RaftImplEtcd ,
162
+ BindAddr : "127.0.0.1" ,
163
+ BindPort : bindPort1 ,
164
+ RaftPort : raftPort1 ,
165
+ RaftBootstrap : true ,
166
+ RaftDir : t .TempDir (),
167
+ GrpcEnable : false ,
168
+ Members : members ,
169
+ DiscoveryWay : config .DiscoveryWaySerf ,
170
+ NodesFileDir : t .TempDir (),
171
+ }
172
+ conf2 := & config.Cluster {
173
+ NodeName : "2" ,
174
+ RaftImpl : config .RaftImplEtcd ,
175
+ BindAddr : "127.0.0.1" ,
176
+ BindPort : bindPort2 ,
177
+ RaftPort : raftPort2 ,
178
+ RaftBootstrap : false ,
179
+ RaftDir : t .TempDir (),
180
+ GrpcEnable : false ,
181
+ Members : members ,
182
+ DiscoveryWay : config .DiscoveryWaySerf ,
183
+ NodesFileDir : t .TempDir (),
184
+ }
185
+ conf3 := & config.Cluster {
186
+ NodeName : "3" ,
187
+ RaftImpl : config .RaftImplEtcd ,
188
+ BindAddr : "127.0.0.1" ,
189
+ BindPort : bindPort3 ,
190
+ RaftPort : raftPort3 ,
191
+ RaftBootstrap : false ,
192
+ RaftDir : t .TempDir (),
193
+ GrpcEnable : false ,
194
+ Members : members ,
195
+ DiscoveryWay : config .DiscoveryWaySerf ,
196
+ NodesFileDir : t .TempDir (),
197
+ }
198
+ testCluster (t , conf1 , conf2 , conf3 )
199
+ }
200
+
201
+ func TestCluster_Etcd_Memberlist (t * testing.T ) {
202
+ bindPort1 , err := utils .GetFreePort ()
203
+ require .NoError (t , err , "Failed to get free port for node1" )
204
+
205
+ bindPort2 , err := utils .GetFreePort ()
206
+ require .NoError (t , err , "Failed to get free port for node2" )
207
+
208
+ bindPort3 , err := utils .GetFreePort ()
209
+ require .NoError (t , err , "Failed to get free port for node3" )
210
+
211
+ members := []string {
212
+ "127.0.0.1:" + strconv .Itoa (bindPort1 ),
213
+ "127.0.0.1:" + strconv .Itoa (bindPort2 ),
214
+ "127.0.0.1:" + strconv .Itoa (bindPort3 ),
215
+ }
216
+
217
+ conf1 := & config.Cluster {
218
+ NodeName : "1" ,
219
+ RaftImpl : config .RaftImplEtcd ,
220
+ BindAddr : "127.0.0.1" ,
221
+ BindPort : bindPort1 ,
222
+ RaftPort : mlist .GetRaftPortFromBindPort (bindPort1 ),
223
+ RaftBootstrap : true ,
224
+ RaftDir : t .TempDir (),
225
+ GrpcEnable : false ,
226
+ Members : members ,
227
+ DiscoveryWay : config .DiscoveryWayMemberlist ,
228
+ NodesFileDir : t .TempDir (),
229
+ }
230
+ conf2 := & config.Cluster {
231
+ NodeName : "2" ,
232
+ RaftImpl : config .RaftImplEtcd ,
233
+ BindAddr : "127.0.0.1" ,
234
+ BindPort : bindPort2 ,
235
+ RaftPort : mlist .GetRaftPortFromBindPort (bindPort2 ),
236
+ RaftBootstrap : false ,
237
+ RaftDir : t .TempDir (),
238
+ GrpcEnable : false ,
239
+ Members : members ,
240
+ DiscoveryWay : config .DiscoveryWayMemberlist ,
241
+ NodesFileDir : t .TempDir (),
242
+ }
243
+ conf3 := & config.Cluster {
244
+ NodeName : "3" ,
245
+ RaftImpl : config .RaftImplEtcd ,
246
+ BindAddr : "127.0.0.1" ,
247
+ BindPort : bindPort3 ,
248
+ RaftPort : mlist .GetRaftPortFromBindPort (bindPort3 ),
249
+ RaftBootstrap : false ,
250
+ RaftDir : t .TempDir (),
251
+ GrpcEnable : false ,
252
+ Members : members ,
253
+ DiscoveryWay : config .DiscoveryWayMemberlist ,
254
+ NodesFileDir : t .TempDir (),
255
+ }
256
+ testCluster (t , conf1 , conf2 , conf3 )
257
+ }
258
+
137
259
func testCluster (t * testing.T , conf1 * config.Cluster , conf2 * config.Cluster , conf3 * config.Cluster ) {
138
260
log .Init (log .DefaultOptions ())
139
261
140
262
agent1 := NewAgent (conf1 )
141
263
err := agent1 .Start ()
142
264
require .NoError (t , err , "Agent start failed for node: %s" , conf1 .NodeName )
143
265
266
+ time .Sleep (1 * time .Second )
267
+
144
268
agent2 := NewAgent (conf2 )
145
269
err = agent2 .Start ()
146
270
defer agent2 .Stop ()
147
271
require .NoError (t , err , "Agent start failed for node: %s" , conf2 .NodeName )
148
272
273
+ time .Sleep (1 * time .Second )
274
+
149
275
agent3 := NewAgent (conf3 )
150
276
err = agent3 .Start ()
151
277
defer agent3 .Stop ()
@@ -157,9 +283,9 @@ func testCluster(t *testing.T, conf1 *config.Cluster, conf2 *config.Cluster, con
157
283
_ , leader2 := agent2 .raftPeer .GetLeader ()
158
284
_ , leader3 := agent3 .raftPeer .GetLeader ()
159
285
160
- require .Equal (t , leader1 , "node1" )
161
- require .Equal (t , leader2 , "node1" )
162
- require .Equal (t , leader3 , "node1" )
286
+ require .Equal (t , leader1 , conf1 . NodeName )
287
+ require .Equal (t , leader2 , conf1 . NodeName )
288
+ require .Equal (t , leader3 , conf1 . NodeName )
163
289
164
290
members1 := agent1 .GetMemberList ()
165
291
members2 := agent2 .GetMemberList ()
@@ -177,13 +303,14 @@ func testCluster(t *testing.T, conf1 *config.Cluster, conf2 *config.Cluster, con
177
303
_ , newLeader3 := agent3 .raftPeer .GetLeader ()
178
304
179
305
// Check that either agent2 or agent3 becomes the new leader
180
- if newLeader2 == "node2" || newLeader2 == "node3" {
306
+ if newLeader2 == conf2 . NodeName || newLeader3 == conf3 . NodeName {
181
307
require .Equal (t , newLeader2 , newLeader3 , "Leaders should be the same for agent2 and agent3" )
182
308
} else {
183
309
require .Fail (t , "New leader should be either node2 or node3" )
184
310
}
185
311
186
312
// Restart agent1 and verify it is a follower
313
+ t .Log ("Restarting agent1" )
187
314
restartedAgent1 := NewAgent (conf1 )
188
315
err = restartedAgent1 .Start ()
189
316
require .NoError (t , err , "Agent restart failed for node: %s" , conf1 .NodeName )
@@ -198,7 +325,7 @@ func testCluster(t *testing.T, conf1 *config.Cluster, conf2 *config.Cluster, con
198
325
require .Equal (t , leaderAfterRestart2 , leaderAfterRestart1 )
199
326
require .Equal (t , leaderAfterRestart3 , leaderAfterRestart1 )
200
327
201
- require .NotEqual (t , leaderAfterRestart1 , "node1" , "After restart, node1 should not be the leader" )
328
+ require .NotEqual (t , leaderAfterRestart1 , conf1 . NodeName , "After restart, node1 should not be the leader" )
202
329
203
330
t .Log ("Test completed successfully" )
204
331
}
0 commit comments