Initial commit for OpenECOMP SDN-C OA&M
[sdnc/oam.git] / admportal / server / router / routes / dbRoutes.js
diff --git a/admportal/server/router/routes/dbRoutes.js b/admportal/server/router/routes/dbRoutes.js
new file mode 100644 (file)
index 0000000..d2f40b5
--- /dev/null
@@ -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;
+}
+