backups: split config and policy

keeping them together makes the test/validation quite complicated.
for example, when policy is changed, we test the storage backends

part of #817
This commit is contained in:
Girish Ramakrishnan
2023-07-12 10:01:53 +05:30
parent 7926ff2811
commit 9cebde3005
15 changed files with 299 additions and 198 deletions
+9 -9
View File
@@ -35,28 +35,28 @@ describe('backup cleaner', function () {
preserveSecs: 0
};
describe('retention policy', function () {
describe('retention', function () {
it('keeps latest', function () {
const backup = Object.assign({}, backupTemplate, { creationTime: moment().subtract(5, 's').toDate(), state: backups.BACKUP_STATE_NORMAL });
backupCleaner._applyBackupRetentionPolicy([backup], { keepWithinSecs: 1, keepLatest: true }, []);
backupCleaner._applyBackupRetention([backup], { keepWithinSecs: 1, keepLatest: true }, []);
expect(backup.keepReason).to.be('latest');
});
it('does not keep latest', function () {
let backup = { creationTime: moment().subtract(5, 's').toDate(), state: backups.BACKUP_STATE_NORMAL };
backupCleaner._applyBackupRetentionPolicy([backup], { keepWithinSecs: 1, keepLatest: false }, []);
backupCleaner._applyBackupRetention([backup], { keepWithinSecs: 1, keepLatest: false }, []);
expect(backup.keepReason).to.be(undefined);
});
it('always keeps forever policy', function () {
let backup = { creationTime: new Date() };
backupCleaner._applyBackupRetentionPolicy([backup], { keepWithinSecs: -1, keepLatest: true }, []);
backupCleaner._applyBackupRetention([backup], { keepWithinSecs: -1, keepLatest: true }, []);
expect(backup.keepReason).to.be('keepWithinSecs');
});
it('preserveSecs takes precedence', function () {
let backup = { creationTime: new Date(), preserveSecs: 3000 };
backupCleaner._applyBackupRetentionPolicy([backup], { keepWithinSecs: 1, keepLatest: true }, []);
backupCleaner._applyBackupRetention([backup], { keepWithinSecs: 1, keepLatest: true }, []);
expect(backup.keepReason).to.be('preserveSecs');
});
@@ -68,7 +68,7 @@ describe('backup cleaner', function () {
{ id: '3', state: backups.BACKUP_STATE_NORMAL, creationTime: moment().subtract(20, 'h').toDate() },
{ id: '4', state: backups.BACKUP_STATE_NORMAL, creationTime: moment().subtract(5, 'd').toDate() }
];
backupCleaner._applyBackupRetentionPolicy(b, { keepDaily: 1, keepLatest: true }, []);
backupCleaner._applyBackupRetention(b, { keepDaily: 1, keepLatest: true }, []);
expect(b[0].keepReason).to.be('keepDaily');
expect(b[1].keepReason).to.be(undefined);
expect(b[2].keepReason).to.be(undefined);
@@ -87,7 +87,7 @@ describe('backup cleaner', function () {
{ id: '5', state: backups.BACKUP_STATE_CREATING, creationTime: moment().subtract(50, 'h').toDate() },
{ id: '6', state: backups.BACKUP_STATE_NORMAL, creationTime: moment().subtract(5, 'd').toDate() }
];
backupCleaner._applyBackupRetentionPolicy(b, { keepDaily: 2, keepWeekly: 1, keepLatest: false }, []);
backupCleaner._applyBackupRetention(b, { keepDaily: 2, keepWeekly: 1, keepLatest: false }, []);
expect(b[0].keepReason).to.be('keepDaily'); // today
expect(b[1].keepReason).to.be('keepWeekly'); // today
expect(b[2].keepReason).to.be(undefined);
@@ -110,7 +110,7 @@ describe('backup cleaner', function () {
{ id: '8', state: backups.BACKUP_STATE_NORMAL, creationTime: moment().subtract(84, 'd').toDate() },
{ id: '9', state: backups.BACKUP_STATE_NORMAL, creationTime: moment().subtract(97, 'd').toDate() },
];
backupCleaner._applyBackupRetentionPolicy(b, { keepDaily: 2, keepMonthly: 3, keepYearly: 1, keepLatest: true }, []);
backupCleaner._applyBackupRetention(b, { keepDaily: 2, keepMonthly: 3, keepYearly: 1, keepLatest: true }, []);
expect(b[0].keepReason).to.be('creating');
expect(b[1].discardReason).to.be('error'); // errored
expect(b[2].keepReason).to.be('keepDaily');
@@ -214,9 +214,9 @@ describe('backup cleaner', function () {
provider: 'filesystem',
password: 'supersecret',
backupFolder: '/tmp/someplace',
retentionPolicy: { keepWithinSecs: 1 },
format: 'tgz'
}));
await settings.setBackupPolicy({ retention: { keepWithinSecs: 1 }, schedule: '00 00 23 * * *' });
});
async function cleanupBackups() {
-2
View File
@@ -29,8 +29,6 @@ describe('backuptask', function () {
provider: 'filesystem',
backupFolder: path.join(os.tmpdir(), 'backupstask-test-filesystem'),
format: 'tgz',
retentionPolicy: { keepWithinSecs: 10000 },
schedulePattern: '00 00 23 * * *'
};
before(async function () {
+14 -8
View File
@@ -53,17 +53,23 @@ describe('Settings', function () {
expect(newBackupConfig.backupFolder).to.be('/tmp/backups');
});
it('cannot set backup config with invalid schedulePattern', async function () {
let backupConfig = await settings.getBackupConfig();
backupConfig.schedulePattern = '';
const [error] = await safe(settings.setBackupConfig(backupConfig));
it('cannot set backup policy with invalid schedule', async function () {
const [error] = await safe(settings.setBackupPolicy({ schedule: '', retention: { keepWithinSecs: 1 }}));
expect(error.reason).to.be(BoxError.BAD_FIELD);
});
it('can set backup config with valid schedulePattern', async function () {
let backupConfig = await settings.getBackupConfig();
backupConfig.schedulePattern = '00 00 2,23 * * 0,1,2';
await settings.setBackupConfig(backupConfig);
it('cannot set backup policy with missing retention', async function () {
const [error] = await safe(settings.setBackupPolicy({ schedule: '00 * * * * *'}));
expect(error.reason).to.be(BoxError.BAD_FIELD);
});
it('cannot set backup policy with invalid retention', async function () {
const [error] = await safe(settings.setBackupPolicy({ schedule: '00 * * * * *', retention: { keepWhenever: 4 }}));
expect(error.reason).to.be(BoxError.BAD_FIELD);
});
it('can set valid backup policy', async function () {
await settings.setBackupPolicy({ schedule: '00 00 2,23 * * 0,1,2', retention: { keepWithinSecs: 1 }});
});
it('can get default unstable apps setting', async function () {
-2
View File
@@ -38,8 +38,6 @@ describe('Storage', function () {
key: 'key',
backupFolder: null,
format: 'tgz',
retentionPolicy: { keepWithinSecs: 10000 },
schedulePattern: '00 00 23 * * *'
};
before(function (done) {