@@ -3080,8 +3080,6 @@ def test_incr_backup_filenode_map(self):
3080
3080
# Clean after yourself
3081
3081
self .del_test_dir (module_name , fname )
3082
3082
3083
-
3084
-
3085
3083
# @unittest.skip("skip")
3086
3084
def test_missing_wal_segment (self ):
3087
3085
""""""
@@ -3156,3 +3154,262 @@ def test_missing_wal_segment(self):
3156
3154
3157
3155
# Clean after yourself
3158
3156
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