Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
741d21d
OsOperations::popen is added
dmitry-lipetsk Sep 13, 2026
81117d7
fix: kill/terminate on alpine via ssh returns 255 instead 143/137
dmitry-lipetsk Sep 14, 2026
4c0fe1a
Revert "fix: kill/terminate on alpine via ssh returns 255 instead 143…
dmitry-lipetsk Sep 14, 2026
8594f07
fix: RemoteOperations::popen uses time.monotonic()
dmitry-lipetsk Sep 14, 2026
d5fc991
typing
dmitry-lipetsk Sep 14, 2026
bb995dd
remote_ops: response rc-file is used
dmitry-lipetsk Sep 14, 2026
d4a4089
RemoteOperations::__del__ is added
dmitry-lipetsk Sep 14, 2026
15cdc71
test_popen_garbage_collection is updated
dmitry-lipetsk Sep 14, 2026
96a9677
new tests into test_os_ops_common are added
dmitry-lipetsk Sep 14, 2026
d4e39f5
OsProcessController::args is added
dmitry-lipetsk Sep 14, 2026
f9cbae5
[rename] TCMD -> T_OS_CMD
dmitry-lipetsk Sep 15, 2026
f6dfe9d
tests: misc+correction
dmitry-lipetsk Sep 15, 2026
e52e825
OsProcessController::communicate is added
dmitry-lipetsk Sep 15, 2026
68738bb
test_popen_returncode_active + test_popen_wait_returncode
dmitry-lipetsk Sep 15, 2026
1c41670
OsProcessController::pool is added
dmitry-lipetsk Sep 15, 2026
4211f8e
[rename] test_popen_returncode_stopped
dmitry-lipetsk Sep 15, 2026
3fee221
exceptions uses T_OS_CMD
dmitry-lipetsk Sep 15, 2026
81e902c
test_popen_unset_env is updated
dmitry-lipetsk Sep 15, 2026
db85a2e
OsOperations::run is added
dmitry-lipetsk Sep 15, 2026
b1b3489
tests: refactoring
dmitry-lipetsk Sep 15, 2026
bd4d03e
test_popen_stdin_stream is added
dmitry-lipetsk Sep 15, 2026
8e9c3f4
test_popen_stderr_and_stdout__streams is added
dmitry-lipetsk Sep 15, 2026
30bd999
test_run_check_exception is updated
dmitry-lipetsk Sep 15, 2026
981afd5
flake8
dmitry-lipetsk Sep 15, 2026
ebe1846
A problem with ruff is hacked
dmitry-lipetsk Sep 15, 2026
3b413c5
Merge branch 'master' into D20260914_001--os_ops
dmitry-lipetsk Sep 15, 2026
2adb2dd
OsOperationStaticConfig is added
dmitry-lipetsk Sep 15, 2026
0b521b6
Usage of RaiseError.UtilityExitedWithNonZeroCode is corrected
dmitry-lipetsk Sep 15, 2026
85b3e78
os_ops::popen is updated (new asserts)
dmitry-lipetsk Sep 15, 2026
b6e293d
test_popen_communicate__rc_file_is_deleted is added
dmitry-lipetsk Sep 15, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
108 changes: 102 additions & 6 deletions src/exceptions.py
Original file line number Diff line number Diff line change
@@ -1,27 +1,32 @@
# coding: utf-8

from .types import T_OS_CMD
from .types import T_OS_TIMEOUT

from testgres.common.exceptions import TestgresException
from testgres.common.exceptions import InvalidOperationException

import six
import typing


T_CMD = typing.Union[str, list]
# [2026-09-15] deprecated
T_CMD = T_OS_CMD
T_OUT_DATA = typing.Union[str, bytes]
T_ERR_DATA = typing.Union[str, bytes]


class ExecUtilException(TestgresException):
_description: typing.Optional[str]
_command: typing.Optional[T_CMD]
_command: typing.Optional[T_OS_CMD]
_exit_code: typing.Optional[int]
_out: typing.Optional[T_OUT_DATA]
_error: typing.Optional[T_ERR_DATA]

def __init__(
self,
message: typing.Optional[str] = None,
command: typing.Optional[T_CMD] = None,
command: typing.Optional[T_OS_CMD] = None,
exit_code: typing.Optional[int] = None,
out: typing.Optional[T_OUT_DATA] = None,
error: typing.Optional[T_ERR_DATA] = None,
Expand Down Expand Up @@ -71,7 +76,7 @@ def description(self) -> typing.Optional[str]:
return self._description

@property
def command(self) -> typing.Optional[T_CMD]:
def command(self) -> typing.Optional[T_OS_CMD]:
assert self._command is None or type(self._command) in [str, list]
return self._command

Expand Down Expand Up @@ -120,15 +125,106 @@ def __repr__(self) -> str:
@staticmethod
def convert_and_join(msg_list):
# Convert each byte element in the list to str
str_list = [six.text_type(item, 'utf-8') if isinstance(item, bytes) else six.text_type(item) for item in
msg_list]
str_list = [
six.text_type(item, 'utf-8') if isinstance(item, bytes) else six.text_type(item)
for item in msg_list
]

# Join the list into a single string with the specified delimiter
return six.text_type('\n').join(str_list)


class ExecTimeoutException(TestgresException):
_cmd: T_OS_CMD
_timeout: T_OS_TIMEOUT
_output: typing.Optional[T_OUT_DATA]
_error: typing.Optional[T_ERR_DATA]
_source: typing.Optional[str]

def __init__(
self,
cmd: T_OS_CMD,
timeout: T_OS_TIMEOUT,
output: typing.Optional[T_OUT_DATA] = None,
error: typing.Optional[T_ERR_DATA] = None,
source: typing.Optional[str] = None
):
assert type(cmd) in [str, list]
assert type(timeout) in [int, float]
assert output is None or type(output) in [str, bytes]
assert error is None or type(error) in [str, bytes]
assert source is None or type(source) is str

super().__init__()

self._cmd = cmd
self._timeout = timeout
self._output = output
self._error = error
self._source = source
return

@property
def message(self) -> str:
# Construct a clear log message, similar to the standard subprocess module
r = "Command '{}' timed out after {} second(s).".format(
self._cmd,
self._timeout,
)
assert type(r) is str
return r

@property
def source(self) -> typing.Optional[str]:
return self._source

@property
def cmd(self) -> T_OS_CMD:
return self._cmd

@property
def timeout(self) -> T_OS_TIMEOUT:
return self._timeout

@property
def output(self) -> typing.Optional[T_OUT_DATA]:
return self._output

@property
def error(self) -> typing.Optional[T_ERR_DATA]:
return self._error

def __repr__(self) -> str:
args = []

if self._cmd is not None:
args.append(("cmd", self._cmd))

if self._timeout is not None:
args.append(("timeout", self._timeout))

if self._output is not None:
args.append(("output", self._output))

if self._error is not None:
args.append(("error", self._error))

if self._source is not None:
args.append(("source", self._source))

result = "{}(".format(type(self).__name__)
sep = ""
for a in args:
result += sep + a[0] + "=" + repr(a[1])
sep = ", "
continue
result += ")"
return result


__all__ = [
"TestgresException",
"InvalidOperationException",
"ExecUtilException",
"ExecTimeoutException",
]
Loading