1#################################################################################################################################### 2# Tests for expire command 3#################################################################################################################################### 4package pgBackRestTest::Module::Mock::MockExpireTest; 5use parent 'pgBackRestTest::Env::HostEnvTest'; 6 7#################################################################################################################################### 8# Perl includes 9#################################################################################################################################### 10use strict; 11use warnings FATAL => qw(all); 12use Carp qw(confess); 13 14use File::Basename qw(dirname); 15use Storable qw(dclone); 16 17use pgBackRestDoc::Common::Exception; 18use pgBackRestDoc::Common::Ini; 19use pgBackRestDoc::Common::Log; 20 21use pgBackRestTest::Env::ArchiveInfo; 22use pgBackRestTest::Env::BackupInfo; 23use pgBackRestTest::Env::ExpireEnvTest; 24use pgBackRestTest::Env::Host::HostBackupTest; 25use pgBackRestTest::Env::Host::HostS3Test; 26use pgBackRestTest::Env::HostEnvTest; 27use pgBackRestTest::Env::Manifest; 28use pgBackRestTest::Common::DbVersion; 29use pgBackRestTest::Common::ExecuteTest; 30use pgBackRestTest::Common::RunTest; 31use pgBackRestTest::Common::StorageRepo; 32use pgBackRestTest::Common::VmTest; 33use pgBackRestTest::Common::Wait; 34 35#################################################################################################################################### 36# run 37#################################################################################################################################### 38sub run 39{ 40 my $self = shift; 41 42 use constant SECONDS_PER_DAY => 86400; 43 my $lBaseTime = time() - (SECONDS_PER_DAY * 56); 44 my $strDescription; 45 46 foreach my $rhRun 47 ( 48 {vm => VM2, storage => S3, encrypt => true}, 49 {vm => VM3, storage => POSIX, encrypt => false}, 50 {vm => VM4, storage => AZURE, encrypt => true}, 51 ) 52 { 53 # Only run tests for this vm 54 next if ($rhRun->{vm} ne vmTest($self->vm())); 55 56 # Increment the run, log, and decide whether this unit test should be run 57 my $strStorage = $rhRun->{storage}; 58 my $bEncrypt = $rhRun->{encrypt}; 59 60 if ($strStorage ne POSIX && ($self->vm() eq VM3)) 61 { 62 confess &log("cannot configure non-posix storage for expect log tests"); 63 } 64 65 ############################################################################################################################ 66 if ($self->begin("simple, enc ${bEncrypt}, storage ${strStorage}")) 67 { 68 # Create hosts, file object, and config 69 my ($oHostDbPrimary, $oHostDbStandby, $oHostBackup) = $self->setup( 70 true, $self->expect(), {strStorage => $strStorage, bRepoEncrypt => $bEncrypt}); 71 72 # Create the test object 73 my $oExpireTest = new pgBackRestTest::Env::ExpireEnvTest( 74 $oHostBackup, $self->backrestExe(), storageRepo(), $oHostDbPrimary->dbPath(), $self->expect(), $self); 75 76 $oExpireTest->stanzaCreate($self->stanza(), PG_VERSION_92); 77 78 #----------------------------------------------------------------------------------------------------------------------- 79 $strDescription = 'Nothing to expire'; 80 81 $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); 82 $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_INCR, $lBaseTime += SECONDS_PER_DAY, 246); 83 84 $oExpireTest->process($self->stanza(), 1, 1, CFGOPTVAL_BACKUP_TYPE_FULL, 1, $strDescription); 85 86 #----------------------------------------------------------------------------------------------------------------------- 87 $strDescription = 'Expire oldest full backup, archive expire falls on segment major boundary'; 88 89 $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); 90 $oExpireTest->process($self->stanza(), 1, 1, CFGOPTVAL_BACKUP_TYPE_FULL, 1, $strDescription); 91 92 #----------------------------------------------------------------------------------------------------------------------- 93 $strDescription = 'Expire oldest full backup'; 94 95 $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY); 96 $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY, 256); 97 $oExpireTest->process($self->stanza(), 1, 1, CFGOPTVAL_BACKUP_TYPE_FULL, 1, $strDescription); 98 99 #----------------------------------------------------------------------------------------------------------------------- 100 $strDescription = 'Expire oldest diff backup, archive expire does not fall on major segment boundary'; 101 102 $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); 103 $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY, undef, 0); 104 $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_INCR, $lBaseTime += SECONDS_PER_DAY, undef, 0); 105 $oExpireTest->process($self->stanza(), 1, 1, CFGOPTVAL_BACKUP_TYPE_DIFF, 1, $strDescription); 106 107 #----------------------------------------------------------------------------------------------------------------------- 108 $strDescription = 'Expire oldest diff backup (cascade to incr)'; 109 110 $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY); 111 $oExpireTest->process($self->stanza(), 1, 1, CFGOPTVAL_BACKUP_TYPE_DIFF, 1, $strDescription); 112 113 #----------------------------------------------------------------------------------------------------------------------- 114 $strDescription = 'Expire archive based on newest incr backup'; 115 116 $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_INCR, $lBaseTime += SECONDS_PER_DAY); 117 $oExpireTest->process($self->stanza(), 1, 1, CFGOPTVAL_BACKUP_TYPE_INCR, 1, $strDescription); 118 119 #----------------------------------------------------------------------------------------------------------------------- 120 $strDescription = 'Expire diff treating full as diff'; 121 122 $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); 123 $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY); 124 $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); 125 $oExpireTest->process($self->stanza(), 2, 1, CFGOPTVAL_BACKUP_TYPE_DIFF, 1, $strDescription); 126 127 #----------------------------------------------------------------------------------------------------------------------- 128 $strDescription = 'Expire diff with repo-retention-archive with warning repo-retention-diff not set'; 129 130 $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); 131 $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY); 132 $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY); 133 $oExpireTest->process($self->stanza(), undef, undef, CFGOPTVAL_BACKUP_TYPE_DIFF, 1, $strDescription); 134 135 #----------------------------------------------------------------------------------------------------------------------- 136 $strDescription = 'Expire full with repo-retention-archive with warning repo-retention-full not set'; 137 138 $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); 139 $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); 140 $oExpireTest->process($self->stanza(), undef, undef, CFGOPTVAL_BACKUP_TYPE_FULL, 1, $strDescription); 141 142 #----------------------------------------------------------------------------------------------------------------------- 143 $strDescription = 'Expire no archive with warning since repo-retention-archive not set for INCR'; 144 145 $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_INCR, $lBaseTime += SECONDS_PER_DAY); 146 $oExpireTest->process($self->stanza(), 1, 1, CFGOPTVAL_BACKUP_TYPE_INCR, undef, $strDescription); 147 148 #----------------------------------------------------------------------------------------------------------------------- 149 $strDescription = 'Expire no archive with warning since neither repo-retention-archive nor repo-retention-diff is set'; 150 151 $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); 152 $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY); 153 $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY); 154 $oExpireTest->process($self->stanza(), undef, undef, CFGOPTVAL_BACKUP_TYPE_DIFF, undef, $strDescription); 155 } 156 157 ############################################################################################################################ 158 if ($self->begin("stanzaUpgrade, enc ${bEncrypt}, storage ${strStorage}")) 159 { 160 # Create hosts, file object, and config 161 my ($oHostDbPrimary, $oHostDbStandby, $oHostBackup) = $self->setup( 162 true, $self->expect(), {strStorage => $strStorage, bRepoEncrypt => $bEncrypt}); 163 164 # Create the test object 165 my $oExpireTest = new pgBackRestTest::Env::ExpireEnvTest( 166 $oHostBackup, $self->backrestExe(), storageRepo(), $oHostDbPrimary->dbPath(), $self->expect(), $self); 167 168 $oExpireTest->stanzaCreate($self->stanza(), PG_VERSION_92); 169 170 #----------------------------------------------------------------------------------------------------------------------- 171 $strDescription = 'Create backups in current db version'; 172 173 $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); 174 $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_INCR, $lBaseTime += SECONDS_PER_DAY); 175 $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); 176 $oExpireTest->process($self->stanza(), undef, undef, CFGOPTVAL_BACKUP_TYPE_DIFF, undef, $strDescription); 177 178 #----------------------------------------------------------------------------------------------------------------------- 179 $strDescription = 'Upgrade stanza and expire only earliest db backup and archive'; 180 181 $oExpireTest->stanzaUpgrade($self->stanza(), PG_VERSION_93); 182 $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); 183 $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_INCR, $lBaseTime += SECONDS_PER_DAY, 246); 184 $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); 185 $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY); 186 $oExpireTest->process($self->stanza(), 3, undef, CFGOPTVAL_BACKUP_TYPE_FULL, undef, $strDescription); 187 188 #----------------------------------------------------------------------------------------------------------------------- 189 $strDescription = 'Upgrade the stanza, create full back - earliest db orphaned archive removed and earliest full backup ' . 190 'and archive in previous db version removed'; 191 192 $oExpireTest->stanzaUpgrade($self->stanza(), PG_VERSION_10); 193 $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); 194 $oExpireTest->process($self->stanza(), 2, undef, CFGOPTVAL_BACKUP_TYPE_FULL, undef, $strDescription); 195 196 #----------------------------------------------------------------------------------------------------------------------- 197 $strDescription = 'Expire all archive last full backup through pitr'; 198 199 $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); 200 $oExpireTest->process($self->stanza(), 3, 1, CFGOPTVAL_BACKUP_TYPE_DIFF, 1, $strDescription); 201 202 #----------------------------------------------------------------------------------------------------------------------- 203 $strDescription = 'Expire all archive except for the current database'; 204 205 $oExpireTest->process($self->stanza(), 2, undef, CFGOPTVAL_BACKUP_TYPE_FULL, undef, $strDescription); 206 } 207 } 208} 209 2101; 211