Skip to content

Commit 731d190

Browse files
committed
[Issue #310] test coverage
1 parent c2e8593 commit 731d190

File tree

1 file changed

+259
-2
lines changed

1 file changed

+259
-2
lines changed

tests/backup.py

Lines changed: 259 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3080,8 +3080,6 @@ def test_incr_backup_filenode_map(self):
30803080
# Clean after yourself
30813081
self.del_test_dir(module_name, fname)
30823082

3083-
3084-
30853083
# @unittest.skip("skip")
30863084
def test_missing_wal_segment(self):
30873085
""""""
@@ -3156,3 +3154,262 @@ def test_missing_wal_segment(self):
31563154

31573155
# Clean after yourself
31583156
self.del_test_dir(module_name, fname)
3157+
3158+
# @unittest.skip("skip")
3159+
def test_missing_replication_permission(self):
3160+
""""""
3161+
fname = self.id().split('.')[3]
3162+
backup_dir = os.path.join(self.tmp_path, module_name, fname, 'backup')
3163+
node = self.make_simple_node(
3164+
base_dir=os.path.join(module_name, fname, 'node'),
3165+
set_replication=True,
3166+
ptrack_enable=self.ptrack,
3167+
initdb_params=['--data-checksums'])
3168+
3169+
self.init_pb(backup_dir)
3170+
self.add_instance(backup_dir, 'node', node)
3171+
# self.set_archiving(backup_dir, 'node', node)
3172+
node.slow_start()
3173+
3174+
# FULL backup
3175+
self.backup_node(backup_dir, 'node', node, options=['--stream'])
3176+
3177+
# Create replica
3178+
replica = self.make_simple_node(
3179+
base_dir=os.path.join(module_name, fname, 'replica'))
3180+
replica.cleanup()
3181+
self.restore_node(backup_dir, 'node', replica)
3182+
3183+
# Settings for Replica
3184+
self.set_replica(node, replica)
3185+
replica.slow_start(replica=True)
3186+
3187+
node.safe_psql(
3188+
'postgres',
3189+
'CREATE DATABASE backupdb')
3190+
3191+
# PG 9.5
3192+
if self.get_version(node) < 90600:
3193+
node.safe_psql(
3194+
'backupdb',
3195+
"CREATE ROLE backup WITH LOGIN; "
3196+
"GRANT CONNECT ON DATABASE backupdb to backup; "
3197+
"GRANT USAGE ON SCHEMA pg_catalog TO backup; "
3198+
"GRANT SELECT ON TABLE pg_catalog.pg_proc TO backup; "
3199+
"GRANT SELECT ON TABLE pg_catalog.pg_extension TO backup; "
3200+
"GRANT SELECT ON TABLE pg_catalog.pg_database TO backup; " # for partial restore, checkdb and ptrack
3201+
"GRANT EXECUTE ON FUNCTION pg_catalog.nameeq(name, name) TO backup; "
3202+
"GRANT EXECUTE ON FUNCTION pg_catalog.textout(text) TO backup; "
3203+
"GRANT EXECUTE ON FUNCTION pg_catalog.timestamptz(timestamp with time zone, integer) TO backup; "
3204+
"GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup; "
3205+
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup; "
3206+
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_start_backup(text, boolean) TO backup; "
3207+
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_stop_backup() TO backup; "
3208+
"GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; "
3209+
"GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;")
3210+
# PG 9.6
3211+
elif self.get_version(node) > 90600 and self.get_version(node) < 100000:
3212+
node.safe_psql(
3213+
'backupdb',
3214+
"CREATE ROLE backup WITH LOGIN; "
3215+
"GRANT CONNECT ON DATABASE backupdb to backup; "
3216+
"GRANT USAGE ON SCHEMA pg_catalog TO backup; "
3217+
"GRANT SELECT ON TABLE pg_catalog.pg_extension TO backup; "
3218+
"GRANT SELECT ON TABLE pg_catalog.pg_proc TO backup; "
3219+
"GRANT SELECT ON TABLE pg_catalog.pg_database TO backup; " # for partial restore, checkdb and ptrack
3220+
"GRANT EXECUTE ON FUNCTION pg_catalog.nameeq(name, name) TO backup; "
3221+
"GRANT EXECUTE ON FUNCTION pg_catalog.textout(text) TO backup; "
3222+
"GRANT EXECUTE ON FUNCTION pg_catalog.timestamptz(timestamp with time zone, integer) TO backup; "
3223+
"GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup; "
3224+
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup; "
3225+
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_system() TO backup; "
3226+
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_start_backup(text, boolean, boolean) TO backup; "
3227+
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_stop_backup(boolean) TO backup; "
3228+
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_create_restore_point(text) TO backup; "
3229+
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_xlog() TO backup; "
3230+
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_xlog_replay_location() TO backup; "
3231+
"GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; "
3232+
"GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;")
3233+
# >= 10
3234+
else:
3235+
node.safe_psql(
3236+
'backupdb',
3237+
"CREATE ROLE backup WITH LOGIN; "
3238+
"GRANT CONNECT ON DATABASE backupdb to backup; "
3239+
"GRANT USAGE ON SCHEMA pg_catalog TO backup; "
3240+
"GRANT SELECT ON TABLE pg_catalog.pg_extension TO backup; "
3241+
"GRANT SELECT ON TABLE pg_catalog.pg_proc TO backup; "
3242+
"GRANT SELECT ON TABLE pg_catalog.pg_extension TO backup; "
3243+
"GRANT SELECT ON TABLE pg_catalog.pg_database TO backup; " # for partial restore, checkdb and ptrack
3244+
"GRANT EXECUTE ON FUNCTION pg_catalog.nameeq(name, name) TO backup; "
3245+
"GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup; "
3246+
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup; "
3247+
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_system() TO backup; "
3248+
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_start_backup(text, boolean, boolean) TO backup; "
3249+
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_stop_backup(boolean, boolean) TO backup; "
3250+
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_create_restore_point(text) TO backup; "
3251+
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_wal() TO backup; "
3252+
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_wal_replay_lsn() TO backup; "
3253+
"GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; "
3254+
"GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;"
3255+
)
3256+
3257+
if ProbackupTest.enterprise:
3258+
node.safe_psql(
3259+
"backupdb",
3260+
"GRANT EXECUTE ON FUNCTION pg_catalog.pgpro_edition() TO backup")
3261+
3262+
node.safe_psql(
3263+
"backupdb",
3264+
"GRANT EXECUTE ON FUNCTION pg_catalog.pgpro_version() TO backup")
3265+
3266+
sleep(2)
3267+
replica.promote()
3268+
3269+
# Delta backup
3270+
try:
3271+
self.backup_node(
3272+
backup_dir, 'node', replica, backup_type='delta',
3273+
data_dir=replica.data_dir, datname='backupdb', options=['--stream', '-U', 'backup'])
3274+
# we should die here because exception is what we expect to happen
3275+
self.assertEqual(
3276+
1, 0,
3277+
"Expecting Error because incremental backup should not be possible "
3278+
"\n Output: {0} \n CMD: {1}".format(
3279+
repr(self.output), self.cmd))
3280+
except ProbackupException as e:
3281+
self.assertIn(
3282+
"FATAL: must be superuser or replication role to start walsender",
3283+
e.message,
3284+
"\n Unexpected Error Message: {0}\n CMD: {1}".format(
3285+
repr(e.message), self.cmd))
3286+
3287+
# Clean after yourself
3288+
self.del_test_dir(module_name, fname)
3289+
3290+
# @unittest.skip("skip")
3291+
def test_missing_replication_permission_1(self):
3292+
""""""
3293+
fname = self.id().split('.')[3]
3294+
backup_dir = os.path.join(self.tmp_path, module_name, fname, 'backup')
3295+
node = self.make_simple_node(
3296+
base_dir=os.path.join(module_name, fname, 'node'),
3297+
set_replication=True,
3298+
ptrack_enable=self.ptrack,
3299+
initdb_params=['--data-checksums'])
3300+
3301+
self.init_pb(backup_dir)
3302+
self.add_instance(backup_dir, 'node', node)
3303+
self.set_archiving(backup_dir, 'node', node)
3304+
node.slow_start()
3305+
3306+
# FULL backup
3307+
self.backup_node(backup_dir, 'node', node, options=['--stream'])
3308+
3309+
# Create replica
3310+
replica = self.make_simple_node(
3311+
base_dir=os.path.join(module_name, fname, 'replica'))
3312+
replica.cleanup()
3313+
self.restore_node(backup_dir, 'node', replica)
3314+
3315+
# Settings for Replica
3316+
self.set_replica(node, replica)
3317+
replica.slow_start(replica=True)
3318+
3319+
node.safe_psql(
3320+
'postgres',
3321+
'CREATE DATABASE backupdb')
3322+
3323+
# PG 9.5
3324+
if self.get_version(node) < 90600:
3325+
node.safe_psql(
3326+
'backupdb',
3327+
"CREATE ROLE backup WITH LOGIN; "
3328+
"GRANT CONNECT ON DATABASE backupdb to backup; "
3329+
"GRANT USAGE ON SCHEMA pg_catalog TO backup; "
3330+
"GRANT SELECT ON TABLE pg_catalog.pg_proc TO backup; "
3331+
"GRANT SELECT ON TABLE pg_catalog.pg_extension TO backup; "
3332+
"GRANT SELECT ON TABLE pg_catalog.pg_database TO backup; " # for partial restore, checkdb and ptrack
3333+
"GRANT EXECUTE ON FUNCTION pg_catalog.nameeq(name, name) TO backup; "
3334+
"GRANT EXECUTE ON FUNCTION pg_catalog.textout(text) TO backup; "
3335+
"GRANT EXECUTE ON FUNCTION pg_catalog.timestamptz(timestamp with time zone, integer) TO backup; "
3336+
"GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup; "
3337+
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup; "
3338+
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_start_backup(text, boolean) TO backup; "
3339+
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_stop_backup() TO backup; "
3340+
"GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; "
3341+
"GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;")
3342+
# PG 9.6
3343+
elif self.get_version(node) > 90600 and self.get_version(node) < 100000:
3344+
node.safe_psql(
3345+
'backupdb',
3346+
"CREATE ROLE backup WITH LOGIN; "
3347+
"GRANT CONNECT ON DATABASE backupdb to backup; "
3348+
"GRANT USAGE ON SCHEMA pg_catalog TO backup; "
3349+
"GRANT SELECT ON TABLE pg_catalog.pg_extension TO backup; "
3350+
"GRANT SELECT ON TABLE pg_catalog.pg_proc TO backup; "
3351+
"GRANT SELECT ON TABLE pg_catalog.pg_database TO backup; " # for partial restore, checkdb and ptrack
3352+
"GRANT EXECUTE ON FUNCTION pg_catalog.nameeq(name, name) TO backup; "
3353+
"GRANT EXECUTE ON FUNCTION pg_catalog.textout(text) TO backup; "
3354+
"GRANT EXECUTE ON FUNCTION pg_catalog.timestamptz(timestamp with time zone, integer) TO backup; "
3355+
"GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup; "
3356+
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup; "
3357+
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_system() TO backup; "
3358+
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_start_backup(text, boolean, boolean) TO backup; "
3359+
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_stop_backup(boolean) TO backup; "
3360+
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_create_restore_point(text) TO backup; "
3361+
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_xlog() TO backup; "
3362+
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_xlog_replay_location() TO backup; "
3363+
"GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; "
3364+
"GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;")
3365+
# >= 10
3366+
else:
3367+
node.safe_psql(
3368+
'backupdb',
3369+
"CREATE ROLE backup WITH LOGIN; "
3370+
"GRANT CONNECT ON DATABASE backupdb to backup; "
3371+
"GRANT USAGE ON SCHEMA pg_catalog TO backup; "
3372+
"GRANT SELECT ON TABLE pg_catalog.pg_extension TO backup; "
3373+
"GRANT SELECT ON TABLE pg_catalog.pg_proc TO backup; "
3374+
"GRANT SELECT ON TABLE pg_catalog.pg_extension TO backup; "
3375+
"GRANT SELECT ON TABLE pg_catalog.pg_database TO backup; " # for partial restore, checkdb and ptrack
3376+
"GRANT EXECUTE ON FUNCTION pg_catalog.nameeq(name, name) TO backup; "
3377+
"GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup; "
3378+
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup; "
3379+
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_system() TO backup; "
3380+
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_start_backup(text, boolean, boolean) TO backup; "
3381+
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_stop_backup(boolean, boolean) TO backup; "
3382+
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_create_restore_point(text) TO backup; "
3383+
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_wal() TO backup; "
3384+
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_wal_replay_lsn() TO backup; "
3385+
"GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; "
3386+
"GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;"
3387+
)
3388+
3389+
if ProbackupTest.enterprise:
3390+
node.safe_psql(
3391+
"backupdb",
3392+
"GRANT EXECUTE ON FUNCTION pg_catalog.pgpro_edition() TO backup")
3393+
3394+
node.safe_psql(
3395+
"backupdb",
3396+
"GRANT EXECUTE ON FUNCTION pg_catalog.pgpro_version() TO backup")
3397+
3398+
replica.promote()
3399+
3400+
# PAGE
3401+
output = self.backup_node(
3402+
backup_dir, 'node', replica, backup_type='page',
3403+
data_dir=replica.data_dir, datname='backupdb', options=['-U', 'backup'],
3404+
return_id=False)
3405+
3406+
self.assertIn(
3407+
'WARNING: Valid backup on current timeline 2 is not found, trying to look up on previous timelines',
3408+
output)
3409+
3410+
self.assertIn(
3411+
'WARNING: could not connect to database backupdb: FATAL: must be superuser or replication role to start walsender',
3412+
output)
3413+
3414+
# Clean after yourself
3415+
self.del_test_dir(module_name, fname)

0 commit comments

Comments
 (0)