Initial commit for OpenECOMP SDN-C OA&M
[sdnc/oam.git] / admportal / server / router / routes / vnf.js
diff --git a/admportal/server/router/routes/vnf.js b/admportal/server/router/routes/vnf.js
new file mode 100644 (file)
index 0000000..be004fe
--- /dev/null
@@ -0,0 +1,603 @@
+\r
+// Helper functions for processing a VNF worksheet\r
+\r
+var helpers = require('./helpers.js');\r
+var _ = require('lodash');\r
+var csvtojson = require('csvtojson');\r
+var async = require('async');\r
+var uuid = require('node-uuid');   // generate a uuid with "uuid.v1()"\r
+var path = require('path');\r
+var fs = require("fs");\r
+var moment = require("moment");\r
+\r
+var vnf = module.exports;\r
+var getParam = helpers.getParam;\r
+\r
+var callback;\r
+var indir;\r
+var csvGeneral, csvZones, csvNetworks, csvVMs, csvVMnetworks, csvVMnetworkIPs, csvVMnetworkMACs, csvTagValues;\r
+var rawJson={}\r
+var finalJson={};  \r
+var platform;\r
+var req, res;\r
+var preloadVersion;  // 1607, 1610, etc...\r
+\r
+puts = helpers.puts;\r
+putd = helpers.putd;\r
+\r
+vnf.go = function(lreq,lres,cb,dir){\r
+  puts("Processing VNF workbook");\r
+  req = lreq;\r
+  res = lres;\r
+  callback = cb;\r
+  if (dir!="") {\r
+    platform="pc";\r
+    indir=dir;\r
+  } else {\r
+    platform="portal";\r
+    indir=process.cwd() + "/uploads/";\r
+  }\r
+  doGeneral();\r
+}\r
+\r
+\r
+// READ WORKSHEET: GENERAL\r
+\r
+function doGeneral() {\r
+  puts("Reading General worksheet");\r
+  var csvFilename="General.csv";\r
+  var newFileName = helpers.getFileName(req, csvFilename);\r
+  if ( newFileName != null ) {\r
+    helpers.readCsv(indir, newFileName, gotGeneral);\r
+  }\r
+  else {\r
+    callback(csvFilename + ' file is missing from upload.');\r
+  }\r
+}\r
+\r
+function gotGeneral(err, jsonObj) {\r
+  if (err) {\r
+    puts("\nError!");\r
+    putd(err);\r
+    callback('General.csv file is missing from upload.');\r
+    return;\r
+  }\r
+  csvGeneral = jsonObj;\r
+  puts("\nRead this: ");\r
+  putd(csvGeneral);\r
+  puts("\n");\r
+  doAvailZones();\r
+}\r
+\r
+// READ WORKSHEET: AVAILABILITY ZONES\r
+\r
+function doAvailZones() {\r
+  puts("Reading Availability-zones worksheet");\r
+  var csvFilename="Availability-zones.csv";\r
+  var newFileName = helpers.getFileName(req, csvFilename);\r
+  if ( newFileName != null ) {\r
+    helpers.readCsv(indir, newFileName, gotAvailZones);\r
+  }\r
+  else {\r
+    callback(csvFilename + ' file is missing from upload.');\r
+  }\r
+}\r
+\r
+function gotAvailZones(err, jsonObj) {\r
+  if (err) {\r
+    puts("\nError!");\r
+    putd(err);\r
+    callback('Availability-zones.csv file is missing from upload.');\r
+    return;\r
+  }\r
+  csvZones = jsonObj;\r
+  csvZones = _.reject(csvZones, 'field2', 'Availability Zones');\r
+  csvZones = _.reject(csvZones, 'field2', 'List the availability zones for this VNF');\r
+  csvZones = _.reject(csvZones, 'field2', '');\r
+  puts("\nRead this: ");\r
+  putd(csvZones);\r
+  puts("\n");\r
+  doNetworks();\r
+}\r
+\r
+// READ WORKSHEET: NETWORKS\r
+\r
+function doNetworks() {\r
+  puts("Reading Networks worksheet");\r
+  var csvFilename="Networks.csv";\r
+  var newFileName = helpers.getFileName(req, csvFilename);\r
+  if ( newFileName != null ) {\r
+    helpers.readCsv(indir, newFileName, gotNetworks);\r
+  }\r
+  else {\r
+    callback(csvFilename + ' file is missing from upload.');\r
+  }\r
+}\r
+\r
+function gotNetworks(err, jsonObj) {\r
+  if (err) {\r
+    puts("\nError!");\r
+    putd(err);\r
+    callback('Networks.csv file is missing from upload.');\r
+    return;\r
+  }\r
+  csvNetworks = jsonObj;\r
+  csvNetworks = _.reject(csvNetworks, 'field2', 'Networks');\r
+  csvNetworks = _.reject(csvNetworks, 'field2', 'List the VNF networks. (VM-networks are on a different worksheet.)');\r
+  csvNetworks = _.reject(csvNetworks, 'field2', 'network-role');\r
+  csvNetworks = _.reject(csvNetworks, 'field2', '');\r
+  puts("\nRead this: ");\r
+  putd(csvNetworks);\r
+  puts("\n");\r
+  doVMs();\r
+}\r
+\r
+// READ WORKSHEET: VMs\r
+\r
+function doVMs() {\r
+  puts("Reading VMs worksheet");\r
+  var csvFilename="VMs.csv";\r
+  var newFileName = helpers.getFileName(req, csvFilename);\r
+  if ( newFileName != null ) {\r
+    helpers.readCsv(indir, newFileName, gotVMs);\r
+  }\r
+  else {\r
+    callback(csvFilename + ' file is missing from upload.');\r
+  }\r
+}\r
+\r
+function gotVMs(err, jsonObj) {\r
+  if (err) {\r
+    puts("\nError!");\r
+    putd(err);\r
+    callback('VMs.csv file is missing from upload.');\r
+    return;\r
+  }\r
+  csvVMs = jsonObj;\r
+  csvVMs = _.reject(csvVMs, 'field2', 'VMs');\r
+  csvVMs = _.reject(csvVMs, 'field2', 'List the VM types for this VNF');\r
+  csvVMs = _.reject(csvVMs, 'field2', 'vm-type');\r
+  csvVMs = _.reject(csvVMs, 'field2', '');\r
+  puts("\nRead this: ");\r
+  putd(csvVMs);\r
+  puts("\n");\r
+  doVMnetworks();\r
+}\r
+\r
+// READ WORKSHEET: VM-NETWORKS\r
+\r
+function doVMnetworks() {\r
+  puts("Reading VM-networks worksheet");\r
+  var csvFilename="VM-networks.csv";\r
+  var newFileName = helpers.getFileName(req, csvFilename);\r
+  if ( newFileName != null ) {\r
+    helpers.readCsv(indir, newFileName, gotVMnetworks);\r
+  }\r
+  else {\r
+    callback(csvFilename + ' file is missing from upload.');\r
+  }\r
+}\r
+\r
+function gotVMnetworks(err, jsonObj) {\r
+  if (err) {\r
+    puts("\nError!");\r
+    putd(err);\r
+    callback('VM-networks.csv file is missing from upload.');\r
+    return;\r
+  }\r
+  csvVMnetworks = jsonObj;\r
+  csvVMnetworks = _.reject(csvVMnetworks, 'field2', 'VM-networks');\r
+  csvVMnetworks = _.reject(csvVMnetworks, 'field2', 'List the VM-networks for each VM type');\r
+  csvVMnetworks = _.reject(csvVMnetworks, 'field2', 'vm-type');\r
+  csvVMnetworks = _.reject(csvVMnetworks, 'field2', '');\r
+  puts("\nRead this: ");\r
+  putd(csvVMnetworks);\r
+  puts("\n");\r
+  doVMnetworkIPs();\r
+}\r
+\r
+// READ WORKSHEET: VM-NETWORK-IPS\r
+\r
+function doVMnetworkIPs() {\r
+  puts("Reading VM-network-IPs worksheet");\r
+  var csvFilename="VM-network-IPs.csv";\r
+  var newFileName = helpers.getFileName(req, csvFilename);\r
+  if ( newFileName != null ) {\r
+    helpers.readCsv(indir, newFileName, gotVMnetworkIPs);\r
+  }\r
+  else {\r
+    callback(csvFilename + ' file is missing from upload.');\r
+  }\r
+}\r
+\r
+function gotVMnetworkIPs(err, jsonObj) {\r
+  if (err) {\r
+    puts("\nError!");\r
+    putd(err);\r
+    callback('VM-network-IPs.csv file is missing from upload.');\r
+    return;\r
+  }\r
+  csvVMnetworkIPs = jsonObj;\r
+  csvVMnetworkIPs = _.reject(csvVMnetworkIPs, 'field2', 'VM-network-IPs');\r
+  csvVMnetworkIPs = _.reject(csvVMnetworkIPs, 'field2', 'List the IPs assigned to each VM-network');\r
+  csvVMnetworkIPs = _.reject(csvVMnetworkIPs, 'field2', 'vm-type');\r
+  csvVMnetworkIPs = _.reject(csvVMnetworkIPs, 'field2', '');\r
+  puts("\nRead this: ");\r
+  putd(csvVMnetworkIPs);\r
+  puts("\n");\r
+  doVMnetworkMACs();\r
+}\r
+\r
+// READ WORKSHEET: VM-NETWORK-MACS\r
+\r
+function doVMnetworkMACs() {\r
+  puts("Reading VM-network-MACs worksheet");\r
+  var csvFilename="VM-network-MACs.csv";\r
+  var newFileName = helpers.getFileName(req, csvFilename);\r
+  if ( newFileName != null ) {\r
+    helpers.readCsv(indir, newFileName, gotVMnetworkMACs);\r
+  }\r
+  else {\r
+    callback(csvFilename + ' file is missing from upload.');\r
+  }\r
+}\r
+\r
+function gotVMnetworkMACs(err, jsonObj) {\r
+  if (err) {\r
+    puts("\nError!");\r
+    putd(err);\r
+    callback('VM-network-MACs.csv file is missing from upload.');\r
+    return;\r
+  }\r
+  csvVMnetworkMACs = jsonObj;\r
+  csvVMnetworkMACs = _.reject(csvVMnetworkMACs, 'field2', 'VM-network-MACs');\r
+  csvVMnetworkMACs = _.reject(csvVMnetworkMACs, 'field2', 'List the MACs assigned to each VM-network');\r
+  csvVMnetworkMACs = _.reject(csvVMnetworkMACs, 'field2', 'vm-type');\r
+  csvVMnetworkMACs = _.reject(csvVMnetworkMACs, 'field2', '');\r
+  puts("\nRead this: ");\r
+  putd(csvVMnetworkMACs);\r
+  puts("\n");\r
+  doTagValues();\r
+}\r
+\r
+// READ WORKSHEET: TAG-VALUES\r
+\r
+function doTagValues() {\r
+  puts("Reading Tag-values worksheet");\r
+  var csvFilename="Tag-values.csv";\r
+  var newFileName = helpers.getFileName(req, csvFilename);\r
+  if ( newFileName != null ) {\r
+    helpers.readCsv(indir, newFileName, gotTagValues);\r
+  }\r
+  else {\r
+    callback(csvFilename + ' file is missing from upload.');\r
+  }\r
+}\r
+\r
+function gotTagValues(err, jsonObj) {\r
+  if (err) {\r
+    puts("\nError!");\r
+    putd(err);\r
+    callback('Tag-values.csv file is missing from upload.');\r
+    return;\r
+  }\r
+  csvTagValues = jsonObj;\r
+  csvTagValues = _.reject(csvTagValues, 'field2', 'Tag-values');\r
+  csvTagValues = _.reject(csvTagValues, 'field2', 'Extra data to be passed into the HEAT template for this VNF');\r
+  csvTagValues = _.reject(csvTagValues, 'field2', 'vnf-parameter-name');\r
+  csvTagValues = _.reject(csvTagValues, 'field2', 'vnf-parameter-value');\r
+  csvTagValues = _.reject(csvTagValues, 'field2', '');\r
+  puts("\nRead this: ");\r
+  putd(csvTagValues);\r
+  puts("\n");\r
+  doneReadingFiles();\r
+}\r
+\r
+\r
+\r
+\r
+function doneReadingFiles() {\r
+  puts("\n");\r
+  puts("DONE READING FILES!");\r
+  puts("\n");\r
+  processJson();\r
+}\r
+\r
+\r
+// PROCESS THE CSV FILES INTO OBJECTS TO BE ASSEMBLED INTO FINAL OUTPUT\r
+function processJson() {\r
+  processGeneral();\r
+  processAvailZones();\r
+  processNetworks();\r
+  processVMnetworks();\r
+  processVMnetips();\r
+  processVMnetmacs();\r
+  processVMs();\r
+  processTagValues();\r
+  assembleJson();\r
+}\r
+\r
+// ASSEMBLE AND OUTPUT RESULTS\r
+\r
+function assembleJson() {\r
+  puts("\n");\r
+  puts("Using raw JSON and assembling final ouptut JSON.");\r
+  puts("\n");\r
+\r
+  vnfTopoID = { "service-type": "SDN-MOBILITY",\r
+               "vnf-name": rawJson['vf-module-name'],\r
+               "vnf-type": rawJson['vf-module-model-name'], \r
+               "generic-vnf-name": rawJson['generic-vnf-name'], \r
+               "generic-vnf-type": rawJson['generic-vnf-type'] };\r
+\r
+  vnfZones = rawJson['availability-zones'];\r
+\r
+  vnfNetworks = rawJson['networks'];\r
+\r
+  vnfVMs = rawJson['vms'];\r
+\r
+  vnfParams = rawJson['tag-values'];\r
+\r
+  vnfAssignments = { "availability-zones": vnfZones,\r
+                    "vnf-networks": vnfNetworks,\r
+                    "vnf-vms": vnfVMs};\r
+\r
+  vnfTopo = { "vnf-topology-identifier": vnfTopoID,\r
+              "vnf-assignments": vnfAssignments,\r
+              "vnf-parameters": vnfParams };\r
+\r
+  vnfInput = {'vnf-topology-information': vnfTopo}; \r
+\r
+  finalJson = {"input": vnfInput};\r
+\r
+  outputJson();\r
+}\r
+\r
+function outputJson() {\r
+  puts("\n");\r
+  puts("\n");\r
+  puts(JSON.stringify(finalJson,null,2));\r
+  puts("\n");\r
+  puts("\n");\r
+  var unixTime, fullpath_filename, filename;\r
+  unixTime = moment().unix();\r
+  if (platform=='portal') {\r
+    fullpath_filename = process.cwd() + "/uploads/" + unixTime + ".vnf_worksheet.json";\r
+    filename = unixTime + ".vnf_worksheet.json.";\r
+  } else {\r
+    fullpath_filename = "./output.json."+unixTime;\r
+    filename = "output.json." + unixTime;\r
+  }\r
+  helpers.writeOutput(req, fullpath_filename, JSON.stringify(finalJson,null,2), callback);\r
+  callback(null,  finalJson, filename);\r
+}\r
+\r
+\r
+// Gather functions that actually process data after it is all read\r
+\r
+function processGeneral() {\r
+\r
+  preloadVersion = getParam(csvGeneral, 'field2', 'preload-version', 'field3');\r
+  rawJson['preload-version'] = preloadVersion;\r
+  puts("Preload version: " + preloadVersion);\r
+\r
+  if ( (preloadVersion!='1607') && (preloadVersion!='1610') ) {\r
+    puts("\nError - incorrect version of preload worksheet.");\r
+    callback('Error - incorrect version of preload worksheet.');\r
+  }\r
+\r
+  rawJson['vf-module-name'] = getParam(csvGeneral, 'field2', 'vf-module-name', 'field3');\r
+  // rawJson['vf-module-type'] = getParam(csvGeneral, 'field2', 'vf-module-type', 'field3');\r
+  try {\r
+    rawJson['vf-module-model-name'] = getParam(csvGeneral, 'field2', 'vf-module-model-name', 'field3');\r
+  } catch (e) {\r
+    puts("\n\n");\r
+    puts("ERROR ERROR ERROR ERROR ERROR\n");\r
+    puts("Failed to find data field 'vf-module-model-name'. Maybe this preload worksheet is older?")\r
+    puts("If on the 'general' tab there is a field called 'vf-module-type' please rename it to 'vf-module-model-name'");\r
+    puts("\n\n");\r
+    process.exit();\r
+  }\r
+  rawJson['generic-vnf-name'] = getParam(csvGeneral, 'field2', 'vnf-name', 'field3');\r
+  rawJson['generic-vnf-type'] = getParam(csvGeneral, 'field2', 'vnf-type', 'field3');\r
+  rawJson['request-id'] = uuid.v1();\r
+  rawJson['source'] = "ADMINPORTAL";\r
+  rawJson['request-action'] = "PreloadVNFRequest";\r
+  rawJson['svc-request-id'] = uuid.v1();\r
+  rawJson['svc-action'] = "reserve";\r
+  puts('rawJson:');\r
+  putd(rawJson);\r
+  puts("\n");\r
+}\r
+\r
+function processAvailZones() {\r
+  var newZones = _.map(csvZones, function(x) { return {'availability-zone': x['field2']}; } );\r
+  rawJson['availability-zones'] = newZones;\r
+  puts("Availability zones read:");\r
+  putd(rawJson['availability-zones']);\r
+  puts("\n");\r
+}\r
+\r
+function processNetworks() {\r
+  var newNetworks = [];\r
+  csvNetworks.forEach( function(network) {\r
+    var netJson = {};\r
+    netJson["network-role"] = network.field2;\r
+    netJson["network-name"] = network.field3;\r
+    netJson["network-id"] = network.field4;\r
+    netJson["contrail-network-fqdn"] = network.field5;\r
+    netJson["subnet-name"] = network.field6;\r
+    netJson["subnet-id"] = network.field7;\r
+    netJson["ipv6-subnet-name"] = network.field8;\r
+    netJson["ipv6-subnet-id"] = network.field9;\r
+    newNetworks.push(netJson);\r
+    }\r
+  );\r
+  puts("networks:");\r
+  putd(newNetworks);\r
+  rawJson["networks"] = newNetworks;\r
+}\r
+\r
+function processVMs() {\r
+  var newVMs = [];\r
+  csvVMs.forEach( function(vm) {\r
+    var vmJson = {};\r
+    vmJson["vm-type"] = vm.field2;\r
+    vmJson["vm-name"] = vm.field3;\r
+    newVMs.push(vmJson);\r
+    }\r
+  );\r
+\r
+  puts("VMs:");\r
+  putd(newVMs);\r
+\r
+  // OK, now for each type, get count and then build vm-names array of the names\r
+  var vnfvms=[]\r
+  vmTypes = _.uniq(_.pluck(newVMs,'vm-type'));\r
+  vmTypes.forEach( function(vmType) {\r
+    puts(vmType);\r
+    var vmJson={};\r
+    var vmThisType;\r
+    var vmCount;\r
+    var vmNames=[];\r
+    var tmpNames;\r
+    vmThisType=_.select(newVMs, 'vm-type', vmType);\r
+    vmCount=vmThisType.length;\r
+    vmJson["vm-type"] = vmType;\r
+    vmJson["vm-count"] = vmCount;\r
+    tmpNames = _.pluck(vmThisType,'vm-name');\r
+    vmJson["vm-names"] = _.map(tmpNames, function(nam) { return {"vm-name": nam}; } );\r
+    netroles = _.select( rawJson["vm-networks"], "vm-type", vmType );\r
+    newnetroles=[]\r
+    netroles.forEach( function(netrole) {\r
+      tmpNetDetails = {};\r
+      tmpNetDetails["network-role"] = netrole["network-role"];\r
+      tmpNetDetails["use-dhcp"] = netrole["use-dhcp"];\r
+\r
+      var tmpipsThisVmType=[];\r
+      tmpipsThisVmType = _.select( rawJson["vm-net-ips"], "vm-type", vmType);\r
+      var tmpips=[];\r
+      tmpips = _.select( tmpipsThisVmType, "network-role", netrole["network-role"]);\r
+      tmpipsJson = _.map(tmpips, function(ip) { return {"ip-address": ip["ip-address"]} } );\r
+      tmpipsJson = _.reject(tmpipsJson, function(o) { return (o["ip-address"]==undefined); } );\r
+      tmpNetDetails["network-ips"] = tmpipsJson;\r
+\r
+      var tmpipsv6ThisVmType=[];\r
+      tmpipsv6ThisVmType = _.select( rawJson["vm-net-ips"], "vm-type", vmType);\r
+      var tmpipsv6=[];\r
+      tmpipsv6 = _.select( tmpipsv6ThisVmType, "network-role", netrole["network-role"]);\r
+      tmpipsv6Json = _.map(tmpipsv6, function(ip) { return {"ip-address-ipv6": ip["ipv6-address"]} } );\r
+      tmpipsv6Json = _.reject(tmpipsv6Json, function(o) { return (o["ip-address-ipv6"]==undefined); } );\r
+      tmpNetDetails["network-ips-v6"] = tmpipsv6Json;\r
+\r
+      var tmpirpThisVmType=[];\r
+      tmpirpThisVmType = _.select( rawJson["vm-net-ips"], "vm-type", vmType);\r
+      var tmpirp=[];\r
+      tmpirp = _.select( tmpirpThisVmType, "network-role", netrole["network-role"]);\r
+      tmpirpJson = _.map(tmpirp, function(irp) { return {"interface-route-prefix-cidr": irp["interface-route-prefix"]} } );\r
+      tmpirpJson = _.reject(tmpirpJson, function(o) { return (o["interface-route-prefix-cidr"]==undefined); } );\r
+      tmpNetDetails["interface-route-prefixes"] = tmpirpJson;\r
+\r
+      var tmpmacsThisVmType=[];\r
+      tmpmacsThisVmType = _.select( rawJson["vm-net-macs"], "vm-type", vmType);\r
+      var tmpmacs=[];\r
+      tmpmacs = _.select( tmpmacsThisVmType, "network-role", netrole["network-role"]);\r
+      tmpmacsJson = _.map(tmpmacs, function(mac) { return {"mac-address": mac["mac-address"]} } );\r
+      tmpNetDetails["network-macs"] = tmpmacsJson;\r
+\r
+      var fip='';\r
+      fip = netrole["floating-ip"];\r
+      fip = _.trim(fip);\r
+      if (fip != '') {\r
+        tmpNetDetails["floating-ip"] = netrole["floating-ip"];\r
+      }\r
+\r
+      var fipv6='';\r
+      fipv6 = netrole["floating-ip-v6"];\r
+      fipv6 = _.trim(fipv6);\r
+      if (fipv6 != '') {\r
+        tmpNetDetails["floating-ip-v6"] = netrole["floating-ip-v6"];\r
+      }\r
+\r
+      newnetroles.push(tmpNetDetails);\r
+      }\r
+    );\r
+    vmJson["vm-networks"] = newnetroles;\r
+    putd(vmJson);\r
+    vnfvms.push(vmJson);\r
+    }\r
+  );\r
+  rawJson["vms"] = vnfvms;\r
+}\r
+\r
+function processVMnetworks() {\r
+  // For each VM type, for each Network role, get details like use-dhcp\r
+  var newVMnetworks = [];\r
+  csvVMnetworks.forEach( function(vm) {\r
+    var newvmJson = {};\r
+    newvmJson["vm-type"] = vm.field2;\r
+    newvmJson["network-role"] = vm.field3;\r
+    newvmJson["use-dhcp"] = vm.field4;\r
+    newvmJson["floating-ip"] = vm.field5;\r
+    newvmJson["floating-ip-v6"] = vm.field6;\r
+    newVMnetworks.push(newvmJson);\r
+    }\r
+  );\r
+  rawJson["vm-networks"] = newVMnetworks;\r
+  puts("rawJson for vm-networks...");\r
+  putd( rawJson["vm-networks"] );\r
+}\r
+\r
+\r
+function processVMnetips() {\r
+  // For each VM type, for each network role, get the set of network IPs\r
+  puts("Processing VM-net-ips");\r
+  var newVMnetips = [];\r
+  csvVMnetworkIPs.forEach( function(vm) {\r
+    var newvmnetipsJson = {};\r
+    newvmnetipsJson["vm-type"] = vm.field2;\r
+    newvmnetipsJson["network-role"] = vm.field3;\r
+    if (_.trim(vm.field4)!="") { \r
+      newvmnetipsJson["ip-address"] = vm.field4;\r
+    }\r
+    if (_.trim(vm.field5)!="") { \r
+    newvmnetipsJson["ipv6-address"] = vm.field5;\r
+    }\r
+    if (_.trim(vm.field6)!="") { \r
+    newvmnetipsJson["interface-route-prefix"] = vm.field6;\r
+    }\r
+    newVMnetips.push(newvmnetipsJson);\r
+    }\r
+  );\r
+  rawJson["vm-net-ips"] = newVMnetips;\r
+  puts("rawJson for vm-net-ips");\r
+  putd(rawJson["vm-net-ips"]);\r
+}\r
+\r
+function processVMnetmacs() {\r
+  // For each VM type, for each network role, get the set of MACs \r
+  puts("Processing VM-net-macs");\r
+  var newVMnetmacs = [];\r
+  csvVMnetworkMACs.forEach( function(vm) {\r
+    var newvmnetmacsJson = {};\r
+    newvmnetmacsJson["vm-type"] = vm.field2;\r
+    newvmnetmacsJson["network-role"] = vm.field3;\r
+    newvmnetmacsJson["mac-address"] = vm.field4;\r
+    newVMnetmacs.push(newvmnetmacsJson);\r
+    }\r
+  );\r
+  rawJson["vm-net-macs"] = newVMnetmacs;\r
+  puts("rawJson for vm-net-macs");\r
+  putd(rawJson["vm-net-macs"]);\r
+}\r
+\r
+function processTagValues() {\r
+  var newTagValues = _.map(csvTagValues, function(x) { return {'vnf-parameter-name': x['field2'], \r
+         'vnf-parameter-value': x['field3']}; } );\r
+  rawJson['tag-values'] = newTagValues;\r
+  puts("Tag-values read:");\r
+  putd(rawJson['tag-values']);\r
+  puts("\n");\r
+}\r
+\r
+\r