Skip to content
Snippets Groups Projects
Commit c3bbf182 authored by Markus Grigull's avatar Markus Grigull
Browse files

Merge branch 'feature-change-simulator-connection' into 'develop'

Feature change simulator connection

See merge request !7
parents 2543ebd4 58a77260
No related branches found
No related tags found
1 merge request!7Feature change simulator connection
......@@ -10,6 +10,7 @@ RUN npm install
# Create public directory
RUN mkdir -p /usr/src/app/public
RUN mkdir -p /usr/src/app/nodes
# Bundle app source
COPY . /usr/src/app
......
......@@ -26,7 +26,7 @@ module.exports = {
databaseURL: 'mongodb://localhost:27017/',
port: 4000,
secret: 'longsecretislong',
logLevel: 'verbose', // possible values: error, warn, info, verbose or debug
logLevel: 'debug', // possible values: error, warn, info, verbose or debug
logFile: 'log.txt',
admin: {
username: 'admin',
......
/**
* File: node.js
* Author: Markus Grigull <mgrigull@eonerc.rwth-aachen.de>
* Date: 21.06.2017
*
* This file is part of VILLASweb-backend.
*
* VILLASweb-backend is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* VILLASweb-backend is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with VILLASweb-backend. If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/
// include
var mongoose = require('mongoose');
var fs = require('fs');
var logger = require('../utils/logger');
var Schema = mongoose.Schema;
// node model
var nodeSchema = new Schema({
name: { type: String, required: true, unique: true, set: function(name) { this._name = this.name; return name; } },
endpoint: { type: String, required: true, unique: true },
config: { type: Schema.Types.Mixed, default: {} },
simulators: [{ type: Schema.Types.Mixed, default: [] }]
});
nodeSchema.post('save', function() {
// remove old file
if (this._name != null) {
var oldFile = 'nodes/' + this._name + '.conf';
fs.stat(oldFile, function(err, stat) {
if (err) {
logger.info('Old node configuration missing', err);
return;
}
if (stat.isFile()) {
fs.unlink(oldFile, function(err) {
if (err) {
logger.warn('Unable to delete old node configuration', err);
}
});
}
});
}
// create configuration file
var port = 12000;
var nodes = this.simulators.map(simulator => {
return "\t" + simulator.name + " = {\n\t\ttype = \"websocket\",\n\t\tvectorize = 1\n\t},\n" +
"\t" + simulator.name + "_RECV = {\n\t\ttype = \"socket\",\n\t\tlayer = \"udp\",\n\t\tlocal = \"*:" + (port++) + "\",\n\t\tremote = \"127.0.0.1:" + (port++) + "\"\n\t}";
});
var paths = this.simulators.map(simulator => {
return "\t{ in = \"" + simulator.name + "_RECV\", out = \"" + simulator.name + "\" }";
});
var content = "nodes = {\n" + nodes.join(",\n") + "\n};\n\npaths = (\n" + paths.join(",\n") + "\n);\n";
fs.writeFile('nodes/' + this.name + '.conf', content, function(err) {
if (err) {
logger.error('Unable to write node configuration', err);
return;
}
logger.log('info', 'Node configuration file written');
});
});
module.exports = mongoose.model('Node', nodeSchema);
......@@ -27,7 +27,7 @@ var Schema = mongoose.Schema;
// simulation model model
var simulationModelSchema = new Schema({
name: { type: String, required: true },
simulator: { type: Schema.Types.ObjectId, ref: 'Simulator', required: true },
simulator: { type: Schema.Types.Mixed, required: true },
length: { type: Number, default: 1 },
mapping: [{ type: String, default: [] }],
simulation: { type: Schema.Types.ObjectId, ref: 'Simulation', required: true }
......
......@@ -27,8 +27,7 @@
// simulator model
var simulatorSchema = new Schema({
name: { type: String, required: true },
running: { type: Boolean, default: false },
endpoint: { type: String, required: true }
config: { type: Schema.Types.Mixed, default: {} }
});
module.exports = mongoose.model('Simulator', simulatorSchema);
/**
* File: nodes.js
* Author: Markus Grigull <mgrigull@eonerc.rwth-aachen.de>
* Date: 21.06.2017
*
* This file is part of VILLASweb-backend.
*
* VILLASweb-backend is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* VILLASweb-backend is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with VILLASweb-backend. If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/
// include
var express = require('express');
var logger = require('../utils/logger');
// models
var Node = require('../models/node');
// create router
var router = express.Router();
// routes
router.get('/nodes', function(req, res) {
// get all nodes
Node.find(function(err, nodes) {
if (err) {
logger.error('Unable to receive nodes', err);
return res.status(400).send(err);
}
res.send({ nodes: nodes });
});
});
router.post('/nodes', function(req, res) {
// create new node
var node = new Node(req.body.node);
node.save(function(err) {
if (err) {
logger.error('Unable to create node', err);
return res.status(400).send(err);
}
res.send({ node: node });
});
});
router.put('/nodes/:id', function(req, res) {
// get node
Node.findOne({ _id: req.params.id }, function(err, node) {
if (err) {
logger.log('verbose', 'PUT Unknown node for id: ' + req.params.id);
return res.status(400).send(err);
}
// update all properties
for (property in req.body.node) {
node[property] = req.body.node[property];
}
// save the changes
node.save(function(err) {
if (err) {
logger.error('Unable to save node', node);
return res.status(500).send(err);
}
res.send({ node: node });
});
});
});
router.get('/nodes/:id', function(req, res) {
Node.findOne({ _id: req.params.id }, function(err, node) {
if (err) {
logger.log('verbose', 'GET Unknown node for id: ' + req.params.id);
return res.status(400).send(err);
}
res.send({ node: node });
});
});
router.delete('/nodes/:id', function(req, res) {
Node.findOne({ _id: req.params.id }, function(err, node) {
if (err) {
logger.log('verbose', 'DELETE Unknown node for id: ' + req.params.id);
return res.status(400).send(err);
}
node.remove(function(err) {
if (err) {
logger.error('Unable to remove node', node);
return res.status(500).send(err);
}
res.send({});
});
});
});
module.exports = router;
......@@ -38,6 +38,7 @@ var simulationModels = require('./routes/simulationModels');
var simulators = require('./routes/simulators');
var upload = require('./routes/upload');
var files = require('./routes/files');
var nodes = require('./routes/nodes');
var User = require('./models/user');
......@@ -93,8 +94,10 @@ app.use('/api/v1', simulationModels);
app.use('/api/v1', simulators);
app.use('/api/v1', upload);
app.use('/api/v1', files);
app.use('/api/v1', nodes);
app.use('/public', express.static(__dirname + '/public'));
app.use('/nodes', express.static(__dirname + '/nodes'));
// catch 404 and forward to error handler
app.use(function(req, res, next) {
......
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