diff --git a/src/addons.js b/src/addons.js index b430495e9..ace52fc61 100644 --- a/src/addons.js +++ b/src/addons.js @@ -46,6 +46,7 @@ var accesscontrol = require('./accesscontrol.js'), dockerConnection = docker.connection, DockerError = docker.DockerError, fs = require('fs'), + graphs = require('./graphs.js'), hat = require('./hat.js'), infra = require('./infra_version.js'), mail = require('./mail.js'), @@ -57,6 +58,7 @@ var accesscontrol = require('./accesscontrol.js'), safe = require('safetydance'), semver = require('semver'), settings = require('./settings.js'), + sftp = require('./sftp.js'), shell = require('./shell.js'), spawn = require('child_process').spawn, split = require('split'), @@ -269,6 +271,7 @@ function restartContainer(serviceName, callback) { if (error) return callback(new AddonsError(AddonsError.INTERNAL_ERROR, error)); docker.startContainer(serviceName, function (error) { + if (error && error.reason === DockerError.NOT_FOUND) return rebuildService(serviceName, callback); if (error) return callback(new AddonsError(AddonsError.INTERNAL_ERROR, error)); callback(null); @@ -276,6 +279,24 @@ function restartContainer(serviceName, callback) { }); } +function rebuildService(serviceName, callback) { + assert.strictEqual(typeof serviceName, 'string'); + assert.strictEqual(typeof callback, 'function'); + + assert(KNOWN_SERVICES[serviceName], `Unknown service ${serviceName}`); + + // this attempts to recreate the service docker container if they don't exist but platform infra version is unchanged + // passing an infra version of 'none' will not attempt to purge existing data, not sure if this is good or bad + if (serviceName === 'mongodb') return startMongodb({ version: 'none' }, callback); + if (serviceName === 'postgresql') return startPostgresql({ version: 'none' }, callback); + if (serviceName === 'mysql') return startMysql({ version: 'none' }, callback); + if (serviceName === 'sftp') return sftp.startSftp({ version: 'none' }, callback); + if (serviceName === 'graphite') return graphs.startGraphite({ version: 'none' }, callback); + + // nothing to rebuild for now + callback(); +} + function getServiceDetails(containerName, tokenEnvName, callback) { assert.strictEqual(typeof containerName, 'string'); assert.strictEqual(typeof tokenEnvName, 'string');