def test_instance_from_replicaset(self): add_replicaset( self.instance, alias='r1', roles=['role-1'], servers=['r1-master', 'r1-replica'], ) self.instance.clear_calls('edit_topology') res = call_expel_intstance(self.console_sock, 'r1-master') self.assertTrue(res.success, msg=res.msg) self.assertTrue(res.changed) # check `edit_topology` call calls = self.instance.get_calls('edit_topology') self.assertEqual(len(calls), 1) self.assertIn('servers', calls[0]) self.assertEqual(len(calls[0]['servers']), 1) s_params = calls[0]['servers'][0] self.assertEqual(s_params, { 'uuid': 'r1-master-uuid', 'expelled': True, }) # call again (res.changed should be false) # in fact, bacause server is expelled from topology self.instance.clear_calls('edit_topology') res = call_expel_intstance(self.console_sock, 'r1-master') self.assertTrue(res.success, msg=res.msg) self.assertFalse(res.changed) calls = self.instance.get_calls('edit_topology') self.assertEqual(len(calls), 0)
def test_replicaset_in_unhealthy(self): # try to edit unhealthy replicaset add_replicaset( self.instance, alias='r1', roles=['role-1'], servers=['r1-master'], status='unhealthy', ) res = call_manage_replicaset( self.console_sock, alias='r1', roles=['role-2'], failover_priority=['r1-master'], instances=['r1-master'], ) self.assertFalse(res.success) self.assertIn('Replicaset "r1" is not healthy', res.msg) # replicaset becomes unhealthy after creation self.instance.set_variable('become_unhealthy_after_edit', True) self.instance.add_unjoined_server(alias='r2-master', uri='r2-master-uri') res = call_manage_replicaset( self.console_sock, alias='r2', roles=['role-2'], failover_priority=['r2-master'], instances=['r2-master'], ) self.assertFalse(res.success) self.assertIn('Replicaset "r2" is not healthy', res.msg) # replicaset becomes unhealthy after edit self.instance.set_variable('become_unhealthy_after_edit', True) add_replicaset( self.instance, alias='r3', roles=['role-1'], servers=['r3-master'], status='unhealthy', ) res = call_manage_replicaset( self.console_sock, alias='r3', roles=['role-2'], failover_priority=['r3-master'], instances=['r3-master'], ) self.assertFalse(res.success) self.assertIn('Replicaset "r3" is not healthy', res.msg)
def test_joining_new_servers(self): add_replicaset( self.instance, alias='r1', roles=['role-1'], servers=['r1-master', 'r1-replica'], ) # add unjoined self.instance.add_unjoined_server(alias='r1-new-master', uri='r1-new-master-uri') # join new server and set it to be a new master self.instance.clear_calls('edit_topology') res = call_manage_replicaset( self.console_sock, alias='r1', failover_priority=['r1-new-master', 'r1-master'], instances=['r1-master', 'r1-replica', 'r1-new-master'], ) self.assertTrue(res.success, msg=res.msg) self.assertTrue(res.changed) # check performed `edit_topology` calls calls = self.instance.get_calls('edit_topology') self.assertEqual(len(calls), 2) join_call = calls[0] edit_priority_call = calls[1] self.assertIn('replicasets', join_call) r_params = join_call['replicasets'][0] self.assertEqual(r_params, { 'uuid': 'r1-uuid', 'join_servers': [{ 'uri': 'r1-new-master-uri' }], }) self.assertIn('replicasets', edit_priority_call) r_params = edit_priority_call['replicasets'][0] self.assertEqual( r_params, { 'uuid': 'r1-uuid', 'failover_priority': ['r1-new-master-uuid', 'r1-master-uuid'], }) # call again (res.changed should be false) res = call_manage_replicaset( self.console_sock, alias='r1', failover_priority=['r1-new-master', 'r1-master'], instances=['r1-master', 'r1-replica', 'r1-new-master'], ) self.assertTrue(res.success, msg=res.msg) self.assertFalse(res.changed)
def test_fail_on_edit_topology(self): add_replicaset( self.instance, alias='r1', roles=['role-1'], servers=['r1-master', 'r1-replica'], ) self.instance.clear_calls('edit_topology') self.instance.set_fail_on('edit_topology') res = call_expel_intstance(self.console_sock, 'r1-master') self.assertFalse(res.success) self.assertIn('Failed to expel instance', res.msg)
def test_fail_on_edit_topology(self): # fail on create self.instance.add_unjoined_server(alias='r1-master', uri='r1-master-uri') self.instance.clear_calls('edit_topology') self.instance.set_fail_on('edit_topology') # create replicaset with instances known by cluster self.instance.clear_calls('edit_topology') res = call_manage_replicaset( self.console_sock, alias='r1', failover_priority=['r1-master'], instances=['r1-master'], roles=['role-1'] ) self.assertFalse(res.success) self.assertIn('Failed to create', res.msg) self.assertIn('cartridge err', res.msg) # fail on edit add_replicaset( self.instance, alias='r1', roles=['role-1'], servers=['r1-master', 'r1-replica'], ) self.instance.clear_calls('edit_topology') self.instance.set_fail_on('edit_topology') res = call_manage_replicaset( self.console_sock, alias='r1', failover_priority=['r1-master'], instances=['r1-master'], roles=['role-1', 'role-2'], ) self.assertFalse(res.success) self.assertIn('Failed to edit replicaset', res.msg) self.assertIn('cartridge err', res.msg) self.instance.set_fail_on('edit_topology', False)
def test_edit_replicaset_parameters(self): add_replicaset( self.instance, alias='r1', roles=['role-1'], servers=['r1-master'], ) params = { 'all_rw': True, 'weight': 1, 'vshard_group': 'hot', 'roles': ['role-2'], } for param, value in params.items(): self.instance.clear_calls('edit_topology') res = call_manage_replicaset( self.console_sock, alias='r1', failover_priority=['r1-master'], instances=['r1-master'], **{param: value}, ) self.assertTrue(res.success, msg=res.msg) self.assertTrue(res.changed) # check performed `edit_topology` calls calls = self.instance.get_calls('edit_topology') self.assertEqual(len(calls), 1) self.assertIn('replicasets', calls[0]) r_params = calls[0]['replicasets'][0] self.assertEqual( r_params, { 'uuid': 'r1-uuid', 'failover_priority': ['r1-master-uuid'], **{ param: value }, }) # set the same parameter again (res.changed should be false) self.instance.clear_calls('edit_topology') res = call_manage_replicaset( self.console_sock, alias='r1', failover_priority=['r1-master'], instances=['r1-master'], **{param: value}, ) self.assertTrue(res.success, msg=res.msg) self.assertFalse(res.changed) # check performed `edit_topology` calls calls = self.instance.get_calls('edit_topology') self.assertEqual(len(calls), 1) self.assertIn('replicasets', calls[0]) r_params = calls[0]['replicasets'][0] self.assertEqual( r_params, { 'uuid': 'r1-uuid', 'failover_priority': ['r1-master-uuid'], **{ param: value }, })