@@ -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