Make the repair re-issue the install command

Otherwise, repairing a repair has to be handled
This commit is contained in:
Girish Ramakrishnan
2019-09-23 13:21:25 -07:00
parent 93344a5a4a
commit 38a0cdc0be
3 changed files with 12 additions and 36 deletions

View File

@@ -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 });
});