diff --git a/src/addons.js b/src/addons.js index 263f78227..2e1efb2ee 100644 --- a/src/addons.js +++ b/src/addons.js @@ -5,6 +5,7 @@ exports = module.exports = { getAddons: getAddons, getAddon: getAddon, + configureAddon: configureAddon, getLogs: getLogs, startAddon: startAddon, stopAddon: stopAddon, @@ -281,6 +282,34 @@ function getAddon(addonName, callback) { }); } +function configureAddon(addonName, data, callback) { + assert.strictEqual(typeof addonName, 'string'); + assert.strictEqual(typeof data, 'object'); + assert.strictEqual(typeof callback, 'function'); + + if (!KNOWN_ADDONS[addonName]) return callback(new AddonsError(AddonsError.NOT_FOUND)); + + settings.getPlatformConfig(function (error, platformConfig) { + if (error) return callback(new AddonsError(AddonsError.INTERNAL_ERROR, error)); + + if (!platformConfig[addonName]) platformConfig[addonName] = {}; + + // if not specified we clear the entry and use defaults + if (!data.memory || !data.memorySwap) { + delete platformConfig[addonName]; + } else { + platformConfig[addonName].memory = data.memory; + platformConfig[addonName].memorySwap = data.memorySwap; + } + + settings.setPlatformConfig(platformConfig, function (error) { + if (error) return callback(new AddonsError(AddonsError.INTERNAL_ERROR, error)); + + callback(null); + }); + }); +} + function getLogs(addon, options, callback) { assert.strictEqual(typeof addon, 'string'); assert(options && typeof options === 'object'); diff --git a/src/routes/addons.js b/src/routes/addons.js index 1deabdc0c..f803fb3f7 100644 --- a/src/routes/addons.js +++ b/src/routes/addons.js @@ -3,6 +3,7 @@ exports = module.exports = { getAll: getAll, get: get, + configure: configure, getLogs: getLogs, getLogStream: getLogStream, start: start, @@ -35,6 +36,24 @@ function get(req, res, next) { }); } +function configure(req, res, next) { + assert.strictEqual(typeof req.params.addon, 'string'); + + if (typeof req.body.memory !== 'number') return next(new HttpError(400, 'memory must be a number')); + + const data = { + memory: req.body.memory, + memorySwap: req.body.memory * 2 + }; + + addons.configureAddon(req.params.addon, data, function (error) { + if (error && error.reason === AddonsError.NOT_FOUND) return next(new HttpError(404, 'No such addon')); + if (error) return next(new HttpError(500, error)); + + next(new HttpSuccess(202, {})); + }); +} + function getLogs(req, res, next) { assert.strictEqual(typeof req.params.addon, 'string'); diff --git a/src/server.js b/src/server.js index 4e989956b..6c0a81652 100644 --- a/src/server.js +++ b/src/server.js @@ -287,6 +287,7 @@ function initializeExpressSync() { // addon routes router.get ('/api/v1/addons', cloudronScope, routes.addons.getAll); router.get ('/api/v1/addons/:addon', cloudronScope, routes.addons.get); + 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);