diff --git a/src/backuptargets.js b/src/backuptargets.js index 8dbae6f26..8b2c3d462 100644 --- a/src/backuptargets.js +++ b/src/backuptargets.js @@ -274,14 +274,15 @@ async function del(backupTarget, auditSource) { if (backupTarget.primary) throw new BoxError(BoxError.CONFLICT, 'Cannot delete the primary backup target'); const queries = [ - { query: 'DELETE FROM backups WHERE targetId = ?', args: [ backupTarget.id ] }, + { query: 'DELETE FROM archives WHERE backupId IN (SELECT id FROM backups WHERE targetId=?)', args: [ backupTarget.id ] }, + { query: 'DELETE FROM backups WHERE targetId=?', args: [ backupTarget.id ] }, { query: 'DELETE FROM backupTargets WHERE id=? AND main=?', args: [ backupTarget.id, false ] }, // cannot delete primary ]; const [error, result] = await safe(database.transaction(queries)); if (error && error.code === 'ER_NO_REFERENCED_ROW_2') throw new BoxError(BoxError.NOT_FOUND, error); if (error) throw error; - if (result[1].affectedRows !== 1) throw new BoxError(BoxError.NOT_FOUND, 'Target not found'); + if (result[2].affectedRows !== 1) throw new BoxError(BoxError.NOT_FOUND, 'Target not found'); await eventlog.add(eventlog.ACTION_BACKUP_TARGET_REMOVE, auditSource, { backupTarget: backupTarget }); backupTarget.schedule = constants.CRON_PATTERN_NEVER; diff --git a/src/test/backuptargets-test.js b/src/test/backuptargets-test.js index ecb8c6aec..af054b48c 100644 --- a/src/test/backuptargets-test.js +++ b/src/test/backuptargets-test.js @@ -21,12 +21,27 @@ describe('backups', function () { }); after(cleanup); + const backupTarget = { + provider: 'filesystem', + label: 'Another', + config: { backupDir: '/tmp/boxtest2' }, + format: 'rsync', + retention: { keepWithinSecs: 2 * 24 * 60 * 60 }, + schedule: '00 00 23 * * *' + }; + let defaultBackupTarget = null; + it('can add another target', async function () { + const id = await backupTargets.add(backupTarget, auditSource); + expect(id).to.be.ok(); + backupTarget.id = id; + }); + it('can list backup targets', async function () { const result = await backupTargets.list(1, 5); - expect(result.length).to.be(1); - defaultBackupTarget = result[0]; + expect(result.length).to.be(2); + defaultBackupTarget = result[0]; // first is always primary }); it('can get backup target', async function () { @@ -35,6 +50,7 @@ describe('backups', function () { expect(backupTarget.config.backupDir).to.be.ok(); // the test sets this to some tmp location expect(backupTarget.format).to.be('tgz'); expect(backupTarget.encryption).to.be(null); + expect(backupTarget.primary).to.be(true); }); it('cannot get random backup target', async function () { @@ -75,4 +91,21 @@ describe('backups', function () { expect(backupTarget.retention).to.eql(retention); } }); + + it('cannot delete the primary backup target', async function () { + const [error] = await safe(backupTargets.del(defaultBackupTarget, auditSource)); + expect(error.reason).to.be(BoxError.CONFLICT); + }); + + it('can set another as primary', async function () { + await backupTargets.setPrimary(backupTarget, auditSource); + + const noMoreDefaultTarget = await backupTargets.get(defaultBackupTarget.id); + expect(noMoreDefaultTarget.primary).to.be(false); + defaultBackupTarget.primary = false; + }); + + it('can delete non-primary backup target', async function () { + await backupTargets.del(defaultBackupTarget, auditSource); + }); });