Network toplogy GUI for VM-to-VM flow statistics configuration.

Change-Id: I86543c7bb30d79ec8b5d57f822756b5e8a8e5e40
diff --git a/apps/openstacknetworkingui/src/main/resources/app/view/sonaTopov/sonaTopovOverlay.js b/apps/openstacknetworkingui/src/main/resources/app/view/sonaTopov/sonaTopovOverlay.js
index c9d6262..e588cb2 100644
--- a/apps/openstacknetworkingui/src/main/resources/app/view/sonaTopov/sonaTopovOverlay.js
+++ b/apps/openstacknetworkingui/src/main/resources/app/view/sonaTopov/sonaTopovOverlay.js
@@ -24,10 +24,12 @@
     var traceDst = null;
     var srcDeviceId = null;
     var dstDeviceId = null;
+    var flowStatsSrcIp = null;
+    var flowStatsDstIp = null;
 
     var traceInfoDialogId = 'traceInfoDialogId',
         traceInfoDialogOpt = {
-            width: 300,
+            width: 350,
             edge: 'left',
             margin: 20,
             hideMargin: -20
@@ -117,6 +119,22 @@
                         flash.flash('Trace to External')
                     }
                }
+            },
+            FlowStats: {
+                gid: 'meterTable',
+                tt: 'Flow Statistics',
+                cb: function (data) {
+                    if (flowStatsSrcIp == null && data.navPath == 'host') {
+                        flowStatsSrcIp = data.propValues.ip;
+                        flash.flash('Source ' + flowStatsSrcIp + ' is selected. Choose a destination IP address');
+                        $log.info('Source VM is selected for Flow Statistics: ', data);
+                    } else if (flowStatsDstIp == null && data.title != flowStatsSrcIp && data.navPath == 'host') {
+                        flowStatsDstIp = data.propValues.ip;
+                        flash.flash('Destination ' + flowStatsDstIp + ' is selected. Press [Request] button !');
+                        openFlowStatsInfoDialog();
+                        $log.info('Destination VM is selected for Flow Statistics: ', data);
+                    }
+                }
             }
         },
 
@@ -161,6 +179,60 @@
         }
     };
 
+    function openFlowStatsInfoDialog() {
+        ds.openDialog(traceInfoDialogId, traceInfoDialogOpt)
+            .setTitle('VM to VM Flow Statistics Rule Configuration')
+            .addContent(createFlowStatsInfoDiv(flowStatsSrcIp, flowStatsDstIp))
+            .addCancel(dStatsBoxClose, 'Close')
+            .addOk(flowStatsRemoveReqBtn, 'Remove Stats Rule')
+            .addOk(flowStatsAddReqBtn, 'Add Stats Rule')
+            .bindKeys();
+    }
+
+    function createFlowStatsInfoDiv(srcIp, dstIp) {
+        var texts = ds.createDiv('FlowStatsInfo');
+        texts.append('hr');
+        texts.append('table').append('tbody').append('tr');
+
+        var tBodySelection = texts.select('table').select('tbody').select('tr');
+
+        tBodySelection.append('td').text('Source IP: ').attr("class", "label");
+        tBodySelection.append('td').text(srcIp).attr("class", "value");
+
+        texts.select('table').select('tbody').append('tr');
+
+        tBodySelection = texts.select('table').select('tbody').select('tr:nth-child(2)');
+
+        tBodySelection.append('td').text('Destination IP: ').attr("class", "label");
+        tBodySelection.append('td').text(dstIp).attr("class", "value");
+
+        texts.append('hr');
+
+        return texts;
+    }
+
+    function dStatsBoxClose() {
+        $log.info('Dialog Close button clicked (or Esc pressed)');
+        flowStatsSrcIp = null;
+        flowStatsDstIp = null;
+    }
+
+    function flowStatsAddReqBtn() {
+        sts.sendFlowStatsAddRequest(flowStatsSrcIp, flowStatsDstIp);
+        ds.closeDialog();
+        flowStatsSrcIp = null;
+        flowStatsDstIp = null;
+        flash.flash('Send Flow Statistics Addition Request');
+    }
+
+    function flowStatsRemoveReqBtn() {
+        sts.sendFlowStatsRemoveRequest(flowStatsSrcIp, flowStatsDstIp);
+        ds.closeDialog();
+        flowStatsSrcIp = null;
+        flowStatsDstIp = null;
+        flash.flash('Send Flow Statistics Removal Request');
+    }
+
     function openTraceInfoDialog() {
         ds.openDialog(traceInfoDialogId, traceInfoDialogOpt)
             .setTitle('Flow Trace Information')
@@ -203,7 +275,6 @@
         texts.append('hr');
 
         return texts;
-
     }
 
     function flowTraceResultBtn() {