diff options
Diffstat (limited to 'admportal/server')
-rw-r--r-- | admportal/server/adminPortal.db | bin | 0 -> 3072 bytes | |||
-rw-r--r-- | admportal/server/app.js | 69 | ||||
-rw-r--r-- | admportal/server/netdb_updater.js | 749 | ||||
-rw-r--r-- | admportal/server/npm-debug.log | 18 | ||||
-rw-r--r-- | admportal/server/router/index.js | 18 | ||||
-rwxr-xr-x | admportal/server/router/routes/Odl.js | 594 | ||||
-rwxr-xr-x | admportal/server/router/routes/admin.js | 83 | ||||
-rw-r--r-- | admportal/server/router/routes/csp.js | 84 | ||||
-rw-r--r-- | admportal/server/router/routes/dbRoutes.js | 1192 | ||||
-rw-r--r-- | admportal/server/router/routes/gamma.js | 1667 | ||||
-rw-r--r-- | admportal/server/router/routes/helpers.js | 66 | ||||
-rw-r--r-- | admportal/server/router/routes/mobility.js | 1339 | ||||
-rw-r--r-- | admportal/server/router/routes/network.js | 400 | ||||
-rw-r--r-- | admportal/server/router/routes/odl.js | 258 | ||||
-rw-r--r-- | admportal/server/router/routes/preload.js | 154 | ||||
-rw-r--r-- | admportal/server/router/routes/root.js | 111 | ||||
-rw-r--r-- | admportal/server/router/routes/sla.js | 369 | ||||
-rw-r--r-- | admportal/server/router/routes/user.js | 169 | ||||
-rw-r--r-- | admportal/server/router/routes/vnf.js | 603 |
19 files changed, 7943 insertions, 0 deletions
diff --git a/admportal/server/adminPortal.db b/admportal/server/adminPortal.db Binary files differnew file mode 100644 index 00000000..18429e46 --- /dev/null +++ b/admportal/server/adminPortal.db diff --git a/admportal/server/app.js b/admportal/server/app.js new file mode 100644 index 00000000..33cdb64f --- /dev/null +++ b/admportal/server/app.js @@ -0,0 +1,69 @@ +var express = require('express'); +var app = express(); +var path = require('path'); +var session = require('express-session'); +var cookieParser = require('cookie-parser'); +var bodyParser = require('body-parser'); +var PropertiesReader = require('properties-reader'); +var properties = PropertiesReader(process.argv[2]); //property file passed +var morgan = require('morgan'); +var _ = require('lodash'); +//var multer = require('multer'); +//var done=false; + +// Check to make sure SDNC_CONFIG_DIR is set +var sdnc_config_dir = process.env.SDNC_CONFIG_DIR; +if ( typeof sdnc_config_dir == 'undefined' ) +{ + console.log('ERROR the SDNC_CONFIG_DIR environmental variable is not set.'); + return; +} + + +var moptions = { "stream": +{ + write: function(str) + { + if ( str.indexOf("/javascript") == -1 && str.indexOf("/stylesheets") == -1) + { + console.log(str); + } + } +} +}; +var accesslog = morgan( "|:method|HTTP/:http-version|:status|:url - requestIP-:remote-addr", moptions); + +//var favicon = require('serve-favicon'); + +// initialize session objects +app.use(session({ + secret:'SDN7C', + resave: false, + saveUninitialized: false +})); + +app.use(cookieParser()); +app.use(bodyParser.urlencoded({ + extended: true +})); + +app.use(accesslog); // http access log +app.use(express.static(process.cwd() + '/public')); // static files + + +//app.use('trust proxy', true); +app.enable('trust proxy'); + +// view engine setup +app.set('views', path.join(__dirname, '../views')); +app.set('view engine', 'ejs'); + + +var router = require('./router')(app); + +// Error Handling +app.use(function(err,req,res,next) { + res.status(err.status || 500); +}); + +module.exports = app; diff --git a/admportal/server/netdb_updater.js b/admportal/server/netdb_updater.js new file mode 100644 index 00000000..6dde27b9 --- /dev/null +++ b/admportal/server/netdb_updater.js @@ -0,0 +1,749 @@ +var log4js = require('log4js'); +var http = require('http'); +var async = require('async'); +var properties = require(process.env.SDNC_CONFIG_DIR + '/netdb-updater.json'); +var admProperties = require(process.env.SDNC_CONFIG_DIR + '/admportal.json'); +var csvtojson = require('csvtojson'); +var mysql = require('mysql'); +var moment = require('moment'); +var os = require('os'); +var fs = require('fs.extra'); + +// Check to make sure SDNC_CONFIG_DIR is set +var sdnc_config_dir = process.env.SDNC_CONFIG_DIR; +if ( typeof sdnc_config_dir == 'undefined' ) +{ + console.log('ERROR the SDNC_CONFIG_DIR environmental variable is not set.'); + return; +} + +// SETUP LOGGER +log4js.configure(process.env.SDNC_CONFIG_DIR + '/netdb.log4js.json'); +var logger = log4js.getLogger('netdb'); +logger.setLevel(properties.netdbLogLevel); + +var yargs = require('yargs') + .usage("\nUsage: node netdb_updater -t link_master|router_master") + .demand('t') + .alias('t', 'table') + .example("Example: node netdb_updater -t link_master","Update SDNC LINK_MASTER table from NetDB.") + .argv; + +var dbTable = yargs.table; +var debug = properties.netdbDebug; +var env = properties.netdbEnv; +var retSuccess = false; + +// DB Setup +var currentDB = ''; +var dbConnection = ''; +var db01 = ''; +var db02 = ''; +var count = 0; +var errorMsg = []; + +var dbtasks = []; +dbtasks.push( function(callback) { checkParams(callback); } ); +dbtasks.push( function(callback) { dbConnect(callback); } ); +//dbtasks.push( function(callback) { netdb(callback); } ); + +logger.debug('\n\n********** START PROCESSING - Env=' + env + ' Debug=' + debug + ' **********'); + +async.series(dbtasks, function(err,result){ + if(err) { + logger.error(err + ' COUNT: ' + count); + } + else { + if ( errorMsg.length > 0 ){ + logger.error(errorMsg); + } + } +}); + + +function checkParams(scb){ + if ( dbTable != 'link_master' && dbTable != 'router_master' ){ + scb("Invalid parameter passed in '" + dbTable + " ' exiting.'"); + } + else{ + scb(null); + } +} + + +async.whilst( + function () { return count < properties.netdbRetryInterval }, + function (callback) { + if ( dbTable == 'link_master' ){ + getLinkMaster(callback); + } + else if (dbTable == 'router_master'){ + getRouterMaster(callback); + } + else{ // should never hit this condition + logger.debug("Invalid parameter passed in '" + dbTable + " ' exiting.'"); + } + }, + function (err) { +logger.debug('whilst err function errorMsg = ' + errorMsg); + // report error + if ( errorMsg.length > 0 ){ + logger.debug(errorMsg + ' COUNT: ' + count); + process.exit(1); + } + else{ + logger.debug('success'); + process.exit(0); + } + } +); + + +function returnError(emsg, cb){ + retSuccess=false; + errorMsg.push(emsg); + if ( count == properties.netdbRetryInterval ) { logger.error(errorMsg); } + setTimeout( function(){ + cb(null); + }, properties.netdbWaitTime); +} + +function returnSuccess(cb){ +logger.debug('inside returnSuccess'); + errorMsg = ''; + //var cnt = properties.netdbRetryInterval; + //logger.debug('b4 inc returnSuccess count=' + count); + //count = ++cnt; + //logger.debug('after inc returnSuccess count=' + count); + //cb(null); + retSuccess=true; +process.exit(0); +} + +function getRouterMaster(cb){ + + logger.info('getRouterMaster debug=' + debug + ' count=' + count); + + // setup connection + var netdbEnv = properties.netdbEnv; + var auth_param = ''; + if ( netdbEnv == 'e2e' || netdbEnv == 'prod' ){ + // conexus network + auth_param = '?auth=' + admProperties['ip-addresses']['eth2'] + ';' + }else{ + // app network + auth_param = '?auth=' + admProperties['ip-addresses']['eth1:0'] + ';' + } + var username = properties.netdbUser;; + var password = properties.netdbPassword; + var date = moment().format('YYYYMMDD'); + var auth = 'Basic ' + new Buffer(username + ':' + password).toString('base64'); + var host = properties.netdbHost; + var port = properties.netdbPort; + var path = '/' + properties.netdbPath + + '/' + properties.netdbNetwork + + '/' + properties.netdbApiName + + auth_param + + 'client=' + properties.netdbClientName + ';' + + 'date=' + date + ';' + + 'reportName=' + dbTable + ';' + + 'type=' + properties.netdbType; + + var header = { 'Content-Type': 'text/csv' }; + //var header = {'Host': host, 'Authorization': auth, 'Content-Type': 'text/csv' }; + var options = { + method : "GET", + path : path, + host : host, + port : port, + headers : header + }; + + logger.debug('options:\n' + JSON.stringify(options,null,2)); + + var request = http.request(options, function(response) { + + var response_str = ''; + if ( retSuccess == true ){ + var cnt = properties.netdbRetryInterval; + count = ++cnt; + } + else{ + count++; + } + + logger.debug('STATUS: ' + response.statusCode + ' content-type=' + response.headers['content-type']); + + // Read the response from ODL side + response.on('data', function(chunk) { + response_str += chunk; + }); + + response.on('end', function() { + + logger.debug('HEADERS:' + JSON.stringify(response.headers)); + + if(response.statusCode == 200){ + + if(response_str.length > 0){ + + // save the upload + try{ + fs.writeFileSync('/sdncvar/sdnc/files/netdb-updater/' + moment().unix() + ".netdb." + dbTable + '.csv', response_str); + } + catch(e){ + // this is not in reqs, if it fails keep on going. + logger.error('Error writing NetDB file:' + e); + } + + if (response.headers['content-type'].indexOf('html') > 0){ + returnError('Error:Unexpected content-type:' + response.headers['content-type'] + ' returned.\n', cb); + return; + } + // need to parse csv file + var Converter=csvtojson.Converter; + var csvConverter = new Converter({ + noheader:true + }); + var routerMasterSQL = ''; + + // end_parsed will be emitted once parsing is finished + csvConverter.on("end_parsed", function(respObj){ + + routerMasterSQL = routerMasterSQL.concat("INSERT INTO ROUTER_MASTER (crs_name, loopback_ip)"); + for ( var x=0; x < respObj.length; x++ ){ + + if ( respObj[x].field1.length == 0 ){ + returnError('Required field [crs_name] is null.', cb); + } + + if (x!=0){ + routerMasterSQL = routerMasterSQL.concat(' union '); + } + routerMasterSQL = routerMasterSQL.concat(" SELECT " + + "'" + respObj[x].field1 + "'," + + "'" + respObj[x].field2 + "' FROM DUAL "); + } + //logger.debug('SQL: ' + routerMasterSQL); + + if (debug != 'debug' && env != 'dev'){ + + var tasks = []; + tasks.push( function(callback) { updateRouterMaster(routerMasterSQL,callback); } ); + async.series(tasks, function(err,result){ + if(err) { + returnError(err,cb); + return; + } + else { + logger.info('*** Router Master Table Replaced ***'); + returnSuccess(cb); + return; + } + }); + } + else{ +logger.debug('*** debug ***'); + returnSuccess(cb); + return; + } + + }); + csvConverter.on("error",function(errMsg,errData){ + returnError(errMsg,cb); + return; + }); + csvConverter.fromString(response_str, function(err,result){ + if(err){ + returnError(err,cb); + return; + } + }); + } + else{ + //logger.debug("no data"); + returnError('no data',cb); + return; + } + } + else if(response.statusCode == 404){ + returnError('Router Master Table for ' + date + ' is not Available.',cb); + return; + } + else { + returnError('Status Code:' + response.statudCode + ' returned for Router Master Table query.',cb); + return; + } + }); + }); + request.on('error', function(e) { + if ( retSuccess == true ){ + var cnt = properties.netdbRetryInterval; + count = ++cnt; + } + else{ + count++; + } + returnError(e,cb); + return; + }); + request.end(); +} + +function getLinkMaster(cb){ + + logger.info('getLinkMaster debug=' + debug + ' count=' + count); + + // setup connection + var netdbEnv = properties.netdbEnv; + var auth_param = ''; + if ( netdbEnv == 'e2e' || netdbEnv == 'prod' ){ + // conexus network + auth_param = '?auth=' + admProperties['ip-addresses']['eth2'] + ';' + }else{ + // app network + auth_param = '?auth=' + admProperties['ip-addresses']['eth1:0'] + ';' + } + var username = properties.netdbUser;; + var password = properties.netdbPassword; + var auth = 'Basic ' + new Buffer(username + ':' + password).toString('base64'); + var host = properties.netdbHost; + var port = properties.netdbPort; + var date = moment().format('YYYYMMDD'); + var path = '/' + properties.netdbPath + + '/' + properties.netdbNetwork + + '/' + properties.netdbApiName + + auth_param + + 'client=' + properties.netdbClientName + ';' + + 'date=' + date + ';' + + 'reportName=' + dbTable + ';' + + 'type=' + properties.netdbType; + + var header = { 'Content-Type': 'text/csv' }; + //var header = {'Host': host, 'Authorization': auth, 'Content-Type': 'text/csv' }; + var options = { + method : "GET", + path : path, + host : host, + port : port, + headers : header + }; + + logger.debug('options:\n' + JSON.stringify(options,null,2)); + + var request = http.request(options, function(response) { + + logger.debug('STATUS: ' + response.statusCode + ' content-type=' + response.headers['content-type']); + + if ( retSuccess == true ){ + var cnt = properties.netdbRetryInterval; + count = ++cnt; + } + else{ + count++ + } + + var response_str = ''; + + // Read the response from ODL side + response.on('data', function(chunk) { + response_str += chunk; + }); + + response.on('end', function() { + + logger.debug('HEADERS:' + JSON.stringify(response.headers)); + + if(response.statusCode == 200){ + + if(response_str.length > 0){ + + //logger.debug('response_str=' + response_str); + // save the upload + try{ + fs.writeFileSync('/sdncvar/sdnc/files/netdb-updater/' + moment().unix() + ".netdb." + dbTable + '.csv', response_str); + } + catch(e){ + // this is not in reqs, if it fails keep on going. + logger.error('Error writing NetDB file:' + e); + } + + if (response.headers['content-type'].indexOf('html') > 0){ + returnError('Error:Unexpected content-type:' + response.headers['content-type'] + ' returned.\n', cb); + return; + } + // need to parse csv file + var Converter=csvtojson.Converter; + var csvConverter = new Converter({ + noheader:true + }); + + var linkMasterSQL = ''; + + // end_parsed will be emitted once parsing is finished + csvConverter.on("end_parsed", function(jsonObj){ + + linkMasterSQL = linkMasterSQL.concat("INSERT INTO LINK_MASTER (link_interface_ip, source_crs_name, destination_crs_name, link_speed, default_cost, bundle_name, shutdown)"); + for ( var x=0; x < jsonObj.length; x++ ){ + if ( jsonObj[x].field1.length == 0 ){ + returnError('Required field [link_interface_ip] is null.', cb); + return; + } + if ( jsonObj[x].field2.length == 0 ){ + returnError('Required field [source_crs_name] is null.', cb); + return; + } + if ( jsonObj[x].field3.length == 0 ){ + returnError('Required field [destination_crs_name] is null.', cb); + return; + } + if (x!=0){ + linkMasterSQL = linkMasterSQL.concat(' union '); + } + + linkMasterSQL = linkMasterSQL.concat(" SELECT " + + "'" + jsonObj[x].field1 + "'," + + "'" + jsonObj[x].field2 + "'," + + "'" + jsonObj[x].field3 + "'," + + jsonObj[x].field4 + "," + + jsonObj[x].field5 + "," + + "'" + jsonObj[x].field6 + "'," + + "'" + jsonObj[x].field7 + "' FROM DUAL"); + } + //logger.debug('SQL: ' + linkMasterSQL); + + if (debug != 'debug' && env != 'dev'){ + // update db + var tasks = []; + tasks.push( function(callback) { updateLinkMaster(linkMasterSQL,callback); } ); + async.series(tasks, function(err,result){ + if(err) + { + returnError(err,cb); + return; + } + else + { + logger.info('*** Link Master Table Replaced ***'); + returnSuccess(cb); + return; + } + }); + } + else{ + returnSuccess(cb); + return; + } + }); + csvConverter.on("error",function(errMsg,errData){ + returnError(errMsg,cb); + return; + }); + csvConverter.fromString(response_str, function(err,result){ + if(err){ + returnError(errMsg,cb); + return; + } + }); + } + else{ + returnError('no data',cb); + return; + } + } + else if(response.statusCode == 404){ + returnError('Link Master Table for ' + date + ' is not Available.',cb); + return; + } + else { + returnError('Status Code:' + response.statudCode + ' returned for Link Master Table query.',cb); + return; + } + }); + }); + request.on('error', function(e) { + if ( retSuccess == true ){ + var cnt = properties.netdbRetryInterval; + count = ++cnt; + } + else{ + count++ + } + returnError(e,cb); + return; + }); + request.end(); +} + + +function dbConnect(callback){ + + var l_db01 = admProperties['databases']['0']; + var db01Array = l_db01.split("|"); + db01 = db01Array[0]; + + var l_db02 = admProperties['databases']['1']; + var db02Array = l_db02.split("|"); + db02 = db02Array[0]; + + if ( admProperties.dbFabric == 'true' ) + { + logger.debug('connectFabric()'); + + // testing + var fabric_connection = mysql.createConnection({ + host : admProperties.dbFabricServer, + user : admProperties.dbFabricUser, + password : admProperties.dbFabricPassword, + database : admProperties.dbFabricDB, + port : admProperties.dbFabricPort + }); + + + fabric_connection.connect( function(err) { + + if (err) { + callback(err); + return; + } + fabric_connection.query('CALL dump.servers()', function(err,rows) { + + var masterDB = ''; + + if (err) { + callback(err); + return; + } + fabric_connection.end(); + logger.debug('rows: ' + JSON.stringify(rows,null,2)); + + // fabric servers + for ( var x=0; x<rows.length; x++) + { + // database servers + for ( var y=0; y<rows[x].length; y++) + { + var row = rows[x][y]; + if (row.group_id == admProperties.dbFabricGroupId) + { + if (row.status == '3' && row.mode == '3'){ + masterDB = row.host; + } + } + } + } + logger.debug('currentDB: ' + currentDB); + logger.debug('masterDB: ' + masterDB); + + if (masterDB.length <=0) + { + logger.debug('no writable master db'); + callback('no writable master db'); + return; + } + + if ( currentDB != masterDB ) + { + currentDB = masterDB; + dbConnection = mysql.createConnection({ + connectionLimit : admProperties.dbConnLimit, + host : currentDB, + user : admProperties.dbUser, + password : admProperties.dbPassword, + database : admProperties.dbName, + multipleStatements: true, + debug : false + }); + } + logger.debug('new currentDB: ' + currentDB); + logger.debug('new masterDB: ' + masterDB); + callback(null); + return; + }); + fabric_connection.on('error', function(err){ + logger.debug(err.code); + callback(err); + return; + }); + }); + } + else + { + currentDB = db01; + + var dbConn = mysql.createConnection({ + connectionLimit : admProperties.dbConnLimit, + host : currentDB, + user : admProperties.dbUser, + password : admProperties.dbPassword, + database : admProperties.dbName, + multipleStatements: true, + debug : false + }); + logger.debug('initDB currentDB=' + currentDB); + + dbConn.connect(function(err,connection){ + + if(err){ + logger.debug( String(err) ); // ALARM + callback(err); + return; + } + var sql = 'select @@read_only'; + dbConn.query(sql, function(err,result){ + dbConn.end(); + + // @@read_only=0 means db is writable + logger.debug('@@read_only=' + result[0]['@@read_only']); + if ( result[0]['@@read_only'] != '0' ) + { + if (currentDB == db01) + { + currentDB = db02; + } + else + { + currentDB = db01; + } +logger.debug('initDB reconnect to currentDB '+ currentDB); + var newConnection = mysql.createConnection({ + connectionLimit : admProperties.dbConnLimit, + host : currentDB, + user : admProperties.dbUser, + password : admProperties.dbPassword, + database : admProperties.dbName, + multipleStatements: true, + debug : false + }); // end create + dbConnection = newConnection; + callback(null); + return; + } + dbConnection = dbConn; + callback(null); + return; + }); + }); + } +} + +function updateLinkMaster(linkMasterSQL,callback){ + +logger.debug('updateLinkMaster'); + + dbConnection.connect(function(err,connection) + { + if(err){ + logger.debug( String(err) ); // ALARM + callback(err, 'Unable to get database connection.'); + return; + } + }); // end connection + dbConnection.beginTransaction(function(err) { + if(err){ + //dbConnection.release(); + callback(err,String(err)); + return; + } + var sql = "DELETE FROM LINK_MASTER"; + dbConnection.query(sql,function(err,result) + { + if(err){ + //dbConnection.release(); + dbConnection.rollback( {rollback: 'NO RELEASE'},function(){ + callback(err,String(err)); + return; + }); + } + dbConnection.query(linkMasterSQL,function(err,result) + { + if(err){ + //dbConnection.release(); + dbConnection.rollback( {rollback: 'NO RELEASE'},function(){ + callback(err,String(err)); + return; + }); + } + dbConnection.commit(function(err){ + if(err){ + //dbConnection.release(); + dbConnection.rollback( {rollback: 'NO RELEASE'},function(){ + callback(err,String(err)); + return; + }); + } + //dbConnection.release(); + callback(null); + }); + }) + }); + }); // end transaction +} + +function updateRouterMaster(routerMasterSQL,callback){ + +logger.debug('updateRouterMaster'); + + dbConnection.connect(function(err,connection) + { + if(err){ + logger.debug( String(err) ); // ALARM + callback(err, 'Unable to get database connection.'); + return; + } + }); // end connection + dbConnection.beginTransaction(function(err) { + if(err){ + //dbConnection.release(); + callback(err,String(err)); + return; + } + var sql = "DELETE FROM ROUTER_MASTER"; + dbConnection.query(sql,function(err,result) + { + if(err){ + //dbConnection.release(); + dbConnection.rollback( function(){ + callback(err,String(err)); + return; + }); + } + dbConnection.query(routerMasterSQL,function(err,result) + { + if(err){ + //dbConnection.release(); + dbConnection.rollback( function(){ + callback(err,String(err)); + return; + }); + } + dbConnection.commit(function(err){ + if(err){ + //dbConnection.release(); + dbConnection.rollback( function(){ + callback(err,String(err)); + return; + }); + } + //dbConnection.release(); + callback(null); + }); + }) + }); + }); // end transaction +} + +/* + + logger.debug('getLinkMaster - count=' + count); + if ( true ) { + //fail + setTimeout( function(){ + cb(null);}, properties.netdbWaitTime); + return; + } + // success + count = 10; + cb(null); +} +*/ diff --git a/admportal/server/npm-debug.log b/admportal/server/npm-debug.log new file mode 100644 index 00000000..40e151a2 --- /dev/null +++ b/admportal/server/npm-debug.log @@ -0,0 +1,18 @@ +0 info it worked if it ends with ok +1 verbose cli [ '/usr/bin/node', '/usr/bin/npm', 'start' ] +2 info using npm@1.4.28 +3 info using node@v0.10.35 +4 verbose node symlink /usr/bin/node +5 error Error: ENOENT, open '/home/users/ar3165/projects/admin-portal2/server/package.json' +6 error If you need help, you may report this *entire* log, +6 error including the npm and node versions, at: +6 error <http://github.com/npm/npm/issues> +7 error System Linux 3.13.0-40-generic +8 error command "/usr/bin/node" "/usr/bin/npm" "start" +9 error cwd /home/users/ar3165/projects/admin-portal2/server +10 error node -v v0.10.35 +11 error npm -v 1.4.28 +12 error path /home/users/ar3165/projects/admin-portal2/server/package.json +13 error code ENOENT +14 error errno 34 +15 verbose exit [ 34, true ] diff --git a/admportal/server/router/index.js b/admportal/server/router/index.js new file mode 100644 index 00000000..76cd6115 --- /dev/null +++ b/admportal/server/router/index.js @@ -0,0 +1,18 @@ +console.log("index.js"); + +module.exports = function(app) { + +//console.log ( 'index port ' + server.address().port ); + + app.use('/', require('./routes/root')); + //app.use('/login', require('./routes/login')); + app.use('/odl', require('./routes/odl')); + app.use('/sla', require('./routes/sla')); + app.use('/user', require('./routes/user')); + app.use('/gamma', require('./routes/gamma')); + app.use('/mobility', require('./routes/mobility')); + app.use('/admin', require('./routes/admin')); + app.use('/preload', require('./routes/preload')); + //app.use('/svc-topology-operation', require('./routes/odl')); + //app.use('/wklist-delete', require('./routes/odl')); +}; diff --git a/admportal/server/router/routes/Odl.js b/admportal/server/router/routes/Odl.js new file mode 100755 index 00000000..a27d73b3 --- /dev/null +++ b/admportal/server/router/routes/Odl.js @@ -0,0 +1,594 @@ +// Odl.js +var https = require('https'); +var http = require('http'); +var properties = require(process.env.SDNC_CONFIG_DIR + '/admportal.json'); + + +var Odl = function() { + // Call ODL page + // get(uri,res) + // post(uri,data, res) + + var _healthcheck = function(options, callback) + { + // Setup request to ODL side + console.log('options:' + JSON.stringify(options,null,2)); + var request = https.request(options, function(response) { + + var response_str = ''; + // Read the response from ODL side + response.on('data', function(chunk) { + response_str += chunk; + }); + + response.on('end', function() + { + //logger.debug(response_str); + if(response.statusCode == 200) + { + console.log('200 OK'); + callback(null, response_str); + return; + } + else{ + console.log('not ok status=' + response.statusCode); + callback(response_str, 'statusCode=' + response.statusCode + '\n' + response_str); + return; + } + }); + }); + request.end() + + request.on('error', function(err) { + console.error('err:' + err); + callback(err, err); + return; + }); + } + + var _get = function(uri,options,callback,req,res) + { + + options.method = "GET"; + options.path = uri; + + // Setup request to ODL side + console.log('options:' + JSON.stringify(options,null,2)); + var request = https.request(options, function(response) { + // console.dir(response); + console.log('STATUS: ' + response.statusCode); + var response_str = ''; + // Read the response from ODL side + response.on('data', function(chunk) { + response_str += chunk; + }); + + response.on('end', function() + { + console.log(response_str); + + if(response.statusCode == 200) + { + // make sure response starts with JSON string + if (response_str && response_str.indexOf('{') == 0) { + //console.log("response: ", result); + + req.session.l3sdnPageInfo = undefined; + var x=0; + var pageList = []; + var obj_rows = []; + var rows = []; + var robj = JSON.parse(response_str); + + if ( typeof robj['services']['layer3-service-list'] != 'undefined' ) + { + for( var i=0; i<robj['services']['layer3-service-list'].length; i++) + { + obj_rows.push( robj['services']['layer3-service-list'][i] ); + } + } + else + { + res.render('pages/err', {result:{code:'failure', msg:'no data Error: ' + String(err)}, header:process.env.MAIN_MENU}); + callback(null,response_str,res); + return; + } + + var rows = []; + var l3sdnPageInfo = + { + 'totalRows' : obj_rows.length, + 'pageSize' : 18, + 'pageCount' : parseInt(obj_rows.length/18), + 'currentPage' : 1 + } + + while (obj_rows.length > 0){ + pageList.push(obj_rows.splice(0,l3sdnPageInfo.pageSize)); + } + l3sdnPageInfo.rows = pageList[0]; // first page + l3sdnPageInfo.pages = pageList; // all pages + + + req.session.l3sdnPageInfo = l3sdnPageInfo; + var privObj = req.session.loggedInAdmin; + + res.render('odl/listWklst', + { + pageInfo : l3sdnPageInfo, + result : {code:'', msg:''}, + privilege : privObj, header:process.env.MAIN_MENU + }); + + + } else { + res.render('pages/err', {result:{code:'failure', msg:'no data Error: ' + String(err)}, header:process.env.MAIN_MENU}); + } + callback(null, response_str, res); + } + else + { + callback(response_str,response_str,res); + //res.render('pages/err', {result:{code:'failure', msg:'Failed to retrieve worklist. ' + response_str}}); + } + }); + }); + + request.end() + + request.on('error', function(err) { + callback(err,null, res); + }); + } + + var _getid = function(uri,options,res) { + options.method = "GET"; + options.path = uri; + + // Setup request to ODL side + var request = https.request(options, function(response) { + // console.dir(response); + //console.log('STATUS: ' + response.statusCode); + var response_str = ''; + // Read the response from ODL side + response.on('data', function(chunk) { + response_str += chunk; + }); + + response.on('end', function() { + if(response.statusCode == 200){ + if(response_str){ + //console.log("response: ", response_str); + res.render('odl/view', {response_obj: JSON.parse(response_str), header:process.env.MAIN_MENU}); + } + else{ + //console.log("no data"); + res.render('pages/err', {result:{code:'failure', msg:'Failed to retrieve worklist'}, header:process.env.MAIN_MENU}); + } + } + else { + //console.log("bad status code:", response.statusCode); + res.render('pages/err', {result:{code:'failure', msg:'Failed to retrieve worklist. Status Code:' + response.statusCode}, header:process.env.MAIN_MENU}); + } + }); + }); + + request.end() + + request.on('error', function(err) { + //console.log(err); + res.render('pages/err', {result:{code:'failure', msg:'Failed to get worklist item. ' + String(err)}, header:process.env.MAIN_MENU}); + }); + } + + var _getvrlan = function(uri,options,callback) { + options.method = "GET"; + options.path = uri; + + + //callback(null,''); + // Setup request to ODL side + var request = https.request(options, function(response) { + // console.dir(response); + //console.log('STATUS: ' + response.statusCode); + var response_str = ''; + // Read the response from ODL side + response.on('data', function(chunk) { + response_str += chunk; + }); + + + response.on('end', function() { + if(response.statusCode == 200){ + if(response_str){ + callback(null,response_str); + return; + } + else{ + callback('err','no data'); + return; + } + } + else { + callback('error',response.statusCode); + return; + } + }); + }); + + request.end() + + request.on('error', function(err) { + callback(err,String(err)); + return; + }); + } + + + var _getvnf = function(uri,options,req,res) { + options.method = "GET"; + options.path = uri; + + // Setup request to ODL side + var request = https.request(options, function(response) { + // console.dir(response); + //console.log('STATUS: ' + response.statusCode); + var response_str = ''; + // Read the response from ODL side + response.on('data', function(chunk) { + response_str += chunk; + }); + + response.on('end', function() { + if(response.statusCode == 200){ + if(response_str){ + //console.log("response: ", response_str); + res.render('odl/viewvnf', { vnf_obj: JSON.parse(response_str), + request_id: req.query['request'], header:process.env.MAIN_MENU }); + } + else{ + //console.log("no data"); + res.render('pages/err', {result:{code:'failure', msg:'Failed to retrieve worklist item.'}, header:process.env.MAIN_MENU}); + } + } + else { + //console.log("bad status code:", response.statusCode); + res.render('pages/err', {result:{code:'failure', msg:'Failed to retrieve worklist. Status Code:' + response.statusCode}, header:process.env.MAIN_MENU}); + } + }); + }); + + request.end() + + request.on('error', function(err) { + //console.log(err); + res.render('pages/err', {result:{code:'failure', msg:'Failed getting VNF information. Error: '+ String(err)}, header:process.env.MAIN_MENU}); + }); + } + + var _getPreloadVnfData = function(uri,options,res,callback) { + + options.method = "GET"; + options.path = uri; + + + // Setup request to ODL side + var protocol; + if ( process.env.NODE_ENV != 'production' ){ + protocol = http; + }else{ + protocol = https; + } + +console.log('NODE_ENV:' + process.env.NODE_ENV); +console.log('GET: ' + JSON.stringify(options,null,4)); + + var request = protocol.request(options, function(response) { + + var response_str = ''; + + // Read the response from ODL side + response.on('data', function(chunk) { + response_str += chunk; + }); + + response.on('end', function() { +console.log('response_str: ' + response_str); +console.log('response.statusCode: ' + response.statusCode); + if(response.statusCode == 200){ + if(response_str){ + callback(null,response_str); + return; + } + else{ + callback('Error - No data returned.'); + return; + } + } + else { + if ( response.statusCode == 404 ) + { + callback('HTTP Status Code:' + response.statusCode + '. Not Found.'); + return; + } + else if ( response_str.length > 0 ) + { + callback('HTTP Status Code:' + response.statusCode + '. ' + response_str); + return; + } + else + { + callback('HTTP Status Code:' + response.statusCode + '. No data returned.'); + return; + } + } + }); + }); + + request.end() + + request.on('error', function(err) { + callback(err); + return; + }); + } + +var _getClusterStatus = function(options,callback) { + //options.method = "GET"; + //options.path = uri; + + console.log('URI='+options.path); + + // Setup request to ODL side + var protocol = properties.odlProtocol; +console.log('protocol=' + protocol); + if ( protocol == 'http' || protocol == 'HTTP' ) + { +console.log('http request'); + var request = http.request(options, function(response) { + var response_str = ''; + + // Read the response from ODL side + response.on('data', function(chunk) { + response_str += chunk; + }); + + + response.on('end', function() { +console.log('HTTP StatusCode='+response.statusCode); + if(response.statusCode == 200){ + if(response_str){ +console.log('response_str='+response_str); + callback(null,JSON.parse(response_str)); + return; + } + else{ + callback(null,'no data'); + return; + } + } + else { + callback(null,response.statusCode); + return; + } + }); + }); + + request.end() + + request.on('error', function(err) { + callback(null,String(err)); + return; + }); + } + else { + var request = https.request(options, function(response) { + var response_str = ''; + + // Read the response from ODL side + response.on('data', function(chunk) { + response_str += chunk; + }); + + + response.on('end', function() { + if(response.statusCode == 200){ + if(response_str){ +console.log('response_str='+response_str); + callback(null,JSON.parse(response_str)); + return; + } + else{ + callback(null,'no data'); + return; + } + } + else { + callback(null,response.statusCode); + return; + } + }); + }); + + request.end() + + request.on('error', function(err) { + callback(null,String(err)); + return; + }); + } +} + + var _delete = function(uri,options,res,callback) { + options.method = 'DELETE'; + options.path = uri; + + + // Setup request to ODL side + //var request = https.request(options, function(response) { + var request = http.request(options, function(response) { + //console.log('STATUS: ' + response.statusCode); + var response_str = ''; + // Read the response from ODL side + response.on('data', function(chunk) { + response_str += chunk; + }); + + response.on('end', function() { + if(response.statusCode == 200){ + callback(null); + return; + } + else { + callback('Error:' + response_str); + return; + } + }); + }); + request.on('error', function(err) { + callback(err); + return; + }); + request.end() + } + + var _post = function(uri,options,data,res,callback) + { + options.method = 'POST'; + options.path = uri; + + + // Setup request to ODL side + var protocol; + //if ( process.env.NODE_ENV != 'production' ){ + protocol = http; + //}else{ + //protocol = https; + //} + var request = protocol.request(options, function(response) + { + var response_str = ''; + // Read the response from ODL side + response.on('data', function(chunk) { + response_str += chunk; + //logger.debug('chunk:' + chunk); + }); + + // end of request, check response + response.on('end', function() { + console.log('post status code:'+response.statusCode); + if(response.statusCode == 200 ){ + try { + var respObj = JSON.parse(response_str); + console.log('response_str.length:' + response_str.length); + if(response_str){ + console.log("post response-code:" + respObj['output']['response-code']); + + if ( respObj['output']['response-code'] == 200 ){ + callback(null,response_str); + return; + }else{ + callback('Error - response-code:' + respObj['output']['response-code'] + ' response-message:' + respObj['output']['response-message']); + return; + } + }else{ + // success + callback(null); + return; + } + } + catch (error) { + callback('Error parsing response: ' + error); + return; + } + } + else { + var respObj = null; + if ( response_str.length > 0 ) { + console.log('response_str:' + response_str); + try { + respObj = JSON.parse(response_str); + if ( typeof respObj['errors'] != 'undefined' ) + { + console.log('Error' + JSON.stringify(respObj)); + if ( typeof respObj['errors']['error'][0]['error-message'] != 'undefined' ) + { + callback('HTTP Status Code:' + response.statusCode + '. Message:' + + respObj['errors']['error'][0]['error-message']); + return; + } + else + { + callback('Error - HTTP Status Code:' + response.statusCode + '.'); + return; + } + } + else + { + callback('Error - HTTP Status Code:' + response.statusCode + '.'); + return; + } + } + catch (error) { + callback('Error - HTTP Status Code:' + response.statusCode + '.'); + return; + } + } + else{ + callback('Error - HTTP Status Code:' + response.statusCode + '.'); + return; + } + } + }); + }); + + request.on('error', function(err) { + callback(err); + return; + }); + + request.write(data); + request.end() + } + + var _postSubnetAllocated = function(uri,options,data,callback,res) { + options.method = 'POST'; + options.path = uri; + + // Setup request to ODL side + var request = https.request(options, function(response) { + var response_str = ''; + // Read the response from ODL side + response.on('data', function(chunk) { + response_str += chunk; + }); + + // end of request, check response + response.on('end', function() { + //console.log("post: response: " + response_str); + callback(response_str,null,res); + }); + }); + request.on('error', function(err) { + callback(err,null, res); + }); + request.write(data); + request.end() + } + + return { + GetClusterStatus: _getClusterStatus, + Get: _get, + GetID: _getid, + GetVNF: _getvnf, + GetVRlan: _getvrlan, + GetPreloadVnfData: _getPreloadVnfData, + Post: _post, + PostSubnetAllocated: _postSubnetAllocated, + Delete: _delete, + Healthcheck: _healthcheck + }; +}(); + +module.exports = Odl; + diff --git a/admportal/server/router/routes/admin.js b/admportal/server/router/routes/admin.js new file mode 100755 index 00000000..4b7b8088 --- /dev/null +++ b/admportal/server/router/routes/admin.js @@ -0,0 +1,83 @@ +var express = require('express'); +var router = express.Router(); +var exec = require('child_process').exec; +var util = require('util'); +var fs = require('fs'); +var dbRoutes = require('./dbRoutes'); +var csp = require('./csp'); +var bodyParser = require('body-parser'); +var sax = require('sax'),strict=true,parser = sax.parser(strict); +var async = require('async'); + + +// GET +router.get('/getParameters', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.getParameters(req,res, {code:'', msg:''}, req.session.loggedInAdmin); +}); +router.get('/deleteParameter', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push(function(callback) { + dbRoutes.deleteParameter(req,res,callback); + }); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getParameters(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Row successfully deleted from PARAMETERS table.'); + dbRoutes.getParameters(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + + +// POST +router.post('/addParameter', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push( function(callback) { dbRoutes.addParameter(req,res,callback); } ); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getParameters(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Successfully updated PARAMETERS.'); + dbRoutes.getParameters(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +// gamma - updateAicSite +router.post('/updateParameter', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push( function(callback) { dbRoutes.updateParameter(req,res,callback); } ); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getParameters(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Successfully updated PARAMETERS.'); + dbRoutes.getParameters(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + + +module.exports = router; diff --git a/admportal/server/router/routes/csp.js b/admportal/server/router/routes/csp.js new file mode 100644 index 00000000..435aaf91 --- /dev/null +++ b/admportal/server/router/routes/csp.js @@ -0,0 +1,84 @@ +var exec = require('child_process').exec; +var dbRoutes = require('./dbRoutes'); +var fs = require('fs.extra'); +var properties = require(process.env.SDNC_CONFIG_DIR + '/admportal.json'); + +var retURL = ""; +var noCookieUrl = ""; +var logoutUrl = ""; + +function logout(req,res){ + console.log("logout"); + req.session.loggedInAdmin = undefined; + res.redirect('/login'); +} + +function login (req,res) { + + var loggedInAdmin={}; + var email = req.body.email; + dbRoutes.findAdminUser(email,res,function(adminUser){ + if(adminUser !== null){ + + // make sure correct password is provided + if (req.body.password != adminUser.password) { + res.render("pages/login", + { + result: + { + code:'error', + msg:'Invalid password entered.' + }, + header:process.env.MAIN_MENU + }); + return; + } + + var loggedInAdmin = { + email:adminUser.email, + password:adminUser.password, + privilege:adminUser.privilege + } + req.session.loggedInAdmin = loggedInAdmin; + console.log("Login Success"+JSON.stringify(loggedInAdmin)); + res.redirect('sla/listSLA'); + }else{ + res.render("pages/err", + { + result: + { + code:'error', + msg:'User ' + attuid + ' is not in the database. Please see an adminstrator to have them added.' + }, + header:process.env.MAIN_MENU + }); + } + }); +} + +function checkAuth(req,res,next){ + var host = req.get('host'); + var url = req.url; + var originalUrl = req.originalUrl; + + console.log("checkAuth"); + + var host = req.headers['host']; +console.log('host=' + host); + + console.log("cookie is not null "+JSON.stringify(req.session.loggedInAdmin)); + if(req.session == null || req.session == undefined + || req.session.loggedInAdmin == null || req.session.loggedInAdmin == undefined) + { + // nothing else to do but log them back in, or they may + // be coming from the graph tool + console.log("loggedInAdmin not found.session timed out."); + res.render('pages/login'); + return false; + } + next(); +} + +exports.login = login; +exports.logout = logout; +exports.checkAuth = checkAuth; diff --git a/admportal/server/router/routes/dbRoutes.js b/admportal/server/router/routes/dbRoutes.js new file mode 100644 index 00000000..d2f40b52 --- /dev/null +++ b/admportal/server/router/routes/dbRoutes.js @@ -0,0 +1,1192 @@ +var express = require('express'), + app = express(); +var mysql = require('mysql'); +var properties = require(process.env.SDNC_CONFIG_DIR + '/admportal.json'); +var fs = require('fs.extra'); +var util = require('util'); +var os = require('os'); +var async = require('async'); +var l_ = require('lodash'); +var dns = require('dns'); +var dnsSync = require('dns-sync'); + +var pool = ''; +var currentDB = ''; +var currentDbName = ''; +var fabricDB = properties.dbFabricServer; +var dbArray = properties.databases; +var enckey = properties.passwordKey; + +console.log('dbFabric=' + properties.dbFabric); + +if ( properties.dbFabric == 'true' ) +{ + connectFabric(); +} +else +{ + initDB(); +} + + +exports.dbConnect = function(){ + + console.log('fabric=' + fabricDB); + if ( properties.dbFabric == 'true' ) + { + connectFabric(); + } + else + { + initDB(); + } +} + +function setCurrentDbName(){ + + function createFunction(dbentry) + { + return function(callback) { findCurrentDbIP(dbentry,callback); } + } + + var tasks = []; + for (var x=0; x<dbArray.length; x++){ + var dbElement = dbArray[x]; + var dbElementArray = dbElement.split("|"); + + tasks.push( createFunction(dbElement) ); + } + async.series(tasks, function(err,result){ + + if(err){ + currentDbName = err; + console.log('currentDbName: ' + err); + return; + } + else { + console.log('not found'); + return; + } + }); +} + + +function findCurrentDbIP(dbElement, callback){ + + var dbElementArray = dbElement.split("|"); + + dns.lookup( dbElementArray[0], function onLookup(err, addresses, family) { + + if ( currentDB == addresses ){ + callback(dbElementArray[1]); + return; + } + else { + callback(null); + return; + } + }); +} + + +exports.getCurrentDB = function(){ + return currentDbName; +} + + +exports.testdb = function(req,res,callback){ +console.log('testdb'); + + osObj = { + 'hostname' : os.hostname(), + 'type' : os.type(), + 'platform' : os.platform(), + 'arch' : os.arch(), + 'release' : os.release(), + 'uptime' : os.uptime(), + 'totalmem' : os.totalmem(), + 'dbhealth' : '' + }; + + pool.getConnection(function(err,connection) + { + if(err){ + callback(err); + return; + } + + // http://stackoverflow.com/questions/10982281/mysql-connection-validity-test-in-datasource-select-1-or-something-better + connection.query("/* pint */ SELECT 1", function(err,result){ + + connection.release(); + if(err) { + callback(err); + return; + } + callback(null,'Database Connectivity to ' + currentDB + ' is working.'); + return; + }); //end query + }); // end getConnection +} + +/* +exports.checkSvcLogic = function(req,res){ + + if ( DBmasterHost.length > 0 && currentHost != DBmasterHost ) + { + // need to copy file so SLA functionality works + var source = process.env.SDNC_CONFIG_DIR + + "/svclogic.properties." + currentHost; + var target = process.env.SDNC_CONFIG_DIR + + "/svclogic.properties"; + fs.copy(source,target,{replace:true}, function(err){ + if(err){ + res.render("pages/err", + {result:{code:'error', + msg:"Unable to copy svclogic.properties. "+ String(err) }}); + return; + } + }); + } +} +*/ +function initDB( next ) { + + + var tasks = []; + for (var x=0; x<properties.databases.length; x++){ + + var db = properties.databases[x]; + var dbArray = db.split("|"); + var _dbIP = dnsSync.resolve(dbArray[0]); + var _dbName = dbArray[1]; + + tasks.push( createFindMasterFunctionObj(_dbIP, _dbName) ); + } + async.series(tasks, function(err,result) + { + if(err){ + if ( err == 'found' ){ + if ( typeof next != 'undefined'){ + next(); + } + else { + return; + } + } + else { + console.error( String(err) ); // ALARM + return; + } + } + console.log('result=' + result); + }); + return; +} + + +function createFindMasterFunctionObj(dbIP,dbName){ + return function(callback) { findMaster(dbIP, dbName, callback); } +} + +function findMaster (ldbIP, ldbName, callback){ +var dbIP = ldbIP; +var dbName = ldbName; + + console.log('checking dbIP:' + dbIP); + + pool = mysql.createPool({ + connectionLimit : properties.dbConnLimit, + host : dbIP, + user : properties.dbUser, + password : properties.dbPassword, + database : properties.dbName, + multipleStatements: true, + debug : false + }); + + pool.getConnection(function(err,connection){ + + if(err){ + callback( String(err) ); + return; + } + var sql = 'select @@read_only'; + connection.query(sql, function(err,result){ + connection.release(); + + // @@read_only=0 means db is writeable + console.log('@@read_only=' + result[0]['@@read_only']); + if ( result[0]['@@read_only'] == '0' ) + { // writeable + // if this is not the current DB, make it since its writeable + currentDB = dbIP; + currentDbName = dbName; + console.log('currentDB=' + currentDB + "|" + currentDbName); + var newpool = mysql.createPool({ + connectionLimit : properties.dbConnLimit, + host : currentDB, + user : properties.dbUser, + password : properties.dbPassword, + database : properties.dbName, + multipleStatements: true, + debug : false + }); // end create + pool = newpool; + callback('found', currentDB); + return; + } + // otherwise this is the current db and its writeable, just return + callback(null, currentDB); + return; + }); + }); +} + +exports.checkDB = function(req,res,next){ + +console.log('checkDB'); + + + if ( properties.dbFabric == 'true' ) + { + connectFabric(); + next(); + } + else + { + initDB( next ); + } +} + + +exports.saveUser = function(req,res){ + + pool.getConnection(function(err,connection){ + if(err){ + console.error( String(err) ); // ALARM + res.render("pages/signup", {result:{code:'error', msg:"Unable to get database connection. " + String(err)},header:process.env.MAIN_MENU}); + return; + } + //var sql = "SELECT AES_DECRYPT(password, '" + enckey + "') password FROM PORTAL_USERS"; + var sql = "SELECT email FROM PORTAL_USERS WHERE email='" + req.body.nf_email + "'"; + + console.log(sql); + + connection.query(sql, function(err,result){ + if(err){ + res.render("pages/signup", {result:{code:'error', msg:"Unable to get database connection. " + String(err)},header:process.env.MAIN_MENU}); + return; + } + if (result.length == 1 || result.length > 1) + { + res.render("pages/signup", {result:{code:'error', msg:'User Information already exists.'},header:process.env.MAIN_MENU}); + return; + } + + sql = "INSERT INTO PORTAL_USERS (email,password,privilege) VALUES (" + +"'"+ req.body.nf_email + "'," + + "AES_ENCRYPT('" + req.body.nf_password + "','" + enckey + "')," + +"'A')"; + + console.log(sql); + + connection.query(sql, function(err,result){ + connection.release(); + + if(err){ + res.render("pages/signup", {result:{ code:'error', msg:String(err) },header:process.env.MAIN_MENU});; + return; + } + res.render('pages/signup', {result:{code:'success', msg:'User created. Please login.'},header:process.env.MAIN_MENU}); + return; + }); + }); + }); +} + +// delete User +exports.deleteUser = function(req,res){ + + var rows={}; + var resultObj = { code:'', msg:'' }; + var privilegeObj = req.session.loggedInAdmin; + + pool.getConnection(function(err,connection) { + if(err){ + console.error( String(err) ); // ALARM + res.render("user/list", {rows: null, result:{code:'error', msg:"Unable to get database connection. Error:" + String(err), + privilege:privilegeObj },header:process.env.MAIN_MENU}); + return; + } + + var sqlUpdate = "DELETE FROM PORTAL_USERS WHERE email='" + req.query.email + "'"; + + console.log(sqlUpdate); + + connection.query(sqlUpdate,function(err,result){ + + if(err){ + resultObj = {code:'error', msg:'Delete of user failed Error: '+ String(err) }; + } + + // Need DB lookup logic here + connection.query("SELECT email,password,privilege FROM PORTAL_USERS", function(err, rows) { + connection.release(); + if(!err) { + if ( rows.length > 0 ) + { + resultObj = {code:'success',msg:'Successfully deleted user.'}; + res.render('user/list', { rows: rows, result:resultObj, privilege:privilegeObj,header:process.env.MAIN_MENU } ); + return; + }else{ + res.render("user/list", { rows: null, result:{code:'error', msg:'Unexpected no rows returned from database, please try again.', + privilege:privilegeObj },header:process.env.MAIN_MENU}); + return; + } + } else { + res.render("user/list", { rows: null, result:{code:'error', msg:'Unexpected no rows returned from database. Error: ' + String(err), + privilege:privilegeObj },header:process.env.MAIN_MENU}); + return; + } + }); //end query + }); + }); // end of getConnection +} + +// add User +exports.addUser = function(req,res){ + + var rows={}; + var resultObj = { code:'', msg:'' }; + var privilegeObj = req.session.loggedInAdmin; + + pool.getConnection(function(err,connection) { + if(err){ + console.error( String(err) ); // ALARM + res.render("user/list", {rows: null, result:{code:'error', msg:"Unable to get database connection. "+ String(err), + privilege:privilegeObj },header:process.env.MAIN_MENU}); + return; + } + + if( req.body.nf_privilege == "admin" ){ + var char_priv = 'A'; + }else if(req.body.nf_privilege == 'readonly'){ + var char_priv = 'R'; + }else{ + var char_priv = 'A'; + } + + + //connection.query(sqlRequest, function(err,result){ + var sqlUpdate = "INSERT INTO PORTAL_USERS (email, password, privilege) VALUES (" + +"'"+ req.body.nf_email + "'," + + "AES_ENCRYPT('" + req.body.nf_password + "','" + enckey + "')," + +"'"+ char_priv + "')"; + + console.log(sqlUpdate); + + connection.query(sqlUpdate,function(err,result){ + + if(err){ + resultObj = {code:'error', msg:'Add of user failed Error: '+err}; + } + + // Need DB lookup logic here + connection.query("SELECT email,AES_DECRYPT(password, '" + enckey + "') password,privilege FROM PORTAL_USERS", function(err, rows) { + + connection.release(); + if(!err) { + if ( rows.length > 0 ) + { + resultObj = {code:'success',msg:'Successfully added user.'}; + res.render('user/list', { rows: rows, result:resultObj, privilege:privilegeObj,header:process.env.MAIN_MENU } ); + return; + }else{ + res.render("user/list", {rows: null, result:{code:'error', msg:'Unexpected no rows returned from database, please try again.', + privilege:privilegeObj },header:process.env.MAIN_MENU}); + return; + } + } else { + res.render("user/list", {rows: null, result:{code:'error', msg:'Unexpected no rows returned from database. Error: '+ err , + privilege:privilegeObj },header:process.env.MAIN_MENU}); + return; + } + }); //end query + }); + + }); // end of getConnection +} + +// updateUser +exports.updateUser= function(req,res){ + + var rows={}; + var resultObj = { code:'', msg:'' }; + var privilegeObj = req.session.loggedInAdmin; + + pool.getConnection(function(err,connection) { + + if(err){ + console.error( String(err) ); // ALARM + res.render("user/list", {rows: null, result:{code:'error', msg:"Unable to get database connection. " + String(err), + privilege:privilegeObj },header:process.env.MAIN_MENU}); + return; + } + + if( req.body.uf_privilege == "admin" ){ + var char_priv = 'A'; + }else if(req.body.uf_privilege == 'readonly'){ + var char_priv = 'R'; + }else{ + var char_priv = 'A'; + } + + + //connection.query(sqlRequest, function(err,result){ + var sqlUpdate = "UPDATE PORTAL_USERS SET " + + "email = '" + req.body.uf_email + "'," + + "password = " + "AES_ENCRYPT('" + req.body.uf_password + "','" + enckey + "'), " + + "privilege = '"+ char_priv + "'" + + " WHERE email = '" + req.body.uf_key_email + "'"; + + console.log(sqlUpdate); + + connection.query(sqlUpdate,function(err,result){ + + if(err){ + resultObj = {code:'error', msg:'Update of user failed Error: '+err}; + } + + // Need DB lookup logic here + connection.query("SELECT email, AES_DECRYPT(password,'" + enckey + "') password, privilege FROM PORTAL_USERS", function(err, rows) { + connection.release(); + if(!err) { + if ( rows.length > 0 ) + { + resultObj = {code:'success',msg:'Successfully updated user.'}; + res.render('user/list', { rows: rows, result:resultObj, privilege:privilegeObj,header:process.env.MAIN_MENU} ); + return; + }else{ + res.render("user/list", {rows: null, result:{ code:'error', msg:'Unexpected no rows returned from database.', + privilege:privilegeObj },header:process.env.MAIN_MENU}); + return; + } + } else { + res.render("user/list", {rows: null, result:{code:'error', msg:'Unexpected no rows returned from database. ' + String(err), + privilege:privilegeObj },header:process.env.MAIN_MENU}); + return; + } + }); //end query + }); + }); // end of getConnection +}; + +exports.listUsers = function(req,res,resultObj){ + + var privilegeObj = req.session.loggedInAdmin; + var rows={}; + pool.getConnection(function(err,connection) { + + if(err){ + console.error( String(err) ); // ALARM + res.render("pages/list", {rows: null, result:{code:'error', msg:"Unable to get database connection. " + String(err), + privilege:privilegeObj },header:process.env.MAIN_MENU}); + return; + } + + // Need DB lookup logic here + var selectUsers = "SELECT email, AES_DECRYPT(password,'" + enckey + "') password, privilege from PORTAL_USERS"; + console.log(selectUsers); + connection.query(selectUsers, function(err, rows) { + + connection.release(); + if(err){ + resultObj = {code:'error', msg:'Unable to SELECT users Error: '+err}; + } + + if(!err) { + if ( rows.length > 0 ) + { + console.log(JSON.stringify(rows)); + res.render('user/list', { rows: rows, result:resultObj, privilege:privilegeObj,header:process.env.MAIN_MENU }); + return; + } + else{ + res.render("user/list", {rows: null, result:{code:'error', msg:'Unexpected no rows returned from database.', + privilege:privilegeObj },header:process.env.MAIN_MENU}); + return; + } + } else { + res.render("user/list", {rows: null, result:{code:'error', msg:'Unexpected no rows returned from database. ' + String(err), + privilege:privilegeObj },header:process.env.MAIN_MENU}); + return; + } + }); //end query + }); // end getConnection +} + +exports.listSLA = function(req,res,resultObj){ + + var privilegeObj = req.session.loggedInAdmin; + + pool.getConnection(function(err,connection) { + + if(err){ + console.error( String(err) ); // ALARM + res.render("pages/err", {result:{code:'error', msg:"Unable to get database connection. "+ String(err)},header:process.env.MAIN_MENU}); + return; + } + + // Need DB lookup logic here + connection.query("SELECT module,rpc,version,mode,active,graph FROM SVC_LOGIC", function(err, rows) { + + connection.release(); + if(err) { + res.render("pages/err", {result:{code:'error',msg:'Database Error: '+ String(err)},header:process.env.MAIN_MENU}); + return; + } + else { + res.render("sla/list", {rows:rows, result:resultObj, privilege:privilegeObj, header:process.env.MAIN_MENU} ); + return; + } + }); //end query + }); // end getConnection +} + +exports.executeSQL = function(sql,req,res,callback){ + + console.log(sql); + + pool.getConnection(function(err,connection) { + + if(err){ + console.error( String(err) ); // ALARM + callback(err, 'Unable to get database connection.' + err); + return; + } + + connection.query(sql, function(err,result){ + connection.release(); + if (err) { + callback(err,'Database operation failed. ' + err ); + } + else + { +console.log('affectedRows='+result.affectedRows); + callback(null, result.affectedRows); + } + }); //end query + }); // end getConnection +} + + +// gamma - deleteParameter +exports.deleteParameter = function(req,res,callback){ + + var sql = "DELETE FROM PARAMETERS WHERE name='" + req.query.name + "'"; + + console.log(sql); + + pool.getConnection(function(err,connection) { + + if(err){ + console.log( String(err) ); // ALARM + callback(err, 'Unable to get database connection.' + err); + return; + } + connection.query(sql, function(err,result){ + connection.release(); + if(err){ + console.log('Update failed. ' + err ); + callback(err,'Update failed. ' + err ); + } + else + { + callback(null,''); + } + }); //end query + }); // end getConnection +} + + +exports.getTable = function(req,res,sql,rdestination,resultObj,privilegeObj){ + +console.log('SQL:'+sql); + + pool.getConnection(function(err,connection) { + + if(err){ + console.error( String(err) ); // ALARM + res.render("pages/err", {result:{code:'error', msg:"Unable to get database connection. "+ String(err)},header:process.env.MAIN_MENU}); + return; + } + connection.query(sql,function(err, rows) + { + connection.release(); + if(err) { + res.render(rdestination, {result:{code:'error',msg:'Database Error: '+ String(err)},header:process.env.MAIN_MENU}); + return; + } + else { + res.render(rdestination, { rows: rows, result:resultObj, privilege:privilegeObj,header:process.env.MAIN_MENU } ); + return; + } + }); //end query + }); // end getConnection +} + +exports.getMetaTable = function(req,res,sql,rdestination,resultObj,privilegeObj){ + + console.log('SQL:'+ sql); + + var rdata = []; + var v_tables = []; + var vtables = properties.viewTables; + + for ( var i in vtables ) { + v_tables.push(vtables[i]); + } + + pool.getConnection(function(err,connection) { + + if(err){ + console.error( String(err) ); // ALARM + res.render("pages/err", {result:{code:'error', msg:"Unable to get database connection. "+ String(err)},header:process.env.MAIN_MENU}); + return; + } + connection.query(sql,function(err, rows, fields) + { + console.log('rows:' + JSON.stringify(rows,null,2)); + // http://stackoverflow.com/questions/14528385/how-to-convert-json-object-to-javascript-array + //logger.debug(Object.keys(rows[0]).map(function(v) { return rows[0][v]; })); + for ( var i in rows ){ + rdata.push(Object.keys(rows[i]).map(function(v) { return rows[i][v]; })); + //logger.debug(Object.keys(rows[i]).map(function(v) { return rows[i][v]; })); + //logger.debug([i, rows[i]]); + } + for ( var x in rdata ){ + for ( var j in rdata[x] ){ + console.log('rdata[' + x + ']: ' + rdata[x][j]); + } + } + console.log('rdata:' + rdata[0]); + console.log('fields:' + JSON.stringify(fields,null,2)); + connection.release(); + if(err) { + res.render(rdestination, {result:{code:'error',msg:'Database Error: '+ String(err)},header:process.env.MAIN_MENU}); + return; + } + else { + res.render(rdestination, { displayTable:true, vtables:v_tables, rows:rdata, fields:fields, result:resultObj, privilege:privilegeObj, header:process.env.MAIN_MENU } ); + return; + } + }); //end query + }); // end getConnection +} + +exports.getVnfProfile = function(req,res,resultObj,privilegeObj){ + + pool.getConnection(function(err,connection) { + + if(err){ + console.error( String(err) ); // ALARM + res.render("pages/err", {result:{code:'error', msg:"Unable to get database connection. "+ String(err)},header:process.env.MAIN_MENU}); + return; + } + + connection.query("SELECT vnf_type,availability_zone_count,equipment_role " + + "FROM VNF_PROFILE ORDER BY VNF_TYPE", function(err, rows) + { + connection.release(); + if(err) { + res.render("mobility/vnfProfile", {result:{code:'error',msg:'Database Error: '+ String(err)},header:process.env.MAIN_MENU}); + return; + } + else { + res.render('mobility/vnfProfile', { rows: rows, result:resultObj, privilege:privilegeObj,header:process.env.MAIN_MENU } ); + return; + } + }); //end query +console.log('after query'); + }); // end getConnection +} + + +exports.getVnfPreloadData = function(req,res,dbtable,callback){ + + pool.getConnection(function(err,connection) { + + if(err){ + console.error( String(err) ); // ALARM + callback(err, 'Unable to get database connection.' + err); + return; + } + + // Need DB lookup logic here + connection.query("SELECT preload_data FROM " + dbtable + " WHERE id=" + + req.query.id, function(err, rows) + { + connection.release(); + if(err) { + callback(err); + return; + } + else { + var buffer = rows[0].preload_data; + var decode_buffer = decodeURI(buffer); + var content = JSON.parse(decode_buffer); + callback(null,content); + return; + } + }); //end query + }); // end getConnection +} + + + +exports.getVnfNetworkData = function(req,res,resultObj,privilegeObj){ + + + pool.getConnection(function(err,connection) { + + if(err){ + console.error( String(err) ); // ALARM + res.render("pages/err", {result:{code:'error', msg:"Unable to get database connection. "+ String(err)},header:process.env.MAIN_MENU}); + return; + } + + // Need DB lookup logic here + connection.query("SELECT id,svc_request_id,svc_action,status,filename,ts,preload_data " + + "FROM PRE_LOAD_VNF_NETWORK_DATA ORDER BY id", function(err, rows) + { + var msgArray = new Array(); + + connection.release(); + if(err) { + msgArray = 'Database Error: '+ String(err); + res.render("mobility/vnfPreloadNetworkData", { + result:{code:'error',msg:msgArray}, + preloadImportDirectory: properties.preloadImportDirectory, + header:process.env.MAIN_MENU + }); + return; + } + else { + var retData = []; + for( r=0; r<rows.length; r++) + { + var rowObj = {}; + rowObj.row = rows[r]; + if ( rows[r].filename.length > 0 ) + { + try{ + var buffer = rows[r].preload_data; + var decode_buffer = decodeURI(buffer); + var filecontent = JSON.parse(decode_buffer); + rowObj.filecontent = filecontent; + rowObj.network_name = filecontent.input["network-topology-information"]["network-topology-identifier"]["network-name"]; + rowObj.network_type = filecontent.input["network-topology-information"]["network-topology-identifier"]["network-type"]; + } + catch(error){ + msgArray.push('File ' + rows[r].filename + ' has invalid JSON. Error:' + error); + } + } + else { + rowObj.filecontent = ''; + } + retData.push(rowObj); + } + if(msgArray.length>0){ + resultObj.code = 'failure'; + resultObj.msg = msgArray; + } + res.render('mobility/vnfPreloadNetworkData', { + retData:retData, + result:resultObj, + privilege:privilegeObj, + preloadImportDirectory: properties.preloadImportDirectory, + header:process.env.MAIN_MENU + }); + return; + } + }); //end query + }); // end getConnection +} + +exports.getVnfData = function(req,res,resultObj,privilegeObj){ + + + pool.getConnection(function(err,connection) { + + if(err){ + console.error( String(err) ); // ALARM + res.render("pages/err", {result:{code:'error', msg:"Unable to get database connection. "+ String(err)},header:process.env.MAIN_MENU}); + return; + } + + // Need DB lookup logic here + connection.query("SELECT id,svc_request_id,svc_action,status,filename,ts,preload_data " + + "FROM PRE_LOAD_VNF_DATA ORDER BY id", function(err, rows) + { + var msgArray = new Array(); + + connection.release(); + if(err) { + msgArray = 'Database Error: '+ String(err); + res.render("mobility/vnfPreloadData", { + result:{code:'error',msg:msgArray}, + preloadImportDirectory: properties.preloadImportDirectory, + header:process.env.MAIN_MENU + }); + return; + } + else { + var retData = []; + for( r=0; r<rows.length; r++) + { + var rowObj = {}; + rowObj.row = rows[r]; + if ( rows[r].filename.length > 0 ) + { + try{ + var buffer = rows[r].preload_data; + var s_buffer = decodeURI(buffer); + var filecontent = JSON.parse(s_buffer); + rowObj.filecontent = filecontent; + rowObj.vnf_name = filecontent.input["vnf-topology-information"]["vnf-topology-identifier"]["vnf-name"]; + rowObj.vnf_type = filecontent.input["vnf-topology-information"]["vnf-topology-identifier"]["vnf-type"]; + } + catch(error){ + msgArray.push('File ' + rows[r].filename + ' has invalid JSON. Error:' + error); + } + } + else { + rowObj.filecontent = ''; + } + retData.push(rowObj); + } + if(msgArray.length>0){ + resultObj.code = 'failure'; + resultObj.msg = msgArray; + } + res.render('mobility/vnfPreloadData',{ + retData:retData, result:resultObj, + privilege:privilegeObj, + header:process.env.MAIN_MENU, + preloadImportDirectory: properties.preloadImportDirectory + }); + return; + } + }); //end query + }); // end getConnection +} + + +exports.findAdminUser = function(email,res,callback) { + + + var adminUser={}; + pool.getConnection(function(err,connection) { + if(err){ + console.error( String(err) ); // ALARM + res.render("pages/login", {result:{code:'error', msg:"Unable to get database connection. "+ String(err)},header:process.env.MAIN_MENU}); + return; + } + + // Need DB lookup logic here + connection.query("SELECT email, AES_DECRYPT(password, '" + enckey + "') password, privilege FROM PORTAL_USERS WHERE email='" + email + "'", function(err, rows) { + + connection.release(); + if(!err) { + if ( rows.length > 0 ) + { + rows.forEach(function(row){ + adminUser = { + "email" : row.email, + "password" : row.password, + "privilege" : row.privilege }; + }); + callback(adminUser); + return; + }else{ + console.log("no rows returned"); + res.render("pages/login", {result:{code:'error', msg:'User is not in database.'},header:process.env.MAIN_MENU}); + return; + } + } else { + res.render("pages/err", {result:{code:'error',msg:'Unexpected no rows returned from database. '+ String(err)},header:process.env.MAIN_MENU}); + return; + } + }); //end query + }); // end getConnection +} + + +exports.addRow = function(sql,req,res,callback){ + + console.log(sql); + + pool.getConnection(function(err,connection) { + + if(err){ + console.error( String(err) ); // ALARM + callback(err, 'Unable to get database connection.' + err); + return; + } + + connection.query(sql, function(err,result){ + connection.release(); + if(err){ + console.debug('Database operation failed. ' + err ); + callback(err,'Database operation failed. ' + err ); + } + else + { + callback(null, result.affectedRows); + } + }); //end query + }); // end getConnection +} + + + +exports.addVnfProfile = function(row,res,callback){ + + var sqlInsert; + + if ( row.length < 3 ) + { + console.log('Row [' + row + '] does not have enough fields.'); + callback(null, 'Row [' + row + '] does not have enough fields.'); + return; + } + + sqlInsert = "INSERT INTO VNF_PROFILE (" + + "vnf_type,availability_zone_count,equipment_role) VALUES (" + + "'" + row[0] + "'," + + row[1] + + ",'" + row[2] + "')"; + + console.log('SQL='+sqlInsert); + + pool.getConnection(function(err,connection) { + + if(err){ + console.log( String(err) ); // ALARM + callback(err, 'Unable to get database connection.'); + return; + } + connection.query(sqlInsert, function(err,result){ + connection.release(); + if(err){ + console.log('Row [' + row + '] failed to insert. ' + err ); + callback(null,'Row [' + row + '] failed to insert. ' + err ); + } + else + { + callback(null,''); + } + }); //end query + }); // end getConnection +} + + +// Add to SVC_LOGIC table +exports.addDG = function(_module, version, rpc, mode, xmlfile, req,res){ + + var privilegeObj = req.session.loggedInAdmin; + var rows={}; + + pool.getConnection(function(err,connection) { + if(err){ + console.error( String(err) ); // ALARM + res.render("pages/err", {result:{code:'error', msg:"Unable to get database connection. "+ String(err)},header:process.env.MAIN_MENU}); + return; + } + + var post = { + module : _module, + rpc : rpc, + version : version, + mode : mode, + active : "N", + graph : xmlfile + }; + + //logger.debug( JSON.stringify(post)); + + //connection.query(sqlRequest, function(err,result){ + connection.query('INSERT INTO SVC_LOGIC SET ?', post, function(err,result){ + // neat! + + // Need DB lookup logic here + connection.query("SELECT module,rpc,version,mode,active,graph FROM SVC_LOGIC", function(err, rows) { + + if(!err) { + if ( rows.length > 0 ) + { + res.render('sla/list', { rows: rows, result:{code:'',msg:''}, privilege:privilegeObj,header:process.env.MAIN_MENU } ); + return; + }else{ + console.log("no rows returned"); + res.render("pages/home"); + return; + } + } + connection.on('error', function(err){ + connection.release(); + console.log(500, "An error has occurred -- " + err); + res.render("pages/home"); + return; + }); + }); //end query + + connection.release(); + }); + //connection.query('INSERT INTO SVC_LOGIC SET ?', post, function(err,result){ + // neat! + //logger.debug('inserted rows'); + //}); + + //if(err){ + //res.render('pages/home'); + //} + return; + + }); // end of getConnection +}; + +exports.activate = function(req,res,_module,rpc,version,mode,callback){ + + var sql = "UPDATE SVC_LOGIC SET active=\'Y\' WHERE module=\'" + + _module + "' AND rpc=\'" + + rpc + "' AND version=\'" + + version + "' AND mode=\'" + + mode + "'"; + + console.log('SQL='+sql); + + pool.getConnection(function(err,connection) { + + if(err){ + console.error( String(err) ); // ALARM + callback(err, 'Unable to get database connection.' + err); + return; + } + + connection.query(sql, function(err,result){ + + connection.release(); + if(err){ + callback(err, 'Unable to get database connection.' + err); + } + else + { + callback(null,''); + } + }); //end query + }); // end getConnection +} + + +exports.deactivate = function(req,res,_module,rpc,version,mode,callback){ + + var sql = "UPDATE SVC_LOGIC SET active=\'N\' WHERE module=\'" + + _module + "' AND rpc=\'" + + rpc + "' AND version=\'" + + version + "' AND mode=\'" + + mode + "'"; + + console.log('SQL='+sql); + + pool.getConnection(function(err,connection) { + + if(err){ + console.error( String(err) ); // ALARM + callback(err, 'Unable to get database connection.' + err); + return; + } + + connection.query(sql, function(err,result){ + + connection.release(); + if(err){ + callback(err, 'Unable to get database connection.' + err); + } + else + { + callback(null,''); + } + }); //end query + }); // end getConnection +} + +exports.global_deactivate = function(req,res,_module,rpc,mode,callback){ + + var sql = "UPDATE SVC_LOGIC SET active=\'N\' WHERE module=\'" + + _module + "' AND rpc=\'" + + rpc + "' AND mode=\'" + + mode + "'"; + + + pool.getConnection(function(err,connection) { + + if(err){ + callback(err, 'Unable to get database connection.' + err); + return; + } + + connection.query(sql, function(err,result){ + + connection.release(); + if(err){ + callback(err, err); + } + else + { + callback(null,''); + } + }); //end query + }); // end getConnection +} + + +exports.deleteDG = function(req,res,_module,rpc,version,mode,callback){ + + var sql = "DELETE FROM SVC_LOGIC WHERE module=\'" + + _module + "' AND rpc=\'" + + rpc + "' AND version=\'" + + version + "' AND mode=\'" + + mode + "'"; + + console.log('SQL='+sql); + + pool.getConnection(function(err,connection) { + + if(err){ + console.error( String(err) ); // ALARM + callback(err, 'Unable to get database connection.' + err); + return; + } + + connection.query(sql, function(err,result){ + + connection.release(); + if(err){ + callback(err, 'Unable to get database connection.' + err); + } + else + { + callback(null,''); + } + }); //end query + }); // end getConnection +} + + + +function padLeft(nr, n, str){ + return Array(n-String(nr).length+1).join(str||'0')+nr; +} + diff --git a/admportal/server/router/routes/gamma.js b/admportal/server/router/routes/gamma.js new file mode 100644 index 00000000..70e6713c --- /dev/null +++ b/admportal/server/router/routes/gamma.js @@ -0,0 +1,1667 @@ +var express = require('express'); +var router = express.Router(); +var exec = require('child_process').exec; +var util = require('util'); +var fs = require('fs'); +var dbRoutes = require('./dbRoutes'); +var csp = require('./csp'); +var multer = require('multer'); +var bodyParser = require('body-parser'); +var sax = require('sax'),strict=true,parser = sax.parser(strict); +var async = require('async'); +var l_ = require('lodash'); + + +// used for file upload button, retain original file name +//router.use(bodyParser()); +router.use(bodyParser.urlencoded({ + extended: true +})); + +//var upload = multer({ dest: process.cwd() + '/uploads/', rename: function(fieldname,filename){ return filename; } }); + +// multer 1.1 +var storage = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, process.cwd() + '/uploads/') + }, + filename: function (req, file, cb) { + cb(null, file.originalname ) + } +}); + +var upload = multer({ + storage: storage +}); + + +//router.use(express.json()); +//router.use(express.urlencoded()); +//router.use(multer({ dest: './uploads/' })); + +// 1604 +var selectNetworkProfile = "SELECT network_type,technology FROM NETWORK_PROFILE ORDER BY network_type"; + +var selectNbVlanRange = "SELECT vlan_plan_id,plan_type,purpose,LPAD(range_start,4,0) range_start,LPAD(range_end,4,0) range_end,generated from VLAN_RANGES ORDER BY vlan_plan_id"; + +var selectNbVlanPool = "SELECT aic_site_id,availability_zone,vlan_plan_id,plan_type,purpose,LPAD(vlan_id,4,0) vlan_id,status FROM VLAN_POOL ORDER BY aic_site_id,availability_zone,vlan_plan_id,vlan_id"; + +router.get('/getNetworkProfile', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.getTable(req,res,selectNetworkProfile,'gamma/networkProfile',{code:'', msg:''}, req.session.loggedInAdmin); +}); +router.get('/getNbVlanRange', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.getTable(req,res,selectNbVlanRange,'gamma/nbVlanRange',{code:'', msg:''}, req.session.loggedInAdmin); +}); + +router.get('/getNbVlanPool', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + if (typeof req.query.vlan_plan_id == "undefined"){ + dbRoutes.getTable(req,res,selectNbVlanPool,'gamma/nbVlanPool',{code:'', msg:''}, req.session.loggedInAdmin); + }else{ + var sql = "SELECT aic_site_id,availability_zone,vlan_plan_id,plan_type,purpose,vlan_id,status FROM VLAN_POOL WHERE vlan_plan_id='" + req.query.vlan_plan_id + "' AND vlan_id BETWEEN " + + req.query.range_start + " AND " + req.query.range_end; + dbRoutes.getTable(req,res,sql,'gamma/nbVlanPool',{code:'', msg:''}, req.session.loggedInAdmin); + } +}); + +router.post('/addNetworkProfile', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var network_type = removeNL(req.body.nf_network_type); + var technology = removeNL(req.body.nf_technology); + var sql = "INSERT INTO NETWORK_PROFILE (network_type,technology) VALUES (" + + "'"+ network_type + "'," + + "'"+ technology + "')"; + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push( function(callback) { dbRoutes.addRow(sql,req,res,callback); } ); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err) + { + msgArray.push(err); + dbRoutes.getTable(req,res,ucpePhsCredentials, 'gamma/networkProfile', {code:'failure', msg:msgArray},privilegeObj); + return; + } + else + { + if ( result == 1 ) + { + msgArray.push('Successfully added Network Profile.'); + dbRoutes.getTable(req,res,selectNetworkProfile, 'gamma/networkProfile', {code:'success', msg:msgArray},privilegeObj); + return; + } + else + { + msgArray.push('Was not able to add Network Profile.'); + dbRoutes.getTable(req,res,ucpePhsCredentials, 'gamma/networkProfile', {code:'failure', msg:msgArray},privilegeObj); + return; + } + } + }); +}); + +router.post('/saveNbVlanRange', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var plan_type = req.body.nf_plan_type; + var purpose = req.body.nf_purpose; + var range_start = padLeft(removeNL(req.body.nf_range_start),4); + var range_end = padLeft(removeNL(req.body.nf_range_end),4); + var tasks = []; + var privilegeObj = req.session.loggedInAdmin; + + tasks.push( function(callback) { + dbRoutes.saveNbVlanRange(range_start,range_end,plan_type,purpose,req,res,callback); + }); + + // will probably need to be a new call that is a transaction if i use a new + // plan_type-purpose-counter table. + //tasks.push( function(callback) { dbRoutes.addRow(sql,req,res,callback); } ); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err) + { + msgArray.push(err); + dbRoutes.getTable(req,res,selectNbVlanRange, 'gamma/nbVlanRange', {code:'failure', msg:msgArray},privilegeObj); + return; + } + else + { + msgArray.push('Successfully added VLAN Range.'); + dbRoutes.getTable(req,res,selectNbVlanRange, 'gamma/nbVlanRange', {code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +router.get('/deleteNetworkProfile', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push(function(callback){ + dbRoutes.executeSQL("DELETE FROM NETWORK_PROFILE WHERE network_type = '" + req.query.network_type + "'", req,res,callback); + + }); + async.series(tasks, function(err,result) + { + var msgArray = new Array(); + if(err){ + msgArray.push("Error: " + err); + dbRoutes.getTable(req,res,selectNetworkProfile, 'gamma/networkProfile', {code:'failure', msg:msgArray},privilegeObj); + return; + } + else + { + if ( result[0] == 1 ) + { + msgArray.push('Successfully deleted Network Profile.'); + dbRoutes.getTable(req,res,selectNetworkProfile, 'gamma/networkProfile', {code:'success', msg:msgArray},privilegeObj); + return; + } + else + { + msgArray.push('No rows removed.'); + dbRoutes.getTable(req,res,selectNetworkProfile, 'gamma/networkProfile', {code:'failure', msg:msgArray},privilegeObj); + return; + } + } + }); +}); + +router.get('/deleteNbVlanRange', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + + tasks.push(function(callback){ + dbRoutes.deleteNbVlanRange(req.query.vlan_plan_id,req,res,callback); + }); + async.series(tasks, function(err,result) + { + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getTable(req,res,selectNbVlanRange, 'gamma/nbVlanRange', {code:'failure', msg:msgArray},privilegeObj); + return; + } + else + { + msgArray.push('Successfully deleted Range.'); + dbRoutes.getTable(req,res,selectNbVlanRange, 'gamma/nbVlanRange', {code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +router.post('/updateNetworkProfile', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var sql = "UPDATE NETWORK_PROFILE SET " + + "network_type='"+ removeNL(req.body.uf_network_type) + "', " + + "technology='" + removeNL(req.body.uf_technology) + "' " + + "WHERE network_type='" + removeNL(req.body.uf_key_network_type) + "'"; + + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push( function(callback) { dbRoutes.executeSQL(sql,req,res,callback); } ); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getTable(req,res,selectNetworkProfile, 'gamma/networkProfile', {code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Successfully updated Network Profile.'); + dbRoutes.getTable(req,res,selectNetworkProfile, 'gamma/networkProfile', {code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +router.post('/updateNbVlanPool', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var sql = "UPDATE VLAN_POOL SET " + + "status='"+ removeNL(req.body.uf_status) + "' " + + " WHERE aic_site_id='" + removeNL(req.body.uf_key_aic_site_id) + "'" + + " AND availability_zone='" + removeNL(req.body.uf_key_availability_zone) + "'" + + " AND vlan_plan_id='" + removeNL(req.body.uf_key_vlan_plan_id) + "'" + + " AND plan_type='" + removeNL(req.body.uf_key_plan_type) + "'" + + " AND purpose='" + removeNL(req.body.uf_key_purpose) + "'" + + " AND vlan_id=" + removeNL(req.body.uf_key_vlan_id); + + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push( function(callback) { dbRoutes.executeSQL(sql,req,res,callback); } ); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getTable(req,res,selectNbVlanPool, 'gamma/nbVlanPool', {code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Successfully updated Network Profile.'); + dbRoutes.getTable(req,res,selectNbVlanPool, 'gamma/nbVlanPool', {code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +router.post('/updateNbVlanPool', csp.checkAuth, dbRoutes.checkDB, function(req,res){ +}); +router.get('/generateNbVlanPool', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var vlan_plan_id = req.query.vlan_plan_id; + var plan_type = req.query.plan_type; + var purpose = req.query.purpose; + var range_start = req.query.range_start; + var range_end = req.query.range_end; + var tasks = []; + var privilegeObj = req.session.loggedInAdmin; + + tasks.push( function(callback) { + dbRoutes.generateNbVlanPool(range_start,range_end,plan_type,purpose,vlan_plan_id,req,res,callback); + }); + + // will probably need to be a new call that is a transaction if i use a new + // plan_type-purpose-counter table. + //tasks.push( function(callback) { dbRoutes.addRow(sql,req,res,callback); } ); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err) + { + msgArray.push(err); + dbRoutes.getTable(req,res,selectNbVlanRange, 'gamma/nbVlanRange', {code:'failure', msg:msgArray},privilegeObj); + return; + } + else + { + msgArray.push('Successfully added VLAN Range.'); + dbRoutes.getTable(req,res,selectNbVlanRange, 'gamma/nbVlanRange', {code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +///// end 1604 + + +// GET +router.get('/getServiceHoming', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.getServiceHoming(req,res, {code:'', msg:''}, req.session.loggedInAdmin); +}); +router.get('/getServiceHomingRollback', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.getServiceHomingRollback(req,res, {code:'', msg:''}, req.session.loggedInAdmin); +}); +router.get('/getVlanPool', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.getVlanPool(req,res, {code:'', msg:''}, req.session.loggedInAdmin); +}); +router.get('/getAicSite', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.getAicSite(req,res, {code:'', msg:''}, req.session.loggedInAdmin); +}); +router.get('/getAicSwitch', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.getAicSwitch(req,res, {code:'', msg:''}, req.session.loggedInAdmin); +}); +router.get('/getAicAvailZone', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.getAicAvailZone(req,res, {code:'', msg:''}, req.session.loggedInAdmin); +}); +router.get('/getVpePool', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.getVpePool(req,res,{code:'', msg:''}, req.session.loggedInAdmin); +}); +router.get('/getVplspePool', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.getVplspePool(req,res, {code:'', msg:''}, req.session.loggedInAdmin); +}); + +// ROLLBACK SERVICE_HOMING +router.get('/rollbackServiceHoming', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push(function(callback) { + dbRoutes.rollbackServiceHoming(req,res,callback); + }); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getServiceHomingRollback(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('SERVICE_HOMING table successfully restored.'); + dbRoutes.getServiceHoming(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +// DELETE SERVICE_HOMING +router.get('/deleteServiceHoming', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push(function(callback) { + dbRoutes.deleteServiceHoming(req,res,callback); + }); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getServiceHoming(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Row successfully deleted from SERVICE_HOMING table.'); + dbRoutes.getServiceHoming(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + + +// DELETE AIC_SITE +router.get('/deleteSite', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push(function(callback) { + dbRoutes.deleteSite(req,res,callback); + }); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getAicSite(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Row successfully deleted from AIC_SITE table.'); + dbRoutes.getAicSite(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +// DELETE AIC_SWITCH +router.get('/deleteSwitch', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push(function(callback) { + dbRoutes.deleteSwitch(req,res,callback); + }); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getAicSwitch(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Row successfully deleted from AIC_SWITCH table.'); + dbRoutes.getAicSwitch(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +// DELETE AIC_AVAIL_ZONE_POOL +router.get('/deleteZone', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push(function(callback) { + dbRoutes.deleteZone(req,res,callback); + }); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getAicAvailZone(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Row successfully deleted from AIC_AVAIL_ZONE_POOL table.'); + dbRoutes.getAicAvailZone(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +// DELETE VLAN_ID_POOL +router.get('/deleteVlanPool', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push(function(callback) { + dbRoutes.deleteVlanPool(req,res,callback); + }); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getVlanPool(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Row successfully deleted from VLAN_ID_POOL table.'); + dbRoutes.getVlanPool(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +// DELETE VPE_POOL +router.get('/deleteVpePool', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push(function(callback) { + dbRoutes.deleteVpePool(req,res,callback); + }); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getVpePool(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Row successfully deleted from VPE_POOL table.'); + dbRoutes.getVpePool(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + + +// DELETE VPE_POOL +router.get('/deleteVplspePool', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push(function(callback) { + dbRoutes.deleteVplspePool(req,res,callback); + }); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getVplspePool(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Row successfully deleted from VPLSPE_POOL table.'); + dbRoutes.getVplspePool(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +// POST +router.post('/addServiceHoming', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push( function(callback) { dbRoutes.addWebServiceHoming(req,res,callback); } ); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getServiceHoming(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Successfully added SERVICE_HOMING'); + dbRoutes.getServiceHoming(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + + +// gamma - updateProvStatus +router.post('/updateProvStatus', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push( function(callback) { dbRoutes.updateProvStatus(req,res,callback); } ); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getVpePool(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Successfully updated Provisioning Status'); + dbRoutes.getVpePool(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +// gamma - updateAicSite +router.post('/updateAicSite', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push( function(callback) { dbRoutes.updateAicSite(req,res,callback); } ); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getAicSite(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Successfully updated AIC_SITE table.'); + dbRoutes.getAicSite(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +// gamma - updateAicSwitch +router.post('/updateAicSwitch', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push( function(callback) { dbRoutes.updateAicSwitch(req,res,callback); } ); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getAicSwitch(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Successfully updated AIC_SWITCH table.'); + dbRoutes.getAicSwitch(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +// gamma - updateAicAvailZone +router.post('/updateAicAvailZone', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push( function(callback) { dbRoutes.updateAicAvailZone(req,res,callback); } ); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getAicAvailZone(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Successfully updated AIC_AVAIL_ZONE_POOL table.'); + dbRoutes.getAicAvailZone(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +// gamma - updateVlanPool +router.post('/updateVlanPool', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push( function(callback) { dbRoutes.updateVlanPool(req,res,callback); } ); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getVlanPool(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Successfully updated VLAN_ID_POOL table.'); + dbRoutes.getVlanPool(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +// gamma - updateVpePool +router.post('/updateVpePool', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push( function(callback) { dbRoutes.updateVpePool(req,res,callback); } ); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getVpePool(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Successfully updated VPE_POOL table.'); + dbRoutes.getVpePool(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +// gamma - updateVplspePool +router.post('/updateVplspePool', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push( function(callback) { dbRoutes.updateVplspePool(req,res,callback); } ); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getVplspePool(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Successfully updated VPLSPE_POOL table.'); + dbRoutes.getVplspePool(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + + +// gamma - updateServiceHoming +router.post('/updateServiceHoming', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push( function(callback) { dbRoutes.updateServiceHoming(req,res,callback); } ); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getServiceHoming(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Successfully updated SERVICE_HOMING table.'); + dbRoutes.getServiceHoming(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + + +router.post('/uploadVLAN', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res, next){ + + var msgArray = new Array(); + var privilegeObj = req.session.loggedInAdmin; + + if(req.file.originalname){ + if (req.file.originalname.size == 0) { + dbRoutes.getVlanPool(req,res,{code:'danger', msg:'There was an error uploading the file, please try again.'},privilegeObj); + return; + } + fs.exists(req.file.path, function(exists) { + if(exists) { + + var str = req.file.originalname; + + // check for valid filename format + var tagpos = str.search("_ctag_pool"); + var csvpos = str.search(".csv"); + if(tagpos != 13 || csvpos != 23){ + var msgArray = new Array(); + msgArray.push('Not a valid filename, format must be pp_YYYYMMDDHH_ctag_pool.csv'); + dbRoutes.getVlanPool(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + + try { + var csv = require('csv'); + + // the job of the parser is to convert a CSV file + // to a list of rows (array of rows) + var parser = csv.parse({ + columns: function(line) { + // By defining this callback, we get handed the + // first line of the spreadsheet. Which we'll + // ignore and effectively skip this line from processing + }, + skip_empty_lines: true + }); + + var row = 0; + var f = new Array(); + var transformer = csv.transform(function(data){ + // this will get row by row data, so for example, + //logger.debug(data[0]+','+data[1]+','+data[2]); + f[row] = new Array(); + for ( col=0; col<data.length; col++ ) + { + f[row][col] = data[col]; + } + row++; + }); + + + // called when done with processing the CSV + transformer.on("finish", function() { + + var funcArray = new Array(); + + function createFunction(lrow,res) + { + return function(callback) { dbRoutes.addVLAN(lrow,res,callback); } + } + + // loop for each row and create an array of callbacks for async.parallelLimit + // had to create a function above 'createFunction' to get + for (var x=0; x<f.length; x++) + { + funcArray.push( createFunction(f[x],res) ); + } + + // make db calls in parrallel + //async.parallelLimit(funcArray, 5, function(err,result){ + async.series(funcArray, function(err,result){ + + if ( err ) { + dbRoutes.getVlanPool(req,res, result,privilegeObj); + return; + } + else { + // result array has an entry in it, success entries are blank, figure out + // how many are not blank, aka errors. + var rowError = 0; + for(var i=0;i<result.length;i++){ + if ( result[i].length > 0 ) + { + rowError++; + } + } + + var rowsProcessed = f.length - rowError; + result.push(rowsProcessed + ' of ' + f.length + ' rows processed.'); + if ( rowError > 0 ) + { + result = {code:'failure', msg:result}; + } + else + { + result = {code:'success', msg:result}; + } + dbRoutes.getVlanPool(req,res,result,privilegeObj); + return; + } + }); + }); + + + var stream = fs.createReadStream(req.file.path, "utf8"); + stream.pipe(parser).pipe(transformer); + + + } catch(ex) { + console.error('error:'+ex); + msgArray = []; + msgArray.push('There was an error uploading the file. '+ex); + dbRoutes.getVlanPool(req,res, {code:'danger', msg:msgArray}, privilegeObj); + return; + } + + } else { + msgArray = []; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVlanPool(req,res, {code:'danger', msg:msgArray}, privilegeObj); + return; + } + }); + } + else { + msgArray = []; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVlanPool(req,res, {code:'danger', msg:msgArray}, privilegeObj); + return; + } + +}); + + +// POST +router.post('/uploadAicSite', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res){ + + var msgArray = new Array(); + var privilegeObj = req.session.loggedInAdmin; + + if(req.file.originalname){ + if (req.file.originalname.size == 0) { + dbRoutes.getAicSite(req,res, {code:'danger', msg:'There was an error uploading the file, please try again.'}, privilegeObj); + return; + } + fs.exists(req.file.path, function(exists) { + if(exists) { + + var str = req.file.originalname; + + // check for valid filename format + var tagpos = str.search("_site"); + var csvpos = str.search(".csv"); + if(tagpos != 13 || csvpos != 18){ + msgArray.length = 0; + msgArray.push('Not a valid filename, format must be pp_YYYYMMDDHH_site.csv'); + dbRoutes.getAicSite(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + + try { + var csv = require('csv'); + + // the job of the parser is to convert a CSV file + // to a list of rows (array of rows) + var parser = csv.parse({ + columns: function(line) { + // By defining this callback, we get handed the + // first line of the spreadsheet. Which we'll + // ignore and effectively skip this line from processing + }, + skip_empty_lines: true + }); + + var row = 0; + var f = new Array(); + var transformer = csv.transform(function(data){ + // this will get row by row data, so for example, + //logger.debug(data[0]+','+data[1]+','+data[2]); + + // build an array of rows + f[row] = new Array(); + for ( col=0; col<data.length; col++ ) + { + f[row][col] = data[col]; + } + row++; + }); + + // called when done with processing the CSV + transformer.on("finish", function() { + + var funcArray = new Array(); + + function createFunction(lrow,res) + { + return function(callback) { dbRoutes.addAicSite(lrow,res,callback); } + } + + // loop for each row and create an array of callbacks for async.parallelLimit + // had to create a function above 'createFunction' to get + for (var x=0; x<f.length; x++) + { + funcArray.push( createFunction(f[x],res) ); + } + + // make db calls in parrallel + async.parallelLimit(funcArray, 50, function(err,result){ + + if ( err ) { + dbRoutes.getAicSite(req,res, result,privilegeObj); + return; + } + else { + // result array has an entry in it, success entries are blank, figure out + // how many are not blank, aka errors. + var rowError = 0; + for(var i=0;i<result.length;i++){ + if ( result[i].length > 0 ) + { + rowError++; + } + } + + var rowsProcessed = f.length - rowError; + result.push(rowsProcessed + ' of ' + f.length + ' rows processed.'); + if ( rowError > 0 ) + { + result = {code:'failure', msg:result}; + } + else + { + result = {code:'success', msg:result}; + } + dbRoutes.getAicSite(req,res,result,privilegeObj); + return; + } + }); + }); + + var stream = fs.createReadStream(req.file.path, "utf8"); + stream.pipe(parser).pipe(transformer); + + + } catch(ex) { + msgArray.length = 0; + msgArray.push('There was an error uploading the file. '+ex); + dbRoutes.getAicSite(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + + } else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getAicSite(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + }); + } + else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getAicSite(req,res,{code:'danger', msg:msgArray},privilegeObj); + } + +} ); + +// POST +router.post('/uploadAicSwitch', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res){ + + var msgArray = new Array(); + var privilegeObj = req.session.loggedInAdmin; + + if(req.file.originalname){ + if (req.file.originalname.size == 0) { + dbRoutes.getAicSwitch(req,res,{code:'danger', msg:'There was an error uploading the file, please try again.'},privilegeObj); + return; + } + fs.exists(req.file.path, function(exists) { + + if(exists) { + + var str = req.file.orignalname; + + // check for valid filename format + var tagpos = str.search("_switch"); + var csvpos = str.search(".csv"); + if(tagpos != 13 || csvpos != 20){ + msgArray.length = 0; + msgArray.push('Not a valid filename, format must be pp_YYYYMMDDHH_switch.csv'); + dbRoutes.getAicSwitch(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + + try { + var csv = require('csv'); + + // the job of the parser is to convert a CSV file + // to a list of rows (array of rows) + var parser = csv.parse({ + columns: function(line) { + // By defining this callback, we get handed the + // first line of the spreadsheet. Which we'll + // ignore and effectively skip this line from processing + }, + skip_empty_lines: true + }); + + var row = 0; + var f = new Array(); + var transformer = csv.transform(function(data){ + // this will get row by row data, so for example, + //logger.debug(data[0]+','+data[1]+','+data[2]); + + // build an array of rows + f[row] = new Array(); + for ( col=0; col<data.length; col++ ) + { + f[row][col] = data[col]; + } + row++; + }); + + // called when done with processing the CSV + transformer.on("finish", function() { + + var funcArray = new Array(); + + function createFunction(lrow,res) + { + return function(callback) { dbRoutes.addAicSwitch(lrow,res,callback); } + } + + // loop for each row and create an array of callbacks for async.parallelLimit + // had to create a function above 'createFunction' to get + for (var x=0; x<f.length; x++) + { + funcArray.push( createFunction(f[x],res) ); + } + + // make db calls in parrallel + async.parallelLimit(funcArray, 50, function(err,result){ + + if ( err ) { + dbRoutes.getAicSwitch(req,res,result,privilegeObj); + return; + } + else { + // result array has an entry in it, success entries are blank, figure out + // how many are not blank, aka errors. + var rowError = 0; + for(var i=0;i<result.length;i++){ + if ( result[i].length > 0 ) + { + rowError++; + } + } + + var rowsProcessed = f.length - rowError; + result.push(rowsProcessed + ' of ' + f.length + ' rows processed.'); + if ( rowError > 0 ) + { + result = {code:'failure', msg:result}; + } + else + { + result = {code:'success', msg:result}; + } + dbRoutes.getAicSwitch(req,res,result,privilegeObj); + return; + } + }); + }); + + var stream = fs.createReadStream(req.file.path, "utf8"); + stream.pipe(parser).pipe(transformer); + + + } catch(ex) { + msgArray.length = 0; + msgArray.push('There was an error uploading the file. '+ex); + dbRoutes.getAicSwitch(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + + } else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getAicSwitch(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + }); + } + else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getAicSwitch(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + +} ); + +// POST +router.post('/uploadAicAvailZone', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res){ + + var msgArray = new Array(); + var privilegeObj = req.session.loggedInAdmin; + + if(req.file.originalname){ + if (req.file.originalname.size == 0) { + dbRoutes.getAicAvailZone(req,res,{code:'failure', msg:'There was an error uploading the file, please try again.'},privilegeObj); + return; + } + fs.exists(req.file.path, function(exists) { + + if(exists) { + + var str = req.file.originalname; + + // check for valid filename format + var tagpos = str.search("_availabilityzone"); + var csvpos = str.search(".csv"); + if(tagpos != 13 || csvpos != 30){ + msgArray.length = 0; + msgArray.push('Not a valid filename, format must be pp_YYYYMMDDHH_availabilityzone.csv'); + dbRoutes.getAicAvailZone(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + + try { + var csv = require('csv'); + + // the job of the parser is to convert a CSV file + // to a list of rows (array of rows) + var parser = csv.parse({ + columns: function(line) { + // By defining this callback, we get handed the + // first line of the spreadsheet. Which we'll + // ignore and effectively skip this line from processing + }, + skip_empty_lines: true + }); + + var row = 0; + var f = new Array(); + var transformer = csv.transform(function(data){ + // this will get row by row data, so for example, + //logger.debug(data[0]+','+data[1]+','+data[2]); + + // build an array of rows + f[row] = new Array(); + for ( col=0; col<data.length; col++ ) + { + f[row][col] = data[col]; + } + row++; + }); + + // called when done with processing the CSV + transformer.on("finish", function() { + + var funcArray = new Array(); + + function createFunction(lrow,res) + { + return function(callback) { dbRoutes.addAicAvailZone(lrow,res,callback); } + } + + // loop for each row and create an array of callbacks for async.parallelLimit + // had to create a function above 'createFunction' to get + for (var x=0; x<f.length; x++) + { + funcArray.push( createFunction(f[x],res) ); + } + + // make db calls in parrallel + async.parallelLimit(funcArray, 50, function(err,result){ + + if ( err ) { + dbRoutes.getAicAvailZone(req,res,result,privilegeObj); + return; + } + else { + // result array has an entry in it, success entries are blank, figure out + // how many are not blank, aka errors. + var rowError = 0; + for(var i=0;i<result.length;i++){ + if ( result[i].length > 0 ) + { + rowError++; + } + } + + var rowsProcessed = f.length - rowError; + result.push(rowsProcessed + ' of ' + f.length + ' rows processed.'); + if ( rowError > 0 ) + { + result = {code:'failure', msg:result}; + } + else + { + result = {code:'success', msg:result}; + } + dbRoutes.getAicAvailZone(req,res,result,privilegeObj); + return; + } + }); + }); + + var stream = fs.createReadStream(req.file.path, "utf8"); + stream.pipe(parser).pipe(transformer); + + + } catch(ex) { + msgArray.length = 0; + msgArray.push('There was an error uploading the file. '+ex); + dbRoutes.getAicAvailZone(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + + } else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getAicAvailZone(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + }); + } + else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getAicAvailZone(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + +} ); + +// POST +router.post('/uploadVpePool', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res){ + + var msgArray = new Array(); + var privilegeObj = req.session.loggedInAdmin; + + if(req.file.originalname){ + if (req.file.originalname.size == 0) { + dbRoutes.getVpePool(req,res,{code:'failure', msg:'There was an error uploading the file, please try again.'},privilegeObj); + return; + } + fs.exists(req.file.path, function(exists) { + + if(exists) { + + var str = req.file.originalname; + + // check for valid filename format + var tagpos = str.search("_vpe"); + var csvpos = str.search(".csv"); + if(tagpos != 13 || csvpos != 17){ + msgArray.length = 0; + msgArray.push('Not a valid filename, format must be pp_YYYYMMDDHH_vpe.csv'); + var resultObj = {code:'failure', msg:msgArray}; + dbRoutes.getVpePool(req,res,resultObj,privilegeObj); + return; + } + + try { + var csv = require('csv'); + + // the job of the parser is to convert a CSV file + // to a list of rows (array of rows) + var parser = csv.parse({ + columns: function(line) { + // By defining this callback, we get handed the + // first line of the spreadsheet. Which we'll + // ignore and effectively skip this line from processing + }, + skip_empty_lines: true + }); + + var row = 0; + var f = new Array(); + var transformer = csv.transform(function(data){ + // this will get row by row data, so for example, + //logger.debug(data[0]+','+data[1]+','+data[2]); + + // build an array of rows + f[row] = new Array(); + for ( col=0; col<data.length; col++ ) + { + f[row][col] = data[col]; + } + row++; + }); + + // called when done with processing the CSV + transformer.on("finish", function() { + + var funcArray = new Array(); + + function createFunction(lrow,res) + { + return function(callback) { dbRoutes.addVpePool(lrow,res,callback); } + } + + // loop for each row and create an array of callbacks for async.parallelLimit + // had to create a function above 'createFunction' to get + for (var x=0; x<f.length; x++) + { + funcArray.push( createFunction(f[x],res) ); + } + + // make db calls in parrallel + async.parallelLimit(funcArray, 50, function(err,result){ + + if ( err ) { + dbRoutes.getVpePool(req,res,result,privilegeObj); + return; + } + else { + // result array has an entry in it, success entries are blank, figure out + // how many are not blank, aka errors. + var rowError = 0; + for(var i=0;i<result.length;i++){ + if ( result[i].length > 0 ) + { + rowError++; + } + } + + var rowsProcessed = f.length - rowError; + result.push(rowsProcessed + ' of ' + f.length + ' rows processed.'); + if ( rowError > 0 ) + { + result = {code:'failure', msg:result}; + } + else + { + result = {code:'success', msg:result}; + } + dbRoutes.getVpePool(req,res,result,privilegeObj); + return; + } + }); + }); + + var stream = fs.createReadStream(req.file.path, "utf8"); + stream.pipe(parser).pipe(transformer); + + + } catch(ex) { + msgArray.length = 0; + msgArray.push('There was an error uploading the file. '+ex); + dbRoutes.getVpePool(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + + } else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVpePool(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + }); + } + else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVpePool(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + +} ); + +// POST +router.post('/uploadVplspePool', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res){ + + var msgArray = new Array(); + var privilegeObj = req.session.loggedInAdmin; + + if(req.file.originalname){ + if (req.file.originalname.size == 0) { + dbRoutes.getVplspePool(req,res,{code:'failure', msg:'There was an error uploading the file, please try again.'},privilegeObj); + return; + } + fs.exists(req.file.path, function(exists) { + + if(exists) { + + var str = req.file.originalname; + + // check for valid filename format + var tagpos = str.search("_vpls"); + var csvpos = str.search(".csv"); + if(tagpos != 13 || csvpos != 18){ + msgArray.length = 0; + msgArray.push('Not a valid filename, format must be pp_YYYYMMDDHH_vpls.csv'); + dbRoutes.getVplspePool(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + + try { + var csv = require('csv'); + + // the job of the parser is to convert a CSV file + // to a list of rows (array of rows) + var parser = csv.parse({ + columns: function(line) { + // By defining this callback, we get handed the + // first line of the spreadsheet. Which we'll + // ignore and effectively skip this line from processing + }, + skip_empty_lines: true + }); + + var row = 0; + var f = new Array(); + var transformer = csv.transform(function(data){ + // this will get row by row data, so for example, + //logger.debug(data[0]+','+data[1]+','+data[2]); + + // build an array of rows + f[row] = new Array(); + for ( col=0; col<data.length; col++ ) + { + f[row][col] = data[col]; + } + row++; + }); + + // called when done with processing the CSV + transformer.on("finish", function() { + + var funcArray = new Array(); + + function createFunction(lrow,res) + { + return function(callback) { dbRoutes.addVplspePool(lrow,res,callback); } + } + // loop for each row and create an array of callbacks for async.parallelLimit + // had to create a function above 'createFunction' to get + for (var x=0; x<f.length; x++) + { + funcArray.push( createFunction(f[x],res) ); + } + + // make db calls in parrallel + async.parallelLimit(funcArray, 50, function(err,result){ + + if ( err ) { + dbRoutes.getVplspePool(req,res,result,privilegeObj); + return; + } + else { + // result array has an entry in it, success entries are blank, figure out + // how many are not blank, aka errors. + var rowError = 0; + for(var i=0;i<result.length;i++){ + if ( result[i].length > 0 ) + { + rowError++; + } + } + var rowsProcessed = f.length - rowError; + result.push(rowsProcessed + ' of ' + f.length + ' rows processed.'); + if ( rowError > 0 ) + { + result = {code:'failure', msg:result}; + } + else + { + result = {code:'success', msg:result}; + } + dbRoutes.getVplspePool(req,res,result,privilegeObj); + return; + } + }); + }); + + var stream = fs.createReadStream(req.file.path, "utf8"); + stream.pipe(parser).pipe(transformer); + + + } catch(ex) { + msgArray.length = 0; + msgArray.push('There was an error uploading the file. '+ex); + dbRoutes.getVplspePool(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + + } else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVplspePool(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + }); + } + else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVplspePool(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + +} ); + +// POST +router.post('/uploadServiceHoming', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res) +{ + var msgArray = new Array(); + var privilegeObj = req.session.loggedInAdmin; + + if(req.file.originalname) + { + if (req.file.originalname.size == 0) { + dbRoutes.getServiceHoming(req,res,{code:'failure', msg:'There was an error uploading the file, please try again.'},privilegeObj); + return; + } + fs.exists(req.file.path, function(exists) + { + if(exists) + { + var str = req.file.originalname; + + // check for valid filename format + var csvpos = str.search(".csv"); + if( (l_.startsWith(str,'aichoming_') != true) || csvpos != 18) + { + msgArray.length = 0; + msgArray.push('Not a valid filename, format must be aichoming_mmddYYYY.csv'); + //msgArray.push('Not a valid filename, format must be pp_YYYYMMDDHH_vpls.csv'); + dbRoutes.getServiceHoming(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + + try + { + var csv = require('csv'); + + // the job of the parser is to convert a CSV file + // to a list of rows (array of rows) + var parser = csv.parse({ + columns: function(line) { + // By defining this callback, we get handed the + // first line of the spreadsheet. Which we'll + // ignore and effectively skip this line from processing + }, + skip_empty_lines: true + }); + + var row = 0; + var f = new Array(); + var csvrows = new Array(); + var transformer = csv.transform(function(data){ + // this will get row by row data, so for example, + //logger.debug(data[0]+','+data[1]+','+data[2]); + + // build an array of rows + f[row] = new Array(); + for ( col=0; col<data.length; col++ ) + { + f[row][col] = data[col]; + } + row++; + }); + + // called when done with processing the CSV + transformer.on("finish", function() + { + var funcArray = new Array(); + + function createFunction(lrow,res) + { + return function(callback) { dbRoutes.addServiceHoming(lrow,req,res,callback); } + } + funcArray.push(function(callback) { + dbRoutes.saveServiceHoming(req,res,callback); + }); + // loop for each row and create an array of callbacks for async.parallelLimit + // had to create a function above 'createFunction' to get + for (var x=0; x<f.length; x++) + { + funcArray.push( createFunction(f[x],res) ); + } + + // make db calls in series + async.series(funcArray, function(err,result) + { + if ( err ) + { + result = {code:'failure', msg:result}; + dbRoutes.getServiceHoming(req,res,result,privilegeObj); + return; + } + else + { // result array has an entry in it, success entries are blank, figure out + // how many are not blank, aka errors. + var rowError = 0; + for(var i=0;i<result.length;i++) + { + if ( result[i].length > 0 ) + { + rowError++; + } + } + var rowsProcessed = f.length - rowError; + result.push(rowsProcessed + ' of ' + f.length + ' rows processed.'); + if ( rowError > 0 ) + { + result = {code:'failure', msg:result}; + } + else + { + result = {code:'success', msg:result}; + } + dbRoutes.getServiceHoming(req,res,result,privilegeObj); + return; + } + }); + }); + + var stream = fs.createReadStream(req.file.path, "utf8"); + stream.pipe(parser).pipe(transformer); + + + } catch(ex) { + msgArray.length = 0; + msgArray.push('There was an error uploading the file. '+ex); + dbRoutes.getServiceHoming(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + + } else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getServiceHoming(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + }); + } + else + { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getServiceHoming(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + +} ); +function removeNL(s) { + /* + ** Remove NewLine, CarriageReturn and Tab characters from a String + ** s string to be processed + ** returns new string + */ + r = ""; + for (i=0; i < s.length; i++) + { + if (s.charAt(i) != '\n' && + s.charAt(i) != '\r' && + s.charAt(i) != '\t') + { + r += s.charAt(i); + } + } + return r; +} +function padLeft(nr, n, str){ + return Array(n-String(nr).length+1).join(str||'0')+nr; +} + + +module.exports = router; diff --git a/admportal/server/router/routes/helpers.js b/admportal/server/router/routes/helpers.js new file mode 100644 index 00000000..6ac8215f --- /dev/null +++ b/admportal/server/router/routes/helpers.js @@ -0,0 +1,66 @@ +
+var _ = require('lodash');
+var csvtojson = require('csvtojson');
+var async = require('async');
+var uuid = require('node-uuid'); // generate a uuid with "uuid.v1()"
+var path = require('path');
+var fs = require("fs");
+var moment = require('moment');
+
+var helpers = module.exports;
+
+function puts(obj) { console.log(obj); }
+function putd(obj) { console.log(obj); }
+helpers.puts = puts;
+helpers.putd = putd;
+
+
+helpers.readCsv = function(filedir, filename, callback) {
+
+
+ var Converter=csvtojson.Converter;
+ var csvFileName=path.join(filedir,filename);
+ var fileStream=fs.createReadStream(csvFileName);
+ fileStream.on('error', function(err){
+ callback(err, null);
+ });
+ var param={noheader:true, checkType:false};
+ var csvConverter=new Converter(param);
+ csvConverter.on("end_parsed",function(jsonObj){
+ var returnValue = jsonObj;
+ callback(null, returnValue);
+ });
+ fileStream.on('error', function(err) {
+ putd(err);
+ callback(err,"");
+ });
+ fileStream.pipe(csvConverter);
+}
+
+helpers.getParam = function(csv, matchField, matchValue, returnField) {
+ dataRow=_.find(csv, matchField, matchValue);
+ dataValue=dataRow[returnField];
+ return dataValue;
+}
+
+helpers.writeOutput = function(req, filename, jsonOutput, callback) {
+ try {
+ fs.writeFileSync(filename, jsonOutput);
+ }
+ catch(err){
+ callback(err);
+ }
+}
+
+helpers.getFileName = function(req, defFilename) {
+
+ var fileObj = null;
+ for (var x=0; x < req.files.length; x++)
+ {
+ var fileObj = req.files[x];
+ if ( fileObj.filename.indexOf(defFilename) != -1 ){
+ return fileObj.filename;
+ }
+ }
+ return null;
+}
diff --git a/admportal/server/router/routes/mobility.js b/admportal/server/router/routes/mobility.js new file mode 100644 index 00000000..1c45452e --- /dev/null +++ b/admportal/server/router/routes/mobility.js @@ -0,0 +1,1339 @@ +var express = require('express'); +var router = express.Router(); +var exec = require('child_process').exec; +var util = require('util'); +var fs = require('fs.extra'); +var dbRoutes = require('./dbRoutes'); +var csp = require('./csp'); +var multer = require('multer'); +var bodyParser = require('body-parser'); +var sax = require('sax'),strict=true,parser = sax.parser(strict); +var async = require('async'); +var l_ = require('lodash'); +var dateFormat = require('dateformat'); +var properties = require(process.env.SDNC_CONFIG_DIR + '/admportal.json'); + + +// pass host, username and password to ODL +// target host for ODL request +var username = properties.odlUser; +var password = properties.odlPasswd; +var auth = 'Basic ' + new Buffer(username + ':' + password).toString('base64'); +var host = properties.odlHost; +var port = properties.odlPort; + +var header = {'Host': host, 'Authorization': auth, 'Content-Type': 'application/json'}; +var options = { + host : host, + headers : header, + port : port, + rejectUnauthorized:false, + strictSSL: false +}; + +// Connection to OpenDaylight +Odl = require('./Odl'); + +// used for file upload button, retain original file name +//router.use(bodyParser()); +//router.use(bodyParser.urlencoded({ + //extended: true +//})); + +//var upload = multer({ dest: process.cwd() + '/uploads/', rename: function(fieldname,filename){ return filename; } }); + +// multer 1.1 +var storage = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, process.cwd() + '/uploads/') + }, + filename: function (req, file, cb) { + cb(null, file.originalname ) + } +}); + +var upload = multer({ + storage: storage +}); + + + + +// GET +router.get('/getVnfData', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.getVnfData(req,res, {code:'', msg:''}, req.session.loggedInAdmin); +}); +router.get('/getVmNetworks', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.getVmNetworks(req,res, {code:'', msg:''}, req.session.loggedInAdmin); +}); +router.get('/getVnfProfile', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.getVnfProfile(req,res, {code:'', msg:''}, req.session.loggedInAdmin); +}); +router.get('/getVnfNetworks', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.getVnfNetworks(req,res, {code:'', msg:''}, req.session.loggedInAdmin); +}); +router.get('/getVmProfile', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.getVmProfile(req,res, {code:'', msg:''}, req.session.loggedInAdmin); +}); +//////// +router.get('/getVnfNetworkData', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.getVnfNetworkData(req,res, {code:'', msg:''}, req.session.loggedInAdmin); +}); + +router.get('/viewVnfNetworkData', csp.checkAuth, function(req,res) +{ + var privilegeObj = req.session.loggedInAdmin; + var resp_msg = ''; + var network_name = req.query.network_name; + var network_type = req.query.network_type; + var tasks = []; + + tasks.push(function(callback){ + Odl.GetPreloadVnfData('/restconf/config/VNF-API:preload-vnfs/vnf-preload-list/' + + encodeURIComponent(network_name) + '/' + encodeURIComponent(network_type) + '/', options,res,callback); + + }); + async.series(tasks, function(err,result) + { + var msgArray = new Array(); + if(err){ + resp_msg = err; + res.render('mobility/displayVnfNetworkData', {result:{code:'failure', msg:resp_msg}, header:process.env.MAIN_MENU}); + return; + } + else{ + resp_msg = JSON.stringify(JSON.parse(result[0],null,4)); + res.render('mobility/displayVnfNetworkData', {result:{code:'success', msg:JSON.parse(result[0])}, header:process.env.MAIN_MENU}); + return; + } + }); + +}); + +router.get('/viewVnfData', csp.checkAuth, function(req,res) +{ + var privilegeObj = req.session.loggedInAdmin; + var resp_msg = ''; + var vnf_name = req.query.vnf_name; + var vnf_type = req.query.vnf_type; + var tasks = []; + + tasks.push(function(callback){ + Odl.GetPreloadVnfData('/restconf/config/VNF-API:preload-vnfs/vnf-preload-list/' + + encodeURIComponent(vnf_name) + '/' + encodeURIComponent(vnf_type) + '/', options,res,callback); + + }); + async.series(tasks, function(err,result) + { + var msgArray = new Array(); + if(err){ + resp_msg = err; + res.render('mobility/displayVnfData', {result:{code:'failure', msg:resp_msg}, header:process.env.MAIN_MENU}); + return; + } + else{ + resp_msg = JSON.stringify(JSON.parse(result[0],null,4)); + res.render('mobility/displayVnfData', {result:{code:'success', msg:JSON.parse(result[0])}, header:process.env.MAIN_MENU}); + return; + } + }); + +}); + +router.get('/loadVnfNetworkData', csp.checkAuth, dbRoutes.checkDB, function(req,res) +{ + + var privilegeObj = req.session.loggedInAdmin; + var msgArray = new Array(); + + if ( req.query.status != 'pending' ) + { + msgArray.push("Upload Status must be in 'pending' state."); + dbRoutes.getVnfNetworkData(req,res, {code:'failure', msg:msgArray}, privilegeObj); + return; + } + + // build request-id + var now = new Date(); + var df = dateFormat(now,"isoDateTime"); + var rnum = Math.floor((Math.random() * 9999) +1); + var svc_req_id = req.query.id + "-" + df + "-" + rnum; + + var tasks = []; + + // first get the contents of the file from the db + tasks.push(function(callback){ + dbRoutes.getVnfPreloadData(req,res,"PRE_LOAD_VNF_NETWORK_DATA",callback); + }); + + // then format the request and send it using the arg1 parameter + // which is the contents of the file returned from the previous function + // call in the tasks array + tasks.push(function(arg1,callback){ + + var s_file = JSON.stringify(arg1); + + // remove the last two braces, going to add the headers there + // will add them back later. + s_file = s_file.substring(0, (s_file.length-2)); + + // add the request-information header + s_file = s_file.concat(',"request-information": {"request-action": "PreloadNetworkRequest"}'); + + // add the sdnc-request-header + s_file = s_file.concat(',"sdnc-request-header": {"svc-request-id":"'); + s_file = s_file.concat(svc_req_id); + s_file = s_file.concat('","svc-action": "reserve"}'); + + // add the two curly braces at the end that we stripped off + s_file = s_file.concat('}}'); + + Odl.Post('/restconf/operations/VNF-API:preload-network-topology-operation', + options,s_file,res,callback); + }); + + // if successful then update the status + tasks.push(function(arg1,callback){ + dbRoutes.executeSQL("UPDATE PRE_LOAD_VNF_NETWORK_DATA SET status='uploaded',svc_request_id='" + + svc_req_id + "',svc_action='reserve' WHERE id="+req.query.id,req,res,callback); + }); + + // use the waterfall method of making calls + async.waterfall(tasks, function(err,result) + { + var msgArray = new Array(); + if(err){ + msgArray.push("Error posting pre-load data to ODL: "+err); + dbRoutes.getVnfNetworkData(req,res, {code:'failure', msg:msgArray}, privilegeObj); + return; + } + else{ + msgArray.push('Successfully loaded VNF pre-loaded data.'); + dbRoutes.getVnfNetworkData(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + + +router.get('/loadVnfData', csp.checkAuth, dbRoutes.checkDB, function(req,res) +{ + var privilegeObj = req.session.loggedInAdmin; + var full_path_file_name = process.cwd() + "/uploads/" + req.query.filename + var msgArray = new Array(); + + if ( req.query.status != 'pending' ) + { + msgArray.push("Upload Status must be in 'pending' state."); + dbRoutes.getVnfData(req,res, {code:'failure', msg:msgArray}, privilegeObj); + return; + } + + // build request-id + var now = new Date(); + var df = dateFormat(now,"isoDateTime"); + var rnum = Math.floor((Math.random() * 9999) +1); + var svc_req_id = req.query.id + "-" + df + "-" + rnum; + + var tasks = []; + + // first get the contents of the file from the db + tasks.push(function(callback){ + dbRoutes.getVnfPreloadData(req,res,"PRE_LOAD_VNF_DATA",callback); + }); + + // then format the request and send it using the arg1 parameter + // which is the contents of the file returned from the previous function + // call in the tasks array + tasks.push(function(arg1,callback){ + + var s1_file = JSON.stringify(arg1); + var s_file = decodeURI(s1_file); + + + // remove the last two braces, going to add the headers there + // will add them back later. + s_file = s_file.substring(0, (s_file.length-2)); + + // add the request-information header + s_file = s_file.concat(',"request-information": {"request-action": "PreloadVNFRequest"}'); + + // add the sdnc-request-header + s_file = s_file.concat(',"sdnc-request-header": {"svc-request-id":"'); + s_file = s_file.concat(svc_req_id); + s_file = s_file.concat('","svc-action": "reserve"}'); + + // add the two curly braces at the end that we stripped off + s_file = s_file.concat('}}'); + + Odl.Post('/restconf/operations/VNF-API:preload-vnf-topology-operation', + options,s_file,res,callback); + }); + + // if successful then update the status + tasks.push(function(arg1,callback){ + dbRoutes.executeSQL("UPDATE PRE_LOAD_VNF_DATA SET status='uploaded',svc_request_id='" + + svc_req_id + "',svc_action='reserve' WHERE id="+req.query.id,req,res,callback); + }); + + // use the waterfall method of making calls + async.waterfall(tasks, function(err,result) + { + var msgArray = new Array(); + if(err){ + msgArray.push("Error posting pre-load data to ODL: "+err); + dbRoutes.getVnfData(req,res, {code:'failure', msg:msgArray}, privilegeObj); + return; + } + else{ + msgArray.push('Successfully loaded VNF pre-loaded data.'); + dbRoutes.getVnfData(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + + +router.get('/deleteVnfNetworkData', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + var sql = 'DELETE FROM PRE_LOAD_VNF_NETWORK_DATA WHERE id=' + req.query.id; + + // if status is pending, then we do not have to call + // ODL, just remove from db + if (req.query.status == 'pending'){ + tasks.push(function(callback) { + dbRoutes.executeSQL(sql,req,res,callback); + }); + } else { + // format the request to ODL + var inputString = '{"input":{"network-topology-information":{"network-topology-identifier":{"service-type":"SDN-MOBILITY","network-name": "'; + inputString = inputString.concat(req.query.network_name); + inputString = inputString.concat('","network-type":"'); + inputString = inputString.concat(req.query.network_type); + inputString = inputString.concat('"}},'); + + // add the request-information header + inputString = inputString.concat('"request-information": {"request-action": "DeletePreloadNetworkRequest"},'); + + // add the sdnc-request-header + inputString = inputString.concat('"sdnc-request-header": {"svc-request-id":"'); + inputString = inputString.concat(req.query.svc_request_id); + inputString = inputString.concat('","svc-action": "delete"}}}'); + + tasks.push(function(callback) { + Odl.Post('/restconf/operations/VNF-API:preload-network-topology-operation', + options,inputString,res,callback); + }); + tasks.push(function(callback) { + dbRoutes.executeSQL(sql,req,res,callback); + }); + } + async.series(tasks, function(err,result){ + + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getVnfNetworkData(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Row successfully deleted from PRE_LOAD_VNF_NETWORK_DATA table and ODL.'); + dbRoutes.getVnfNetworkData(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + + +router.get('/deleteVnfData', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + var sql = 'DELETE FROM PRE_LOAD_VNF_DATA WHERE id=' + req.query.id; + + // if status is pending, then we do not have to call + // ODL, just remove from db + if (req.query.status == 'pending'){ + tasks.push(function(callback) { + dbRoutes.executeSQL(sql,req,res,callback); + }); + } else { + var inputString = '{"input":{"vnf-topology-information":{"vnf-topology-identifier":{"service-type":"SDN-MOBILITY","vnf-name": "'; + inputString = inputString.concat(req.query.vnf_name); + inputString = inputString.concat('","vnf-type":"'); + inputString = inputString.concat(req.query.vnf_type); + inputString = inputString.concat('"}},'); + + // add the request-information header + inputString = inputString.concat('"request-information": {"request-action": "DeletePreloadVNFRequest"},'); + + // add the request-information header + //inputString = inputString.concat('"request-information": {"request-id": "259c0f93-23cf-46ad-84dc-162ea234fff1",'); + //inputString = inputString.concat('"source": "ADMINPORTAL",'); + //inputString = inputString.concat('"order-version": "1",'); + //inputString = inputString.concat('"notification-url": "notused-this would be infrastructure portal",'); + //inputString = inputString.concat('"order-number": "1",'); + //inputString = inputString.concat('"request-action": "DeletePreloadVNFRequest"},'); + + // add the sdnc-request-header + inputString = inputString.concat('"sdnc-request-header": {"svc-request-id":"'); + inputString = inputString.concat(req.query.svc_request_id); + inputString = inputString.concat('","svc-action": "delete"}}}'); + + //inputString = inputString.concat('"sdnc-request-header":{'); + //inputString = inputString.concat('"svc-request-id": "2015-01-15T14:34:54.st1101a",'); + //inputString = inputString.concat('"svc-notification-url": "not used",'); + //inputString = inputString.concat('"svc-action": "delete"}}}'); + + tasks.push(function(callback) { + Odl.Post('/restconf/operations/VNF-API:preload-vnf-topology-operation', + options,inputString,res,callback); + }); + tasks.push(function(callback) { + dbRoutes.executeSQL(sql,req,res,callback); + }); + } + async.series(tasks, function(err,result){ + + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getVnfData(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Row successfully deleted from PRE_LOAD_VNF_DATA table and ODL.'); + dbRoutes.getVnfData(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + + +router.get('/deleteVmProfile', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + var sql = ''; + + sql = "DELETE FROM VM_PROFILE WHERE vnf_type='" + req.query.vnf_type + "'" + + " AND vm_type='" + req.query.vm_type + "'"; + + tasks.push(function(callback) { + dbRoutes.executeSQL(sql,req,res,callback); + }); + async.series(tasks, function(err,result) + { + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getVmProfile(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Row successfully deleted from VM_PROFILE table.'); + dbRoutes.getVmProfile(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + + +router.get('/deleteVnfNetwork', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + var sql = ''; + + sql = "DELETE FROM VNF_NETWORKS WHERE vnf_type='" + req.query.vnf_type + "'" + + " AND network_role='" + req.query.network_role + "'"; + + tasks.push(function(callback) { + dbRoutes.executeSQL(sql,req,res,callback); + }); + async.series(tasks, function(err,result) + { + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getVnfNetwork(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Row successfully deleted from VNF_NETWORKS table.'); + dbRoutes.getVnfNetworks(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +router.get('/deleteVnfProfile', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + var sql = ''; + + sql = "DELETE FROM VNF_PROFILE WHERE vnf_type='" + req.query.vnf_type + "'"; + + tasks.push(function(callback) { + dbRoutes.executeSQL(sql,req,res,callback); + }); + async.series(tasks, function(err,result) + { + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getVnfProfile(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Row successfully deleted from VNF_PROFILE table.'); + dbRoutes.getVnfProfile(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +router.get('/deleteVmNetwork', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + var sql = ''; + + sql = "DELETE FROM VM_NETWORKS WHERE vnf_type='" + req.query.vnf_type + + "' AND vm_type='" + req.query.vm_type + "' AND network_role='" + + req.query.network_role + "'"; + + tasks.push(function(callback) { + dbRoutes.executeSQL(sql,req,res,callback); + }); + async.series(tasks, function(err,result) + { + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getVmNetworks(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Row successfully deleted from VM_NETWORKS table.'); + dbRoutes.getVmNetworks(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + + +// POST +router.post('/addVmProfile', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + var sql; + + + if ( req.body.nf_vm_count.length > 0 ) + { + sql = "INSERT INTO VM_PROFILE (vnf_type,vm_type,vm_count) VALUES (" + + "'" + req.body.nf_vnf_type + "'," + + "'" + req.body.nf_vm_type + "'," + + req.body.nf_vm_count + ")"; + } + else + { + sql = "INSERT INTO VM_PROFILE (vnf_type,vm_type) VALUES (" + + "'" + req.body.nf_vnf_type + "'," + + "'" + req.body.nf_vm_type + "')"; + } + + + console.log("SQL: " + sql); + + tasks.push( function(callback) { dbRoutes.executeSQL(sql,req,res,callback); } ); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getVmProfile(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Successfully added VM Profile'); + dbRoutes.getVmProfile(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + + +router.post('/addVnfNetwork', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + + var sql = "INSERT INTO VNF_NETWORKS (vnf_type,network_role) VALUES (" + + "'" + req.body.nf_vnf_type + "'," + + "'" + req.body.nf_network_role + "')"; + + console.log("SQL: " + sql); + + tasks.push( function(callback) { dbRoutes.executeSQL(sql,req,res,callback); } ); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getVnfNetworks(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Successfully added VNF Network'); + dbRoutes.getVnfNetworks(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +router.post('/addVnfProfile', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + var sql; + + sql = "INSERT INTO VNF_PROFILE (vnf_type,availability_zone_count,equipment_role) VALUES (" + + "'" + req.body.nf_vnf_type + "'," + + req.body.nf_availability_zone_count + + ",'" + req.body.nf_equipment_role + "')"; + +console.log(sql); + + tasks.push( function(callback) { dbRoutes.executeSQL(sql,req,res,callback); } ); + async.series(tasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getVnfProfile(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Successfully added VNF Profile'); + dbRoutes.getVnfProfile(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +router.post('/addVmNetwork', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + var msgArray = new Array(); + + // convert true|false to 1|0 + var assign_ips = (req.body.nf_assign_ips == 'true') ? 1 : 0; + var assign_macs = (req.body.nf_assign_macs == 'true') ? 1 : 0; + var assign_floating_ip = (req.body.nf_assign_floating_ip == 'true') ? 1 : 0; + + + if ((req.body.nf_assign_ips == 'true' && + (typeof req.body.nf_ip_count == 'undefined' || req.body.nf_ip_count.length <=0))) + { + msgArray.push("If assign_ips equals 'true', ip_count must be populated with a number."); + dbRoutes.getVmNetworks(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + + + if ( req.body.nf_ip_count.length >0 ) + { + var sql = "INSERT INTO VM_NETWORKS (vnf_type,vm_type,network_role,ip_count,assign_ips,assign_macs,assign_floating_ip) VALUES (" + + "'" + req.body.nf_vnf_type + "'," + + "'" + req.body.nf_vm_type + "'," + + "'" + req.body.nf_network_role + "'," + + req.body.nf_ip_count + "," + + assign_ips + "," + + assign_macs + "," + + assign_floating_ip + ")"; + } + else + { + var sql = "INSERT INTO VM_NETWORKS (vnf_type,vm_type,network_role,assign_ips,assign_macs,assign_floating_ip) VALUES (" + + "'" + req.body.nf_vnf_type + "'," + + "'" + req.body.nf_vm_type + "'," + + "'" + req.body.nf_network_role + "'," + + assign_ips + "," + + assign_macs + "," + + assign_floating_ip + ")"; + } + + tasks.push( function(callback) { dbRoutes.executeSQL(sql,req,res,callback); } ); + async.series(tasks, function(err,result){ + msgArray = new Array(); + if(err){ + msgArray.push(err); + dbRoutes.getVmNetworks(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Successfully added VM Network'); + var message = ''; + if (req.body.nf_ip_count.length >0) + { + message = req.body.nf_vnf_type + + ',' + req.body.nf_vm_type + + ',' + req.body.nf_network_role + + ',' + req.body.nf_ip_count + + ',' + req.body.nf_assign_ips + + ',' + req.body.nf_assign_macs + + ',' + req.body.nf_assign_floating_ip; + } + else + { + message = req.body.nf_vnf_type + + ',' + req.body.nf_vm_type + + ',' + req.body.nf_network_role + + ',' + req.body.nf_assign_ips + + ',' + req.body.nf_assign_macs + + ',' + req.body.nf_assign_floating_ip; + } + dbRoutes.getVmNetworks(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); +}); + +// POST +router.post('/uploadVnfData', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res) +{ +console.log('filename:'+ JSON.stringify(req.file.originalname)); + var msgArray = new Array(); + var privilegeObj = req.session.loggedInAdmin; + + if(req.file.originalname) + { + if (req.file.originalname.size == 0) { + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVnfData(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + fs.exists(req.file.path, function(exists) + { + if(exists) + { + var str = req.file.originalname; + var content; + var enc_content; + + try{ + content = fs.readFileSync(req.file.path); + enc_content = encodeURI(content); + + + var sql = "INSERT INTO PRE_LOAD_VNF_DATA " + + "(filename,preload_data) VALUES (" + + "'"+ str + "'," + "'" + enc_content + "')"; + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push( function(callback) { dbRoutes.addRow(sql,req,res,callback); } ); + async.series(tasks, function(err,result) + { + if(err){ + msgArray.push(err); + dbRoutes.getVnfData(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Successfully uploaded ' + str); + dbRoutes.getVnfData(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); + } + catch(error){ + fs.removeSync(req.file.path); // remove bad file that was uploaded + console.error("There was an error reading the file '"+str+"'. Error: " + error); + msgArray.push("There was an error reading the file '"+str+"'. Error: " + error); + dbRoutes.getVnfData(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + } else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVnfData(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + }); + } + else + { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVnfData(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + +} ); + +router.post('/uploadVnfNetworkData', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res) +{ + var msgArray = new Array(); + var privilegeObj = req.session.loggedInAdmin; + + if(req.file.originalname) + { + if (req.file.originalname.size == 0) { + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVnfData(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + fs.exists(req.file.path, function(exists) + { + if(exists) + { + var str = req.file.originalname; + var content; + var enc_content; + + try{ + content = fs.readFileSync(req.file.path); + enc_content = encodeURI(content); + + var sql = "INSERT INTO PRE_LOAD_VNF_NETWORK_DATA " + + "(filename,preload_data) VALUES (" + + "'"+ str + "'," + "'" + enc_content + "')"; + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + tasks.push( function(callback) { dbRoutes.addRow(sql,req,res,callback); } ); + async.series(tasks, function(err,result) + { + if(err){ + msgArray.push(err); + dbRoutes.getVnfNetworkData(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + msgArray.push('Successfully uploaded ' + str); + dbRoutes.getVnfNetworkData(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); + } + catch(error){ + fs.removeSync(req.file.path); // remove bad file that was uploaded + msgArray.push("There was an error reading the file '"+str+"'. Error: " + error); + dbRoutes.getVnfNetworkData(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + } else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVnfNetworkData(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + }); + } + else + { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVnfNetworkData(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + +} ); + + +router.post('/uploadVmNetworks', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res){ + + var msgArray = new Array(); + var privilegeObj = req.session.loggedInAdmin; + + if(req.file.originalname){ + if (req.file.originalname.size == 0) { + dbRoutes.getVmNetworks(req,res,{code:'failure', msg:'There was an error uploading the file, please try again.'},privilegeObj); + return; + } + fs.exists(req.file.path, function(exists) { + + if(exists) { + + var str = req.file.originalname; + + try { + var csv = require('csv'); + + // the job of the parser is to convert a CSV file + // to a list of rows (array of rows) + var parser = csv.parse({ + columns: function(line) { + // By defining this callback, we get handed the + // first line of the spreadsheet. Which we'll + // ignore and effectively skip this line from processing + }, + skip_empty_lines: true + }); + + var row = 0; + var f = new Array(); + var transformer = csv.transform(function(data){ + // this will get row by row data, so for example, + //logger.debug(data[0]+','+data[1]+','+data[2]); + + // build an array of rows + f[row] = new Array(); + for ( col=0; col<data.length; col++ ) + { + f[row][col] = data[col]; + } + row++; + }); + + // called when done with processing the CSV + transformer.on("finish", function() { + + var funcArray = new Array(); + + function createFunction(lrow,res) + { + return function(callback) { dbRoutes.addVmNetwork(lrow,res,callback); } + } + // loop for each row and create an array of callbacks for async.parallelLimit + // had to create a function above 'createFunction' to get + for (var x=0; x<f.length; x++) + { + funcArray.push( createFunction(f[x],res) ); + } + + // make db calls in parrallel + async.parallelLimit(funcArray, 50, function(err,result){ + + if ( err ) { + dbRoutes.getVmNetworks(req,res,result,privilegeObj); + return; + } + else { + // result array has an entry in it, success entries are blank, figure out + // how many are not blank, aka errors. + var rowError = 0; + for(var i=0;i<result.length;i++){ + if ( result[i].length > 0 ) + { + rowError++; + } + } + var rowsProcessed = f.length - rowError; + result.push(rowsProcessed + ' of ' + f.length + ' rows processed.'); + if ( rowError > 0 ) + { + result = {code:'failure', msg:result}; + } + else + { + result = {code:'success', msg:result}; + } + dbRoutes.getVmNetworks(req,res,result,privilegeObj); + return; + } + }); + }); + + var stream = fs.createReadStream(req.file.path, "utf8"); + stream.pipe(parser).pipe(transformer); + + } catch(ex) { + msgArray.length = 0; + msgArray.push('There was an error uploading the file. '+ex); + dbRoutes.getVmNetworks(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + + } else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVmNetworks(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + }); + } + else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVmNetworks(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + +} ); + +router.post('/uploadVnfProfile', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res){ + + var msgArray = new Array(); + var privilegeObj = req.session.loggedInAdmin; + + if(req.file.originalname) + { + if (req.file.originalname.size == 0) { + dbRoutes.getVnfProfile(req,res,{code:'failure', msg:'There was an error uploading the file, please try again.'},privilegeObj); + return; + } + fs.exists(req.file.path, function(exists) { + + if(exists) { + + var str = req.file.originalname; + + try { + var csv = require('csv'); + + // the job of the parser is to convert a CSV file + // to a list of rows (array of rows) + var parser = csv.parse({ + columns: function(line) { + // By defining this callback, we get handed the + // first line of the spreadsheet. Which we'll + // ignore and effectively skip this line from processing + }, + skip_empty_lines: true + }); + + var row = 0; + var f = new Array(); + var transformer = csv.transform(function(data){ + // this will get row by row data, so for example, + //logger.debug(data[0]+','+data[1]+','+data[2]); + + // build an array of rows + f[row] = new Array(); + for ( col=0; col<data.length; col++ ) + { + f[row][col] = data[col]; + } + row++; + }); + + // called when done with processing the CSV + transformer.on("finish", function() { + + var funcArray = new Array(); + + function createFunction(lrow,res) + { + return function(callback) { dbRoutes.addVnfProfile(lrow,res,callback); } + } + // loop for each row and create an array of callbacks for async.parallelLimit + // had to create a function above 'createFunction' to get + for (var x=0; x<f.length; x++) + { + funcArray.push( createFunction(f[x],res) ); + } + + // make db calls in parrallel + async.series(funcArray, function(err,result){ + + if ( err ) { + dbRoutes.getVnfProfile(req,res,result,privilegeObj); + return; + } + else { + // result array has an entry in it, success entries are blank, figure out + // how many are not blank, aka errors. + var rowError = 0; + for(var i=0;i<result.length;i++){ + if ( result[i].length > 0 ) + { + rowError++; + } + } +console.log('rowError='+rowError); + var rowsProcessed = f.length - rowError; +console.log('rowsProcessed='+rowsProcessed); + result.push(rowsProcessed + ' of ' + f.length + ' rows processed.'); + if ( rowError > 0 ) + { + result = {code:'failure', msg:result}; + } + else + { + result = {code:'success', msg:result}; + } +console.log('result='+JSON.stringify(result)); + dbRoutes.getVnfProfile(req,res,result,privilegeObj); + return; + } + }); + }); + + var stream = fs.createReadStream(req.file.path, "utf8"); + stream.pipe(parser).pipe(transformer); + + } catch(ex) { + msgArray.length = 0; + msgArray.push('There was an error uploading the file. '+ex); + console.error('There was an error uploading the file. '+ex); + dbRoutes.getVnfProfile(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + } else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVnfProfile(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + }); + } + else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVnfProfile(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } +} ); + + +router.post('/uploadVnfNetworks', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res){ + + var msgArray = new Array(); + var privilegeObj = req.session.loggedInAdmin; + + if(req.file.originalname) + { + if (req.file.originalname.size == 0) { + dbRoutes.getVnfProfile(req,res, + {code:'failure', msg:'There was an error uploading the file, please try again.'}, + privilegeObj); + return; + } + fs.exists(req.file.path, function(exists) { + + if(exists) { + + var str = req.file.originalname; + + try { + var csv = require('csv'); + + // the job of the parser is to convert a CSV file + // to a list of rows (array of rows) + var parser = csv.parse({ + columns: function(line) { + // By defining this callback, we get handed the + // first line of the spreadsheet. Which we'll + // ignore and effectively skip this line from processing + }, + skip_empty_lines: true + }); + + var row = 0; + var f = new Array(); + var transformer = csv.transform(function(data){ + // this will get row by row data, so for example, + //logger.debug(data[0]+','+data[1]+','+data[2]); + + // build an array of rows + f[row] = new Array(); + for ( col=0; col<data.length; col++ ) + { + f[row][col] = data[col]; + } + row++; + }); + + // called when done with processing the CSV + transformer.on("finish", function() { + + var funcArray = new Array(); + + function createFunction(lrow,res) + { + return function(callback) { dbRoutes.addVnfNetwork(lrow,res,callback); } + } + // loop for each row and create an array of callbacks for async.parallelLimit + // had to create a function above 'createFunction' to get + for (var x=0; x<f.length; x++) + { + funcArray.push( createFunction(f[x],res) ); + } + + // make db calls in parrallel + async.series(funcArray, function(err,result){ + + if ( err ) { + dbRoutes.getVnfNetworks(req,res,result,privilegeObj); + return; + } + else { + // result array has an entry in it, success entries are blank, figure out + // how many are not blank, aka errors. + var rowError = 0; + for(var i=0;i<result.length;i++){ + if ( result[i].length > 0 ) + { + rowError++; + } + } + var rowsProcessed = f.length - rowError; + result.push(rowsProcessed + ' of ' + f.length + ' rows processed.'); + if ( rowError > 0 ) + { + result = {code:'failure', msg:result}; + } + else + { + result = {code:'success', msg:result}; + } + dbRoutes.getVnfNetworks(req,res,result,privilegeObj); + return; + } + }); + }); + + var stream = fs.createReadStream(req.file.path, "utf8"); + stream.pipe(parser).pipe(transformer); + + } catch(ex) { + msgArray.length = 0; + msgArray.push('There was an error uploading the file. '+ex); + dbRoutes.getVnfNetworks(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + } else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVnfNetworks(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + }); + } + else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVnfNetworks(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } +} ); + +router.post('/uploadVmProfile', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res){ + + var msgArray = new Array(); + var privilegeObj = req.session.loggedInAdmin; + + if(req.file.originalname) + { + if (req.file.originalname.size == 0) { + dbRoutes.getVmProfile(req,res, + {code:'failure', msg:'There was an error uploading the file, please try again.'}, + privilegeObj); + return; + } + fs.exists(req.file.path, function(exists) { + + if(exists) { + + var str = req.file.originalname; + + try { + var csv = require('csv'); + + // the job of the parser is to convert a CSV file + // to a list of rows (array of rows) + var parser = csv.parse({ + columns: function(line) { + // By defining this callback, we get handed the + // first line of the spreadsheet. Which we'll + // ignore and effectively skip this line from processing + }, + skip_empty_lines: true + }); + + var row = 0; + var f = new Array(); + var transformer = csv.transform(function(data){ + // this will get row by row data, so for example, + //logger.debug(data[0]+','+data[1]+','+data[2]); + + // build an array of rows + f[row] = new Array(); + for ( col=0; col<data.length; col++ ) + { + f[row][col] = data[col]; + } + row++; + }); + + // called when done with processing the CSV + transformer.on("finish", function() { + + var funcArray = new Array(); + + function createFunction(lrow,res) + { + return function(callback) { dbRoutes.addVmProfile(lrow,res,callback); } + } + // loop for each row and create an array of callbacks for async.parallelLimit + // had to create a function above 'createFunction' to get + for (var x=0; x<f.length; x++) + { + funcArray.push( createFunction(f[x],res) ); + } + + // make db calls in parrallel + async.series(funcArray, function(err,result){ + + if ( err ) { + dbRoutes.getVmProfile(req,res,result,privilegeObj); + return; + } + else { + // result array has an entry in it, success entries are blank, figure out + // how many are not blank, aka errors. + var rowError = 0; + for(var i=0;i<result.length;i++){ + if ( result[i].length > 0 ) + { + rowError++; + } + } + var rowsProcessed = f.length - rowError; + result.push(rowsProcessed + ' of ' + f.length + ' rows processed.'); + if ( rowError > 0 ) + { + result = {code:'failure', msg:result}; + } + else + { + result = {code:'success', msg:result}; + } + dbRoutes.getVmProfile(req,res,result,privilegeObj); + return; + } + }); + }); + + var stream = fs.createReadStream(req.file.path, "utf8"); + stream.pipe(parser).pipe(transformer); + + } catch(ex) { + msgArray.length = 0; + msgArray.push('There was an error uploading the file. '+ex); + dbRoutes.getVmProfile(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + } else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVmProfile(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } + }); + } + else { + msgArray.length = 0; + msgArray.push('There was an error uploading the file.'); + dbRoutes.getVmProfile(req,res,{code:'danger', msg:msgArray},privilegeObj); + return; + } +} ); + +module.exports = router; diff --git a/admportal/server/router/routes/network.js b/admportal/server/router/routes/network.js new file mode 100644 index 00000000..c64beae2 --- /dev/null +++ b/admportal/server/router/routes/network.js @@ -0,0 +1,400 @@ +
+// Helper functions for processing a NETWORK worksheet
+
+var helpers = require('./helpers.js');
+var _ = require('lodash');
+var csvtojson = require('csvtojson');
+var async = require('async');
+var uuid = require('node-uuid'); // generate a uuid with "uuid.v1()"
+var path = require('path');
+var fs = require("fs");
+var moment = require("moment");
+
+var network = module.exports;
+var getParam = helpers.getParam;
+
+var indir;
+var csvGeneral, csvSubnets, csvVpnBindings, csvPolicies, csvNetRoutes;
+var rawJson={}
+var finalJson={};
+var platform;
+var req,res;
+var preloadVersion; // 1607, 1610, etc...
+
+puts = helpers.puts;
+putd = helpers.putd;
+
+network.go = function(lreq,lres,cb,dir) {
+ puts("Processing NETWORK workbook");
+ req = lreq;
+ res = lres;
+ callback = cb;
+ if (dir!="") {
+ platform="pc";
+ indir=dir;
+ } else {
+ platform="portal";
+ indir=process.cwd() + "/uploads/";
+ }
+ doGeneral();
+}
+
+// READ WORKSHEET: GENERAL
+
+function doGeneral() {
+ puts("Reading General worksheet");
+ var csvFilename="General.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotGeneral);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotGeneral(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('General.csv file is missing from upload.');
+ return;
+ }
+ csvGeneral = jsonObj;
+ puts("\nRead this: ");
+ putd(csvGeneral);
+ puts("\n");
+ doSubnets();
+}
+
+// READ WORKSHEET: SUBNETS
+
+function doSubnets() {
+ puts("Reading Subnets worksheet");
+ var csvFilename="Subnets.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotSubnets);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotSubnets(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('Subnets.csv file is missing from upload.');
+ return;
+ }
+ csvSubnets = jsonObj;
+ csvSubnets = _.reject(csvSubnets, 'field2', 'Subnets');
+ csvSubnets = _.reject(csvSubnets, 'field2', 'start-address');
+ csvSubnets = _.reject(csvSubnets, 'field2', '');
+ puts("\nRead this: ");
+ putd(csvSubnets);
+ puts("\n");
+ doVpnBindings();
+}
+
+// READ WORKSHEET: VPN-BINDINGS
+
+function doVpnBindings() {
+ puts("Reading VPN-Bindings worksheet");
+ var csvFilename="VPN-Bindings.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotVpnBindings);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotVpnBindings(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('VPN-Bindings.csv file is missing from upload.');
+ return;
+ }
+ csvVpnBindings = jsonObj;
+ csvVpnBindings = _.reject(csvVpnBindings, 'field2', 'VPN-Bindings');
+ csvVpnBindings = _.reject(csvVpnBindings, 'field2', 'vpn-binding-id');
+ csvVpnBindings = _.reject(csvVpnBindings, function(o) { return (_.trim(o.field2)=="") && (_.trim(o.field3)==""); } );
+ puts("\nRead this: ");
+ putd(csvVpnBindings);
+ puts("\n");
+ doPolicies();
+}
+
+
+// READ WORKSHEET: POLICIES
+
+function doPolicies() {
+ puts("Reading Policies worksheet");
+ var csvFilename="Policies.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotPolicies);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotPolicies(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('Policies.csv file is missing from upload.');
+ return;
+ }
+ csvPolicies = jsonObj;
+ csvPolicies = _.reject(csvPolicies, 'field2', 'Policies');
+ csvPolicies = _.reject(csvPolicies, 'field2', 'network-policy-fqdn');
+ csvPolicies = _.reject(csvPolicies, 'field2', '');
+ puts("\nRead this: ");
+ putd(csvPolicies);
+ puts("\n");
+ doNetRoutes();
+}
+
+
+// READ WORKSHEET: NETWORK-ROUTES
+
+function doNetRoutes() {
+ puts("Reading Network-Routes worksheet");
+ var csvFilename="Network-Routes.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ preloadVersion = getParam(csvGeneral, 'field2', 'preload-version', 'field3');
+ if ( preloadVersion == '1607' ) {
+ puts("This is a 1607 spreadsheet. Skipping Network-Routes.csv.");
+ gotNetRoutes(null,{});
+ return;
+ }
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotNetRoutes);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotNetRoutes(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('Network-Routes.csv file is missing from upload.');
+ return;
+ }
+ csvNetRoutes = jsonObj;
+ csvNetRoutes = _.reject(csvNetRoutes, 'field2', 'Network-Routes');
+ csvNetRoutes = _.reject(csvNetRoutes, 'field2', 'route-table-reference-fqdn');
+ csvNetRoutes = _.reject(csvNetRoutes, 'field2', '');
+ puts("\nRead this: ");
+ putd(csvNetRoutes);
+ puts("\n");
+ doneReadingFiles();
+}
+
+
+// DONE READING FILES
+
+function doneReadingFiles() {
+ puts("\n");
+ puts("DONE READING FILES!");
+ puts("\n");
+ processJson();
+}
+
+
+// PROCESS THE CSV FILES INTO OBJECTS TO BE ASSEMBLED INTO FINAL OUTPUT
+function processJson() {
+ processGeneral();
+ processSubnets();
+ processVpnBindings();
+ processPolicies();
+ processNetRoutes();
+ assembleJson();
+}
+
+// ASSEMBLE AND OUTPUT RESULTS
+
+function assembleJson() {
+ puts("\n");
+ puts("Using raw JSON and assembling final ouptut JSON.");
+ puts("\n");
+
+ networkTopoID = { "network-name": rawJson['network-name'],
+ "network-role": rawJson['network-role'],
+ "network-type": rawJson['network-type'],
+ "network-technology": rawJson['network-technology'] };
+
+ providerInfo = { "physical-network-name": rawJson['physical-network-name'],
+ "is-provider-network": rawJson['is-provider-network'],
+ "is-shared-network": rawJson['is-shared-network'],
+ "is-external-network": rawJson['is-external-network'] };
+
+ networkSubnets = rawJson['subnets'];
+
+ networkVpnBindings = rawJson['vpn-bindings'];
+
+ networkPolicies = rawJson['network-policy-fqdns'];
+
+ networkRoutes = rawJson['route-table-reference'];
+
+ networkTopo = { "network-topology-identifier": networkTopoID,
+ "provider-network-information": providerInfo,
+ "subnets": networkSubnets,
+ "vpn-bindings": networkVpnBindings,
+ "network-policy": networkPolicies,
+ "route-table-reference": networkRoutes};
+
+ networkInput = {'network-topology-information': networkTopo};
+
+ finalJson = {"input": networkInput};
+
+ outputJson();
+}
+
+function outputJson() {
+ puts("\n");
+ puts("\n");
+ puts(JSON.stringify(finalJson,null,2));
+ puts("\n");
+ puts("\n");
+ var unixTime, fullpath_filename, filename;
+ unixTime = moment().unix();
+ if (platform=='portal') {
+ fullpath_filename = process.cwd() + "/uploads/" + unixTime + ".net_worksheet.json";
+ filename = unixTime + ".net_worksheet.json.";
+ } else {
+ fullpath_filename = "./output.json."+unixTime;
+ filename = "output.json." + unixTime;
+ }
+ helpers.writeOutput(req, fullpath_filename, JSON.stringify(finalJson,null,2), callback);
+ callback(null, finalJson, filename);
+}
+
+
+// Gather functions that actually process data after it is all read
+
+function processGeneral() {
+ preloadVersion = getParam(csvGeneral, 'field2', 'preload-version', 'field3');
+ rawJson['preload-version'] = preloadVersion;
+ puts("Preload version: " + preloadVersion);
+
+ if ( (preloadVersion!='1607') && (preloadVersion!='1610') ) {
+ puts("\nError - incorrect version of preload worksheet.");
+ callback('Error - incorrect version of preload worksheet.');
+ }
+
+ rawJson['network-name'] = getParam(csvGeneral, 'field2', 'network-name', 'field3');
+ rawJson['network-role'] = getParam(csvGeneral, 'field2', 'network-role', 'field3');
+ rawJson['network-type'] = getParam(csvGeneral, 'field2', 'network-type', 'field3');
+ rawJson['network-technology'] = getParam(csvGeneral, 'field2', 'network-technology', 'field3');
+
+ if ( preloadVersion!='1607' ) {
+ rawJson['physical-network-name'] = getParam(csvGeneral, 'field2', 'physical-network-name', 'field3');
+ rawJson['is-provider-network'] = getParam(csvGeneral, 'field2', 'is-provider-network', 'field3');
+ rawJson['is-shared-network'] = getParam(csvGeneral, 'field2', 'is-shared-network', 'field3');
+ rawJson['is-external-network'] = getParam(csvGeneral, 'field2', 'is-external-network', 'field3');
+ }
+
+ rawJson['request-action'] = "PreloadNetworkRequest";
+ rawJson['svc-request-id'] = uuid.v1();
+ rawJson['svc-action'] = "reserve";
+ puts('rawJson:');
+ putd(rawJson);
+ puts("\n");
+}
+
+function processSubnets() {
+ var newSubnets = [];
+ csvSubnets.forEach( function(subnet) {
+ var subnetJson = {};
+ subnetJson["start-address"] = subnet.field2;
+ if (subnet.field3!='') {
+ subnetJson["dhcp-start-address"] = subnet.field3;
+ }
+ if (subnet.field4!='') {
+ subnetJson["dhcp-end-address"] = subnet.field4;
+ }
+ if (subnet.field5!='') {
+ subnetJson["gateway-address"] = subnet.field5;
+ }
+ subnetJson["cidr-mask"] = subnet.field6;
+ subnetJson["ip-version"] = subnet.field7;
+ subnetJson["dhcp-enabled"] = subnet.field8;
+ subnetJson["subnet-name"] = subnet.field9;
+ newSubnets.push(subnetJson);
+ }
+ );
+ puts("subnets:");
+ putd(newSubnets);
+ puts("\n");
+ rawJson["subnets"] = newSubnets;
+}
+
+function processVpnBindings() {
+ var newVpnBindings = [];
+
+ csvVpnBindings.forEach( function(vpn) {
+ var vpnJson = {};
+ bindid = _.trim(vpn.field2);
+ vpnJson["vpn-binding-id"] = bindid;
+ if (bindid!="") {
+ newVpnBindings.push(vpnJson);
+ }
+ });
+
+ puts("VPN-Bindings:");
+ putd(newVpnBindings);
+ puts("\n");
+ rawJson["vpn-bindings"] = newVpnBindings;
+}
+
+function processPolicies() {
+ var newPolicies = [];
+
+ csvPolicies.forEach( function(policy) {
+ var policyJson = {};
+ fqdn = _.trim(policy.field2);
+ if (fqdn != "") {
+ policyJson["network-policy-fqdn"] = fqdn;
+ newPolicies.push(policyJson);
+ }
+
+ }
+ );
+
+ puts("Policies:");
+ putd(newPolicies);
+ puts("\n");
+ rawJson["network-policy-fqdns"] = newPolicies;
+}
+
+function processNetRoutes() {
+ var newNetRoutes = [];
+
+ csvNetRoutes.forEach( function(netroute) {
+ var netrouteJson = {};
+ fqdn = _.trim(netroute.field2);
+ if (fqdn != "") {
+ netrouteJson["route-table-reference-fqdn"] = fqdn;
+ newNetRoutes.push(netrouteJson);
+ }
+
+ }
+ );
+
+ puts("Network-Routes:");
+ putd(newNetRoutes);
+ puts("\n");
+ rawJson["route-table-reference"] = newNetRoutes;
+}
+
+
+
diff --git a/admportal/server/router/routes/odl.js b/admportal/server/router/routes/odl.js new file mode 100644 index 00000000..fba646fa --- /dev/null +++ b/admportal/server/router/routes/odl.js @@ -0,0 +1,258 @@ +var express = require('express'); +var router = express.Router(); +var csp = require('./csp'); +var properties = require(process.env.SDNC_CONFIG_DIR + '/admportal.json'); +var async = require('async'); + + +// pass host, username and password to ODL +var username = properties.odlUser; +var password = properties.odlPasswd; +var auth = 'Basic ' + new Buffer(username + ':' + password).toString('base64'); + +// target host for ODL request +var host = properties.odlHost; +var port = properties.odlPort; +var header = {'Host': host, 'Authorization': auth, 'Content-Type': 'application/yang.data+json'}; +var options = { + host: host, + headers : header, + port : port, + rejectUnauthorized: false, + strictSSL : false +}; + +// Connection to OpenDaylight +Odl = require('./Odl'); + +function handleResult(err, response_str, res) { + if (err) { + console.error( String(err) ); + res.render('pages/err', {result:{code:'failure', msg:String(err)}, header:process.env.MAIN_MENU}); + } else { + // make sure response starts with JSON string + if (response_str && response_str.indexOf('{') == 0) { + //console.log("response: ", result); + res.render('odl/listWklst', { response_obj: JSON.parse(response_str), header:process.env.MAIN_MENU }); + } else { + res.render('pages/err', {result:{code:'failure', msg:String(err) }, header:process.env.MAIN_MENU}); + } + } +} + +// / index page +// calls restconf to get information +router.get('/listWklst', csp.checkAuth, function(req, res) { + options.strictSSL = true; // used to test SSL certificate + Odl.Get('/restconf/config/L3SDN-API:services',options, handleResult,req,res); +}); + +router.get('/pageWklst', csp.checkAuth, function(req,res) { + pageWklst(req,res, {code:'', msg:''}, req.session.loggedInAdmin); +}); + + +function pageWklst(req,res,resultObj,privilegeObj) +{ + if(req.session == null || req.session == undefined + || req.session.l3sdnPageInfo == null || req.session.l3sdnPageInfo == undefined) + { + res.render("pages/err", + { result: {code:'error', msg:"Unable to read session information. "+ String(err) }, header:process.env.MAIN_MENU}); + return; + } + + var l3sdnPageInfo = req.session.l3sdnPageInfo; + var currentPage=1; + if (typeof req.query.page != 'undefined') + { + currentPage = +req.query.page; + } + l3sdnPageInfo.currentPage = currentPage; + l3sdnPageInfo.rows = l3sdnPageInfo.pages[currentPage-1]; + req.session.l3sdnPageInfo = l3sdnPageInfo; + res.render('odl/listWklst', + { + pageInfo : l3sdnPageInfo, + result : resultObj, + privilege : privilegeObj, header:process.env.MAIN_MENU + }); + return; +} + + +router.post('/update_vr_lan_interface', function(req,res){ + var svc_instance_id = encodeURIComponent(req.body.svc_instance_id); + + // format msg + var msgRsp = + { + "vr-lan-interface" : + [ + { + "vr-designation" : req.body.uf_vr_designation, + "v6-vr-lan-prefix" : req.body.uf_vr_lan_prefix, + "v6-vr-lan-prefix-length": req.body.uf_vr_lan_prefix_length, + "v6-vce-wan-address" : req.body.uf_vce_wan_address, + "v4-vr-lan-prefix" : req.body.uf_vr_lan_prefix, + "v4-vr-lan-prefix-length": req.body.uf_vr_lan_prefix_length, + "v4-vce-loopback-address": req.body.uf_vce_loopback_address + } + ] + }; + var tasks = []; + tasks.push(function(callback){ + Odl.put_vr_lan_interface('/restconf/config/L3SDN-API:services/layer3-service-list/' + + svc_instance_id + + '/service-data/vr-lan/', options, callback); + }); + async.series(tasks, function(err,result){ + + if(err){ + } + else{ + var msgArray = new Array(); + //result:{code:'error', msg:"got vr-lan information: "+ String(result)} + msgArray.push('vr-lan-interface successfully updated.'); + res.render("odl/listVRlan", + { + svc_instance_id: req.body.svc_instance_id, + response_obj : JSON.parse(result), header:process.env.MAIN_MENU + }); + return; + } + }); +}); + + +// sendData submits form data to ODL +// Data is read from URL params and converted to JSON +router.get('/svc-topology-operation', function(req, res) { + var formData = '{"input":{' + + '"svc-request-id":"'+ new Date().toISOString() + '"' +',' + + '"svc-notification-url":"'+ req.query['svc-notification-url']+ '"' + ',' + + '"svc-action":"'+ req.query['svc-action']+ '"' + ',' + + '"svc-vnf-type":"'+ req.query['svc-vnf-type']+ '"' + ',' + + '"svc-instance-id":"'+ req.query['svc-instance-id']+ '"' + ',' + + '"svc-aic-site-id":"'+ req.query['svc-aic-site-id']+ '"' + +' } }'; + Odl.Post('/restconf/operations/L3SDN-API:svc-topology-operation', options, formData, handleResult, res); +}); + +// delete request +router.get('/wklist-delete', function(req, res) { + //console.dir(req.query); + Odl.Delete('/restconf/config/L3SDN-API:l3sdn-api-worklist/requests/'+req.query['request'], options, handleResult, res); +}); + +// get request +router.get('/getid',function(req, res) { + //console.dir(req.query); + Odl.GetID('/restconf/config/L3SDN-API:l3sdn-api-worklist/requests/'+req.query['request'], options, res); +}); + +router.get('/getvnf', function(req,res) { + //console.log("/getvnf "+req.query); + Odl.GetVNF('/restconf/config/L3SDN-API:l3sdn-api-worklist/requests/'+req.query['request']+'/vnf/',options,req,res); +}); +router.get('/getvrlan', function(req,res) { + var vrtasks = []; + var reqstr = encodeURIComponent(req.query['request']); + vrtasks.push(function(callback) { + Odl.GetVRlan('/restconf/config/L3SDN-API:services/layer3-service-list/'+reqstr+'/service-data/vr-lan/',options,callback); + }); + async.series(vrtasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + Odl.Get('/restconf/config/L3SDN-API:services',options, handleResult,res); + //res.render("pages/err", + //{result:{code:'error', msg:"Unable to get vr-lan information: "+ String(err) }}); + return; + } + else { + msgArray.push('Row successfully deleted from AIC_SITE table.'); + res.render("odl/listVRlan", + { + svc_instance_id: req.query['request'], + response_obj : JSON.parse(result), header:process.env.MAIN_MENU + }); + return; + } + }); +}); +router.get('/getClusterStatus', function(req,res) { + + + var urltasks = []; + var _header = {'Host': host, 'Authorization': auth, 'Content-Type': 'application/yang.data+json'}; + var _options = null; + + var slist = properties.shard_list; + var hlist = properties.hostnameList; + var port = properties.clusterPort; + var prefix_url = properties.clusterPrefixURL; + var mid_url = properties.clusterMidURL; + var suffix_url = properties.clusterSuffixURL; + var urlArray = new Array(); + var url_request=''; + var shard=null, hostname=null; + + // build array of urls from properties + for(var x=0; x<slist.length; x++) + { + shard = slist[x]; + for(var y=0; y<hlist.length; y++) + { + hostname = hlist[y]; + + url_request = properties.odlProtocol + '://' + + hostname.hname + ':' + + port + + prefix_url + + (y+1) + + mid_url + + shard.shard_name + + suffix_url; + + _options = { + method : "GET", + path : url_request, + host : hostname.hname, + headers : _header, + port : port, + rejectUnauthorized: false, + strictSSL : false + }; + urlArray.push(_options); + } + } + + urlArray.forEach(function(request){ + urltasks.push(function(callback) { + Odl.GetClusterStatus(request,callback); + }); + }); + async.series(urltasks, function(err,result){ + var msgArray = new Array(); + if(err){ + msgArray.push(err); + res.render("pages/err", + {result:{code:'error', msg:"Unable to get status: "+ String(err) }, header:process.env.MAIN_MENU}); + return; + } + else { + var msgArray = new Array(); + msgArray.push('Sucess'); + res.render("odl/cluster_status", + { + result : {code:'success', msg:msgArray}, + response_obj : result, header:process.env.MAIN_MENU + }); + return; + } + }); +}); + + +module.exports = router; diff --git a/admportal/server/router/routes/preload.js b/admportal/server/router/routes/preload.js new file mode 100644 index 00000000..1a63ec0e --- /dev/null +++ b/admportal/server/router/routes/preload.js @@ -0,0 +1,154 @@ +var express = require('express'); +var router = express.Router(); +var exec = require('child_process').exec; +var util = require('util'); +var fs = require('fs.extra'); +var dbRoutes = require('./dbRoutes'); +var csp = require('./csp'); +var multer = require('multer'); +var bodyParser = require('body-parser'); +var sax = require('sax'),strict=true,parser = sax.parser(strict); +var async = require('async'); +var l_ = require('lodash'); +var dateFormat = require('dateformat'); +var properties = require(process.env.SDNC_CONFIG_DIR + '/admportal.json'); +var vnf = require('./vnf'); +var network = require('./network'); +var moment = require('moment'); + + + +// pass host, username and password to ODL +// target host for ODL request +var username = properties.odlUser; +var password = properties.odlPasswd; +var auth = 'Basic ' + new Buffer(username + ':' + password).toString('base64'); +var host = properties.odlHost; +var port = properties.odlPort; + +var header = {'Host': host, 'Authorization': auth, 'Content-Type': 'application/json'}; +var options = { + host : host, + headers : header, + port : port, + rejectUnauthorized:false, + strictSSL: false +}; + +// Connection to OpenDaylight +Odl = require('./Odl'); + +// multer 1.1 +var unixTime = moment().unix(); +var storage = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, process.cwd() + '/uploads/') + }, + filename: function (req, file, cb) { + cb(null, unixTime + "." + file.originalname ) + } +}); + +var upload = multer({ + storage: storage, + fileFilter: function(req,file,cb) { + var type = file.mimetype; + if ( type.indexOf('ms-excel') == -1 ) { + return cb(null,false); + } + cb(null,true); + } +}); + +router.post('/uploadVnfCsv', csp.checkAuth, dbRoutes.checkDB, upload.array('filename'), function(req, res) +{ + console.log('files:'+ JSON.stringify(req.files,null,4)); + + var tasks = [] + var msgArray = new Array(); + var privilegeObj = req.session.loggedInAdmin; + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + + tasks.push ( function(callback) { vnf.go(req,res,callback,''); } ); + tasks.push ( function(arg1,arg2,callback) { formatVnfInsertStatement(arg1,arg2,req,res,callback); } ); + tasks.push( function(arg1, callback) { dbRoutes.addRow(arg1,req,res,callback); } ); + async.waterfall(tasks, function(err,result) + { + if(err){ + msgArray.push(err); + dbRoutes.getVnfData(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + //logger.debug('Successfully uploaded ' + req.session.worksheetFilename); + msgArray.push('Successfully uploaded file.' ); + dbRoutes.getVnfData(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); + +}); + +router.post('/uploadNetworkCsv', csp.checkAuth, dbRoutes.checkDB, upload.array('filename'), function(req, res) +{ + console.log('files:'+ JSON.stringify(req.files,null,4)); + + var tasks = [] + var msgArray = new Array(); + var privilegeObj = req.session.loggedInAdmin; + + var privilegeObj = req.session.loggedInAdmin; + var tasks = []; + + tasks.push ( function(callback) { network.go(req,res,callback,''); } ); + tasks.push ( function(arg1,arg2,callback) { formatNetworkInsertStatement(arg1,arg2,req,res,callback); } ); + tasks.push( function(arg1, callback) { dbRoutes.addRow(arg1,req,res,callback); } ); + async.waterfall(tasks, function(err,result) + { + if(err){ + msgArray.push(err); + dbRoutes.getVnfNetworkData(req,res,{code:'failure', msg:msgArray},privilegeObj); + return; + } + else { + //logger.debug('Successfully uploaded ' + req.session.worksheetFilename); + msgArray.push('Successfully uploaded file.' ); + dbRoutes.getVnfNetworkData(req,res,{code:'success', msg:msgArray},privilegeObj); + return; + } + }); + +}); + + +function formatVnfInsertStatement(content,filename,req,res,callback) +{ + //var newstr = JSON.stringify(content).replace(/\\\"/g,'\\\\\\"'); + //var ins_str = newstr.replace("\r\n ", "\\r\\n"); + var newstr = JSON.stringify(content); + var enc_str = encodeURI(newstr); + var sql = "INSERT INTO PRE_LOAD_VNF_DATA " + + "(filename,preload_data) VALUES (" + + "'"+ filename + "'," + + "'" + enc_str + "')"; + + callback(null,sql); +} + +function formatNetworkInsertStatement(content,filename,req,res,callback) +{ + var newstr = JSON.stringify(content); + var enc_str = encodeURI(newstr); + var sql = "INSERT INTO PRE_LOAD_VNF_NETWORK_DATA " + + "(filename,preload_data) VALUES (" + + "'"+ filename + "'," + + "'" + enc_str + "')"; + + callback(null,sql); +} + + + +module.exports = router; diff --git a/admportal/server/router/routes/root.js b/admportal/server/router/routes/root.js new file mode 100644 index 00000000..f586892b --- /dev/null +++ b/admportal/server/router/routes/root.js @@ -0,0 +1,111 @@ +var express = require('express'); +var router = express.Router(); +var csp = require('./csp.js'); +var dbRoutes = require('./dbRoutes.js'); +var sla = require('./sla'); +var os = require('os'); +var async = require('async'); +var Odl = require('./Odl'); +var properties = require(process.env.SDNC_CONFIG_DIR + '/admportal.json'); + + + +router.use('/healthcheck', function(req,res){ + res.render('pages/healthcheck'); +}); +router.get('/test', function(req,res){ + +//console.log('port='+ req.socket.localPort); +//console.log('port='+ req.protocol); + + // pass host, username and password to ODL + var username = properties.odlUser; + var password = properties.odlPasswd; + var auth = 'Basic ' + new Buffer(username + ':' + password).toString('base64'); + + // target host for ODL request + var host = properties.odlHost; + var header = {'Host': host, 'Authorization': auth, 'Content-Type': 'application/yang.data+json'}; + var c_header = {'Host': properties.odlConexusHost, 'Authorization': auth, 'Content-Type': 'application/yang.data+json'}; + +// path = '/restconf/config/SLI-API:healthcheck', + var _options = { + method : 'POST', + host : host, + headers : header, + port : '8443', + path : '/restconf/operations/SLI-API:healthcheck', + rejectUnauthorized: false, + strictSSL : false + }; + var c_options = { + method : 'POST', + host : properties.odlConexusHost, + headers : c_header, + port : '8543', + path : '/restconf/operations/SLI-API:healthcheck', + rejectUnauthorized: false, + strictSSL : false + }; + + + var tasks = []; + //tasks.push( function(callback) { dbRoutes.testdb(req,res,callback); } ); + + tasks.push ( createFunctionObj(_options) ); + + tasks.push ( createFunctionObj(c_options) ); + + async.series(tasks, function(err,result){ + if(err) { + res.status(400).send(err); + return; + } + res.status(200).send(result); + return; + }); +}); + +function createFunctionObj( loptions ) { + return function(callback) { Odl.Healthcheck(loptions,callback); }; +} + +router.get('/mytree', function(req,res) { + res.render('pages/tree'); +}); +router.get('/setuplogin', function(req,res) { + res.render('pages/setuplogin'); +}); +router.post('/formSetupLogin', dbRoutes.checkDB, function(req,res) { + dbRoutes.saveSetupLogin(req,res); +}); +router.post('/formSignUp', dbRoutes.checkDB, function(req,res) { + dbRoutes.saveUser(req,res); +}); +router.post('/formlogin', csp.login, dbRoutes.checkDB, function(req,res) { +}); +router.get('/login', function(req,res) { + res.render('pages/login'); + // handle get +}); +router.get('/signup', function(req,res) { + res.render('pages/signup'); + // handle get +}); +router.get('/info', function(req,res) { + // handle get + res.send("login info"); +}); +router.get('/logout', csp.logout, function(req,res) { + // handle get +}); +router.get('/csplogout', function(req,res) { + // handle get + res.render("pages/csplogout", {result:{code:'success', msg:'You have been successfylly logged out.'},header:process.env.MAIN_MENU}); +}); +router.get('/getuser', function(req,res) { + // handle get + res.render("pages/home"); +}); + +module.exports = router; diff --git a/admportal/server/router/routes/sla.js b/admportal/server/router/routes/sla.js new file mode 100644 index 00000000..92fa846b --- /dev/null +++ b/admportal/server/router/routes/sla.js @@ -0,0 +1,369 @@ +var express = require('express'); +var router = express.Router(); +var exec = require('child_process').exec; +//var util = require('util'); +var fs = require('fs'); +var dbRoutes = require('./dbRoutes'); +var csp = require('./csp'); +var multer = require('multer'); +var bodyParser = require('body-parser'); +//var sax = require('sax'),strict=true,parser = sax.parser(strict); +var async = require('async'); + + +// SVC_LOGIC table columns +var _module=''; // cannot use module its a reserved word +var version=''; +var rpc=''; +var mode=''; +var xmlfile=''; + + +// used for file upload button, retain original file name +//router.use(bodyParser()); +router.use(bodyParser.urlencoded({ + extended: true +})); +//var upload = multer({ dest: process.cwd() + '/uploads/', rename: function(fieldname,filename){ return filename; } }); + +// multer 1.1 +var storage = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, process.cwd() + '/uploads/') + }, + filename: function (req, file, cb) { + cb(null, file.originalname ) + } +}); + +var upload = multer({ + storage: storage +}); + + +/* +router.use(multer({ + dest: process.cwd() + '/uploads/', + rename: function(fieldname,filename){ + return filename; + } +})); +*/ + + +//router.use(express.json()); +//router.use(express.urlencoded()); +//router.use(multer({ dest: './uploads/' })); + + +// GET +router.get('/listSLA', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.listSLA(req,res,{code:'', msg:''} ); +}); + +router.get('/activate', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var _module = req.query.module; + var rpc = req.query.rpc; + var version = req.query.version; + var mode = req.query.mode; + + var tasks = []; + tasks.push( function(callback) { dbRoutes.global_deactivate(req,res,_module,rpc,mode,callback); } ); + tasks.push( function(callback) { dbRoutes.activate(req,res,_module,rpc,version,mode,callback); } ); + async.series(tasks, function(err,result){ + + if ( err ) { + dbRoutes.listSLA(req,res,{code:'failure', msg:'Failed to activate, '+ String(err) }); + } + else { + dbRoutes.listSLA(req,res,{ code:'success', msg:'Successfully activated directed graph.'}); + } + }); +}); + +router.get('/deactivate', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var _module = req.query.module; + var rpc = req.query.rpc; + var version = req.query.version; + var mode = req.query.mode; + + var tasks = []; + tasks.push( function(callback) { dbRoutes.deactivate(req,res,_module,rpc,version,mode,callback); } ); + async.series(tasks, function(err,result){ + + if ( err ) { + dbRoutes.listSLA(req,res,{code:'failure', msg:'There was an error uploading the file. '+ err }); + } + else { + dbRoutes.listSLA(req,res,{ code:'success', msg:'Successfully deactivated directed graph.'}); + } + }); +}); + +router.get('/deleteDG', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + var _module = req.query.module; + var rpc = req.query.rpc; + var version = req.query.version; + var mode = req.query.mode; + + var tasks = []; + tasks.push( function(callback) { dbRoutes.deleteDG(req,res,_module,rpc,version,mode,callback); } ); + async.series(tasks, function(err,result){ + + if ( err ) { + dbRoutes.listSLA(req,res,{ code:'failure', msg:'There was an error uploading the file. '+ err }); + } + else { + dbRoutes.listSLA(req,res,{ code:'success', msg:'Successfully deleted directed graph.'}); + } + }); +}); + +router.post('/dgUpload', dbRoutes.checkDB, upload.single('filename'), function(req, res, next){ + + if(req.file.originalname){ + if (req.file.originalname == 0) { + + dbRoutes.listSLA(req,res,{ code:'danger', msg:'There was an error uploading the file, please try again.'}); + } + fs.exists(req.file.path, function(exists) { + if(exists) { + + // parse xml + try { + //dbRoutes.checkSvcLogic(req,res); + + var file_buf = fs.readFileSync(req.file.path, "utf8"); + + // call Dan's svclogic shell script from here + var currentDB = dbRoutes.getCurrentDB(); + var commandToExec = process.cwd() + + "/shell/svclogic.sh load " + + req.file.path + " " + + process.env.SDNC_CONFIG_DIR + "/svclogic.properties." + currentDB; + + console.log("commandToExec:" + commandToExec); + child = exec(commandToExec ,function (error,stdout,stderr){ + if(error){ + console.error("error:" + error); + //res.type('text/html').status(400).send( error); + //return; + } + if(stderr){ + res.status(400).send(stderr); + return; + } + if(stdout){ + res.status(200).send( new Buffer('Success')); + return; + } + + // remove the grave accents, the sax parser does not like them + //parser.write(file_buf.replace(/\`/g,'').toString('utf8')).close(); + //dbRoutes.addDG(_module,version,rpc,mode,file_buf,req,res); + //dbRoutes.listSLA(req,res, resultObj); + }); + } catch(ex) { + // keep 'em silent + console.error('sax error:'+ex); + res.status(400).send(ex); + return; + } + + } else { + res.status(400).send(new Buffer('Cannot find file.')); + return; + + } + }); + } + else { + res.status(400).send(new Buffer('file does not exist\n')); + } + return; +}); + + +// POST +router.post('/upload', csp.checkAuth, dbRoutes.checkDB, upload.single('filename'), function(req, res, next){ + +console.log('file:'+ JSON.stringify(req.file)); + + if(req.file.originalname){ + if (req.file.originalname.size == 0) { + dbRoutes.listSLA(req,res,{ code:'danger', msg:'There was an error uploading the file, please try again.'}); + } + fs.exists(req.file.path, function(exists) { + if(exists) { + + // parse xml + try { + //dbRoutes.checkSvcLogic(req,res); + + var currentDB = dbRoutes.getCurrentDB(); + var file_buf = fs.readFileSync(req.file.path, "utf8"); + + // call Dan's svclogic shell script from here + var commandToExec = process.cwd() + + "/shell/svclogic.sh load " + + req.file.path + " " + + process.env.SDNC_CONFIG_DIR + "/svclogic.properties." + currentDB; + + console.log("commandToExec:" + commandToExec); + child = exec(commandToExec ,function (error,stdout,stderr){ + if(error){ + console.error("error:" + error); + dbRoutes.listSLA(req,res,{code:'failure',msg:error} ); + return; + } + if(stderr){ + console.error("stderr:" + JSON.stringify(stderr,null,2)); + var s_stderr = JSON.stringify(stderr); + if ( s_stderr.indexOf("Saving") > -1 ) + { + dbRoutes.listSLA(req,res,{code:'success', msg:'File sucessfully uploaded.'}); + }else { + dbRoutes.listSLA(req,res,{code:'failure', msg:stderr}); + } + return; + } + if(stdout){ + console.log("stderr:" + stdout); + dbRoutes.listSLA(req,res,{code:'success', msg:'File sucessfully uploaded.'}); + return; + } + + // remove the grave accents, the sax parser does not like them + //parser.write(file_buf.replace(/\`/g,'').toString('utf8')).close(); + //dbRoutes.addDG(_module,version,rpc,mode,file_buf,req,res); + //dbRoutes.listSLA(req,res, resultObj); + }); + } catch(ex) { + // keep 'em silent + console.error("error:" + ex); + dbRoutes.listSLA(req,res,{code:'failure',msg:ex} ); + } + + } else { + dbRoutes.listSLA(req,res,{ code:'danger', msg:'There was an error uploading the file, please try again.'}); + } + }); + } + else { + dbRoutes.listSLA(req,res,{ code:'danger', msg:'There was an error uploading the file, please try again.'}); + } +}); + +router.get('/printAsXml', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + try { + //dbRoutes.checkSvcLogic(req,res); + + var _module = req.query.module; + var rpc = req.query.rpc; + var version = req.query.version; + var mode = req.query.mode; + var currentDB = dbRoutes.getCurrentDB(); + + // call Dan's svclogic shell script from here + var commandToExec = process.cwd() + + "/shell/svclogic.sh get-source " + + _module + " " + + rpc + " " + + mode + " " + + version + " " + + process.env.SDNC_CONFIG_DIR + "/svclogic.properties." + currentDB; + + console.log("commandToExec:" + commandToExec); + + child = exec(commandToExec , {maxBuffer: 1024*5000}, function (error,stdout,stderr){ + if(error){ + console.error("error:" + error); + dbRoutes.listSLA(req,res,{code:'failure',msg:error} ); + return; + } + //if(stderr){ + //logger.info("stderr:" + stderr); + //} + if(stdout){ + console.log("OUTPUT:" + stdout); + res.render('sla/printasxml', {result:{code:'success', + msg:'Module : ' + _module + '\n' + + 'RPC : ' + rpc + '\n' + + 'Mode : ' + mode + '\n' + + 'Version: ' + version + '\n\n' + stdout}, header:process.env.MAIN_MENU}); + } + + // remove the grave accents, the sax parser does not like them + //parser.write(file_buf.replace(/\`/g,'').toString('utf8')).close(); + //dbRoutes.addDG(_module,version,rpc,mode,file_buf,req,res); + //dbRoutes.listSLA(req,res, resultObj); + }); + } catch(ex) { + console.error("error:" + ex); + dbRoutes.listSLA(req,res,{code:'failure',msg:ex} ); + } +}); + + +router.get('/printAsGv', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + try { + //dbRoutes.checkSvcLogic(req,res); + + var _module = req.query.module; + var rpc = req.query.rpc; + var version = req.query.version; + var mode = req.query.mode; + var currentDB = dbRoutes.getCurrentDB(); +console.log('currentDB='+currentDB); + + // call Dan's svclogic shell script from here + var commandToExec = process.cwd() + + "/shell/svclogic.sh print " + + _module + " " + + rpc + " " + + mode + " " + + version + " " + + process.env.SDNC_CONFIG_DIR + "/svclogic.properties." + currentDB + + " | dot -Tpng"; + + console.log("commandToExec:" + commandToExec); + + child = exec(commandToExec , + {encoding:'base64',maxBuffer:5000*1024}, function (error,stdout,stderr){ + if(error){ + console.error("error:" + error); + dbRoutes.listSLA(req,res,{code:'failure',msg:error} ); + return; + } + if(stderr){ + console.error("stderr:" + stderr); + } + if(stdout){ + //logger.info("OUTPUT:" + stdout); + //res.render('sla/printasgv', result = {code:'success', + //msg:new Buffer(stdout,'base64')} ); + res.render('sla/printasgv', {result:{code:'success', + module: _module, + rpc: rpc, + version: version, + mode:mode, + msg:stdout}, header:process.env.MAIN_MENU}); + } + + // remove the grave accents, the sax parser does not like them + //parser.write(file_buf.replace(/\`/g,'').toString('utf8')).close(); + //dbRoutes.addDG(_module,version,rpc,mode,file_buf,req,res); + //dbRoutes.listSLA(req,res, resultObj); + }); + } catch(ex) { + console.error("error:" + ex); + dbRoutes.listSLA(req,res,{code:'failure',msg:ex} ); + } + +}); +module.exports = router; diff --git a/admportal/server/router/routes/user.js b/admportal/server/router/routes/user.js new file mode 100644 index 00000000..116bf932 --- /dev/null +++ b/admportal/server/router/routes/user.js @@ -0,0 +1,169 @@ +var express = require('express'); +var router = express.Router(); +var exec = require('child_process').exec; +var util = require('util'); +var fs = require('fs'); +var dbRoutes = require('./dbRoutes'); +var csp = require('./csp'); +var bodyParser = require('body-parser'); +var sax = require('sax'),strict=true,parser = sax.parser(strict); + +// SVC_LOGIC table columns +var _module=''; // cannot use module its a reserved word +var version=''; +var rpc=''; +var mode=''; +var xmlfile=''; + + +//router.use(bodyParser()); +router.use(bodyParser.urlencoded({ + extended: true +})); + + +// GET +router.get('/listUsers', csp.checkAuth, function(req,res) { + dbRoutes.listUsers(req,res, {user:req.session.loggedInAdmin,code:'', msg:''} ); +}); +router.get('/deleteUser', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.deleteUser(req,res, {code:'', msg:''} ); +}); + +//router.get('/activate', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + //var _module = req.query.module; + //var rpc = req.query.rpc; + //var version = req.query.version; + //var mode = req.query.mode; + + //dbRoutes.activate(req,res,_module,rpc,version,mode); +//}); + +//router.get('/deactivate', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + //var _module = req.query.module; + //var rpc = req.query.rpc; + //var version = req.query.version; + //var mode = req.query.mode; +// + //dbRoutes.deactivate(req,res,_module,rpc,version,mode); +//}); + +//router.get('/deleteDG', csp.checkAuth, dbRoutes.checkDB, function(req,res){ + + //var _module = req.query.module; + //var rpc = req.query.rpc; + //var version = req.query.version; + //var mode = req.query.mode; + + //dbRoutes.deleteDG(req,res,_module,rpc,version,mode); +//}); +/* +// SAX +parser.onerror = function (e) { + logger.debug('onerror'); + // an error happened. +}; +parser.ontext = function (t) { + // got some text. t is the string of text. + logger.debug('ontext:'+t); +}; +parser.onopentag = function (node) { + // opened a tag. node has "name" and "attributes" + if ( node.name == 'service-logic' ) + { + _module = node.attributes.module; + version = node.attributes.version; + } + if ( node.name == 'method' ) + { + rpc = node.attributes.rpc; + mode = node.attributes.mode; + } +}; +parser.onattribute = function (attr) { + // an attribute. attr has "name" and "value" + logger.debug('onattribute:'+attr); +}; +parser.onend = function () { + // parser stream is done, and ready to have more stuff written to it. + logger.debug('onend:'); +}; +*/ + + +// POST +router.post('/updateUser', csp.checkAuth, dbRoutes.checkDB, function(req,res,next){ + dbRoutes.updateUser(req,res,{code:'',msg:''}); +}); +router.post('/addUser', csp.checkAuth, dbRoutes.checkDB, function(req,res) { + dbRoutes.addUser(req,res, {code:'', msg:''} ); +}); + +//router.post('/upload', csp.checkAuth, dbRoutes.checkDB, function(req, res, next){ + +/* +logger.debug("upload"); + if(req.files.filename){ + if (req.files.filename.size == 0) { + resultObj = + {code:'danger', msg:'There was an error uploading the file, please try again.'}; + dbRoutes.listSLA(req,res, resultObj); + } + fs.exists(req.files.filename.path, function(exists) { + if(exists) { + resultObj = {code:'success', msg:'File sucessfully uploaded.'}; + + // parse xml + try { + var file_buf = fs.readFileSync(req.files.filename.path, "utf8"); +logger.debug('file '+req.files.filename); + + + // call Dan's svclogic shell script from here + var commandToExec = process.cwd() + + "/shell/svclogic.sh load " + + req.files.filename.path + " " + + process.cwd() + + "/config/svclogic.properties"; + + logger.debug("commandToExec:" + commandToExec); + child = exec(commandToExec ,function (error,stdout,stderr){ + if(error){ + logger.info("error:" + error); + } + if(stderr){ + logger.info("stderr:" + stderr); + } + if(stdout){ + logger.info("OUTPUT:" + stdout); + dbRoutes.listSLA(req,res, resultObj); + } + + // remove the grave accents, the sax parser does not like them + //parser.write(file_buf.replace(/\`/g,'').toString('utf8')).close(); + //dbRoutes.addDG(_module,version,rpc,mode,file_buf,req,res); + //dbRoutes.listSLA(req,res, resultObj); + }); + } catch(ex) { + // keep 'em silent + logger.debug('sax error:'+ex); + } + + } else { + resultObj = + {code:'danger', msg:'There was an error uploading the file, please try again.'}; + dbRoutes.listSLA(req,res, resultObj); + } + }); + } + else { + resultObj = + {code:'danger', msg:'There was an error uploading the file, please try again.'}; + dbRoutes.listSLA(req,res, resultObj); + } +}); +*/ + +module.exports = router; diff --git a/admportal/server/router/routes/vnf.js b/admportal/server/router/routes/vnf.js new file mode 100644 index 00000000..be004fe2 --- /dev/null +++ b/admportal/server/router/routes/vnf.js @@ -0,0 +1,603 @@ +
+// Helper functions for processing a VNF worksheet
+
+var helpers = require('./helpers.js');
+var _ = require('lodash');
+var csvtojson = require('csvtojson');
+var async = require('async');
+var uuid = require('node-uuid'); // generate a uuid with "uuid.v1()"
+var path = require('path');
+var fs = require("fs");
+var moment = require("moment");
+
+var vnf = module.exports;
+var getParam = helpers.getParam;
+
+var callback;
+var indir;
+var csvGeneral, csvZones, csvNetworks, csvVMs, csvVMnetworks, csvVMnetworkIPs, csvVMnetworkMACs, csvTagValues;
+var rawJson={}
+var finalJson={};
+var platform;
+var req, res;
+var preloadVersion; // 1607, 1610, etc...
+
+puts = helpers.puts;
+putd = helpers.putd;
+
+vnf.go = function(lreq,lres,cb,dir){
+ puts("Processing VNF workbook");
+ req = lreq;
+ res = lres;
+ callback = cb;
+ if (dir!="") {
+ platform="pc";
+ indir=dir;
+ } else {
+ platform="portal";
+ indir=process.cwd() + "/uploads/";
+ }
+ doGeneral();
+}
+
+
+// READ WORKSHEET: GENERAL
+
+function doGeneral() {
+ puts("Reading General worksheet");
+ var csvFilename="General.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotGeneral);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotGeneral(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('General.csv file is missing from upload.');
+ return;
+ }
+ csvGeneral = jsonObj;
+ puts("\nRead this: ");
+ putd(csvGeneral);
+ puts("\n");
+ doAvailZones();
+}
+
+// READ WORKSHEET: AVAILABILITY ZONES
+
+function doAvailZones() {
+ puts("Reading Availability-zones worksheet");
+ var csvFilename="Availability-zones.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotAvailZones);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotAvailZones(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('Availability-zones.csv file is missing from upload.');
+ return;
+ }
+ csvZones = jsonObj;
+ csvZones = _.reject(csvZones, 'field2', 'Availability Zones');
+ csvZones = _.reject(csvZones, 'field2', 'List the availability zones for this VNF');
+ csvZones = _.reject(csvZones, 'field2', '');
+ puts("\nRead this: ");
+ putd(csvZones);
+ puts("\n");
+ doNetworks();
+}
+
+// READ WORKSHEET: NETWORKS
+
+function doNetworks() {
+ puts("Reading Networks worksheet");
+ var csvFilename="Networks.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotNetworks);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotNetworks(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('Networks.csv file is missing from upload.');
+ return;
+ }
+ csvNetworks = jsonObj;
+ csvNetworks = _.reject(csvNetworks, 'field2', 'Networks');
+ csvNetworks = _.reject(csvNetworks, 'field2', 'List the VNF networks. (VM-networks are on a different worksheet.)');
+ csvNetworks = _.reject(csvNetworks, 'field2', 'network-role');
+ csvNetworks = _.reject(csvNetworks, 'field2', '');
+ puts("\nRead this: ");
+ putd(csvNetworks);
+ puts("\n");
+ doVMs();
+}
+
+// READ WORKSHEET: VMs
+
+function doVMs() {
+ puts("Reading VMs worksheet");
+ var csvFilename="VMs.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotVMs);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotVMs(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('VMs.csv file is missing from upload.');
+ return;
+ }
+ csvVMs = jsonObj;
+ csvVMs = _.reject(csvVMs, 'field2', 'VMs');
+ csvVMs = _.reject(csvVMs, 'field2', 'List the VM types for this VNF');
+ csvVMs = _.reject(csvVMs, 'field2', 'vm-type');
+ csvVMs = _.reject(csvVMs, 'field2', '');
+ puts("\nRead this: ");
+ putd(csvVMs);
+ puts("\n");
+ doVMnetworks();
+}
+
+// READ WORKSHEET: VM-NETWORKS
+
+function doVMnetworks() {
+ puts("Reading VM-networks worksheet");
+ var csvFilename="VM-networks.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotVMnetworks);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotVMnetworks(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('VM-networks.csv file is missing from upload.');
+ return;
+ }
+ csvVMnetworks = jsonObj;
+ csvVMnetworks = _.reject(csvVMnetworks, 'field2', 'VM-networks');
+ csvVMnetworks = _.reject(csvVMnetworks, 'field2', 'List the VM-networks for each VM type');
+ csvVMnetworks = _.reject(csvVMnetworks, 'field2', 'vm-type');
+ csvVMnetworks = _.reject(csvVMnetworks, 'field2', '');
+ puts("\nRead this: ");
+ putd(csvVMnetworks);
+ puts("\n");
+ doVMnetworkIPs();
+}
+
+// READ WORKSHEET: VM-NETWORK-IPS
+
+function doVMnetworkIPs() {
+ puts("Reading VM-network-IPs worksheet");
+ var csvFilename="VM-network-IPs.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotVMnetworkIPs);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotVMnetworkIPs(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('VM-network-IPs.csv file is missing from upload.');
+ return;
+ }
+ csvVMnetworkIPs = jsonObj;
+ csvVMnetworkIPs = _.reject(csvVMnetworkIPs, 'field2', 'VM-network-IPs');
+ csvVMnetworkIPs = _.reject(csvVMnetworkIPs, 'field2', 'List the IPs assigned to each VM-network');
+ csvVMnetworkIPs = _.reject(csvVMnetworkIPs, 'field2', 'vm-type');
+ csvVMnetworkIPs = _.reject(csvVMnetworkIPs, 'field2', '');
+ puts("\nRead this: ");
+ putd(csvVMnetworkIPs);
+ puts("\n");
+ doVMnetworkMACs();
+}
+
+// READ WORKSHEET: VM-NETWORK-MACS
+
+function doVMnetworkMACs() {
+ puts("Reading VM-network-MACs worksheet");
+ var csvFilename="VM-network-MACs.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotVMnetworkMACs);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotVMnetworkMACs(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('VM-network-MACs.csv file is missing from upload.');
+ return;
+ }
+ csvVMnetworkMACs = jsonObj;
+ csvVMnetworkMACs = _.reject(csvVMnetworkMACs, 'field2', 'VM-network-MACs');
+ csvVMnetworkMACs = _.reject(csvVMnetworkMACs, 'field2', 'List the MACs assigned to each VM-network');
+ csvVMnetworkMACs = _.reject(csvVMnetworkMACs, 'field2', 'vm-type');
+ csvVMnetworkMACs = _.reject(csvVMnetworkMACs, 'field2', '');
+ puts("\nRead this: ");
+ putd(csvVMnetworkMACs);
+ puts("\n");
+ doTagValues();
+}
+
+// READ WORKSHEET: TAG-VALUES
+
+function doTagValues() {
+ puts("Reading Tag-values worksheet");
+ var csvFilename="Tag-values.csv";
+ var newFileName = helpers.getFileName(req, csvFilename);
+ if ( newFileName != null ) {
+ helpers.readCsv(indir, newFileName, gotTagValues);
+ }
+ else {
+ callback(csvFilename + ' file is missing from upload.');
+ }
+}
+
+function gotTagValues(err, jsonObj) {
+ if (err) {
+ puts("\nError!");
+ putd(err);
+ callback('Tag-values.csv file is missing from upload.');
+ return;
+ }
+ csvTagValues = jsonObj;
+ csvTagValues = _.reject(csvTagValues, 'field2', 'Tag-values');
+ csvTagValues = _.reject(csvTagValues, 'field2', 'Extra data to be passed into the HEAT template for this VNF');
+ csvTagValues = _.reject(csvTagValues, 'field2', 'vnf-parameter-name');
+ csvTagValues = _.reject(csvTagValues, 'field2', 'vnf-parameter-value');
+ csvTagValues = _.reject(csvTagValues, 'field2', '');
+ puts("\nRead this: ");
+ putd(csvTagValues);
+ puts("\n");
+ doneReadingFiles();
+}
+
+
+
+
+function doneReadingFiles() {
+ puts("\n");
+ puts("DONE READING FILES!");
+ puts("\n");
+ processJson();
+}
+
+
+// PROCESS THE CSV FILES INTO OBJECTS TO BE ASSEMBLED INTO FINAL OUTPUT
+function processJson() {
+ processGeneral();
+ processAvailZones();
+ processNetworks();
+ processVMnetworks();
+ processVMnetips();
+ processVMnetmacs();
+ processVMs();
+ processTagValues();
+ assembleJson();
+}
+
+// ASSEMBLE AND OUTPUT RESULTS
+
+function assembleJson() {
+ puts("\n");
+ puts("Using raw JSON and assembling final ouptut JSON.");
+ puts("\n");
+
+ vnfTopoID = { "service-type": "SDN-MOBILITY",
+ "vnf-name": rawJson['vf-module-name'],
+ "vnf-type": rawJson['vf-module-model-name'],
+ "generic-vnf-name": rawJson['generic-vnf-name'],
+ "generic-vnf-type": rawJson['generic-vnf-type'] };
+
+ vnfZones = rawJson['availability-zones'];
+
+ vnfNetworks = rawJson['networks'];
+
+ vnfVMs = rawJson['vms'];
+
+ vnfParams = rawJson['tag-values'];
+
+ vnfAssignments = { "availability-zones": vnfZones,
+ "vnf-networks": vnfNetworks,
+ "vnf-vms": vnfVMs};
+
+ vnfTopo = { "vnf-topology-identifier": vnfTopoID,
+ "vnf-assignments": vnfAssignments,
+ "vnf-parameters": vnfParams };
+
+ vnfInput = {'vnf-topology-information': vnfTopo};
+
+ finalJson = {"input": vnfInput};
+
+ outputJson();
+}
+
+function outputJson() {
+ puts("\n");
+ puts("\n");
+ puts(JSON.stringify(finalJson,null,2));
+ puts("\n");
+ puts("\n");
+ var unixTime, fullpath_filename, filename;
+ unixTime = moment().unix();
+ if (platform=='portal') {
+ fullpath_filename = process.cwd() + "/uploads/" + unixTime + ".vnf_worksheet.json";
+ filename = unixTime + ".vnf_worksheet.json.";
+ } else {
+ fullpath_filename = "./output.json."+unixTime;
+ filename = "output.json." + unixTime;
+ }
+ helpers.writeOutput(req, fullpath_filename, JSON.stringify(finalJson,null,2), callback);
+ callback(null, finalJson, filename);
+}
+
+
+// Gather functions that actually process data after it is all read
+
+function processGeneral() {
+
+ preloadVersion = getParam(csvGeneral, 'field2', 'preload-version', 'field3');
+ rawJson['preload-version'] = preloadVersion;
+ puts("Preload version: " + preloadVersion);
+
+ if ( (preloadVersion!='1607') && (preloadVersion!='1610') ) {
+ puts("\nError - incorrect version of preload worksheet.");
+ callback('Error - incorrect version of preload worksheet.');
+ }
+
+ rawJson['vf-module-name'] = getParam(csvGeneral, 'field2', 'vf-module-name', 'field3');
+ // rawJson['vf-module-type'] = getParam(csvGeneral, 'field2', 'vf-module-type', 'field3');
+ try {
+ rawJson['vf-module-model-name'] = getParam(csvGeneral, 'field2', 'vf-module-model-name', 'field3');
+ } catch (e) {
+ puts("\n\n");
+ puts("ERROR ERROR ERROR ERROR ERROR\n");
+ puts("Failed to find data field 'vf-module-model-name'. Maybe this preload worksheet is older?")
+ puts("If on the 'general' tab there is a field called 'vf-module-type' please rename it to 'vf-module-model-name'");
+ puts("\n\n");
+ process.exit();
+ }
+ rawJson['generic-vnf-name'] = getParam(csvGeneral, 'field2', 'vnf-name', 'field3');
+ rawJson['generic-vnf-type'] = getParam(csvGeneral, 'field2', 'vnf-type', 'field3');
+ rawJson['request-id'] = uuid.v1();
+ rawJson['source'] = "ADMINPORTAL";
+ rawJson['request-action'] = "PreloadVNFRequest";
+ rawJson['svc-request-id'] = uuid.v1();
+ rawJson['svc-action'] = "reserve";
+ puts('rawJson:');
+ putd(rawJson);
+ puts("\n");
+}
+
+function processAvailZones() {
+ var newZones = _.map(csvZones, function(x) { return {'availability-zone': x['field2']}; } );
+ rawJson['availability-zones'] = newZones;
+ puts("Availability zones read:");
+ putd(rawJson['availability-zones']);
+ puts("\n");
+}
+
+function processNetworks() {
+ var newNetworks = [];
+ csvNetworks.forEach( function(network) {
+ var netJson = {};
+ netJson["network-role"] = network.field2;
+ netJson["network-name"] = network.field3;
+ netJson["network-id"] = network.field4;
+ netJson["contrail-network-fqdn"] = network.field5;
+ netJson["subnet-name"] = network.field6;
+ netJson["subnet-id"] = network.field7;
+ netJson["ipv6-subnet-name"] = network.field8;
+ netJson["ipv6-subnet-id"] = network.field9;
+ newNetworks.push(netJson);
+ }
+ );
+ puts("networks:");
+ putd(newNetworks);
+ rawJson["networks"] = newNetworks;
+}
+
+function processVMs() {
+ var newVMs = [];
+ csvVMs.forEach( function(vm) {
+ var vmJson = {};
+ vmJson["vm-type"] = vm.field2;
+ vmJson["vm-name"] = vm.field3;
+ newVMs.push(vmJson);
+ }
+ );
+
+ puts("VMs:");
+ putd(newVMs);
+
+ // OK, now for each type, get count and then build vm-names array of the names
+ var vnfvms=[]
+ vmTypes = _.uniq(_.pluck(newVMs,'vm-type'));
+ vmTypes.forEach( function(vmType) {
+ puts(vmType);
+ var vmJson={};
+ var vmThisType;
+ var vmCount;
+ var vmNames=[];
+ var tmpNames;
+ vmThisType=_.select(newVMs, 'vm-type', vmType);
+ vmCount=vmThisType.length;
+ vmJson["vm-type"] = vmType;
+ vmJson["vm-count"] = vmCount;
+ tmpNames = _.pluck(vmThisType,'vm-name');
+ vmJson["vm-names"] = _.map(tmpNames, function(nam) { return {"vm-name": nam}; } );
+ netroles = _.select( rawJson["vm-networks"], "vm-type", vmType );
+ newnetroles=[]
+ netroles.forEach( function(netrole) {
+ tmpNetDetails = {};
+ tmpNetDetails["network-role"] = netrole["network-role"];
+ tmpNetDetails["use-dhcp"] = netrole["use-dhcp"];
+
+ var tmpipsThisVmType=[];
+ tmpipsThisVmType = _.select( rawJson["vm-net-ips"], "vm-type", vmType);
+ var tmpips=[];
+ tmpips = _.select( tmpipsThisVmType, "network-role", netrole["network-role"]);
+ tmpipsJson = _.map(tmpips, function(ip) { return {"ip-address": ip["ip-address"]} } );
+ tmpipsJson = _.reject(tmpipsJson, function(o) { return (o["ip-address"]==undefined); } );
+ tmpNetDetails["network-ips"] = tmpipsJson;
+
+ var tmpipsv6ThisVmType=[];
+ tmpipsv6ThisVmType = _.select( rawJson["vm-net-ips"], "vm-type", vmType);
+ var tmpipsv6=[];
+ tmpipsv6 = _.select( tmpipsv6ThisVmType, "network-role", netrole["network-role"]);
+ tmpipsv6Json = _.map(tmpipsv6, function(ip) { return {"ip-address-ipv6": ip["ipv6-address"]} } );
+ tmpipsv6Json = _.reject(tmpipsv6Json, function(o) { return (o["ip-address-ipv6"]==undefined); } );
+ tmpNetDetails["network-ips-v6"] = tmpipsv6Json;
+
+ var tmpirpThisVmType=[];
+ tmpirpThisVmType = _.select( rawJson["vm-net-ips"], "vm-type", vmType);
+ var tmpirp=[];
+ tmpirp = _.select( tmpirpThisVmType, "network-role", netrole["network-role"]);
+ tmpirpJson = _.map(tmpirp, function(irp) { return {"interface-route-prefix-cidr": irp["interface-route-prefix"]} } );
+ tmpirpJson = _.reject(tmpirpJson, function(o) { return (o["interface-route-prefix-cidr"]==undefined); } );
+ tmpNetDetails["interface-route-prefixes"] = tmpirpJson;
+
+ var tmpmacsThisVmType=[];
+ tmpmacsThisVmType = _.select( rawJson["vm-net-macs"], "vm-type", vmType);
+ var tmpmacs=[];
+ tmpmacs = _.select( tmpmacsThisVmType, "network-role", netrole["network-role"]);
+ tmpmacsJson = _.map(tmpmacs, function(mac) { return {"mac-address": mac["mac-address"]} } );
+ tmpNetDetails["network-macs"] = tmpmacsJson;
+
+ var fip='';
+ fip = netrole["floating-ip"];
+ fip = _.trim(fip);
+ if (fip != '') {
+ tmpNetDetails["floating-ip"] = netrole["floating-ip"];
+ }
+
+ var fipv6='';
+ fipv6 = netrole["floating-ip-v6"];
+ fipv6 = _.trim(fipv6);
+ if (fipv6 != '') {
+ tmpNetDetails["floating-ip-v6"] = netrole["floating-ip-v6"];
+ }
+
+ newnetroles.push(tmpNetDetails);
+ }
+ );
+ vmJson["vm-networks"] = newnetroles;
+ putd(vmJson);
+ vnfvms.push(vmJson);
+ }
+ );
+ rawJson["vms"] = vnfvms;
+}
+
+function processVMnetworks() {
+ // For each VM type, for each Network role, get details like use-dhcp
+ var newVMnetworks = [];
+ csvVMnetworks.forEach( function(vm) {
+ var newvmJson = {};
+ newvmJson["vm-type"] = vm.field2;
+ newvmJson["network-role"] = vm.field3;
+ newvmJson["use-dhcp"] = vm.field4;
+ newvmJson["floating-ip"] = vm.field5;
+ newvmJson["floating-ip-v6"] = vm.field6;
+ newVMnetworks.push(newvmJson);
+ }
+ );
+ rawJson["vm-networks"] = newVMnetworks;
+ puts("rawJson for vm-networks...");
+ putd( rawJson["vm-networks"] );
+}
+
+
+function processVMnetips() {
+ // For each VM type, for each network role, get the set of network IPs
+ puts("Processing VM-net-ips");
+ var newVMnetips = [];
+ csvVMnetworkIPs.forEach( function(vm) {
+ var newvmnetipsJson = {};
+ newvmnetipsJson["vm-type"] = vm.field2;
+ newvmnetipsJson["network-role"] = vm.field3;
+ if (_.trim(vm.field4)!="") {
+ newvmnetipsJson["ip-address"] = vm.field4;
+ }
+ if (_.trim(vm.field5)!="") {
+ newvmnetipsJson["ipv6-address"] = vm.field5;
+ }
+ if (_.trim(vm.field6)!="") {
+ newvmnetipsJson["interface-route-prefix"] = vm.field6;
+ }
+ newVMnetips.push(newvmnetipsJson);
+ }
+ );
+ rawJson["vm-net-ips"] = newVMnetips;
+ puts("rawJson for vm-net-ips");
+ putd(rawJson["vm-net-ips"]);
+}
+
+function processVMnetmacs() {
+ // For each VM type, for each network role, get the set of MACs
+ puts("Processing VM-net-macs");
+ var newVMnetmacs = [];
+ csvVMnetworkMACs.forEach( function(vm) {
+ var newvmnetmacsJson = {};
+ newvmnetmacsJson["vm-type"] = vm.field2;
+ newvmnetmacsJson["network-role"] = vm.field3;
+ newvmnetmacsJson["mac-address"] = vm.field4;
+ newVMnetmacs.push(newvmnetmacsJson);
+ }
+ );
+ rawJson["vm-net-macs"] = newVMnetmacs;
+ puts("rawJson for vm-net-macs");
+ putd(rawJson["vm-net-macs"]);
+}
+
+function processTagValues() {
+ var newTagValues = _.map(csvTagValues, function(x) { return {'vnf-parameter-name': x['field2'],
+ 'vnf-parameter-value': x['field3']}; } );
+ rawJson['tag-values'] = newTagValues;
+ puts("Tag-values read:");
+ putd(rawJson['tag-values']);
+ puts("\n");
+}
+
+
|