@@ -3443,6 +3443,9 @@ def test_validate_corrupt_tablespace_map(self):
34433443'\n Unexpected Error Message: {0}\n CMD: {1}' .format (
34443444repr (e .message ),self .cmd ))
34453445
3446+ # Clean after yourself
3447+ self .del_test_dir (module_name ,fname )
3448+
34463449# @unittest.expectedFailure
34473450# @unittest.skip("skip")
34483451def test_validate_target_lsn (self ):
@@ -3497,6 +3500,9 @@ def test_validate_target_lsn(self):
34973500'--recovery-target-timeline=2' ,
34983501'--recovery-target-lsn={0}' .format (target_lsn )])
34993502
3503+ # Clean after yourself
3504+ self .del_test_dir (module_name ,fname )
3505+
35003506# @unittest.expectedFailure
35013507# @unittest.skip("skip")
35023508def test_recovery_target_time_backup_victim (self ):
@@ -3555,6 +3561,9 @@ def test_recovery_target_time_backup_victim(self):
35553561backup_dir ,'node' ,
35563562options = ['--recovery-target-time={0}' .format (target_time )])
35573563
3564+ # Clean after yourself
3565+ self .del_test_dir (module_name ,fname )
3566+
35583567# @unittest.expectedFailure
35593568# @unittest.skip("skip")
35603569def test_recovery_target_lsn_backup_victim (self ):
@@ -3611,6 +3620,196 @@ def test_recovery_target_lsn_backup_victim(self):
36113620backup_dir ,'node' ,
36123621options = ['--recovery-target-lsn={0}' .format (target_lsn )])
36133622
3623+ # Clean after yourself
3624+ self .del_test_dir (module_name ,fname )
3625+
3626+ def test_partial_validate_empty_and_mangled_database_map (self ):
3627+ """
3628+ """
3629+ fname = self .id ().split ('.' )[3 ]
3630+ backup_dir = os .path .join (self .tmp_path ,module_name ,fname ,'backup' )
3631+ node = self .make_simple_node (
3632+ base_dir = os .path .join (module_name ,fname ,'node' ),
3633+ set_replication = True ,
3634+ initdb_params = ['--data-checksums' ])
3635+
3636+ self .init_pb (backup_dir )
3637+ self .add_instance (backup_dir ,'node' ,node )
3638+
3639+ node .slow_start ()
3640+
3641+ # create databases
3642+ for i in range (1 ,10 ,1 ):
3643+ node .safe_psql (
3644+ 'postgres' ,
3645+ 'CREATE database db{0}' .format (i ))
3646+
3647+ # FULL backup with database_map
3648+ backup_id = self .backup_node (
3649+ backup_dir ,'node' ,node ,options = ['--stream' ])
3650+ pgdata = self .pgdata_content (node .data_dir )
3651+
3652+ # truncate database_map
3653+ path = os .path .join (
3654+ backup_dir ,'backups' ,'node' ,
3655+ backup_id ,'database' ,'database_map' )
3656+ with open (path ,"w" )as f :
3657+ f .close ()
3658+
3659+ try :
3660+ self .validate_pb (
3661+ backup_dir ,'node' ,
3662+ options = ["--db-include=db1" ,'--no-validate' ])
3663+ self .assertEqual (
3664+ 1 ,0 ,
3665+ "Expecting Error because database_map is empty.\n "
3666+ "Output: {0}\n CMD: {1}" .format (
3667+ self .output ,self .cmd ))
3668+ except ProbackupException as e :
3669+ self .assertIn (
3670+ "WARNING: Backup {0} data files are corrupted" .format (
3671+ backup_id ),e .message ,
3672+ '\n Unexpected Error Message: {0}\n CMD: {1}' .format (
3673+ repr (e .message ),self .cmd ))
3674+
3675+ # mangle database_map
3676+ with open (path ,"w" )as f :
3677+ f .write ("42" )
3678+ f .close ()
3679+
3680+ try :
3681+ self .validate_pb (
3682+ backup_dir ,'node' ,
3683+ options = ["--db-include=db1" ,'--no-validate' ])
3684+ self .assertEqual (
3685+ 1 ,0 ,
3686+ "Expecting Error because database_map is empty.\n "
3687+ "Output: {0}\n CMD: {1}" .format (
3688+ self .output ,self .cmd ))
3689+ except ProbackupException as e :
3690+ self .assertIn (
3691+ "WARNING: Backup {0} data files are corrupted" .format (
3692+ backup_id ),e .message ,
3693+ '\n Unexpected Error Message: {0}\n CMD: {1}' .format (
3694+ repr (e .message ),self .cmd ))
3695+
3696+ # Clean after yourself
3697+ self .del_test_dir (module_name ,fname )
3698+
3699+ def test_partial_validate_exclude (self ):
3700+ """"""
3701+ fname = self .id ().split ('.' )[3 ]
3702+ backup_dir = os .path .join (self .tmp_path ,module_name ,fname ,'backup' )
3703+ node = self .make_simple_node (
3704+ base_dir = os .path .join (module_name ,fname ,'node' ),
3705+ initdb_params = ['--data-checksums' ])
3706+
3707+ self .init_pb (backup_dir )
3708+ self .add_instance (backup_dir ,'node' ,node )
3709+ self .set_archiving (backup_dir ,'node' ,node )
3710+ node .slow_start ()
3711+
3712+ for i in range (1 ,10 ,1 ):
3713+ node .safe_psql (
3714+ 'postgres' ,
3715+ 'CREATE database db{0}' .format (i ))
3716+
3717+ # FULL backup
3718+ backup_id = self .backup_node (backup_dir ,'node' ,node )
3719+
3720+ try :
3721+ self .validate_pb (
3722+ backup_dir ,'node' ,
3723+ options = [
3724+ "--db-include=db1" ,
3725+ "--db-exclude=db2" ])
3726+ self .assertEqual (
3727+ 1 ,0 ,
3728+ "Expecting Error because of 'db-exclude' and 'db-include'.\n "
3729+ "Output: {0}\n CMD: {1}" .format (
3730+ self .output ,self .cmd ))
3731+ except ProbackupException as e :
3732+ self .assertIn (
3733+ "ERROR: You cannot specify '--db-include' "
3734+ "and '--db-exclude' together" ,e .message ,
3735+ '\n Unexpected Error Message: {0}\n CMD: {1}' .format (
3736+ repr (e .message ),self .cmd ))
3737+
3738+ output = self .validate_pb (
3739+ backup_dir ,'node' ,
3740+ options = [
3741+ "--db-exclude=db1" ,
3742+ "--db-exclude=db5" ,
3743+ "--log-level-console=verbose" ])
3744+
3745+ self .assertIn (
3746+ "VERBOSE: Skip file validation due to partial restore" ,output )
3747+
3748+ # Clean after yourself
3749+ self .del_test_dir (module_name ,fname )
3750+
3751+ def test_partial_validate_include (self ):
3752+ """
3753+ """
3754+ fname = self .id ().split ('.' )[3 ]
3755+ backup_dir = os .path .join (self .tmp_path ,module_name ,fname ,'backup' )
3756+ node = self .make_simple_node (
3757+ base_dir = os .path .join (module_name ,fname ,'node' ),
3758+ initdb_params = ['--data-checksums' ])
3759+
3760+ self .init_pb (backup_dir )
3761+ self .add_instance (backup_dir ,'node' ,node )
3762+ self .set_archiving (backup_dir ,'node' ,node )
3763+ node .slow_start ()
3764+
3765+ for i in range (1 ,10 ,1 ):
3766+ node .safe_psql (
3767+ 'postgres' ,
3768+ 'CREATE database db{0}' .format (i ))
3769+
3770+ # FULL backup
3771+ backup_id = self .backup_node (backup_dir ,'node' ,node )
3772+
3773+ try :
3774+ self .validate_pb (
3775+ backup_dir ,'node' ,
3776+ options = [
3777+ "--db-include=db1" ,
3778+ "--db-exclude=db2" ])
3779+ self .assertEqual (
3780+ 1 ,0 ,
3781+ "Expecting Error because of 'db-exclude' and 'db-include'.\n "
3782+ "Output: {0}\n CMD: {1}" .format (
3783+ self .output ,self .cmd ))
3784+ except ProbackupException as e :
3785+ self .assertIn (
3786+ "ERROR: You cannot specify '--db-include' "
3787+ "and '--db-exclude' together" ,e .message ,
3788+ '\n Unexpected Error Message: {0}\n CMD: {1}' .format (
3789+ repr (e .message ),self .cmd ))
3790+
3791+ output = self .validate_pb (
3792+ backup_dir ,'node' ,
3793+ options = [
3794+ "--db-include=db1" ,
3795+ "--db-include=db5" ,
3796+ "--db-include=postgres" ,
3797+ "--log-level-console=verbose" ])
3798+
3799+ self .assertIn (
3800+ "VERBOSE: Skip file validation due to partial restore" ,output )
3801+
3802+ output = self .validate_pb (
3803+ backup_dir ,'node' ,
3804+ options = [
3805+ "--log-level-console=verbose" ])
3806+
3807+ self .assertNotIn (
3808+ "VERBOSE: Skip file validation due to partial restore" ,output )
3809+
3810+ # Clean after yourself
3811+ self .del_test_dir (module_name ,fname )
3812+
36143813# validate empty backup list
36153814# page from future during validate
36163815# page from future during backup