Skip to content

Commit 9e0899e

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

File tree

8 files changed

+125
-108
lines changed

8 files changed

+125
-108
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: 4 additions & 5 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

@@ -44,7 +43,7 @@ class GlobalConfig(object):
4443
_cached_initdb_dir = None
4544
""" underlying class attribute for cached_initdb_dir property """
4645

47-
os_ops = None
46+
os_ops = LocalOperations()
4847
""" OsOperation object that allows work on remote host """
4948
@property
5049
def cached_initdb_dir(self):
@@ -137,9 +136,9 @@ def copy(self):
137136

138137

139138
@atexit.register
140-
def _rm_cached_initdb_dirs(os_ops=LocalOperations()):
139+
def _rm_cached_initdb_dirs():
141140
for d in cached_initdb_dirs:
142-
os_ops.rmdirs(d, ignore_errors=True)
141+
testgres_config.os_ops.rmdirs(d, ignore_errors=True)
143142

144143

145144
def push_config(**options):

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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy