testgres 1.14.0__tar.gz → 1.14.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. {testgres-1.14.0/testgres.egg-info → testgres-1.14.2}/PKG-INFO +1 -1
  2. {testgres-1.14.0 → testgres-1.14.2}/src/__init__.py +5 -5
  3. {testgres-1.14.0 → testgres-1.14.2}/src/node.py +55 -24
  4. {testgres-1.14.0 → testgres-1.14.2}/src/node_app.py +5 -4
  5. {testgres-1.14.0 → testgres-1.14.2/testgres.egg-info}/PKG-INFO +1 -1
  6. {testgres-1.14.0 → testgres-1.14.2}/tests/test_testgres_common.py +98 -1
  7. {testgres-1.14.0 → testgres-1.14.2}/LICENSE +0 -0
  8. {testgres-1.14.0 → testgres-1.14.2}/README.md +0 -0
  9. {testgres-1.14.0 → testgres-1.14.2}/pyproject.toml +0 -0
  10. {testgres-1.14.0 → testgres-1.14.2}/setup.cfg +0 -0
  11. {testgres-1.14.0 → testgres-1.14.2}/src/api.py +0 -0
  12. {testgres-1.14.0 → testgres-1.14.2}/src/backup.py +0 -0
  13. {testgres-1.14.0 → testgres-1.14.2}/src/cache.py +0 -0
  14. {testgres-1.14.0 → testgres-1.14.2}/src/config.py +0 -0
  15. {testgres-1.14.0 → testgres-1.14.2}/src/connection.py +0 -0
  16. {testgres-1.14.0 → testgres-1.14.2}/src/consts.py +0 -0
  17. {testgres-1.14.0 → testgres-1.14.2}/src/decorators.py +0 -0
  18. {testgres-1.14.0 → testgres-1.14.2}/src/defaults.py +0 -0
  19. {testgres-1.14.0 → testgres-1.14.2}/src/enums.py +0 -0
  20. {testgres-1.14.0 → testgres-1.14.2}/src/exceptions.py +0 -0
  21. {testgres-1.14.0 → testgres-1.14.2}/src/impl/internal_utils.py +0 -0
  22. {testgres-1.14.0 → testgres-1.14.2}/src/impl/platforms/internal_platform_utils.py +0 -0
  23. {testgres-1.14.0 → testgres-1.14.2}/src/impl/platforms/internal_platform_utils_factory.py +0 -0
  24. {testgres-1.14.0 → testgres-1.14.2}/src/impl/platforms/linux/internal_platform_utils.py +0 -0
  25. {testgres-1.14.0 → testgres-1.14.2}/src/impl/platforms/win32/internal_platform_utils.py +0 -0
  26. {testgres-1.14.0 → testgres-1.14.2}/src/impl/port_manager__generic.py +0 -0
  27. {testgres-1.14.0 → testgres-1.14.2}/src/impl/port_manager__this_host.py +0 -0
  28. {testgres-1.14.0 → testgres-1.14.2}/src/logger.py +0 -0
  29. {testgres-1.14.0 → testgres-1.14.2}/src/port_manager.py +0 -0
  30. {testgres-1.14.0 → testgres-1.14.2}/src/pubsub.py +0 -0
  31. {testgres-1.14.0 → testgres-1.14.2}/src/raise_error.py +0 -0
  32. {testgres-1.14.0 → testgres-1.14.2}/src/standby.py +0 -0
  33. {testgres-1.14.0 → testgres-1.14.2}/src/utils.py +0 -0
  34. {testgres-1.14.0 → testgres-1.14.2}/testgres.egg-info/SOURCES.txt +0 -0
  35. {testgres-1.14.0 → testgres-1.14.2}/testgres.egg-info/dependency_links.txt +0 -0
  36. {testgres-1.14.0 → testgres-1.14.2}/testgres.egg-info/requires.txt +0 -0
  37. {testgres-1.14.0 → testgres-1.14.2}/testgres.egg-info/top_level.txt +0 -0
  38. {testgres-1.14.0 → testgres-1.14.2}/tests/test_api.py +0 -0
  39. {testgres-1.14.0 → testgres-1.14.2}/tests/test_config.py +0 -0
  40. {testgres-1.14.0 → testgres-1.14.2}/tests/test_os_ops_common.py +0 -0
  41. {testgres-1.14.0 → testgres-1.14.2}/tests/test_os_ops_local.py +0 -0
  42. {testgres-1.14.0 → testgres-1.14.2}/tests/test_os_ops_remote.py +0 -0
  43. {testgres-1.14.0 → testgres-1.14.2}/tests/test_raise_error.py +0 -0
  44. {testgres-1.14.0 → testgres-1.14.2}/tests/test_testgres_local.py +0 -0
  45. {testgres-1.14.0 → testgres-1.14.2}/tests/test_testgres_remote.py +0 -0
  46. {testgres-1.14.0 → testgres-1.14.2}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: testgres
3
- Version: 1.14.0
3
+ Version: 1.14.2
4
4
  Summary: Testing utility for PostgreSQL and its extensions
5
5
  Author-email: Postgres Professional <testgres@postgrespro.ru>
6
6
  License: PostgreSQL
@@ -56,7 +56,7 @@ from testgres.operations.os_ops import OsOperations, ConnectionParams
56
56
  from testgres.operations.local_ops import LocalOperations
57
57
  from testgres.operations.remote_ops import RemoteOperations
58
58
 
59
- __version__ = "1.14.0"
59
+ __version__ = "1.14.2"
60
60
 
61
61
  __all__ = [
62
62
  "get_new_node",
@@ -65,12 +65,12 @@ __all__ = [
65
65
  "TestgresConfig", "configure_testgres", "scoped_config", "push_config", "pop_config",
66
66
  "NodeConnection", "DatabaseError", "InternalError", "ProgrammingError", "OperationalError",
67
67
  "TestgresException", "ExecUtilException", "QueryException",
68
- QueryTimeoutException.__name__,
68
+ "QueryTimeoutException",
69
69
  "TimeoutException", "CatchUpException", "StartNodeException", "InitNodeException", "BackupException", "InvalidOperationException",
70
70
  "XLogMethod", "IsolationLevel", "NodeStatus", "ProcessType", "DumpFormat",
71
- NodeApp.__name__,
72
- PostgresNode.__name__,
73
- PortManager.__name__,
71
+ "NodeApp",
72
+ "PostgresNode",
73
+ "PortManager",
74
74
  "reserve_port", "release_port", "bound_ports", "get_bin_path", "get_pg_config", "get_pg_version",
75
75
  "First", "Any",
76
76
  "OsOperations", "LocalOperations", "RemoteOperations", "ConnectionParams"
@@ -161,6 +161,7 @@ class PostgresNode(object):
161
161
  _C_PM_PID__IS_NOT_DETECTED = -1
162
162
 
163
163
  _name: typing.Optional[str]
164
+ _host: str
164
165
  _port: typing.Optional[int]
165
166
  _bin_dir: str
166
167
  _should_free_port: bool
@@ -168,14 +169,17 @@ class PostgresNode(object):
168
169
  _port_manager: typing.Optional[PortManager]
169
170
  _manually_started_pm_pid: typing.Optional[int]
170
171
 
171
- def __init__(self,
172
- name=None,
173
- base_dir=None,
174
- port: typing.Optional[int] = None,
175
- bin_dir: typing.Optional[str] = None,
176
- prefix=None,
177
- os_ops: typing.Optional[OsOperations] = None,
178
- port_manager: typing.Optional[PortManager] = None):
172
+ def __init__(
173
+ self,
174
+ name=None,
175
+ base_dir=None,
176
+ port: typing.Optional[int] = None,
177
+ bin_dir: typing.Optional[str] = None,
178
+ prefix=None,
179
+ os_ops: typing.Optional[OsOperations] = None,
180
+ port_manager: typing.Optional[PortManager] = None,
181
+ host: typing.Optional[str] = None,
182
+ ):
179
183
  """
180
184
  PostgresNode constructor.
181
185
 
@@ -186,11 +190,13 @@ class PostgresNode(object):
186
190
  bin_dir: path to node's binary directory.
187
191
  os_ops: None or correct OS operation object.
188
192
  port_manager: None or correct port manager object.
193
+ host: None or valid address of node host.
189
194
  """
190
195
  assert port is None or type(port) is int
191
196
  assert bin_dir is None or type(bin_dir) is str
192
197
  assert os_ops is None or isinstance(os_ops, OsOperations)
193
198
  assert port_manager is None or isinstance(port_manager, PortManager)
199
+ assert host is None or type(host) is str
194
200
 
195
201
  # private
196
202
  if os_ops is None:
@@ -219,6 +225,16 @@ class PostgresNode(object):
219
225
  # basic
220
226
  self._name = name or generate_app_name()
221
227
 
228
+ if host is not None:
229
+ assert type(host) is str
230
+ self._host = host
231
+ else:
232
+ self._host = self._os_ops.host
233
+ assert type(self._host) is str
234
+
235
+ if self._host == "":
236
+ raise RuntimeError("PostgresNode host is empty.")
237
+
222
238
  if port is not None:
223
239
  assert type(port) is int
224
240
  assert port_manager is None
@@ -249,10 +265,6 @@ class PostgresNode(object):
249
265
  self.cleanup_on_bad_exit = testgres_config.node_cleanup_on_bad_exit
250
266
  self.shutdown_max_attempts = 3
251
267
 
252
- # NOTE: for compatibility
253
- self.utils_log_name = self.utils_log_file
254
- self.pg_log_name = self.pg_log_file
255
-
256
268
  # Node state
257
269
  self._manually_started_pm_pid = None
258
270
 
@@ -317,6 +329,7 @@ class PostgresNode(object):
317
329
  assert isinstance(self._port_manager, PortManager)
318
330
  assert self._os_ops is not None
319
331
  assert isinstance(self._os_ops, OsOperations)
332
+ assert type(self._host) is str
320
333
 
321
334
  node = PostgresNode(
322
335
  name=name,
@@ -324,7 +337,9 @@ class PostgresNode(object):
324
337
  bin_dir=self._bin_dir,
325
338
  prefix=self._prefix,
326
339
  os_ops=self._os_ops,
327
- port_manager=self._port_manager)
340
+ port_manager=self._port_manager,
341
+ host=self._host,
342
+ )
328
343
 
329
344
  return node
330
345
 
@@ -348,9 +363,9 @@ class PostgresNode(object):
348
363
 
349
364
  @property
350
365
  def host(self) -> str:
351
- assert self._os_ops is not None
352
- assert isinstance(self._os_ops, OsOperations)
353
- return self._os_ops.host
366
+ assert self._host is not None
367
+ assert type(self._host) is str
368
+ return self._host
354
369
 
355
370
  @property
356
371
  def port(self) -> int:
@@ -467,7 +482,7 @@ class PostgresNode(object):
467
482
  assert type(self.master) is PostgresNode
468
483
 
469
484
  # master should be on the same host
470
- assert self.master.host == self.host
485
+ assert self.master.host == self._host
471
486
 
472
487
  with self.master.connect() as con:
473
488
  for row in con.execute(sql, self.name):
@@ -540,6 +555,16 @@ class PostgresNode(object):
540
555
  assert type(path) is str
541
556
  return path
542
557
 
558
+ # NOTE: for compatibility
559
+ @property
560
+ def utils_log_name(self) -> str:
561
+ return self.utils_log_file
562
+
563
+ # NOTE: for compatibility
564
+ @property
565
+ def pg_log_name(self) -> str:
566
+ return self.pg_log_file
567
+
543
568
  @property
544
569
  def version(self):
545
570
  """
@@ -838,7 +863,7 @@ class PostgresNode(object):
838
863
  self.append_conf(fsync=fsync,
839
864
  max_worker_processes=MAX_WORKER_PROCESSES,
840
865
  log_statement=log_statement,
841
- listen_addresses=self.host,
866
+ listen_addresses=self._host,
842
867
  port=self.port) # yapf:disable
843
868
 
844
869
  # common replication settings
@@ -929,6 +954,12 @@ class PostgresNode(object):
929
954
  return x.node_status
930
955
 
931
956
  def _get_node_state(self) -> utils.PostgresNodeState:
957
+ if self._base_dir is None:
958
+ return utils.PostgresNodeState(
959
+ node_status=NodeStatus.Uninitialized,
960
+ pid=None,
961
+ )
962
+
932
963
  return utils.get_pg_node_state(
933
964
  self._os_ops,
934
965
  self.bin_dir,
@@ -1453,7 +1484,7 @@ class PostgresNode(object):
1453
1484
  raise Exception("Input data must be None or bytes.")
1454
1485
 
1455
1486
  if host is None:
1456
- host = self.host
1487
+ host = self._host
1457
1488
 
1458
1489
  if port is None:
1459
1490
  port = self.port
@@ -1580,7 +1611,7 @@ class PostgresNode(object):
1580
1611
  _params = [
1581
1612
  self._get_bin_path("pg_dump"),
1582
1613
  "-p", str(self.port),
1583
- "-h", self.host,
1614
+ "-h", self._host,
1584
1615
  "-f", filename,
1585
1616
  "-U", username or self._os_ops.username,
1586
1617
  "-d", dbname or default_dbname(),
@@ -1612,7 +1643,7 @@ class PostgresNode(object):
1612
1643
  _params = [
1613
1644
  self._get_bin_path("pg_restore"),
1614
1645
  "-p", str(self.port),
1615
- "-h", self.host,
1646
+ "-h", self._host,
1616
1647
  "-U", username,
1617
1648
  "-d", dbname,
1618
1649
  filename
@@ -1620,7 +1651,7 @@ class PostgresNode(object):
1620
1651
 
1621
1652
  # try pg_restore if dump is binary format, and psql if not
1622
1653
  try:
1623
- execute_utility2(self._os_ops, _params, self.utils_log_name)
1654
+ execute_utility2(self._os_ops, _params, self.utils_log_file)
1624
1655
  except ExecUtilException:
1625
1656
  self.psql(filename=filename, dbname=dbname, username=username)
1626
1657
 
@@ -1888,7 +1919,7 @@ class PostgresNode(object):
1888
1919
  _params = [
1889
1920
  self._get_bin_path("pgbench"),
1890
1921
  "-p", str(self.port),
1891
- "-h", self.host,
1922
+ "-h", self._host,
1892
1923
  "-U", username or self._os_ops.username
1893
1924
  ] + options # yapf: disable
1894
1925
 
@@ -1961,7 +1992,7 @@ class PostgresNode(object):
1961
1992
  _params = [
1962
1993
  self._get_bin_path("pgbench"),
1963
1994
  "-p", str(self.port),
1964
- "-h", self.host,
1995
+ "-h", self._host,
1965
1996
  "-U", username or self._os_ops.username
1966
1997
  ] + options # yapf: disable
1967
1998
 
@@ -99,7 +99,7 @@ class NodeApp:
99
99
  port=port,
100
100
  bin_dir=bin_dir,
101
101
  os_ops=self._os_ops,
102
- port_manager=port_manager
102
+ port_manager=port_manager,
103
103
  )
104
104
 
105
105
  try:
@@ -150,7 +150,10 @@ class NodeApp:
150
150
 
151
151
  node.init(
152
152
  initdb_params=final_initdb_params,
153
- allow_streaming=set_replication
153
+ # params for node.default_conf
154
+ fsync=False,
155
+ allow_streaming=set_replication,
156
+ log_statement="none",
154
157
  )
155
158
 
156
159
  # set major version
@@ -164,11 +167,9 @@ class NodeApp:
164
167
  options = {
165
168
  'max_connections': 100,
166
169
  'shared_buffers': '10MB',
167
- 'fsync': 'off',
168
170
  'wal_level': 'logical',
169
171
  'hot_standby': 'off',
170
172
  'log_line_prefix': '%t [%p]: [%l-1] ',
171
- 'log_statement': 'none',
172
173
  'log_duration': 'on',
173
174
  'log_min_duration_statement': 0,
174
175
  'log_connections': 'on',
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: testgres
3
- Version: 1.14.0
3
+ Version: 1.14.2
4
4
  Summary: Testing utility for PostgreSQL and its extensions
5
5
  Author-email: Postgres Professional <testgres@postgrespro.ru>
6
6
  License: PostgreSQL
@@ -51,6 +51,7 @@ import subprocess
51
51
  import typing
52
52
  import types
53
53
  import psutil
54
+ import testgres.postgres_configuration as testgres_pgconf
54
55
 
55
56
  from packaging.version import Version
56
57
 
@@ -95,7 +96,7 @@ class TestTestgresCommon:
95
96
  # Author: Mark G.
96
97
  assert v.major == 1
97
98
  assert v.minor == 14
98
- assert v.micro == 0
99
+ assert v.micro == 2
99
100
 
100
101
  assert str(v) == testgres_version
101
102
  return
@@ -132,7 +133,53 @@ class TestTestgresCommon:
132
133
  assert (isinstance(node.version, PgVer))
133
134
  assert (node.version == PgVer(version))
134
135
 
136
+ def test_node_constructor__default(self):
137
+ node = PostgresNode()
138
+ assert node._os_ops is not None
139
+ assert isinstance(node._os_ops, OsOperations)
140
+ assert node._port_manager is not None
141
+ assert isinstance(node._port_manager, PortManager)
142
+ assert node._name is not None
143
+ assert type(node._name) is str
144
+ assert node._name != ""
145
+ assert node._base_dir is None
146
+ return
147
+
148
+ def test_node_constructor__host(self):
149
+ C_HOST = "AbCdE"
150
+
151
+ unique_id = uuid.uuid4().hex
152
+
153
+ with PostgresNode(host=C_HOST) as node:
154
+ assert node._host == C_HOST
155
+ assert node.host == C_HOST
156
+ assert isinstance(node.os_ops, OsOperations)
157
+
158
+ tmpdir = node.os_ops.get_tempdir()
159
+ nodedir2 = node.os_ops.build_path(tmpdir, "node2--" + unique_id)
160
+
161
+ C_NODE2_NAME = "node2"
162
+
163
+ with node.clone_with_new_name_and_base_dir(
164
+ name=C_NODE2_NAME,
165
+ base_dir=nodedir2,
166
+ ) as node2:
167
+ assert node2 is not None
168
+ assert node2 is not node
169
+
170
+ assert node2._host == C_HOST
171
+ assert node2.host == C_HOST
172
+
173
+ assert node2._name == C_NODE2_NAME
174
+ assert node2._base_dir == nodedir2
175
+ assert node2._port != node._port
176
+ assert node2._os_ops is node._os_ops
177
+ assert node2._port_manager is node._port_manager
178
+ return
179
+
135
180
  def test_node_repr(self, node_svc: PostgresNodeService):
181
+ assert isinstance(node_svc, PostgresNodeService)
182
+
136
183
  with __class__.helper__get_node(node_svc).init() as node:
137
184
  pattern = r"PostgresNode\(name='.+', port=.+, base_dir='.+'\)"
138
185
  assert re.match(pattern, str(node)) is not None
@@ -2714,6 +2761,56 @@ where c.relname=%s;"""
2714
2761
  node_svc.os_ops.rmdirs(tmp_dir)
2715
2762
  return
2716
2763
 
2764
+ def test_node_app__make_empty_and_pgconf(self, node_svc: PostgresNodeService):
2765
+ assert type(node_svc) is PostgresNodeService
2766
+
2767
+ assert type(node_svc) is PostgresNodeService
2768
+
2769
+ assert isinstance(node_svc.os_ops, OsOperations)
2770
+ assert node_svc.port_manager is not None
2771
+ assert isinstance(node_svc.port_manager, PortManager)
2772
+
2773
+ tmp_dir = node_svc.os_ops.mkdtemp()
2774
+ assert tmp_dir is not None
2775
+ assert type(tmp_dir) is str
2776
+ logging.info("temp directory is [{}]".format(tmp_dir))
2777
+
2778
+ # -----------
2779
+ node_app = NodeApp(
2780
+ test_path=tmp_dir,
2781
+ os_ops=node_svc.os_ops,
2782
+ port_manager=node_svc.port_manager
2783
+ )
2784
+
2785
+ # TODO: We have to use node_svc.os_ops here
2786
+
2787
+ with node_app.make_simple("abc") as node:
2788
+ node_conf = testgres_pgconf.PostgresConfiguration(node.data_dir)
2789
+
2790
+ logging.info("Configuration is readed ...")
2791
+ testgres_pgconf.PostgresConfigurationReader.LoadConfiguration(node_conf)
2792
+
2793
+ logging.info("Configuration is checked ...")
2794
+ prop__port = node_conf.GetOptionValue("port")
2795
+ assert type(prop__port) is int
2796
+ assert prop__port == node.port
2797
+ # presets are checked
2798
+ prop__fsync = node_conf.GetOptionValue("fsync")
2799
+ assert prop__fsync == "off" or prop__fsync is False
2800
+ prop__log_statement = node_conf.GetOptionValue("log_statement")
2801
+ assert type(prop__log_statement) is str
2802
+ assert prop__log_statement == "none"
2803
+ prop__wal_level = node_conf.GetOptionValue("wal_level")
2804
+ assert type(prop__wal_level) is str
2805
+ assert prop__wal_level == "logical"
2806
+
2807
+ logging.info("Configuration is written ...")
2808
+ testgres_pgconf.PostgresConfigurationWriter.WriteConfiguration(node_conf)
2809
+
2810
+ logging.info("Node is started ...")
2811
+ node.slow_start()
2812
+ return
2813
+
2717
2814
  @staticmethod
2718
2815
  def helper__get_node(
2719
2816
  node_svc: PostgresNodeService,
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes