diff --git a/migrations/20210120025243-settings-platform-config-memoryLimit.js b/migrations/20210120025243-settings-platform-config-memoryLimit.js new file mode 100644 index 000000000..638336c1b --- /dev/null +++ b/migrations/20210120025243-settings-platform-config-memoryLimit.js @@ -0,0 +1,23 @@ +'use strict'; + +exports.up = function(db, callback) { + db.all('SELECT * FROM settings WHERE name=?', ['platform_config'], function (error, results) { + if (error || results.length === 0) return callback(null); + + let value = JSON.parse(results[0].value); + + for (const serviceName of Object.keys(value)) { + const service = value[serviceName]; + if (!service.memorySwap) continue; + service.memoryLimit = service.memorySwap; + delete service.memorySwap; + delete service.memory; + } + + db.runSql('UPDATE settings SET value=? WHERE name=?', [ JSON.stringify(value), 'platform_config' ], callback); + }); +}; + +exports.down = function(db, callback) { + callback(); +}; diff --git a/migrations/20210120025750-apps-servicesConfig-memoryLimit.js b/migrations/20210120025750-apps-servicesConfig-memoryLimit.js new file mode 100644 index 000000000..4331dce40 --- /dev/null +++ b/migrations/20210120025750-apps-servicesConfig-memoryLimit.js @@ -0,0 +1,28 @@ +'use strict'; + +const async = require('async'); + +exports.up = function(db, callback) { + db.all('SELECT * FROM apps', function (error, apps) { + if (error) return callback(error); + + async.eachSeries(apps, function (app, iteratorDone) { + if (!app.servicesConfigJson) return iteratorDone(); + + let servicesConfig = JSON.parse(app.servicesConfigJson); + for (const serviceName of Object.keys(servicesConfig)) { + const service = servicesConfig[serviceName]; + if (!service.memorySwap) continue; + service.memoryLimit = service.memorySwap; + delete service.memorySwap; + delete service.memory; + } + + db.runSql('UPDATE apps SET servicesConfigJson=? WHERE id=?', [ JSON.stringify(servicesConfig), app.id ], iteratorDone); + }, callback); + }); +}; + +exports.down = function(db, callback) { + callback(); +}; diff --git a/src/addons.js b/src/addons.js index 9ce911eb2..49fb31965 100644 --- a/src/addons.js +++ b/src/addons.js @@ -407,11 +407,7 @@ function getService(id, callback) { memoryPercent: 0, error: null, healthcheck: null, - config: { - // If a property is not set then we cannot change it through the api, see below - // memory: 0, - // memorySwap: 0 - } + config: {} }; containerStatusFunc(function (error, result) { @@ -429,9 +425,8 @@ function getService(id, callback) { const serviceConfig = servicesConfig[name]; tmp.config = Object.assign({}, serviceConfig); - if ((!tmp.config.memory || !tmp.config.memorySwap) && service.defaultMemoryLimit) { - tmp.config.memory = service.defaultMemoryLimit; - tmp.config.memorySwap = tmp.config.memory * 2; + if (!tmp.config.memoryLimit && service.defaultMemoryLimit) { + tmp.config.memoryLimit = service.defaultMemoryLimit * 2; } callback(null, tmp); @@ -458,9 +453,8 @@ function configureService(id, data, callback) { if (!servicesConfig[name]) servicesConfig[name] = {}; // if not specified we clear the entry and use defaults - if (!data.memory || !data.memorySwap) { - delete servicesConfig[name].memory; - delete servicesConfig[name].memorySwap; + if (!data.memoryLimit) { + delete servicesConfig[name].memoryLimit; } else { servicesConfig[name] = data; } @@ -814,9 +808,9 @@ function updateServiceConfig(platformConfig, callback) { async.eachSeries([ 'mysql', 'postgresql', 'mail', 'mongodb', 'graphite' ], function iterator(serviceName, iteratorCallback) { const containerConfig = platformConfig[serviceName]; let memory, memorySwap; - if (containerConfig && containerConfig.memory && containerConfig.memorySwap) { - memory = containerConfig.memory; - memorySwap = containerConfig.memorySwap; + if (containerConfig && containerConfig.memoryLimit) { + memory = containerConfig.memoryLimit / 2; + memorySwap = containerConfig.memoryLimit; } else { memory = SERVICES[serviceName].defaultMemoryLimit; memorySwap = memory * 2; @@ -841,9 +835,9 @@ function updateAppServiceConfig(name, instance, servicesConfig, callback) { const serviceConfig = servicesConfig[name]; let memory, memorySwap; - if (serviceConfig && serviceConfig.memory && serviceConfig.memorySwap) { - memory = serviceConfig.memory; - memorySwap = serviceConfig.memorySwap; + if (serviceConfig && serviceConfig.memoryLimit) { + memory = serviceConfig.memoryLimit / 2; + memorySwap = serviceConfig.memoryLimit; } else { memory = APP_SERVICES[name].defaultMemoryLimit; memorySwap = memory * 2; diff --git a/src/routes/services.js b/src/routes/services.js index 2e82b6c25..58cc6086d 100644 --- a/src/routes/services.js +++ b/src/routes/services.js @@ -38,12 +38,10 @@ function get(req, res, next) { function configure(req, res, next) { assert.strictEqual(typeof req.params.service, 'string'); - if (typeof req.body.memory !== 'number') return next(new HttpError(400, 'memory must be a number')); - if (typeof req.body.memorySwap !== 'number') return next(new HttpError(400, 'memorySwap must be a number')); + if (typeof req.body.memoryLimit !== 'number') return next(new HttpError(400, 'memoryLimit must be a number')); const data = { - memory: req.body.memory, - memorySwap: req.body.memorySwap + memory: req.body.memoryLimit }; if (req.params.service === 'sftp') { diff --git a/src/settings.js b/src/settings.js index 71273e941..0a93f390c 100644 --- a/src/settings.js +++ b/src/settings.js @@ -451,11 +451,6 @@ function getPlatformConfig(callback) { function setPlatformConfig(platformConfig, callback) { assert.strictEqual(typeof callback, 'function'); - for (let addon of [ 'mysql', 'postgresql', 'mail', 'mongodb' ]) { - if (!platformConfig[addon]) continue; - if (platformConfig[addon].memorySwap < platformConfig[addon].memory) return callback(new BoxError(BoxError.BAD_FIELD, 'memorySwap must be larger than memory', { field: 'memory', addon })); - } - settingsdb.set(exports.PLATFORM_CONFIG_KEY, JSON.stringify(platformConfig), function (error) { if (error) return callback(error);