diff --git a/src/addons.js b/src/addons.js index 347fc24df..929b60265 100644 --- a/src/addons.js +++ b/src/addons.js @@ -271,15 +271,25 @@ function statusContainerAddon(addonName, addonTokenName, callback) { assert.strictEqual(typeof addonTokenName, 'string'); assert.strictEqual(typeof callback, 'function'); - getAddonDetails(addonName, addonTokenName, function (error, result) { + getAddonDetails(addonName, addonTokenName, function (error, addonDetails) { if (error && error.reason === AddonsError.NOT_ACTIVE) return callback(null, { status: exports.ADDON_STATUS_STOPPED }); if (error) return callback(error); - request.get(`https://${result.ip}:3000/healthcheck?access_token=${result.token}`, { json: true, rejectUnauthorized: false }, function (error, response) { + request.get(`https://${addonDetails.ip}:3000/healthcheck?access_token=${addonDetails.token}`, { json: true, rejectUnauthorized: false }, function (error, response) { if (error) return callback(null, { status: exports.ADDON_STATUS_STARTING, error: `Error waiting for ${addonName}: ${error.message}` }); if (response.statusCode !== 200 || !response.body.status) return callback(null, { status: exports.ADDON_STATUS_STARTING, error: `Error waiting for ${addonName}. Status code: ${response.statusCode} message: ${response.body.message}` }); - callback(null, { status: result.state.Running ? exports.ADDON_STATUS_ACTIVE : exports.ADDON_STATUS_STOPPED }); + docker.memoryUsage(addonName, function (error, result) { + if (error) return callback(new AddonsError(AddonsError.INTERNAL_ERROR, error)); + + var tmp = { + status: addonDetails.state.Running ? exports.ADDON_STATUS_ACTIVE : exports.ADDON_STATUS_STOPPED, + memoryUsed: result.memory_stats.usage, + memoryPercent: parseInt(100 * result.memory_stats.usage / result.memory_stats.limit) + }; + + callback(null, tmp); + }); }); }); } @@ -327,6 +337,8 @@ function getAddon(addonName, callback) { if (error) return callback(new AddonsError(AddonsError.INTERNAL_ERROR, error)); tmp.status = result.status; + tmp.memoryUsed = result.memoryUsed; + tmp.memoryPercent = result.memoryPercent; tmp.error = result.error || null; callback(null, tmp); diff --git a/src/docker.js b/src/docker.js index 238fc9006..58d693b99 100644 --- a/src/docker.js +++ b/src/docker.js @@ -22,6 +22,7 @@ exports = module.exports = { getContainerIdByIp: getContainerIdByIp, inspect: inspect, inspectByName: inspect, + memoryUsage: memoryUsage, execContainer: execContainer, createVolume: createVolume, removeVolume: removeVolume, @@ -471,6 +472,20 @@ function inspect(containerId, callback) { }); } +function memoryUsage(containerId, callback) { + assert.strictEqual(typeof containerId, 'string'); + assert.strictEqual(typeof callback, 'function'); + + var container = exports.connection.getContainer(containerId); + + container.stats({ stream: false }, function (error, result) { + if (error && error.statusCode === 404) return callback(new DockerError(DockerError.NOT_FOUND)); + if (error) return callback(new DockerError(DockerError.INTERNAL_ERROR, error)); + + callback(null, result); + }); +} + function execContainer(containerId, cmd, options, callback) { assert.strictEqual(typeof containerId, 'string'); assert(util.isArray(cmd));