1313
1414
1515def call_manage_failover (control_sock , mode ,
16- state_provider = None , stateboard_params = None ):
16+ state_provider = None , stateboard_params = None , etcd2_params = None ):
1717 return manage_failover ({
1818 'control_sock' : control_sock ,
1919 'failover_params' : {
2020 'mode' : mode ,
2121 'state_provider' : state_provider ,
2222 'stateboard_params' : stateboard_params ,
23+ 'etcd2_params' : etcd2_params ,
2324 },
2425 })
2526
@@ -230,7 +231,7 @@ def test_stateful_failover_with_stateboard(self):
230231 self .instance .clear_calls ('failover_set_params' )
231232
232233 new_params = STATEBOARD_PARAMS .copy ()
233- new_params ['uri' ] = 'other value'
234+ new_params [p ] = 'other-string- value'
234235
235236 res = call_manage_failover (self .console_sock , mode = 'stateful' ,
236237 state_provider = 'stateboard' ,
@@ -246,5 +247,182 @@ def test_stateful_failover_with_stateboard(self):
246247 'tarantool_params' : new_params ,
247248 })
248249
250+ def test_stateful_failover_with_etcd2 (self ):
251+ self .instance .set_cartridge_version ('2.1.0' )
252+
253+ ETCD2_PARAMS = {
254+ 'prefix' : '/' ,
255+ 'lock_delay' : 30 ,
256+ 'username' : 'dokshina' ,
257+ 'password' : 'secret' ,
258+ 'endpoints' : ['localhost:2379' , 'localhost:2380' ]
259+ }
260+
261+ # failover disabled
262+ self .instance .set_variable ('failover_params' , {'mode' : 'disabled' })
263+ self .instance .clear_calls ('failover_set_params' )
264+
265+ res = call_manage_failover (self .console_sock , mode = 'stateful' ,
266+ state_provider = 'etcd2' ,
267+ etcd2_params = ETCD2_PARAMS )
268+ self .assertTrue (res .success , msg = res .msg )
269+ self .assertTrue (res .changed )
270+
271+ calls = self .instance .get_calls ('failover_set_params' )
272+ self .assertEqual (len (calls ), 1 )
273+ self .assertEqual (calls [0 ], {
274+ 'mode' : 'stateful' ,
275+ 'state_provider' : 'etcd2' ,
276+ 'etcd2_params' : ETCD2_PARAMS ,
277+ })
278+
279+ # failover disabled
280+ self .instance .set_variable ('failover_params' , {'mode' : 'disabled' })
281+ self .instance .clear_calls ('failover_set_params' )
282+
283+ res = call_manage_failover (self .console_sock , mode = 'stateful' ,
284+ state_provider = 'etcd2' ,
285+ etcd2_params = None )
286+ self .assertTrue (res .success , msg = res .msg )
287+ self .assertTrue (res .changed )
288+
289+ calls = self .instance .get_calls ('failover_set_params' )
290+ self .assertEqual (len (calls ), 1 )
291+ self .assertEqual (calls [0 ], {
292+ 'mode' : 'stateful' ,
293+ 'state_provider' : 'etcd2' ,
294+ 'etcd2_params' : [],
295+ })
296+
297+ # stateful failover enabled - params aren't changed
298+ self .instance .set_variable ('failover_params' , {
299+ 'mode' : 'stateful' ,
300+ 'state_provider' : 'etcd2' ,
301+ 'etcd2_params' : ETCD2_PARAMS ,
302+ })
303+ self .instance .clear_calls ('failover_set_params' )
304+
305+ res = call_manage_failover (self .console_sock , mode = 'stateful' ,
306+ state_provider = 'etcd2' ,
307+ etcd2_params = ETCD2_PARAMS )
308+ self .assertTrue (res .success , msg = res .msg )
309+ self .assertFalse (res .changed )
310+
311+ calls = self .instance .get_calls ('failover_set_params' )
312+ self .assertEqual (len (calls ), 1 )
313+ self .assertEqual (calls [0 ], {
314+ 'mode' : 'stateful' ,
315+ 'state_provider' : 'etcd2' ,
316+ 'etcd2_params' : ETCD2_PARAMS ,
317+ })
318+
319+ for p in ['prefix' , 'lock_delay' , 'username' , 'password' , 'endpoints' ]:
320+ # stateful failover enabled - one param is changed
321+ self .instance .set_variable ('failover_params' , {
322+ 'mode' : 'stateful' ,
323+ 'state_provider' : 'etcd2' ,
324+ 'etcd2_params' : ETCD2_PARAMS ,
325+ })
326+ self .instance .clear_calls ('failover_set_params' )
327+
328+ new_params = ETCD2_PARAMS .copy ()
329+ if p in ['prefix' , 'username' , 'password' ]:
330+ new_params [p ] = 'other-string-value'
331+ elif p in ['lock_delay' ]:
332+ new_params [p ] = new_params [p ] + 15
333+ elif p in ['endpoints' ]:
334+ new_params [p ].append ('localhost:2381' )
335+
336+ res = call_manage_failover (self .console_sock , mode = 'stateful' ,
337+ state_provider = 'etcd2' ,
338+ etcd2_params = new_params )
339+ self .assertTrue (res .success , msg = res .msg )
340+ self .assertTrue (res .changed )
341+
342+ calls = self .instance .get_calls ('failover_set_params' )
343+ self .assertEqual (len (calls ), 1 )
344+ self .assertEqual (calls [0 ], {
345+ 'mode' : 'stateful' ,
346+ 'state_provider' : 'etcd2' ,
347+ 'etcd2_params' : new_params ,
348+ })
349+
350+ def test_stateful_failover_mixed (self ):
351+ self .instance .set_cartridge_version ('2.1.0' )
352+
353+ STATEBOARD_PARAMS = {
354+ 'uri' : 'localhost:3310' ,
355+ 'password' : 'passwd' ,
356+ }
357+
358+ ETCD2_PARAMS = {
359+ 'prefix' : '/' ,
360+ 'lock_delay' : 30 ,
361+ 'username' : 'dokshina' ,
362+ 'password' : 'secret' ,
363+ 'endpoints' : ['localhost:2379' , 'localhost:2380' ]
364+ }
365+
366+ # failover disabled -> enable stateboard
367+ self .instance .set_variable ('failover_params' , {'mode' : 'disabled' })
368+ self .instance .clear_calls ('failover_set_params' )
369+
370+ res = call_manage_failover (self .console_sock , mode = 'stateful' ,
371+ state_provider = 'stateboard' ,
372+ etcd2_params = ETCD2_PARAMS ,
373+ stateboard_params = STATEBOARD_PARAMS )
374+ self .assertTrue (res .success , msg = res .msg )
375+ self .assertTrue (res .changed )
376+
377+ calls = self .instance .get_calls ('failover_set_params' )
378+ self .assertEqual (len (calls ), 1 )
379+ self .assertEqual (calls [0 ], {
380+ 'mode' : 'stateful' ,
381+ 'state_provider' : 'tarantool' ,
382+ 'tarantool_params' : STATEBOARD_PARAMS ,
383+ })
384+
385+ # failover disabled -> enable etcd2
386+ self .instance .set_variable ('failover_params' , {'mode' : 'disabled' })
387+ self .instance .clear_calls ('failover_set_params' )
388+
389+ res = call_manage_failover (self .console_sock , mode = 'stateful' ,
390+ state_provider = 'etcd2' ,
391+ etcd2_params = ETCD2_PARAMS ,
392+ stateboard_params = STATEBOARD_PARAMS )
393+ self .assertTrue (res .success , msg = res .msg )
394+ self .assertTrue (res .changed )
395+
396+ calls = self .instance .get_calls ('failover_set_params' )
397+ self .assertEqual (len (calls ), 1 )
398+ self .assertEqual (calls [0 ], {
399+ 'mode' : 'stateful' ,
400+ 'state_provider' : 'etcd2' ,
401+ 'etcd2_params' : ETCD2_PARAMS ,
402+ })
403+
404+ # stateboard state provider enabled -> switch to etcd2
405+ self .instance .set_variable ('failover_params' , {
406+ 'mode' : 'stateful' ,
407+ 'state_provider' : 'tarantool' ,
408+ 'tarantool_params' : STATEBOARD_PARAMS ,
409+ })
410+ self .instance .clear_calls ('failover_set_params' )
411+
412+ res = call_manage_failover (self .console_sock , mode = 'stateful' ,
413+ state_provider = 'etcd2' ,
414+ etcd2_params = ETCD2_PARAMS ,
415+ stateboard_params = STATEBOARD_PARAMS )
416+ self .assertTrue (res .success , msg = res .msg )
417+ self .assertTrue (res .changed )
418+
419+ calls = self .instance .get_calls ('failover_set_params' )
420+ self .assertEqual (len (calls ), 1 )
421+ self .assertEqual (calls [0 ], {
422+ 'mode' : 'stateful' ,
423+ 'state_provider' : 'etcd2' ,
424+ 'etcd2_params' : ETCD2_PARAMS ,
425+ })
426+
249427 def tearDown (self ):
250428 self .instance .stop ()
0 commit comments