diff --git a/src/addons.js b/src/addons.js index e3ad12dc3..767200eeb 100644 --- a/src/addons.js +++ b/src/addons.js @@ -7,6 +7,8 @@ exports = module.exports = { restoreAddons: restoreAddons, clearAddons: clearAddons, + waitForAddon: waitForAddon, + getEnvironment: getEnvironment, getMountsSync: getMountsSync, getContainerNamesSync: getContainerNamesSync, @@ -164,6 +166,27 @@ function getAddonDetails(containerName, tokenEnvName, callback) { }); } +function waitForAddon(containerName, tokenEnvName, callback) { + assert.strictEqual(typeof containerName, 'string'); + assert.strictEqual(typeof tokenEnvName, 'string'); + assert.strictEqual(typeof callback, 'function'); + + debug(`Waiting for ${containerName}`); + + getAddonDetails(containerName, tokenEnvName, function (error, result) { + if (error) return callback(error); + + async.retry({ times: 10, interval: 5000 }, function (retryCallback) { + request.get(`https://${result.ip}:3000/healthcheck?access_token=${result.token}`, { json: true, rejectUnauthorized: false }, function (error, response) { + if (error) return retryCallback(new Error(`Error waiting for ${containerName}: ${error.message}`)); + if (response.statusCode !== 200) return retryCallback(new Error(`Error waiting for ${containerName}. Status code: ${response.statusCode} message: ${response.body.message}`)); + + retryCallback(null); + }); + }, callback); + }); +} + function setupAddons(app, addons, callback) { assert.strictEqual(typeof app, 'object'); assert(!addons || typeof addons === 'object'); @@ -1024,7 +1047,7 @@ function setupRedis(app, options, callback) { async.series([ shell.execSync.bind(null, 'startRedis', cmd), appdb.setAddonConfig.bind(null, app.id, 'redis', env), - waitForRedis.bind(null, app) + waitForAddon.bind(null, 'redis-' + app.id, 'CLOUDRON_REDIS_TOKEN') ], function (error) { if (error) debug('Error setting up redis: ', error); callback(error); @@ -1033,26 +1056,6 @@ function setupRedis(app, options, callback) { }); } -function waitForRedis(app, callback) { - assert.strictEqual(typeof app, 'object'); - assert.strictEqual(typeof callback, 'function'); - - debugApp(app, 'Waiting for redis'); - - getAddonDetails('redis-' + app.id, 'CLOUDRON_REDIS_TOKEN', function (error, result) { - if (error) return callback(error); - - async.retry({ times: 10, interval: 5000 }, function (retryCallback) { - request.get(`https://${result.ip}:3000/healthcheck?access_token=${result.token}`, { json: true, rejectUnauthorized: false }, function (error, response) { - if (error) return retryCallback(new Error(`Error waiting for redis: ${error.message}`)); - if (response.statusCode !== 200) return retryCallback(new Error(`Error waiting for redis. Status code: ${response.statusCode} message: ${response.body.message}`)); - - retryCallback(null); - }); - }, callback); - }); -} - function clearRedis(app, options, callback) { assert.strictEqual(typeof app, 'object'); assert.strictEqual(typeof options, 'object'); diff --git a/src/platform.js b/src/platform.js index 126579d1e..0de76e4c6 100644 --- a/src/platform.js +++ b/src/platform.js @@ -7,7 +7,8 @@ exports = module.exports = { handleCertChanged: handleCertChanged }; -var apps = require('./apps.js'), +var addons = require('./addons.js'), + apps = require('./apps.js'), assert = require('assert'), async = require('async'), config = require('./config.js'), @@ -201,7 +202,7 @@ function startMysql(callback) { shell.execSync('startMysql', cmd); - setTimeout(callback, 5000); + addons.waitForAddon('mysql', 'CLOUDRON_MYSQL_TOKEN', callback); } function startPostgresql(callback) { @@ -229,7 +230,7 @@ function startPostgresql(callback) { shell.execSync('startPostgresql', cmd); - setTimeout(callback, 5000); + addons.waitForAddon('postgresql', 'CLOUDRON_POSTGRESQL_TOKEN', callback); } function startMongodb(callback) { @@ -257,7 +258,7 @@ function startMongodb(callback) { shell.execSync('startMongodb', cmd); - setTimeout(callback, 5000); + addons.waitForAddon('mongodb', 'CLOUDRON_MONGODB_TOKEN', callback); } function startAddons(existingInfra, callback) {