addons: optional start mongodb based on AVX
This commit is contained in:
@@ -21,6 +21,7 @@ exports = module.exports = {
|
||||
backupAddons,
|
||||
restoreAddons,
|
||||
clearAddons,
|
||||
checkAddonsSupport,
|
||||
|
||||
getEnvironment,
|
||||
getContainerNamesSync,
|
||||
@@ -75,6 +76,7 @@ const MKDIRVOLUME_CMD = path.join(__dirname, 'scripts/mkdirvolume.sh');
|
||||
|
||||
// setup can be called multiple times for the same app (configure crash restart) and existing data must not be lost
|
||||
// teardown is destructive. app data stored with the addon is lost
|
||||
// addons have 1-1 mapping with the manifest
|
||||
const ADDONS = {
|
||||
turn: {
|
||||
setup: setupTurn,
|
||||
@@ -1492,6 +1494,12 @@ async function restorePostgreSql(app, options) {
|
||||
await pipeFileToRequest(dumpPath('postgresql', app.id), `http://${result.ip}:3000/databases/${database}/restore?access_token=${result.token}&username=${username}`);
|
||||
}
|
||||
|
||||
async function hasAVX() {
|
||||
// mongodb 5 and above requires AVX
|
||||
const [error] = await safe(shell.exec('grep -q avx /proc/cpuinfo', {}));
|
||||
return !error;
|
||||
}
|
||||
|
||||
async function startMongodb(existingInfra) {
|
||||
assert.strictEqual(typeof existingInfra, 'object');
|
||||
|
||||
@@ -1533,6 +1541,11 @@ async function startMongodb(existingInfra) {
|
||||
await docker.stopContainer('mongodb');
|
||||
await docker.deleteContainer('mongodb');
|
||||
|
||||
if (!await hasAVX()) {
|
||||
debug('startMongodb: not starting mongodb because CPU does not have AVX');
|
||||
return;
|
||||
}
|
||||
|
||||
debug('startMongodb: starting mongodb container');
|
||||
await shell.exec('startMongodb', runCmd, { shell: '/bin/bash' });
|
||||
|
||||
@@ -1548,6 +1561,8 @@ async function setupMongoDb(app, options) {
|
||||
|
||||
debug('Setting up mongodb');
|
||||
|
||||
if (!await hasAVX()) throw new BoxError(BoxError.ADDONS_ERROR, 'Error setting up mongodb. CPU has no AVX support');
|
||||
|
||||
const existingPassword = await addonConfigs.getByName(app.id, 'mongodb', '%MONGODB_PASSWORD');
|
||||
let database = await addonConfigs.getByName(app.id, 'mongodb', '%MONGODB_DATABASE');
|
||||
database = database || hat(8 * 8); // 16 bytes. keep this short, so as to not overflow the 127 byte index length in MongoDB < 4.4
|
||||
@@ -1589,6 +1604,8 @@ async function clearMongodb(app, options) {
|
||||
assert.strictEqual(typeof app, 'object');
|
||||
assert.strictEqual(typeof options, 'object');
|
||||
|
||||
if (!await hasAVX()) throw new BoxError(BoxError.ADDONS_ERROR, 'Error clearing mongodb. CPU has no AVX support');
|
||||
|
||||
const result = await getContainerDetails('mongodb', 'CLOUDRON_MONGODB_TOKEN');
|
||||
|
||||
const database = await addonConfigs.getByName(app.id, 'mongodb', '%MONGODB_DATABASE');
|
||||
@@ -1605,6 +1622,8 @@ async function teardownMongoDb(app, options) {
|
||||
assert.strictEqual(typeof app, 'object');
|
||||
assert.strictEqual(typeof options, 'object');
|
||||
|
||||
if (!await hasAVX()) throw new BoxError(BoxError.ADDONS_ERROR, 'Error tearing down mongodb. CPU has no AVX support');
|
||||
|
||||
const result = await getContainerDetails('mongodb', 'CLOUDRON_MONGODB_TOKEN');
|
||||
|
||||
const database = await addonConfigs.getByName(app.id, 'mongodb', '%MONGODB_DATABASE');
|
||||
@@ -1625,6 +1644,8 @@ async function backupMongoDb(app, options) {
|
||||
|
||||
debug('Backing up mongodb');
|
||||
|
||||
if (!await hasAVX()) throw new BoxError(BoxError.ADDONS_ERROR, 'Error backing up mongodb. CPU has no AVX support');
|
||||
|
||||
const result = await getContainerDetails('mongodb', 'CLOUDRON_MONGODB_TOKEN');
|
||||
|
||||
const database = await addonConfigs.getByName(app.id, 'mongodb', '%MONGODB_DATABASE');
|
||||
@@ -1639,6 +1660,8 @@ async function restoreMongoDb(app, options) {
|
||||
|
||||
debug('restoreMongoDb');
|
||||
|
||||
if (!await hasAVX()) throw new BoxError(BoxError.ADDONS_ERROR, 'Error restoring mongodb. CPU has no AVX support');
|
||||
|
||||
const result = await getContainerDetails('mongodb', 'CLOUDRON_MONGODB_TOKEN');
|
||||
|
||||
const database = await addonConfigs.getByName(app.id, 'mongodb', '%MONGODB_DATABASE');
|
||||
@@ -2058,3 +2081,11 @@ async function getDynamicEnvironmentOidc(app, options) {
|
||||
|
||||
return tmp;
|
||||
}
|
||||
|
||||
async function checkAddonsSupport(addons) {
|
||||
assert.strictEqual(typeof addons, 'object');
|
||||
|
||||
if (addons.mongodb && !await hasAVX()) return new BoxError(BoxError.BAD_FIELD, 'Addon MongoDB requires AVX support');
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user