diff --git a/patroni/validator.py b/patroni/validator.py index 44ec1f2a..7e777da0 100644 --- a/patroni/validator.py +++ b/patroni/validator.py @@ -110,8 +110,8 @@ def validate_data_dir(data_dir): bin_dir = schema.data.get("postgresql", {}).get("bin_dir", None) major_version = get_major_version(bin_dir) if pgversion != major_version: - raise ConfigParseError("data_dir directory postgresql version ({}) doesn't match" - "with 'postgres --version' output ({})".format(pgversion, major_version)) + raise ConfigParseError("data_dir directory postgresql version ({}) doesn't match with " + "'postgres --version' output ({})".format(pgversion, major_version)) return True diff --git a/tests/test_ctl.py b/tests/test_ctl.py index ca0a4f04..eb2d9793 100644 --- a/tests/test_ctl.py +++ b/tests/test_ctl.py @@ -7,7 +7,7 @@ from datetime import datetime, timedelta from mock import patch, Mock from patroni.ctl import ctl, store_config, load_config, output_members, get_dcs, parse_dcs, \ get_all_members, get_any_member, get_cursor, query_member, configure, PatroniCtlException, apply_config_changes, \ - format_config_for_editing, show_diff, invoke_editor, format_pg_version, find_executable + format_config_for_editing, show_diff, invoke_editor, format_pg_version, find_executable, CONFIG_FILE_PATH from patroni.dcs.etcd import Client, Failover from patroni.utils import tzutc from psycopg2 import OperationalError @@ -18,16 +18,18 @@ from .test_etcd import etcd_read, socket_getaddrinfo from .test_ha import get_cluster_initialized_without_leader, get_cluster_initialized_with_leader, \ get_cluster_initialized_with_only_leader, get_cluster_not_initialized_without_leader, get_cluster, Member -CONFIG_FILE_PATH = './test-ctl.yaml' def test_rw_config(): + global CONFIG_FILE_PATH runner = CliRunner() with runner.isolated_filesystem(): - store_config({'etcd': {'host': 'localhost:2379'}}, CONFIG_FILE_PATH + '/dummy') - load_config(CONFIG_FILE_PATH + '/dummy', '0.0.0.0') - os.remove(CONFIG_FILE_PATH + '/dummy') - os.rmdir(CONFIG_FILE_PATH) + load_config(CONFIG_FILE_PATH, None) + CONFIG_PATH = './test-ctl.yaml' + store_config({'etcd': {'host': 'localhost:2379'}}, CONFIG_PATH + '/dummy') + load_config(CONFIG_PATH + '/dummy', '0.0.0.0') + os.remove(CONFIG_PATH + '/dummy') + os.rmdir(CONFIG_PATH) @patch('patroni.ctl.load_config', @@ -42,11 +44,11 @@ class TestCtl(unittest.TestCase): self.runner = CliRunner() self.e = get_dcs({'etcd': {'ttl': 30, 'host': 'ok:2379', 'retry_timeout': 10}}, 'foo') - def test_abort_on_missing_or_unaccessible_config(self): + def test_load_config(self): runner = CliRunner() with runner.isolated_filesystem(): - with self.assertRaises(PatroniCtlException): - load_config('./non-existing-config-file', None) + self.assertRaises(PatroniCtlException, load_config, './non-existing-config-file', None) + self.assertRaises(PatroniCtlException, load_config, './non-existing-config-file', None) @patch('psycopg2.connect', psycopg2_connect) def test_get_cursor(self): diff --git a/tests/test_kubernetes.py b/tests/test_kubernetes.py index c853fc4a..ed9b2141 100644 --- a/tests/test_kubernetes.py +++ b/tests/test_kubernetes.py @@ -33,13 +33,18 @@ def mock_config_map(*args, **kwargs): mock.metadata.resource_version = '2' return mock - +@patch('socket.TCP_KEEPIDLE', 4, create=True) +@patch('socket.TCP_KEEPINTVL', 5, create=True) +@patch('socket.TCP_KEEPCNT', 6, create=True) @patch.object(k8s_client.CoreV1Api, 'patch_namespaced_config_map', mock_config_map) @patch.object(k8s_client.CoreV1Api, 'create_namespaced_config_map', mock_config_map) @patch('kubernetes.client.api_client.ThreadPool', Mock(), create=True) @patch.object(Thread, 'start', Mock()) class TestKubernetes(unittest.TestCase): + @patch('socket.TCP_KEEPIDLE', 4, create=True) + @patch('socket.TCP_KEEPINTVL', 5, create=True) + @patch('socket.TCP_KEEPCNT', 6, create=True) @patch('kubernetes.config.load_kube_config', Mock()) @patch.object(k8s_client.CoreV1Api, 'list_namespaced_config_map', mock_list_namespaced_config_map) @patch.object(k8s_client.CoreV1Api, 'list_namespaced_pod', mock_list_namespaced_pod) @@ -149,6 +154,9 @@ class TestKubernetes(unittest.TestCase): class TestCacheBuilder(unittest.TestCase): + @patch('socket.TCP_KEEPIDLE', 4, create=True) + @patch('socket.TCP_KEEPINTVL', 5, create=True) + @patch('socket.TCP_KEEPCNT', 6, create=True) @patch('kubernetes.config.load_kube_config', Mock()) @patch('kubernetes.client.api_client.ThreadPool', Mock(), create=True) @patch.object(Thread, 'start', Mock()) diff --git a/tests/test_patroni.py b/tests/test_patroni.py index 0b395d59..42370253 100644 --- a/tests/test_patroni.py +++ b/tests/test_patroni.py @@ -44,7 +44,11 @@ class TestPatroni(unittest.TestCase): def test_no_config(self): self.assertRaises(SystemExit, patroni_main) - @patch('pkgutil.get_importer', Mock(return_value=MockFrozenImporter())) + @patch('sys.argv', ['patroni.py', '--validate-config', 'postgres0.yml']) + def test_validate_config(self): + self.assertRaises(SystemExit, patroni_main) + + @patch('pkgutil.iter_importers', Mock(return_value=[MockFrozenImporter()])) @patch('sys.frozen', Mock(return_value=True), create=True) @patch.object(BaseHTTPServer.HTTPServer, '__init__', Mock()) @patch.object(etcd.Client, 'read', etcd_read) diff --git a/tests/test_validator.py b/tests/test_validator.py index b562464e..df225857 100644 --- a/tests/test_validator.py +++ b/tests/test_validator.py @@ -1,6 +1,7 @@ import copy import os import socket +import tempfile import unittest from mock import Mock, patch, mock_open @@ -57,8 +58,8 @@ config = { "superuser": {"username": "user"}, "rewind": {"username": "user"}, }, - "data_dir": "/tmp/data_dir", - "bin_dir": "/tmp/bin_dir", + "data_dir": os.path.join(tempfile.gettempdir(), "data_dir"), + "bin_dir": os.path.join(tempfile.gettempdir(), "bin_dir"), "parameters": { "unix_socket_directories": "." }, @@ -84,6 +85,8 @@ files = [] def isfile_side_effect(arg): + if arg.endswith('.exe'): + arg = arg[:-4] return arg in files