c64beae271ed3bee5a2cd365eeecfae3cb04484e
[sdnc/oam.git] / admportal / server / router / routes / network.js
1 \r
2 // Helper functions for processing a NETWORK worksheet\r
3 \r
4 var helpers = require('./helpers.js');\r
5 var _ = require('lodash');\r
6 var csvtojson = require('csvtojson');\r
7 var async = require('async');\r
8 var uuid = require('node-uuid');   // generate a uuid with "uuid.v1()"\r
9 var path = require('path');\r
10 var fs = require("fs");\r
11 var moment = require("moment");\r
12 \r
13 var network = module.exports;\r
14 var getParam = helpers.getParam;\r
15 \r
16 var indir;\r
17 var csvGeneral, csvSubnets, csvVpnBindings, csvPolicies, csvNetRoutes;\r
18 var rawJson={}\r
19 var finalJson={};  \r
20 var platform;\r
21 var req,res;\r
22 var preloadVersion;  // 1607, 1610, etc...\r
23 \r
24 puts = helpers.puts;\r
25 putd = helpers.putd;\r
26 \r
27 network.go = function(lreq,lres,cb,dir) {\r
28   puts("Processing NETWORK workbook");\r
29   req = lreq;\r
30   res = lres;\r
31   callback = cb;\r
32   if (dir!="") {\r
33     platform="pc";\r
34     indir=dir;\r
35   } else {\r
36     platform="portal";\r
37     indir=process.cwd() + "/uploads/";\r
38   }\r
39   doGeneral();\r
40 }\r
41 \r
42 // READ WORKSHEET: GENERAL\r
43 \r
44 function doGeneral() {\r
45   puts("Reading General worksheet");\r
46   var csvFilename="General.csv";\r
47   var newFileName = helpers.getFileName(req, csvFilename);\r
48   if ( newFileName != null ) {\r
49     helpers.readCsv(indir, newFileName, gotGeneral);\r
50   }\r
51   else {\r
52     callback(csvFilename + ' file is missing from upload.');\r
53   }\r
54 }\r
55 \r
56 function gotGeneral(err, jsonObj) {\r
57   if (err) {\r
58     puts("\nError!");\r
59     putd(err);\r
60     callback('General.csv file is missing from upload.');\r
61     return;\r
62   }\r
63   csvGeneral = jsonObj;\r
64   puts("\nRead this: ");\r
65   putd(csvGeneral);\r
66   puts("\n");\r
67   doSubnets();\r
68 }\r
69 \r
70 // READ WORKSHEET: SUBNETS\r
71 \r
72 function doSubnets() {\r
73   puts("Reading Subnets worksheet");\r
74   var csvFilename="Subnets.csv";\r
75   var newFileName = helpers.getFileName(req, csvFilename);\r
76   if ( newFileName != null ) {\r
77     helpers.readCsv(indir, newFileName, gotSubnets);\r
78   }\r
79   else {\r
80     callback(csvFilename + ' file is missing from upload.');\r
81   }\r
82 }\r
83 \r
84 function gotSubnets(err, jsonObj) {\r
85   if (err) {\r
86     puts("\nError!");\r
87     putd(err);\r
88     callback('Subnets.csv file is missing from upload.');\r
89     return;\r
90   }\r
91   csvSubnets = jsonObj;\r
92   csvSubnets = _.reject(csvSubnets, 'field2', 'Subnets');\r
93   csvSubnets = _.reject(csvSubnets, 'field2', 'start-address');\r
94   csvSubnets = _.reject(csvSubnets, 'field2', '');\r
95   puts("\nRead this: ");\r
96   putd(csvSubnets);\r
97   puts("\n");\r
98   doVpnBindings();\r
99 }\r
100 \r
101 // READ WORKSHEET: VPN-BINDINGS\r
102 \r
103 function doVpnBindings() {\r
104   puts("Reading VPN-Bindings worksheet");\r
105   var csvFilename="VPN-Bindings.csv";\r
106   var newFileName = helpers.getFileName(req, csvFilename);\r
107   if ( newFileName != null ) {\r
108     helpers.readCsv(indir, newFileName, gotVpnBindings);\r
109   }\r
110   else {\r
111     callback(csvFilename + ' file is missing from upload.');\r
112   }\r
113 }\r
114 \r
115 function gotVpnBindings(err, jsonObj) {\r
116   if (err) {\r
117     puts("\nError!");\r
118     putd(err);\r
119     callback('VPN-Bindings.csv file is missing from upload.');\r
120     return;\r
121   }\r
122   csvVpnBindings = jsonObj;\r
123   csvVpnBindings = _.reject(csvVpnBindings, 'field2', 'VPN-Bindings');\r
124   csvVpnBindings = _.reject(csvVpnBindings, 'field2', 'vpn-binding-id');\r
125   csvVpnBindings = _.reject(csvVpnBindings, function(o) { return (_.trim(o.field2)=="") && (_.trim(o.field3)==""); } );\r
126   puts("\nRead this: ");\r
127   putd(csvVpnBindings);\r
128   puts("\n");\r
129   doPolicies();\r
130 }\r
131 \r
132 \r
133 // READ WORKSHEET: POLICIES\r
134 \r
135 function doPolicies() {\r
136   puts("Reading Policies worksheet");\r
137   var csvFilename="Policies.csv";\r
138   var newFileName = helpers.getFileName(req, csvFilename);\r
139   if ( newFileName != null ) {\r
140     helpers.readCsv(indir, newFileName, gotPolicies);\r
141   }\r
142   else {\r
143     callback(csvFilename + ' file is missing from upload.');\r
144   }\r
145 }\r
146 \r
147 function gotPolicies(err, jsonObj) {\r
148   if (err) {\r
149     puts("\nError!");\r
150     putd(err);\r
151     callback('Policies.csv file is missing from upload.');\r
152     return;\r
153   }\r
154   csvPolicies = jsonObj;\r
155   csvPolicies = _.reject(csvPolicies, 'field2', 'Policies');\r
156   csvPolicies = _.reject(csvPolicies, 'field2', 'network-policy-fqdn');\r
157   csvPolicies = _.reject(csvPolicies, 'field2', '');\r
158   puts("\nRead this: ");\r
159   putd(csvPolicies);\r
160   puts("\n");\r
161   doNetRoutes();\r
162 }\r
163 \r
164 \r
165 // READ WORKSHEET: NETWORK-ROUTES\r
166 \r
167 function doNetRoutes() {\r
168   puts("Reading Network-Routes worksheet");\r
169   var csvFilename="Network-Routes.csv";\r
170   var newFileName = helpers.getFileName(req, csvFilename);\r
171   preloadVersion = getParam(csvGeneral, 'field2', 'preload-version', 'field3');\r
172   if ( preloadVersion == '1607' ) {\r
173     puts("This is a 1607 spreadsheet. Skipping Network-Routes.csv.");\r
174     gotNetRoutes(null,{});\r
175     return;\r
176   }\r
177   if ( newFileName != null ) {\r
178     helpers.readCsv(indir, newFileName, gotNetRoutes);\r
179   }\r
180   else {\r
181     callback(csvFilename + ' file is missing from upload.');\r
182   }\r
183 }\r
184 \r
185 function gotNetRoutes(err, jsonObj) {\r
186   if (err) {\r
187     puts("\nError!");\r
188     putd(err);\r
189     callback('Network-Routes.csv file is missing from upload.');\r
190     return;\r
191   }\r
192   csvNetRoutes = jsonObj;\r
193   csvNetRoutes = _.reject(csvNetRoutes, 'field2', 'Network-Routes');\r
194   csvNetRoutes = _.reject(csvNetRoutes, 'field2', 'route-table-reference-fqdn');\r
195   csvNetRoutes = _.reject(csvNetRoutes, 'field2', '');\r
196   puts("\nRead this: ");\r
197   putd(csvNetRoutes);\r
198   puts("\n");\r
199   doneReadingFiles();\r
200 }\r
201 \r
202 \r
203 // DONE READING FILES\r
204 \r
205 function doneReadingFiles() {\r
206   puts("\n");\r
207   puts("DONE READING FILES!");\r
208   puts("\n");\r
209   processJson();\r
210 }\r
211 \r
212 \r
213 // PROCESS THE CSV FILES INTO OBJECTS TO BE ASSEMBLED INTO FINAL OUTPUT\r
214 function processJson() {\r
215   processGeneral();\r
216   processSubnets();\r
217   processVpnBindings();\r
218   processPolicies();\r
219   processNetRoutes();\r
220   assembleJson();\r
221 }\r
222 \r
223 // ASSEMBLE AND OUTPUT RESULTS\r
224 \r
225 function assembleJson() {\r
226   puts("\n");\r
227   puts("Using raw JSON and assembling final ouptut JSON.");\r
228   puts("\n");\r
229 \r
230   networkTopoID = { "network-name": rawJson['network-name'],\r
231                 "network-role": rawJson['network-role'],\r
232                 "network-type": rawJson['network-type'],\r
233                 "network-technology": rawJson['network-technology'] };\r
234 \r
235   providerInfo = { "physical-network-name": rawJson['physical-network-name'],\r
236                "is-provider-network": rawJson['is-provider-network'],\r
237                "is-shared-network": rawJson['is-shared-network'],\r
238                "is-external-network": rawJson['is-external-network'] };\r
239 \r
240   networkSubnets = rawJson['subnets'];\r
241 \r
242   networkVpnBindings = rawJson['vpn-bindings'];\r
243 \r
244   networkPolicies = rawJson['network-policy-fqdns'];\r
245 \r
246   networkRoutes = rawJson['route-table-reference'];\r
247 \r
248   networkTopo = { "network-topology-identifier": networkTopoID,\r
249               "provider-network-information": providerInfo,\r
250               "subnets": networkSubnets,\r
251               "vpn-bindings": networkVpnBindings,\r
252               "network-policy": networkPolicies,\r
253               "route-table-reference": networkRoutes};\r
254 \r
255   networkInput = {'network-topology-information': networkTopo};\r
256 \r
257   finalJson = {"input": networkInput};\r
258 \r
259   outputJson();\r
260 }\r
261 \r
262 function outputJson() {\r
263   puts("\n");\r
264   puts("\n");\r
265   puts(JSON.stringify(finalJson,null,2));\r
266   puts("\n");\r
267   puts("\n");\r
268   var unixTime, fullpath_filename, filename;\r
269   unixTime = moment().unix();\r
270   if (platform=='portal') {\r
271     fullpath_filename = process.cwd() + "/uploads/" + unixTime + ".net_worksheet.json";\r
272     filename = unixTime + ".net_worksheet.json.";\r
273   } else {\r
274     fullpath_filename = "./output.json."+unixTime;\r
275     filename = "output.json." + unixTime;\r
276   }\r
277   helpers.writeOutput(req, fullpath_filename, JSON.stringify(finalJson,null,2), callback);\r
278   callback(null,  finalJson, filename);\r
279 }\r
280 \r
281 \r
282 // Gather functions that actually process data after it is all read\r
283 \r
284 function processGeneral() {\r
285   preloadVersion = getParam(csvGeneral, 'field2', 'preload-version', 'field3');\r
286   rawJson['preload-version'] = preloadVersion;\r
287   puts("Preload version: " + preloadVersion);\r
288 \r
289   if ( (preloadVersion!='1607') && (preloadVersion!='1610') ) {\r
290     puts("\nError - incorrect version of preload worksheet.");\r
291     callback('Error - incorrect version of preload worksheet.');\r
292   }\r
293 \r
294   rawJson['network-name'] = getParam(csvGeneral, 'field2', 'network-name', 'field3');\r
295   rawJson['network-role'] = getParam(csvGeneral, 'field2', 'network-role', 'field3');\r
296   rawJson['network-type'] = getParam(csvGeneral, 'field2', 'network-type', 'field3');\r
297   rawJson['network-technology'] = getParam(csvGeneral, 'field2', 'network-technology', 'field3');\r
298 \r
299   if ( preloadVersion!='1607' ) {\r
300     rawJson['physical-network-name'] = getParam(csvGeneral, 'field2', 'physical-network-name', 'field3');\r
301     rawJson['is-provider-network'] = getParam(csvGeneral, 'field2', 'is-provider-network', 'field3');\r
302     rawJson['is-shared-network'] = getParam(csvGeneral, 'field2', 'is-shared-network', 'field3');\r
303     rawJson['is-external-network'] = getParam(csvGeneral, 'field2', 'is-external-network', 'field3');\r
304   }\r
305 \r
306   rawJson['request-action'] = "PreloadNetworkRequest";\r
307   rawJson['svc-request-id'] = uuid.v1();\r
308   rawJson['svc-action'] = "reserve";\r
309   puts('rawJson:');\r
310   putd(rawJson);\r
311   puts("\n");\r
312 }\r
313 \r
314 function processSubnets() {\r
315   var newSubnets = [];\r
316   csvSubnets.forEach( function(subnet) {\r
317     var subnetJson = {};\r
318     subnetJson["start-address"] = subnet.field2;\r
319     if (subnet.field3!='') {\r
320       subnetJson["dhcp-start-address"] = subnet.field3;\r
321     }\r
322     if (subnet.field4!='') {\r
323       subnetJson["dhcp-end-address"] = subnet.field4;\r
324     }\r
325     if (subnet.field5!='') {\r
326       subnetJson["gateway-address"] = subnet.field5;\r
327     }\r
328     subnetJson["cidr-mask"] = subnet.field6;\r
329     subnetJson["ip-version"] = subnet.field7;\r
330     subnetJson["dhcp-enabled"] = subnet.field8;\r
331     subnetJson["subnet-name"] = subnet.field9;\r
332     newSubnets.push(subnetJson);\r
333     }\r
334   );\r
335   puts("subnets:");\r
336   putd(newSubnets);\r
337   puts("\n");\r
338   rawJson["subnets"] = newSubnets;\r
339 }\r
340 \r
341 function processVpnBindings() {\r
342   var newVpnBindings = [];\r
343 \r
344   csvVpnBindings.forEach( function(vpn) {\r
345     var vpnJson = {};\r
346     bindid = _.trim(vpn.field2);\r
347     vpnJson["vpn-binding-id"] = bindid;\r
348     if (bindid!="") {\r
349       newVpnBindings.push(vpnJson);\r
350     }\r
351     });\r
352 \r
353   puts("VPN-Bindings:");\r
354   putd(newVpnBindings);\r
355   puts("\n");\r
356   rawJson["vpn-bindings"] = newVpnBindings;\r
357 }\r
358 \r
359 function processPolicies() {\r
360   var newPolicies = [];\r
361 \r
362   csvPolicies.forEach( function(policy) {\r
363     var policyJson = {};\r
364     fqdn = _.trim(policy.field2);\r
365     if (fqdn != "") {\r
366       policyJson["network-policy-fqdn"] = fqdn;\r
367       newPolicies.push(policyJson);\r
368     }\r
369 \r
370     }\r
371   );\r
372 \r
373   puts("Policies:");\r
374   putd(newPolicies);\r
375   puts("\n");\r
376   rawJson["network-policy-fqdns"] = newPolicies;\r
377 }\r
378 \r
379 function processNetRoutes() {\r
380   var newNetRoutes = [];\r
381 \r
382   csvNetRoutes.forEach( function(netroute) {\r
383     var netrouteJson = {};\r
384     fqdn = _.trim(netroute.field2);\r
385     if (fqdn != "") {\r
386       netrouteJson["route-table-reference-fqdn"] = fqdn;\r
387       newNetRoutes.push(netrouteJson);\r
388     }\r
389 \r
390     }\r
391   );\r
392 \r
393   puts("Network-Routes:");\r
394   putd(newNetRoutes);\r
395   puts("\n");\r
396   rawJson["route-table-reference"] = newNetRoutes;\r
397 }\r
398 \r
399 \r
400 \r