diff --git a/src/addons.js b/src/addons.js index c1ec13d74..275d6dd34 100644 --- a/src/addons.js +++ b/src/addons.js @@ -20,7 +20,7 @@ exports = module.exports = { getMountsSync: getMountsSync, getContainerNamesSync: getContainerNamesSync, - getServiceDetails: getServiceDetails, + getContainerDetails: getContainerDetails, SERVICE_STATUS_STARTING: 'starting', // container up, waiting for healthcheck SERVICE_STATUS_ACTIVE: 'active', @@ -156,6 +156,7 @@ var ADDONS = { } }; +// services are actual containers that are running. addons are the concepts requested by app const SERVICES = { turn: { status: statusTurn, @@ -256,17 +257,17 @@ function rebuildService(serviceName, callback) { callback(); } -function restartContainer(serviceName, callback) { - assert.strictEqual(typeof serviceName, 'string'); +function restartContainer(name, callback) { + assert.strictEqual(typeof name, 'string'); assert.strictEqual(typeof callback, 'function'); - docker.stopContainer(serviceName, function (error) { + docker.stopContainer(name, function (error) { if (error) return callback(error); - docker.startContainer(serviceName, function (error) { + docker.startContainer(name, function (error) { if (error && error.reason === BoxError.NOT_FOUND) { callback(null); // callback early since rebuilding takes long - return rebuildService(serviceName, function (error) { if (error) console.error(`Unable to rebuild service ${serviceName}`, error); }); + return rebuildService(name, function (error) { if (error) console.error(`Unable to rebuild service ${name}`, error); }); } callback(error); @@ -274,7 +275,7 @@ function restartContainer(serviceName, callback) { }); } -function getServiceDetails(containerName, tokenEnvName, callback) { +function getContainerDetails(containerName, tokenEnvName, callback) { assert.strictEqual(typeof containerName, 'string'); assert.strictEqual(typeof tokenEnvName, 'string'); assert.strictEqual(typeof callback, 'function'); @@ -297,20 +298,20 @@ function getServiceDetails(containerName, tokenEnvName, callback) { }); } -function containerStatus(addonName, addonTokenName, callback) { - assert.strictEqual(typeof addonName, 'string'); - assert.strictEqual(typeof addonTokenName, 'string'); +function containerStatus(containerName, tokenEnvName, callback) { + assert.strictEqual(typeof containerName, 'string'); + assert.strictEqual(typeof tokenEnvName, 'string'); assert.strictEqual(typeof callback, 'function'); - getServiceDetails(addonName, addonTokenName, function (error, addonDetails) { + getContainerDetails(containerName, tokenEnvName, function (error, addonDetails) { if (error && error.reason === BoxError.NOT_FOUND) return callback(null, { status: exports.SERVICE_STATUS_STOPPED }); if (error) return callback(error); 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.SERVICE_STATUS_STARTING, error: `Error waiting for ${addonName}: ${error.message}` }); - if (response.statusCode !== 200 || !response.body.status) return callback(null, { status: exports.SERVICE_STATUS_STARTING, error: `Error waiting for ${addonName}. Status code: ${response.statusCode} message: ${response.body.message}` }); + if (error) return callback(null, { status: exports.SERVICE_STATUS_STARTING, error: `Error waiting for ${containerName}: ${error.message}` }); + if (response.statusCode !== 200 || !response.body.status) return callback(null, { status: exports.SERVICE_STATUS_STARTING, error: `Error waiting for ${containerName}. Status code: ${response.statusCode} message: ${response.body.message}` }); - docker.memoryUsage(addonName, function (error, result) { + docker.memoryUsage(containerName, function (error, result) { if (error) return callback(error); var tmp = { @@ -477,14 +478,14 @@ function restartService(serviceName, callback) { SERVICES[serviceName].restart(callback); } -function waitForService(containerName, tokenEnvName, callback) { +function waitForContainer(containerName, tokenEnvName, callback) { assert.strictEqual(typeof containerName, 'string'); assert.strictEqual(typeof tokenEnvName, 'string'); assert.strictEqual(typeof callback, 'function'); debug(`Waiting for ${containerName}`); - getServiceDetails(containerName, tokenEnvName, function (error, result) { + getContainerDetails(containerName, tokenEnvName, function (error, result) { if (error) return callback(error); async.retry({ times: 10, interval: 15000 }, function (retryCallback) { @@ -1011,7 +1012,7 @@ function startMysql(existingInfra, callback) { shell.exec('startMysql', cmd, function (error) { if (error) return callback(error); - waitForService('mysql', 'CLOUDRON_MYSQL_TOKEN', function (error) { + waitForContainer('mysql', 'CLOUDRON_MYSQL_TOKEN', function (error) { if (error) return callback(error); if (!upgrading) return callback(null); @@ -1040,7 +1041,7 @@ function setupMySql(app, options, callback) { password: error ? hat(4 * 48) : existingPassword // see box#362 for password length }; - getServiceDetails('mysql', 'CLOUDRON_MYSQL_TOKEN', function (error, result) { + getContainerDetails('mysql', 'CLOUDRON_MYSQL_TOKEN', function (error, result) { if (error) return callback(error); request.post(`https://${result.ip}:3000/` + (options.multipleDatabases ? 'prefixes' : 'databases') + `?access_token=${result.token}`, { rejectUnauthorized: false, json: data }, function (error, response) { @@ -1079,7 +1080,7 @@ function clearMySql(app, options, callback) { const database = mysqlDatabaseName(app.id); - getServiceDetails('mysql', 'CLOUDRON_MYSQL_TOKEN', function (error, result) { + getContainerDetails('mysql', 'CLOUDRON_MYSQL_TOKEN', function (error, result) { if (error) return callback(error); request.post(`https://${result.ip}:3000/` + (options.multipleDatabases ? 'prefixes' : 'databases') + `/${database}/clear?access_token=${result.token}`, { json: true, rejectUnauthorized: false }, function (error, response) { @@ -1099,7 +1100,7 @@ function teardownMySql(app, options, callback) { const database = mysqlDatabaseName(app.id); const username = database; - getServiceDetails('mysql', 'CLOUDRON_MYSQL_TOKEN', function (error, result) { + getContainerDetails('mysql', 'CLOUDRON_MYSQL_TOKEN', function (error, result) { if (error) return callback(error); request.delete(`https://${result.ip}:3000/` + (options.multipleDatabases ? 'prefixes' : 'databases') + `/${database}?access_token=${result.token}&username=${username}`, { json: true, rejectUnauthorized: false }, function (error, response) { @@ -1147,7 +1148,7 @@ function backupMySql(app, options, callback) { debugApp(app, 'Backing up mysql'); - getServiceDetails('mysql', 'CLOUDRON_MYSQL_TOKEN', function (error, result) { + getContainerDetails('mysql', 'CLOUDRON_MYSQL_TOKEN', function (error, result) { if (error) return callback(error); const url = `https://${result.ip}:3000/` + (options.multipleDatabases ? 'prefixes' : 'databases') + `/${database}/backup?access_token=${result.token}`; @@ -1166,7 +1167,7 @@ function restoreMySql(app, options, callback) { callback = once(callback); // protect from multiple returns with streams - getServiceDetails('mysql', 'CLOUDRON_MYSQL_TOKEN', function (error, result) { + getContainerDetails('mysql', 'CLOUDRON_MYSQL_TOKEN', function (error, result) { if (error) return callback(error); var input = fs.createReadStream(dumpPath('mysql', app.id)); @@ -1227,7 +1228,7 @@ function startPostgresql(existingInfra, callback) { shell.exec('startPostgresql', cmd, function (error) { if (error) return callback(error); - waitForService('postgresql', 'CLOUDRON_POSTGRESQL_TOKEN', function (error) { + waitForContainer('postgresql', 'CLOUDRON_POSTGRESQL_TOKEN', function (error) { if (error) return callback(error); if (!upgrading) return callback(null); @@ -1255,7 +1256,7 @@ function setupPostgreSql(app, options, callback) { password: error ? hat(4 * 128) : existingPassword }; - getServiceDetails('postgresql', 'CLOUDRON_POSTGRESQL_TOKEN', function (error, result) { + getContainerDetails('postgresql', 'CLOUDRON_POSTGRESQL_TOKEN', function (error, result) { if (error) return callback(error); request.post(`https://${result.ip}:3000/databases?access_token=${result.token}`, { rejectUnauthorized: false, json: data }, function (error, response) { @@ -1289,7 +1290,7 @@ function clearPostgreSql(app, options, callback) { debugApp(app, 'Clearing postgresql'); - getServiceDetails('postgresql', 'CLOUDRON_POSTGRESQL_TOKEN', function (error, result) { + getContainerDetails('postgresql', 'CLOUDRON_POSTGRESQL_TOKEN', function (error, result) { if (error) return callback(error); request.post(`https://${result.ip}:3000/databases/${database}/clear?access_token=${result.token}&username=${username}`, { json: true, rejectUnauthorized: false }, function (error, response) { @@ -1308,7 +1309,7 @@ function teardownPostgreSql(app, options, callback) { const { database, username } = postgreSqlNames(app.id); - getServiceDetails('postgresql', 'CLOUDRON_POSTGRESQL_TOKEN', function (error, result) { + getContainerDetails('postgresql', 'CLOUDRON_POSTGRESQL_TOKEN', function (error, result) { if (error) return callback(error); request.delete(`https://${result.ip}:3000/databases/${database}?access_token=${result.token}&username=${username}`, { json: true, rejectUnauthorized: false }, function (error, response) { @@ -1329,7 +1330,7 @@ function backupPostgreSql(app, options, callback) { const { database } = postgreSqlNames(app.id); - getServiceDetails('postgresql', 'CLOUDRON_POSTGRESQL_TOKEN', function (error, result) { + getContainerDetails('postgresql', 'CLOUDRON_POSTGRESQL_TOKEN', function (error, result) { if (error) return callback(error); const url = `https://${result.ip}:3000/databases/${database}/backup?access_token=${result.token}`; @@ -1348,7 +1349,7 @@ function restorePostgreSql(app, options, callback) { callback = once(callback); // protect from multiple returns with streams - getServiceDetails('postgresql', 'CLOUDRON_POSTGRESQL_TOKEN', function (error, result) { + getContainerDetails('postgresql', 'CLOUDRON_POSTGRESQL_TOKEN', function (error, result) { if (error) return callback(error); var input = fs.createReadStream(dumpPath('postgresql', app.id)); @@ -1441,7 +1442,7 @@ function startMongodb(existingInfra, callback) { shell.exec('startMongodb', cmd, function (error) { if (error) return callback(error); - waitForService('mongodb', 'CLOUDRON_MONGODB_TOKEN', function (error) { + waitForContainer('mongodb', 'CLOUDRON_MONGODB_TOKEN', function (error) { if (error) return callback(error); if (!upgrading) return callback(null); @@ -1468,7 +1469,7 @@ function setupMongoDb(app, options, callback) { oplog: !!options.oplog }; - getServiceDetails('mongodb', 'CLOUDRON_MONGODB_TOKEN', function (error, result) { + getContainerDetails('mongodb', 'CLOUDRON_MONGODB_TOKEN', function (error, result) { if (error) return callback(error); request.post(`https://${result.ip}:3000/databases?access_token=${result.token}`, { rejectUnauthorized: false, json: data }, function (error, response) { @@ -1504,7 +1505,7 @@ function clearMongodb(app, options, callback) { debugApp(app, 'Clearing mongodb'); - getServiceDetails('mongodb', 'CLOUDRON_MONGODB_TOKEN', function (error, result) { + getContainerDetails('mongodb', 'CLOUDRON_MONGODB_TOKEN', function (error, result) { if (error) return callback(error); request.post(`https://${result.ip}:3000/databases/${app.id}/clear?access_token=${result.token}`, { json: true, rejectUnauthorized: false }, function (error, response) { @@ -1523,7 +1524,7 @@ function teardownMongoDb(app, options, callback) { debugApp(app, 'Tearing down mongodb'); - getServiceDetails('mongodb', 'CLOUDRON_MONGODB_TOKEN', function (error, result) { + getContainerDetails('mongodb', 'CLOUDRON_MONGODB_TOKEN', function (error, result) { if (error) return callback(error); request.delete(`https://${result.ip}:3000/databases/${app.id}?access_token=${result.token}`, { json: true, rejectUnauthorized: false }, function (error, response) { @@ -1542,7 +1543,7 @@ function backupMongoDb(app, options, callback) { debugApp(app, 'Backing up mongodb'); - getServiceDetails('mongodb', 'CLOUDRON_MONGODB_TOKEN', function (error, result) { + getContainerDetails('mongodb', 'CLOUDRON_MONGODB_TOKEN', function (error, result) { if (error) return callback(error); const url = `https://${result.ip}:3000/databases/${app.id}/backup?access_token=${result.token}`; @@ -1559,7 +1560,7 @@ function restoreMongoDb(app, options, callback) { debugApp(app, 'restoreMongoDb'); - getServiceDetails('mongodb', 'CLOUDRON_MONGODB_TOKEN', function (error, result) { + getContainerDetails('mongodb', 'CLOUDRON_MONGODB_TOKEN', function (error, result) { if (error) return callback(error); const readStream = fs.createReadStream(dumpPath('mongodb', app.id)); @@ -1667,7 +1668,7 @@ function setupRedis(app, options, callback) { }); }, appdb.setAddonConfig.bind(null, app.id, 'redis', env), - waitForService.bind(null, 'redis-' + app.id, 'CLOUDRON_REDIS_TOKEN') + waitForContainer.bind(null, 'redis-' + app.id, 'CLOUDRON_REDIS_TOKEN') ], function (error) { if (error) debug('Error setting up redis: ', error); callback(error); @@ -1682,7 +1683,7 @@ function clearRedis(app, options, callback) { debugApp(app, 'Clearing redis'); - getServiceDetails('redis-' + app.id, 'CLOUDRON_REDIS_TOKEN', function (error, result) { + getContainerDetails('redis-' + app.id, 'CLOUDRON_REDIS_TOKEN', function (error, result) { if (error) return callback(error); request.post(`https://${result.ip}:3000/clear?access_token=${result.token}`, { json: true, rejectUnauthorized: false }, function (error, response) { @@ -1721,7 +1722,7 @@ function backupRedis(app, options, callback) { debugApp(app, 'Backing up redis'); - getServiceDetails('redis-' + app.id, 'CLOUDRON_REDIS_TOKEN', function (error, result) { + getContainerDetails('redis-' + app.id, 'CLOUDRON_REDIS_TOKEN', function (error, result) { if (error) return callback(error); const url = `https://${result.ip}:3000/backup?access_token=${result.token}`; @@ -1738,7 +1739,7 @@ function restoreRedis(app, options, callback) { callback = once(callback); // protect from multiple returns with streams - getServiceDetails('redis-' + app.id, 'CLOUDRON_REDIS_TOKEN', function (error, result) { + getContainerDetails('redis-' + app.id, 'CLOUDRON_REDIS_TOKEN', function (error, result) { if (error) return callback(error); let input; diff --git a/src/routes/mailserver.js b/src/routes/mailserver.js index 90794b4b2..dbe05e7e0 100644 --- a/src/routes/mailserver.js +++ b/src/routes/mailserver.js @@ -21,7 +21,7 @@ function proxy(req, res, next) { delete req.headers['authorization']; delete req.headers['cookies']; - addons.getServiceDetails('mail', 'CLOUDRON_MAIL_TOKEN', function (error, addonDetails) { + addons.getContainerDetails('mail', 'CLOUDRON_MAIL_TOKEN', function (error, addonDetails) { if (error) return next(BoxError.toHttpError(error)); parsedUrl.query['access_token'] = addonDetails.token;