diff --git a/patroni/ctl.py b/patroni/ctl.py index 18301618..22fad384 100644 --- a/patroni/ctl.py +++ b/patroni/ctl.py @@ -749,7 +749,7 @@ def touch_member(config, dcs): def is_paused(cluster): """Check if cluster management is paused""" - return 'pause' in cluster.config.data and cluster.config.data['pause'] + return cluster.config and 'pause' in cluster.config.data and cluster.config.data['pause'] def set_defaults(config, cluster_name): diff --git a/requirements.txt b/requirements.txt index 8b9b3c79..0a8be460 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,3 +10,4 @@ click>=4.1 prettytable>=0.7 tzlocal python-dateutil +coverage \ No newline at end of file diff --git a/tests/test_ctl.py b/tests/test_ctl.py index d4e6db66..81a2261e 100644 --- a/tests/test_ctl.py +++ b/tests/test_ctl.py @@ -393,3 +393,40 @@ class TestCtl(unittest.TestCase): with patch.object(requests, 'delete', return_value=MockResponse(404)): result = self.runner.invoke(ctl, ['flush', 'dummy', 'restart', '--force']) assert 'Failed: flush scheduled restart' in result.output + + @patch('patroni.ctl.get_dcs') + def test_disable_cluster(self, mock_get_dcs): + mock_get_dcs.return_value = self.e + mock_get_dcs.return_value.get_cluster = get_cluster_initialized_with_leader + + with patch('requests.patch', Mock(return_value=MockResponse(200))): + result = self.runner.invoke(ctl, ['disable', 'dummy']) + assert 'Success' in result.output + + with patch('requests.patch', Mock(return_value=MockResponse(500))): + result = self.runner.invoke(ctl, ['disable', 'dummy']) + assert 'Failed' in result.output + + with patch('requests.patch', Mock(return_value=MockResponse(200))),\ + patch('patroni.ctl.is_paused', Mock(return_value=True)): + result = self.runner.invoke(ctl, ['disable', 'dummy']) + assert 'Cluster is already paused' in result.output + + @patch('patroni.ctl.get_dcs') + def test_resume_cluster(self, mock_get_dcs): + mock_get_dcs.return_value = self.e + mock_get_dcs.return_value.get_cluster = get_cluster_initialized_with_leader + + with patch('patroni.ctl.is_paused', Mock(return_value=True)): + with patch('requests.patch', Mock(return_value=MockResponse(200))): + result = self.runner.invoke(ctl, ['resume', 'dummy']) + assert 'Success' in result.output + + with patch('requests.patch', Mock(return_value=MockResponse(500))): + result = self.runner.invoke(ctl, ['resume', 'dummy']) + assert 'Failed' in result.output + + with patch('requests.patch', Mock(return_value=MockResponse(200))),\ + patch('patroni.ctl.is_paused', Mock(return_value=False)): + result = self.runner.invoke(ctl, ['resume', 'dummy']) + assert 'Cluster is not paused' in result.output