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)
Exemplo n.º 2
0
    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)
Exemplo n.º 3
0
    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
Exemplo n.º 4
0
    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'
Exemplo n.º 5
0
    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')
Exemplo n.º 6
0
    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'))
Exemplo n.º 8
0
    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
Exemplo n.º 9
0
    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
Exemplo n.º 10
0
    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
Exemplo n.º 11
0
    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
Exemplo n.º 12
0
    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')
Exemplo n.º 14
0
    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"
Exemplo n.º 15
0
    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
Exemplo n.º 16
0
    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