Skip to content

Commit 290dd6e

Browse files
author
v.shepard
committed
PBCKP-152 use black for formatting
1 parent f9b6bdb commit 290dd6e

File tree

8 files changed

+124
-106
lines changed

8 files changed

+124
-106
lines changed

testgres/cache.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44

55
from six import raise_from
66

7-
from .op_ops.local_ops import LocalOperations
8-
from .op_ops.os_ops import OsOperations
7+
from .os_ops.local_ops import LocalOperations
8+
from .os_ops.os_ops import OsOperations
99
from .config import testgres_config
1010

1111
from .consts import XLOG_CONTROL_FILE
@@ -25,6 +25,7 @@ def cached_initdb(data_dir, logfile=None, params=None, os_ops: OsOperations = Lo
2525
"""
2626
Perform initdb or use cached node files.
2727
"""
28+
testgres_config.os_ops = os_ops
2829

2930
def call_initdb(initdb_dir, log=None):
3031
try:
@@ -60,7 +61,7 @@ def call_initdb(initdb_dir, log=None):
6061

6162
# XXX: build new WAL segment with our system id
6263
_params = [get_bin_path("pg_resetwal"), "-D", data_dir, "-f"]
63-
execute_utility(_params, logfile, os_ops)
64+
execute_utility(_params, logfile, os_ops=os_ops)
6465

6566
except ExecUtilException as e:
6667
msg = "Failed to reset WAL for system id"

testgres/config.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,8 @@
55
import tempfile
66

77
from contextlib import contextmanager
8-
from shutil import rmtree
98

10-
from .op_ops.local_ops import LocalOperations
9+
from .os_ops.local_ops import LocalOperations
1110
from .consts import TMP_CACHE
1211

1312

@@ -127,7 +126,7 @@ def copy(self):
127126
cached_initdb_dirs = set()
128127

129128
# default config object
130-
testgres_config = GlobalConfig()
129+
testgres_config = GlobalConfig(os_ops=LocalOperations())
131130

132131
# NOTE: for compatibility
133132
TestgresConfig = testgres_config
@@ -138,6 +137,7 @@ def copy(self):
138137

139138
@atexit.register
140139
def _rm_cached_initdb_dirs(os_ops=LocalOperations()):
140+
testgres_config.os_ops = os_ops
141141
for d in cached_initdb_dirs:
142142
os_ops.rmdirs(d, ignore_errors=True)
143143

testgres/defaults.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import datetime
2-
import os
32
import struct
43
import uuid
54

6-
from .op_ops.local_ops import LocalOperations
5+
from .os_ops.local_ops import LocalOperations
76

87

98
def default_dbname():

testgres/node.py

Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,16 @@
11
# coding: utf-8
22

3-
import io
43
import os
54
import random
6-
import shutil
75
import signal
86
import threading
97
from queue import Queue
108

119
import psutil
12-
import subprocess
1310
import time
1411

15-
from op_ops.local_ops import LocalOperations
16-
from op_ops.os_ops import OsOperations
17-
from op_ops.remote_ops import RemoteOperations
12+
from .os_ops.local_ops import LocalOperations
13+
from .os_ops.remote_ops import RemoteOperations
1814

1915
try:
2016
from collections.abc import Iterable
@@ -32,7 +28,6 @@
3228

3329
from shutil import rmtree
3430
from six import raise_from, iteritems, text_type
35-
from tempfile import mkstemp, mkdtemp
3631

3732
from .enums import \
3833
NodeStatus, \
@@ -96,7 +91,6 @@
9691
eprint, \
9792
get_bin_path, \
9893
get_pg_version, \
99-
file_tail, \
10094
reserve_port, \
10195
release_port, \
10296
execute_utility, \
@@ -163,6 +157,7 @@ def __init__(self, name=None, port=None, base_dir=None,
163157
else:
164158
self.os_ops = RemoteOperations(host, hostname, ssh_key)
165159

160+
testgres_config.os_ops = self.os_ops
166161
# defaults for __exit__()
167162
self.cleanup_on_good_exit = testgres_config.node_cleanup_on_good_exit
168163
self.cleanup_on_bad_exit = testgres_config.node_cleanup_on_bad_exit
@@ -628,7 +623,7 @@ def status(self):
628623
"-D", self.data_dir,
629624
"status"
630625
] # yapf: disable
631-
execute_utility(_params, self.utils_log_file)
626+
execute_utility(_params, self.utils_log_file, os_ops=self.os_ops)
632627
return NodeStatus.Running
633628

634629
except ExecUtilException as e:
@@ -650,7 +645,7 @@ def get_control_data(self):
650645
_params += ["-D"] if self._pg_version >= PgVer('9.5') else []
651646
_params += [self.data_dir]
652647

653-
data = execute_utility(_params, self.utils_log_file)
648+
data = execute_utility(_params, self.utils_log_file, os_ops=self.os_ops)
654649

655650
out_dict = {}
656651

@@ -713,7 +708,7 @@ def start(self, params=[], wait=True):
713708
] + params # yapf: disable
714709

715710
try:
716-
execute_utility(_params, self.utils_log_file)
711+
execute_utility(_params, self.utils_log_file, os_ops=self.os_ops)
717712
except ExecUtilException as e:
718713
msg = 'Cannot start node'
719714
files = self._collect_special_files()
@@ -744,7 +739,7 @@ def stop(self, params=[], wait=True):
744739
"stop"
745740
] + params # yapf: disable
746741

747-
execute_utility(_params, self.utils_log_file)
742+
execute_utility(_params, self.utils_log_file, os_ops=self.os_ops)
748743

749744
self._maybe_stop_logger()
750745
self.is_started = False
@@ -786,7 +781,7 @@ def restart(self, params=[]):
786781
] + params # yapf: disable
787782

788783
try:
789-
execute_utility(_params, self.utils_log_file)
784+
execute_utility(_params, self.utils_log_file, os_ops=self.os_ops)
790785
except ExecUtilException as e:
791786
msg = 'Cannot restart node'
792787
files = self._collect_special_files()
@@ -813,7 +808,7 @@ def reload(self, params=[]):
813808
"reload"
814809
] + params # yapf: disable
815810

816-
execute_utility(_params, self.utils_log_file)
811+
execute_utility(_params, self.utils_log_file, os_ops=self.os_ops)
817812

818813
return self
819814

@@ -835,7 +830,7 @@ def promote(self, dbname=None, username=None):
835830
"promote"
836831
] # yapf: disable
837832

838-
execute_utility(_params, self.utils_log_file)
833+
execute_utility(_params, self.utils_log_file, os_ops=self.os_ops)
839834

840835
# for versions below 10 `promote` is asynchronous so we need to wait
841836
# until it actually becomes writable
@@ -870,7 +865,7 @@ def pg_ctl(self, params):
870865
"-w" # wait
871866
] + params # yapf: disable
872867

873-
return execute_utility(_params, self.utils_log_file)
868+
return execute_utility(_params, self.utils_log_file, os_ops=self.os_ops)
874869

875870
def free_port(self):
876871
"""
@@ -1035,10 +1030,9 @@ def dump(self,
10351030
# Generate tmpfile or tmpdir
10361031
def tmpfile():
10371032
if format == DumpFormat.Directory:
1038-
fname = mkdtemp(prefix=TMP_DUMP)
1033+
fname = self.os_ops.mkdtemp(prefix=TMP_DUMP)
10391034
else:
1040-
fd, fname = mkstemp(prefix=TMP_DUMP)
1041-
os.close(fd)
1035+
fname = self.os_ops.mkstemp(prefix=TMP_DUMP)
10421036
return fname
10431037

10441038
# Set default arguments
@@ -1056,7 +1050,7 @@ def tmpfile():
10561050
"-F", format.value
10571051
] # yapf: disable
10581052

1059-
execute_utility(_params, self.utils_log_file)
1053+
execute_utility(_params, self.utils_log_file, os_ops=self.os_ops)
10601054

10611055
return filename
10621056

@@ -1085,7 +1079,7 @@ def restore(self, filename, dbname=None, username=None):
10851079

10861080
# try pg_restore if dump is binary formate, and psql if not
10871081
try:
1088-
execute_utility(_params, self.utils_log_name)
1082+
execute_utility(_params, self.utils_log_name, os_ops=self.os_ops)
10891083
except ExecUtilException:
10901084
self.psql(filename=filename, dbname=dbname, username=username)
10911085

@@ -1417,7 +1411,7 @@ def pgbench_run(self, dbname=None, username=None, options=[], **kwargs):
14171411
# should be the last one
14181412
_params.append(dbname)
14191413

1420-
return execute_utility(_params, self.utils_log_file)
1414+
return execute_utility(_params, self.utils_log_file, os_ops=self.os_ops)
14211415

14221416
def connect(self,
14231417
dbname=None,

testgres/op_ops/local_ops.py renamed to testgres/os_ops/local_ops.py

Lines changed: 37 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -14,30 +14,35 @@
1414

1515

1616
class LocalOperations(OsOperations):
17-
1817
def __init__(self, username=None):
1918
super().__init__()
2019
self.username = username or self.get_user()
2120

2221
# Command execution
2322
def exec_command(self, cmd, wait_exit=False, verbose=False, expect_error=False):
2423
if isinstance(cmd, list):
25-
cmd = ' '.join(cmd)
24+
cmd = " ".join(cmd)
2625
log.debug(f"os_ops.exec_command: `{cmd}`; remote={self.remote}")
2726
# Source global profile file + execute command
2827
try:
29-
process = subprocess.run(cmd, shell=True, text=True,
30-
stdout=subprocess.PIPE,
31-
stderr=subprocess.PIPE,
32-
timeout=CMD_TIMEOUT_SEC)
28+
process = subprocess.run(
29+
cmd,
30+
shell=True,
31+
text=True,
32+
stdout=subprocess.PIPE,
33+
stderr=subprocess.PIPE,
34+
timeout=CMD_TIMEOUT_SEC,
35+
)
3336
exit_status = process.returncode
3437
result = process.stdout
3538
error = process.stderr
3639

3740
if expect_error:
3841
raise Exception(result, error)
39-
if exit_status != 0 or 'error' in error.lower():
40-
log.error(f"Problem in executing command: `{cmd}`\nerror: {error}\nexit_code: {exit_status}")
42+
if exit_status != 0 or "error" in error.lower():
43+
log.error(
44+
f"Problem in executing command: `{cmd}`\nerror: {error}\nexit_code: {exit_status}"
45+
)
4146
exit(1)
4247

4348
if verbose:
@@ -55,7 +60,7 @@ def environ(self, var_name):
5560
return self.exec_command(cmd).strip()
5661

5762
def find_executable(self, executable):
58-
search_paths = self.environ('PATH')
63+
search_paths = self.environ("PATH")
5964
if not search_paths:
6065
return None
6166

@@ -74,12 +79,12 @@ def is_executable(self, file):
7479
def add_to_path(self, new_path):
7580
pathsep = self.pathsep
7681
# Check if the directory is already in PATH
77-
path = self.environ('PATH')
82+
path = self.environ("PATH")
7883
if new_path not in path.split(pathsep):
7984
if self.remote:
8085
self.exec_command(f"export PATH={new_path}{pathsep}{path}")
8186
else:
82-
os.environ['PATH'] = f"{new_path}{pathsep}{path}"
87+
os.environ["PATH"] = f"{new_path}{pathsep}{path}"
8388
return pathsep
8489

8590
def set_env(self, var_name, var_val):
@@ -112,17 +117,22 @@ def path_exists(self, path):
112117
@property
113118
def pathsep(self):
114119
os_name = self.get_name()
115-
if os_name == 'posix':
116-
pathsep = ':'
117-
elif os_name == 'nt':
118-
pathsep = ';'
120+
if os_name == "posix":
121+
pathsep = ":"
122+
elif os_name == "nt":
123+
pathsep = ";"
119124
else:
120125
raise Exception(f"Unsupported operating system: {os_name}")
121126
return pathsep
122127

123128
def mkdtemp(self, prefix=None):
124129
return tempfile.mkdtemp(prefix=prefix)
125130

131+
def mkstemp(self, prefix=None):
132+
fd, filename = tempfile.mkstemp(prefix=prefix)
133+
os.close(fd) # Close the file descriptor immediately after creating the file
134+
return filename
135+
126136
def copytree(self, src, dst):
127137
return shutil.copytree(src, dst)
128138

@@ -140,11 +150,11 @@ def write(self, filename, data, truncate=False, binary=False, read_and_write=Fal
140150
read_and_write: If True, the file will be opened with read and write permissions ('r+' option);
141151
if False (default), only write permission will be used ('w', 'a', 'wb', or 'ab' option)
142152
"""
143-
mode = 'wb' if binary else 'w'
153+
mode = "wb" if binary else "w"
144154
if not truncate:
145-
mode = 'a' + mode
155+
mode = "a" + mode
146156
if read_and_write:
147-
mode = 'r+' + mode
157+
mode = "r+" + mode
148158

149159
with open(filename, mode) as file:
150160
if isinstance(data, list):
@@ -161,11 +171,11 @@ def touch(self, filename):
161171
This method behaves as the 'touch' command in Unix. It's equivalent to calling 'touch filename' in the shell.
162172
"""
163173
# cross-python touch(). It is vulnerable to races, but who cares?
164-
with open(filename, 'a'):
174+
with open(filename, "a"):
165175
os.utime(filename, None)
166176

167177
def read(self, filename):
168-
with open(filename, 'r') as file:
178+
with open(filename, "r") as file:
169179
return file.read()
170180

171181
def readlines(self, filename, num_lines=0, encoding=None):
@@ -176,14 +186,14 @@ def readlines(self, filename, num_lines=0, encoding=None):
176186
assert num_lines >= 0
177187

178188
if num_lines == 0:
179-
with open(filename, 'r', encoding=encoding) as file:
189+
with open(filename, "r", encoding=encoding) as file:
180190
return file.readlines()
181191

182192
else:
183193
bufsize = 8192
184194
buffers = 1
185195

186-
with open(filename, 'r', encoding=encoding) as file:
196+
with open(filename, "r", encoding=encoding) as file:
187197
file.seek(0, os.SEEK_END)
188198
end_pos = file.tell()
189199

@@ -197,23 +207,25 @@ def readlines(self, filename, num_lines=0, encoding=None):
197207
if cur_lines >= num_lines or pos == 0:
198208
return lines[-num_lines:]
199209

200-
buffers = int(buffers * max(2, int(num_lines / max(cur_lines, 1)))) # Adjust buffer size
210+
buffers = int(
211+
buffers * max(2, int(num_lines / max(cur_lines, 1)))
212+
) # Adjust buffer size
201213

202214
def isfile(self, remote_file):
203215
return os.path.isfile(remote_file)
204216

205217
# Processes control
206218
def kill(self, pid, signal):
207219
# Kill the process
208-
cmd = f'kill -{signal} {pid}'
220+
cmd = f"kill -{signal} {pid}"
209221
return self.exec_command(cmd)
210222

211223
def get_pid(self):
212224
# Get current process id
213225
return os.getpid()
214226

215227
# Database control
216-
def db_connect(self, dbname, user, password=None, host='localhost', port=5432):
228+
def db_connect(self, dbname, user, password=None, host="localhost", port=5432):
217229
conn = pglib.connect(
218230
host=host,
219231
port=port,

0 commit comments

Comments
 (0)