NSB NFVi PROX Should report realtime port activity not 63/65463/1
authorDanielMartinBuckley <daniel.m.buckley@intel.com>
Mon, 1 Oct 2018 15:30:01 +0000 (16:30 +0100)
committerAbhijit Sinha <abhijit.sinha@intel.com>
Wed, 28 Nov 2018 16:19:12 +0000 (16:19 +0000)
historical data

JIRA: YARDSTICK-1458

The TG is only sampled at the end of every test interval.
This is incorrect. It should be sampled every interval.

Change-Id: I612ead8a243a7d9930874d02adc9b959b843b99b
Signed-off-by: Daniel Martin Buckley <daniel.m.buckley@intel.com>
(cherry picked from commit bf507da25ad1e6adc6a5c162a4d0de325baef888)

dashboard/Prox_BM_L3FWD-4Port-1539358774395.json [moved from dashboard/Prox_BM_L3FWD-4Port-1536065939744.json with 94% similarity]
yardstick/network_services/traffic_profile/prox_binsearch.py
yardstick/network_services/vnf_generic/vnf/prox_helpers.py
yardstick/tests/unit/network_services/traffic_profile/test_prox_binsearch.py
yardstick/tests/unit/network_services/vnf_generic/vnf/test_prox_helpers.py
yardstick/tests/unit/network_services/vnf_generic/vnf/test_tg_prox.py

@@ -14,7 +14,7 @@
       "type": "grafana",
       "id": "grafana",
       "name": "Grafana",
-      "version": "4.6.3"
+      "version": "4.4.3"
     },
     {
       "type": "panel",
@@ -60,7 +60,7 @@
   "hideControls": false,
   "id": null,
   "links": [],
-  "refresh": false,
+  "refresh": "5s",
   "rows": [
     {
       "collapse": false,
             "max": true,
             "min": true,
             "show": true,
-            "sortDesc": true,
+            "sort": null,
+            "sortDesc": null,
             "total": false,
             "values": true
           },
           "fill": 1,
           "grid": {},
           "height": "300px",
-          "id": 2,
+          "id": 2,
+          "legend": {
+            "alignAsTable": true,
+            "avg": true,
+            "current": false,
+            "max": true,
+            "min": true,
+            "show": true,
+            "total": false,
+            "values": true
+          },
+          "lines": true,
+          "linewidth": 2,
+          "links": [],
+          "nullPointMode": "connected",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 6,
+          "stack": false,
+          "steppedLine": true,
+          "targets": [
+            {
+              "alias": "Load Requested to Generator",
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.collect_stats.RequestedTxThroughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": []
+            },
+            {
+              "alias": "Load Generated (by the Generator)",
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.TxThroughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": []
+            },
+            {
+              "alias": "Load Received (by the Generator)",
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "hide": false,
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "refId": "B",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.RxThroughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": []
+            }
+          ],
+          "thresholds": [
+            {
+              "colorMode": "custom",
+              "fill": true,
+              "fillColor": "rgba(216, 200, 27, 0.27)",
+              "op": "gt",
+              "value": 0
+            },
+            {
+              "colorMode": "custom",
+              "fill": true,
+              "fillColor": "rgba(234, 112, 112, 0.22)",
+              "op": "gt",
+              "value": 0
+            }
+          ],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Generator Stats: Average Throughout per step",
+          "tooltip": {
+            "msResolution": true,
+            "shared": true,
+            "sort": 0,
+            "value_type": "cumulative"
+          },
+          "transparent": false,
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": "Million Packets Per Second",
+              "logBase": 1,
+              "max": null,
+              "min": "0",
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": false
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "${DS_YARDSTICK}",
+          "editable": true,
+          "error": false,
+          "fill": 1,
+          "grid": {},
+          "height": "300px",
+          "id": 5,
+          "legend": {
+            "alignAsTable": true,
+            "avg": true,
+            "current": false,
+            "max": true,
+            "min": true,
+            "show": true,
+            "total": false,
+            "values": true
+          },
+          "lines": true,
+          "linewidth": 2,
+          "links": [],
+          "nullPointMode": "connected",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 6,
+          "stack": false,
+          "steppedLine": true,
+          "targets": [
+            {
+              "alias": "Packet Size",
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.collect_stats.PktSize"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": []
+            }
+          ],
+          "thresholds": [
+            {
+              "colorMode": "custom",
+              "fill": true,
+              "fillColor": "rgba(216, 200, 27, 0.27)",
+              "op": "gt",
+              "value": 0
+            },
+            {
+              "colorMode": "custom",
+              "fill": true,
+              "fillColor": "rgba(234, 112, 112, 0.22)",
+              "op": "gt",
+              "value": 0
+            }
+          ],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Packet size",
+          "tooltip": {
+            "msResolution": true,
+            "shared": true,
+            "sort": 0,
+            "value_type": "cumulative"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "none",
+              "label": "Packet Size (Bytes)",
+              "logBase": 2,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            }
+          ]
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": false,
+      "title": "New row",
+      "titleSize": "h6"
+    },
+    {
+      "collapse": false,
+      "height": 169,
+      "panels": [
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 4,
+          "editable": true,
+          "error": false,
+          "fill": 1,
+          "grid": {},
+          "height": "300px",
+          "id": 206,
+          "legend": {
+            "alignAsTable": true,
+            "avg": true,
+            "current": false,
+            "max": true,
+            "min": true,
+            "show": true,
+            "sortDesc": true,
+            "total": false,
+            "values": true
+          },
+          "lines": true,
+          "linewidth": 2,
+          "links": [],
+          "nullPointMode": "connected",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 6,
+          "stack": false,
+          "steppedLine": true,
+          "targets": [
+            {
+              "alias": "TG xe-0 Out packets",
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "hide": false,
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT mean(\"tg__0.collect_stats.xe0.out_packets\")  / 1000000 FROM \"tc_prox_baremetal_l3fwd-4\" WHERE $timeFilter GROUP BY time($interval) fill(null)",
+              "rawQuery": false,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.collect_stats.live_stats.xe0.out_packets"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  },
+                  {
+                    "params": [
+                      " / 1000000"
+                    ],
+                    "type": "math"
+                  }
+                ]
+              ],
+              "tags": []
+            },
+            {
+              "alias": "TG xe-1 Out packets",
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "hide": false,
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT mean(\"tg__0.collect_stats.live_stats.xe1.out_packets\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE $timeFilter GROUP BY time($interval) fill(null)",
+              "rawQuery": false,
+              "refId": "B",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.collect_stats.live_stats.xe1.out_packets"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  },
+                  {
+                    "params": [
+                      " / 1000000"
+                    ],
+                    "type": "math"
+                  }
+                ]
+              ],
+              "tags": []
+            },
+            {
+              "alias": "TG xe-2 Out packets",
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "hide": false,
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT mean(\"tg__0.collect_stats.xe2.out_packets\")  / 1000000 FROM \"tc_prox_baremetal_l3fwd-4\" WHERE $timeFilter GROUP BY time($interval) fill(null)",
+              "rawQuery": false,
+              "refId": "C",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.collect_stats.live_stats.xe2.out_packets"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  },
+                  {
+                    "params": [
+                      " / 1000000"
+                    ],
+                    "type": "math"
+                  }
+                ]
+              ],
+              "tags": []
+            },
+            {
+              "alias": "TG xe-3 Out packets",
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT mean(\"tg__0.collect_stats.xe3.out_packets\")  / 1000000 FROM \"tc_prox_baremetal_l3fwd-4\" WHERE $timeFilter GROUP BY time($interval) fill(null)",
+              "rawQuery": false,
+              "refId": "D",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.collect_stats.live_stats.xe3.out_packets"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  },
+                  {
+                    "params": [
+                      " / 1000000"
+                    ],
+                    "type": "math"
+                  }
+                ]
+              ],
+              "tags": []
+            }
+          ],
+          "thresholds": [
+            {
+              "colorMode": "custom",
+              "fill": true,
+              "fillColor": "rgba(216, 200, 27, 0.27)",
+              "op": "gt",
+              "value": 0
+            },
+            {
+              "colorMode": "custom",
+              "fill": true,
+              "fillColor": "rgba(234, 112, 112, 0.22)",
+              "op": "gt",
+              "value": 0
+            }
+          ],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Packets Sent by Generator per second and per interface",
+          "tooltip": {
+            "msResolution": true,
+            "shared": true,
+            "sort": 0,
+            "value_type": "cumulative"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": "Million Packets  Per Second",
+              "logBase": 1,
+              "max": null,
+              "min": "0",
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 4,
+          "editable": true,
+          "error": false,
+          "fill": 1,
+          "grid": {},
+          "height": "300px",
+          "id": 207,
           "legend": {
             "alignAsTable": true,
             "avg": true,
           "spaceLength": 10,
           "span": 6,
           "stack": false,
-          "steppedLine": true,
+          "steppedLine": false,
           "targets": [
             {
-              "alias": "Load Requested to Generator",
+              "alias": "TG xe-0 in packets",
               "dsType": "influxdb",
               "groupBy": [
                 {
               "measurement": "tc_prox_baremetal_l3fwd-4",
               "orderByTime": "ASC",
               "policy": "default",
+              "query": "SELECT mean(\"tg__0.collect_stats.xe0.in_packets\")  / 1000000 FROM \"tc_prox_baremetal_l3fwd-4\" WHERE $timeFilter GROUP BY time($interval) fill(null)",
+              "rawQuery": false,
               "refId": "A",
               "resultFormat": "time_series",
               "select": [
                 [
                   {
                     "params": [
-                      "tg__0.collect_stats.RequestedTxThroughput"
+                      "tg__0.collect_stats.live_stats.xe0.in_packets"
                     ],
                     "type": "field"
                   },
                   {
                     "params": [],
                     "type": "mean"
+                  },
+                  {
+                    "params": [
+                      " / 1000000"
+                    ],
+                    "type": "math"
                   }
                 ]
               ],
               "tags": []
             },
             {
-              "alias": "Load Generated (by the Generator)",
+              "alias": "TG xe-1 in packets",
               "dsType": "influxdb",
               "groupBy": [
                 {
               "measurement": "tc_prox_baremetal_l3fwd-4",
               "orderByTime": "ASC",
               "policy": "default",
-              "refId": "A",
+              "query": "SELECT mean(\"tg__0.collect_stats.live_stats.xe1.in_packets\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE $timeFilter GROUP BY time($interval) fill(null)",
+              "rawQuery": false,
+              "refId": "B",
               "resultFormat": "time_series",
               "select": [
                 [
                   {
                     "params": [
-                      "tg__0.TxThroughput"
+                      "tg__0.collect_stats.live_stats.xe1.in_packets"
                     ],
                     "type": "field"
                   },
                   {
                     "params": [],
                     "type": "mean"
+                  },
+                  {
+                    "params": [
+                      " / 1000000"
+                    ],
+                    "type": "math"
                   }
                 ]
               ],
               "tags": []
             },
             {
-              "alias": "Load Received (by the Generator)",
+              "alias": "TG xe-2 in packets",
               "dsType": "influxdb",
               "groupBy": [
                 {
                   "type": "fill"
                 }
               ],
-              "hide": false,
               "measurement": "tc_prox_baremetal_l3fwd-4",
               "orderByTime": "ASC",
               "policy": "default",
-              "refId": "B",
+              "query": "SELECT mean(\"tg__0.collect_stats.live_stats.xe2.in_packets\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE $timeFilter GROUP BY time($interval) fill(null)",
+              "rawQuery": false,
+              "refId": "C",
               "resultFormat": "time_series",
               "select": [
                 [
                   {
                     "params": [
-                      "tg__0.RxThroughput"
+                      "tg__0.collect_stats.live_stats.xe2.in_packets"
                     ],
                     "type": "field"
                   },
                   {
                     "params": [],
                     "type": "mean"
+                  },
+                  {
+                    "params": [
+                      " / 1000000"
+                    ],
+                    "type": "math"
                   }
                 ]
               ],
               "tags": []
-            }
-          ],
-          "thresholds": [
-            {
-              "colorMode": "custom",
-              "fill": true,
-              "fillColor": "rgba(216, 200, 27, 0.27)",
-              "op": "gt",
-              "value": 0
-            },
-            {
-              "colorMode": "custom",
-              "fill": true,
-              "fillColor": "rgba(234, 112, 112, 0.22)",
-              "op": "gt",
-              "value": 0
-            }
-          ],
-          "timeFrom": null,
-          "timeShift": null,
-          "title": "Generator stats",
-          "tooltip": {
-            "msResolution": true,
-            "shared": true,
-            "sort": 0,
-            "value_type": "cumulative"
-          },
-          "transparent": false,
-          "type": "graph",
-          "xaxis": {
-            "buckets": null,
-            "mode": "time",
-            "name": null,
-            "show": true,
-            "values": []
-          },
-          "yaxes": [
-            {
-              "format": "short",
-              "label": "Million Packets Per Second",
-              "logBase": 1,
-              "max": null,
-              "min": "0",
-              "show": true
             },
             {
-              "format": "short",
-              "label": null,
-              "logBase": 1,
-              "max": null,
-              "min": null,
-              "show": false
-            }
-          ]
-        },
-        {
-          "aliasColors": {},
-          "bars": false,
-          "dashLength": 10,
-          "dashes": false,
-          "datasource": "${DS_YARDSTICK}",
-          "editable": true,
-          "error": false,
-          "fill": 1,
-          "grid": {},
-          "height": "300px",
-          "id": 5,
-          "legend": {
-            "alignAsTable": true,
-            "avg": true,
-            "current": false,
-            "max": true,
-            "min": true,
-            "show": true,
-            "total": false,
-            "values": true
-          },
-          "lines": true,
-          "linewidth": 2,
-          "links": [],
-          "nullPointMode": "connected",
-          "percentage": false,
-          "pointradius": 5,
-          "points": false,
-          "renderer": "flot",
-          "seriesOverrides": [],
-          "spaceLength": 10,
-          "span": 6,
-          "stack": false,
-          "steppedLine": true,
-          "targets": [
-            {
-              "alias": "Packet Size",
+              "alias": "TG xe-3 in packets",
               "dsType": "influxdb",
               "groupBy": [
                 {
               "measurement": "tc_prox_baremetal_l3fwd-4",
               "orderByTime": "ASC",
               "policy": "default",
-              "refId": "A",
+              "query": "SELECT mean(\"tg__0.collect_stats.live_stats.xe3.in_packets\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE $timeFilter GROUP BY time($interval) fill(null)",
+              "rawQuery": false,
+              "refId": "D",
               "resultFormat": "time_series",
               "select": [
                 [
                   {
                     "params": [
-                      "tg__0.collect_stats.PktSize"
+                      "tg__0.collect_stats.live_stats.xe3.in_packets"
                     ],
                     "type": "field"
                   },
                   {
                     "params": [],
                     "type": "mean"
+                  },
+                  {
+                    "params": [
+                      " / 1000000"
+                    ],
+                    "type": "math"
                   }
                 ]
               ],
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Packet size",
+          "title": "Packets Received by Generator per second and per interface",
           "tooltip": {
             "msResolution": true,
             "shared": true,
           },
           "yaxes": [
             {
-              "format": "none",
-              "label": "Packet Size (Bytes)",
-              "logBase": 2,
+              "format": "short",
+              "label": "Million Packets Per Second",
+              "logBase": 1,
               "max": null,
-              "min": null,
+              "min": "0",
               "show": true
             },
             {
               "show": true
             }
           ]
-        }
-      ],
-      "repeat": null,
-      "repeatIteration": null,
-      "repeatRowId": null,
-      "showTitle": false,
-      "title": "New row",
-      "titleSize": "h6"
-    },
-    {
-      "collapse": false,
-      "height": 169,
-      "panels": [
+        },
         {
           "aliasColors": {},
           "bars": false,
             "min": true,
             "rightSide": false,
             "show": true,
-            "sortDesc": true,
+            "sortDesc": false,
             "total": false,
             "values": true
           },
           ]
         },
         {
-          "content": "<h5 style=\"font-family:Verdana\"> <a style=\"color:#31A7D3\"><a style=\"font: 22px '#31A7D3'\"><center>Prox L3Fwd Traffic Gen stats</center> </a></h5>\n",
+          "content": "<h5 style=\"font-family:Verdana\"> <a style=\"color:#31A7D3\"><a style=\"font: 22px '#31A7D3'\"><center>Generator Stats: Packets per Step</center> </a></h5>\n",
           "editable": true,
           "error": false,
           "height": "40",
                   "type": "fill"
                 }
               ],
+              "hide": false,
               "measurement": "tc_prox_baremetal_l3fwd-4",
               "orderByTime": "ASC",
               "policy": "default",
               "query": "SELECT mean(\"tg__0.collect_stats.xe0.out_packets\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE $timeFilter GROUP BY time($interval) fill(null)",
-              "rawQuery": true,
+              "rawQuery": false,
               "refId": "A",
               "resultFormat": "time_series",
               "select": [
                   {
                     "params": [],
                     "type": "mean"
+                  },
+                  {
+                    "params": [
+                      " / 1000000"
+                    ],
+                    "type": "math"
                   }
                 ]
               ],
                   "type": "fill"
                 }
               ],
+              "hide": false,
               "measurement": "tc_prox_baremetal_l3fwd-4",
               "orderByTime": "ASC",
               "policy": "default",
               "query": "SELECT mean(\"tg__0.collect_stats.xe1.out_packets\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE $timeFilter GROUP BY time($interval) fill(null)",
-              "rawQuery": true,
+              "rawQuery": false,
               "refId": "B",
               "resultFormat": "time_series",
               "select": [
                   {
                     "params": [],
                     "type": "mean"
+                  },
+                  {
+                    "params": [
+                      " / 1000000"
+                    ],
+                    "type": "math"
                   }
                 ]
               ],
                   "type": "fill"
                 }
               ],
+              "hide": false,
               "measurement": "tc_prox_baremetal_l3fwd-4",
               "orderByTime": "ASC",
               "policy": "default",
               "query": "SELECT mean(\"tg__0.collect_stats.xe2.out_packets\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE $timeFilter GROUP BY time($interval) fill(null)",
-              "rawQuery": true,
+              "rawQuery": false,
               "refId": "C",
               "resultFormat": "time_series",
               "select": [
                   {
                     "params": [],
                     "type": "mean"
+                  },
+                  {
+                    "params": [
+                      " / 1000000"
+                    ],
+                    "type": "math"
                   }
                 ]
               ],
               "orderByTime": "ASC",
               "policy": "default",
               "query": "SELECT mean(\"tg__0.collect_stats.xe3.out_packets\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE $timeFilter GROUP BY time($interval) fill(null)",
-              "rawQuery": true,
+              "rawQuery": false,
               "refId": "D",
               "resultFormat": "time_series",
               "select": [
                   {
                     "params": [],
                     "type": "mean"
+                  },
+                  {
+                    "params": [
+                      " / 1000000"
+                    ],
+                    "type": "math"
                   }
                 ]
               ],
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Packets Sent by Generator",
+          "title": "Packets Sent by Generator per Step",
           "tooltip": {
             "msResolution": true,
             "shared": true,
           "yaxes": [
             {
               "format": "short",
-              "label": "Packets ",
+              "label": "Million Packets  Per Step",
               "logBase": 1,
               "max": null,
               "min": "0",
           "dashLength": 10,
           "dashes": false,
           "datasource": "${DS_YARDSTICK}",
+          "decimals": 4,
           "editable": true,
           "error": false,
           "fill": 1,
             "max": true,
             "min": true,
             "show": true,
+            "sortDesc": true,
             "total": false,
             "values": true
           },
               "orderByTime": "ASC",
               "policy": "default",
               "query": "SELECT mean(\"tg__0.collect_stats.xe0.in_packets\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE $timeFilter GROUP BY time($interval) fill(null)",
-              "rawQuery": true,
+              "rawQuery": false,
               "refId": "A",
               "resultFormat": "time_series",
               "select": [
                   {
                     "params": [],
                     "type": "mean"
+                  },
+                  {
+                    "params": [
+                      " / 1000000"
+                    ],
+                    "type": "math"
                   }
                 ]
               ],
               "orderByTime": "ASC",
               "policy": "default",
               "query": "SELECT mean(\"tg__0.collect_stats.xe1.in_packets\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE $timeFilter GROUP BY time($interval) fill(null)",
-              "rawQuery": true,
+              "rawQuery": false,
               "refId": "B",
               "resultFormat": "time_series",
               "select": [
                   {
                     "params": [],
                     "type": "mean"
+                  },
+                  {
+                    "params": [
+                      " / 1000000"
+                    ],
+                    "type": "math"
                   }
                 ]
               ],
               "orderByTime": "ASC",
               "policy": "default",
               "query": "SELECT mean(\"tg__0.collect_stats.xe2.in_packets\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE $timeFilter GROUP BY time($interval) fill(null)",
-              "rawQuery": true,
+              "rawQuery": false,
               "refId": "C",
               "resultFormat": "time_series",
               "select": [
                   {
                     "params": [],
                     "type": "mean"
+                  },
+                  {
+                    "params": [
+                      " / 1000000"
+                    ],
+                    "type": "math"
                   }
                 ]
               ],
               "orderByTime": "ASC",
               "policy": "default",
               "query": "SELECT mean(\"tg__0.collect_stats.xe3.in_packets\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE $timeFilter GROUP BY time($interval) fill(null)",
-              "rawQuery": true,
+              "rawQuery": false,
               "refId": "D",
               "resultFormat": "time_series",
               "select": [
                   {
                     "params": [],
                     "type": "mean"
+                  },
+                  {
+                    "params": [
+                      " / 1000000"
+                    ],
+                    "type": "math"
                   }
                 ]
               ],
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Packets Received by Generator",
+          "title": "Packets Received by Generator per Step",
           "tooltip": {
             "msResolution": true,
             "shared": true,
           "yaxes": [
             {
               "format": "short",
-              "label": "Packets Per Second",
+              "label": "Million Packets Per Step",
               "logBase": 1,
               "max": null,
               "min": "0",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
               "measurement": "tc_prox_baremetal_l3fwd-4",
               "orderByTime": "ASC",
               "policy": "default",
-              "query": "SELECT  last(\"tg__0.collect_stats.theor_max_throughput\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.collect_stats.PktSize\" = 64 AND \"tg__0.collect_stats.Status\" = 'Result' AND $timeFilter GROUP BY time($__interval) fill(null)",
+              "query": "SELECT  last(\"tg__0.collect_stats.theor_max_throughput\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.collect_stats.PktSize\" = 64  AND \"tg__0.collect_stats.Status\" = 'Result' AND $timeFilter GROUP BY time($__interval) fill(null)",
               "rawQuery": true,
               "refId": "A",
               "resultFormat": "time_series",
                 [
                   {
                     "params": [
-                      "tg__0.collect_stats.theor_max_throughput"
+                      "tg__0.collect_stats.RequestedTxThroughput"
                     ],
                     "type": "field"
                   },
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
           "thresholds": "",
           "title": "",
           "type": "singlestat",
-          "valueFontSize": "50%",
+          "valueFontSize": "30%",
           "valueMaps": [
             {
               "op": "=",
     "list": []
   },
   "time": {
-    "from": "2018-09-04T00:52:16.948Z",
-    "to": "2018-09-04T12:52:16.948Z"
+    "from": "now-3h",
+    "to": "now"
   },
   "timepicker": {
     "refresh_intervals": [
   },
   "timezone": "browser",
   "title": "Prox_BM_L3FWD-4Port",
-  "version": 3
+  "version": 6
 }
\ No newline at end of file
index f924cf4..402bf74 100644 (file)
@@ -168,8 +168,8 @@ class ProxBinSearchProfile(ProxProfile):
 
                 samples = result.get_samples(pkt_size, successful_pkt_loss, port_samples)
 
-                if theor_max_thruput < samples["TxThroughput"]:
-                    theor_max_thruput = samples['TxThroughput']
+                if theor_max_thruput < samples["RequestedTxThroughput"]:
+                    theor_max_thruput = samples['RequestedTxThroughput']
                 samples['theor_max_throughput'] = theor_max_thruput
 
                 samples["rx_total"] = int(result.rx_total)
index 8d721c0..e9d8362 100644 (file)
@@ -601,6 +601,99 @@ class ProxSocketHelper(object):
         LOG.debug("Multi port packet ..OK.. %s", tot_result)
         return True, tot_result
 
+    @staticmethod
+    def multi_port_stats_tuple(stats, ports):
+        """
+        Create a statistics tuple from port stats.
+
+        Returns a dict with contains the port stats indexed by port name
+
+        :param stats: (List) - List of List of port stats in pps
+        :param ports (Iterator) - to List of Ports
+
+        :return: (Dict) of port stats indexed by port_name
+        """
+
+        samples = {}
+        port_names = {}
+        try:
+            port_names = {port_num: port_name for port_name, port_num in ports}
+        except (TypeError, IndexError, KeyError):
+            LOG.critical("Ports are not initialized or number of port is ZERO ... CRITICAL ERROR")
+            return {}
+
+        try:
+            for stat in stats:
+                port_num = stat[0]
+                samples[port_names[port_num]] = {
+                    "in_packets": stat[1],
+                    "out_packets": stat[2]}
+        except (TypeError, IndexError, KeyError):
+            LOG.error("Ports data and samples data is incompatable ....")
+            return {}
+
+        return samples
+
+    @staticmethod
+    def multi_port_stats_diff(prev_stats, new_stats, hz):
+        """
+        Create a statistics tuple from difference between prev port stats
+        and current port stats. And store results in pps.
+
+        :param prev_stats: (List) - Previous List of port statistics
+        :param new_stats: (List) - Current List of port statistics
+        :param hz (float) - speed of system in Hz
+
+        :return: sample (List) - Difference of prev_port_stats and
+                new_port_stats  in pps
+        """
+
+        RX_TOTAL_INDEX = 1
+        TX_TOTAL_INDEX = 2
+        TSC_INDEX = 5
+
+        stats = []
+
+        if len(prev_stats) is not len(new_stats):
+            for port_index, stat in enumerate(new_stats):
+                stats.append([port_index, float(0), float(0), 0, 0, 0])
+            return stats
+
+        try:
+            for port_index, stat in enumerate(new_stats):
+                if stat[RX_TOTAL_INDEX] > prev_stats[port_index][RX_TOTAL_INDEX]:
+                    rx_total = stat[RX_TOTAL_INDEX] - \
+                               prev_stats[port_index][RX_TOTAL_INDEX]
+                else:
+                    rx_total = stat[RX_TOTAL_INDEX]
+
+                if stat[TX_TOTAL_INDEX] > prev_stats[port_index][TX_TOTAL_INDEX]:
+                    tx_total = stat[TX_TOTAL_INDEX] - prev_stats[port_index][TX_TOTAL_INDEX]
+                else:
+                    tx_total = stat[TX_TOTAL_INDEX]
+
+                if stat[TSC_INDEX] > prev_stats[port_index][TSC_INDEX]:
+                    tsc = stat[TSC_INDEX] - prev_stats[port_index][TSC_INDEX]
+                else:
+                    tsc = stat[TSC_INDEX]
+
+                if tsc is 0:
+                    rx_total = tx_total = float(0)
+                else:
+                    if hz is 0:
+                        LOG.error("HZ is ZERO ..")
+                        rx_total = tx_total = float(0)
+                    else:
+                        rx_total = float(rx_total * hz / tsc)
+                        tx_total = float(tx_total * hz / tsc)
+
+                stats.append([port_index, rx_total, tx_total, 0, 0, tsc])
+        except (TypeError, IndexError, KeyError):
+            stats = []
+            LOG.info("Current Port Stats incompatable to previous Port stats .. Discarded")
+
+        return stats
+
     def port_stats(self, ports):
         """get counter values from a specific port"""
         tot_result = [0] * 12
@@ -968,6 +1061,8 @@ class ProxResourceHelper(ClientResourceHelper):
         self.step_delta = 1
         self.step_time = 0.5
         self._test_type = None
+        self.prev_multi_port = []
+        self.prev_hz = 0
 
     @property
     def sut(self):
@@ -1006,11 +1101,40 @@ class ProxResourceHelper(ClientResourceHelper):
     def collect_collectd_kpi(self):
         return self._collect_resource_kpi()
 
+    def collect_live_stats(self):
+        ports = []
+        for _, port_num in self.vnfd_helper.ports_iter():
+            ports.append(port_num)
+
+        ok, curr_port_stats = self.sut.multi_port_stats(ports)
+        if not ok:
+            return False, {}
+
+        hz = self.sut.hz()
+        if hz is 0:
+            hz = self.prev_hz
+        else:
+            self.prev_hz = hz
+
+        new_all_port_stats = \
+            self.sut.multi_port_stats_diff(self.prev_multi_port, curr_port_stats, hz)
+
+        self.prev_multi_port = curr_port_stats
+
+        live_stats = self.sut.multi_port_stats_tuple(new_all_port_stats,
+                                                     self.vnfd_helper.ports_iter())
+        return True, live_stats
+
     def collect_kpi(self):
         result = super(ProxResourceHelper, self).collect_kpi()
         # add in collectd kpis manually
         if result:
             result['collect_stats'] = self._collect_resource_kpi()
+
+        ok, live_stats = self.collect_live_stats()
+        if ok:
+            result.update({'live_stats': live_stats})
+
         return result
 
     def terminate(self):
index 4524eb7..f176563 100644 (file)
@@ -21,6 +21,8 @@ from yardstick.network_services.traffic_profile import prox_binsearch
 
 class TestProxBinSearchProfile(unittest.TestCase):
 
+    THEOR_MAX_THROUGHPUT = 0.00012340000000000002
+
     def setUp(self):
         self._mock_log_info = mock.patch.object(prox_binsearch.LOG, 'info')
         self.mock_log_info = self._mock_log_info.start()
@@ -80,7 +82,7 @@ class TestProxBinSearchProfile(unittest.TestCase):
 
         # Result Samples inc theor_max
         result_tuple = {'Actual_throughput': 5e-07,
-                        'theor_max_throughput': 7.5e-07,
+                        'theor_max_throughput': self.THEOR_MAX_THROUGHPUT,
                         'PktSize': 200,
                         'Status': 'Result'}
 
@@ -96,7 +98,7 @@ class TestProxBinSearchProfile(unittest.TestCase):
                                 "PktSize": 200,
                                 "RxThroughput": 7.5e-07,
                                 "Throughput": 7.5e-07,
-                                "TxThroughput": 0.00012340000000000002,
+                                "TxThroughput": self.THEOR_MAX_THROUGHPUT,
                                 "Status": 'Success'}
 
         calls = profile.queue.put(success_result_tuple)
@@ -222,6 +224,7 @@ class TestProxBinSearchProfile(unittest.TestCase):
                 raise RuntimeError(' '.join([str(args), str(runs)]))
             if args[2] > 75.0:
                 return fail_tuple, {}
+
             return success_tuple, {}
 
         tp_config = {
@@ -258,7 +261,7 @@ class TestProxBinSearchProfile(unittest.TestCase):
 
         # Result Samples inc theor_max
         result_tuple = {'Actual_throughput': 5e-07,
-                        'theor_max_throughput': 7.5e-07,
+                        'theor_max_throughput': self.THEOR_MAX_THROUGHPUT,
                         'PktSize': 200,
                         "Status": 'Result'}
 
@@ -274,7 +277,7 @@ class TestProxBinSearchProfile(unittest.TestCase):
                                 "PktSize": 200,
                                 "RxThroughput": 7.5e-07,
                                 "Throughput": 7.5e-07,
-                                "TxThroughput": 0.00012340000000000002,
+                                "TxThroughput": self.THEOR_MAX_THROUGHPUT,
                                 "Status": 'Success'}
 
         calls = profile.queue.put(success_result_tuple)
index 894b16e..6d1d8c6 100644 (file)
@@ -648,6 +648,82 @@ class TestProxSocketHelper(unittest.TestCase):
         self.assertListEqual(result, expected)
         self.assertTrue(ok)
 
+    @mock.patch.object(prox_helpers.LOG, 'error')
+    def test_multi_port_stats_diff(self, *args):
+        mock_socket = mock.MagicMock()
+        prox = prox_helpers.ProxSocketHelper(mock_socket)
+        prox.get_string = mock.MagicMock(return_value=(True, '0,1,2,3,4,5;1,1,2,3,4,5'))
+        _, t1 = prox.multi_port_stats([0, 1])
+
+        prox.get_string = mock.MagicMock(return_value=(True, '0,2,4,6,8,6;1,4,8,16,32,6'))
+        _, t2 = prox.multi_port_stats([0, 1])
+
+        prox.get_string = mock.MagicMock(return_value=(True, '0,1,1,1,1,1;1,1,1,1,1,1'))
+        _, t3 = prox.multi_port_stats([0, 1])
+
+        prox.get_string = mock.MagicMock(return_value=(True, '0,2,2,2,2,2;1,2,2,2,2,2'))
+        _, t4 = prox.multi_port_stats([0, 1])
+
+        expected = [[0, 1.0, 2.0, 0, 0, 1], [1, 3.0, 6.0, 0, 0, 1]]
+        result = prox.multi_port_stats_diff(t1, t2, 1)
+
+        self.assertListEqual(result, expected)
+
+        result = prox.multi_port_stats_diff(t4, t3, 1)
+        expected = [[0, 1.0, 1.0, 0, 0, 1], [1, 1.0, 1.0, 0, 0, 1]]
+
+        self.assertListEqual(result, expected)
+
+        prox.get_string = mock.MagicMock(return_value=(True, '0,2,4,6,8,10'))
+        ok, t5 = prox.multi_port_stats([0, 1])
+        self.assertFalse(ok)
+        self.assertListEqual(t5, [])
+
+        result = prox.multi_port_stats_diff(t5, t4, 1)
+        expected = [[0, 0.0, 0.0, 0, 0, 0], [1, 0.0, 0.0, 0, 0, 0]]
+        self.assertListEqual(result, expected)
+
+        prox.get_string = mock.MagicMock(return_value=(True, '0,10,10,20,30,0;1,30,40,50,60,0'))
+        _, t6 = prox.multi_port_stats([0, 1])
+
+        prox.get_string = \
+            mock.MagicMock(return_value=(True, '0,100,100,100,100,0;1,100,100,100,100,0'))
+        _, t7 = prox.multi_port_stats([0, 1])
+
+        result = prox.multi_port_stats_diff(t6, t7, 1)
+        expected = [[0, 0.0, 0.0, 0, 0, 0], [1, 0.0, 0.0, 0, 0, 0]]
+        self.assertListEqual(result, expected)
+
+        result = prox.multi_port_stats_diff(t1, t2, 0)
+        expected = [[0, 0.0, 0.0, 0, 0, 1], [1, 0.0, 0.0, 0, 0, 1]]
+        self.assertListEqual(result, expected)
+
+    @mock.patch.object(prox_helpers.LOG, 'error')
+    def test_multi_port_stats_tuple(self, *args):
+        mock_socket = mock.MagicMock()
+        prox = prox_helpers.ProxSocketHelper(mock_socket)
+        prox.get_string = mock.MagicMock(return_value=(True, '0,1,2,3,4,5;1,1,2,3,4,5'))
+        _, result1 = prox.multi_port_stats([0, 1])
+        prox.get_string = mock.MagicMock(return_value=(True, '0,2,4,6,8,6;1,4,8,16,32,6'))
+        _, result2 = prox.multi_port_stats([0, 1])
+
+        result = prox.multi_port_stats_diff(result1, result2, 1)
+
+        vnfd_helper = mock.MagicMock()
+        vnfd_helper.ports_iter.return_value = [('xe0', 0), ('xe1', 1)]
+
+        expected = {'xe0': {'in_packets': 1.0, 'out_packets': 2.0},
+                    'xe1': {'in_packets': 3.0, 'out_packets': 6.0}}
+        live_stats = prox.multi_port_stats_tuple(result, vnfd_helper.ports_iter())
+        self.assertDictEqual(live_stats, expected)
+
+        live_stats = prox.multi_port_stats_tuple(result, None)
+        expected = {}
+        self.assertDictEqual(live_stats, expected)
+
+        live_stats = prox.multi_port_stats_tuple(None, vnfd_helper.ports_iter())
+        self.assertDictEqual(live_stats, expected)
+
     def test_port_stats(self):
         port_stats = [
             ','.join(str(n) for n in range(3, 15)),
@@ -1568,8 +1644,83 @@ class TestProxResourceHelper(unittest.TestCase):
         helper = prox_helpers.ProxResourceHelper(mock.MagicMock())
         helper._queue = queue = mock.MagicMock()
         helper._result = {'z': 123}
+
+        helper.client = mock.MagicMock()
+        helper.client.hz.return_value = 1
+        helper.client.multi_port_stats.return_value = \
+            (True, [[0, 1, 2, 3, 4, 5], [1, 1, 2, 3, 4, 5]])
+        helper.client.multi_port_stats_diff.return_value = \
+            ([0, 1, 2, 3, 4, 5, 6, 7])
+        helper.client.multi_port_stats_tuple.return_value = \
+            {"xe0": {"in_packets": 1, "out_packets": 2}}
+        helper.resource = resource = mock.MagicMock()
+
+        vnfd_helper = mock.MagicMock()
+        vnfd_helper.ports_iter.return_value = [('xe0', 0), ('xe1', 1)]
+        helper.vnfd_helper = vnfd_helper
+
+        resource.check_if_system_agent_running.return_value = 0, '1234'
+        resource.amqp_collect_nfvi_kpi.return_value = 543
+        resource.check_if_system_agent_running.return_value = (0, None)
+
+        queue.empty.return_value = False
+        queue.get.return_value = {'a': 789}
+
+        expected = {'z': 123, 'a': 789,
+                    'collect_stats': {'core': 543},
+                    'live_stats': {'xe0': {'in_packets': 1, 'out_packets': 2}}}
+        result = helper.collect_kpi()
+        self.assertDictEqual(result, expected)
+
+    def test_collect_kpi_no_hz(self):
+        helper = prox_helpers.ProxResourceHelper(mock.MagicMock())
+        helper._queue = queue = mock.MagicMock()
+        helper._result = {'z': 123}
+
+        helper.client = mock.MagicMock()
+        helper.client.multi_port_stats.return_value = \
+            (True, [[0, 1, 2, 3, 4, 5], [1, 1, 2, 3, 4, 5]])
+        helper.client.multi_port_stats_diff.return_value = \
+            ([0, 1, 2, 3, 4, 5, 6, 7])
+        helper.client.multi_port_stats_tuple.return_value = \
+            {"xe0": {"in_packets": 1, "out_packets": 2}}
+        helper.resource = resource = mock.MagicMock()
+
+        vnfd_helper = mock.MagicMock()
+        vnfd_helper.ports_iter.return_value = [('xe0', 0), ('xe1', 1)]
+        helper.vnfd_helper = vnfd_helper
+
+        resource.check_if_system_agent_running.return_value = 0, '1234'
+        resource.amqp_collect_nfvi_kpi.return_value = 543
+        resource.check_if_system_agent_running.return_value = (0, None)
+
+        queue.empty.return_value = False
+        queue.get.return_value = {'a': 789}
+
+        expected = {'z': 123, 'a': 789,
+                    'collect_stats': {'core': 543},
+                    'live_stats': {'xe0': {'in_packets': 1, 'out_packets': 2}}}
+        result = helper.collect_kpi()
+        self.assertDictEqual(result, expected)
+
+    def test_collect_kpi_bad_data(self):
+        helper = prox_helpers.ProxResourceHelper(mock.MagicMock())
+        helper._queue = queue = mock.MagicMock()
+        helper._result = {'z': 123}
+
+        helper.client = mock.MagicMock()
+        helper.client.multi_port_stats.return_value = \
+            (False, [[0, 1, 2, 3, 4, 5], [1, 1, 2, 3, 4, 5]])
+        helper.client.multi_port_stats_diff.return_value = \
+            ([0, 1, 2, 3, 4, 5, 6, 7])
+        helper.client.multi_port_stats_tuple.return_value = \
+            {"xe0": {"in_packets": 1, "out_packets": 2}}
         helper.resource = resource = mock.MagicMock()
 
+        vnfd_helper = mock.MagicMock()
+        vnfd_helper.ports_iter.return_value = [('xe0', 0), ('xe1', 1)]
+        helper.vnfd_helper = vnfd_helper
+
         resource.check_if_system_agent_running.return_value = 0, '1234'
         resource.amqp_collect_nfvi_kpi.return_value = 543
         resource.check_if_system_agent_running.return_value = (0, None)
@@ -1577,7 +1728,8 @@ class TestProxResourceHelper(unittest.TestCase):
         queue.empty.return_value = False
         queue.get.return_value = {'a': 789}
 
-        expected = {'z': 123, 'a': 789, 'collect_stats': {'core': 543}}
+        expected = {'z': 123, 'a': 789,
+                    'collect_stats': {'core': 543}}
         result = helper.collect_kpi()
         self.assertDictEqual(result, expected)
 
index a7e61da..935d3fa 100644 (file)
@@ -329,13 +329,27 @@ class TestProxTrafficGen(unittest.TestCase):
         }
         prox_traffic_gen._vnf_wrapper.resource_helper.resource = mock.MagicMock(
             **{"self.check_if_system_agent_running.return_value": [False]})
+
+        vnfd_helper = mock.MagicMock()
+        vnfd_helper.ports_iter.return_value = [('xe0', 0), ('xe1', 1)]
+        prox_traffic_gen.resource_helper.vnfd_helper = vnfd_helper
+
+        prox_traffic_gen._vnf_wrapper.resource_helper.client = mock.MagicMock()
+        prox_traffic_gen._vnf_wrapper.resource_helper.client.multi_port_stats.return_value = \
+            [[0, 1, 2, 3, 4, 5], [1, 1, 2, 3, 4, 5]]
+        prox_traffic_gen._vnf_wrapper.resource_helper.client.multi_port_stats_diff.return_value = \
+            [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7]
+        prox_traffic_gen._vnf_wrapper.resource_helper.client.\
+            multi_port_stats_tuple.return_value = \
+                {"xe0": {"in_packets": 1, "out_packets": 2}}
+
         prox_traffic_gen._vnf_wrapper.vnf_execute = mock.Mock(return_value="")
         expected = {
-            'collect_stats': {},
+            'collect_stats': {'live_stats': {'xe0': {'in_packets': 1, 'out_packets': 2}}},
             'physical_node': 'mock_node'
         }
-        self.assertEqual(prox_traffic_gen.collect_kpi(), expected)
-
+        result = prox_traffic_gen.collect_kpi()
+        self.assertDictEqual(result, expected)
 
     @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file')
     @mock.patch(