diff --git a/src/apptask.js b/src/apptask.js index b17001fc8..99ae7ff34 100644 --- a/src/apptask.js +++ b/src/apptask.js @@ -332,7 +332,7 @@ async function uninstallCommand(app, args, progressCallback) { await progressCallback({ percent: 30, message: 'Teardown addons' }); // if install/clone/restore/import failed early (e.g. invalid image), services may not have started - await safe(services.teardownAddons(app, app.manifest.addons), { debug: log }); + await services.teardownAddons(app, app.manifest.addons, { ignoreError: true }); await services.teardownPersistentDirs(app); await progressCallback({ percent: 40, message: 'Cleanup file manager' }); @@ -409,7 +409,7 @@ async function installCommand(app, args, progressCallback) { // when restoring, app does not require these addons anymore. remove carefully to preserve the db passwords if (oldManifest) { const addonsToRemove = _.omit(oldManifest.addons, Object.keys(app.manifest.addons)); - await services.teardownAddons(app, addonsToRemove); + await services.teardownAddons(app, addonsToRemove, {}); } if (!restoreConfig || restoreConfig.remotePath || restoreConfig.backupId) { // install/import/restore but not in-place import should delete data dir @@ -603,7 +603,7 @@ async function changeServicesCommand(app, args, progressCallback) { if (app.manifest.addons?.redis && !app.enableRedis) unusedAddons.redis = app.manifest.addons.redis; await progressCallback({ percent: 20, message: 'Removing unused addons' }); - await services.teardownAddons(app, unusedAddons); + await services.teardownAddons(app, unusedAddons, {}); await progressCallback({ percent: 40, message: 'Setting up addons' }); await services.setupAddons(app, app.manifest.addons); @@ -728,7 +728,7 @@ async function updateCommand(app, args, progressCallback) { if (app.manifest.dockerImage !== updateConfig.manifest.dockerImage) await docker.deleteImage(app.manifest.dockerImage); // only delete unused addons after backup - await services.teardownAddons(app, unusedAddons); + await services.teardownAddons(app, unusedAddons, {}); if (Object.keys(unusedAddons).includes('localstorage')) await updateApp(app, { storageVolumeId: null, storageVolumePrefix: null }); // lose reference // teardown persistent dirs removed in the new manifest diff --git a/src/services.js b/src/services.js index 4f63422f8..3e2bf2b59 100644 --- a/src/services.js +++ b/src/services.js @@ -2214,9 +2214,10 @@ async function setupAddons(app, addons) { } } -async function teardownAddons(app, addons) { +async function teardownAddons(app, addons, options) { assert.strictEqual(typeof app, 'object'); assert(!addons || typeof addons === 'object'); + assert(options && typeof options === 'object'); if (!addons) return; @@ -2227,7 +2228,8 @@ async function teardownAddons(app, addons) { log(`teardownAddons: Tearing down addon ${addon} with options ${JSON.stringify(addons[addon])}`); - await ADDONS[addon].teardown(app, addons[addon]); + const [error] = await safe(ADDONS[addon].teardown(app, addons[addon]), { debug: log }); + if (error && !options.ignoreError) throw error; } }