table on topology views add and start router controller
[VSoRC/.git] / js / topology / modules.js
1 // Copyright (c) 2018 Maen Artimy\r
2 // \r
3 // Licensed under the Apache License, Version 2.0 (the "License");\r
4 // you may not use this file except in compliance with the License.\r
5 // You may obtain a copy of the License at\r
6 // \r
7 //   http://www.apache.org/licenses/LICENSE-2.0\r
8 //\r
9 // Unless required by applicable law or agreed to in writing, software\r
10 // distributed under the License is distributed on an "AS IS" BASIS,\r
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
12 // See the License for the specific language governing permissions and\r
13 // limitations under the License.\r
14 \r
15 /**\r
16  * Definition of modules.\r
17  *\r
18  **/\r
19 \r
20 // Makes a GET request to the controller\r
21 function BaseModule(command) {\r
22         var cmd = command;\r
23         var go = myGlobalObject;\r
24 \r
25         var run = function(element) {\r
26                 go.httpGetAsync(cmd, this.callback, element);\r
27         };\r
28 \r
29         var callback = function(jsondata, element) {\r
30                 console.log(element);\r
31         }\r
32 \r
33         return {\r
34                 callback: callback,\r
35                 run: run\r
36         }\r
37 }\r
38 \r
39 // Makes a POST request to the controller\r
40 function BasePostModule(command) {\r
41         var cmd = command;\r
42         var go = myGlobalObject;\r
43         var idx;\r
44         var parm = "";\r
45 \r
46         var dpInFilter = function (e, x) {\r
47                 idx = x;\r
48                 e.innerHTML ="Filter: <input class=\"filterInput\" size=20><button onClick=\"mainFilterFunc(this.parentElement,"+idx+")\">Send</button>";\r
49         };\r
50 \r
51         var run = function(element) {\r
52                 go.httpPostAsync(cmd, this.param, this.callback, element);\r
53         };\r
54 \r
55         var callback = function(jsondata, element) {\r
56                 console.log(element);\r
57         }\r
58 \r
59         return {\r
60                 idx: this.idx,\r
61                 param: this.param,\r
62                 dpInFilter: dpInFilter,\r
63                 callback: callback,\r
64                 run: run\r
65         }\r
66 }\r
67 \r
68 function hc(myString) {\r
69         return myString.replace("_"," ").replace(/\b\w/g, l => l.toUpperCase())\r
70 }\r
71 \r
72 // Populates the Switch ID card\r
73 var dpList = function (jsondata, element) {\r
74         var switches = JSON.parse(jsondata);\r
75         var found = false;\r
76 \r
77         //var html = "";\r
78         element.innerHTML = "";\r
79         var ul = document.createElement("ul");\r
80         ul.setAttribute("id", "swlist");\r
81         for(var s in switches) {\r
82                 var num = +switches[s]; //("000000000000000" + switches[s].toString(16)).substr(-16);\r
83                 //html += num + "<br>";\r
84 \r
85                 var li = document.createElement("li");\r
86                 li.innerHTML = num;\r
87                 if(switches[s] === myGlobalObject.dpid()) {\r
88                         li.classList.add("selected");\r
89                         found = true;\r
90                 }\r
91                 li.addEventListener("click", clickMe);\r
92                 ul.appendChild(li);\r
93         }\r
94         element.appendChild(ul);\r
95         //element.innerHTML = html;\r
96         if (!found && document.getElementById("swlist").firstChild) {\r
97                 var name  = document.getElementById("swlist").firstChild.innerHTML\r
98                 myGlobalObject.setDPID(name)\r
99                 moduleManager.loadModules(views);\r
100         }\r
101 };\r
102 \r
103 var dpStruct = function (jsondata, element) {\r
104         var jsonobj = JSON.parse(jsondata);\r
105         if(!jsonobj) return;\r
106         var switchName = Object.keys(jsonobj);\r
107         var struct = jsonobj[switchName];\r
108         var html = "";\r
109         for(var key in struct) {\r
110                 html += hc(key) + " : " + struct[key] + "<br>";\r
111         }\r
112         element.innerHTML = html;\r
113 };\r
114 \r
115 var dpTable = function (jsondata, element) {\r
116         var dispObj = function(obj) {\r
117                 // JSON to string?\r
118                 var str = "";\r
119                 if(Array.isArray(obj)) {\r
120                         for(var item in obj) {\r
121                                 if(obj[item] instanceof Object) {\r
122 \r
123                                 }       else {\r
124                                         str += obj[item].replace(":","=") + "<br>";\r
125                                 }\r
126                         }\r
127                         return str;\r
128                 } else {\r
129                         var allKeys = Object.keys(obj);\r
130                         for(var key in allKeys) {\r
131                                 str += allKeys[key] + " = " + obj[allKeys[key]] + "<br>";\r
132                         }\r
133                 }\r
134                 return str;\r
135         };\r
136 \r
137         var jsonobj = JSON.parse(jsondata);\r
138         if(!jsonobj) return;\r
139 \r
140         var switchName = Object.keys(jsonobj);\r
141 \r
142         // extract the flows\r
143         var rows = jsonobj[switchName];\r
144 \r
145         // get the headers\r
146         var col = [];\r
147         for (var c in rows[0]) {\r
148                 col.push(c);\r
149         }\r
150         col.sort(); // A, B, C, ...\r
151         col.reverse(); // ..., C, B, A\r
152 \r
153         // CREATE DYNAMIC TABLE.\r
154         var table = document.createElement("table");\r
155         //table.classList.add("fixed_headers");\r
156 \r
157         // CREATE HTML TABLE HEADER ROW USING THE EXTRACTED HEADERS ABOVE.\r
158         var tr = table.insertRow(-1);                   // TABLE ROW.\r
159         for (var i = 0; i < col.length; i++) {\r
160                 var th = document.createElement("th");      // TABLE HEADER.\r
161                 th.innerHTML = col[i].replace("_","<br>");\r
162                 tr.appendChild(th);\r
163         }\r
164 \r
165         // ADD JSON DATA TO THE TABLE AS ROWS.\r
166         for (var i = 0; i < rows.length; i++) {\r
167                 tr = table.insertRow(-1);\r
168                 for (var j = 0; j < col.length; j++) {\r
169                         var tabCell = tr.insertCell(-1);\r
170 \r
171                         if(typeof rows[i][col[j]] === 'object') {\r
172                                 //tabCell.innerHTML = dispObj(rows[i][col[j]]);\r
173                                 tabCell.innerHTML = JSON.stringify(rows[i][col[j]]);\r
174                         } else {\r
175                                 tabCell.innerHTML = rows[i][col[j]];\r
176                         }\r
177                 }\r
178         }\r
179         element.innerHTML = "";\r
180         table.align = "center";\r
181         element.appendChild(table);\r
182 }\r
183 \r
184 // Populate the cards with data\r
185 var moduleManager = (function () {\r
186         var time = 15000; //10 sec\r
187         var myViews = [];\r
188 \r
189         var loadModules = function(views) {\r
190                 myViews.length = 0; // it is supposed to be the best way to clear an array\r
191                 self.clearInterval();\r
192 \r
193                 for (var idx in views) {\r
194                         if(views[idx].call) {\r
195                                 var card = document.getElementById(views[idx].id);\r
196                                 var container = card.childNodes.item(CONTAINER_IDX);\r
197 \r
198                                 var myModule;\r
199                                 if(views[idx].post) {\r
200                                         myModule = new BasePostModule(views[idx].cmd);\r
201                                         var bar = card.childNodes.item(BAR_IDX);\r
202                                         myModule.dpInFilter(bar, idx);\r
203                                 } else {\r
204                                         myModule = new BaseModule(views[idx].cmd);\r
205                                 }\r
206                                 myModule.callback = views[idx].call;\r
207                                 myModule.run(container);\r
208                                 views[idx].module = myModule;           // we need this to refresh\r
209                                 views[idx].container = container;       // we need this to refresh\r
210 \r
211                                 if(views[idx].ref) { // refresh is required\r
212                                         myViews.push(views[idx]);\r
213                                 };\r
214                         }\r
215                 }\r
216                 //myViews = views;\r
217         };\r
218 \r
219         var refreshModules = function() {\r
220                 for (var idx in myViews) {\r
221                         myViews[idx].module.run(myViews[idx].container);\r
222                 }\r
223         }\r
224 \r
225         var interval = self.setInterval(refreshModules,time);\r
226 \r
227         var setInterval = function(newtime) {\r
228                 time = newtime;\r
229                 interval = self.setInterval(loadModules,time);\r
230         }\r
231 \r
232         var getInterval = function() {\r
233                 console.log(time);\r
234         }\r
235 \r
236         return {\r
237                 setInterval: setInterval,\r
238                 loadModules: loadModules\r
239         }\r
240 })();\r
241 \r
242 function clickMe(e) {\r
243         //console.log(e);\r
244         myGlobalObject.setDPID(e.currentTarget.innerHTML);\r
245         moduleManager.loadModules(views);\r
246 }\r
247 \r
248 function mainFilterFunc(element, idx) {\r
249         var str = element.getElementsByClassName("filterInput")[0].value;\r
250         views[idx].module.param = str;\r
251         views[idx].module.run(views[idx].container);\r
252 }\r