table on topology views add and start router controller
[VSoRC/.git] / js / topology / modules.js
diff --git a/js/topology/modules.js b/js/topology/modules.js
new file mode 100644 (file)
index 0000000..4d05772
--- /dev/null
@@ -0,0 +1,252 @@
+// Copyright (c) 2018 Maen Artimy\r
+// \r
+// Licensed under the Apache License, Version 2.0 (the "License");\r
+// you may not use this file except in compliance with the License.\r
+// You may obtain a copy of the License at\r
+// \r
+//   http://www.apache.org/licenses/LICENSE-2.0\r
+//\r
+// Unless required by applicable law or agreed to in writing, software\r
+// distributed under the License is distributed on an "AS IS" BASIS,\r
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+// See the License for the specific language governing permissions and\r
+// limitations under the License.\r
+\r
+/**\r
+ * Definition of modules.\r
+ *\r
+ **/\r
+\r
+// Makes a GET request to the controller\r
+function BaseModule(command) {\r
+       var cmd = command;\r
+       var go = myGlobalObject;\r
+\r
+       var run = function(element) {\r
+               go.httpGetAsync(cmd, this.callback, element);\r
+       };\r
+\r
+       var callback = function(jsondata, element) {\r
+               console.log(element);\r
+       }\r
+\r
+       return {\r
+               callback: callback,\r
+               run: run\r
+       }\r
+}\r
+\r
+// Makes a POST request to the controller\r
+function BasePostModule(command) {\r
+       var cmd = command;\r
+       var go = myGlobalObject;\r
+       var idx;\r
+       var parm = "";\r
+\r
+       var dpInFilter = function (e, x) {\r
+               idx = x;\r
+               e.innerHTML ="Filter: <input class=\"filterInput\" size=20><button onClick=\"mainFilterFunc(this.parentElement,"+idx+")\">Send</button>";\r
+       };\r
+\r
+       var run = function(element) {\r
+               go.httpPostAsync(cmd, this.param, this.callback, element);\r
+       };\r
+\r
+       var callback = function(jsondata, element) {\r
+               console.log(element);\r
+       }\r
+\r
+       return {\r
+               idx: this.idx,\r
+               param: this.param,\r
+               dpInFilter: dpInFilter,\r
+               callback: callback,\r
+               run: run\r
+       }\r
+}\r
+\r
+function hc(myString) {\r
+       return myString.replace("_"," ").replace(/\b\w/g, l => l.toUpperCase())\r
+}\r
+\r
+// Populates the Switch ID card\r
+var dpList = function (jsondata, element) {\r
+       var switches = JSON.parse(jsondata);\r
+       var found = false;\r
+\r
+       //var html = "";\r
+       element.innerHTML = "";\r
+       var ul = document.createElement("ul");\r
+       ul.setAttribute("id", "swlist");\r
+       for(var s in switches) {\r
+               var num = +switches[s]; //("000000000000000" + switches[s].toString(16)).substr(-16);\r
+               //html += num + "<br>";\r
+\r
+               var li = document.createElement("li");\r
+               li.innerHTML = num;\r
+               if(switches[s] === myGlobalObject.dpid()) {\r
+                       li.classList.add("selected");\r
+                       found = true;\r
+               }\r
+               li.addEventListener("click", clickMe);\r
+               ul.appendChild(li);\r
+       }\r
+       element.appendChild(ul);\r
+       //element.innerHTML = html;\r
+       if (!found && document.getElementById("swlist").firstChild) {\r
+               var name  = document.getElementById("swlist").firstChild.innerHTML\r
+               myGlobalObject.setDPID(name)\r
+               moduleManager.loadModules(views);\r
+       }\r
+};\r
+\r
+var dpStruct = function (jsondata, element) {\r
+       var jsonobj = JSON.parse(jsondata);\r
+       if(!jsonobj) return;\r
+       var switchName = Object.keys(jsonobj);\r
+       var struct = jsonobj[switchName];\r
+       var html = "";\r
+       for(var key in struct) {\r
+               html += hc(key) + " : " + struct[key] + "<br>";\r
+       }\r
+       element.innerHTML = html;\r
+};\r
+\r
+var dpTable = function (jsondata, element) {\r
+       var dispObj = function(obj) {\r
+               // JSON to string?\r
+               var str = "";\r
+               if(Array.isArray(obj)) {\r
+                       for(var item in obj) {\r
+                               if(obj[item] instanceof Object) {\r
+\r
+                               }       else {\r
+                                       str += obj[item].replace(":","=") + "<br>";\r
+                               }\r
+                       }\r
+                       return str;\r
+               } else {\r
+                       var allKeys = Object.keys(obj);\r
+                       for(var key in allKeys) {\r
+                               str += allKeys[key] + " = " + obj[allKeys[key]] + "<br>";\r
+                       }\r
+               }\r
+               return str;\r
+       };\r
+\r
+       var jsonobj = JSON.parse(jsondata);\r
+       if(!jsonobj) return;\r
+\r
+       var switchName = Object.keys(jsonobj);\r
+\r
+       // extract the flows\r
+       var rows = jsonobj[switchName];\r
+\r
+       // get the headers\r
+       var col = [];\r
+       for (var c in rows[0]) {\r
+               col.push(c);\r
+       }\r
+       col.sort(); // A, B, C, ...\r
+       col.reverse(); // ..., C, B, A\r
+\r
+       // CREATE DYNAMIC TABLE.\r
+       var table = document.createElement("table");\r
+       //table.classList.add("fixed_headers");\r
+\r
+       // CREATE HTML TABLE HEADER ROW USING THE EXTRACTED HEADERS ABOVE.\r
+       var tr = table.insertRow(-1);                   // TABLE ROW.\r
+       for (var i = 0; i < col.length; i++) {\r
+               var th = document.createElement("th");      // TABLE HEADER.\r
+               th.innerHTML = col[i].replace("_","<br>");\r
+               tr.appendChild(th);\r
+       }\r
+\r
+       // ADD JSON DATA TO THE TABLE AS ROWS.\r
+       for (var i = 0; i < rows.length; i++) {\r
+               tr = table.insertRow(-1);\r
+               for (var j = 0; j < col.length; j++) {\r
+                       var tabCell = tr.insertCell(-1);\r
+\r
+                       if(typeof rows[i][col[j]] === 'object') {\r
+                               //tabCell.innerHTML = dispObj(rows[i][col[j]]);\r
+                               tabCell.innerHTML = JSON.stringify(rows[i][col[j]]);\r
+                       } else {\r
+                               tabCell.innerHTML = rows[i][col[j]];\r
+                       }\r
+               }\r
+       }\r
+       element.innerHTML = "";\r
+       table.align = "center";\r
+       element.appendChild(table);\r
+}\r
+\r
+// Populate the cards with data\r
+var moduleManager = (function () {\r
+       var time = 15000; //10 sec\r
+       var myViews = [];\r
+\r
+       var loadModules = function(views) {\r
+               myViews.length = 0; // it is supposed to be the best way to clear an array\r
+               self.clearInterval();\r
+\r
+               for (var idx in views) {\r
+                       if(views[idx].call) {\r
+                               var card = document.getElementById(views[idx].id);\r
+                               var container = card.childNodes.item(CONTAINER_IDX);\r
+\r
+                               var myModule;\r
+                               if(views[idx].post) {\r
+                                       myModule = new BasePostModule(views[idx].cmd);\r
+                                       var bar = card.childNodes.item(BAR_IDX);\r
+                                       myModule.dpInFilter(bar, idx);\r
+                               } else {\r
+                                       myModule = new BaseModule(views[idx].cmd);\r
+                               }\r
+                               myModule.callback = views[idx].call;\r
+                               myModule.run(container);\r
+                               views[idx].module = myModule;           // we need this to refresh\r
+                               views[idx].container = container;       // we need this to refresh\r
+\r
+                               if(views[idx].ref) { // refresh is required\r
+                                       myViews.push(views[idx]);\r
+                               };\r
+                       }\r
+               }\r
+               //myViews = views;\r
+       };\r
+\r
+       var refreshModules = function() {\r
+               for (var idx in myViews) {\r
+                       myViews[idx].module.run(myViews[idx].container);\r
+               }\r
+       }\r
+\r
+       var interval = self.setInterval(refreshModules,time);\r
+\r
+       var setInterval = function(newtime) {\r
+               time = newtime;\r
+               interval = self.setInterval(loadModules,time);\r
+       }\r
+\r
+       var getInterval = function() {\r
+               console.log(time);\r
+       }\r
+\r
+       return {\r
+               setInterval: setInterval,\r
+               loadModules: loadModules\r
+       }\r
+})();\r
+\r
+function clickMe(e) {\r
+       //console.log(e);\r
+       myGlobalObject.setDPID(e.currentTarget.innerHTML);\r
+       moduleManager.loadModules(views);\r
+}\r
+\r
+function mainFilterFunc(element, idx) {\r
+       var str = element.getElementsByClassName("filterInput")[0].value;\r
+       views[idx].module.param = str;\r
+       views[idx].module.run(views[idx].container);\r
+}\r