Skip to content
Snippets Groups Projects
Commit 858e6ac4 authored by Robin Leber's avatar Robin Leber
Browse files

initial commit

parents
No related branches found
No related tags found
No related merge requests found
# Node modules
node_modules/
# Logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov/
# Coverage directory used by tools like istanbul
coverage/
*.lcov
# nyc test coverage
.nyc_output/
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt/
# Bower dependency directory (https://bower.io/)
bower_components/
# Node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
jspm_packages/
# TypeScript v1 declaration files
typings/
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Microbundle cache
.rpt2_cache
# Verwende ein Basis-Image als Ausgangspunkt
FROM node:14
# Setze das Arbeitsverzeichnis im Container
# WORKDIR
# Kopiere die package.json und package-lock.json in das Arbeitsverzeichnis
COPY package*.json ./
# Installiere Abhängigkeiten
RUN npm install
# Kopiere den Rest des Codes in das Arbeitsverzeichnis
COPY . .
# Setze den Befehl, der ausgeführt wird, wenn der Container gestartet wird
CMD ["node", "docker.js"]
[
{
"type": "Sender",
"id": "7470e3ef-d810-46e9-8d17-5f5153eccd81",
"code": "// publisher.js\nconst amqp = require('amqplib/callback_api');\n\nconst rabbitmqUrl = 'amqp://mquser:mqpass@rabbit:5672';\n\namqp.connect(rabbitmqUrl, (error0, connection) => {\n if (error0) {\n throw error0;\n }\n connection.createChannel((error1, channel) => {\n if (error1) {\n throw error1;\n }\n\n const queue = 'hello';\n\n channel.assertQueue(queue, {\n durable: false\n });\n\n const sendMessage = () => {\n const msg = 'Hello World! ' + new Date().toISOString();\n channel.sendToQueue(queue, Buffer.from(msg));\n console.log(\" [x] Sent '%s'\", msg);\n };\n\n setInterval(sendMessage, 1000);\n });\n});\n"
},
{
"type": "Receiver",
"id": "4e6acb5f-49f6-40ea-a7d0-2e84bb601897",
"code": "// consumer.js\nconst amqp = require('amqplib/callback_api');\n\nconst rabbitmqUrl = 'amqp://mquser:mqpass@rabbit:5672';\n\namqp.connect(rabbitmqUrl, (error0, connection) => {\n if (error0) {\n throw error0;\n }\n connection.createChannel((error1, channel) => {\n if (error1) {\n throw error1;\n }\n\n const queue = 'hello';\n\n channel.assertQueue(queue, {\n durable: false\n });\n\n console.log(\" [*] Waiting for messages in %s. To exit press CTRL+C\", queue);\n\n channel.consume(queue, (msg) => {\n console.log(\" [x] Received '%s'\", msg.content.toString());\n }, {\n noAck: true\n });\n });\n});\n"
}
]
\ No newline at end of file
index.js 0 → 100644
const express = require("express");
const bodyParser = require("body-parser");
const cors = require("cors");
const {
emptyCustomCodeDatabase,
clearDocker,
} = require("./src/functions/helperFunctions");
const customCodeRouter = require("./src/routes/customCodeRouter");
const deployRouter = require("./src/routes/deployRouter");
const server = express();
const PORT = 3001;
server.use(cors());
server.use(bodyParser.json());
server.use("/customCode", customCodeRouter);
server.use("/deploy", deployRouter);
server.get("/", (req, res) => {
res.send("Hello World");
});
emptyCustomCodeDatabase();
// clearDocker();
server.listen(PORT, () => {
console.log(`Server listening on port ${PORT}`);
});
This diff is collapsed.
{
"dependencies": {
"amqplib": "^0.10.4",
"cors": "^2.8.5",
"express": "^4.19.2"
}
}
const { spawnSync } = require("child_process");
function startRabbitmq() {
console.log(`::Start building DockerImage for RABBITMQ`);
let processPullRabbitmq = spawnSync(`docker pull rabbitmq:management`, [], {
shell: true,
encoding: "utf8",
stdio: ["inherit", "inherit", "pipe"],
});
let processNetwork = spawnSync(`docker network create rabbitmq-network`, [], {
shell: true,
encoding: "utf8",
stdio: ["inherit", "inherit", "pipe"],
});
let process = spawnSync(
`docker run -d --hostname my-rabbit --name rabbit --network rabbitmq-network -e RABBITMQ_DEFAULT_USER=mquser -e RABBITMQ_DEFAULT_PASS=mqpass -p 15672:15672 -p 5672:5672 --restart=unless-stopped rabbitmq:management`,
[],
{
shell: true,
encoding: "utf8",
stdio: ["inherit", "inherit", "pipe"],
}
);
if (processPullRabbitmq.stderr) {
console.log(`::Rabbitmq Pull failed`);
throw new Error(process.stderr);
}
if (processNetwork.stderr) {
console.log(`::Docker Network for rabbitmq failed`);
throw new Error(process.stderr);
}
if (process.stderr) {
console.log(`::DockerImage for RABBITMQ build failed!`);
throw new Error(process.stderr);
}
}
function buildDockerImage(path, dockerImageName) {
console.log(`::Start building DockerImage ${dockerImageName}`);
let process = spawnSync(
`docker-buildx build -t ${dockerImageName} -q ${path}`,
[],
{
shell: true,
encoding: "utf-8",
stdio: ["inherit", "inherit", "pipe"],
}
);
if (process.stderr) {
console.log(`::DockerImage ${dockerImageName} build failed!`);
throw new Error(process.stderr);
}
}
function runDockerContainerMultiPortMapping(
dockerImageName,
dockerContainerName,
portMappingArray
) {
let portMappingString = portMappingArray
.map((element) => "-p " + element.hostPort + ":" + element.containerPort)
.join(" ");
console.log(
`::Start running DockerContainer for image ${dockerImageName}...`
);
let process = spawnSync(
`docker run --name ${dockerContainerName} -h ${dockerContainerName} -d --network rabbitmq-network ${portMappingString} ${dockerImageName}`,
[],
{ shell: true, stdio: "inherit" }
);
if (process.stderr) {
console.log(`::DockerContainer ${dockerContainerName} run failed!`);
throw new Error(process.stderr);
}
console.log(`::Container ${dockerContainerName} running...`);
}
function runDockerContainer(
dockerImageName,
dockerContainerName,
hostPort,
containerPort
) {
runDockerContainerMultiPortMapping(dockerImageName, dockerContainerName, [
{ hostPort: hostPort, containerPort: containerPort },
]);
}
function killDockerContainer(dockerContainerName) {
console.log(`::Start killing DockerContainer ${dockerContainerName}...`);
let process = spawnSync(`docker kill ${dockerContainerName}`, [], {
shell: true,
stdio: "inherit",
});
console.log(`::DockerContainer ${dockerContainerName} killed`);
}
function removeDockerContainer(dockerContainerName) {
console.log(`::Start remove DockerContainer ${dockerContainerName}...`);
let process = spawnSync(`docker rm ${dockerContainerName}`, [], {
shell: true,
stdio: "inherit",
});
console.log(`::DockerContainer ${dockerContainerName} removed`);
}
function removeDockerImage(dockerImageName) {
console.log(`::Start remove DockerImage ${dockerImageName}...`);
let process = spawnSync(`docker image rm ${dockerImageName}`, [], {
shell: true,
encoding: "utf-8",
stdio: ["inherit", "inherit", "pipe"],
});
if (process.stderr) {
console.log(`::DockerImage ${dockerImageName} could not be removed!`);
console.log(process.stderr);
throw new Error(process.stderr);
}
}
function getRunningContainerInfosByName(name) {
console.log(`::Start get running DockerContainers by name '${name}'...`);
let process = spawnSync(
`docker ps --filter name=${name} --format {{.Names}}`,
[],
{ shell: true, encoding: "utf-8" }
);
let commaSeparatedOutputOfConsole = process.stdout.replace(
/(\r\n|\n|\r)/gm,
","
);
let containerIDsArray = commaSeparatedOutputOfConsole.split(",").slice(0, -1);
let containerInfosArray = [];
containerIDsArray.forEach(function (element, index) {
let processGetPort = spawnSync(`docker port ${element}`, [], {
shell: true,
encoding: "utf-8",
});
let port = processGetPort.stdout.split(":")[1];
containerInfosArray.push({ name: element, port: port });
});
return containerInfosArray;
}
function getInternalIPAddressOfDockerContainer(dockerContainerName) {
console.log(
`::Start get IPAddress of DockerContainer by name '${dockerContainerName}'...`
);
let process = spawnSync(
"docker inspect -f {{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}} " +
dockerContainerName,
[],
{ shell: true, encoding: "utf-8" }
);
return process.stdout.replace(/(\r\n|\n|\r)/gm, "");
}
function getContainerImageInfosByName(name) {
console.log(`::Start get DockerImages by name '${name}*'...`);
let process = spawnSync(
`docker images ${name}* --format {{.Repository}}`,
[],
{ shell: true, encoding: "utf-8" }
);
let commaSeparatedOutputOfConsole = process.stdout.replace(
/(\r\n|\n|\r)/gm,
","
);
let imageIDsArray = commaSeparatedOutputOfConsole.split(",").slice(0, -1);
let imageInfosArray = [];
imageIDsArray.forEach(function (element, index) {
imageInfosArray.push({ name: element });
});
return imageInfosArray;
}
function buildAndRunDocker(
path,
dockerImageName,
dockerContainerName,
hostPort,
containerPort
) {
buildDockerImage(path, dockerImageName);
runDockerContainer(
dockerImageName,
dockerContainerName,
hostPort,
containerPort
);
}
module.exports = {
buildDockerImage,
runDockerContainer,
startRabbitmq,
killDockerContainer,
removeDockerContainer,
removeDockerImage,
};
const fs = require("fs").promises;
const path = require("path");
const {
startRabbitmq,
buildDockerImage,
runDockerContainer,
} = require("../docker/dockerManager");
const fillDockerJS = async (code) => {
const filePath = path.resolve(__dirname, "../../docker.js");
try {
await fs.appendFile(filePath, code);
console.log("docker.js erfolgreich befüllt");
return Promise.resolve();
} catch (err) {
console.error("Fehler beim Hinzufügen des Codes zu docker.js: ", err);
throw err;
}
};
const emptyDockerJS = async () => {
const filePath = path.resolve(__dirname, "../../docker.js");
try {
await fs.writeFile(filePath, ""); // Überschreibe den Inhalt der Datei mit einem leeren String
console.log("docker.js erfolgreich geleert");
} catch (err) {
console.error("Fehler beim Leeren der docker.js:", err);
throw err;
}
};
const emptyCustomCodeDatabase = async () => {
const filePath = path.resolve(__dirname, "../../customCodeDatabase.json");
try {
await fs.writeFile(filePath, "[]"); // Überschreibe den Inhalt der Datei mit einem leeren Array
console.log("customCodeDatabase.json erfolgreich geleert");
} catch (err) {
console.error("Fehler beim Leeren der customCodeDatabase.json:", err);
throw err;
}
};
const addCustomCodeToJson = async (newElement) => {
const dataFilePath = path.resolve(__dirname, "../../customCodeDatabase.json");
try {
const data = await fs.readFile(dataFilePath, "utf-8");
let jsonArray;
jsonArray = JSON.parse(data);
const existingFilter = jsonArray.find(
(element) => element.id === newElement.id
);
if (existingFilter) {
existingFilter.code = newElement.code;
} else {
jsonArray.push(newElement);
}
await fs.writeFile(
dataFilePath,
JSON.stringify(jsonArray, null, 2),
"utf8"
);
console.log("Neues Element erfolgreich hinzugefügt.");
} catch (err) {
console.error(err);
throw err;
}
};
const getCustomCodes = async () => {
const dataFilePath = path.resolve(__dirname, "../../customCodeDatabase.json");
try {
const data = await fs.readFile(dataFilePath, "utf-8");
const jsonData = await JSON.parse(data);
return jsonData;
} catch (err) {
console.error(err);
throw err;
}
};
function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
let HOSTPORT = 9090;
let CONTAINERPORT = 9090;
const deployArchitecture = async () => {
await startRabbitmq();
await sleep(5000);
const customCodes = await getCustomCodes();
for (const customCode of customCodes) {
await fillDockerJS(customCode.code);
const filePath = path.join(__dirname, "../../");
const dockerImageName = customCode.id;
const dockerContainerName = customCode.id;
await buildDockerImage(filePath, dockerImageName);
await runDockerContainer(
dockerImageName,
dockerContainerName,
HOSTPORT,
CONTAINERPORT
);
await emptyDockerJS();
HOSTPORT++;
CONTAINERPORT++;
}
};
const clearDocker = () => {
// Docker Container
// Docker Files
// Docker Network
};
module.exports = {
emptyDockerJS,
fillDockerJS,
emptyCustomCodeDatabase,
addCustomCodeToJson,
getCustomCodes,
deployArchitecture,
clearDocker,
};
const express = require("express");
const { addCustomCodeToJson } = require("../functions/helperFunctions");
const customCodeRouter = express.Router();
customCodeRouter.post("/", async (req, res) => {
try {
addCustomCodeToJson(req.body);
res.status(200).json({ message: "Custom Code erfolgreich hinzugefügt" });
} catch (e) {
console.error(e);
res.status(500).json({ message: "Es ist etwas schief gelaufen!" });
}
});
module.exports = customCodeRouter;
const express = require("express");
const { deployArchitecture } = require("../functions/helperFunctions");
const deployRouter = express.Router();
deployRouter.post("/", async (req, res) => {
try {
deployArchitecture();
res.status(200).json({ message: "Deployment erfolgreich!" });
} catch (e) {
console.error(e);
res.status(500).json({ message: "Deployment fehlgeschlagen!" });
}
});
module.exports = deployRouter;
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment