def test_get_all_members(self): self.assertEquals(list(get_all_members(get_cluster_initialized_without_leader(), role='master')), []) r = list(get_all_members(get_cluster_initialized_with_leader(), role='master')) self.assertEquals(len(r), 1) self.assertEquals(r[0].name, 'leader') r = list(get_all_members(get_cluster_initialized_with_leader(), role='replica')) self.assertEquals(len(r), 1) self.assertEquals(r[0].name, 'other') self.assertEquals(len(list(get_all_members(get_cluster_initialized_without_leader(), role='replica'))), 2)
def test_get_all_members(self): self.assertEqual(list(get_all_members(get_cluster_initialized_without_leader(), role='master')), []) r = list(get_all_members(get_cluster_initialized_with_leader(), role='master')) self.assertEqual(len(r), 1) self.assertEqual(r[0].name, 'leader') r = list(get_all_members(get_cluster_initialized_with_leader(), role='replica')) self.assertEqual(len(r), 1) self.assertEqual(r[0].name, 'other') self.assertEqual(len(list(get_all_members(get_cluster_initialized_without_leader(), role='replica'))), 2)
def test_get_all_members(self): r = list(get_all_members(get_cluster_initialized_without_leader(), role="master")) assert len(r) == 0 r = list(get_all_members(get_cluster_initialized_with_leader(), role="master")) assert len(r) == 1 assert r[0].name == "leader" r = list(get_all_members(get_cluster_initialized_with_leader(), role="replica")) assert len(r) == 1 assert r[0].name == "other" r = list(get_all_members(get_cluster_initialized_without_leader(), role="replica")) assert len(r) == 2
def test_get_any_member(self): m = get_any_member(get_cluster_initialized_without_leader(), role='master') assert m is None m = get_any_member(get_cluster_initialized_with_leader(), role='master') assert m.name == 'leader'
def test_get_any_member(self): self.assertIsNone( get_any_member(get_cluster_initialized_without_leader(), role='master')) m = get_any_member(get_cluster_initialized_with_leader(), role='master') self.assertEquals(m.name, 'leader')
def test_get_cursor(self): self.assertIsNone(get_cursor(get_cluster_initialized_without_leader(), {}, role='master')) self.assertIsNotNone(get_cursor(get_cluster_initialized_with_leader(), {}, role='master')) # MockCursor returns pg_is_in_recovery as false self.assertIsNone(get_cursor(get_cluster_initialized_with_leader(), {}, role='replica')) self.assertIsNotNone(get_cursor(get_cluster_initialized_with_leader(), {'database': 'foo'}, role='any'))
def test_get_cursor(self): self.assertIsNone(get_cursor(get_cluster_initialized_without_leader(), role='master')) self.assertIsNotNone(get_cursor(get_cluster_initialized_with_leader(), role='master')) # MockCursor returns pg_is_in_recovery as false self.assertIsNone(get_cursor(get_cluster_initialized_with_leader(), role='replica')) self.assertIsNotNone(get_cursor(get_cluster_initialized_with_leader(), role='any'))
def test_get_cursor(self): c = get_cursor(get_cluster_initialized_without_leader(), role='master') assert c is None c = get_cursor(get_cluster_initialized_with_leader(), role='master') assert c is not None c = get_cursor(get_cluster_initialized_with_leader(), role='replica') # # MockCursor returns pg_is_in_recovery as false assert c is None c = get_cursor(get_cluster_initialized_with_leader(), role='any') assert c is not None
def test_get_all_members(self): r = list( get_all_members(get_cluster_initialized_without_leader(), role='master')) assert len(r) == 0 r = list( get_all_members(get_cluster_initialized_with_leader(), role='master')) assert len(r) == 1 assert r[0].name == 'leader' r = list( get_all_members(get_cluster_initialized_with_leader(), role='replica')) assert len(r) == 1 assert r[0].name == 'other' r = list( get_all_members(get_cluster_initialized_without_leader(), role='replica')) assert len(r) == 2
def test_get_cursor(self): c = get_cursor(get_cluster_initialized_without_leader(), role="master") assert c is None c = get_cursor(get_cluster_initialized_with_leader(), role="master") assert c is not None c = get_cursor(get_cluster_initialized_with_leader(), role="replica") # # MockCursor returns pg_is_in_recovery as false assert c is None c = get_cursor(get_cluster_initialized_with_leader(), role="any") assert c is not None
def test_failover(self): runner = CliRunner() with patch('patroni.etcd.Etcd.get_cluster', Mock(return_value=get_cluster_initialized_with_leader())): result = runner.invoke(ctl, ['failover', 'dummy', '--dcs', '8.8.8.8'], input='''leader other y''') assert 'Failing over to new leader' in result.output result = runner.invoke(ctl, ['failover', 'dummy', '--dcs', '8.8.8.8'], input='''leader other N''') assert 'Aborting failover' in str(result.exception) result = runner.invoke(ctl, ['failover', 'dummy', '--dcs', '8.8.8.8'], input='''leader leader y''') assert 'target and source are the same' in str(result.exception) result = runner.invoke(ctl, ['failover', 'dummy', '--dcs', '8.8.8.8'], input='''leader Reality y''') assert 'Reality does not exist' in str(result.exception) result = runner.invoke(ctl, ['failover', 'dummy', '--force']) assert 'Failing over to new leader' in result.output result = runner.invoke(ctl, ['failover', 'dummy', '--dcs', '8.8.8.8'], input='dummy') assert 'is not the leader of cluster' in str(result.exception) with patch( 'patroni.etcd.Etcd.get_cluster', Mock(return_value=get_cluster_initialized_with_only_leader())): result = runner.invoke(ctl, ['failover', 'dummy', '--dcs', '8.8.8.8'], input='''leader other y''') assert 'No candidates found to failover to' in str( result.exception) with patch( 'patroni.etcd.Etcd.get_cluster', Mock(return_value=get_cluster_initialized_without_leader())): result = runner.invoke(ctl, ['failover', 'dummy', '--dcs', '8.8.8.8'], input='''leader other y''') assert 'This cluster has no master' in str(result.exception) with patch('patroni.ctl.post_patroni', Mock(side_effect=Exception())): result = runner.invoke(ctl, ['failover', 'dummy', '--dcs', '8.8.8.8'], input='''leader other y''') assert 'falling back to DCS' in result.output assert 'Failover failed' in result.output mocked = Mock() mocked.return_value.status_code = 500 with patch('patroni.ctl.post_patroni', Mock(return_value=mocked)): result = runner.invoke(ctl, ['failover', 'dummy', '--dcs', '8.8.8.8'], input='''leader other y''') assert 'Failover failed, details' in result.output
def test_failover(self): result = self.runner.invoke(ctl, ['failover', 'dummy'], input='''leader\nother\n\ny''') assert 'leader' in result.output result = self.runner.invoke( ctl, ['failover', 'dummy'], input='''leader\nother\n2100-01-01T12:23:00\ny''') assert result.exit_code == 0 result = self.runner.invoke( ctl, ['failover', 'dummy'], input='''leader\nother\n2030-01-01T12:23:00\ny''') assert result.exit_code == 0 # Aborting failover,as we anser NO to the confirmation result = self.runner.invoke(ctl, ['failover', 'dummy'], input='''leader\nother\n\nN''') assert result.exit_code == 1 # Target and source are equal result = self.runner.invoke(ctl, ['failover', 'dummy'], input='''leader\nleader\n\ny''') assert result.exit_code == 1 # Reality is not part of this cluster result = self.runner.invoke(ctl, ['failover', 'dummy'], input='''leader\nReality\n\ny''') assert result.exit_code == 1 result = self.runner.invoke(ctl, ['failover', 'dummy', '--force']) assert 'Member' in result.output result = self.runner.invoke(ctl, [ 'failover', 'dummy', '--force', '--scheduled', '2015-01-01T12:00:00+01:00' ]) assert result.exit_code == 0 # Invalid timestamp result = self.runner.invoke( ctl, ['failover', 'dummy', '--force', '--scheduled', 'invalid']) assert result.exit_code != 0 # Invalid timestamp result = self.runner.invoke(ctl, [ 'failover', 'dummy', '--force', '--scheduled', '2115-02-30T12:00:00+01:00' ]) assert result.exit_code != 0 # Specifying wrong leader result = self.runner.invoke(ctl, ['failover', 'dummy'], input='dummy') assert result.exit_code == 1 with patch( 'patroni.etcd.Etcd.get_cluster', Mock(return_value=get_cluster_initialized_with_only_leader())): # No members available result = self.runner.invoke(ctl, ['failover', 'dummy'], input='''leader\nother\n\ny''') assert result.exit_code == 1 with patch( 'patroni.etcd.Etcd.get_cluster', Mock(return_value=get_cluster_initialized_without_leader())): # No master available result = self.runner.invoke(ctl, ['failover', 'dummy'], input='''leader\nother\n\ny''') assert result.exit_code == 1 with patch('patroni.ctl.post_patroni', Mock(side_effect=Exception)): # Non-responding patroni result = self.runner.invoke(ctl, ['failover', 'dummy'], input='''leader\nother\n\ny''') assert 'falling back to DCS' in result.output with patch('patroni.ctl.post_patroni') as mocked: mocked.return_value.status_code = 500 result = self.runner.invoke(ctl, ['failover', 'dummy'], input='''leader\nother\n\ny''') assert 'Failover failed' in result.output
def test_get_any_member(self): self.assertIsNone(get_any_member(get_cluster_initialized_without_leader(), role='master')) m = get_any_member(get_cluster_initialized_with_leader(), role='master') self.assertEquals(m.name, 'leader')
def test_get_any_member(self): m = get_any_member(get_cluster_initialized_without_leader(), role="master") assert m is None m = get_any_member(get_cluster_initialized_with_leader(), role="master") assert m.name == "leader"
def test_failover(self): runner = CliRunner() with patch("patroni.etcd.Etcd.get_cluster", Mock(return_value=get_cluster_initialized_with_leader())): result = runner.invoke( ctl, ["failover", "dummy", "--dcs", "8.8.8.8"], input="""leader other y""", ) assert "Failing over to new leader" in result.output result = runner.invoke( ctl, ["failover", "dummy", "--dcs", "8.8.8.8"], input="""leader other N""", ) assert "Aborting failover" in str(result.exception) result = runner.invoke( ctl, ["failover", "dummy", "--dcs", "8.8.8.8"], input="""leader leader y""", ) assert "target and source are the same" in str(result.exception) result = runner.invoke( ctl, ["failover", "dummy", "--dcs", "8.8.8.8"], input="""leader Reality y""", ) assert "Reality does not exist" in str(result.exception) result = runner.invoke(ctl, ["failover", "dummy", "--force"]) assert "Failing over to new leader" in result.output result = runner.invoke(ctl, ["failover", "dummy", "--dcs", "8.8.8.8"], input="dummy") assert "is not the leader of cluster" in str(result.exception) with patch("patroni.etcd.Etcd.get_cluster", Mock(return_value=get_cluster_initialized_with_only_leader())): result = runner.invoke( ctl, ["failover", "dummy", "--dcs", "8.8.8.8"], input="""leader other y""", ) assert "No candidates found to failover to" in str(result.exception) with patch("patroni.etcd.Etcd.get_cluster", Mock(return_value=get_cluster_initialized_without_leader())): result = runner.invoke( ctl, ["failover", "dummy", "--dcs", "8.8.8.8"], input="""leader other y""", ) assert "This cluster has no master" in str(result.exception) with patch("patroni.ctl.post_patroni", Mock(side_effect=Exception())): result = runner.invoke( ctl, ["failover", "dummy", "--dcs", "8.8.8.8"], input="""leader other y""", ) assert "falling back to DCS" in result.output assert "Failover failed" in result.output mocked = Mock() mocked.return_value.status_code = 500 with patch("patroni.ctl.post_patroni", Mock(return_value=mocked)): result = runner.invoke( ctl, ["failover", "dummy", "--dcs", "8.8.8.8"], input="""leader other y""", ) assert "Failover failed, details" in result.output
def test_failover(self): result = self.runner.invoke(ctl, ['failover', 'dummy', '--dcs', '8.8.8.8'], input='''leader other y''') assert 'leader' in result.output result = self.runner.invoke(ctl, ['failover', 'dummy', '--dcs', '8.8.8.8'], input='''leader other 2100-01-01T12:23:00 y''') assert result.exit_code == 0 result = self.runner.invoke(ctl, ['failover', 'dummy', '--dcs', '8.8.8.8'], input='''leader other 2030-01-01T12:23:00 y''') assert result.exit_code == 0 # Aborting failover,as we anser NO to the confirmation result = self.runner.invoke(ctl, ['failover', 'dummy', '--dcs', '8.8.8.8'], input='''leader other N''') assert result.exit_code == 1 # Target and source are equal result = self.runner.invoke(ctl, ['failover', 'dummy', '--dcs', '8.8.8.8'], input='''leader leader y''') assert result.exit_code == 1 # Reality is not part of this cluster result = self.runner.invoke(ctl, ['failover', 'dummy', '--dcs', '8.8.8.8'], input='''leader Reality y''') assert result.exit_code == 1 result = self.runner.invoke(ctl, ['failover', 'dummy', '--force']) assert 'Member' in result.output result = self.runner.invoke(ctl, ['failover', 'dummy', '--force', '--scheduled', '2015-01-01T12:00:00+01:00']) assert result.exit_code == 0 # Invalid timestamp result = self.runner.invoke(ctl, ['failover', 'dummy', '--force', '--scheduled', 'invalid']) assert result.exit_code != 0 # Invalid timestamp result = self.runner.invoke(ctl, ['failover', 'dummy', '--force', '--scheduled', '2115-02-30T12:00:00+01:00']) assert result.exit_code != 0 # Specifying wrong leader result = self.runner.invoke(ctl, ['failover', 'dummy', '--dcs', '8.8.8.8'], input='dummy') assert result.exit_code == 1 with patch('patroni.etcd.Etcd.get_cluster', Mock(return_value=get_cluster_initialized_with_only_leader())): # No members available result = self.runner.invoke(ctl, ['failover', 'dummy', '--dcs', '8.8.8.8'], input='''leader other y''') assert result.exit_code == 1 with patch('patroni.etcd.Etcd.get_cluster', Mock(return_value=get_cluster_initialized_without_leader())): # No master available result = self.runner.invoke(ctl, ['failover', 'dummy', '--dcs', '8.8.8.8'], input='''leader other y''') assert result.exit_code == 1 with patch('patroni.ctl.post_patroni', Mock(side_effect=Exception)): # Non-responding patroni result = self.runner.invoke(ctl, ['failover', 'dummy', '--dcs', '8.8.8.8'], input='''leader other y''') assert 'falling back to DCS' in result.output with patch('patroni.ctl.post_patroni') as mocked: mocked.return_value.status_code = 500 result = self.runner.invoke(ctl, ['failover', 'dummy', '--dcs', '8.8.8.8'], input='''leader other y''') assert 'Failover failed' in result.output