diff --git a/src/appdb.js b/src/appdb.js index d5384d1aa..a16a4d303 100644 --- a/src/appdb.js +++ b/src/appdb.js @@ -459,7 +459,7 @@ function setTask(appId, values, callback) { assert.strictEqual(typeof values, 'object'); assert.strictEqual(typeof callback, 'function'); - if (values.installationState === 'pending_repair' || values.installationState === 'pending_uninstall') { // FIXME + if (values.installationState === 'pending_uninstall') { // FIXME updateWithConstraints(appId, values, 'AND taskId IS NULL AND installationState = "error"', callback); } else { updateWithConstraints(appId, values, 'AND taskId IS NULL AND installationState != "error"', callback); diff --git a/src/apps.js b/src/apps.js index ae0e9685d..a0a9d93a4 100644 --- a/src/apps.js +++ b/src/apps.js @@ -73,7 +73,6 @@ exports = module.exports = { ISTATE_PENDING_DATA_DIR_MIGRATION: 'pending_data_dir_migration', ISTATE_PENDING_RESIZE: 'pending_resize', ISTATE_PENDING_DEBUG: 'pending_debug', - ISTATE_PENDING_REPAIR: 'pending_repair', ISTATE_PENDING_UNINSTALL: 'pending_uninstall', // uninstallation ISTATE_PENDING_RESTORE: 'pending_restore', // restore to previous backup or on upgrade ISTATE_PENDING_UPDATE: 'pending_update', // update from installed state preserving data @@ -668,7 +667,7 @@ function checkAppState(app, state) { if (app.taskId) return new AppsError(AppsError.BAD_STATE, `Not allowed in this app state : ${app.installationState} / ${app.runState}`); if (app.installationState === exports.ISTATE_ERROR) { - if (state !== exports.ISTATE_PENDING_REPAIR && state !== exports.ISTATE_PENDING_UNINSTALL) return new AppsError(AppsError.BAD_STATE, 'Not allowed in error state'); + if (state !== exports.ISTATE_PENDING_UNINSTALL) return new AppsError(AppsError.BAD_STATE, 'Not allowed in error state'); } return null; @@ -1344,20 +1343,23 @@ function repair(appId, data, auditSource, callback) { get(appId, function (error, app) { if (error) return callback(error); + if (app.installationState !== exports.ISTATE_ERROR) return new AppsError(AppsError.BAD_STATE, 'Only allowed in error state'); - error = checkAppState(app, exports.ISTATE_PENDING_REPAIR); - if (error) return callback(error); + const appError = app.error || {}; + const newState = appError.task ? appError.task.installationState : exports.ISTATE_PENDING_CONFIGURE; + debug(`Repairing app with error: ${JSON.stringify(error)} and state: ${newState}`); let values = _.pick(data, 'location', 'domain', 'alternateDomains'); // FIXME: validate - values.installationState = exports.ISTATE_PENDING_REPAIR; + values.installationState = newState; - const restoreConfig = data.backupId ? { backupId: data.backupId, backupFormat: data.backupFormat, oldManifest: app.manifest } : null; // when null, apptask simply reinstalls - const overwriteDns = 'overwriteDns' in data ? data.overwriteDns : false; + let args = appError.task ? appError.task.args : {}; + args.restoreConfig = data.backupId ? { backupId: data.backupId, backupFormat: data.backupFormat, oldManifest: app.manifest } : null; // when null, apptask simply reinstalls + args.overwriteDns = 'overwriteDns' in data ? data.overwriteDns : false; - scheduleTask(appId, { restoreConfig, overwriteDns, error: app.error }, values, function (error, result) { + scheduleTask(appId, args, values, function (error, result) { if (error) return callback(error); - eventlog.add(eventlog.ACTION_APP_REPAIR, auditSource, { taskId: result.taskId, app }); + eventlog.add(eventlog.ACTION_APP_REPAIR, auditSource, { taskId: result.taskId, app, newState }); callback(null, { taskId: result.taskId }); }); diff --git a/src/apptask.js b/src/apptask.js index a18316948..26891bd1d 100644 --- a/src/apptask.js +++ b/src/apptask.js @@ -1033,30 +1033,6 @@ function uninstall(app, args, progressCallback, callback) { }); } -function repair(app, args, progressCallback, callback) { - assert.strictEqual(typeof app, 'object'); - assert.strictEqual(typeof args, 'object'); - assert.strictEqual(typeof progressCallback, 'function'); - assert.strictEqual(typeof callback, 'function'); - - const error = args.error; - const prevState = error && error.task ? args.error.task.installationState : apps.ISTATE_PENDING_CONFIGURE; - - debugApp(app, `Repairing app with error: ${JSON.stringify(error)} and state: ${prevState}`); - - if (prevState === apps.ISTATE_PENDING_UNINSTALL) { - uninstall(app, error.task.args, progressCallback, callback); - } else if (prevState === apps.ISTATE_PENDING_DATA_DIR_MIGRATION) { - migrateDataDir(app, error.task.args, progressCallback, callback); - } else if (prevState === apps.ISTATE_PENDING_INSTALL - || prevState === apps.ISTATE_PENDING_CLONE - || prevState === apps.ISTATE_PENDING_RESTORE) { - install(app, args, progressCallback, callback); - } else { - configure(app, args, progressCallback, callback); - } -} - function run(appId, args, progressCallback, callback) { assert.strictEqual(typeof appId, 'string'); assert.strictEqual(typeof args, 'object'); @@ -1074,8 +1050,6 @@ function run(appId, args, progressCallback, callback) { case apps.ISTATE_PENDING_CLONE: case apps.ISTATE_PENDING_RESTORE: return install(app, args, progressCallback, callback); - case apps.ISTATE_PENDING_REPAIR: - return repair(app, args, progressCallback, callback); case apps.ISTATE_PENDING_CONFIGURE: return configure(app, args, progressCallback, callback); case apps.ISTATE_PENDING_RECREATE_CONTAINER: