From 5e3c0f3327ceee5e9418d86637018403857d98e5 Mon Sep 17 00:00:00 2001 From: Ivan Kartyshov Date: Sun, 4 Feb 2018 19:50:47 +0300 Subject: [PATCH 01/10] adding key -F to pg_dump --- setup.py | 0 testgres/node.py | 12 ++-- tests/test_pgdump.py | 140 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 148 insertions(+), 4 deletions(-) mode change 100644 => 100755 setup.py create mode 100755 tests/test_pgdump.py diff --git a/setup.py b/setup.py old mode 100644 new mode 100755 diff --git a/testgres/node.py b/testgres/node.py index b2a8cf20..18cf3be1 100644 --- a/testgres/node.py +++ b/testgres/node.py @@ -583,8 +583,8 @@ def cleanup(self, max_attempts=3): def psql(self, dbname, query=None, - filename=None, username=None, + filename=None, input=None): """ Execute a query using psql. @@ -658,7 +658,7 @@ def safe_psql(self, dbname, query, username=None, input=None): return out - def dump(self, dbname, username=None, filename=None): + def dump(self, dbname, username=None, filename=None, formate=None): """ Dump database into a file using pg_dump. NOTE: the file is not removed automatically. @@ -667,6 +667,7 @@ def dump(self, dbname, username=None, filename=None): dbname: database name to connect to. username: database user name. filename: output file. + formate: format argument p/c/d/t Returns: Path to a file containing dump. @@ -674,6 +675,7 @@ def dump(self, dbname, username=None, filename=None): # Set default arguments username = username or _default_username() + formate = formate or "p" f, filename = filename or tempfile.mkstemp() os.close(f) @@ -684,7 +686,8 @@ def dump(self, dbname, username=None, filename=None): "-h", self.host, "-f", filename, "-U", username, - "-d", dbname + "-d", dbname, + "-F", formate ] _execute_utility(_params, self.utils_log_name) @@ -697,10 +700,11 @@ def restore(self, dbname, filename, username=None): Args: dbname: database name to connect to. + username: database user name. filename: database dump taken by pg_dump. """ - self.psql(dbname=dbname, filename=filename, username=username) + self.psql(dbname=dbname, username=username, filename=filename) def poll_query_until(self, dbname, diff --git a/tests/test_pgdump.py b/tests/test_pgdump.py new file mode 100755 index 00000000..9ebf2b81 --- /dev/null +++ b/tests/test_pgdump.py @@ -0,0 +1,140 @@ +#!/usr/bin/env python +# coding: utf-8 + +import os +import subprocess +import tempfile +import testgres +import time +import unittest + +import pdb + +import logging.config + +from distutils.version import LooseVersion + +from testgres import \ + InitNodeException, \ + StartNodeException, \ + ExecUtilException, \ + BackupException, \ + QueryException, \ + CatchUpException, \ + TimeoutException + +from testgres import \ + TestgresConfig, \ + configure_testgres + +from testgres import \ + NodeStatus, \ + IsolationLevel, \ + get_new_node + +from testgres import \ + get_bin_path, \ + get_pg_config + +from testgres import bound_ports + +# FIRST test from past +# with testgres.get_new_node('test') as node: +# node.init() # run initdb +# node.start() # start PostgreSQL +# #print(node.execute('postgres', 'select 1')) +# #print(node.psql('postgres', 'select 1')) +# print(node.connect('postgres', 'vis')) +# with node.connect() as con: +# con.begin('serializable') +# print(con.execute('select %s', 1)) +# con.rollback() +# node.stop() # stop PostgreSQL + + +# test replication behavoiur on HOT_STANDBY_FEEDBACK +# def set_trace(con, command="pg_debug"): +# pid = con.execute("select pg_backend_pid()")[0][0] +# p = subprocess.Popen([command], stdin=subprocess.PIPE) +# p.communicate(str(pid).encode()) + +# with get_new_node() as master: +# master.init().start() +# with master.backup() as backup: +# with backup.spawn_replica() as replica: +# replica = replica.start() +# master.execute('postgres', 'create table test (val int4)') +# master.execute('postgres', 'insert into test values (0), (1), (2)') +# replica.catchup() # wait until changes are visible +# with replica.connect() as con1: +# set_trace(con1) +# import pdb; pdb.set_trace() # Важно,если последний идет pdb,то pass +# pass + + # print(replica.execute('postgres', 'select count(*) from test')) + #print(replica.execute('postgres', ':gdb')) + + + +# SECOND test dump new keys +with get_new_node('node1') as node1: + node1.init().start() + + with node1.connect('postgres') as con: + con.begin() + con.execute('create table test (val int)') + con.execute('insert into test values (1), (2)') + con.commit() + + # take a new dump plain format + dump = node1.dump('postgres') + # self.assertTrue(os.path.isfile(dump)) + with get_new_node('node2') as node2: + node2.init().start().restore('postgres', dump) + res = node2.execute('postgres','select * from test order by val asc') + # self.assertListEqual(res, [(1, ), (2, )]) + # finally, remove dump + os.remove(dump) + + # take a new dump custom format + dump = node1.dump('postgres') + with get_new_node('node2') as node2: + node2.init().start().restore('postgres', dump) + res = node2.execute('postgres','select * from test order by val asc') + os.remove(dump) + + # take a new dump directory format + dump = node1.dump('postgres') + with get_new_node('node2') as node2: + node2.init().start().restore('postgres', dump) + res = node2.execute('postgres','select * from test order by val asc') + os.remove(dump) + + # take a new dump tar format + dump = node1.dump('postgres') + with get_new_node('node2') as node2: + node2.init().start().restore('postgres', dump) + res = node2.execute('postgres','select * from test order by val asc') + os.remove(dump) + + # take a new dump tar format + dump = node1.dump('postgres') + with get_new_node('node2') as node2: + node2.init().start().restore('postgres', dump) + res = node2.execute('postgres','select * from test order by val asc') + os.remove(dump) + +# 1) make dump to new place +# pg_dump mydb > db.sql +# 2) make dump to non default formate +# 2.5) Чтобы сформировать выгрузку в формате plain: +# pg_dump -Fp mydb > db.dump +# 2.1) Чтобы сформировать выгрузку в формате custom: +# pg_dump -Fc mydb > db.dump +# 2.2) Чтобы сформировать выгрузку в формате directory: +# pg_dump -Fd mydb -f dumpdir +# 2.3) ? Чтобы сформировать выгрузку в формате directory в 5 параллельных потоков: +# pg_dump -Fd mydb -j 5 -f dumpdir +# 2.4) Чтобы сформировать выгрузку в формате tar: +# pg_dump -Ft mydb > db.dump + From c40d93997429936dee9ed2230b9dcdbd3409bb6e Mon Sep 17 00:00:00 2001 From: Ivan Kartyshov Date: Sat, 28 Apr 2018 16:51:52 +0300 Subject: [PATCH 02/10] Tests fix and cleanup code --- testgres/consts.py | 3 ++ testgres/node.py | 21 +++--------- tests/test_simple.py | 81 +++++++------------------------------------- 3 files changed, 20 insertions(+), 85 deletions(-) diff --git a/testgres/consts.py b/testgres/consts.py index 0acdefa5..44650c6c 100644 --- a/testgres/consts.py +++ b/testgres/consts.py @@ -13,6 +13,9 @@ UTILS_LOG_FILE = "utils.log" BACKUP_LOG_FILE = "backup.log" +# name of dump/restore formates +DUMP_DIRECTORY = "directory" + # default argument values DEFAULT_XLOG_METHOD = "fetch" DEFAULT_DUMP_FORMAT = "plain" diff --git a/testgres/node.py b/testgres/node.py index 756a3fb6..cc11847e 100644 --- a/testgres/node.py +++ b/testgres/node.py @@ -29,7 +29,8 @@ PG_LOG_FILE, \ UTILS_LOG_FILE, \ DEFAULT_XLOG_METHOD, \ - DEFAULT_DUMP_FORMAT + DEFAULT_DUMP_FORMAT, \ + DUMP_DIRECTORY from .exceptions import \ CatchUpException, \ @@ -705,7 +706,7 @@ def dump(self, filename=None, dbname=None, username=None, format=DEFAULT_DUMP_FO """ def tmpfile(): - if format == 'directory': + if format == DUMP_DIRECTORY: fname = tempfile.mkdtemp() else: fd, fname = tempfile.mkstemp() @@ -743,17 +744,6 @@ def restore(self, filename, dbname=None, username=None): username: database user name. """ - # self.psql(filename=filename, dbname=dbname, username=username) - # yapf: disable - # _params = [ - # get_bin_path("pg_restore"), - # "-p", str(self.port), - # "-h", self.host, - # filename, - # "-U", username, - # "-d", dbname - # ] - # Set default arguments dbname = dbname or default_dbname() username = username or default_username() @@ -762,13 +752,10 @@ def restore(self, filename, dbname=None, username=None): get_bin_path("pg_restore"), "-p", str(self.port), "-h", self.host, - # filename, - # "-c", - # "-U", username, + "-U", username, "-d", dbname, filename ] - print(_params) execute_utility(_params, self.utils_log_name) diff --git a/tests/test_simple.py b/tests/test_simple.py index 2f16ae07..bbfc2167 100755 --- a/tests/test_simple.py +++ b/tests/test_simple.py @@ -11,8 +11,6 @@ import logging.config import shutil -import pdb - from distutils.version import LooseVersion from testgres import \ @@ -375,96 +373,43 @@ def test_dump(self): dump = node1.dump() self.assertTrue(os.path.isfile(dump)) with get_new_node().init().start() as node2: - # restore dump - node2.restore(filename=dump) + node2.psql(filename=dump, dbname=None, username=None) res = node2.execute(query_select) self.assertListEqual(res, [(1, ), (2, )]) - # finally, remove dump os.remove(dump) - def test_dump_plain(self): - query_create = 'create table test as select generate_series(1, 2) as val' - query_select = 'select * from test order by val asc' - - with get_new_node().init().start() as node1: - - node1.execute(query_create) - - # take a new dump plain format dump = node1.dump(format='plain') self.assertTrue(os.path.isfile(dump)) - with get_new_node().init().start() as node2: - # node2.restore(filename=dump) - node2.psql(filename=dump, dbname=None, username=None) #add - res = node2.execute(query_select) + with get_new_node().init().start() as node3: + node3.psql(filename=dump, dbname=None, username=None) + res = node3.execute(query_select) self.assertListEqual(res, [(1, ), (2, )]) os.remove(dump) - # with get_new_node().init().start() as node2: - # for f in ['plain', 'custom', 'directory', 'tar']: - # # dump - # dump = node1.dump(format=f) - # # create database - # # connect - # # restore - # node2.restore(filename=f) - # # check - # res = node2.execute(query_select) - # self.assertListEqual(res, [(1, ), (2, )]) - # # drop database - # os.remove(f) - - def test_dump_custom(self): - query_create = 'create table test as select generate_series(1, 2) as val' - query_select = 'select * from test order by val asc' - - with get_new_node().init().start() as node1: - - node1.execute(query_create) - # take a new dump custom format dump = node1.dump(format='custom') self.assertTrue(os.path.isfile(dump)) - with get_new_node().init().start() as node2: - node2.restore(filename=dump) - res = node2.execute(query_select) - print(res) + with get_new_node().init().start() as node4: + node4.restore(filename=dump) + res = node4.execute(query_select) self.assertListEqual(res, [(1, ), (2, )]) os.remove(dump) - def test_dump_directory(self): - query_create = 'create table test as select generate_series(1, 2) as val' - query_select = 'select * from test order by val asc' - - with get_new_node().init().start() as node1: - - node1.execute(query_create) - # take a new dump directory format dump = node1.dump(format='directory') self.assertTrue(os.path.isdir(dump)) - with get_new_node().init().start() as node2: - node2.restore(filename=dump) - res = node2.execute(query_select) + with get_new_node().init().start() as node5: + node5.restore(filename=dump) + res = node5.execute(query_select) self.assertListEqual(res, [(1, ), (2, )]) shutil.rmtree(dump, ignore_errors=True) - def test_dump_tar(self): - query_create = 'create table test as select generate_series(1, 2) as val' - query_select = 'select * from test order by val asc' - - with get_new_node().init().start() as node1: - - node1.execute(query_create) - # take a new dump tar format dump = node1.dump(format='tar') self.assertTrue(os.path.isfile(dump)) - with get_new_node().init().start() as node2: - node2.restore(filename=dump) - print("Restore finished") - pdb.set_trace() - res = node2.execute(query_select) + with get_new_node().init().start() as node6: + node6.restore(filename=dump) + res = node6.execute(query_select) self.assertListEqual(res, [(1, ), (2, )]) os.remove(dump) From 458e2b0891d608b249a3d8e92e932c5dddc0627b Mon Sep 17 00:00:00 2001 From: Ivan Kartyshov Date: Sat, 28 Apr 2018 18:22:57 +0300 Subject: [PATCH 03/10] Fixes and flake8 cleanups --- testgres/consts.py | 4 ---- testgres/enums.py | 11 +++++++++++ testgres/node.py | 29 +++++++++++++++-------------- tests/test_simple.py | 1 - 4 files changed, 26 insertions(+), 19 deletions(-) diff --git a/testgres/consts.py b/testgres/consts.py index bad852b8..123a034c 100644 --- a/testgres/consts.py +++ b/testgres/consts.py @@ -25,10 +25,6 @@ UTILS_LOG_FILE = "utils.log" BACKUP_LOG_FILE = "backup.log" -# name of dump/restore formates -DUMP_DIRECTORY = "directory" -DEFAULT_DUMP_FORMAT = "plain" - # defaults for node settings MAX_REPLICATION_SLOTS = 10 MAX_WAL_SENDERS = 10 diff --git a/testgres/enums.py b/testgres/enums.py index 1f6869de..fb68f2bb 100644 --- a/testgres/enums.py +++ b/testgres/enums.py @@ -85,3 +85,14 @@ def from_process(process): # default return ProcessType.Unknown + + +class DumpFormat(Enum): + """ + Available dump formats + """ + + Plain = 'plain' + Custom = 'custom' + Directory = 'directory' + Tar = 'tar' diff --git a/testgres/node.py b/testgres/node.py index 24e66cfc..a2595c55 100644 --- a/testgres/node.py +++ b/testgres/node.py @@ -10,7 +10,10 @@ from six import raise_from, iteritems from tempfile import mkstemp, mkdtemp -from .enums import NodeStatus, ProcessType +from .enums import \ + NodeStatus, \ + ProcessType, \ + DumpFormat from .cache import cached_initdb @@ -32,8 +35,6 @@ RECOVERY_CONF_FILE, \ PG_LOG_FILE, \ UTILS_LOG_FILE, \ - DEFAULT_DUMP_FORMAT, \ - DUMP_DIRECTORY, \ PG_PID_FILE from .consts import \ @@ -805,23 +806,27 @@ def safe_psql(self, query=None, **kwargs): return out - def dump(self, filename=None, dbname=None, username=None, format=DEFAULT_DUMP_FORMAT): + def dump(self, + filename=None, + dbname=None, + username=None, + format=DumpFormat.Plain): """ Dump database into a file using pg_dump. NOTE: the file is not removed automatically. Args: + filename: database dump taken by pg_dump. dbname: database name to connect to. username: database user name. - filename: output file. - format: format argument plain/custom/directory/tar + format: format argument plain/custom/directory/tar. Returns: Path to a file containing dump. """ def tmpfile(): - if format == DUMP_DIRECTORY: + if format == DumpFormat.Directory: fname = mkdtemp(prefix=TMP_DUMP) else: fd, fname = mkstemp(prefix=TMP_DUMP) @@ -852,7 +857,7 @@ def restore(self, filename, dbname=None, username=None): Restore database from pg_dump's file. Args: - filename: input file. + filename: database dump taken by pg_dump in custom/directory/tar formats. dbname: database name to connect to. username: database user name. """ @@ -862,17 +867,13 @@ def restore(self, filename, dbname=None, username=None): username = username or default_username() _params = [ - get_bin_path("pg_restore"), - "-p", str(self.port), - "-h", self.host, - "-U", username, - "-d", dbname, + get_bin_path("pg_restore"), "-p", + str(self.port), "-h", self.host, "-U", username, "-d", dbname, filename ] execute_utility(_params, self.utils_log_name) - @method_decorator(positional_args_hack(['dbname', 'query'])) def poll_query_until(self, query, diff --git a/tests/test_simple.py b/tests/test_simple.py index 8b4b7c60..5caf3628 100755 --- a/tests/test_simple.py +++ b/tests/test_simple.py @@ -10,7 +10,6 @@ import unittest import logging.config -import shutil from contextlib import contextmanager from distutils.version import LooseVersion From b7cdcb760ce95e7519101d1e5d5a2e85fa33ade6 Mon Sep 17 00:00:00 2001 From: Ivan Kartyshov Date: Sun, 29 Apr 2018 00:28:40 +0300 Subject: [PATCH 04/10] Fix tests using enum --- testgres/node.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/testgres/node.py b/testgres/node.py index a2595c55..3e42f87c 100644 --- a/testgres/node.py +++ b/testgres/node.py @@ -810,7 +810,7 @@ def dump(self, filename=None, dbname=None, username=None, - format=DumpFormat.Plain): + format=DumpFormat.Plain.value): """ Dump database into a file using pg_dump. NOTE: the file is not removed automatically. @@ -826,7 +826,7 @@ def dump(self, """ def tmpfile(): - if format == DumpFormat.Directory: + if format == DumpFormat.Directory.value: fname = mkdtemp(prefix=TMP_DUMP) else: fd, fname = mkstemp(prefix=TMP_DUMP) From a4d1ab931139e57b8072fdc0cc033e5348766df5 Mon Sep 17 00:00:00 2001 From: Ivan Kartyshov Date: Sun, 29 Apr 2018 13:55:10 +0300 Subject: [PATCH 05/10] changes for test coverage --- tests/test_simple.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/test_simple.py b/tests/test_simple.py index 5caf3628..a89f4991 100755 --- a/tests/test_simple.py +++ b/tests/test_simple.py @@ -428,13 +428,13 @@ def test_dump(self): node1.execute(query_create) # take a new dump plain format - dump = node1.dump() - self.assertTrue(os.path.isfile(dump)) - with get_new_node().init().start() as node2: - node2.psql(filename=dump, dbname=None, username=None) - res = node2.execute(query_select) - self.assertListEqual(res, [(1, ), (2, )]) - os.remove(dump) + with removing(node1.dump()) as dump: + with get_new_node().init().start() as node2: + # restore dump + self.assertTrue(os.path.isfile(dump)) + node2.psql(filename=dump, dbname=None, username=None) + res = node2.execute(query_select) + self.assertListEqual(res, [(1, ), (2, )]) dump = node1.dump(format='plain') self.assertTrue(os.path.isfile(dump)) From a656ac1fc7b653f304c909b40d676c1c4a3b0db9 Mon Sep 17 00:00:00 2001 From: Ivan Kartyshov Date: Tue, 8 May 2018 13:43:44 +0300 Subject: [PATCH 06/10] pg_dump enum using cleanup --- testgres/node.py | 21 +++++++++++++++++---- tests/test_simple.py | 4 ++-- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/testgres/node.py b/testgres/node.py index 3e42f87c..5bcab2f7 100644 --- a/testgres/node.py +++ b/testgres/node.py @@ -810,7 +810,7 @@ def dump(self, filename=None, dbname=None, username=None, - format=DumpFormat.Plain.value): + format=DumpFormat.Plain): """ Dump database into a file using pg_dump. NOTE: the file is not removed automatically. @@ -825,8 +825,17 @@ def dump(self, Path to a file containing dump. """ + # Check arguments + if not isinstance(format, DumpFormat): + try: + format = DumpFormat(format) + except ValueError: + msg = 'Invalid format "{}"'.format(format) + raise BackupException(msg) + + # Generate tmpfile or tmpdir def tmpfile(): - if format == DumpFormat.Directory.value: + if format == DumpFormat.Directory: fname = mkdtemp(prefix=TMP_DUMP) else: fd, fname = mkstemp(prefix=TMP_DUMP) @@ -845,7 +854,7 @@ def tmpfile(): "-f", filename, "-U", username, "-d", dbname, - "-F", format + "-F", format.value ] # yapf: disable execute_utility(_params, self.utils_log_file) @@ -872,7 +881,11 @@ def restore(self, filename, dbname=None, username=None): filename ] - execute_utility(_params, self.utils_log_name) + # try pg_restore if dump is binary formate, and psql if not + try: + execute_utility(_params, self.utils_log_name) + except ExecUtilException as e: + self.psql(filename=filename, dbname=dbname, username=username) @method_decorator(positional_args_hack(['dbname', 'query'])) def poll_query_until(self, diff --git a/tests/test_simple.py b/tests/test_simple.py index a89f4991..2b772ad9 100755 --- a/tests/test_simple.py +++ b/tests/test_simple.py @@ -432,14 +432,14 @@ def test_dump(self): with get_new_node().init().start() as node2: # restore dump self.assertTrue(os.path.isfile(dump)) - node2.psql(filename=dump, dbname=None, username=None) + node2.restore(filename=dump) res = node2.execute(query_select) self.assertListEqual(res, [(1, ), (2, )]) dump = node1.dump(format='plain') self.assertTrue(os.path.isfile(dump)) with get_new_node().init().start() as node3: - node3.psql(filename=dump, dbname=None, username=None) + node3.restore(filename=dump) res = node3.execute(query_select) self.assertListEqual(res, [(1, ), (2, )]) os.remove(dump) From 66cc9a6d5da206ec19784b957b2b2f7e8f35bc7b Mon Sep 17 00:00:00 2001 From: Ivan Kartyshov Date: Tue, 8 May 2018 14:07:22 +0300 Subject: [PATCH 07/10] Cleanup --- testgres/node.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/testgres/node.py b/testgres/node.py index 5bcab2f7..574f4743 100644 --- a/testgres/node.py +++ b/testgres/node.py @@ -57,7 +57,8 @@ QueryException, \ StartNodeException, \ TimeoutException, \ - TestgresException + TestgresException, \ + BackupException from .logger import TestgresLogger @@ -884,7 +885,7 @@ def restore(self, filename, dbname=None, username=None): # try pg_restore if dump is binary formate, and psql if not try: execute_utility(_params, self.utils_log_name) - except ExecUtilException as e: + except ExecUtilException: self.psql(filename=filename, dbname=dbname, username=username) @method_decorator(positional_args_hack(['dbname', 'query'])) From 70aa1daa55e4f791ddce0949297ff9ca0263e8ba Mon Sep 17 00:00:00 2001 From: Ivan Kartyshov Date: Tue, 8 May 2018 16:55:21 +0300 Subject: [PATCH 08/10] Test_dump refactoring --- tests/test_simple.py | 47 ++++++++++++-------------------------------- 1 file changed, 13 insertions(+), 34 deletions(-) diff --git a/tests/test_simple.py b/tests/test_simple.py index 899e45f0..42e77a54 100755 --- a/tests/test_simple.py +++ b/tests/test_simple.py @@ -67,6 +67,8 @@ def removing(f): finally: if os.path.isfile(f): os.remove(f) + elif os.path.isdir(f): + rmtree(f, ignore_errors=True) class TestgresTests(unittest.TestCase): @@ -436,40 +438,17 @@ def test_dump(self): res = node2.execute(query_select) self.assertListEqual(res, [(1, ), (2, )]) - dump = node1.dump(format='plain') - self.assertTrue(os.path.isfile(dump)) - with get_new_node().init().start() as node3: - node3.restore(filename=dump) - res = node3.execute(query_select) - self.assertListEqual(res, [(1, ), (2, )]) - os.remove(dump) - - # take a new dump custom format - dump = node1.dump(format='custom') - self.assertTrue(os.path.isfile(dump)) - with get_new_node().init().start() as node4: - node4.restore(filename=dump) - res = node4.execute(query_select) - self.assertListEqual(res, [(1, ), (2, )]) - os.remove(dump) - - # take a new dump directory format - dump = node1.dump(format='directory') - self.assertTrue(os.path.isdir(dump)) - with get_new_node().init().start() as node5: - node5.restore(filename=dump) - res = node5.execute(query_select) - self.assertListEqual(res, [(1, ), (2, )]) - rmtree(dump, ignore_errors=True) - - # take a new dump tar format - dump = node1.dump(format='tar') - self.assertTrue(os.path.isfile(dump)) - with get_new_node().init().start() as node6: - node6.restore(filename=dump) - res = node6.execute(query_select) - self.assertListEqual(res, [(1, ), (2, )]) - os.remove(dump) + for format in ['plain', 'custom', 'directory', 'tar']: + with removing(node1.dump(format=format)) as dump: + with get_new_node().init().start() as node3: + if format == 'directory': + self.assertTrue(os.path.isdir(dump)) + else: + self.assertTrue(os.path.isfile(dump)) + # restore dump + node3.restore(filename=dump) + res = node3.execute(query_select) + self.assertListEqual(res, [(1, ), (2, )]) def test_users(self): with get_new_node().init().start() as node: From edcf4c66f8c3106e4b752a9cd7f87369f88fb267 Mon Sep 17 00:00:00 2001 From: Ivan Kartyshov Date: Tue, 8 May 2018 17:00:16 +0300 Subject: [PATCH 09/10] Cleanup --- testgres/node.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/testgres/node.py b/testgres/node.py index 574f4743..d8ce1f03 100644 --- a/testgres/node.py +++ b/testgres/node.py @@ -877,10 +877,13 @@ def restore(self, filename, dbname=None, username=None): username = username or default_username() _params = [ - get_bin_path("pg_restore"), "-p", - str(self.port), "-h", self.host, "-U", username, "-d", dbname, + get_bin_path("pg_restore"), + "-p", str(self.port), + "-h", self.host, + "-U", username, + "-d", dbname, filename - ] + ] # yapf: disable # try pg_restore if dump is binary formate, and psql if not try: From bb88d6e0506a687ebc7ce94ed672e8b12da7da3c Mon Sep 17 00:00:00 2001 From: Ivan Kartyshov Date: Tue, 8 May 2018 17:09:40 +0300 Subject: [PATCH 10/10] Cleanup test_dump --- tests/test_simple.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/tests/test_simple.py b/tests/test_simple.py index 42e77a54..33defb12 100755 --- a/tests/test_simple.py +++ b/tests/test_simple.py @@ -428,16 +428,6 @@ def test_dump(self): with get_new_node().init().start() as node1: node1.execute(query_create) - - # take a new dump plain format - with removing(node1.dump()) as dump: - with get_new_node().init().start() as node2: - # restore dump - self.assertTrue(os.path.isfile(dump)) - node2.restore(filename=dump) - res = node2.execute(query_select) - self.assertListEqual(res, [(1, ), (2, )]) - for format in ['plain', 'custom', 'directory', 'tar']: with removing(node1.dump(format=format)) as dump: with get_new_node().init().start() as node3: