After the DC-005 module reorganization (41 files moved into src/ subdirs),
138 test suites failed because the refactor script's path-rewrite logic
missed three categories:
1. Files inside src/ doing 'require("./src/...")' — should be 'require("../...")'
2. Files in src/X/Y/ doing 'require("../../../src/...")' — should be 'require("../../...")'
3. Test files in __tests__/ with leftover 'require("../../../src/...")' paths
Root cause: the original refactor script ran before all files were moved,
so it computed relative paths against stale filesystem state.
Result:
- 30/30 test suites pass
- 879/879 tests pass (was: 18/30 suites, 614/687 tests)
Also fixed:
- routes/apps/restore.js: wrong responses import path
- routes/*/*.js: '../../src/utilities/X' → '../src/utilities/X' (depth 2 routes)
68 lines
1.7 KiB
JavaScript
68 lines
1.7 KiB
JavaScript
/**
|
|
* Docker context - Docker client and operations
|
|
*/
|
|
const Docker = require('dockerode');
|
|
const { DOCKER } = require('../utilities/constants');
|
|
|
|
const docker = new Docker();
|
|
|
|
/**
|
|
* Pull a Docker image with timeout protection
|
|
*/
|
|
function dockerPull(imageName, timeoutMs = DOCKER.TIMEOUT) {
|
|
return new Promise((resolve, reject) => {
|
|
const timer = setTimeout(
|
|
() => reject(new Error(`Docker pull timed out after ${timeoutMs / 1000}s: ${imageName}`)),
|
|
timeoutMs
|
|
);
|
|
docker.pull(imageName, (err, stream) => {
|
|
if (err) {
|
|
clearTimeout(timer);
|
|
return reject(err);
|
|
}
|
|
docker.modem.followProgress(stream, (err, output) => {
|
|
clearTimeout(timer);
|
|
if (err) return reject(err);
|
|
resolve(output);
|
|
});
|
|
});
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Find a running Docker container by name substring
|
|
*/
|
|
async function findContainerByName(name, opts = { all: false }) {
|
|
const containers = await docker.listContainers(opts);
|
|
const match = containers.find(c =>
|
|
c.Names.some(n => n.toLowerCase().includes(name.toLowerCase()))
|
|
);
|
|
return match || null;
|
|
}
|
|
|
|
/**
|
|
* Get all host ports currently in use by Docker containers
|
|
*/
|
|
async function getUsedPorts() {
|
|
const containers = await docker.listContainers({ all: false });
|
|
const ports = new Set();
|
|
for (const c of containers) {
|
|
for (const p of (c.Ports || [])) {
|
|
if (p.PublicPort) ports.add(p.PublicPort);
|
|
}
|
|
}
|
|
return ports;
|
|
}
|
|
|
|
function createDockerContext(dockerSecurity) {
|
|
return {
|
|
client: docker,
|
|
pull: dockerPull,
|
|
findContainer: findContainerByName,
|
|
getUsedPorts,
|
|
security: dockerSecurity,
|
|
};
|
|
}
|
|
|
|
module.exports = { createDockerContext };
|