diff --git a/src/backupdb.js b/src/backupdb.js index 109b50e98..1962589bf 100644 --- a/src/backupdb.js +++ b/src/backupdb.js @@ -13,6 +13,7 @@ exports = module.exports = { getPaged: getPaged, get: get, del: del, + update: update, getByAppIdPaged: getByAppIdPaged, _clear: clear, @@ -21,6 +22,8 @@ exports = module.exports = { BACKUP_TYPE_BOX: 'box', BACKUP_STATE_NORMAL: 'normal', // should rename to created to avoid listing in UI? + BACKUP_STATE_CREATING: 'creating', + BACKUP_STATE_ERROR: 'error' }; function postProcess(result) { @@ -102,6 +105,26 @@ function add(backup, callback) { }); } +function update(id, backup, callback) { + assert.strictEqual(typeof id, 'string'); + assert.strictEqual(typeof backup, 'object'); + assert.strictEqual(typeof callback, 'function'); + + var fields = [ ], values = [ ]; + for (var p in backup) { + fields.push(p + ' = ?'); + values.push(backup[p]); + } + values.push(id); + + database.query('UPDATE backups SET ' + fields.join(', ') + ' WHERE id = ?', values, function (error) { + if (error && error.reason === DatabaseError.NOT_FOUND) return callback(new DatabaseError(DatabaseError.NOT_FOUND)); + if (error) return callback(new DatabaseError(DatabaseError.INTERNAL_ERROR, error)); + + callback(null); + }); +} + function clear(callback) { assert.strictEqual(typeof callback, 'function'); diff --git a/src/backups.js b/src/backups.js index 3a93aba62..1e30355e9 100644 --- a/src/backups.js +++ b/src/backups.js @@ -203,18 +203,22 @@ function backupBoxWithAppBackupIds(appBackupIds, prefix, callback) { shell.exec('backupBox', '/bin/bash', mysqlDumpArgs, function (error) { if (error) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, error)); - runBackupTask(backupId, null /* appId */, function (error) { - if (error) return callback(error); + 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)); - debug('backupBoxWithAppBackupIds: success'); + runBackupTask(backupId, null /* appId */, function (backupTaskError) { + const state = backupTaskError ? backupdb.BACKUP_STATE_ERROR : backupdb.BACKUP_STATE_NORMAL; + debug('backupBoxWithAppBackupIds: %s', state); - 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)); + backupdb.update(backupId, { state: state }, function (error) { + if (backupTaskError) return callback(backupTaskError); + if (error) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, error)); - // FIXME this is only needed for caas, hopefully we can remove that in the future - api(backupConfig.provider).backupDone(backupId, appBackupIds, function (error) { - if (error) return callback(error); - callback(null, backupId); + // FIXME this is only needed for caas, hopefully we can remove that in the future + api(backupConfig.provider).backupDone(backupId, appBackupIds, function (error) { + if (error) return callback(error); + callback(null, backupId); + }); }); }); }); @@ -250,15 +254,20 @@ function createNewAppBackup(app, manifest, prefix, callback) { addons.backupAddons(app, manifest.addons, function (error) { if (error) return callback(new BackupsError(BackupsError.EXTERNAL_ERROR, error.message)); - runBackupTask(backupId, app.id, function (error) { - if (error) return callback(new BackupsError(BackupsError.EXTERNAL_ERROR, error.message)); + backupdb.add({ id: backupId, version: manifest.version, type: backupdb.BACKUP_TYPE_APP, dependsOn: [ ], restoreConfig: restoreConfig }, function (error) { + if (error) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, error)); - debugApp(app, 'createNewAppBackup: %s done', backupId); + runBackupTask(backupId, app.id, function (backupTaskError) { + const state = backupTaskError ? backupdb.BACKUP_STATE_ERROR : backupdb.BACKUP_STATE_NORMAL; - backupdb.add({ id: backupId, version: manifest.version, type: backupdb.BACKUP_TYPE_APP, dependsOn: [ ], restoreConfig: restoreConfig }, function (error) { - if (error) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, error)); + debugApp(app, 'createNewAppBackup: %s done with state %s', backupId, state); - callback(null, backupId); + backupdb.update(backupId, { state: state }, function (error) { + if (backupTaskError) return callback(new BackupsError(BackupsError.EXTERNAL_ERROR, backupTaskError.message)); + if (error) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, error)); + + callback(null, backupId); + }); }); }); });