diff --git a/src/addons.js b/src/addons.js index 2e1efb2ee..ca3ce10f3 100644 --- a/src/addons.js +++ b/src/addons.js @@ -7,8 +7,7 @@ exports = module.exports = { getAddon: getAddon, configureAddon: configureAddon, getLogs: getLogs, - startAddon: startAddon, - stopAddon: stopAddon, + restartAddon: restartAddon, startAddons: startAddons, updateAddonConfig: updateAddonConfig, @@ -110,7 +109,8 @@ var KNOWN_ADDONS = { backup: NOOP, restore: setupEmail, clear: NOOP, - status: statusEmail + status: statusEmail, + restart: restartContainerAddon.bind(null, 'email') }, ldap: { setup: setupLdap, @@ -118,7 +118,8 @@ var KNOWN_ADDONS = { backup: NOOP, restore: setupLdap, clear: NOOP, - status: null + status: null, + restart: null }, localstorage: { setup: setupLocalStorage, // docker creates the directory for us @@ -126,7 +127,8 @@ var KNOWN_ADDONS = { backup: NOOP, // no backup because it's already inside app data restore: NOOP, clear: clearLocalStorage, - status: null + status: null, + restart: null }, mongodb: { setup: setupMongoDb, @@ -134,7 +136,8 @@ var KNOWN_ADDONS = { backup: backupMongoDb, restore: restoreMongoDb, clear: clearMongodb, - status: statusMongoDb + status: statusMongoDb, + restart: restartContainerAddon.bind(null, 'mongodb') }, mysql: { setup: setupMySql, @@ -142,7 +145,8 @@ var KNOWN_ADDONS = { backup: backupMySql, restore: restoreMySql, clear: clearMySql, - status: statusMySql + status: statusMySql, + restart: restartContainerAddon.bind(null, 'mysql') }, oauth: { setup: setupOauth, @@ -150,7 +154,8 @@ var KNOWN_ADDONS = { backup: NOOP, restore: setupOauth, clear: NOOP, - status: null + status: null, + restart: null }, postgresql: { setup: setupPostgreSql, @@ -158,7 +163,8 @@ var KNOWN_ADDONS = { backup: backupPostgreSql, restore: restorePostgreSql, clear: clearPostgreSql, - status: statusPostgreSql + status: statusPostgreSql, + restart: restartContainerAddon.bind(null, 'postgresql') }, recvmail: { setup: setupRecvMail, @@ -166,7 +172,8 @@ var KNOWN_ADDONS = { backup: NOOP, restore: setupRecvMail, clear: NOOP, - status: null + status: null, + restart: null }, redis: { setup: setupRedis, @@ -174,7 +181,8 @@ var KNOWN_ADDONS = { backup: backupRedis, restore: restoreRedis, clear: clearRedis, - status: null + status: null, + restart: null }, sendmail: { setup: setupSendMail, @@ -182,7 +190,8 @@ var KNOWN_ADDONS = { backup: NOOP, restore: setupSendMail, clear: NOOP, - status: null + status: null, + restart: null }, scheduler: { setup: NOOP, @@ -190,7 +199,8 @@ var KNOWN_ADDONS = { backup: NOOP, restore: NOOP, clear: NOOP, - status: null + status: null, + restart: null }, docker: { setup: NOOP, @@ -198,7 +208,8 @@ var KNOWN_ADDONS = { backup: NOOP, restore: NOOP, clear: NOOP, - status: statusDocker + status: statusDocker, + restart: null } }; @@ -232,6 +243,28 @@ function dumpPath(addon, appId) { } } +function restartContainerAddon(addon, callback) { + assert.strictEqual(typeof addon, 'string'); + assert.strictEqual(typeof callback, 'function'); + + // only allow certain addon types to be started + const allowedAddons = ['email', 'mysql', 'mongodb', 'postgresql']; + if (allowedAddons.indexOf(addon) === -1) return callback(new AddonsError(AddonsError.NOT_SUPPORTED)); + + // email container has a different name + const containerName = addon === 'email' ? 'mail' : addon; + + docker.stopContainer(containerName, function (error) { + if (error) return callback(new AddonsError(AddonsError.INTERNAL_ERROR, error)); + + docker.startContainer(containerName, function (error) { + if (error) return callback(new AddonsError(AddonsError.INTERNAL_ERROR, error)); + + callback(null); + }); + }); +} + function getAddons(callback) { assert.strictEqual(typeof callback, 'function'); @@ -357,40 +390,14 @@ function getLogs(addon, options, callback) { callback(null, transformStream); } -function startAddon(addon, callback) { +function restartAddon(addon, callback) { assert.strictEqual(typeof addon, 'string'); assert.strictEqual(typeof callback, 'function'); - // only allow certain addon types to be started - const allowedAddons = ['email', 'mysql', 'mongodb', 'postgresql']; - if (allowedAddons.indexOf(addon) === -1) return callback(new AddonsError(AddonsError.NOT_SUPPORTED)); + if (!KNOWN_ADDONS[addon]) return callback(new AddonsError(AddonsError.NOT_FOUND)); + if (!KNOWN_ADDONS[addon].restart) return callback(null); - // email container has a different name - const containerName = addon === 'email' ? 'mail' : addon; - - docker.startContainer(containerName, function (error) { - if (error) return callback(new AddonsError(AddonsError.INTERNAL_ERROR, error)); - - callback(null); - }); -} - -function stopAddon(addon, callback) { - assert.strictEqual(typeof addon, 'string'); - assert.strictEqual(typeof callback, 'function'); - - // only allow certain addon types to be stopped - const allowedAddons = ['email', 'mysql', 'mongodb', 'postgresql']; - if (allowedAddons.indexOf(addon) === -1) return callback(new AddonsError(AddonsError.NOT_SUPPORTED)); - - // email container has a different name - const containerName = addon === 'email' ? 'mail' : addon; - - docker.stopContainer(containerName, function (error) { - if (error) return callback(new AddonsError(AddonsError.INTERNAL_ERROR, error)); - - callback(null); - }); + KNOWN_ADDONS[addon].restart(callback); } function getAddonDetails(containerName, tokenEnvName, callback) { diff --git a/src/routes/addons.js b/src/routes/addons.js index f803fb3f7..bf40bc4fd 100644 --- a/src/routes/addons.js +++ b/src/routes/addons.js @@ -6,8 +6,7 @@ exports = module.exports = { configure: configure, getLogs: getLogs, getLogStream: getLogStream, - start: start, - stop: stop + restart: restart }; var addons = require('../addons.js'), @@ -122,24 +121,12 @@ function getLogStream(req, res, next) { }); } -function start(req, res, next) { +function restart(req, res, next) { assert.strictEqual(typeof req.params.addon, 'string'); - debug(`Starting addon ${req.params.addon}`); + debug(`Restarting addon ${req.params.addon}`); - addons.startAddon(req.params.addon, function (error) { - if (error) return next(new HttpError(500, error)); - - next(new HttpSuccess(202, {})); - }); -} - -function stop(req, res, next) { - assert.strictEqual(typeof req.params.addon, 'string'); - - debug(`Stopping addon ${req.params.addon}`); - - addons.stopAddon(req.params.addon, function (error) { + addons.restartAddon(req.params.addon, function (error) { if (error) return next(new HttpError(500, error)); next(new HttpSuccess(202, {})); diff --git a/src/server.js b/src/server.js index 6c0a81652..35b44e174 100644 --- a/src/server.js +++ b/src/server.js @@ -290,8 +290,7 @@ function initializeExpressSync() { router.post('/api/v1/addons/:addon', cloudronScope, routes.addons.configure); router.get ('/api/v1/addons/:addon/logs', cloudronScope, routes.addons.getLogs); router.get ('/api/v1/addons/:addon/logstream', cloudronScope, routes.addons.getLogStream); - router.post('/api/v1/addons/:addon/start', cloudronScope, routes.addons.start); - router.post('/api/v1/addons/:addon/stop', cloudronScope, routes.addons.stop); + router.post('/api/v1/addons/:addon/restart', cloudronScope, routes.addons.restart); // caas routes router.get('/api/v1/caas/config', cloudronScope, routes.caas.getConfig);