Reformat imports with isort (#3123)

Besides that:
1. Introduce `setup.py isort` for quick check
2. Introduce GH actions to check imports
This commit is contained in:
Alexander Kukushkin
2024-08-13 17:53:59 +02:00
committed by GitHub
parent c931da1eb3
commit 93eb4edbe6
88 changed files with 447 additions and 287 deletions
+17
View File
@@ -211,3 +211,20 @@ jobs:
- name: Generate documentation
run: tox -m docs
isort:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python 3.12
uses: actions/setup-python@v5
with:
python-version: 3.12
cache: pip
- name: isort
uses: isort/isort-action@master
with:
requirementsFiles: "requirements.txt requirements.dev.txt requirements.docs.txt"
sort-paths: "patroni tests features setup.py"
+1 -1
View File
@@ -1,6 +1,6 @@
#!/usr/bin/env python
import os
import argparse
import os
import shutil
if __name__ == "__main__":
+1
View File
@@ -1,5 +1,6 @@
#!/usr/bin/env python
import sys
with open("data/{0}/{0}_cb.log".format(sys.argv[1]), "a+") as log:
log.write(" ".join(sys.argv[-3:]) + "\n")
+6 -3
View File
@@ -1,9 +1,8 @@
import abc
import datetime
import glob
import os
import json
import psutil
import os
import re
import shutil
import signal
@@ -13,11 +12,14 @@ import sys
import tempfile
import threading
import time
from http.server import BaseHTTPRequestHandler, HTTPServer
import psutil
import yaml
import patroni.psycopg as psycopg
from http.server import BaseHTTPRequestHandler, HTTPServer
from patroni.request import PatroniRequest
@@ -498,6 +500,7 @@ class AbstractEtcdController(AbstractDcsController):
def _is_running(self):
from patroni.dcs.etcd import DnsCachingResolver
# if etcd is running, but we didn't start it
try:
self._client = self._client_cls({'host': 'localhost', 'port': 2379, 'retry_timeout': 30,
+4 -2
View File
@@ -1,8 +1,10 @@
import json
import patroni.psycopg as pg
from time import sleep, time
from behave import step, then
from time import sleep, time
import patroni.psycopg as pg
@step('I start {name:w}')
+4 -3
View File
@@ -1,11 +1,12 @@
import json
import time
from behave import step, then
from dateutil import tz
from datetime import datetime
from functools import partial
from threading import Thread, Event
from threading import Event, Thread
from behave import step, then
from dateutil import tz
tzutc = tz.tzutc()
+4 -2
View File
@@ -1,14 +1,16 @@
import json
import parse
import shlex
import subprocess
import sys
import time
from datetime import datetime, timedelta
import parse
import yaml
from behave import register_type, step, then
from dateutil import tz
from datetime import datetime, timedelta
tzutc = tz.tzutc()
+1
View File
@@ -2,6 +2,7 @@ import json
import time
from behave import step, then
import patroni.psycopg as pg
+2 -1
View File
@@ -1,6 +1,7 @@
from behave import step, then
import time
from behave import step, then
def polling_loop(timeout, interval=1):
"""Returns an iterator that returns values until timeout has passed. Timeout is measured from start of iteration."""
+2 -2
View File
@@ -13,7 +13,7 @@ from argparse import Namespace
from typing import Any, Dict, List, Optional, TYPE_CHECKING
from patroni import MIN_PSYCOPG2, MIN_PSYCOPG3, parse_version
from patroni.daemon import AbstractPatroniDaemon, abstract_main, get_base_arg_parser
from patroni.daemon import abstract_main, AbstractPatroniDaemon, get_base_arg_parser
from patroni.tags import Tags
if TYPE_CHECKING: # pragma: no cover
@@ -268,8 +268,8 @@ def process_arguments() -> Namespace:
generate_config(args.configfile, False, args.dsn)
sys.exit(0)
elif args.validate_config:
from patroni.validator import schema
from patroni.config import Config, ConfigParseError
from patroni.validator import schema
try:
Config(args.configfile, validator=schema)
+8 -8
View File
@@ -7,32 +7,32 @@ utilises the API to perform these functions.
"""
import base64
import datetime
import hmac
import json
import logging
import time
import traceback
import dateutil.parser
import datetime
import os
import socket
import sys
import time
import traceback
from http.server import BaseHTTPRequestHandler, HTTPServer
from ipaddress import ip_address, ip_network, IPv4Network, IPv6Network
from socketserver import ThreadingMixIn
from threading import Thread
from urllib.parse import urlparse, parse_qs
from typing import Any, Callable, Dict, Iterator, List, Optional, Tuple, TYPE_CHECKING, Union
from urllib.parse import parse_qs, urlparse
import dateutil.parser
from . import global_config, psycopg
from .__main__ import Patroni
from .dcs import Cluster
from .exceptions import PostgresConnectionException, PostgresException
from .postgresql.misc import postgres_version_to_int
from .utils import deep_compare, enable_keepalive, parse_bool, patch_config, Retry, \
RetryFailedError, parse_int, split_host_port, tzutc, uri, cluster_as_json
from .utils import cluster_as_json, deep_compare, enable_keepalive, parse_bool, \
parse_int, patch_config, Retry, RetryFailedError, split_host_port, tzutc, uri
logger = logging.getLogger(__name__)
+5 -4
View File
@@ -1,15 +1,16 @@
"""Facilities related to Patroni configuration."""
import re
import json
import logging
import os
import re
import shutil
import tempfile
import yaml
from collections import defaultdict
from copy import deepcopy
from typing import Any, Callable, Collection, Dict, List, Optional, Union, TYPE_CHECKING
from typing import Any, Callable, Collection, Dict, List, Optional, TYPE_CHECKING, Union
import yaml
from . import PATRONI_ENV_PREFIX
from .collections import CaseInsensitiveDict, EMPTY_DICT
@@ -17,8 +18,8 @@ from .dcs import ClusterConfig
from .exceptions import ConfigParseError
from .file_perm import pg_perm
from .postgresql.config import ConfigHandler
from .validator import IntValidator
from .utils import deep_compare, parse_bool, parse_int, patch_config
from .validator import IntValidator
logger = logging.getLogger(__name__)
+6 -5
View File
@@ -2,14 +2,16 @@
import abc
import logging
import os
import psutil
import socket
import sys
from contextlib import contextmanager
from getpass import getpass, getuser
from typing import Any, Dict, Iterator, List, Optional, TextIO, Tuple, TYPE_CHECKING, Union
import psutil
import yaml
from getpass import getuser, getpass
from contextlib import contextmanager
from typing import Any, Dict, Iterator, List, Optional, TextIO, Tuple, TYPE_CHECKING, Union
if TYPE_CHECKING: # pragma: no cover
from psycopg import Cursor
from psycopg2 import cursor
@@ -23,7 +25,6 @@ from .postgresql.config import ConfigHandler, parse_dsn
from .postgresql.misc import postgres_major_version_to_int
from .utils import get_major_version, parse_bool, patch_config, read_stripped
# Mapping between the libpq connection parameters and the environment variables.
# This dict should be kept in sync with `patroni.utils._AUTH_ALLOWED_PARAMETERS`
# (we use "username" in the Patroni config for some reason, other parameter names are the same).
+12 -9
View File
@@ -12,12 +12,9 @@
If it is also missing in the configuration file we assume that this is just a normal Patroni cluster (not Citus).
"""
import click
import codecs
import copy
import datetime
import dateutil.parser
import dateutil.tz
import difflib
import io
import json
@@ -28,15 +25,21 @@ import shutil
import subprocess
import sys
import tempfile
import urllib3
import time
import yaml
from collections import defaultdict
from contextlib import contextmanager
from prettytable import ALL, FRAME, PrettyTable
from typing import Any, Dict, Iterator, List, Optional, Tuple, TYPE_CHECKING, Union
from urllib.parse import urlparse
from typing import Any, Dict, Iterator, List, Optional, Union, Tuple, TYPE_CHECKING
import click
import dateutil.parser
import dateutil.tz
import urllib3
import yaml
from prettytable import ALL, FRAME, PrettyTable
if TYPE_CHECKING: # pragma: no cover
from psycopg import Cursor
from psycopg2 import cursor
@@ -52,12 +55,12 @@ except ImportError: # pragma: no cover
from . import global_config
from .config import Config
from .dcs import get_dcs as _get_dcs, AbstractDCS, Cluster, Member
from .dcs import AbstractDCS, Cluster, get_dcs as _get_dcs, Member
from .exceptions import PatroniException
from .postgresql.misc import postgres_version_to_int
from .postgresql.mpp import get_mpp
from .utils import cluster_as_json, patch_config, polling_loop
from .request import PatroniRequest
from .utils import cluster_as_json, patch_config, polling_loop
from .version import __version__
CONFIG_DIR_PATH = click.get_app_dir('patroni')
+3 -3
View File
@@ -5,22 +5,22 @@ import json
import logging
import re
import time
from collections import defaultdict
from copy import deepcopy
from random import randint
from threading import Event, Lock
from typing import Any, Callable, Collection, Dict, Iterator, List, \
NamedTuple, Optional, Set, Tuple, Type, TYPE_CHECKING, Union
from urllib.parse import urlparse, urlunparse, parse_qsl
from urllib.parse import parse_qsl, urlparse, urlunparse
import dateutil.parser
from .. import global_config
from ..dynamic_loader import iter_classes, iter_modules
from ..exceptions import PatroniFatalException
from ..utils import deep_compare, uri
from ..tags import Tags
from ..utils import parse_int
from ..utils import deep_compare, parse_int, uri
if TYPE_CHECKING: # pragma: no cover
from ..config import Config
+10 -6
View File
@@ -1,4 +1,5 @@
from __future__ import absolute_import
import json
import logging
import os
@@ -6,20 +7,23 @@ import re
import socket
import ssl
import time
import urllib3
from collections import defaultdict
from consul import ConsulException, NotFound, base
from http.client import HTTPException
from typing import Any, Callable, Dict, List, Mapping, NamedTuple, Optional, Tuple, TYPE_CHECKING, Union
from urllib.parse import quote, urlencode, urlparse
import urllib3
from consul import base, ConsulException, NotFound
from urllib3.exceptions import HTTPError
from urllib.parse import urlencode, urlparse, quote
from typing import Any, Callable, Dict, List, Mapping, NamedTuple, Optional, Union, Tuple, TYPE_CHECKING
from . import AbstractDCS, Cluster, ClusterConfig, Failover, Leader, Member, Status, SyncState, \
TimelineHistory, ReturnFalseException, catch_return_false_exception
from ..exceptions import DCSError
from ..postgresql.mpp import AbstractMPP
from ..utils import deep_compare, parse_bool, Retry, RetryFailedError, split_host_port, uri, USER_AGENT
from . import AbstractDCS, catch_return_false_exception, Cluster, ClusterConfig, \
Failover, Leader, Member, ReturnFalseException, Status, SyncState, TimelineHistory
if TYPE_CHECKING: # pragma: no cover
from ..config import Config
+13 -9
View File
@@ -1,32 +1,36 @@
from __future__ import absolute_import
import abc
import etcd
import json
import logging
import os
import urllib3.util.connection
import random
import socket
import time
from collections import defaultdict
from copy import deepcopy
from dns.exception import DNSException
from dns import resolver
from http.client import HTTPException
from queue import Queue
from threading import Thread
from typing import Any, Callable, Collection, Dict, List, Optional, Union, Tuple, Type, TYPE_CHECKING
from typing import Any, Callable, Collection, Dict, List, Optional, Tuple, Type, TYPE_CHECKING, Union
from urllib.parse import urlparse
from urllib3 import Timeout
from urllib3.exceptions import HTTPError, ReadTimeoutError, ProtocolError
from . import AbstractDCS, Cluster, ClusterConfig, Failover, Leader, Member, Status, SyncState, \
TimelineHistory, ReturnFalseException, catch_return_false_exception
import etcd
import urllib3.util.connection
from dns import resolver
from dns.exception import DNSException
from urllib3 import Timeout
from urllib3.exceptions import HTTPError, ProtocolError, ReadTimeoutError
from ..exceptions import DCSError
from ..postgresql.mpp import AbstractMPP
from ..request import get as requests_get
from ..utils import Retry, RetryFailedError, split_host_port, uri, USER_AGENT
from . import AbstractDCS, catch_return_false_exception, Cluster, ClusterConfig, \
Failover, Leader, Member, ReturnFalseException, Status, SyncState, TimelineHistory
if TYPE_CHECKING: # pragma: no cover
from ..config import Config
+9 -6
View File
@@ -1,26 +1,29 @@
from __future__ import absolute_import
import base64
import etcd
import json
import logging
import os
import socket
import sys
import time
import urllib3
from collections import defaultdict
from enum import IntEnum
from urllib3.exceptions import ReadTimeoutError, ProtocolError
from threading import Condition, Lock, Thread
from typing import Any, Callable, Collection, Dict, Iterator, List, Optional, Tuple, Type, TYPE_CHECKING, Union
from . import ClusterConfig, Cluster, Failover, Leader, Member, Status, SyncState, \
TimelineHistory, catch_return_false_exception
from .etcd import AbstractEtcdClientWithFailover, AbstractEtcd, catch_etcd_errors, DnsCachingResolver, Retry
import etcd
import urllib3
from urllib3.exceptions import ProtocolError, ReadTimeoutError
from ..exceptions import DCSError, PatroniException
from ..postgresql.mpp import AbstractMPP
from ..utils import deep_compare, enable_keepalive, iter_response_objects, RetryFailedError, USER_AGENT
from . import catch_return_false_exception, Cluster, ClusterConfig, \
Failover, Leader, Member, Status, SyncState, TimelineHistory
from .etcd import AbstractEtcd, AbstractEtcdClientWithFailover, catch_etcd_errors, DnsCachingResolver, Retry
logger = logging.getLogger(__name__)
+2 -2
View File
@@ -5,11 +5,11 @@ import time
from typing import Any, Callable, Dict, List, Union
from . import Cluster
from .zookeeper import ZooKeeper
from ..postgresql.mpp import AbstractMPP
from ..request import get as requests_get
from ..utils import uri
from . import Cluster
from .zookeeper import ZooKeeper
logger = logging.getLogger(__name__)
+10 -7
View File
@@ -9,22 +9,25 @@ import random
import socket
import tempfile
import time
import urllib3
import yaml
from collections import defaultdict
from copy import deepcopy
from http.client import HTTPException
from urllib3.exceptions import HTTPError
from threading import Condition, Lock, Thread
from typing import Any, Callable, Collection, Dict, List, Optional, Tuple, Type, Union, TYPE_CHECKING
from typing import Any, Callable, Collection, Dict, List, Optional, Tuple, Type, TYPE_CHECKING, Union
import urllib3
import yaml
from urllib3.exceptions import HTTPError
from . import AbstractDCS, Cluster, ClusterConfig, Failover, Leader, Member, Status, SyncState, TimelineHistory
from ..collections import EMPTY_DICT
from ..exceptions import DCSError
from ..postgresql.mpp import AbstractMPP
from ..utils import deep_compare, iter_response_objects, keepalive_socket_options, \
Retry, RetryFailedError, tzutc, uri, USER_AGENT
from ..utils import deep_compare, iter_response_objects, \
keepalive_socket_options, Retry, RetryFailedError, tzutc, uri, USER_AGENT
from . import AbstractDCS, Cluster, ClusterConfig, Failover, Leader, Member, Status, SyncState, TimelineHistory
if TYPE_CHECKING: # pragma: no cover
from ..config import Config
+6 -4
View File
@@ -5,17 +5,19 @@ import threading
import time
from collections import defaultdict
from pysyncobj import SyncObj, SyncObjConf, replicated, FAIL_REASON
from typing import Any, Callable, Collection, Dict, List, Optional, Set, TYPE_CHECKING, Union
from pysyncobj import FAIL_REASON, replicated, SyncObj, SyncObjConf
from pysyncobj.dns_resolver import globalDnsResolver
from pysyncobj.node import TCPNode
from pysyncobj.transport import TCPTransport, CONNECTION_STATE
from pysyncobj.transport import CONNECTION_STATE, TCPTransport
from pysyncobj.utility import TcpUtility
from typing import Any, Callable, Collection, Dict, List, Optional, Set, Union, TYPE_CHECKING
from . import AbstractDCS, ClusterConfig, Cluster, Failover, Leader, Member, Status, SyncState, TimelineHistory
from ..exceptions import DCSError
from ..postgresql.mpp import AbstractMPP
from ..utils import validate_directory
from . import AbstractDCS, Cluster, ClusterConfig, Failover, Leader, Member, Status, SyncState, TimelineHistory
if TYPE_CHECKING: # pragma: no cover
from ..config import Config
+6 -4
View File
@@ -4,18 +4,20 @@ import select
import socket
import time
from kazoo.client import KazooClient, KazooState, KazooRetry
from kazoo.exceptions import ConnectionClosedError, NoNodeError, NodeExistsError, SessionExpiredError
from typing import Any, Callable, Dict, List, Optional, Tuple, TYPE_CHECKING, Union
from kazoo.client import KazooClient, KazooRetry, KazooState
from kazoo.exceptions import ConnectionClosedError, NodeExistsError, NoNodeError, SessionExpiredError
from kazoo.handlers.threading import AsyncResult, SequentialThreadingHandler
from kazoo.protocol.states import KeeperState, WatchedEvent, ZnodeStat
from kazoo.retry import RetryFailedError
from kazoo.security import ACL, make_acl
from typing import Any, Callable, Dict, List, Optional, Union, Tuple, TYPE_CHECKING
from . import AbstractDCS, ClusterConfig, Cluster, Failover, Leader, Member, Status, SyncState, TimelineHistory
from ..exceptions import DCSError
from ..postgresql.mpp import AbstractMPP
from ..utils import deep_compare
from . import AbstractDCS, Cluster, ClusterConfig, Failover, Leader, Member, Status, SyncState, TimelineHistory
if TYPE_CHECKING: # pragma: no cover
from ..config import Config
+2 -2
View File
@@ -5,9 +5,9 @@ import logging
import os
import pkgutil
import sys
from types import ModuleType
from typing import Any, Dict, Iterator, List, Optional, Set, Tuple, TYPE_CHECKING, Type, TypeVar, Union
from types import ModuleType
from typing import Any, Dict, Iterator, List, Optional, Set, Tuple, Type, TYPE_CHECKING, TypeVar, Union
if TYPE_CHECKING: # pragma: no cover
from .config import Config
+1 -1
View File
@@ -8,7 +8,7 @@ import sys
import types
from copy import deepcopy
from typing import Any, Dict, List, Optional, Union, TYPE_CHECKING
from typing import Any, Dict, List, Optional, TYPE_CHECKING, Union
from .collections import EMPTY_DICT
from .utils import parse_bool, parse_int
+3 -3
View File
@@ -8,14 +8,14 @@ import uuid
from multiprocessing.pool import ThreadPool
from threading import RLock
from typing import Any, Callable, Collection, Dict, List, NamedTuple, Optional, Union, Tuple, TYPE_CHECKING
from typing import Any, Callable, Collection, Dict, List, NamedTuple, Optional, Tuple, TYPE_CHECKING, Union
from . import global_config, psycopg
from .__main__ import Patroni
from .async_executor import AsyncExecutor, CriticalTask
from .collections import CaseInsensitiveSet
from .dcs import AbstractDCS, Cluster, Leader, Member, RemoteMember, Status, SyncState, slot_name_from_member_name
from .exceptions import DCSError, PostgresConnectionException, PatroniFatalException
from .dcs import AbstractDCS, Cluster, Leader, Member, RemoteMember, slot_name_from_member_name, Status, SyncState
from .exceptions import DCSError, PatroniFatalException, PostgresConnectionException
from .postgresql.callback_executor import CallbackAction
from .postgresql.misc import postgres_version_to_int
from .postgresql.postmaster import PostmasterProcess
+4 -5
View File
@@ -8,12 +8,11 @@ import os
import sys
from copy import deepcopy
from logging.handlers import RotatingFileHandler
from queue import Queue, Full
from threading import Lock, Thread
from io import TextIOWrapper
from typing import Any, Dict, List, Optional, Union, TYPE_CHECKING
from logging.handlers import RotatingFileHandler
from queue import Full, Queue
from threading import Lock, Thread
from typing import Any, Dict, List, Optional, TYPE_CHECKING, Union
from .file_perm import pg_perm
from .utils import deep_compare, parse_int
+10 -9
View File
@@ -9,11 +9,19 @@ import time
from contextlib import contextmanager
from copy import deepcopy
from datetime import datetime
from threading import current_thread, Lock
from typing import Any, Callable, Dict, Iterator, List, Optional, Tuple, TYPE_CHECKING, Union
from dateutil import tz
from psutil import TimeoutExpired
from threading import current_thread, Lock
from typing import Any, Callable, Dict, Iterator, List, Optional, Union, Tuple, TYPE_CHECKING
from .. import global_config, psycopg
from ..async_executor import CriticalTask
from ..collections import CaseInsensitiveDict, CaseInsensitiveSet, EMPTY_DICT
from ..dcs import Cluster, Leader, Member
from ..exceptions import PostgresConnectionException
from ..tags import Tags
from ..utils import data_directory_is_empty, parse_int, polling_loop, Retry, RetryFailedError
from .bootstrap import Bootstrap
from .callback_executor import CallbackAction, CallbackExecutor
from .cancellable import CancellableSubprocess
@@ -24,13 +32,6 @@ from .mpp import AbstractMPP
from .postmaster import PostmasterProcess
from .slots import SlotsHandler
from .sync import SyncHandler
from .. import global_config, psycopg
from ..async_executor import CriticalTask
from ..collections import CaseInsensitiveSet, CaseInsensitiveDict, EMPTY_DICT
from ..dcs import Cluster, Leader, Member
from ..exceptions import PostgresConnectionException
from ..utils import Retry, RetryFailedError, polling_loop, data_directory_is_empty, parse_int
from ..tags import Tags
if TYPE_CHECKING: # pragma: no cover
from psycopg import Connection as Connection3, Cursor
+1 -1
View File
@@ -4,7 +4,7 @@ import shlex
import tempfile
import time
from typing import Any, Callable, Dict, List, Optional, Union, Tuple, TYPE_CHECKING
from typing import Any, Callable, Dict, List, Optional, Tuple, TYPE_CHECKING, Union
from ..async_executor import CriticalTask
from ..collections import EMPTY_DICT
+5 -3
View File
@@ -1,11 +1,13 @@
import logging
import psutil
import subprocess
from threading import Lock
from typing import Any, Dict, List, Optional, Union
import psutil
from patroni.exceptions import PostgresException
from patroni.utils import polling_loop
from threading import Lock
from typing import Any, Dict, List, Optional, Union
logger = logging.getLogger(__name__)
+6 -6
View File
@@ -7,19 +7,19 @@ import stat
import time
from contextlib import contextmanager
from urllib.parse import urlparse, parse_qsl, unquote
from types import TracebackType
from typing import Any, Callable, Collection, Dict, Iterator, List, Optional, Union, Tuple, Type, TYPE_CHECKING
from typing import Any, Callable, Collection, Dict, Iterator, List, Optional, Tuple, Type, TYPE_CHECKING, Union
from urllib.parse import parse_qsl, unquote, urlparse
from .validator import recovery_parameters, transform_postgresql_parameter_value, transform_recovery_parameter_value
from .. import global_config
from ..collections import CaseInsensitiveDict, CaseInsensitiveSet, EMPTY_DICT
from ..dcs import Leader, Member, RemoteMember, slot_name_from_member_name
from ..exceptions import PatroniFatalException, PostgresConnectionException
from ..file_perm import pg_perm
from ..utils import (compare_values, maybe_convert_from_base_unit, parse_bool, parse_int,
split_host_port, uri, validate_directory, is_subpath)
from ..validator import IntValidator, EnumValidator
from ..utils import compare_values, is_subpath, maybe_convert_from_base_unit, \
parse_bool, parse_int, split_host_port, uri, validate_directory
from ..validator import EnumValidator, IntValidator
from .validator import recovery_parameters, transform_postgresql_parameter_value, transform_recovery_parameter_value
if TYPE_CHECKING: # pragma: no cover
from . import Postgresql
+2 -1
View File
@@ -2,7 +2,8 @@ import logging
from contextlib import contextmanager
from threading import Lock
from typing import Any, Dict, Iterator, List, Optional, Union, Tuple, TYPE_CHECKING
from typing import Any, Dict, Iterator, List, Optional, Tuple, TYPE_CHECKING, Union
if TYPE_CHECKING: # pragma: no cover
from psycopg import Connection, Cursor
from psycopg2 import connection, cursor
+2 -2
View File
@@ -5,15 +5,15 @@ supported MPP cluster. However, we may consider adapting other databases such as
"""
import abc
from typing import Any, Dict, Iterator, Optional, Union, Tuple, Type, TYPE_CHECKING
from typing import Any, Dict, Iterator, Optional, Tuple, Type, TYPE_CHECKING, Union
from ...dcs import Cluster
from ...dynamic_loader import iter_classes
from ...exceptions import PatroniException
if TYPE_CHECKING: # pragma: no cover
from .. import Postgresql
from ...config import Config
from .. import Postgresql
class AbstractMPP(abc.ABC):
+3 -3
View File
@@ -3,13 +3,13 @@ import re
import time
from threading import Condition, Event, Thread
from typing import Any, Collection, Dict, Iterator, List, Optional, Set, Tuple, TYPE_CHECKING, Union
from urllib.parse import urlparse
from typing import Any, Collection, Dict, Iterator, List, Optional, Union, Set, Tuple, TYPE_CHECKING
from . import AbstractMPP, AbstractMPPHandler
from ...dcs import Cluster
from ...psycopg import connect, quote_ident, ProgrammingError
from ...psycopg import connect, ProgrammingError, quote_ident
from ...utils import parse_int
from . import AbstractMPP, AbstractMPPHandler
if TYPE_CHECKING: # pragma: no cover
from .. import Postgresql
+4 -3
View File
@@ -1,16 +1,17 @@
import logging
import multiprocessing
import os
import psutil
import re
import signal
import subprocess
import sys
from multiprocessing.connection import Connection
from typing import Dict, Optional, List
from typing import Dict, List, Optional
from patroni import PATRONI_ENV_PREFIX, KUBERNETES_ENV_PREFIX
import psutil
from patroni import KUBERNETES_ENV_PREFIX, PATRONI_ENV_PREFIX
# avoid spawning the resource tracker process
if sys.version_info >= (3, 8): # pragma: no cover
+4 -4
View File
@@ -7,14 +7,14 @@ import subprocess
from enum import IntEnum
from threading import Lock, Thread
from typing import Any, Callable, Dict, List, Optional, Union, Tuple
from typing import Any, Callable, Dict, List, Optional, Tuple, Union
from . import Postgresql
from .connection import get_connection_cursor
from .misc import format_lsn, fsync_dir, parse_history, parse_lsn
from ..async_executor import CriticalTask
from ..collections import EMPTY_DICT
from ..dcs import Leader, RemoteMember
from . import Postgresql
from .connection import get_connection_cursor
from .misc import format_lsn, fsync_dir, parse_history, parse_lsn
logger = logging.getLogger(__name__)
+5 -3
View File
@@ -6,22 +6,24 @@ Provides classes for the creation, monitoring, management and synchronisation of
import logging
import os
import shutil
from collections import defaultdict
from contextlib import contextmanager
from threading import Condition, Thread
from typing import Any, Dict, Iterator, List, Optional, Union, Tuple, TYPE_CHECKING, Collection
from typing import Any, Collection, Dict, Iterator, List, Optional, Tuple, TYPE_CHECKING, Union
from .connection import get_connection_cursor
from .misc import format_lsn, fsync_dir
from .. import global_config
from ..dcs import Cluster, Leader
from ..file_perm import pg_perm
from ..psycopg import OperationalError
from ..tags import Tags
from .connection import get_connection_cursor
from .misc import format_lsn, fsync_dir
if TYPE_CHECKING: # pragma: no cover
from psycopg import Cursor
from psycopg2 import cursor
from . import Postgresql
logger = logging.getLogger(__name__)
+1
View File
@@ -9,6 +9,7 @@ from .. import global_config
from ..collections import CaseInsensitiveDict, CaseInsensitiveSet
from ..dcs import Cluster
from ..psycopg import quote_ident as _quote_ident
if TYPE_CHECKING: # pragma: no cover
from . import Postgresql
+4 -3
View File
@@ -1,14 +1,15 @@
import abc
from copy import deepcopy
import logging
import yaml
from copy import deepcopy
from typing import Any, Dict, Iterator, List, MutableMapping, Optional, Tuple, Type, Union
from .available_parameters import get_validator_files, PathLikeObj
import yaml
from ..collections import CaseInsensitiveDict, CaseInsensitiveSet
from ..exceptions import PatroniException
from ..utils import parse_bool, parse_int, parse_real
from .available_parameters import get_validator_files, PathLikeObj
logger = logging.getLogger(__name__)
+5 -2
View File
@@ -5,6 +5,7 @@ This module is able to handle both :mod:`pyscopg2` and :mod:`psycopg`, and it ex
``2.5.4``.
"""
from typing import Any, Optional, TYPE_CHECKING, Union
if TYPE_CHECKING: # pragma: no cover
from psycopg import Connection
from psycopg2 import connection, cursor
@@ -14,10 +15,11 @@ __all__ = ['connect', 'quote_ident', 'quote_literal', 'DatabaseError', 'Error',
_legacy = False
try:
from psycopg2 import __version__
from . import MIN_PSYCOPG2, parse_version
if parse_version(__version__) < MIN_PSYCOPG2:
raise ImportError
from psycopg2 import connect as _connect, Error, DatabaseError, OperationalError, ProgrammingError
from psycopg2 import connect as _connect, DatabaseError, Error, OperationalError, ProgrammingError
from psycopg2.extensions import adapt
try:
@@ -44,8 +46,9 @@ try:
except ImportError:
import types
from psycopg import DatabaseError, Error, OperationalError, ProgrammingError, sql
# isort: off
from psycopg import connect as __connect # pyright: ignore [reportUnknownVariableType]
from psycopg import sql, Error, DatabaseError, OperationalError, ProgrammingError
def __get_parameter_status(self: 'Connection[Any]', param_name: str) -> Optional[str]:
"""Helper function to be injected into :class:`Connection` object.
+1 -1
View File
@@ -1,7 +1,7 @@
import logging
from .config import Config
from .daemon import AbstractPatroniDaemon, abstract_main, get_base_arg_parser
from .daemon import abstract_main, AbstractPatroniDaemon, get_base_arg_parser
from .dcs.raft import KVStoreTTL
logger = logging.getLogger(__name__)
+2 -2
View File
@@ -1,11 +1,11 @@
"""Facilities for handling communication with Patroni's REST API."""
import json
import urllib3
from typing import Any, Dict, Optional, Union
from urllib.parse import urlparse, urlunparse
import urllib3
from .config import Config
from .dcs import Member
from .utils import USER_AGENT
+3 -2
View File
@@ -3,13 +3,14 @@
import json
import logging
import sys
from typing import Any, Optional
import boto3
from botocore.exceptions import ClientError
from botocore.utils import IMDSFetcher
from typing import Any, Optional
from ..utils import Retry, RetryFailedError
logger = logging.getLogger(__name__)
+3 -2
View File
@@ -9,11 +9,12 @@ builds the CLI that makes an interface with the actual commands.
See :class:ExitCode` for possible exit codes of this main script.
"""
from argparse import ArgumentParser
from enum import IntEnum
import logging
import sys
from argparse import ArgumentParser
from enum import IntEnum
from .config_switch import run_barman_config_switch
from .recover import run_barman_recover
from .utils import ApiNotOk, PgBackupApi, set_up_logging
+3 -3
View File
@@ -14,15 +14,15 @@ the same host as Barman.
Refer to :class:`ExitCode` for possible exit codes of this sub-command.
"""
from argparse import Namespace
from enum import IntEnum
import logging
import time
from argparse import Namespace
from enum import IntEnum
from typing import Optional, TYPE_CHECKING
from .utils import OperationStatus, RetriesExceeded
if TYPE_CHECKING: # pragma: no cover
from .utils import PgBackupApi
+3 -3
View File
@@ -14,15 +14,15 @@ have ``pg-backup-api`` configured and running in the same host as Barman.
Refer to :class:`ExitCode` for possible exit codes of this sub-command.
"""
from argparse import Namespace
from enum import IntEnum
import logging
import time
from argparse import Namespace
from enum import IntEnum
from typing import TYPE_CHECKING
from .utils import OperationStatus, RetriesExceeded
if TYPE_CHECKING: # pragma: no cover
from .utils import PgBackupApi
+3 -2
View File
@@ -2,11 +2,12 @@
"""Utilitary stuff to be used by Barman related scripts."""
from enum import IntEnum
import json
import logging
from typing import Any, Callable, Dict, Optional, Tuple, Type, Union
import time
from enum import IntEnum
from typing import Any, Callable, Dict, Optional, Tuple, Type, Union
from urllib.parse import urljoin
from urllib3 import PoolManager
+1 -1
View File
@@ -3,7 +3,7 @@ import abc
from typing import Any, Dict, Optional
from patroni.utils import parse_int, parse_bool
from patroni.utils import parse_bool, parse_int
class Tags(abc.ABC):
+4 -4
View File
@@ -21,13 +21,13 @@ import subprocess
import sys
import tempfile
import time
from shlex import split
from typing import Any, Callable, Dict, Iterator, List, Optional, Union, Tuple, Type, TYPE_CHECKING
from collections import OrderedDict
from dateutil import tz
from json import JSONDecoder
from shlex import split
from typing import Any, Callable, Dict, Iterator, List, Optional, Tuple, Type, TYPE_CHECKING, Union
from dateutil import tz
from urllib3.response import HTTPResponse
from .exceptions import PatroniException
+2 -2
View File
@@ -9,13 +9,13 @@ import os
import shutil
import socket
from typing import Any, Dict, Union, Iterator, List, Optional as OptionalType, Tuple, TYPE_CHECKING
from typing import Any, Dict, Iterator, List, Optional as OptionalType, Tuple, TYPE_CHECKING, Union
from .collections import CaseInsensitiveSet, EMPTY_DICT
from .dcs import dcs_modules
from .exceptions import ConfigParseError
from .utils import parse_int, split_host_port, data_directory_is_empty, get_major_version
from .log import type_logformat
from .utils import data_directory_is_empty, get_major_version, parse_int, split_host_port
def validate_log_field(field: Union[str, Dict[str, Any], Any]) -> bool:
+2 -1
View File
@@ -1,2 +1,3 @@
from patroni.watchdog.base import WatchdogError, Watchdog
from patroni.watchdog.base import Watchdog, WatchdogError
__all__ = ['WatchdogError', 'Watchdog']
+1 -1
View File
@@ -2,8 +2,8 @@ import abc
import logging
import platform
import sys
from threading import RLock
from threading import RLock
from typing import Any, Callable, Dict, Optional, Union
from ..config import Config
+55 -19
View File
@@ -4,6 +4,7 @@
Setup file for patroni
"""
import glob
import inspect
import logging
import os
@@ -47,6 +48,7 @@ CLASSIFIERS = [
'Programming Language :: Python :: 3.9',
'Programming Language :: Python :: 3.10',
'Programming Language :: Python :: 3.11',
'Programming Language :: Python :: 3.12',
'Programming Language :: Python :: Implementation :: CPython',
]
@@ -68,33 +70,67 @@ class _Command(Command):
pass
class Flake8(_Command):
class _Lint(_Command):
def package_files(self):
seen_package_directories = ()
directories = self.distribution.package_dir or {}
empty_directory_exists = "" in directories
packages = self.distribution.packages or []
for package in packages:
if package in directories:
package_directory = directories[package]
elif empty_directory_exists:
package_directory = os.path.join(directories[""], package)
def package_modules(self):
package_dirs = self.distribution.package_dir or {}
for package in self.distribution.packages or []:
if package in package_dirs:
yield package_dirs[package]
elif '' in package_dirs:
yield os.path.join(package_dirs[''], package)
else:
package_directory = package
yield package
if not package_directory.startswith(seen_package_directories):
seen_package_directories += (package_directory + ".",)
yield package_directory
def package_directories(self):
for module in self.package_modules():
yield module.replace('.', os.path.sep)
def targets(self):
return [package for package in self.package_files()] + ['tests', 'features', 'setup.py']
def aux_directories(self):
for dir_name in ('tests', 'features'):
for root, dirs, files in os.walk(dir_name):
for name in dirs:
yield os.path.join(root, name)
def dirs_to_check(self):
yield from self.package_directories()
yield from self.aux_directories()
def files_to_check(self):
for path in self.dirs_to_check():
for python_file in glob.iglob(os.path.join(path, '*.py')):
yield python_file
for filename in self.distribution.py_modules or []:
yield f'{filename}.py'
yield 'setup.py'
class Flake8(_Lint):
def run(self):
from flake8.main.cli import main
logging.getLogger().setLevel(logging.ERROR)
raise SystemExit(main(self.targets()))
raise SystemExit(main(list(self.files_to_check())))
class ISort(_Lint):
def run(self):
from isort import api
wrong_sorted_files = False
for python_file in self.files_to_check():
try:
if not api.check_file(python_file, settings_path=__location__, show_diff=True):
wrong_sorted_files = True
except OSError as error:
logging.warning('Unable to parse file %s due to %r', python_file, error)
wrong_sorted_files = True
if wrong_sorted_files:
sys.exit(1)
class PyTest(_Command):
@@ -177,7 +213,7 @@ def main():
]},
install_requires=install_requires,
extras_require=EXTRAS_REQUIRE,
cmdclass={'test': PyTest, 'flake8': Flake8},
cmdclass={'test': PyTest, 'flake8': Flake8, 'isort': ISort},
entry_points={'console_scripts': CONSOLE_SCRIPTS},
)
+2 -1
View File
@@ -2,7 +2,8 @@ import datetime
import os
import shutil
import unittest
from unittest.mock import Mock, PropertyMock, patch
from unittest.mock import Mock, patch, PropertyMock
import urllib3
+2 -3
View File
@@ -1,12 +1,12 @@
import datetime
import json
import unittest
import socket
import unittest
from http.server import HTTPServer
from io import BytesIO as IO
from socketserver import ThreadingMixIn
from unittest.mock import Mock, PropertyMock, patch
from unittest.mock import Mock, patch, PropertyMock
from patroni import global_config
from patroni.api import RestApiHandler, RestApiServer
@@ -20,7 +20,6 @@ from patroni.utils import RetryFailedError, tzutc
from . import MockConnect, psycopg_connect
from .test_ha import get_cluster_initialized_without_leader
future_restart_time = datetime.datetime.now(tzutc) + datetime.timedelta(days=5)
postmaster_start_time = datetime.datetime.now(tzutc)
+2 -1
View File
@@ -1,8 +1,9 @@
import unittest
from threading import Thread
from unittest.mock import Mock, patch
from patroni.async_executor import AsyncExecutor, CriticalTask
from threading import Thread
class TestAsyncExecutor(unittest.TestCase):
+5 -3
View File
@@ -1,10 +1,12 @@
import botocore
import botocore.awsrequest
import sys
import unittest
from unittest.mock import Mock, PropertyMock, patch
from collections import namedtuple
from unittest.mock import Mock, patch, PropertyMock
import botocore
import botocore.awsrequest
from patroni.scripts.aws import AWSConnection, main as _main
+5 -4
View File
@@ -1,16 +1,17 @@
import logging
import unittest
from unittest import mock
from unittest.mock import MagicMock, Mock, patch
from urllib3.exceptions import MaxRetryError
from patroni.scripts.barman.cli import main
from patroni.scripts.barman.config_switch import (ExitCode as BarmanConfigSwitchExitCode, _should_skip_switch,
_switch_config, run_barman_config_switch)
from patroni.scripts.barman.recover import ExitCode as BarmanRecoverExitCode, _restore_backup, run_barman_recover
from patroni.scripts.barman.config_switch import _should_skip_switch, _switch_config, \
ExitCode as BarmanConfigSwitchExitCode, run_barman_config_switch
from patroni.scripts.barman.recover import _restore_backup, ExitCode as BarmanRecoverExitCode, run_barman_recover
from patroni.scripts.barman.utils import ApiNotOk, OperationStatus, PgBackupApi, RetriesExceeded, set_up_logging
API_URL = "http://localhost:7480"
BARMAN_SERVER = "my_server"
BARMAN_MODEL = "my_model"
+3 -2
View File
@@ -1,6 +1,7 @@
import os
import sys
from unittest.mock import Mock, PropertyMock, patch
from unittest.mock import Mock, patch, PropertyMock
from patroni.async_executor import CriticalTask
from patroni.collections import CaseInsensitiveDict
@@ -9,7 +10,7 @@ from patroni.postgresql.bootstrap import Bootstrap
from patroni.postgresql.cancellable import CancellableSubprocess
from patroni.postgresql.config import ConfigHandler, get_param_diff
from . import psycopg_connect, BaseTestPostgresql, mock_available_gucs
from . import BaseTestPostgresql, mock_available_gucs, psycopg_connect
@patch('subprocess.call', Mock(return_value=0))
+3 -1
View File
@@ -1,7 +1,9 @@
import psutil
import unittest
from unittest.mock import Mock, patch
import psutil
from patroni.postgresql.callback_executor import CallbackExecutor
+3 -1
View File
@@ -1,7 +1,9 @@
import psutil
import unittest
from unittest.mock import Mock, patch
import psutil
from patroni.exceptions import PostgresException
from patroni.postgresql.cancellable import CancellableSubprocess
+1 -1
View File
@@ -2,8 +2,8 @@ import time
import unittest
from copy import deepcopy
from unittest.mock import Mock, patch, PropertyMock
from typing import List
from unittest.mock import Mock, patch, PropertyMock
from patroni.postgresql.mpp.citus import CitusHandler, PgDistGroup, PgDistNode
from patroni.psycopg import ProgrammingError
+1 -1
View File
@@ -1,7 +1,7 @@
import io
import os
import sys
import unittest
import io
from copy import deepcopy
from unittest.mock import MagicMock, Mock, patch
+6 -6
View File
@@ -1,19 +1,19 @@
import os
import psutil
import unittest
import yaml
from . import MockConnect, MockCursor
from copy import deepcopy
from unittest.mock import MagicMock, Mock, PropertyMock, mock_open as _mock_open, patch
from unittest.mock import MagicMock, Mock, mock_open as _mock_open, patch, PropertyMock
import psutil
import yaml
from patroni.__main__ import main as _main
from patroni.config import Config
from patroni.config_generator import AbstractConfigGenerator, get_address, NO_VALUE_MSG
from patroni.log import PatroniLogger
from patroni.utils import patch_config, parse_bool
from patroni.utils import parse_bool, patch_config
from . import psycopg_connect
from . import MockConnect, MockCursor, psycopg_connect
HOSTNAME = 'test_hostname'
IP = '1.9.8.4'
+8 -4
View File
@@ -1,12 +1,16 @@
import consul
import unittest
from unittest.mock import Mock, PropertyMock, patch
from unittest.mock import Mock, patch, PropertyMock
import consul
from consul import ConsulException, NotFound
from patroni.dcs import get_dcs
from patroni.dcs.consul import AbstractDCS, Cluster, Consul, ConsulInternalError, \
ConsulError, ConsulClient, HTTPClient, InvalidSessionTTL, InvalidSession, RetryFailedError
from patroni.dcs.consul import AbstractDCS, Cluster, Consul, ConsulClient, ConsulError, \
ConsulInternalError, HTTPClient, InvalidSession, InvalidSessionTTL, RetryFailedError
from patroni.postgresql.mpp import get_mpp
from . import SleepException
+15 -12
View File
@@ -1,28 +1,31 @@
import click
import etcd
import os
import unittest
from click.testing import CliRunner
from datetime import datetime, timedelta
from unittest import mock
from unittest.mock import Mock, patch, PropertyMock
import click
import etcd
from click.testing import CliRunner
from prettytable import ALL, PrettyTable
from urllib3 import PoolManager
from patroni import global_config
from patroni.ctl import ctl, load_config, output_members, get_dcs, parse_dcs, \
get_all_members, get_any_member, get_cursor, query_member, PatroniCtlException, apply_config_changes, \
format_config_for_editing, show_diff, invoke_editor, format_pg_version, CONFIG_FILE_PATH, PatronictlPrettyTable
from patroni.ctl import apply_config_changes, CONFIG_FILE_PATH, ctl, format_config_for_editing, \
format_pg_version, get_all_members, get_any_member, get_cursor, get_dcs, invoke_editor, load_config, \
output_members, parse_dcs, PatroniCtlException, PatronictlPrettyTable, query_member, show_diff
from patroni.dcs import Cluster, Failover
from patroni.postgresql.config import get_param_diff
from patroni.postgresql.mpp import get_mpp
from patroni.psycopg import OperationalError
from patroni.utils import tzutc
from prettytable import PrettyTable, ALL
from unittest import mock
from unittest.mock import patch, Mock, PropertyMock
from urllib3 import PoolManager
from . import MockConnect, MockCursor, MockResponse, psycopg_connect
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
from .test_ha import get_cluster, get_cluster_initialized_with_leader, get_cluster_initialized_with_only_leader, \
get_cluster_initialized_without_leader, get_cluster_not_initialized_without_leader, Member
def get_default_config(*args):
+9 -6
View File
@@ -1,18 +1,21 @@
import etcd
import urllib3.util.connection
import socket
import unittest
from unittest.mock import Mock, patch, PropertyMock
import etcd
import urllib3.util.connection
from dns.exception import DNSException
from urllib3.exceptions import ReadTimeoutError
from patroni.dcs import get_dcs
from patroni.dcs.etcd import AbstractDCS, EtcdClient, Cluster, Etcd, EtcdError, DnsCachingResolver
from patroni.dcs.etcd import AbstractDCS, Cluster, DnsCachingResolver, Etcd, EtcdClient, EtcdError
from patroni.exceptions import DCSError
from patroni.postgresql.mpp import get_mpp
from patroni.utils import Retry
from unittest.mock import Mock, PropertyMock, patch
from urllib3.exceptions import ReadTimeoutError
from . import SleepException, MockResponse, requests_get
from . import MockResponse, requests_get, SleepException
def etcd_watch(self, key, index=None, timeout=None, recursive=None):
+9 -7
View File
@@ -1,18 +1,20 @@
import etcd
import json
import unittest
from threading import Thread
from unittest.mock import Mock, patch, PropertyMock
import etcd
import urllib3
from unittest.mock import Mock, PropertyMock, patch
from patroni.dcs import get_dcs
from patroni.dcs.etcd import DnsCachingResolver
from patroni.dcs.etcd3 import PatroniEtcd3Client, Cluster, Etcd3, Etcd3Client, \
Etcd3Error, Etcd3ClientError, RetryFailedError, InvalidAuthToken, Unavailable, \
Unknown, UnsupportedEtcdVersion, UserEmpty, AuthFailed, AuthOldRevision, base64_encode
from patroni.dcs.etcd3 import AuthFailed, AuthOldRevision, base64_encode, Cluster, Etcd3, \
Etcd3Client, Etcd3ClientError, Etcd3Error, InvalidAuthToken, PatroniEtcd3Client, \
RetryFailedError, Unavailable, Unknown, UnsupportedEtcdVersion, UserEmpty
from patroni.postgresql.mpp import get_mpp
from threading import Thread
from . import SleepException, MockResponse
from . import MockResponse, SleepException
def mock_urlopen(self, method, url, **kwargs):
+5 -3
View File
@@ -1,12 +1,14 @@
import unittest
import urllib3
from unittest.mock import Mock, patch
import urllib3
from patroni.dcs import get_dcs
from patroni.dcs.exhibitor import ExhibitorEnsembleProvider, Exhibitor
from patroni.dcs.exhibitor import Exhibitor, ExhibitorEnsembleProvider
from patroni.dcs.zookeeper import ZooKeeperError
from . import SleepException, requests_get
from . import requests_get, SleepException
from .test_zookeeper import MockKazooClient
+2 -1
View File
@@ -1,5 +1,6 @@
import unittest
import stat
import unittest
from unittest.mock import Mock, patch
from patroni.file_perm import pg_perm
+9 -7
View File
@@ -1,16 +1,18 @@
import datetime
import etcd
import os
import sys
from unittest.mock import Mock, MagicMock, PropertyMock, patch, mock_open
from unittest.mock import MagicMock, Mock, mock_open, patch, PropertyMock
import etcd
from patroni import global_config
from patroni.collections import CaseInsensitiveSet
from patroni.config import Config
from patroni.dcs import Cluster, ClusterConfig, Failover, Leader, Member, get_dcs, Status, SyncState, TimelineHistory
from patroni.dcs import Cluster, ClusterConfig, Failover, get_dcs, Leader, Member, Status, SyncState, TimelineHistory
from patroni.dcs.etcd import AbstractEtcdClientWithFailover
from patroni.exceptions import DCSError, PostgresConnectionException, PatroniFatalException
from patroni.ha import Ha, _MemberStatus
from patroni.exceptions import DCSError, PatroniFatalException, PostgresConnectionException
from patroni.ha import _MemberStatus, Ha
from patroni.postgresql import Postgresql
from patroni.postgresql.bootstrap import Bootstrap
from patroni.postgresql.cancellable import CancellableSubprocess
@@ -22,8 +24,8 @@ from patroni.postgresql.sync import _SyncState
from patroni.utils import tzutc
from patroni.watchdog import Watchdog
from . import PostgresInit, MockPostmaster, psycopg_connect, requests_get
from .test_etcd import socket_getaddrinfo, etcd_read, etcd_write
from . import MockPostmaster, PostgresInit, psycopg_connect, requests_get
from .test_etcd import etcd_read, etcd_write, socket_getaddrinfo
SYSID = '12345678901'
+8 -5
View File
@@ -4,16 +4,19 @@ import json
import socket
import time
import unittest
import urllib3
from threading import Thread
from unittest import mock
from unittest.mock import Mock, PropertyMock, mock_open, patch
from unittest.mock import Mock, mock_open, patch, PropertyMock
import urllib3
from patroni.dcs import get_dcs
from patroni.dcs.kubernetes import Cluster, k8s_client, k8s_config, K8sConfig, K8sConnectionFailed, \
K8sException, K8sObject, Kubernetes, KubernetesError, KubernetesRetriableException, \
Retry, RetryFailedError, SERVICE_HOST_ENV_NAME, SERVICE_PORT_ENV_NAME
K8sException, K8sObject, Kubernetes, KubernetesError, KubernetesRetriableException, Retry, \
RetryFailedError, SERVICE_HOST_ENV_NAME, SERVICE_PORT_ENV_NAME
from patroni.postgresql.mpp import get_mpp
from threading import Thread
from . import MockResponse, SleepException
+4 -2
View File
@@ -2,11 +2,13 @@ import logging
import os
import sys
import unittest
import yaml
from io import StringIO
from queue import Queue, Full
from queue import Full, Queue
from unittest.mock import Mock, patch
import yaml
from patroni.config import Config
from patroni.log import PatroniLogger
+1
View File
@@ -1,4 +1,5 @@
from typing import Any
from patroni.exceptions import PatroniException
from patroni.postgresql.mpp import AbstractMPP, get_mpp, Null
+8 -5
View File
@@ -1,13 +1,18 @@
import etcd
import logging
import os
import signal
import time
import unittest
from unittest.mock import Mock, PropertyMock, patch
from http.server import HTTPServer
from threading import Thread
from unittest.mock import Mock, patch, PropertyMock
import etcd
import patroni.config as config
from http.server import HTTPServer
from patroni.__main__ import check_psycopg, main as _main, Patroni
from patroni.api import RestApiServer
from patroni.async_executor import AsyncExecutor
from patroni.dcs import Cluster, Member
@@ -15,8 +20,6 @@ from patroni.dcs.etcd import AbstractEtcdClientWithFailover
from patroni.exceptions import DCSError
from patroni.postgresql import Postgresql
from patroni.postgresql.config import ConfigHandler
from patroni.__main__ import check_psycopg, Patroni, main as _main
from threading import Thread
from . import psycopg_connect, SleepException
from .test_etcd import etcd_read, etcd_write
+12 -13
View File
@@ -1,13 +1,15 @@
import datetime
import os
import psutil
import re
import subprocess
import time
from copy import deepcopy
from pathlib import Path
from unittest.mock import Mock, MagicMock, PropertyMock, patch, mock_open
from threading import current_thread, Thread
from unittest.mock import MagicMock, Mock, mock_open, patch, PropertyMock
import psutil
import patroni.psycopg as psycopg
@@ -15,22 +17,19 @@ from patroni import global_config
from patroni.async_executor import CriticalTask
from patroni.collections import CaseInsensitiveDict, CaseInsensitiveSet
from patroni.dcs import RemoteMember
from patroni.exceptions import PostgresConnectionException, PatroniException
from patroni.postgresql import Postgresql, STATE_REJECT, STATE_NO_RESPONSE
from patroni.exceptions import PatroniException, PostgresConnectionException
from patroni.postgresql import Postgresql, STATE_NO_RESPONSE, STATE_REJECT
from patroni.postgresql.bootstrap import Bootstrap
from patroni.postgresql.callback_executor import CallbackAction
from patroni.postgresql.config import get_param_diff, _false_validator
from patroni.postgresql.config import _false_validator, get_param_diff
from patroni.postgresql.postmaster import PostmasterProcess
from patroni.postgresql.validator import (ValidatorFactoryNoType, ValidatorFactoryInvalidType,
ValidatorFactoryInvalidSpec, ValidatorFactory, InvalidGucValidatorsFile,
_get_postgres_guc_validators, _read_postgres_gucs_validators_file,
_load_postgres_gucs_validators, Bool, Integer, Real, Enum, EnumBool, String)
from patroni.postgresql.validator import _get_postgres_guc_validators, _load_postgres_gucs_validators, \
_read_postgres_gucs_validators_file, Bool, Enum, EnumBool, Integer, InvalidGucValidatorsFile, Real, String, \
ValidatorFactory, ValidatorFactoryInvalidSpec, ValidatorFactoryInvalidType, ValidatorFactoryNoType
from patroni.utils import RetryFailedError
from threading import Thread, current_thread
from . import (BaseTestPostgresql, MockCursor, MockPostmaster, psycopg_connect, mock_available_gucs,
GET_PG_SETTINGS_RESULT)
from . import BaseTestPostgresql, GET_PG_SETTINGS_RESULT, \
mock_available_gucs, MockCursor, MockPostmaster, psycopg_connect
mtime_ret = {}
+4 -2
View File
@@ -1,7 +1,9 @@
import multiprocessing
import psutil
import unittest
from unittest.mock import Mock, patch, mock_open
from unittest.mock import Mock, mock_open, patch
import psutil
from patroni.postgresql.postmaster import PostmasterProcess
+1 -1
View File
@@ -2,7 +2,7 @@ import unittest
from typing import List, Set, Tuple
from patroni.quorum import QuorumStateResolver, QuorumError
from patroni.quorum import QuorumError, QuorumStateResolver
class QuorumTest(unittest.TestCase):
+7 -5
View File
@@ -1,14 +1,16 @@
import os
import unittest
import tempfile
import time
from unittest.mock import Mock, PropertyMock, patch
import unittest
from unittest.mock import Mock, patch, PropertyMock
from pysyncobj import FAIL_REASON, SyncObjConf
from patroni.dcs import get_dcs
from patroni.dcs.raft import Cluster, DynMemberSyncObj, KVStoreTTL, \
Raft, RaftError, SyncObjUtility, TCPTransport, _TCPTransport
from patroni.dcs.raft import _TCPTransport, Cluster, DynMemberSyncObj, \
KVStoreTTL, Raft, RaftError, SyncObjUtility, TCPTransport
from patroni.postgresql.mpp import get_mpp
from pysyncobj import SyncObjConf, FAIL_REASON
def remove_files(prefix):
+3 -1
View File
@@ -1,11 +1,13 @@
import logging
import os
import unittest
from unittest.mock import Mock, patch
from pysyncobj import SyncObj
from patroni.config import Config
from patroni.raft_controller import RaftController, main as _main
from patroni.raft_controller import main as _main, RaftController
from . import SleepException
from .test_raft import remove_files
+1 -1
View File
@@ -1,4 +1,4 @@
from unittest.mock import Mock, PropertyMock, patch, mock_open
from unittest.mock import Mock, mock_open, patch, PropertyMock
from patroni.postgresql import Postgresql
from patroni.postgresql.cancellable import CancellableSubprocess
+3 -2
View File
@@ -1,8 +1,9 @@
import os
import unittest
from threading import Thread
from unittest import mock
from unittest.mock import Mock, PropertyMock, patch
from unittest.mock import Mock, patch, PropertyMock
from patroni import global_config, psycopg
from patroni.dcs import Cluster, ClusterConfig, Member, Status, SyncState
@@ -11,7 +12,7 @@ from patroni.postgresql.misc import fsync_dir
from patroni.postgresql.slots import SlotsAdvanceThread, SlotsHandler
from patroni.tags import Tags
from . import BaseTestPostgresql, psycopg_connect, MockCursor
from . import BaseTestPostgresql, MockCursor, psycopg_connect
class TestTags(Tags):
+1 -1
View File
@@ -7,7 +7,7 @@ from patroni.collections import CaseInsensitiveSet
from patroni.dcs import Cluster, ClusterConfig, Status, SyncState
from patroni.postgresql import Postgresql
from . import BaseTestPostgresql, psycopg_connect, mock_available_gucs
from . import BaseTestPostgresql, mock_available_gucs, psycopg_connect
@patch('subprocess.call', Mock(return_value=0))
+2 -1
View File
@@ -1,8 +1,9 @@
import unittest
from unittest.mock import Mock, patch
from patroni.exceptions import PatroniException
from patroni.utils import Retry, RetryFailedError, enable_keepalive, polling_loop, validate_directory, unquote
from patroni.utils import enable_keepalive, polling_loop, Retry, RetryFailedError, unquote, validate_directory
class TestUtils(unittest.TestCase):
+3 -2
View File
@@ -5,9 +5,10 @@ import tempfile
import unittest
from io import StringIO
from unittest.mock import Mock, patch, mock_open
from unittest.mock import Mock, mock_open, patch
from patroni.dcs import dcs_modules
from patroni.validator import schema, Directory, Schema
from patroni.validator import Directory, schema, Schema
available_dcs = [m.split(".")[-1] for m in dcs_modules()]
config = {
+4 -2
View File
@@ -1,11 +1,13 @@
import subprocess
import unittest
from threading import current_thread
from unittest.mock import Mock, PropertyMock, patch, mock_open
from unittest.mock import Mock, mock_open, patch, PropertyMock
import patroni.psycopg as psycopg
from patroni.scripts import wale_restore
from patroni.scripts.wale_restore import WALERestore, main as _main, get_major_version
from patroni.scripts.wale_restore import get_major_version, main as _main, WALERestore
from . import MockConnect, psycopg_connect
+5 -3
View File
@@ -1,9 +1,11 @@
import ctypes
import patroni.watchdog.linux as linuxwd
import os
import sys
import unittest
import os
from unittest.mock import patch, Mock, PropertyMock
from unittest.mock import Mock, patch, PropertyMock
import patroni.watchdog.linux as linuxwd
from patroni.watchdog import Watchdog, WatchdogError
from patroni.watchdog.base import NullWatchdog
+4 -2
View File
@@ -1,12 +1,14 @@
import select
import unittest
from unittest.mock import Mock, PropertyMock, patch
from unittest.mock import Mock, patch, PropertyMock
from kazoo.client import KazooClient
from kazoo.exceptions import NoNodeError, NodeExistsError
from kazoo.exceptions import NodeExistsError, NoNodeError
from kazoo.handlers.threading import SequentialThreadingHandler
from kazoo.protocol.states import KeeperState, WatchedEvent, ZnodeStat
from kazoo.retry import RetryFailedError
from patroni.dcs import get_dcs
from patroni.dcs.zookeeper import Cluster, PatroniKazooClient, \
PatroniSequentialThreadingHandler, ZooKeeper, ZooKeeperError
+9
View File
@@ -241,3 +241,12 @@ change_dir = docs
[flake8]
max-line-length = 120
ignore = D401,W503
[isort]
line_length = 120
multi_line_output = 2
balanced_wrapping = true
combine_as_imports = true
force_alphabetical_sort_within_sections = true
lines_between_types = 1
known_third_party = consul