diff --git a/src/backups.js b/src/backups.js index 334de2de9..3b45513d1 100644 --- a/src/backups.js +++ b/src/backups.js @@ -26,6 +26,7 @@ exports = module.exports = { var addons = require('./addons.js'), appdb = require('./appdb.js'), apps = require('./apps.js'), + AppsError = require('./apps.js').AppsError, async = require('async'), assert = require('assert'), backupdb = require('./backupdb.js'), @@ -33,7 +34,6 @@ var addons = require('./addons.js'), DatabaseError = require('./databaseerror.js'), debug = require('debug')('box:backups'), eventlog = require('./eventlog.js'), - fs = require('fs'), locker = require('./locker.js'), mailer = require('./mailer.js'), path = require('path'), @@ -49,7 +49,7 @@ var NOOP_CALLBACK = function (error) { if (error) debug(error); }; var BACKUPTASK_CMD = path.join(__dirname, 'backuptask.js'); -function debugApp(app, args) { +function debugApp(app) { assert(!app || typeof app === 'object'); var prefix = app ? app.location : '(no app)'; @@ -143,6 +143,15 @@ function getRestoreConfig(backupId, callback) { }); } +function getBackupFilePath(backupConfig, backupId) { + assert.strictEqual(typeof backupConfig, 'object'); + assert.strictEqual(typeof backupId, 'string'); + + const FILE_TYPE = backupConfig.key ? '.tar.gz.enc' : '.tar.gz'; + + return path.join(backupConfig.prefix || backupConfig.backupFolder, backupId+FILE_TYPE); +} + // this function is called via backuptask (since it needs root to traverse app's directory) function upload(backupId, dataDir, callback) { assert.strictEqual(typeof backupId, 'string'); @@ -153,7 +162,7 @@ function upload(backupId, dataDir, callback) { settings.getBackupConfig(function (error, backupConfig) { if (error) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, error)); - api(backupConfig.provider).upload(backupConfig, backupId, dataDir, callback); + api(backupConfig.provider).upload(backupConfig, getBackupFilePath(backupConfig, backupId), dataDir, callback); }); } @@ -256,7 +265,7 @@ function rotateBoxBackup(backupConfig, timestamp, appBackupIds, callback) { backupdb.add({ id: backupId, version: config.version(), type: backupdb.BACKUP_TYPE_BOX, dependsOn: appBackupIds, restoreConfig: null }, function (error) { if (error) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, error)); - api(backupConfig.provider).copy(backupConfig, 'snapshot/box', backupId, function (copyBackupError) { + api(backupConfig.provider).copy(backupConfig, getBackupFilePath(backupConfig, 'snapshot/box'), getBackupFilePath(backupConfig, backupId), function (copyBackupError) { const state = copyBackupError ? backupdb.BACKUP_STATE_ERROR : backupdb.BACKUP_STATE_NORMAL; debug('rotateBoxBackup: successful id:%s', backupId); @@ -529,7 +538,7 @@ function restoreApp(app, addonsToRestore, backupId, callback) { var startTime = new Date(); async.series([ - api(backupConfig.provider).download.bind(null, backupConfig, backupId, appDataDir), + api(backupConfig.provider).download.bind(null, backupConfig, getBackupFilePath(backupConfig, backupId), appDataDir), addons.restoreAddons.bind(null, app, addonsToRestore) ], function (error) { debug('restoreApp: time: %s', (new Date() - startTime)/1000); @@ -556,7 +565,7 @@ function cleanupAppBackups(backupConfig, referencedAppBackups, callback) { debug('cleanup: removing %s', backup.id); - api(backupConfig.provider).removeMany(backupConfig, [ backup.id ], function (error) { + api(backupConfig.provider).removeMany(backupConfig, [ getBackupFilePath(backupConfig, backup.id) ], function (error) { if (error) { debug('cleanup: error removing backup %j : %s', backup, error.message); iteratorDone(); @@ -645,10 +654,10 @@ function cleanupSnapshots(backupConfig, callback) { delete info.box; async.eachSeries(Object.keys(info), function (appId, iteratorDone) { - apps.get(appId, function (error, app) { + apps.get(appId, function (error /*, app */) { if (!error || error.reason !== AppsError.NOT_FOUND) return iteratorDone(); - api(backupConfig.provider).removeMany(backupConfig, [ `snapshot/app_${appId}` ], function (ignoredError) { + api(backupConfig.provider).removeMany(backupConfig, [ `snapshot/app_${appId}` ], function (/* ignoredError */) { setSnapshotInfo(appId, null); iteratorDone(); diff --git a/src/storage/caas.js b/src/storage/caas.js index 21720d8f6..3b6761889 100644 --- a/src/storage/caas.js +++ b/src/storage/caas.js @@ -23,8 +23,6 @@ var assert = require('assert'), superagent = require('superagent'), targz = require('./targz.js'); -var FILE_TYPE = '.tar.gz.enc'; - // internal only function getBackupCredentials(apiConfig, callback) { assert.strictEqual(typeof apiConfig, 'object'); @@ -51,27 +49,16 @@ function getBackupCredentials(apiConfig, callback) { }); } -function getBackupFilePath(apiConfig, backupId) { - assert.strictEqual(typeof apiConfig, 'object'); - assert.strictEqual(typeof backupId, 'string'); - - const FILE_TYPE = apiConfig.key ? '.tar.gz.enc' : '.tar.gz'; - - return path.join(apiConfig.prefix, backupId+FILE_TYPE); -} - // storage api -function upload(apiConfig, backupId, sourceDir, callback) { +function upload(apiConfig, backupFilePath, sourceDir, callback) { assert.strictEqual(typeof apiConfig, 'object'); - assert.strictEqual(typeof backupId, 'string'); + assert.strictEqual(typeof backupFilePath, 'string'); assert.strictEqual(typeof sourceDir, 'string'); assert.strictEqual(typeof callback, 'function'); callback = once(callback); - var backupFilePath = getBackupFilePath(apiConfig, backupId); - - debug('[%s] backup: %s -> %s', backupId, sourceDir, backupFilePath); + debug('backup: %s -> %s', sourceDir, backupFilePath); getBackupCredentials(apiConfig, function (error, credentials) { if (error) return callback(error); @@ -88,7 +75,7 @@ function upload(apiConfig, backupId, sourceDir, callback) { // s3.upload automatically does a multi-part upload. we set queueSize to 1 to reduce memory usage s3.upload(params, { partSize: 10 * 1024 * 1024, queueSize: 1 }, function (error) { if (error) { - debug('[%s] backup: s3 upload error.', backupId, error); + debug('[%s] backup: s3 upload error.', backupFilePath, error); return callback(new BackupsError(BackupsError.EXTERNAL_ERROR, error)); } @@ -99,17 +86,15 @@ function upload(apiConfig, backupId, sourceDir, callback) { }); } -function download(apiConfig, backupId, destination, callback) { +function download(apiConfig, backupFilePath, destination, callback) { assert.strictEqual(typeof apiConfig, 'object'); - assert.strictEqual(typeof backupId, 'string'); + assert.strictEqual(typeof backupFilePath, 'string'); assert.strictEqual(typeof destination, 'string'); assert.strictEqual(typeof callback, 'function'); callback = once(callback); - var backupFilePath = getBackupFilePath(apiConfig, backupId); - - debug('[%s] restore: %s -> %s', backupId, backupFilePath, destination); + debug('restore: %s -> %s', backupFilePath, destination); getBackupCredentials(apiConfig, function (error, credentials) { if (error) return callback(error); @@ -126,7 +111,7 @@ function download(apiConfig, backupId, destination, callback) { // TODO ENOENT for the mock, fix upstream! if (error.code === 'NoSuchKey' || error.code === 'ENOENT') return callback(new BackupsError(BackupsError.NOT_FOUND)); - debug('[%s] restore: s3 stream error.', backupId, error); + debug('[%s] restore: s3 stream error.', backupFilePath, error); callback(new BackupsError(BackupsError.EXTERNAL_ERROR, error.message)); }); @@ -134,10 +119,10 @@ function download(apiConfig, backupId, destination, callback) { }); } -function copy(apiConfig, oldBackupId, newBackupId, callback) { +function copy(apiConfig, oldFilePath, newFilePath, callback) { assert.strictEqual(typeof apiConfig, 'object'); - assert.strictEqual(typeof oldBackupId, 'string'); - assert.strictEqual(typeof newBackupId, 'string'); + assert.strictEqual(typeof oldFilePath, 'string'); + assert.strictEqual(typeof newFilePath, 'string'); assert.strictEqual(typeof callback, 'function'); getBackupCredentials(apiConfig, function (error, credentials) { @@ -145,8 +130,8 @@ function copy(apiConfig, oldBackupId, newBackupId, callback) { var params = { Bucket: apiConfig.bucket, - Key: getBackupFilePath(apiConfig, newBackupId), - CopySource: path.join(apiConfig.bucket, getBackupFilePath(apiConfig, oldBackupId)) + Key: newFilePath, + CopySource: path.join(apiConfig.bucket, oldFilePath) }; var s3 = new AWS.S3(credentials); @@ -162,9 +147,9 @@ function copy(apiConfig, oldBackupId, newBackupId, callback) { }); } -function removeMany(apiConfig, backupIds, callback) { +function removeMany(apiConfig, filePaths, callback) { assert.strictEqual(typeof apiConfig, 'object'); - assert(Array.isArray(backupIds)); + assert(Array.isArray(filePaths)); assert.strictEqual(typeof callback, 'function'); getBackupCredentials(apiConfig, function (error, credentials) { @@ -177,8 +162,8 @@ function removeMany(apiConfig, backupIds, callback) { } }; - backupIds.forEach(function (backupId) { - params.Delete.Objects.push({ Key: getBackupFilePath(apiConfig, backupId) }); + filePaths.forEach(function (filePath) { + params.Delete.Objects.push({ Key: filePath }); }); var s3 = new AWS.S3(credentials); @@ -206,6 +191,7 @@ function backupDone(backupId, appBackupIds, callback) { assert.strictEqual(typeof callback, 'function'); // Caas expects filenames instead of backupIds, this means no prefix but a file type extension + var FILE_TYPE = '.tar.gz.enc'; var boxBackupFilename = backupId + FILE_TYPE; var appBackupFilenames = appBackupIds.map(function (id) { return id + FILE_TYPE; }); diff --git a/src/storage/filesystem.js b/src/storage/filesystem.js index 8b110a825..611cb5f45 100644 --- a/src/storage/filesystem.js +++ b/src/storage/filesystem.js @@ -27,28 +27,16 @@ var assert = require('assert'), var BACKUP_USER = config.TEST ? process.env.USER : 'yellowtent'; -// internal only -function getBackupFilePath(apiConfig, backupId) { - assert.strictEqual(typeof apiConfig, 'object'); - assert.strictEqual(typeof backupId, 'string'); - - const FILE_TYPE = apiConfig.key ? '.tar.gz.enc' : '.tar.gz'; - - return path.join(apiConfig.backupFolder, backupId+FILE_TYPE); -} - // storage api -function upload(apiConfig, backupId, sourceDir, callback) { +function upload(apiConfig, backupFilePath, sourceDir, callback) { assert.strictEqual(typeof apiConfig, 'object'); - assert.strictEqual(typeof backupId, 'string'); + assert.strictEqual(typeof backupFilePath, 'string'); assert.strictEqual(typeof sourceDir, 'string'); assert.strictEqual(typeof callback, 'function'); callback = once(callback); - var backupFilePath = getBackupFilePath(apiConfig, backupId); - - debug('[%s] backup: %s -> %s', backupId, sourceDir, backupFilePath); + debug('backup: %s -> %s', sourceDir, backupFilePath); mkdirp(path.dirname(backupFilePath), function (error) { if (error) return callback(new BackupsError(BackupsError.EXTERNAL_ERROR, error.message)); @@ -56,16 +44,16 @@ function upload(apiConfig, backupId, sourceDir, callback) { var fileStream = fs.createWriteStream(backupFilePath); fileStream.on('error', function (error) { - debug('[%s] backup: out stream error.', backupId, error); + debug('[%s] backup: out stream error.', backupFilePath, error); callback(new BackupsError(BackupsError.EXTERNAL_ERROR, error.message)); }); fileStream.on('close', function () { - debug('[%s] backup: changing ownership.', backupId); + debug('[%s] backup: changing ownership.', backupFilePath); if (!safe.child_process.execSync('chown -R ' + BACKUP_USER + ':' + BACKUP_USER + ' ' + path.dirname(backupFilePath))) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, safe.error.message)); - debug('[%s] backup: done.', backupId); + debug('[%s] backup: done.', backupFilePath); callback(null); }); @@ -74,17 +62,15 @@ function upload(apiConfig, backupId, sourceDir, callback) { }); } -function download(apiConfig, backupId, destination, callback) { +function download(apiConfig, sourceFilePath, destination, callback) { assert.strictEqual(typeof apiConfig, 'object'); - assert.strictEqual(typeof backupId, 'string'); + assert.strictEqual(typeof sourceFilePath, 'string'); assert.strictEqual(typeof destination, 'string'); assert.strictEqual(typeof callback, 'function'); callback = once(callback); - var sourceFilePath = getBackupFilePath(apiConfig, backupId); - - debug('[%s] restore: %s -> %s', backupId, sourceFilePath, destination); + debug('restore: %s -> %s', sourceFilePath, destination); if (!fs.existsSync(sourceFilePath)) return callback(new BackupsError(BackupsError.NOT_FOUND, 'backup file does not exist')); @@ -98,17 +84,14 @@ function download(apiConfig, backupId, destination, callback) { targz.extract(fileStream, destination, apiConfig.key || null, callback); } -function copy(apiConfig, oldBackupId, newBackupId, callback) { +function copy(apiConfig, oldFilePath, newFilePath, callback) { assert.strictEqual(typeof apiConfig, 'object'); - assert.strictEqual(typeof oldBackupId, 'string'); - assert.strictEqual(typeof newBackupId, 'string'); + assert.strictEqual(typeof oldFilePath, 'string'); + assert.strictEqual(typeof newFilePath, 'string'); assert.strictEqual(typeof callback, 'function'); callback = once(callback); - var oldFilePath = getBackupFilePath(apiConfig, oldBackupId); - var newFilePath = getBackupFilePath(apiConfig, newBackupId); - debug('copy: %s -> %s', oldFilePath, newFilePath); mkdirp(path.dirname(newFilePath), function (error) { @@ -123,14 +106,12 @@ function copy(apiConfig, oldBackupId, newBackupId, callback) { }); } -function removeMany(apiConfig, backupIds, callback) { +function removeMany(apiConfig, filePaths, callback) { assert.strictEqual(typeof apiConfig, 'object'); - assert(Array.isArray(backupIds)); + assert(Array.isArray(filePaths)); assert.strictEqual(typeof callback, 'function'); - async.eachSeries(backupIds, function (id, iteratorCallback) { - var filePath = getBackupFilePath(apiConfig, id); - + async.eachSeries(filePaths, function (filePath, iteratorCallback) { if (!safe.fs.unlinkSync(filePath)) { debug('removeMany: Unable to remove %s : %s', filePath, safe.error.message); } diff --git a/src/storage/interface.js b/src/storage/interface.js index c7a18bd97..e4b6a2f53 100644 --- a/src/storage/interface.js +++ b/src/storage/interface.js @@ -20,9 +20,9 @@ exports = module.exports = { var assert = require('assert'); -function upload(apiConfig, backupId, sourceDir, callback) { +function upload(apiConfig, backupFilePath, sourceDir, callback) { assert.strictEqual(typeof apiConfig, 'object'); - assert.strictEqual(typeof backupId, 'string'); + assert.strictEqual(typeof backupFilePath, 'string'); assert.strictEqual(typeof sourceDir, 'string'); assert.strictEqual(typeof callback, 'function'); @@ -31,9 +31,9 @@ function upload(apiConfig, backupId, sourceDir, callback) { callback(new Error('not implemented')); } -function download(apiConfig, backupId, destination, callback) { +function download(apiConfig, sourceFilePath, destination, callback) { assert.strictEqual(typeof apiConfig, 'object'); - assert.strictEqual(typeof backupId, 'string'); + assert.strictEqual(typeof sourceFilePath, 'string'); assert.strictEqual(typeof destination, 'string'); assert.strictEqual(typeof callback, 'function'); @@ -42,10 +42,10 @@ function download(apiConfig, backupId, destination, callback) { callback(new Error('not implemented')); } -function copy(apiConfig, oldBackupId, newBackupId, callback) { +function copy(apiConfig, oldFilePath, newFilePath, callback) { assert.strictEqual(typeof apiConfig, 'object'); - assert.strictEqual(typeof oldBackupId, 'string'); - assert.strictEqual(typeof newBackupId, 'string'); + assert.strictEqual(typeof oldFilePath, 'string'); + assert.strictEqual(typeof newFilePath, 'string'); assert.strictEqual(typeof callback, 'function'); // Result: none @@ -53,9 +53,9 @@ function copy(apiConfig, oldBackupId, newBackupId, callback) { callback(new Error('not implemented')); } -function removeMany(apiConfig, backupIds, callback) { +function removeMany(apiConfig, filePaths, callback) { assert.strictEqual(typeof apiConfig, 'object'); - assert(Array.isArray(backupIds)); + assert(Array.isArray(filePaths)); assert.strictEqual(typeof callback, 'function'); // Result: none diff --git a/src/storage/noop.js b/src/storage/noop.js index 33de52377..fa42c4540 100644 --- a/src/storage/noop.js +++ b/src/storage/noop.js @@ -15,45 +15,45 @@ exports = module.exports = { var assert = require('assert'), debug = require('debug')('box:storage/noop'); -function upload(apiConfig, backupId, sourceDir, callback) { +function upload(apiConfig, backupFilePath, sourceDir, callback) { assert.strictEqual(typeof apiConfig, 'object'); - assert.strictEqual(typeof backupId, 'string'); + assert.strictEqual(typeof backupFilePath, 'string'); assert.strictEqual(typeof sourceDir, 'string'); assert.strictEqual(typeof callback, 'function'); - debug('backup: %s %s', backupId, sourceDir); + debug('backup: %s %s', backupFilePath, sourceDir); callback(); } -function download(apiConfig, backupId, destination, callback) { +function download(apiConfig, sourceFilePath, destination, callback) { assert.strictEqual(typeof apiConfig, 'object'); - assert.strictEqual(typeof backupId, 'string'); + assert.strictEqual(typeof sourceFilePath, 'string'); assert.strictEqual(typeof destination, 'string'); assert.strictEqual(typeof callback, 'function'); - debug('restore: %s %s', backupId, destination); + debug('restore: %s %s', sourceFilePath, destination); callback(new Error('Cannot restore from noop backend')); } -function copy(apiConfig, oldBackupId, newBackupId, callback) { +function copy(apiConfig, oldFilePath, newFilePath, callback) { assert.strictEqual(typeof apiConfig, 'object'); - assert.strictEqual(typeof oldBackupId, 'string'); - assert.strictEqual(typeof newBackupId, 'string'); + assert.strictEqual(typeof oldFilePath, 'string'); + assert.strictEqual(typeof newFilePath, 'string'); assert.strictEqual(typeof callback, 'function'); - debug('copy: %s -> %s', oldBackupId, newBackupId); + debug('copy: %s -> %s', oldFilePath, newFilePath); callback(); } -function removeMany(apiConfig, backupIds, callback) { +function removeMany(apiConfig, filePaths, callback) { assert.strictEqual(typeof apiConfig, 'object'); - assert(Array.isArray(backupIds)); + assert(Array.isArray(filePaths)); assert.strictEqual(typeof callback, 'function'); - debug('removeMany: %j', backupIds); + debug('removeMany: %j', filePaths); callback(); } diff --git a/src/storage/s3.js b/src/storage/s3.js index 28c7db586..85e5ee9e7 100644 --- a/src/storage/s3.js +++ b/src/storage/s3.js @@ -57,27 +57,16 @@ function getBackupCredentials(apiConfig, callback) { callback(null, credentials); } -function getBackupFilePath(apiConfig, backupId) { - assert.strictEqual(typeof apiConfig, 'object'); - assert.strictEqual(typeof backupId, 'string'); - - const FILE_TYPE = apiConfig.key ? '.tar.gz.enc' : '.tar.gz'; - - return path.join(apiConfig.prefix, backupId+FILE_TYPE); -} - // storage api -function upload(apiConfig, backupId, sourceDir, callback) { +function upload(apiConfig, backupFilePath, sourceDir, callback) { assert.strictEqual(typeof apiConfig, 'object'); - assert.strictEqual(typeof backupId, 'string'); + assert.strictEqual(typeof backupFilePath, 'string'); assert.strictEqual(typeof sourceDir, 'string'); assert.strictEqual(typeof callback, 'function'); callback = once(callback); - var backupFilePath = getBackupFilePath(apiConfig, backupId); - - debug('[%s] backup: %s -> %s', backupId, sourceDir, backupFilePath); + debug('backup: %s -> %s', sourceDir, backupFilePath); getBackupCredentials(apiConfig, function (error, credentials) { if (error) return callback(error); @@ -94,7 +83,7 @@ function upload(apiConfig, backupId, sourceDir, callback) { // s3.upload automatically does a multi-part upload. we set queueSize to 1 to reduce memory usage s3.upload(params, { partSize: 10 * 1024 * 1024, queueSize: 1 }, function (error) { if (error) { - debug('[%s] backup: s3 upload error.', backupId, error); + debug('[%s] backup: s3 upload error.', backupFilePath, error); return callback(new BackupsError(BackupsError.EXTERNAL_ERROR, error.message)); } @@ -105,17 +94,15 @@ function upload(apiConfig, backupId, sourceDir, callback) { }); } -function download(apiConfig, backupId, destination, callback) { +function download(apiConfig, backupFilePath, destination, callback) { assert.strictEqual(typeof apiConfig, 'object'); - assert.strictEqual(typeof backupId, 'string'); + assert.strictEqual(typeof backupFilePath, 'string'); assert.strictEqual(typeof destination, 'string'); assert.strictEqual(typeof callback, 'function'); callback = once(callback); - var backupFilePath = getBackupFilePath(apiConfig, backupId); - - debug('[%s] restore: %s -> %s', backupId, backupFilePath, destination); + debug('restore: %s -> %s', backupFilePath, destination); getBackupCredentials(apiConfig, function (error, credentials) { if (error) return callback(error); @@ -133,7 +120,7 @@ function download(apiConfig, backupId, destination, callback) { // TODO ENOENT for the mock, fix upstream! if (error.code === 'NoSuchKey' || error.code === 'ENOENT') return callback(new BackupsError(BackupsError.NOT_FOUND)); - debug('[%s] restore: s3 stream error.', backupId, error); + debug('[%s] restore: s3 stream error.', backupFilePath, error); callback(new BackupsError(BackupsError.EXTERNAL_ERROR, error.message)); }); @@ -141,10 +128,10 @@ function download(apiConfig, backupId, destination, callback) { }); } -function copy(apiConfig, oldBackupId, newBackupId, callback) { +function copy(apiConfig, oldFilePath, newFilePath, callback) { assert.strictEqual(typeof apiConfig, 'object'); - assert.strictEqual(typeof oldBackupId, 'string'); - assert.strictEqual(typeof newBackupId, 'string'); + assert.strictEqual(typeof oldFilePath, 'string'); + assert.strictEqual(typeof newFilePath, 'string'); assert.strictEqual(typeof callback, 'function'); getBackupCredentials(apiConfig, function (error, credentials) { @@ -152,8 +139,8 @@ function copy(apiConfig, oldBackupId, newBackupId, callback) { var params = { Bucket: apiConfig.bucket, - Key: getBackupFilePath(apiConfig, newBackupId), - CopySource: path.join(apiConfig.bucket, getBackupFilePath(apiConfig, oldBackupId)) + Key: newFilePath, + CopySource: path.join(apiConfig.bucket, oldFilePath) }; var s3 = new AWS.S3(credentials); @@ -169,9 +156,9 @@ function copy(apiConfig, oldBackupId, newBackupId, callback) { }); } -function removeMany(apiConfig, backupIds, callback) { +function removeMany(apiConfig, filePaths, callback) { assert.strictEqual(typeof apiConfig, 'object'); - assert(Array.isArray(backupIds)); + assert(Array.isArray(filePaths)); assert.strictEqual(typeof callback, 'function'); getBackupCredentials(apiConfig, function (error, credentials) { @@ -184,8 +171,8 @@ function removeMany(apiConfig, backupIds, callback) { } }; - backupIds.forEach(function (backupId) { - params.Delete.Objects.push({ Key: getBackupFilePath(apiConfig, backupId) }); + filePaths.forEach(function (filePath) { + params.Delete.Objects.push({ Key: filePath }); }); var s3 = new AWS.S3(credentials); diff --git a/src/test/storage-test.js b/src/test/storage-test.js index cb70a828b..2e90a0ce1 100644 --- a/src/test/storage-test.js +++ b/src/test/storage-test.js @@ -120,7 +120,7 @@ describe('Storage', function () { after(function (done) { cleanup(function (error) { expect(error).to.be(null); - done() + done(); // rimraf(gTmpFolder, done); }); });