@@ -3443,6 +3443,9 @@ def test_validate_corrupt_tablespace_map(self):
3443
3443
'\n Unexpected Error Message: {0}\n CMD: {1}' .format (
3444
3444
repr (e .message ), self .cmd ))
3445
3445
3446
+ # Clean after yourself
3447
+ self .del_test_dir (module_name , fname )
3448
+
3446
3449
# @unittest.expectedFailure
3447
3450
# @unittest.skip("skip")
3448
3451
def test_validate_target_lsn (self ):
@@ -3497,6 +3500,9 @@ def test_validate_target_lsn(self):
3497
3500
'--recovery-target-timeline=2' ,
3498
3501
'--recovery-target-lsn={0}' .format (target_lsn )])
3499
3502
3503
+ # Clean after yourself
3504
+ self .del_test_dir (module_name , fname )
3505
+
3500
3506
# @unittest.expectedFailure
3501
3507
# @unittest.skip("skip")
3502
3508
def test_recovery_target_time_backup_victim (self ):
@@ -3555,6 +3561,9 @@ def test_recovery_target_time_backup_victim(self):
3555
3561
backup_dir , 'node' ,
3556
3562
options = ['--recovery-target-time={0}' .format (target_time )])
3557
3563
3564
+ # Clean after yourself
3565
+ self .del_test_dir (module_name , fname )
3566
+
3558
3567
# @unittest.expectedFailure
3559
3568
# @unittest.skip("skip")
3560
3569
def test_recovery_target_lsn_backup_victim (self ):
@@ -3611,6 +3620,196 @@ def test_recovery_target_lsn_backup_victim(self):
3611
3620
backup_dir , 'node' ,
3612
3621
options = ['--recovery-target-lsn={0}' .format (target_lsn )])
3613
3622
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
+
3614
3813
# validate empty backup list
3615
3814
# page from future during validate
3616
3815
# page from future during backup
0 commit comments