Merge "Install dependencies: bare-metal, standalone"
authorEmma Foley <emma.l.foley@intel.com>
Thu, 14 Jun 2018 14:50:01 +0000 (14:50 +0000)
committerGerrit Code Review <gerrit@opnfv.org>
Thu, 14 Jun 2018 14:50:01 +0000 (14:50 +0000)
93 files changed:
INFO
INFO.yaml
ansible/roles/download_trex/defaults/main.yml
ansible/roles/install_trex/defaults/main.yml
dashboard/Prox_BM_L3FWD-4Port-1507803878020.json [deleted file]
dashboard/Prox_BM_L3FWD-4Port-1527840729877.json [new file with mode: 0644]
docker/Dockerfile
docker/Dockerfile.aarch64.patch
docs/release/release-notes/release-notes.rst
gui/bower.json
requirements.txt
samples/vnf_samples/nsut/prox/configs/gen_l2fwd-2.cfg
samples/vnf_samples/nsut/prox/configs/gen_l2fwd-4.cfg
samples/vnf_samples/nsut/prox/configs/gen_l3fwd-2.cfg
samples/vnf_samples/nsut/prox/configs/gen_l3fwd-4.cfg
samples/vnf_samples/nsut/prox/prox-tg-topology-scale-up.yaml [new file with mode: 0644]
samples/vnf_samples/nsut/prox/tc_prox_baremetal_acl-scale-up.yaml [new file with mode: 0644]
samples/vnf_samples/nsut/prox/tc_prox_baremetal_l2fwd-scale-up.yaml [new file with mode: 0644]
samples/vnf_samples/nsut/prox/tc_prox_baremetal_l3fwd-scale-up.yaml [new file with mode: 0644]
samples/vnf_samples/nsut/prox/tc_prox_baremetal_mpls_tagging-scale-up.yaml [new file with mode: 0644]
samples/vnf_samples/nsut/prox/tc_prox_heat_context_acl-scale-up.yaml [new file with mode: 0644]
samples/vnf_samples/nsut/prox/tc_prox_heat_context_l2fwd-l3fwd-scale-up.yaml [new file with mode: 0644]
samples/vnf_samples/nsut/prox/tc_prox_heat_context_l2fwd-scale-up.yaml [new file with mode: 0644]
samples/vnf_samples/nsut/prox/tc_prox_heat_context_l3fwd-scale-up.yaml [new file with mode: 0644]
samples/vnf_samples/nsut/prox/tc_prox_heat_context_mpls_tagging-scale-up.yaml [new file with mode: 0644]
tests/unit/__init__.py
yardstick/benchmark/contexts/standalone/model.py
yardstick/benchmark/contexts/standalone/sriov.py
yardstick/benchmark/scenarios/lib/create_image.py
yardstick/benchmark/scenarios/lib/delete_image.py
yardstick/benchmark/scenarios/networking/vnf_generic.py
yardstick/common/exceptions.py
yardstick/common/openstack_utils.py
yardstick/error.py [deleted file]
yardstick/network_services/helpers/dpdkbindnic_helper.py
yardstick/network_services/libs/ixia_libs/IxNet/IxNet.py [deleted file]
yardstick/network_services/libs/ixia_libs/ixnet/__init__.py [moved from tests/unit/network_services/vnf_generic/__init__.py with 100% similarity]
yardstick/network_services/libs/ixia_libs/ixnet/ixnet_api.py [new file with mode: 0644]
yardstick/network_services/traffic_profile/base.py
yardstick/network_services/traffic_profile/http_ixload.py
yardstick/network_services/traffic_profile/ixia_rfc2544.py
yardstick/network_services/traffic_profile/prox_binsearch.py
yardstick/network_services/vnf_generic/vnf/prox_helpers.py
yardstick/network_services/vnf_generic/vnf/prox_vnf.py
yardstick/network_services/vnf_generic/vnf/sample_vnf.py
yardstick/network_services/vnf_generic/vnf/tg_rfc2544_ixia.py
yardstick/network_services/vnf_generic/vnf/vpe_vnf.py
yardstick/ssh.py
yardstick/tests/unit/benchmark/contexts/standalone/test_model.py
yardstick/tests/unit/benchmark/contexts/standalone/test_ovs_dpdk.py
yardstick/tests/unit/benchmark/contexts/standalone/test_sriov.py
yardstick/tests/unit/benchmark/contexts/test_dummy.py
yardstick/tests/unit/benchmark/contexts/test_heat.py
yardstick/tests/unit/benchmark/contexts/test_kubernetes.py
yardstick/tests/unit/benchmark/contexts/test_node.py
yardstick/tests/unit/benchmark/core/test_task.py
yardstick/tests/unit/benchmark/scenarios/lib/test_create_image.py
yardstick/tests/unit/benchmark/scenarios/lib/test_delete_image.py
yardstick/tests/unit/benchmark/scenarios/networking/test_vnf_generic.py
yardstick/tests/unit/common/test_exceptions.py [new file with mode: 0644]
yardstick/tests/unit/common/test_openstack_utils.py
yardstick/tests/unit/common/test_utils.py
yardstick/tests/unit/network_services/helpers/test_dpdkbindnic_helper.py
yardstick/tests/unit/network_services/libs/ixia_libs/test_IxNet.py [deleted file]
yardstick/tests/unit/network_services/libs/ixia_libs/test_ixnet_api.py [new file with mode: 0644]
yardstick/tests/unit/network_services/nfvi/test_resource.py
yardstick/tests/unit/network_services/traffic_profile/test_base.py
yardstick/tests/unit/network_services/traffic_profile/test_ixia_rfc2544.py
yardstick/tests/unit/network_services/traffic_profile/test_prox_binsearch.py
yardstick/tests/unit/network_services/vnf_generic/__init__.py [moved from tests/unit/network_services/vnf_generic/vnf/__init__.py with 100% similarity]
yardstick/tests/unit/network_services/vnf_generic/test_vnfdgen.py [moved from tests/unit/network_services/vnf_generic/test_vnfdgen.py with 95% similarity]
yardstick/tests/unit/network_services/vnf_generic/vnf/__init__.py [moved from yardstick/network_services/libs/ixia_libs/IxNet/__init__.py with 100% similarity]
yardstick/tests/unit/network_services/vnf_generic/vnf/acl_1rule.yaml [moved from tests/unit/network_services/vnf_generic/vnf/acl_1rule.yaml with 100% similarity]
yardstick/tests/unit/network_services/vnf_generic/vnf/tc_baremetal_rfc2544_ipv4_1flow_64B.yaml [moved from tests/unit/network_services/vnf_generic/vnf/tc_baremetal_rfc2544_ipv4_1flow_64B.yaml with 100% similarity]
yardstick/tests/unit/network_services/vnf_generic/vnf/test_acl_vnf.py [moved from tests/unit/network_services/vnf_generic/vnf/test_acl_vnf.py with 98% similarity]
yardstick/tests/unit/network_services/vnf_generic/vnf/test_base.py [moved from tests/unit/network_services/vnf_generic/vnf/test_base.py with 99% similarity]
yardstick/tests/unit/network_services/vnf_generic/vnf/test_cgnapt_vnf.py [moved from tests/unit/network_services/vnf_generic/vnf/test_cgnapt_vnf.py with 94% similarity]
yardstick/tests/unit/network_services/vnf_generic/vnf/test_prox_helpers.py [moved from tests/unit/network_services/vnf_generic/vnf/test_prox_helpers.py with 97% similarity]
yardstick/tests/unit/network_services/vnf_generic/vnf/test_prox_vnf.py [moved from tests/unit/network_services/vnf_generic/vnf/test_prox_vnf.py with 99% similarity]
yardstick/tests/unit/network_services/vnf_generic/vnf/test_router_vnf.py [moved from tests/unit/network_services/vnf_generic/vnf/test_router_vnf.py with 98% similarity]
yardstick/tests/unit/network_services/vnf_generic/vnf/test_sample_vnf.py [moved from tests/unit/network_services/vnf_generic/vnf/test_sample_vnf.py with 99% similarity]
yardstick/tests/unit/network_services/vnf_generic/vnf/test_tg_ixload.py [moved from tests/unit/network_services/vnf_generic/vnf/test_tg_ixload.py with 93% similarity]
yardstick/tests/unit/network_services/vnf_generic/vnf/test_tg_ping.py [moved from tests/unit/network_services/vnf_generic/vnf/test_tg_ping.py with 98% similarity]
yardstick/tests/unit/network_services/vnf_generic/vnf/test_tg_prox.py [moved from tests/unit/network_services/vnf_generic/vnf/test_tg_prox.py with 99% similarity]
yardstick/tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_ixia.py [moved from tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_ixia.py with 66% similarity]
yardstick/tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_trex.py [moved from tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_trex.py with 98% similarity]
yardstick/tests/unit/network_services/vnf_generic/vnf/test_tg_trex.py [moved from tests/unit/network_services/vnf_generic/vnf/test_tg_trex.py with 77% similarity]
yardstick/tests/unit/network_services/vnf_generic/vnf/test_udp_replay.py [moved from tests/unit/network_services/vnf_generic/vnf/test_udp_replay.py with 97% similarity]
yardstick/tests/unit/network_services/vnf_generic/vnf/test_vfw_vnf.py [moved from tests/unit/network_services/vnf_generic/vnf/test_vfw_vnf.py with 99% similarity]
yardstick/tests/unit/network_services/vnf_generic/vnf/test_vpe_vnf.py [moved from tests/unit/network_services/vnf_generic/vnf/test_vpe_vnf.py with 98% similarity]
yardstick/tests/unit/service/test_environment.py
yardstick/tests/unit/test_cmd/test_NSBperf.py
yardstick/tests/unit/test_ssh.py

diff --git a/INFO b/INFO
index 9bcc292..63450ce 100644 (file)
--- a/INFO
+++ b/INFO
@@ -2,8 +2,8 @@ Project: Test framework for verifying infrastructure compliance (yardstick)
 Project Creation Date: April 28th, 2015
 Project Category: Integration & Testing
 Lifecycle State: Incubation
-Primary Contact: ross.b.brattain@intel.com
-Project Lead: ross.b.brattain@intel.com
+Primary Contact: limingjiang@huawei.com
+Project Lead: limingjiang@huawei.com
 Jira Project Name: Infrastructure Verification
 Jira Project Prefix: Yardstick
 Mailing list tag: [Yardstick]
index 677c470..a3780da 100644 (file)
--- a/INFO.yaml
+++ b/INFO.yaml
@@ -4,11 +4,11 @@ project_creation_date: 'April 28th, 2015'
 project_category: 'Integration & Testing'
 lifecycle_state: 'Incubation'
 project_lead: &opnfv_yardstick_ptl
-    name: 'Ross Brattain'
-    email: 'ross.b.brattain@intel.com'
-    id: 'rbbratta'
-    company: 'intel.com'
-    timezone: 'PST'
+    name: 'Rex Lee'
+    email: 'limingjiang@huawei.com'
+    company: 'huawei.com'
+    id: 'rexlee8776'
+    timezone: 'UTC+8'
 primary_contact: *opnfv_yardstick_ptl
 issue_tracking:
     type: 'jira'
@@ -24,12 +24,12 @@ realtime_discussion:
     channel: '#opnfv-yardstick'
 meetings:
     - type: 'gotomeeting+irc'
-      agenda:  'https://wiki.opnfv.org/display/yardstick/Yardstick+Meetings'
-      url:  'https://global.gotomeeting.com/join/819733085'
+      agenda: 'https://wiki.opnfv.org/display/yardstick/Yardstick+Meetings'
+      url: 'https://global.gotomeeting.com/join/819733085'
       server: 'freenode.net'
       channel: '#opnfv-yardstick'
       repeats: 'weekly'
-      time:  '08:30 UTC'
+      time: '08:30 UTC'
 repositories:
     - 'yardstick'
 committers:
@@ -38,10 +38,6 @@ committers:
       email: 'jean.gaoliang@huawei.com'
       company: 'huawei.com'
       id: 'kubi'
-    - name: 'Rex Lee'
-      email: 'limingjiang@huawei.com'
-      company: 'huawei.com'
-      id: 'rexlee8776'
     - name: 'Jing Lu'
       email: 'lvjing5@huawei.com'
       company: 'huawei.com'
@@ -74,6 +70,10 @@ committers:
       email: 'abhijit.sinha@intel.com'
       company: 'intel.com'
       id: 'abhijitsinha'
+    - name: 'Ross Brattain'
+      email: 'ross.b.brattain@intel.com'
+      id: 'rbbratta'
+      company: 'intel.com'
 tsc:
     # yamllint disable rule:line-length
     approval: 'http//meetbot.opnfv.org/meetings/'
index 6e8fa70..cbaae1d 100644 (file)
@@ -12,7 +12,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 ---
-trex_version: v2.28
+trex_version: v2.41
 trex_url: "https://trex-tgn.cisco.com/trex/release/{{ trex_version }}.tar.gz"
 trex_file: "{{ trex_url|basename }}"
 trex_unarchive: "{{ trex_file|regex_replace('[.]tar.gz$', '') }}"
@@ -20,3 +20,4 @@ trex_dest: "{{ clone_dest }}/"
 trex_sha256s:
   "v2.20": "sha256:eb5a069f758a36133a185c7e27af10834ca03d11441165403529fbd7844658fb"
   "v2.28": "sha256:c3f08aabbd69dddb09843984d41acbe9ba1af6a6ef3380a7830f7c9e33134207"
+  "v2.41": "sha256:aa4122d82cc7b25a16a20d6dd465eccd89e31c51816d4103765b86d06a8b9810"
index a5555e3..79a04fe 100644 (file)
@@ -13,6 +13,6 @@
 # limitations under the License.
 ---
 #TREX_DOWNLOAD: "https://trex-tgn.cisco.com/trex/release/v2.05.tar.gz"
-TREX_VERSION: v2.28
+TREX_VERSION: v2.41
 TREX_DOWNLOAD: "{{ nsb_mirror_url|ternary(nsb_mirror_url, 'https://trex-tgn.cisco.com/trex/release' }}/{{ TREX_VERSION }}.tar.gz"
 INSTALL_BIN_PATH: "/opt/nsb_bin"
diff --git a/dashboard/Prox_BM_L3FWD-4Port-1507803878020.json b/dashboard/Prox_BM_L3FWD-4Port-1507803878020.json
deleted file mode 100644 (file)
index 09184cb..0000000
+++ /dev/null
@@ -1,1151 +0,0 @@
-{
-  "__inputs": [
-    {
-      "name": "DS_YARDSTICK",
-      "label": "yardstick",
-      "description": "",
-      "type": "datasource",
-      "pluginId": "influxdb",
-      "pluginName": "InfluxDB"
-    }
-  ],
-  "__requires": [
-    {
-      "type": "grafana",
-      "id": "grafana",
-      "name": "Grafana",
-      "version": "4.4.3"
-    },
-    {
-      "type": "panel",
-      "id": "graph",
-      "name": "Graph",
-      "version": ""
-    },
-    {
-      "type": "datasource",
-      "id": "influxdb",
-      "name": "InfluxDB",
-      "version": "1.0.0"
-    },
-    {
-      "type": "panel",
-      "id": "text",
-      "name": "Text",
-      "version": ""
-    }
-  ],
-  "annotations": {
-    "list": []
-  },
-  "editable": true,
-  "gnetId": null,
-  "graphTooltip": 0,
-  "hideControls": false,
-  "id": null,
-  "links": [],
-  "refresh": false,
-  "rows": [
-    {
-      "collapse": false,
-      "height": "100px",
-      "panels": [
-        {
-          "content": "<h5 style=\"font-family:Verdana\"> <a style=\"color:#31A7D3\"><a style=\"font: 32px '#31A7D3'\"><center>OPNFV_Yardstick_NSB_PROX_BM_L3Fwd_4Port_Test</center> </a></h5>\n<center>\n<p>The application performs routing of packets with LPM based look-up method.\nThe KPI is the number of packets per second for a specified packet size with an accepted minimal packet loss </p>\n</center>",
-          "editable": true,
-          "error": false,
-          "id": 3,
-          "links": [],
-          "mode": "html",
-          "span": 12,
-          "title": "",
-          "type": "text"
-        },
-        {
-          "content": "<h5 style=\"font-family:Verdana\"> <a style=\"color:#31A7D3\"><a style=\"font: 22px '#31A7D3'\"><center>Prox L3Fwd VNF stats</center> </a></h5>\n",
-          "editable": true,
-          "error": false,
-          "height": "40",
-          "id": 7,
-          "links": [],
-          "mode": "html",
-          "span": 12,
-          "title": "",
-          "type": "text"
-        }
-      ],
-      "repeat": null,
-      "repeatIteration": null,
-      "repeatRowId": null,
-      "showTitle": false,
-      "title": "Row",
-      "titleSize": "h6"
-    },
-    {
-      "collapse": false,
-      "height": "300px",
-      "panels": [
-        {
-          "aliasColors": {},
-          "bars": false,
-          "dashLength": 10,
-          "dashes": false,
-          "datasource": "${DS_YARDSTICK}",
-          "editable": true,
-          "error": false,
-          "fill": 1,
-          "grid": {},
-          "height": "300",
-          "id": 4,
-          "legend": {
-            "alignAsTable": true,
-            "avg": true,
-            "current": false,
-            "max": true,
-            "min": true,
-            "rightSide": false,
-            "show": true,
-            "total": false,
-            "values": true
-          },
-          "lines": true,
-          "linewidth": 2,
-          "links": [],
-          "nullPointMode": "connected",
-          "percentage": false,
-          "pointradius": 1,
-          "points": false,
-          "renderer": "flot",
-          "seriesOverrides": [],
-          "spaceLength": 10,
-          "span": 12,
-          "stack": false,
-          "steppedLine": false,
-          "targets": [
-            {
-              "alias": "VNF packets Forward",
-              "dsType": "influxdb",
-              "groupBy": [
-                {
-                  "params": [
-                    "$interval"
-                  ],
-                  "type": "time"
-                },
-                {
-                  "params": [
-                    "null"
-                  ],
-                  "type": "fill"
-                }
-              ],
-              "measurement": "tc_prox_baremetal_l3fwd-4",
-              "policy": "default",
-              "refId": "A",
-              "resultFormat": "time_series",
-              "select": [
-                [
-                  {
-                    "params": [
-                      "vnf__0.packets_fwd"
-                    ],
-                    "type": "field"
-                  },
-                  {
-                    "params": [],
-                    "type": "mean"
-                  }
-                ]
-              ],
-              "tags": []
-            },
-            {
-              "alias": "VNF packets in",
-              "dsType": "influxdb",
-              "groupBy": [
-                {
-                  "params": [
-                    "$interval"
-                  ],
-                  "type": "time"
-                },
-                {
-                  "params": [
-                    "null"
-                  ],
-                  "type": "fill"
-                }
-              ],
-              "measurement": "tc_prox_baremetal_l3fwd-4",
-              "policy": "default",
-              "refId": "C",
-              "resultFormat": "time_series",
-              "select": [
-                [
-                  {
-                    "params": [
-                      "vnf__0.packets_in"
-                    ],
-                    "type": "field"
-                  },
-                  {
-                    "params": [],
-                    "type": "mean"
-                  }
-                ]
-              ],
-              "tags": []
-            },
-            {
-              "alias": "VNF packets dropped",
-              "dsType": "influxdb",
-              "groupBy": [
-                {
-                  "params": [
-                    "$interval"
-                  ],
-                  "type": "time"
-                },
-                {
-                  "params": [
-                    "null"
-                  ],
-                  "type": "fill"
-                }
-              ],
-              "measurement": "tc_prox_heat_context_l3fwd-4",
-              "policy": "default",
-              "refId": "B",
-              "resultFormat": "time_series",
-              "select": [
-                [
-                  {
-                    "params": [
-                      "vnf__0.packets_dropped"
-                    ],
-                    "type": "field"
-                  },
-                  {
-                    "params": [],
-                    "type": "mean"
-                  }
-                ]
-              ],
-              "tags": []
-            }
-          ],
-          "thresholds": [
-            {
-              "colorMode": "custom",
-              "fill": true,
-              "fillColor": "rgba(216, 200, 27, 0.27)",
-              "op": "gt",
-              "value": 2
-            },
-            {
-              "colorMode": "custom",
-              "fill": true,
-              "fillColor": "rgba(234, 112, 112, 0.22)",
-              "op": "gt",
-              "value": 2
-            }
-          ],
-          "timeFrom": null,
-          "timeShift": null,
-          "title": "VNF stats: Packet In, Forward and Dropped",
-          "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": "Packets",
-              "logBase": 1,
-              "max": null,
-              "min": null,
-              "show": true
-            },
-            {
-              "format": "short",
-              "label": null,
-              "logBase": 1,
-              "max": null,
-              "min": null,
-              "show": 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",
-          "editable": true,
-          "error": false,
-          "height": "40",
-          "id": 8,
-          "links": [],
-          "mode": "html",
-          "span": 12,
-          "title": "",
-          "type": "text"
-        }
-      ],
-      "repeat": null,
-      "repeatIteration": null,
-      "repeatRowId": null,
-      "showTitle": false,
-      "title": "New row",
-      "titleSize": "h6"
-    },
-    {
-      "collapse": false,
-      "height": "300px",
-      "panels": [
-        {
-          "aliasColors": {},
-          "bars": false,
-          "dashLength": 10,
-          "dashes": false,
-          "datasource": "${DS_YARDSTICK}",
-          "editable": true,
-          "error": false,
-          "fill": 1,
-          "grid": {},
-          "id": 6,
-          "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": false,
-          "targets": [
-            {
-              "alias": "TG xe-0 Out packets",
-              "dsType": "influxdb",
-              "groupBy": [
-                {
-                  "params": [
-                    "$interval"
-                  ],
-                  "type": "time"
-                },
-                {
-                  "params": [
-                    "null"
-                  ],
-                  "type": "fill"
-                }
-              ],
-              "measurement": "tc_prox_baremetal_l3fwd-4",
-              "policy": "default",
-              "refId": "A",
-              "resultFormat": "time_series",
-              "select": [
-                [
-                  {
-                    "params": [
-                      "tg__0.xe0.out_packets"
-                    ],
-                    "type": "field"
-                  },
-                  {
-                    "params": [],
-                    "type": "mean"
-                  }
-                ]
-              ],
-              "tags": []
-            },
-            {
-              "alias": "TG xe-1 Out packets",
-              "dsType": "influxdb",
-              "groupBy": [
-                {
-                  "params": [
-                    "$interval"
-                  ],
-                  "type": "time"
-                },
-                {
-                  "params": [
-                    "null"
-                  ],
-                  "type": "fill"
-                }
-              ],
-              "measurement": "tc_prox_baremetal_l3fwd-4",
-              "policy": "default",
-              "refId": "B",
-              "resultFormat": "time_series",
-              "select": [
-                [
-                  {
-                    "params": [
-                      "tg__0.xe1.out_packets"
-                    ],
-                    "type": "field"
-                  },
-                  {
-                    "params": [],
-                    "type": "mean"
-                  }
-                ]
-              ],
-              "tags": []
-            },
-            {
-              "alias": "TG xe-2 Out packets",
-              "dsType": "influxdb",
-              "groupBy": [
-                {
-                  "params": [
-                    "$interval"
-                  ],
-                  "type": "time"
-                },
-                {
-                  "params": [
-                    "null"
-                  ],
-                  "type": "fill"
-                }
-              ],
-              "measurement": "tc_prox_baremetal_l3fwd-4",
-              "policy": "default",
-              "refId": "C",
-              "resultFormat": "time_series",
-              "select": [
-                [
-                  {
-                    "params": [
-                      "tg__0.xe2.out_packets"
-                    ],
-                    "type": "field"
-                  },
-                  {
-                    "params": [],
-                    "type": "mean"
-                  }
-                ]
-              ],
-              "tags": []
-            },
-            {
-              "alias": "TG xe-3 Out packets",
-              "dsType": "influxdb",
-              "groupBy": [
-                {
-                  "params": [
-                    "$interval"
-                  ],
-                  "type": "time"
-                },
-                {
-                  "params": [
-                    "null"
-                  ],
-                  "type": "fill"
-                }
-              ],
-              "measurement": "tc_prox_baremetal_l3fwd-4",
-              "policy": "default",
-              "refId": "D",
-              "resultFormat": "time_series",
-              "select": [
-                [
-                  {
-                    "params": [
-                      "tg__0.xe3.out_packets"
-                    ],
-                    "type": "field"
-                  },
-                  {
-                    "params": [],
-                    "type": "mean"
-                  }
-                ]
-              ],
-              "tags": []
-            }
-          ],
-          "thresholds": [
-            {
-              "colorMode": "custom",
-              "fill": true,
-              "fillColor": "rgba(216, 200, 27, 0.27)",
-              "op": "gt",
-              "value": 2
-            },
-            {
-              "colorMode": "custom",
-              "fill": true,
-              "fillColor": "rgba(234, 112, 112, 0.22)",
-              "op": "gt",
-              "value": 2
-            }
-          ],
-          "timeFrom": null,
-          "timeShift": null,
-          "title": "TG Port Stats: Out packets",
-          "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": "Packets",
-              "logBase": 1,
-              "max": null,
-              "min": null,
-              "show": true
-            },
-            {
-              "format": "short",
-              "label": null,
-              "logBase": 1,
-              "max": null,
-              "min": null,
-              "show": true
-            }
-          ]
-        },
-        {
-          "aliasColors": {},
-          "bars": false,
-          "dashLength": 10,
-          "dashes": false,
-          "datasource": "${DS_YARDSTICK}",
-          "editable": true,
-          "error": false,
-          "fill": 1,
-          "grid": {},
-          "id": 9,
-          "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": false,
-          "targets": [
-            {
-              "alias": "TG xe-0 in packets",
-              "dsType": "influxdb",
-              "groupBy": [
-                {
-                  "params": [
-                    "$interval"
-                  ],
-                  "type": "time"
-                },
-                {
-                  "params": [
-                    "null"
-                  ],
-                  "type": "fill"
-                }
-              ],
-              "measurement": "tc_prox_baremetal_l3fwd-4",
-              "policy": "default",
-              "refId": "A",
-              "resultFormat": "time_series",
-              "select": [
-                [
-                  {
-                    "params": [
-                      "tg__0.xe0.in_packets"
-                    ],
-                    "type": "field"
-                  },
-                  {
-                    "params": [],
-                    "type": "mean"
-                  }
-                ]
-              ],
-              "tags": []
-            },
-            {
-              "alias": "TG xe-1 in packets",
-              "dsType": "influxdb",
-              "groupBy": [
-                {
-                  "params": [
-                    "$interval"
-                  ],
-                  "type": "time"
-                },
-                {
-                  "params": [
-                    "null"
-                  ],
-                  "type": "fill"
-                }
-              ],
-              "measurement": "tc_prox_baremetal_l3fwd-4",
-              "policy": "default",
-              "refId": "B",
-              "resultFormat": "time_series",
-              "select": [
-                [
-                  {
-                    "params": [
-                      "tg__0.xe1.in_packets"
-                    ],
-                    "type": "field"
-                  },
-                  {
-                    "params": [],
-                    "type": "mean"
-                  }
-                ]
-              ],
-              "tags": []
-            },
-            {
-              "alias": "TG xe-2 in packets",
-              "dsType": "influxdb",
-              "groupBy": [
-                {
-                  "params": [
-                    "$interval"
-                  ],
-                  "type": "time"
-                },
-                {
-                  "params": [
-                    "null"
-                  ],
-                  "type": "fill"
-                }
-              ],
-              "measurement": "tc_prox_baremetal_l3fwd-4",
-              "policy": "default",
-              "refId": "C",
-              "resultFormat": "time_series",
-              "select": [
-                [
-                  {
-                    "params": [
-                      "tg__0.xe2.in_packets"
-                    ],
-                    "type": "field"
-                  },
-                  {
-                    "params": [],
-                    "type": "mean"
-                  }
-                ]
-              ],
-              "tags": []
-            },
-            {
-              "alias": "TG xe-3 in packets",
-              "dsType": "influxdb",
-              "groupBy": [
-                {
-                  "params": [
-                    "$interval"
-                  ],
-                  "type": "time"
-                },
-                {
-                  "params": [
-                    "null"
-                  ],
-                  "type": "fill"
-                }
-              ],
-              "measurement": "tc_prox_baremetal_l3fwd-4",
-              "policy": "default",
-              "refId": "D",
-              "resultFormat": "time_series",
-              "select": [
-                [
-                  {
-                    "params": [
-                      "tg__0.xe3.in_packets"
-                    ],
-                    "type": "field"
-                  },
-                  {
-                    "params": [],
-                    "type": "mean"
-                  }
-                ]
-              ],
-              "tags": []
-            }
-          ],
-          "thresholds": [
-            {
-              "colorMode": "custom",
-              "fill": true,
-              "fillColor": "rgba(216, 200, 27, 0.27)",
-              "op": "gt",
-              "value": 2
-            },
-            {
-              "colorMode": "custom",
-              "fill": true,
-              "fillColor": "rgba(234, 112, 112, 0.22)",
-              "op": "gt",
-              "value": 2
-            }
-          ],
-          "timeFrom": null,
-          "timeShift": null,
-          "title": "TG Port Stats: In packets",
-          "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": "Packets",
-              "logBase": 1,
-              "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": "250px",
-      "panels": [
-        {
-          "aliasColors": {},
-          "bars": false,
-          "dashLength": 10,
-          "dashes": false,
-          "datasource": "${DS_YARDSTICK}",
-          "editable": true,
-          "error": false,
-          "fill": 1,
-          "grid": {},
-          "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": false,
-          "targets": [
-            {
-              "alias": "TG TX Throughput",
-              "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": "TG RX Throughput",
-              "dsType": "influxdb",
-              "groupBy": [
-                {
-                  "params": [
-                    "$interval"
-                  ],
-                  "type": "time"
-                },
-                {
-                  "params": [
-                    "null"
-                  ],
-                  "type": "fill"
-                }
-              ],
-              "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": 2
-            },
-            {
-              "colorMode": "custom",
-              "fill": true,
-              "fillColor": "rgba(234, 112, 112, 0.22)",
-              "op": "gt",
-              "value": 2
-            }
-          ],
-          "timeFrom": null,
-          "timeShift": null,
-          "title": "TG Throughput Stats",
-          "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": "Throughput in MPPS",
-              "logBase": 1,
-              "max": null,
-              "min": null,
-              "show": true
-            },
-            {
-              "format": "short",
-              "label": null,
-              "logBase": 1,
-              "max": null,
-              "min": null,
-              "show": true
-            }
-          ]
-        },
-        {
-          "aliasColors": {},
-          "bars": false,
-          "dashLength": 10,
-          "dashes": false,
-          "datasource": "${DS_YARDSTICK}",
-          "editable": true,
-          "error": false,
-          "fill": 1,
-          "grid": {},
-          "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": false,
-          "targets": [
-            {
-              "alias": "TG 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.PktSize"
-                    ],
-                    "type": "field"
-                  },
-                  {
-                    "params": [],
-                    "type": "mean"
-                  }
-                ]
-              ],
-              "tags": []
-            }
-          ],
-          "thresholds": [
-            {
-              "colorMode": "custom",
-              "fill": true,
-              "fillColor": "rgba(216, 200, 27, 0.27)",
-              "op": "gt",
-              "value": 2
-            },
-            {
-              "colorMode": "custom",
-              "fill": true,
-              "fillColor": "rgba(234, 112, 112, 0.22)",
-              "op": "gt",
-              "value": 2
-            }
-          ],
-          "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": "decbytes",
-              "label": "Packet Size",
-              "logBase": 1,
-              "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": "250px",
-      "panels": [],
-      "repeat": null,
-      "repeatIteration": null,
-      "repeatRowId": null,
-      "showTitle": false,
-      "title": "New row",
-      "titleSize": "h6"
-    }
-  ],
-  "schemaVersion": 14,
-  "style": "dark",
-  "tags": [
-    "NSB",
-    "Prox",
-    "BM",
-    "4Port",
-    "L3Fwd"
-  ],
-  "templating": {
-    "list": []
-  },
-  "time": {
-    "from": "2017-09-29T14:12:51.977Z",
-    "to": "2017-09-29T14:19:29.296Z"
-  },
-  "timepicker": {
-    "refresh_intervals": [
-      "5s",
-      "10s",
-      "30s",
-      "1m",
-      "5m",
-      "15m",
-      "30m",
-      "1h",
-      "2h",
-      "1d"
-    ],
-    "time_options": [
-      "5m",
-      "15m",
-      "1h",
-      "6h",
-      "12h",
-      "24h",
-      "2d",
-      "7d",
-      "30d"
-    ]
-  },
-  "timezone": "browser",
-  "title": "Prox_BM_L3FWD-4Port",
-  "version": 4
-}
\ No newline at end of file
diff --git a/dashboard/Prox_BM_L3FWD-4Port-1527840729877.json b/dashboard/Prox_BM_L3FWD-4Port-1527840729877.json
new file mode 100644 (file)
index 0000000..7fbb8fd
--- /dev/null
@@ -0,0 +1,9973 @@
+{
+  "__inputs": [
+    {
+      "name": "DS_YARDSTICK",
+      "label": "YARDSTICK",
+      "description": "",
+      "type": "datasource",
+      "pluginId": "influxdb",
+      "pluginName": "InfluxDB"
+    }
+  ],
+  "__requires": [
+    {
+      "type": "grafana",
+      "id": "grafana",
+      "name": "Grafana",
+      "version": "4.4.3"
+    },
+    {
+      "type": "panel",
+      "id": "graph",
+      "name": "Graph",
+      "version": ""
+    },
+    {
+      "type": "datasource",
+      "id": "influxdb",
+      "name": "InfluxDB",
+      "version": "1.0.0"
+    },
+    {
+      "type": "panel",
+      "id": "singlestat",
+      "name": "Singlestat",
+      "version": ""
+    },
+    {
+      "type": "panel",
+      "id": "text",
+      "name": "Text",
+      "version": ""
+    }
+  ],
+  "annotations": {
+    "list": []
+  },
+  "editable": true,
+  "gnetId": null,
+  "graphTooltip": 0,
+  "hideControls": false,
+  "id": null,
+  "links": [],
+  "refresh": "5s",
+  "rows": [
+    {
+      "collapse": false,
+      "height": "100px",
+      "panels": [
+        {
+          "content": "<h5 style=\"font-family:Verdana\"> <a style=\"color:#31A7D3\"><a style=\"font: 32px '#31A7D3'\"><center>OPNFV_Yardstick_NSB_PROX_BM_L3FWD_4Port_Test</center> </a></h5>\n<center>\n<p>The application does Port forwarding without touching packets. It will take packets in from one port and forward them unmodified to another port </p>\n<p>The KPI is the number of packets per second for a specified packet size with an accepted minimal packet loss </p>\n</center>",
+          "editable": true,
+          "error": false,
+          "id": 3,
+          "links": [],
+          "mode": "html",
+          "span": 12,
+          "title": "",
+          "type": "text"
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": false,
+      "title": "Row",
+      "titleSize": "h6"
+    },
+    {
+      "collapse": true,
+      "height": 362,
+      "panels": [
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 4,
+          "fill": 1,
+          "id": 123,
+          "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": 12,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "alias": "Cumulative Packets Sents",
+              "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": [
+                      "vnf__0.packets_fwd"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": []
+            }
+          ],
+          "thresholds": [
+            {
+              "colorMode": "custom",
+              "fill": true,
+              "fillColor": "rgba(216, 200, 27, 0.27)",
+              "line": true,
+              "lineColor": "rgba(0, 0, 0, 0)",
+              "op": "gt",
+              "value": 0
+            },
+            {
+              "colorMode": "custom",
+              "fill": true,
+              "fillColor": "rgb(234, 112, 112, 0.22)",
+              "line": true,
+              "lineColor": "rgba(0, 0, 0, 0.01)",
+              "op": "gt",
+              "value": 0
+            }
+          ],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Cumulative Load Sent by Generator",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": "Packets Per Second",
+              "logBase": 1,
+              "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": "Cumulative Load Sent by Generator",
+      "titleSize": "h6"
+    },
+    {
+      "collapse": false,
+      "height": 331,
+      "panels": [
+        {
+          "content": "<h5 style=\"font-family:Verdana\"> <a style=\"color:#31A7D3\"><a style=\"font: 22px '#31A7D3'\"><center>Throughput</center> </a></h5>\n",
+          "editable": true,
+          "error": false,
+          "height": "40",
+          "id": 7,
+          "links": [],
+          "minSpan": 12,
+          "mode": "html",
+          "span": 12,
+          "title": "",
+          "type": "text"
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 4,
+          "editable": true,
+          "error": false,
+          "fill": 1,
+          "grid": {},
+          "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": 7,
+          "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.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",
+          "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": {},
+          "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": 5,
+          "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.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": 288,
+      "panels": [
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 4,
+          "editable": true,
+          "error": false,
+          "fill": 1,
+          "grid": {},
+          "height": "300",
+          "id": 4,
+          "legend": {
+            "alignAsTable": true,
+            "avg": true,
+            "current": false,
+            "max": true,
+            "min": true,
+            "rightSide": false,
+            "show": true,
+            "sortDesc": true,
+            "total": false,
+            "values": true
+          },
+          "lines": true,
+          "linewidth": 2,
+          "links": [],
+          "nullPointMode": "connected",
+          "percentage": false,
+          "pointradius": 1,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 6,
+          "stack": false,
+          "steppedLine": true,
+          "targets": [
+            {
+              "alias": "SUT Packets Received",
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "refId": "C",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "vnf__0.curr_packets_in"
+                    ],
+                    "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": "SUT Stats - Load Received By SUT",
+          "tooltip": {
+            "msResolution": true,
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "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": "0",
+              "show": true
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 4,
+          "editable": true,
+          "error": false,
+          "fill": 1,
+          "grid": {},
+          "height": "300",
+          "id": 39,
+          "legend": {
+            "alignAsTable": true,
+            "avg": true,
+            "current": false,
+            "max": true,
+            "min": true,
+            "rightSide": false,
+            "show": true,
+            "total": false,
+            "values": true
+          },
+          "lines": true,
+          "linewidth": 2,
+          "links": [],
+          "nullPointMode": "connected",
+          "percentage": false,
+          "pointradius": 1,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 6,
+          "stack": false,
+          "steppedLine": true,
+          "targets": [
+            {
+              "alias": "SUT Packets Sent",
+              "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": [
+                      "vnf__0.curr_packets_fwd"
+                    ],
+                    "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": "SUT Stats - Load Forwarded By SUT",
+          "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
+            }
+          ]
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": false,
+      "title": "New row",
+      "titleSize": "h6"
+    },
+    {
+      "collapse": false,
+      "height": 289,
+      "panels": [
+        {
+          "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",
+          "editable": true,
+          "error": false,
+          "height": "40",
+          "id": 8,
+          "links": [],
+          "minSpan": 12,
+          "mode": "html",
+          "span": 12,
+          "title": "",
+          "type": "text"
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 4,
+          "editable": true,
+          "error": false,
+          "fill": 1,
+          "grid": {},
+          "id": 43,
+          "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"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.xe0.out_packets"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": []
+            },
+            {
+              "alias": "TG xe-1 Out packets",
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "refId": "B",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.xe1.out_packets"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": []
+            },
+            {
+              "alias": "TG xe-2 Out packets",
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "refId": "C",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.xe2.out_packets"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "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",
+              "refId": "D",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.xe3.out_packets"
+                    ],
+                    "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": "Packets Sent by Generator",
+          "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": "Packets ",
+              "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}",
+          "editable": true,
+          "error": false,
+          "fill": 1,
+          "grid": {},
+          "id": 9,
+          "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": 5,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "alias": "TG xe-0 in packets",
+              "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.xe0.in_packets"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": []
+            },
+            {
+              "alias": "TG xe-1 in packets",
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "refId": "B",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.xe1.in_packets"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": []
+            },
+            {
+              "alias": "TG xe-2 in packets",
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "refId": "C",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.xe2.in_packets"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": []
+            },
+            {
+              "alias": "TG xe-3 in packets",
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "refId": "D",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.xe3.in_packets"
+                    ],
+                    "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": "Packets Received by Generator",
+          "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": "Packets Per Second",
+              "logBase": 1,
+              "max": null,
+              "min": "0",
+              "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": "250px",
+      "panels": [
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "${DS_YARDSTICK}",
+          "fill": 1,
+          "id": 10,
+          "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": false,
+          "targets": [
+            {
+              "alias": "SUCCESS Tx Total",
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "none"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "refId": "B",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_tx_total"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": []
+            },
+            {
+              "alias": "SUCCESS Rx Total",
+              "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.Success_rx_total"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": []
+            },
+            {
+              "alias": "SUCCESS ALLOWABLE LOST PACKETS",
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "refId": "C",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_can_be_lost"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": []
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "SUCCESS CRITERIA: TX Total  = Rx Total + Tolerated Loss",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": "Packets Per Second",
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            }
+          ]
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "35",
+          "id": 12,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 3,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "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.duration"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": []
+            }
+          ],
+          "thresholds": "",
+          "title": "Test Interval",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30",
+          "id": 11,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 3,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "alias": "Test Duration",
+              "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.test_duration"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": []
+            }
+          ],
+          "thresholds": "",
+          "title": "Test Duration",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30",
+          "id": 13,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 3,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "alias": "Test Precision",
+              "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.test_precision"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": []
+            }
+          ],
+          "thresholds": "",
+          "title": "Test Precision",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30",
+          "id": 14,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 3,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "alias": "Tolerated Loss",
+              "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.tolerated_loss"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": []
+            }
+          ],
+          "thresholds": "",
+          "title": "Tolerated Loss",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": false,
+      "title": "New row",
+      "titleSize": "h6"
+    },
+    {
+      "collapse": false,
+      "height": -153,
+      "panels": [
+        {
+          "content": "<center>Packet size</center>",
+          "height": "30px",
+          "id": 15,
+          "links": [],
+          "mode": "html",
+          "span": 2,
+          "title": "",
+          "type": "text"
+        },
+        {
+          "content": "<center>Theoretical Max Throughput (MPPS)</center>",
+          "height": "30px",
+          "id": 16,
+          "links": [],
+          "mode": "html",
+          "span": 2,
+          "title": "",
+          "type": "text"
+        },
+        {
+          "content": "<center>Tx Throughput (MPPS)</center>",
+          "height": "30px",
+          "id": 17,
+          "links": [],
+          "mode": "html",
+          "span": 2,
+          "title": "",
+          "type": "text"
+        },
+        {
+          "content": "<center>Rx Throughput (MPPS)</center>",
+          "height": "30px",
+          "id": 58,
+          "links": [],
+          "mode": "html",
+          "span": 2,
+          "title": "",
+          "type": "text"
+        },
+        {
+          "content": "<center>Tot Sent </center>",
+          "height": "40px",
+          "id": 61,
+          "links": [],
+          "mode": "html",
+          "span": 1,
+          "title": "",
+          "type": "text"
+        },
+        {
+          "content": "<center>Tot Received</center>",
+          "height": "30px",
+          "id": 62,
+          "links": [],
+          "mode": "html",
+          "span": 1,
+          "title": "",
+          "type": "text"
+        },
+        {
+          "content": "<center>Tot Dropped</center>",
+          "height": "30px",
+          "id": 63,
+          "links": [],
+          "mode": "html",
+          "span": 1,
+          "title": "",
+          "type": "text"
+        },
+        {
+          "content": "<center>Tot Can be Lost</center>",
+          "height": "30px",
+          "id": 64,
+          "links": [],
+          "mode": "html",
+          "span": 1,
+          "title": "",
+          "type": "text"
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": false,
+      "title": "Dashboard Row",
+      "titleSize": "h6"
+    },
+    {
+      "collapse": false,
+      "height": -224,
+      "panels": [
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 0,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "hideTimeOverride": false,
+          "id": 18,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "alias": "Theoretical Max Throughput  (Mpps)",
+              "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.Success_PktSize\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 64 AND $timeFilter GROUP BY time($__interval) fill(null)",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.PktSize"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 4,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "hideTimeOverride": false,
+          "id": 19,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "alias": "Max Throughput  (Mpps)",
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Result_theor_max_throughput\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Result_pktSize\" = 64 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Result_theor_max_throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 4,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 20,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_TxThroughput\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 64 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 4,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 69,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "last",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "none"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_RxThroughput\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 64 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "table",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 0,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 70,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_tx_total\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 64 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 0,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 71,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_rx_total\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 64 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 0,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 72,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_drop_total\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 64 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 0,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 73,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_can_be_lost\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 64 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 0,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 74,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "alias": "Theoretical Max Throughput  (Mpps)",
+              "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.Success_PktSize\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 128 AND $timeFilter GROUP BY time($__interval) fill(null)",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.PktSize"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 4,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 75,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "alias": "Max Throughput  (Mpps)",
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Result_theor_max_throughput\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Result_pktSize\" = 128 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.theor_max_throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 4,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 76,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_TxThroughput\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 128 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 4,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 77,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_RxThroughput\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 128 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 0,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 78,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_tx_total\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 128 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 0,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 79,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_rx_total\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 128 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 0,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 80,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_drop_total\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 128 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 0,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 81,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_can_be_lost\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 128 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 0,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 82,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "alias": "Theoretical Max Throughput  (Mpps)",
+              "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.Success_PktSize\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 256 AND $timeFilter GROUP BY time($__interval) fill(null)",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.PktSize"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 4,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 83,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "alias": "Max Throughput  (Mpps)",
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Result_theor_max_throughput\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Result_pktSize\" = 256 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.theor_max_throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 4,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 84,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_TxThroughput\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 256 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 4,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 85,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_RxThroughput\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 256 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 0,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 86,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_tx_total\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 256 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 0,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 87,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_rx_total\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 256 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 0,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 88,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_drop_total\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 256 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 0,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 89,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_can_be_lost\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 256 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 0,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 90,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "alias": "Theoretical Max Throughput  (Mpps)",
+              "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.Success_PktSize\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 512 AND $timeFilter GROUP BY time($__interval) fill(null)",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.PktSize"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 4,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 91,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "alias": "Max Throughput  (Mpps)",
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Result_theor_max_throughput\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Result_pktSize\" = 512 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.theor_max_throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 4,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 92,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_TxThroughput\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 512 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 4,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 93,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_RxThroughput\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 512 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 0,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 94,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_tx_total\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 512 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 0,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 95,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_rx_total\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 512 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 0,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 96,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_drop_total\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 512 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 0,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 97,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_can_be_lost\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 512 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 0,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 98,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "alias": "Theoretical Max Throughput  (Mpps)",
+              "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.Success_PktSize\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 1024 AND $timeFilter GROUP BY time($__interval) fill(null)",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.PktSize"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 4,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 99,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "alias": "Max Throughput  (Mpps)",
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Result_theor_max_throughput\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Result_pktSize\" = 1024 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.theor_max_throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 4,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 100,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_TxThroughput\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 1024 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 4,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 101,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_RxThroughput\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 1024 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 0,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 102,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_tx_total\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 1024 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 0,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 103,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_rx_total\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 1024 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 0,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 104,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_drop_total\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 1024 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 0,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 105,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_can_be_lost\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 1024 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 0,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 106,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "alias": "Theoretical Max Throughput  (Mpps)",
+              "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.Success_PktSize\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 1280 AND $timeFilter GROUP BY time($__interval) fill(null)",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.PktSize"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 4,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 107,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "alias": "Max Throughput  (Mpps)",
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Result_theor_max_throughput\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Result_pktSize\" = 1280 AND $timeFilter AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.theor_max_throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 4,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 108,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_TxThroughput\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 1280 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 4,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 109,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_RxThroughput\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 1280 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 0,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 110,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_tx_total\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 1280 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 0,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 111,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_rx_total\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 1280 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 0,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 112,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_drop_total\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 1280 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 0,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 113,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_can_be_lost\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 1280 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 0,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 114,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "alias": "Theoretical Max Throughput  (Mpps)",
+              "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.Success_PktSize\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 1518 AND $timeFilter GROUP BY time($__interval) fill(null)",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.PktSize"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 4,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 115,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "alias": "Max Throughput  (Mpps)",
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Result_theor_max_throughput\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Result_pktSize\" = 1518 AND $timeFilter AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.theor_max_throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "sum"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            },
+            {
+              "op": "=",
+              "text": "",
+              "value": ""
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 4,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 116,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_TxThroughput\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 1518 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 4,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 117,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_RxThroughput\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 1518 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 0,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 118,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_tx_total\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 1518 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 0,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 119,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_rx_total\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 1518 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 0,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 120,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_drop_total\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 1518 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 0,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "30px",
+          "id": 121,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "query": "SELECT last(\"tg__0.Success_can_be_lost\") FROM \"tc_prox_baremetal_l3fwd-4\" WHERE \"tg__0.Success_PktSize\" = 1518 AND $timeFilter",
+              "rawQuery": true,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.Success_Throughput"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "tg__0.PktSize",
+                  "operator": "=",
+                  "value": "64"
+                }
+              ]
+            }
+          ],
+          "thresholds": "",
+          "title": "",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "avg"
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": false,
+      "title": "Dashboard Row",
+      "titleSize": "h3"
+    },
+    {
+      "collapse": false,
+      "height": "40px",
+      "panels": [
+        {
+          "content": "<h5 style=\"font-family:Verdana\"> <a style=\"color:#31A7D3\"><a style=\"font: 22px '#31A7D3'\"><center>Latency</center> </a></h5>",
+          "height": "40",
+          "id": 41,
+          "links": [],
+          "mode": "html",
+          "span": 12,
+          "title": "",
+          "type": "text"
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": false,
+      "title": "Dashboard Row",
+      "titleSize": "h6"
+    },
+    {
+      "collapse": false,
+      "height": 250,
+      "panels": [
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "${DS_YARDSTICK}",
+          "fill": 1,
+          "height": "300px",
+          "id": 47,
+          "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": false,
+          "targets": [
+            {
+              "alias": "xe0 Latency Avg",
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "none"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "refId": "B",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.LatencyAvg.5"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": []
+            },
+            {
+              "alias": "xe0 Latency Max",
+              "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.LatencyMax.5"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": []
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "xe0 Latency",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": "usec",
+              "logBase": 1,
+              "max": null,
+              "min": "0",
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": "0",
+              "show": true
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "${DS_YARDSTICK}",
+          "fill": 1,
+          "height": "300px",
+          "id": 48,
+          "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": false,
+          "targets": [
+            {
+              "alias": "xe1 Latency Avg",
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "none"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "refId": "B",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.LatencyAvg.6"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": []
+            },
+            {
+              "alias": "xe1 Latency Max",
+              "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.LatencyMax.6"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": []
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "xe1 Latency",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": "usec",
+              "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}",
+          "fill": 1,
+          "height": "300px",
+          "id": 49,
+          "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": false,
+          "targets": [
+            {
+              "alias": "xe2 Latency Avg",
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "none"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "refId": "B",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.LatencyAvg.7"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": []
+            },
+            {
+              "alias": "xe2 Latency Max",
+              "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.LatencyMax.7"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": []
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "xe2 Latency",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": "usec",
+              "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}",
+          "fill": 1,
+          "height": "300px",
+          "id": 50,
+          "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": false,
+          "targets": [
+            {
+              "alias": "xe3 Latency Avg",
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "none"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "refId": "B",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "tg__0.LatencyAvg.8"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": []
+            },
+            {
+              "alias": "xe3 Latency Max",
+              "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.LatencyMax.8"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "mean"
+                  }
+                ]
+              ],
+              "tags": []
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "xe3 Latency",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": "usec",
+              "logBase": 1,
+              "max": null,
+              "min": "0",
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            }
+          ]
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": false,
+      "title": "Dashboard Row",
+      "titleSize": "h6"
+    },
+    {
+      "collapse": false,
+      "height": "40px",
+      "panels": [
+        {
+          "content": "<h5 style=\"font-family:Verdana\"> <a style=\"color:#31A7D3\"><a style=\"font: 22px '#31A7D3'\"><center>SUT CPU Utilization</center> </a></h5>",
+          "height": "40px",
+          "id": 51,
+          "links": [],
+          "mode": "html",
+          "span": 12,
+          "title": "",
+          "type": "text"
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": false,
+      "title": "Dashboard Row",
+      "titleSize": "h6"
+    },
+    {
+      "collapse": false,
+      "height": 250,
+      "panels": [
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 5,
+          "fill": 1,
+          "height": "300px",
+          "id": 52,
+          "legend": {
+            "alignAsTable": true,
+            "avg": true,
+            "current": false,
+            "max": true,
+            "min": true,
+            "show": true,
+            "sortDesc": false,
+            "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": false,
+          "targets": [
+            {
+              "alias": "CPU 0 Utilization",
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "none"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "refId": "B",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "vnf__0.collect_stats.core.cpu.0.percent-user"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "distinct"
+                  }
+                ]
+              ],
+              "tags": []
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "CPU 0 Utilization  - Master Core",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": "% Utilization",
+              "logBase": 1,
+              "max": "100",
+              "min": "0",
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": "0",
+              "show": true
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 5,
+          "fill": 1,
+          "height": "300px",
+          "id": 53,
+          "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": false,
+          "targets": [
+            {
+              "alias": "CPU 1 Utilization  - L3FWD XE0 to XE1",
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "none"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "refId": "B",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "vnf__0.collect_stats.core.cpu.1.percent-user"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "distinct"
+                  }
+                ]
+              ],
+              "tags": []
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "CPU 1 Utilization  - L3FWD XE0 to XE1",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": "% Utilization",
+              "logBase": 1,
+              "max": "100",
+              "min": "0",
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": "0",
+              "show": true
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 5,
+          "fill": 1,
+          "height": "300px",
+          "id": 54,
+          "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": false,
+          "targets": [
+            {
+              "alias": "CPU 2 Utilization",
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "none"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "refId": "B",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "vnf__0.collect_stats.core.cpu.2.percent-user"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "distinct"
+                  }
+                ]
+              ],
+              "tags": []
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "CPU 2 Utilization  - L3FWD XE1 to XE0",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": "% Utilization",
+              "logBase": 1,
+              "max": "100",
+              "min": "0",
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": "0",
+              "show": true
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 5,
+          "fill": 1,
+          "height": "300px",
+          "id": 55,
+          "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": false,
+          "targets": [
+            {
+              "alias": "CPU 3 Utilization",
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "none"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "refId": "B",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "vnf__0.collect_stats.core.cpu.3.percent-user"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "distinct"
+                  }
+                ]
+              ],
+              "tags": []
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "CPU 3 Utilization  - L3FWD XE2 to XE3",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": "% Utilization",
+              "logBase": 1,
+              "max": "100",
+              "min": "0",
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": "0",
+              "show": true
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 5,
+          "fill": 1,
+          "height": "300px",
+          "id": 56,
+          "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": false,
+          "targets": [
+            {
+              "alias": "CPU 4 Utilization",
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "none"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "refId": "B",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "vnf__0.collect_stats.core.cpu.4.percent-user"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "distinct"
+                  }
+                ]
+              ],
+              "tags": []
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "CPU 4 Utilization  - L3FWD XE3 to XE2",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": "% Utilization",
+              "logBase": 1,
+              "max": "100",
+              "min": "0",
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": "0",
+              "show": true
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "${DS_YARDSTICK}",
+          "decimals": 5,
+          "fill": 1,
+          "height": "300px",
+          "id": 57,
+          "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": false,
+          "targets": [
+            {
+              "alias": "CPU 5 Utilization",
+              "dsType": "influxdb",
+              "groupBy": [
+                {
+                  "params": [
+                    "$__interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "none"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "measurement": "tc_prox_baremetal_l3fwd-4",
+              "orderByTime": "ASC",
+              "policy": "default",
+              "refId": "B",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "vnf__0.collect_stats.core.cpu.5.percent-user"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "distinct"
+                  }
+                ]
+              ],
+              "tags": []
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "CPU 5 Utilization",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": "% Utilization",
+              "logBase": 1,
+              "max": "100",
+              "min": "0",
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": "0",
+              "show": true
+            }
+          ]
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": false,
+      "title": "Dashboard Row",
+      "titleSize": "h6"
+    }
+  ],
+  "schemaVersion": 14,
+  "style": "dark",
+  "tags": [
+    "yardstick",
+    "NSB",
+    "Prox",
+    "L3fwd",
+    "4Port",
+    "BM"
+  ],
+  "templating": {
+    "list": []
+  },
+  "time": {
+    "from": "now-30m",
+    "to": "now"
+  },
+  "timepicker": {
+    "refresh_intervals": [
+      "5s",
+      "10s",
+      "30s",
+      "1m",
+      "5m",
+      "15m",
+      "30m",
+      "1h",
+      "2h",
+      "1d"
+    ],
+    "time_options": [
+      "5m",
+      "15m",
+      "1h",
+      "6h",
+      "12h",
+      "24h",
+      "2d",
+      "7d",
+      "30d"
+    ]
+  },
+  "timezone": "browser",
+  "title": "Prox_BM_L3FWD-4Port",
+  "version": 24
+}
\ No newline at end of file
index 62ea0d0..7f85cbd 100644 (file)
@@ -24,7 +24,7 @@ ENV YARDSTICK_REPO_DIR="${REPOS_DIR}/yardstick/" \
     RELENG_REPO_DIR="${REPOS_DIR}/releng" \
     STORPERF_REPO_DIR="${REPOS_DIR}/storperf"
 
-RUN apt-get update && apt-get install -y git python python-setuptools python-pip && apt-get -y autoremove && apt-get clean
+RUN apt-get update && apt-get install -y git python python-setuptools python-pip iputils-ping && apt-get -y autoremove && apt-get clean
 RUN easy_install -U setuptools==30.0.0
 RUN pip install appdirs==1.4.0 pyopenssl==17.5.0 python-openstackclient==3.11.0 python-heatclient==1.11.0 ansible==2.4.2
 
index 6c73812..21095cb 100644 (file)
@@ -27,8 +27,8 @@ index 62ea0d0..f2f41771 100644
      RELENG_REPO_DIR="${REPOS_DIR}/releng" \
      STORPERF_REPO_DIR="${REPOS_DIR}/storperf"
 
--RUN apt-get update && apt-get install -y git python python-setuptools python-pip && apt-get -y autoremove && apt-get clean
-+RUN apt-get update && apt-get install -y git python python-setuptools python-pip && apt-get -y autoremove && \
+-RUN apt-get update && apt-get install -y git python python-setuptools python-pip iputils-ping && apt-get -y autoremove && apt-get clean
++RUN apt-get update && apt-get install -y git python python-setuptools python-pip iputils-ping && apt-get -y autoremove && \
 +    apt-get install -y libssl-dev && apt-get -y install libffi-dev && apt-get clean
  RUN easy_install -U setuptools==30.0.0
  RUN pip install appdirs==1.4.0 pyopenssl==17.5.0 python-openstackclient==3.11.0 python-heatclient==1.11.0 ansible==2.4.2
index 6598a27..7ea2616 100644 (file)
@@ -36,6 +36,9 @@ Version History
 | *Date*            | *Version* | *Comment*                       |
 |                   |           |                                 |
 +-------------------+-----------+---------------------------------+
+| May 25, 2018      | 6.1.0     | Yardstick for Fraser release    |
+|                   |           |                                 |
++-------------------+-----------+---------------------------------+
 | April 27, 2018    | 6.0.0     | Yardstick for Fraser release    |
 |                   |           |                                 |
 +-------------------+-----------+---------------------------------+
@@ -117,19 +120,19 @@ Release Data
 | **Project**                    | Yardstick             |
 |                                |                       |
 +--------------------------------+-----------------------+
-| **Repo/tag**                   | yardstick/opnfv-6.0.0 |
+| **Repo/tag**                   | yardstick/opnfv-6.1.0 |
 |                                |                       |
 +--------------------------------+-----------------------+
-| **Yardstick Docker image tag** | opnfv-6.0.0           |
+| **Yardstick Docker image tag** | opnfv-6.1.0           |
 |                                |                       |
 +--------------------------------+-----------------------+
 | **Release designation**        | Fraser                |
 |                                |                       |
 +--------------------------------+-----------------------+
-| **Release date**               | April 27, 2018        |
+| **Release date**               | May 25, 2018          |
 |                                |                       |
 +--------------------------------+-----------------------+
-| **Purpose of the delivery**    | OPNFV Fraser 6.0.0    |
+| **Purpose of the delivery**    | OPNFV Fraser 6.1.0    |
 |                                |                       |
 +--------------------------------+-----------------------+
 
@@ -148,7 +151,7 @@ Documents
 Software Deliverables
 ---------------------
 
- - The Yardstick Docker image: https://hub.docker.com/r/opnfv/yardstick (tag: opnfv-6.0.0)
+ - The Yardstick Docker image: https://hub.docker.com/r/opnfv/yardstick (tag: opnfv-6.1.0)
 
 List of Contexts
 ^^^^^^^^^^^^^^^^
@@ -174,7 +177,7 @@ List of Contexts
 List of Runners
 ^^^^^^^^^^^^^^^
 
-Note: Yardstick Fraser 6.0.0 add two new Runners, "Dynamictp" and "Search".
+.. note:: Yardstick Fraser 6.0.0 add two new Runners, "Dynamictp" and "Search".
 
 +---------------+-------------------------------------------------------+
 | **Runner**    | **Description**                                       |
@@ -271,6 +274,8 @@ List of Scenarios
 New Test cases
 --------------
 
+.. note:: Yardstick Fraser 6.1.0 added two new test cases, "TC092" and "TC093".
+
 * Generic NFVI test cases
 
  * OPNFV_YARDSTICK_TCO84 - SPEC CPU 2006 for VM
@@ -280,6 +285,8 @@ New Test cases
  * OPNFV_YARDSTICK_TC087 - SDN Controller resilience in non-HA configuration
  * OPNFV_YARDSTICK_TC090 - Control node Openstack service down - database instance
  * OPNFV_YARDSTICK_TC091 - Control node Openstack service down - heat-api
+ * OPNFV_YARDSTICK_TC092 - SDN Controller resilience in HA configuration
+ * OPNFV_YARDSTICK_TC093 - SDN Vswitch resilience in non-HA or HA configuration
 
 
 Version Change
@@ -384,6 +391,28 @@ Known Issues/Faults
 Corrected Faults
 ----------------
 
+Fraser 6.1.0:
+
++--------------------+--------------------------------------------------------------------------+
+| **JIRA REFERENCE** |                             **DESCRIPTION**                              |
++====================+==========================================================================+
+|   YARDSTICK-995    | Test case spec for SDN Virtual Switch resilience                         |
++--------------------+--------------------------------------------------------------------------+
+|   YARDSTICK-1097   | Add pod.yaml file for APEX installer                                     |
++--------------------+--------------------------------------------------------------------------+
+|   YARDSTICK-1122   | Remove unused code in SampleVNF                                          |
++--------------------+--------------------------------------------------------------------------+
+|   YARDSTICK-1125   | Update samples/test_suite.yaml                                           |
++--------------------+--------------------------------------------------------------------------+
+|   YARDSTICK-1132   | Document for Euphrates test case results                                 |
++--------------------+--------------------------------------------------------------------------+
+|   YARDSTICK-1138   | Support Restart Operation                                                |
++--------------------+--------------------------------------------------------------------------+
+|   YARDSTICK-1142   | start_service script fails to start openvswitch service in centos distro |
++--------------------+--------------------------------------------------------------------------+
+|   YARDSTICK-1165   | Bugfix: openrc api dump should be safe_dump                              |
++--------------------+--------------------------------------------------------------------------+
+
 Fraser 6.0.0:
 
 +--------------------+--------------------------------------------------------------------------+
index d1d934f..311c759 100644 (file)
@@ -22,7 +22,7 @@
     "angular-sanitize": "^1.6.5"
   },
    "resolutions": {
-    "angular": "~1.6.x"
+    "angular": "~1.7.x"
   },
   "devDependencies": {
     "angular-mocks": "^1.4.0"
index 76cd053..60014d7 100644 (file)
@@ -14,6 +14,7 @@ PTable==0.9.2           # BSD (3 clause); OSI Approved  BSD License
 ansible==2.4.2          # GPLv3; OSI Approved  GNU General Public License v3 or later (GPLv3+)
 backport-ipaddress==0.1; python_version <= "2.7"    # OSI Approved  Python Software Foundation License
 chainmap==1.0.2         # Python Software Foundation License; OSI Approved  Python Software Foundation License
+cmd2==0.8.6             # MIT License; OSI Approved  MIT License
 django==1.8.17          # BSD; OSI Approved  BSD License
                         # NOTE(ralonsoh): django must be bumped to 1.11.8; consider the migration notes [1]
                         # [1] https://docs.djangoproject.com/ja/1.11/ref/templates/upgrading/
@@ -38,7 +39,7 @@ os-client-config==1.28.0    # OSI Approved  Apache Software License
 osc-lib==1.7.0          # OSI Approved  Apache Software License
 oslo.config==4.11.1     # OSI Approved  Apache Software License
 oslo.i18n==3.17.0       # OSI Approved  Apache Software License
-oslo.messaging===5.30.2 # OSI Approved  Apache Software License
+oslo.messaging===5.36.0 # OSI Approved  Apache Software License
 oslo.privsep===1.22.1   # OSI Approved  Apache Software License
 oslo.serialization==2.20.1  # OSI Approved  Apache Software License
 oslo.utils==3.28.0      # OSI Approved  Apache Software License
index ba00553..c82abdb 100644 (file)
@@ -49,8 +49,10 @@ mode=gen
 tx port=p0
 bps=1250000000
 ; Ethernet + IP + UDP
-pkt inline=${sut_mac0} 3c fd fe 9f a3 08 08 00 45 00 00 1c 00 01 00 00 40 11 f7 7d c0 a8 01 01 c0 a8 01 01 13 88 13 88 00 08 55 7b
-lat pos=38
+pkt inline=${sut_mac0} 3c fd fe 9f a3 08 08 00 45 00 00 24 00 01 00 00 40 11 f7 7d c0 a8 01 01 c0 a8 01 01 13 88 13 88 00 10 55 7b 00 01 02 03 04 05 06 07
+lat pos=42
+signature pos=46
+signature=0xcafedeca
 
 [core 2]
 name=gen 1
@@ -59,18 +61,25 @@ mode=gen
 tx port=p1
 bps=1250000000
 ; Ethernet + IP + UDP
-pkt inline=${sut_mac1} 3c fd fe 9f a3 08 08 00 45 00 00 1c 00 01 00 00 40 11 f7 7d c0 a8 01 01 c0 a8 01 01 13 88 13 88 00 08 55 7b
-lat pos=38
+pkt inline=${sut_mac1} 3c fd fe 9f a3 08 08 00 45 00 00 24 00 01 00 00 40 11 f7 7d c0 a8 01 01 c0 a8 01 01 13 88 13 88 00 10 55 7b 00 01 02 03 04 05 06 07
+lat pos=42
+signature pos=46
+signature=0xcafedeca
 
 [core 3]
 name=rec 0
 task=0
 mode=lat
 rx port=p0
+lat pos=42
+signature pos=46
+signature=0xcafedeca
 
 [core 4]
 name=rec 0
 task=0
 mode=lat
 rx port=p1
-
+lat pos=42
+signature pos=46
+signature=0xcafedeca
index 41c31bf..5109c3d 100644 (file)
@@ -61,8 +61,10 @@ mode=gen
 tx port=p0
 bps=1250000000
 ; Ethernet + IP + UDP
-pkt inline=${sut_mac0} 3c fd fe 9f a3 08 08 00 45 00 00 1c 00 01 00 00 40 11 f7 7d c0 a8 01 01 c0 a8 01 01 13 88 13 88 00 08 55 7b
-lat pos=38
+pkt inline=${sut_mac0} 3c fd fe 9f a3 08 08 00 45 00 00 24 00 01 00 00 40 11 f7 7d c0 a8 01 01 c0 a8 01 01 13 88 13 88 00 10 55 7b 00 01 02 03 04 05 06 07
+lat pos=42
+signature pos=46
+signature=0xcafedeca
 
 [core 2]
 name=gen 1
@@ -71,8 +73,10 @@ mode=gen
 tx port=p1
 bps=1250000000
 ; Ethernet + IP + UDP
-pkt inline=${sut_mac1} 3c fd fe 9f a3 08 08 00 45 00 00 1c 00 01 00 00 40 11 f7 7d c0 a8 01 01 c0 a8 01 01 13 88 13 88 00 08 55 7b
-lat pos=38
+pkt inline=${sut_mac1} 3c fd fe 9f a3 08 08 00 45 00 00 24 00 01 00 00 40 11 f7 7d c0 a8 01 01 c0 a8 01 01 13 88 13 88 00 10 55 7b 00 01 02 03 04 05 06 07
+lat pos=42
+signature pos=46
+signature=0xcafedeca
 
 [core 3]
 name=gen 2
@@ -81,8 +85,10 @@ mode=gen
 tx port=p2
 bps=1250000000
 ; Ethernet + IP + UDP
-pkt inline=${sut_mac2} 3c fd fe 9f a5 08 08 00 45 00 00 1c 00 01 00 00 40 11 f7 7d c0 a8 01 01 c0 a8 01 01 13 88 13 88 00 08 55 7b
-lat pos=38
+pkt inline=${sut_mac2} 3c fd fe 9f a5 08 08 00 45 00 00 24 00 01 00 00 40 11 f7 7d c0 a8 01 01 c0 a8 01 01 13 88 13 88 00 10 55 7b 00 01 02 03 04 05 06 07
+lat pos=42
+signature pos=46
+signature=0xcafedeca
 
 [core 4]
 name=gen 3
@@ -91,30 +97,43 @@ mode=gen
 tx port=p3
 bps=1250000000
 ; Ethernet + IP + UDP
-pkt inline=${sut_mac3} 3c fd fe 9f a5 08 08 00 45 00 00 1c 00 01 00 00 40 11 f7 7d c0 a8 01 01 c0 a8 01 01 13 88 13 88 00 08 55 7b
-lat pos=38
+pkt inline=${sut_mac3} 3c fd fe 9f a5 08 08 00 45 00 00 24 00 01 00 00 40 11 f7 7d c0 a8 01 01 c0 a8 01 01 13 88 13 88 00 10 55 7b 00 01 02 03 04 05 06 07
+lat pos=42
+signature pos=46
+signature=0xcafedeca
 
 [core 5]
 name=rec 0
 task=0
 mode=lat
 rx port=p0
+lat pos=42
+signature pos=46
+signature=0xcafedeca
 
 [core 6]
 name=rec 1
 task=0
 mode=lat
 rx port=p1
+lat pos=42
+signature pos=46
+signature=0xcafedeca
 
 [core 7]
 name=rec 2
 task=0
 mode=lat
 rx port=p2
+lat pos=42
+signature pos=46
+signature=0xcafedeca
 
 [core 8]
 name=rec 3
 task=0
 mode=lat
 rx port=p3
-
+lat pos=42
+signature pos=46
+signature=0xcafedeca
index 61c13a0..7cd8c52 100644 (file)
@@ -47,9 +47,13 @@ task=0
 mode=gen
 tx port=p0
 bps=1250000000
-pkt inline=${sut_mac0} ${tester_mac0}  08 00 45 00 00 1c 00 01 00 00 40 11 f7 7d c0 a8 01 01 0a 00 00 00 13 88 13 88 00 08 55 7b
+pkt inline=${sut_mac0} ${tester_mac0} 08 00 45 00 00 24 00 01 00 00 40 11 f7 7d c0 a8 01 01 0a 00 00 00 13 88 13 88 00 10 55 7b 00 01 02 03 04 05 06 07
 random=0000101XXXXXXXXXXXXX0000XXXXXXX1
 rand_offset=30
+lat pos=42
+signature pos=46
+signature=0xcafedeca
+
 
 [core 2]
 name=p1
@@ -57,18 +61,27 @@ task=0
 mode=gen
 tx port=p1
 bps=1250000000
-pkt inline=${sut_mac1} ${tester_mac1} 08 00 45 00 00 1c 00 01 00 00 40 11 f7 7d c0 a8 01 01 0a 00 00 00 13 88 13 88 00 08 55 7b
+pkt inline=${sut_mac1} ${tester_mac1} 08 00 45 00 00 24 00 01 00 00 40 11 f7 7d c0 a8 01 01 0a 00 00 00 13 88 13 88 00 10 55 7b 00 01 02 03 04 05 06 07
 random=0000101XXXXXXXXXXXXX0000XXXXXXX1
 rand_offset=30
+lat pos=42
+signature pos=46
+signature=0xcafedeca
 
 [core 3]
 name=REC_P0
 task=0
 mode=lat
 rx port=p0
+lat pos=42
+signature pos=46
+signature=0xcafedeca
 
 [core 4]
 name=REC_P1
 task=0
 mode=lat
 rx port=p1
+lat pos=42
+signature pos=46
+signature=0xcafedeca
index 0879626..0a3795e 100644 (file)
@@ -56,9 +56,12 @@ task=0
 mode=gen
 tx port=p0
 bps=1250000000
-pkt inline=${sut_mac0} ${tester_mac0}  08 00 45 00 00 1c 00 01 00 00 40 11 f7 7d c0 a8 01 01 0a 00 00 00 13 88 13 88 00 08 55 7b
+pkt inline=${sut_mac0} ${tester_mac0} 08 00 45 00 00 24 00 01 00 00 40 11 f7 7d c0 a8 01 01 0a 00 00 00 13 88 13 88 00 10 55 7b 00 01 02 03 04 05 06 07
 random=0000101XXXXXXXXXXXXX0000XXXXXXX1
 rand_offset=30
+lat pos=42
+signature pos=46
+signature=0xcafedeca
 
 [core 2]
 name=p1
@@ -66,9 +69,12 @@ task=0
 mode=gen
 tx port=p1
 bps=1250000000
-pkt inline=${sut_mac1} ${tester_mac1} 08 00 45 00 00 1c 00 01 00 00 40 11 f7 7d c0 a8 01 01 0a 00 00 00 13 88 13 88 00 08 55 7b
+pkt inline=${sut_mac1} ${tester_mac1} 08 00 45 00 00 24 00 01 00 00 40 11 f7 7d c0 a8 01 01 0a 00 00 00 13 88 13 88 00 10 55 7b 00 01 02 03 04 05 06 07
 random=0000101XXXXXXXXXXXXX0000XXXXXXX1
 rand_offset=30
+lat pos=42
+signature pos=46
+signature=0xcafedeca
 
 [core 3]
 name=p2
@@ -76,9 +82,12 @@ task=0
 mode=gen
 tx port=p2
 bps=1250000000
-pkt inline=${sut_mac2} ${tester_mac2} 08 00 45 00 00 1c 00 01 00 00 40 11 f7 7d c0 a8 01 01 0a 00 00 00 13 88 13 88 00 08 55 7b
+pkt inline=${sut_mac2} ${tester_mac2} 08 00 45 00 00 24 00 01 00 00 40 11 f7 7d c0 a8 01 01 0a 00 00 00 13 88 13 88 00 10 55 7b 00 01 02 03 04 05 06 07
 random=0000101XXXXXXXXXXXXX0000XXXXXXX1
 rand_offset=30
+lat pos=42
+signature pos=46
+signature=0xcafedeca
 
 [core 4]
 name=p3
@@ -86,30 +95,45 @@ task=0
 mode=gen
 tx port=p3
 bps=1250000000
-pkt inline=${sut_mac3} ${tester_mac3} 08 00 45 00 00 1c 00 01 00 00 40 11 f7 7d c0 a8 01 01 0a 00 00 00 13 88 13 88 00 08 55 7b
+pkt inline=${sut_mac3} ${tester_mac3} 08 00 45 00 00 24 00 01 00 00 40 11 f7 7d c0 a8 01 01 0a 00 00 00 13 88 13 88 00 10 55 7b 00 01 02 03 04 05 06 07
 random=0000101XXXXXXXXXXXXX0000XXXXXXX1
 rand_offset=30
+lat pos=42
+signature pos=46
+signature=0xcafedeca
 
 [core 5]
 name=REC_P0
 task=0
 mode=lat
 rx port=p0
+lat pos=42
+signature pos=46
+signature=0xcafedeca
 
 [core 6]
 name=REC_P1
 task=0
 mode=lat
 rx port=p1
+lat pos=42
+signature pos=46
+signature=0xcafedeca
 
 [core 7]
 name=REC_P2
 task=0
 mode=lat
 rx port=p2
+lat pos=42
+signature pos=46
+signature=0xcafedeca
 
 [core 8]
 name=REC_P3
 task=0
 mode=lat
 rx port=p3
+lat pos=42
+signature pos=46
+signature=0xcafedeca
diff --git a/samples/vnf_samples/nsut/prox/prox-tg-topology-scale-up.yaml b/samples/vnf_samples/nsut/prox/prox-tg-topology-scale-up.yaml
new file mode 100644 (file)
index 0000000..74c48ba
--- /dev/null
@@ -0,0 +1,62 @@
+# Copyright (c) 2018 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+{% set vports = get(extra_args, 'vports', 2) %}
+nsd:nsd-catalog:
+    nsd:
+    -   id: prox-tg-topology
+        name: prox-tg-topology
+        short-name: prox-tg-topology
+        description: prox-tg-topology
+        constituent-vnfd:
+        -   member-vnf-index: '1'
+            vnfd-id-ref: tg__0
+            VNF model: ../../vnf_descriptors/tg_prox_tpl.yaml
+        -   member-vnf-index: '2'
+            vnfd-id-ref: vnf__0
+            VNF model: ../../vnf_descriptors/prox_vnf.yaml
+        vld:
+        -   id: uplink_0
+            name: tg__0 to vnf__0 link 1
+            type: ELAN
+            vnfd-connection-point-ref:
+            -   member-vnf-index-ref: '1'
+                vnfd-connection-point-ref: xe0
+                vnfd-id-ref: tg__0
+            -   member-vnf-index-ref: '2'
+                vnfd-connection-point-ref: xe0
+                vnfd-id-ref: vnf__0
+{% for vport in range(vports-1|int) %}
+        -   id: downlink_{{ vport }}
+            name: vnf__0 to tg__0 link {{ vport+2 }}
+            type: ELAN
+            vnfd-connection-point-ref:
+            -   member-vnf-index-ref: '1'
+                vnfd-connection-point-ref: xe{{ vport+1 }}
+                vnfd-id-ref: vnf__0
+            -   member-vnf-index-ref: '2'
+                vnfd-connection-point-ref: xe{{ vport+1 }}
+                vnfd-id-ref: tg__0
+{% else %}
+        -   id: downlink_0
+            name: vnf__0 to tg__0 link 1
+            type: ELAN
+            vnfd-connection-point-ref:
+            -   member-vnf-index-ref: '1'
+                vnfd-connection-point-ref: xe0
+                vnfd-id-ref: vnf__0
+            -   member-vnf-index-ref: '2'
+                vnfd-connection-point-ref: xe0
+                vnfd-id-ref: tg__0
+{% endfor %}
\ No newline at end of file
diff --git a/samples/vnf_samples/nsut/prox/tc_prox_baremetal_acl-scale-up.yaml b/samples/vnf_samples/nsut/prox/tc_prox_baremetal_acl-scale-up.yaml
new file mode 100644 (file)
index 0000000..b6b2285
--- /dev/null
@@ -0,0 +1,65 @@
+# Copyright (c) 2016-2018 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+{% set vports = vports or 2 %}
+{% set duration = duration or 300 %}
+---
+schema: "yardstick:task:0.1"
+
+scenarios:
+-
+  type: NSPerf
+  #
+  # In case where we know that all the packets generated by the generator
+  # will bw received. Then use prox_binsearch.
+  #
+  # In the case where some or all the packets generated by the generator may
+  # not be received. Please use prox_acl .. (This generates packets at
+  # a specific rate and does not change rate.
+  #
+  traffic_profile: ../../traffic_profiles/prox_acl.yaml
+  extra_args:
+    vports: {{ vports }}
+  topology: prox-tg-topology-scale-up.yaml
+
+  nodes:
+    tg__0: tg_0.yardstick
+    vnf__0: vnf_0.yardstick
+
+  options:
+    vnf__0:
+      prox_path: /opt/nsb_bin/prox
+      prox_config: "configs/handle_acl-{{ vports }}.cfg"
+      prox_args:
+        "-t": ""
+      prox_files:
+        "configs/acl_rules-2.lua": ""
+
+    tg__0:
+      prox_path: /opt/nsb_bin/prox
+      prox_config: "configs/gen_acl-{{ vports }}.cfg"
+      prox_args:
+        "-e": ""
+        "-t": ""
+
+  runner:
+    type: Duration
+    # we kill after duration, independent of test duration, so set this high
+    duration: {{ duration }}
+
+context:
+  type: Node
+  name: yardstick
+  nfvi_type: baremetal
+  file: prox-baremetal-{{ vports }}.yaml
diff --git a/samples/vnf_samples/nsut/prox/tc_prox_baremetal_l2fwd-scale-up.yaml b/samples/vnf_samples/nsut/prox/tc_prox_baremetal_l2fwd-scale-up.yaml
new file mode 100644 (file)
index 0000000..a346ae4
--- /dev/null
@@ -0,0 +1,57 @@
+# Copyright (c) 2016-2018 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+{% set vports = vports or 2 %}
+{% set underscore = '_' if type %}
+{% set type = type or '' %} # type: {'', 'multiflow', 'pktTouch'}
+{% set duration = duration or 300 %}
+---
+schema: "yardstick:task:0.1"
+
+scenarios:
+-
+  type: NSPerf
+  traffic_profile: ../../traffic_profiles/prox_binsearch.yaml
+  extra_args:
+    vports: {{ vports }}
+  topology: prox-tg-topology-scale-up.yaml
+
+  nodes:
+    tg__0: tg_0.yardstick
+    vnf__0: vnf_0.yardstick
+
+  options:
+    vnf__0:
+      prox_path: /opt/nsb_bin/prox
+      prox_config: "configs/handle_l2fwd{{ underscore }}{{ type }}-{{ vports }}.cfg"
+      prox_args:
+        "-t": ""
+
+    tg__0:
+      prox_path: /opt/nsb_bin/prox
+      prox_config: "configs/gen_l2fwd{{ underscore }}{{ type }}-{{ vports }}.cfg"
+      prox_args:
+        "-e": ""
+        "-t": ""
+
+  runner:
+    type: Duration
+    # we kill after duration, independent of test duration, so set this high
+    duration: {{ duration }}
+
+context:
+  type: Node
+  name: yardstick
+  nfvi_type: baremetal
+  file: prox-baremetal-{{ vports }}.yaml
diff --git a/samples/vnf_samples/nsut/prox/tc_prox_baremetal_l3fwd-scale-up.yaml b/samples/vnf_samples/nsut/prox/tc_prox_baremetal_l3fwd-scale-up.yaml
new file mode 100644 (file)
index 0000000..e1062d1
--- /dev/null
@@ -0,0 +1,57 @@
+# Copyright (c) 2016-2018 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+{% set vports = vports or 2 %}
+{% set duration = duration or 300 %}
+---
+schema: "yardstick:task:0.1"
+
+scenarios:
+-
+  type: NSPerf
+  traffic_profile: ../../traffic_profiles/prox_binsearch.yaml
+  extra_args:
+    vports: {{ vports }}
+  topology: prox-tg-topology-scale-up.yaml
+
+  nodes:
+    tg__0: tg_0.yardstick
+    vnf__0: vnf_0.yardstick
+
+  options:
+    vnf__0:
+      prox_path: /opt/nsb_bin/prox
+      prox_config: "configs/handle_l3fwd-{{ vports }}.cfg"
+      prox_args:
+        "-t": ""
+      prox_files:
+        "configs/ipv4.lua" : ""
+
+    tg__0:
+      prox_path: /opt/nsb_bin/prox
+      prox_config: "configs/gen_l3fwd-{{ vports }}.cfg"
+      prox_args:
+        "-e": ""
+        "-t": ""
+
+  runner:
+    type: Duration
+    # we kill after duration, independent of test duration, so set this high
+    duration: {{ duration }}
+
+context:
+  type: Node
+  name: yardstick
+  nfvi_type: baremetal
+  file: prox-baremetal-{{ vports }}.yaml
diff --git a/samples/vnf_samples/nsut/prox/tc_prox_baremetal_mpls_tagging-scale-up.yaml b/samples/vnf_samples/nsut/prox/tc_prox_baremetal_mpls_tagging-scale-up.yaml
new file mode 100644 (file)
index 0000000..f45b6e9
--- /dev/null
@@ -0,0 +1,55 @@
+# Copyright (c) 2016-2018 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+{% set vports = vports or 2 %}
+{% set duration = duration or 400 %}
+---
+schema: "yardstick:task:0.1"
+
+scenarios:
+-
+  type: NSPerf
+  traffic_profile: ../../traffic_profiles/prox_mpls_tag_untag.yaml
+  extra_args:
+    vports: {{ vports }}
+  topology: prox-tg-topology-scale-up.yaml
+
+  nodes:
+    tg__0: tg_0.yardstick
+    vnf__0: vnf_0.yardstick
+
+  options:
+    vnf__0:
+      prox_path: /opt/nsb_bin/prox
+      prox_config: "configs/handle_mpls_tag_untag-{{ vports }}.cfg"
+      prox_args:
+        "-t": ""
+
+    tg__0:
+      prox_path: /opt/nsb_bin/prox
+      prox_config: "configs/gen_mpls_tag_untag-{{ vports }}.cfg"
+      prox_args:
+        "-e": ""
+        "-t": ""
+
+  runner:
+    type: Duration
+    # we kill after duration, independent of test duration, so set this high
+    duration: {{ duration }}
+
+context:
+  type: Node
+  name: yardstick
+  nfvi_type: baremetal
+  file: prox-baremetal-{{ vports }}.yaml
diff --git a/samples/vnf_samples/nsut/prox/tc_prox_heat_context_acl-scale-up.yaml b/samples/vnf_samples/nsut/prox/tc_prox_heat_context_acl-scale-up.yaml
new file mode 100644 (file)
index 0000000..5e4ced1
--- /dev/null
@@ -0,0 +1,103 @@
+# Copyright (c) 2016-2018 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+{% set vports = vports or 2 %}
+{% set mem = mem or 20480 %}
+{% set vcpus = vcpus or 10 %}
+{% set disk = disk or 6 %}
+{% set duration = duration or 300 %}
+---
+schema: "yardstick:task:0.1"
+
+scenarios:
+-
+  type: NSPerf
+  #
+  # In case where we know that all the packets generated by the generator
+  # will bw received. Then use prox_binsearch.
+  #
+  # In the case where some or all the packets generated by the generator may
+  # not be received. Please use prox_heat_acl .. (This generates packets at
+  # a specific rate and does not change rate.
+  #
+  traffic_profile: ../../traffic_profiles/prox_heat_acl.yaml
+  extra_args:
+    vports: {{ vports }}
+  topology: prox-tg-topology-scale-up.yaml
+
+  nodes:
+    tg__0: tg_0.yardstick
+    vnf__0: vnf_0.yardstick
+
+  options:
+    vnf__0:
+      prox_path: /opt/nsb_bin/prox
+      prox_config: "configs/handle_acl-{{ vports }}.cfg"
+      prox_args:
+        "-t": ""
+      prox_files:
+        "configs/acl_rules-2.lua" : ""
+
+    tg__0:
+      prox_path: /opt/nsb_bin/prox
+      prox_config: "configs/gen_acl-{{ vports }}.cfg"
+      prox_args:
+        "-e": ""
+        "-t": ""
+
+  runner:
+    type: Duration
+    # we kill after duration, independent of test duration, so set this high
+    duration: {{ duration }}
+
+context:
+  name: yardstick
+  image: yardstick-samplevnfs
+  user: ubuntu
+  flavor:
+    vcpus: {{ vcpus }}
+    ram: {{ mem }}
+    disk: {{ disk }}
+    extra_specs:
+      hw:cpu_sockets: 1
+      hw:cpu_cores: {{ vcpus }}
+      hw:cpu_threads: 1
+  placement_groups:
+    pgrp1:
+      policy: "availability"
+
+  servers:
+    vnf_0:
+      floating_ip: true
+      placement: "pgrp1"
+    tg_0:
+      floating_ip: true
+      placement: "pgrp1"
+
+  networks:
+    mgmt:
+      cidr: '10.0.1.0/24'
+    uplink_0:
+      cidr: '10.0.2.0/24'
+      gateway_ip: 'null'
+      port_security_enabled: False
+      enable_dhcp: 'false'
+{% for vport in range(vports-1|int) %}
+    downlink_{{ vport }}:
+      cidr: '10.0.{{ vport+3 }}.0/24'
+      gateway_ip: 'null'
+      port_security_enabled: False
+      enable_dhcp: 'false'
+{% endfor %}
+
diff --git a/samples/vnf_samples/nsut/prox/tc_prox_heat_context_l2fwd-l3fwd-scale-up.yaml b/samples/vnf_samples/nsut/prox/tc_prox_heat_context_l2fwd-l3fwd-scale-up.yaml
new file mode 100644 (file)
index 0000000..af2ab15
--- /dev/null
@@ -0,0 +1,128 @@
+# Copyright (c) 2016-2018 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+{% set vports = vports or 2 %}
+{% set mem = mem or 20480 %}
+{% set vcpus = vcpus or 10 %}
+{% set disk = disk or 6 %}
+{% set timeout = timeout or 300 %}
+---
+schema: "yardstick:task:0.1"
+
+scenarios:
+-
+  type: NSPerf
+  traffic_profile: ../../traffic_profiles/prox_binsearch.yaml
+  extra_args:
+    vports: {{ vports }}
+  topology: prox-tg-topology-scale-up.yaml
+
+  nodes:
+    tg__0: tg_0.yardstick
+    vnf__0: vnf_0.yardstick
+
+  options:
+    vnf__0:
+      prox_path: /opt/nsb_bin/prox
+      prox_config: "configs/handle_l2fwd-{{ vports }}.cfg"
+      prox_args:
+        "-t": ""
+
+    tg__0:
+      prox_path: /opt/nsb_bin/prox
+      prox_config: "configs/gen_l2fwd-{{ vports }}.cfg"
+      prox_args:
+        "-e": ""
+        "-t": ""
+
+  runner:
+    type: Search
+    # we kill after duration, independent of test duration, so set this high
+    interval: 5
+    timeout: {{ timeout }}
+
+-
+  type: NSPerf
+  traffic_profile: ../../traffic_profiles/prox_binsearch.yaml
+  extra_args:
+    vports: {{ vports }}
+  topology: prox-tg-topology-scale-up.yaml
+
+  nodes:
+    tg__0: tg_0.yardstick
+    vnf__0: vnf_0.yardstick
+
+  options:
+    vnf__0:
+      prox_path: /opt/nsb_bin/prox
+      prox_config: "configs/handle_l3fwd-{{ vports }}.cfg"
+      prox_args:
+        "-t": ""
+      prox_files:
+        "configs/ipv4.lua" : ""
+
+    tg__0:
+      prox_path: /opt/nsb_bin/prox
+      prox_config: "configs/gen_l3fwd-{{ vports }}.cfg"
+      prox_args:
+        "-e": ""
+        "-t": ""
+
+  runner:
+    type: Search
+    # we kill after duration, independent of test duration, so set this high
+    interval: 5
+    timeout: {{ timeout }}
+
+context:
+  name: yardstick
+  image: yardstick-samplevnfs
+  user: ubuntu
+  flavor:
+    vcpus: {{ vcpus }}
+    ram: {{ mem }}
+    disk: {{ disk }}
+    extra_specs:
+      hw:cpu_sockets: 1
+      hw:cpu_cores: {{ vcpus }}
+      hw:cpu_threads: 1
+
+  placement_groups:
+    pgrp1:
+      policy: "availability"
+
+  servers:
+    vnf_0:
+      floating_ip: true
+      placement: "pgrp1"
+    tg_0:
+      floating_ip: true
+      placement: "pgrp1"
+
+  networks:
+    mgmt:
+      cidr: '10.0.1.0/24'
+{% for vport in range(1,vports,2|int) %}
+    uplink_{{ loop.index0 }}:
+      cidr: '10.0.{{ vport+1 }}.0/24'
+      gateway_ip: 'null'
+      port_security_enabled: False
+      enable_dhcp: 'false'
+
+    downlink_{{ loop.index0 }}:
+      cidr: '10.0.{{ vport+2 }}.0/24'
+      gateway_ip: 'null'
+      port_security_enabled: False
+      enable_dhcp: 'false'
+{% endfor %}
diff --git a/samples/vnf_samples/nsut/prox/tc_prox_heat_context_l2fwd-scale-up.yaml b/samples/vnf_samples/nsut/prox/tc_prox_heat_context_l2fwd-scale-up.yaml
new file mode 100644 (file)
index 0000000..4463729
--- /dev/null
@@ -0,0 +1,94 @@
+# Copyright (c) 2016-2018 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+{% set vports = vports or 2 %}
+{% set underscore = '_' if type %}
+{% set type = type or '' %} # type: {'', 'multiflow', 'pktTouch'}
+{% set mem = mem or 20480 %}
+{% set vcpus = vcpus or 10 %}
+{% set disk = disk or 6 %}
+{% set duration = duration or 300 %}
+---
+schema: "yardstick:task:0.1"
+
+scenarios:
+-
+  type: NSPerf
+  traffic_profile: ../../traffic_profiles/prox_binsearch.yaml
+  extra_args:
+    vports: {{ vports }}
+  topology: prox-tg-topology-scale-up.yaml
+
+  nodes:
+    tg__0: tg_0.yardstick
+    vnf__0: vnf_0.yardstick
+
+  options:
+    vnf__0:
+      prox_path: /opt/nsb_bin/prox
+      prox_config: "configs/handle_l2fwd{{ underscore }}{{ type }}-{{ vports }}.cfg"
+      prox_args:
+        "-t": ""
+
+    tg__0:
+      prox_path: /opt/nsb_bin/prox
+      prox_config: "configs/gen_l2fwd{{ underscore }}{{ type }}-{{ vports }}.cfg"
+      prox_args:
+        "-e": ""
+        "-t": ""
+
+  runner:
+    type: Duration
+    # we kill after duration, independent of test duration, so set this high
+    duration: {{ duration }}
+
+context:
+  name: yardstick
+  image: yardstick-samplevnfs
+  user: ubuntu
+  flavor:
+    vcpus: {{ vcpus }}
+    ram: {{ mem }}
+    disk: {{ disk }}
+    extra_specs:
+      hw:cpu_sockets: 1
+      hw:cpu_cores: {{ vcpus }}
+      hw:cpu_threads: 1
+  placement_groups:
+    pgrp1:
+      policy: "availability"
+
+  servers:
+    vnf_0:
+      floating_ip: true
+      placement: "pgrp1"
+    tg_0:
+      floating_ip: true
+      placement: "pgrp1"
+
+  networks:
+    mgmt:
+      cidr: '10.0.1.0/24'
+    uplink_0:
+      cidr: '10.0.2.0/24'
+      gateway_ip: 'null'
+      port_security_enabled: False
+      enable_dhcp: 'false'
+{% for vport in range(vports-1|int) %}
+    downlink_{{ vport }}:
+      cidr: '10.0.{{ vport+3 }}.0/24'
+      gateway_ip: 'null'
+      port_security_enabled: False
+      enable_dhcp: 'false'
+{% endfor %}
diff --git a/samples/vnf_samples/nsut/prox/tc_prox_heat_context_l3fwd-scale-up.yaml b/samples/vnf_samples/nsut/prox/tc_prox_heat_context_l3fwd-scale-up.yaml
new file mode 100644 (file)
index 0000000..3462d28
--- /dev/null
@@ -0,0 +1,96 @@
+# Copyright (c) 2016-2018 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+{% set vports = vports or 2 %}
+{% set mem = mem or 20480 %}
+{% set vcpus = vcpus or 10 %}
+{% set disk = disk or 6 %}
+{% set duration = duration or 300 %}
+---
+schema: "yardstick:task:0.1"
+
+scenarios:
+-
+  type: NSPerf
+  traffic_profile: ../../traffic_profiles/prox_binsearch.yaml
+  extra_args:
+    vports: {{ vports }}
+  topology: prox-tg-topology-scale-up.yaml
+
+  nodes:
+    tg__0: tg_0.yardstick
+    vnf__0: vnf_0.yardstick
+
+  options:
+    vnf__0:
+      prox_path: /opt/nsb_bin/prox
+      prox_config: "configs/handle_l3fwd-{{ vports }}.cfg"
+      prox_args:
+        "-t": ""
+      prox_files:
+        "configs/ipv4.lua" : ""
+
+    tg__0:
+      prox_path: /opt/nsb_bin/prox
+      prox_config: "configs/gen_l3fwd-{{ vports }}.cfg"
+      prox_args:
+        "-e": ""
+        "-t": ""
+
+  runner:
+    type: Duration
+    # we kill after duration, independent of test duration, so set this high
+    duration: {{ duration }}
+
+context:
+  name: yardstick
+  image: yardstick-samplevnfs
+  user: ubuntu
+  flavor:
+    vcpus: {{ vcpus }}
+    ram: {{ mem }}
+    disk: {{ disk }}
+    extra_specs:
+      hw:cpu_sockets: 1
+      hw:cpu_cores: {{ vcpus }}
+      hw:cpu_threads: 1
+
+  placement_groups:
+    pgrp1:
+      policy: "availability"
+
+  servers:
+    vnf_0:
+      floating_ip: true
+      placement: "pgrp1"
+    tg_0:
+      floating_ip: true
+      placement: "pgrp1"
+
+  networks:
+    mgmt:
+      cidr: '10.0.1.0/24'
+    uplink_0:
+      cidr: '10.0.2.0/24'
+      gateway_ip: 'null'
+      port_security_enabled: False
+      enable_dhcp: 'false'
+{% for vport in range(vports-1|int) %}
+    downlink_{{ vport }}:
+      cidr: '10.0.{{ vport+3 }}.0/24'
+      gateway_ip: 'null'
+      port_security_enabled: False
+      enable_dhcp: 'false'
+{% endfor %}
+
diff --git a/samples/vnf_samples/nsut/prox/tc_prox_heat_context_mpls_tagging-scale-up.yaml b/samples/vnf_samples/nsut/prox/tc_prox_heat_context_mpls_tagging-scale-up.yaml
new file mode 100644 (file)
index 0000000..ef28946
--- /dev/null
@@ -0,0 +1,93 @@
+# Copyright (c) 2016-2018 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+{% set vports = vports or 2 %}
+{% set mem = mem or 20480 %}
+{% set vcpus = vcpus or 10 %}
+{% set disk = disk or 6 %}
+{% set duration = duration or 300 %}
+---
+schema: "yardstick:task:0.1"
+
+scenarios:
+-
+  type: NSPerf
+  traffic_profile: ../../traffic_profiles/prox_mpls_tag_untag.yaml
+  extra_args:
+    vports: {{ vports }}
+  topology: prox-tg-topology-scale-up.yaml
+
+  nodes:
+    tg__0: tg_0.yardstick
+    vnf__0: vnf_0.yardstick
+
+  options:
+    vnf__0:
+      prox_path: /opt/nsb_bin/prox
+      prox_config: "configs/handle_mpls_tag_untag-{{ vports }}.cfg"
+      prox_args:
+        "-t": ""
+
+    tg__0:
+      prox_path: /opt/nsb_bin/prox
+      prox_config: "configs/gen_mpls_tag_untag-{{ vports }}.cfg"
+      prox_args:
+        "-e": ""
+        "-t": ""
+
+  runner:
+    type: Duration
+    # we kill after duration, independent of test duration, so set this high
+    duration: {{ duration }}
+
+context:
+  name: yardstick
+  image: yardstick-samplevnfs
+  user: ubuntu
+  flavor:
+    vcpus: {{ vcpus }}
+    ram: {{ mem }}
+    disk: {{ disk }}
+    extra_specs:
+      hw:cpu_sockets: 1
+      hw:cpu_cores: {{ vcpus }}
+      hw:cpu_threads: 1
+
+  placement_groups:
+    pgrp1:
+      policy: "availability"
+
+  servers:
+    vnf_0:
+      floating_ip: true
+      placement: "pgrp1"
+    tg_0:
+      floating_ip: true
+      placement: "pgrp1"
+
+  networks:
+    mgmt:
+      cidr: '10.0.1.0/24'
+    uplink_0:
+      cidr: '10.0.2.0/24'
+      gateway_ip: 'null'
+      port_security_enabled: False
+      enable_dhcp: 'false'
+{% for vport in range(vports-1|int) %}
+    downlink_{{ vport }}:
+      cidr: '10.0.{{ vport+3 }}.0/24'
+      gateway_ip: 'null'
+      port_security_enabled: False
+      enable_dhcp: 'false'
+{% endfor %}
index 5935abb..95b2b8a 100644 (file)
 # See the License for the specific language governing permissions and\r
 # limitations under the License.\r
 \r
-from yardstick import tests\r
+import sys\r
+\r
+import mock\r
 \r
+from yardstick import tests\r
 \r
 # NOTE(ralonsoh): to be removed. Replace all occurrences of\r
 # tests.unit.STL_MOCKS with yardstick.tests.STL_MOCKS\r
 STL_MOCKS = tests.STL_MOCKS\r
+\r
+mock_stl = mock.patch.dict(sys.modules, tests.STL_MOCKS)\r
+mock_stl.start()\r
index 4d43f26..320c61c 100644 (file)
@@ -45,7 +45,7 @@ VM_TEMPLATE = """
   <vcpu cpuset='{cpuset}'>{vcpu}</vcpu>
  {cputune}
   <os>
-    <type arch="x86_64" machine="pc-i440fx-utopic">hvm</type>
+    <type arch="x86_64" machine="pc-i440fx-xenial">hvm</type>
     <boot dev="hd" />
   </os>
   <features>
index 95472fd..2f93e53 100644 (file)
@@ -194,10 +194,10 @@ class SriovContext(Context):
         slot = index + idx + 10
         vf['vpci'] = \
             "{}:{}:{:02x}.{}".format(vpci.domain, vpci.bus, slot, vpci.function)
-        model.Libvirt.add_sriov_interfaces(
-            vf['vpci'], vf['vf_pci']['vf_pci'], vf['mac'], str(cfg))
         self.connection.execute("ifconfig %s up" % vf['interface'])
         self.connection.execute(vf_spoofchk.format(vf['interface']))
+        return model.Libvirt.add_sriov_interfaces(
+            vf['vpci'], vf['vf_pci']['vf_pci'], vf['mac'], str(cfg))
 
     def setup_sriov_context(self):
         nodes = []
@@ -220,7 +220,7 @@ class SriovContext(Context):
             network_ports = collections.OrderedDict(
                 {k: v for k, v in vnf["network_ports"].items() if k != 'mgmt'})
             for idx, vfs in enumerate(network_ports.values()):
-                self._enable_interfaces(index, idx, vfs, cfg)
+                xml_str = self._enable_interfaces(index, idx, vfs, xml_str)
 
             # copy xml to target...
             model.Libvirt.write_file(cfg, xml_str)
index bcffc74..d057894 100644 (file)
@@ -6,14 +6,11 @@
 # which accompanies this distribution, and is available at
 # http://www.apache.org/licenses/LICENSE-2.0
 ##############################################################################
-
-from __future__ import print_function
-from __future__ import absolute_import
-
 import logging
 
 from yardstick.benchmark.scenarios import base
-import yardstick.common.openstack_utils as op_utils
+from yardstick.common import openstack_utils
+from yardstick.common import exceptions
 
 LOG = logging.getLogger(__name__)
 
@@ -26,20 +23,23 @@ class CreateImage(base.Scenario):
     def __init__(self, scenario_cfg, context_cfg):
         self.scenario_cfg = scenario_cfg
         self.context_cfg = context_cfg
-        self.options = self.scenario_cfg['options']
-
-        self.image_name = self.options.get("image_name", "TestImage")
-        self.file_path = self.options.get("file_path", None)
-        self.disk_format = self.options.get("disk_format", "qcow2")
-        self.container_format = self.options.get("container_format", "bare")
-        self.min_disk = self.options.get("min_disk", 0)
-        self.min_ram = self.options.get("min_ram", 0)
-        self.protected = self.options.get("protected", False)
-        self.public = self.options.get("public", "public")
-        self.tags = self.options.get("tags", [])
-        self.custom_property = self.options.get("property", {})
-
-        self.glance_client = op_utils.get_glance_client()
+        self.options = self.scenario_cfg["options"]
+
+        self.name = self.options["image_name"]
+        self.file_name = self.options.get("file_name")
+        self.container = self.options.get("container", 'images')
+        self.md5 = self.options.get("md5")
+        self.sha256 = self.options.get("sha256")
+        self.disk_format = self.options.get("disk_format")
+        self.container_format = self.options.get("container_format",)
+        self.disable_vendor_agent = self.options.get("disable_vendor_agent", True)
+        self.wait = self.options.get("wait", True)
+        self.timeout = self.options.get("timeout", 3600)
+        self.allow_duplicates = self.options.get("allow_duplicates", False)
+        self.meta = self.options.get("meta")
+        self.volume = self.options.get("volume")
+
+        self.shade_client = openstack_utils.get_shade_client()
 
         self.setup_done = False
 
@@ -54,19 +54,22 @@ class CreateImage(base.Scenario):
         if not self.setup_done:
             self.setup()
 
-        image_id = op_utils.create_image(self.glance_client, self.image_name,
-                                         self.file_path, self.disk_format,
-                                         self.container_format, self.min_disk,
-                                         self.min_ram, self.protected, self.tags,
-                                         self.public, **self.custom_property)
-
-        if image_id:
-            LOG.info("Create image successful!")
-            values = [image_id]
-
-        else:
-            LOG.info("Create image failed!")
-            values = []
-
-        keys = self.scenario_cfg.get('output', '').split()
+        image_id = openstack_utils.create_image(
+            self.shade_client, self.name, filename=self.file_name,
+            container=self.container, md5=self.md5, sha256=self.sha256,
+            disk_format=self.disk_format,
+            container_format=self.container_format,
+            disable_vendor_agent=self.disable_vendor_agent, wait=self.wait,
+            timeout=self.timeout, allow_duplicates=self.allow_duplicates,
+            meta=self.meta, volume=self.volume)
+
+        if not image_id:
+            result.update({"image_create": 0})
+            LOG.error("Create image failed!")
+            raise exceptions.ScenarioCreateImageError
+
+        result.update({"image_create": 1})
+        LOG.info("Create image successful!")
+        keys = self.scenario_cfg.get("output", '').split()
+        values = [image_id]
         return self._push_to_outputs(keys, values)
index 0e3a853..008f104 100644 (file)
@@ -7,13 +7,11 @@
 # http://www.apache.org/licenses/LICENSE-2.0
 ##############################################################################
 
-from __future__ import print_function
-from __future__ import absolute_import
-
 import logging
 
 from yardstick.benchmark.scenarios import base
-import yardstick.common.openstack_utils as op_utils
+from yardstick.common import openstack_utils
+from yardstick.common import exceptions
 
 LOG = logging.getLogger(__name__)
 
@@ -26,12 +24,14 @@ class DeleteImage(base.Scenario):
     def __init__(self, scenario_cfg, context_cfg):
         self.scenario_cfg = scenario_cfg
         self.context_cfg = context_cfg
-        self.options = self.scenario_cfg['options']
+        self.options = self.scenario_cfg["options"]
 
-        self.image_name = self.options.get("image_name", "TestImage")
-        self.image_id = None
+        self.image_name_or_id = self.options["name_or_id"]
+        self.wait = self.options.get("wait", False)
+        self.timeout = self.options.get("timeout", 3600)
+        self.delete_objects = self.options.get("delete_objects", True)
 
-        self.glance_client = op_utils.get_glance_client()
+        self.shade_client = openstack_utils.get_shade_client()
 
         self.setup_done = False
 
@@ -46,16 +46,14 @@ class DeleteImage(base.Scenario):
         if not self.setup_done:
             self.setup()
 
-        self.image_id = op_utils.get_image_id(self.glance_client, self.image_name)
-        LOG.info("Deleting image: %s", self.image_name)
-        status = op_utils.delete_image(self.glance_client, self.image_id)
+        status = openstack_utils.delete_image(
+            self.shade_client, self.image_name_or_id, wait=self.wait,
+            timeout=self.timeout, delete_objects=self.delete_objects)
 
-        if status:
-            LOG.info("Delete image successful!")
-            values = [status]
-        else:
-            LOG.info("Delete image failed!")
-            values = []
+        if not status:
+            result.update({"delete_image": 0})
+            LOG.error("Delete image failed!")
+            raise exceptions.ScenarioDeleteImageError
 
-        keys = self.scenario_cfg.get('output', '').split()
-        return self._push_to_outputs(keys, values)
+        result.update({"delete_image": 1})
+        LOG.info("Delete image successful!")
index 78f866e..1c3ea1f 100644 (file)
 # limitations under the License.
 
 import copy
-import logging
-import time
-
 import ipaddress
 from itertools import chain
+import logging
 import os
 import sys
+import time
 
 import six
 import yaml
 
 from yardstick.benchmark.scenarios import base as scenario_base
-from yardstick.error import IncorrectConfig
 from yardstick.common.constants import LOG_DIR
+from yardstick.common import exceptions
 from yardstick.common.process import terminate_children
 from yardstick.common import utils
 from yardstick.network_services.collector.subscriber import Collector
@@ -190,8 +189,9 @@ class NetworkServiceTestCase(scenario_base.Scenario):
             try:
                 node0_data, node1_data = vld["vnfd-connection-point-ref"]
             except (ValueError, TypeError):
-                raise IncorrectConfig("Topology file corrupted, "
-                                      "wrong endpoint count for connection")
+                raise exceptions.IncorrectConfig(
+                    error_msg='Topology file corrupted, wrong endpoint count '
+                              'for connection')
 
             node0_name = self._find_vnf_name_from_id(node0_data["member-vnf-index-ref"])
             node1_name = self._find_vnf_name_from_id(node1_data["member-vnf-index-ref"])
@@ -237,15 +237,17 @@ class NetworkServiceTestCase(scenario_base.Scenario):
 
             except KeyError:
                 LOG.exception("")
-                raise IncorrectConfig("Required interface not found, "
-                                      "topology file corrupted")
+                raise exceptions.IncorrectConfig(
+                    error_msg='Required interface not found, topology file '
+                              'corrupted')
 
         for vld in self.topology['vld']:
             try:
                 node0_data, node1_data = vld["vnfd-connection-point-ref"]
             except (ValueError, TypeError):
-                raise IncorrectConfig("Topology file corrupted, "
-                                      "wrong endpoint count for connection")
+                raise exceptions.IncorrectConfig(
+                    error_msg='Topology file corrupted, wrong endpoint count '
+                              'for connection')
 
             node0_name = self._find_vnf_name_from_id(node0_data["member-vnf-index-ref"])
             node1_name = self._find_vnf_name_from_id(node1_data["member-vnf-index-ref"])
@@ -330,8 +332,9 @@ class NetworkServiceTestCase(scenario_base.Scenario):
         except StopIteration:
             pass
 
-        raise IncorrectConfig("No implementation for %s found in %s" %
-                              (expected_name, classes_found))
+        message = ('No implementation for %s found in %s'
+                   % (expected_name, classes_found))
+        raise exceptions.IncorrectConfig(error_msg=message)
 
     @staticmethod
     def create_interfaces_from_node(vnfd, node):
index 8a0c52d..966b15c 100644 (file)
@@ -21,6 +21,16 @@ class ProcessExecutionError(RuntimeError):
         self.returncode = returncode
 
 
+class ErrorClass(object):
+
+    def __init__(self, *args, **kwargs):
+        if 'test' not in kwargs:
+            raise RuntimeError
+
+    def __getattr__(self, item):
+        raise AttributeError
+
+
 class YardstickException(Exception):
     """Base Yardstick Exception.
 
@@ -137,6 +147,26 @@ class LibvirtQemuImageCreateError(YardstickException):
                '%(base_image)s. Error: %(error)s.')
 
 
+class SSHError(YardstickException):
+    message = '%(error_msg)s'
+
+
+class SSHTimeout(SSHError):
+    pass
+
+
+class IncorrectConfig(YardstickException):
+    message = '%(error_msg)s'
+
+
+class IncorrectSetup(YardstickException):
+    message = '%(error_msg)s'
+
+
+class IncorrectNodeSetup(IncorrectSetup):
+    pass
+
+
 class ScenarioConfigContextNameNotFound(YardstickException):
     message = 'Context name "%(context_name)s" not found'
 
@@ -259,3 +289,23 @@ class UploadOpenrcError(ApiServerError):
 
 class UpdateOpenrcError(ApiServerError):
     message = 'Update openrc ERROR!'
+
+
+class ScenarioCreateImageError(YardstickException):
+    message = 'Glance Create Image Scenario failed'
+
+
+class ScenarioDeleteImageError(YardstickException):
+    message = 'Glance Delete Image Scenario failed'
+
+
+class IxNetworkClientNotConnected(YardstickException):
+    message = 'IxNetwork client not connected to a TCL server'
+
+
+class IxNetworkFlowNotPresent(YardstickException):
+    message = 'Flow Group "%(flow_group)s" is not present'
+
+
+class IxNetworkFieldNotPresentInStackItem(YardstickException):
+    message = 'Field "%(field_name)s" not present in stack item %(stack_item)s'
index e3e08fe..6ff6617 100644 (file)
@@ -724,48 +724,75 @@ def create_security_group_full(shade_client, sg_name,
 # *********************************************
 #   GLANCE
 # *********************************************
-def get_image_id(glance_client, image_name):    # pragma: no cover
-    images = glance_client.images.list()
-    return next((i.id for i in images if i.name == image_name), None)
-
-
-def create_image(glance_client, image_name, file_path, disk_format,
-                 container_format, min_disk, min_ram, protected, tag,
-                 public, **kwargs):    # pragma: no cover
-    if not os.path.isfile(file_path):
-        log.error("Error: file %s does not exist.", file_path)
-        return None
+def create_image(shade_client, name, filename=None, container='images',
+                 md5=None, sha256=None, disk_format=None,
+                 container_format=None, disable_vendor_agent=True,
+                 wait=False, timeout=3600, allow_duplicates=False, meta=None,
+                 volume=None, **kwargs):
+    """Upload an image.
+
+    :param name:(str) Name of the image to create. If it is a pathname of an
+                image, the name will be constructed from the extensionless
+                basename of the path.
+    :param filename:(str) The path to the file to upload, if needed.
+    :param container:(str) Name of the container in swift where images should
+                     be uploaded for import if the cloud requires such a thing.
+    :param md5:(str) md5 sum of the image file. If not given, an md5 will
+            be calculated.
+    :param sha256:(str) sha256 sum of the image file. If not given, an md5
+                  will be calculated.
+    :param disk_format:(str) The disk format the image is in.
+    :param container_format:(str) The container format the image is in.
+    :param disable_vendor_agent:(bool) Whether or not to append metadata
+                                flags to the image to inform the cloud in
+                                question to not expect a vendor agent to be running.
+    :param wait:(bool) If true, waits for image to be created.
+    :param timeout:(str) Seconds to wait for image creation.
+    :param allow_duplicates:(bool) If true, skips checks that enforce unique
+                            image name.
+    :param meta:(dict) A dict of key/value pairs to use for metadata that
+                bypasses automatic type conversion.
+    :param volume:(str) Name or ID or volume object of a volume to create an
+                  image from.
+    Additional kwargs will be passed to the image creation as additional
+    metadata for the image and will have all values converted to string
+    except for min_disk, min_ram, size and virtual_size which will be
+    converted to int.
+    If you are sure you have all of your data types correct or have an
+    advanced need to be explicit, use meta. If you are just a normal
+    consumer, using kwargs is likely the right choice.
+    If a value is in meta and kwargs, meta wins.
+    :returns: Image id
+    """
     try:
-        image_id = get_image_id(glance_client, image_name)
+        image_id = shade_client.get_image_id(name)
         if image_id is not None:
-            log.info("Image %s already exists.", image_name)
-        else:
-            log.info("Creating image '%s' from '%s'...", image_name, file_path)
-
-            image = glance_client.images.create(
-                name=image_name, visibility=public, disk_format=disk_format,
-                container_format=container_format, min_disk=min_disk,
-                min_ram=min_ram, tags=tag, protected=protected, **kwargs)
-            image_id = image.id
-            with open(file_path) as image_data:
-                glance_client.images.upload(image_id, image_data)
+            log.info("Image %s already exists.", name)
+            return image_id
+        log.info("Creating image '%s'", name)
+        image = shade_client.create_image(
+            name, filename=filename, container=container, md5=md5, sha256=sha256,
+            disk_format=disk_format, container_format=container_format,
+            disable_vendor_agent=disable_vendor_agent, wait=wait, timeout=timeout,
+            allow_duplicates=allow_duplicates, meta=meta, volume=volume, **kwargs)
+        image_id = image["id"]
         return image_id
-    except Exception:  # pylint: disable=broad-except
-        log.error(
-            "Error [create_glance_image(glance_client, '%s', '%s', '%s')]",
-            image_name, file_path, public)
-        return None
+    except exc.OpenStackCloudException as op_exc:
+        log.error("Failed to create_image(shade_client). "
+                  "Exception message: %s", op_exc.orig_message)
 
 
-def delete_image(glance_client, image_id):    # pragma: no cover
+def delete_image(shade_client, name_or_id, wait=False, timeout=3600,
+                 delete_objects=True):
     try:
-        glance_client.images.delete(image_id)
+        return shade_client.delete_image(name_or_id, wait=wait,
+                                         timeout=timeout,
+                                         delete_objects=delete_objects)
 
-    except Exception:  # pylint: disable=broad-except
-        log.exception("Error [delete_flavor(glance_client, %s)]", image_id)
+    except exc.OpenStackCloudException as op_exc:
+        log.error("Failed to delete_image(shade_client). "
+                  "Exception message: %s", op_exc.orig_message)
         return False
-    else:
-        return True
 
 
 def list_images(shade_client=None):
diff --git a/yardstick/error.py b/yardstick/error.py
deleted file mode 100644 (file)
index 9b84de1..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright (c) 2016-2017 Intel Corporation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-
-class SSHError(Exception):
-    """Class handles ssh connection error exception"""
-    pass
-
-
-class SSHTimeout(SSHError):
-    """Class handles ssh connection timeout exception"""
-    pass
-
-
-class IncorrectConfig(Exception):
-    """Class handles incorrect configuration during setup"""
-    pass
-
-
-class IncorrectSetup(Exception):
-    """Class handles incorrect setup during setup"""
-    pass
-
-
-class IncorrectNodeSetup(IncorrectSetup):
-    """Class handles incorrect setup during setup"""
-    pass
-
-
-class ErrorClass(object):
-
-    def __init__(self, *args, **kwargs):
-        if 'test' not in kwargs:
-            raise RuntimeError
-
-    def __getattr__(self, item):
-        raise AttributeError
index 05b822c..1c74355 100644 (file)
@@ -18,12 +18,9 @@ import re
 from collections import defaultdict
 from itertools import chain
 
+from yardstick.common import exceptions
 from yardstick.common.utils import validate_non_string_sequence
-from yardstick.error import IncorrectConfig
-from yardstick.error import IncorrectSetup
-from yardstick.error import IncorrectNodeSetup
-from yardstick.error import SSHTimeout
-from yardstick.error import SSHError
+
 
 NETWORK_KERNEL = 'network_kernel'
 NETWORK_DPDK = 'network_dpdk'
@@ -51,7 +48,7 @@ class DpdkInterface(object):
         try:
             assert self.local_mac
         except (AssertionError, KeyError):
-            raise IncorrectConfig
+            raise exceptions.IncorrectConfig(error_msg='')
 
     @property
     def local_mac(self):
@@ -98,10 +95,12 @@ class DpdkInterface(object):
             # if we don't find all the keys then don't update
             pass
 
-        except (IncorrectNodeSetup, SSHError, SSHTimeout):
-            raise IncorrectConfig(
-                "Unable to probe missing interface fields '%s', on node %s "
-                "SSH Error" % (', '.join(self.missing_fields), self.dpdk_node.node_key))
+        except (exceptions.IncorrectNodeSetup, exceptions.SSHError,
+                exceptions.SSHTimeout):
+            message = ('Unable to probe missing interface fields "%s", on '
+                       'node %s SSH Error' % (', '.join(self.missing_fields),
+                                              self.dpdk_node.node_key))
+            raise exceptions.IncorrectConfig(error_msg=message)
 
 
 class DpdkNode(object):
@@ -118,11 +117,12 @@ class DpdkNode(object):
         try:
             self.dpdk_interfaces = {intf['name']: DpdkInterface(self, intf['virtual-interface'])
                                     for intf in self.interfaces}
-        except IncorrectConfig:
+        except exceptions.IncorrectConfig:
             template = "MAC address is required for all interfaces, missing on: {}"
             errors = (intf['name'] for intf in self.interfaces if
                       'local_mac' not in intf['virtual-interface'])
-            raise IncorrectSetup(template.format(", ".join(errors)))
+            raise exceptions.IncorrectSetup(
+                error_msg=template.format(", ".join(errors)))
 
     @property
     def dpdk_helper(self):
@@ -176,7 +176,7 @@ class DpdkNode(object):
                 self._probe_netdevs()
                 try:
                     self._probe_missing_values()
-                except IncorrectConfig:
+                except exceptions.IncorrectConfig:
                     # ignore for now
                     pass
 
@@ -193,7 +193,7 @@ class DpdkNode(object):
                       missing_fields)
             errors = "\n".join(errors)
             if errors:
-                raise IncorrectSetup(errors)
+                raise exceptions.IncorrectSetup(error_msg=errors)
 
         finally:
             self._dpdk_helper = None
diff --git a/yardstick/network_services/libs/ixia_libs/IxNet/IxNet.py b/yardstick/network_services/libs/ixia_libs/IxNet/IxNet.py
deleted file mode 100644 (file)
index c538cee..0000000
+++ /dev/null
@@ -1,334 +0,0 @@
-# Copyright (c) 2016-2017 Intel Corporation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-import logging
-
-import re
-from itertools import product
-import IxNetwork
-
-
-log = logging.getLogger(__name__)
-
-IP_VERSION_4 = 4
-IP_VERSION_6 = 6
-
-
-class TrafficStreamHelper(object):
-
-    TEMPLATE = '{0.traffic_item}/{0.stream}:{0.param_id}/{1}'
-
-    def __init__(self, traffic_item, stream, param_id):
-        super(TrafficStreamHelper, self).__init__()
-        self.traffic_item = traffic_item
-        self.stream = stream
-        self.param_id = param_id
-
-    def __getattr__(self, item):
-        return self.TEMPLATE.format(self, item)
-
-
-class FramesizeHelper(object):
-
-    def __init__(self):
-        super(FramesizeHelper, self).__init__()
-        self.weighted_pairs = []
-        self.weighted_range_pairs = []
-
-    @property
-    def weighted_pairs_arg(self):
-        return '-weightedPairs', self.weighted_pairs
-
-    @property
-    def weighted_range_pairs_arg(self):
-        return '-weightedRangePairs', self.weighted_range_pairs
-
-    def make_args(self, *args):
-        return self.weighted_pairs_arg + self.weighted_range_pairs_arg + args
-
-    def populate_data(self, framesize_data):
-        for key, value in framesize_data.items():
-            if value == '0':
-                continue
-
-            replaced = re.sub('[Bb]', '', key)
-            self.weighted_pairs.extend([
-                replaced,
-                value,
-            ])
-            pairs = [
-                replaced,
-                replaced,
-                value,
-            ]
-            self.weighted_range_pairs.append(pairs)
-
-
-class IxNextgen(object):
-
-    STATS_NAME_MAP = {
-        "traffic_item": 'Traffic Item',
-        "Tx_Frames": 'Tx Frames',
-        "Rx_Frames": 'Rx Frames',
-        "Tx_Frame_Rate": 'Tx Frame Rate',
-        "Rx_Frame_Rate": 'Tx Frame Rate',
-        "Store-Forward_Avg_latency_ns": 'Store-Forward Avg Latency (ns)',
-        "Store-Forward_Min_latency_ns": 'Store-Forward Min Latency (ns)',
-        "Store-Forward_Max_latency_ns": 'Store-Forward Max Latency (ns)',
-    }
-
-    PORT_STATS_NAME_MAP = {
-        "stat_name": 'Stat Name',
-        "Frames_Tx": 'Frames Tx.',
-        "Valid_Frames_Rx": 'Valid Frames Rx.',
-        "Frames_Tx_Rate": 'Frames Tx. Rate',
-        "Valid_Frames_Rx_Rate": 'Valid Frames Rx. Rate',
-        "Tx_Rate_Kbps": 'Tx. Rate (Kbps)',
-        "Rx_Rate_Kbps": 'Rx. Rate (Kbps)',
-        "Tx_Rate_Mbps": 'Tx. Rate (Mbps)',
-        "Rx_Rate_Mbps": 'Rx. Rate (Mbps)',
-    }
-
-    LATENCY_NAME_MAP = {
-        "Store-Forward_Avg_latency_ns": 'Store-Forward Avg Latency (ns)',
-        "Store-Forward_Min_latency_ns": 'Store-Forward Min Latency (ns)',
-        "Store-Forward_Max_latency_ns": 'Store-Forward Max Latency (ns)',
-    }
-
-    RANDOM_MASK_MAP = {
-        IP_VERSION_4: '0.0.0.255',
-        IP_VERSION_6: '0:0:0:0:0:0:0:ff',
-    }
-
-    MODE_SEEDS_MAP = {
-        0: ('uplink', ['256', '2048']),
-    }
-
-    MODE_SEEDS_DEFAULT = 'downlink', ['2048', '256']
-
-    @staticmethod
-    def find_view_obj(view_name, views):
-        edited_view_name = '::ixNet::OBJ-/statistics/view:"{}"'.format(view_name)
-        return next((view for view in views if edited_view_name == view), '')
-
-    @staticmethod
-    def get_config(tg_cfg):
-        card = []
-        port = []
-        external_interface = tg_cfg["vdu"][0]["external-interface"]
-        for intf in external_interface:
-            card_port0 = intf["virtual-interface"]["vpci"]
-            card0, port0 = card_port0.split(':')[:2]
-            card.append(card0)
-            port.append(port0)
-
-        cfg = {
-            'machine': tg_cfg["mgmt-interface"]["ip"],
-            'port': tg_cfg["mgmt-interface"]["tg-config"]["tcl_port"],
-            'chassis': tg_cfg["mgmt-interface"]["tg-config"]["ixchassis"],
-            'cards': card,
-            'ports': port,
-            'output_dir': tg_cfg["mgmt-interface"]["tg-config"]["dut_result_dir"],
-            'version': tg_cfg["mgmt-interface"]["tg-config"]["version"],
-            'bidir': True,
-        }
-
-        return cfg
-
-    def __init__(self, ixnet=None):
-        self.ixnet = ixnet
-        self._objRefs = dict()
-        self._cfg = None
-        self._logger = logging.getLogger(__name__)
-        self._params = None
-        self._bidir = None
-
-    def iter_over_get_lists(self, x1, x2, y2, offset=0):
-        for x in self.ixnet.getList(x1, x2):
-            y_list = self.ixnet.getList(x, y2)
-            for i, y in enumerate(y_list, offset):
-                yield x, y, i
-
-    def set_random_ip_multi_attribute(self, ipv4, seed, fixed_bits, random_mask, l3_count):
-        self.ixnet.setMultiAttribute(
-            ipv4,
-            '-seed', str(seed),
-            '-fixedBits', str(fixed_bits),
-            '-randomMask', str(random_mask),
-            '-valueType', 'random',
-            '-countValue', str(l3_count))
-
-    def set_random_ip_multi_attributes(self, ip, version, seeds, l3):
-        try:
-            random_mask = self.RANDOM_MASK_MAP[version]
-        except KeyError:
-            raise ValueError('Unknown version %s' % version)
-
-        l3_count = l3['count']
-        if "srcIp" in ip:
-            fixed_bits = l3['srcip4']
-            self.set_random_ip_multi_attribute(ip, seeds[0], fixed_bits, random_mask, l3_count)
-        if "dstIp" in ip:
-            fixed_bits = l3['dstip4']
-            self.set_random_ip_multi_attribute(ip, seeds[1], fixed_bits, random_mask, l3_count)
-
-    def add_ip_header(self, params, version):
-        for _, ep, i in self.iter_over_get_lists('/traffic', 'trafficItem', "configElement", 1):
-            iter1 = (v['outer_l3'] for v in params.values() if str(v['id']) == str(i))
-            try:
-                l3 = next(iter1, {})
-                seeds = self.MODE_SEEDS_MAP.get(i, self.MODE_SEEDS_DEFAULT)[1]
-            except (KeyError, IndexError):
-                continue
-
-            for _, ip_bits, _ in self.iter_over_get_lists(ep, 'stack', 'field'):
-                self.set_random_ip_multi_attributes(ip_bits, version, seeds, l3)
-
-        self.ixnet.commit()
-
-    def _connect(self, tg_cfg):
-        self._cfg = self.get_config(tg_cfg)
-        self.ixnet = IxNetwork.IxNet()
-
-        machine = self._cfg['machine']
-        port = str(self._cfg['port'])
-        version = str(self._cfg['version'])
-        result = self.ixnet.connect(machine, '-port', port, '-version', version)
-        return result
-
-    def clear_ixia_config(self):
-        self.ixnet.execute('newConfig')
-
-    def load_ixia_profile(self, profile):
-        self.ixnet.execute('loadConfig', self.ixnet.readFrom(profile))
-
-    def ix_load_config(self, profile):
-        self.clear_ixia_config()
-        self.load_ixia_profile(profile)
-
-    def ix_assign_ports(self):
-        vports = self.ixnet.getList(self.ixnet.getRoot(), 'vport')
-        ports = []
-
-        chassis = self._cfg['chassis']
-        ports = [(chassis, card, port) for card, port in
-                 zip(self._cfg['cards'], self._cfg['ports'])]
-
-        vport_list = self.ixnet.getList("/", "vport")
-        self.ixnet.execute('assignPorts', ports, [], vport_list, True)
-        self.ixnet.commit()
-
-        for vport in vports:
-            if self.ixnet.getAttribute(vport, '-state') != 'up':
-                log.error("Both thr ports are down...")
-
-    def ix_update_frame(self, params):
-        streams = ["configElement"]
-
-        for param in params.values():
-            framesize_data = FramesizeHelper()
-            traffic_items = self.ixnet.getList('/traffic', 'trafficItem')
-            param_id = param['id']
-            for traffic_item, stream in product(traffic_items, streams):
-                helper = TrafficStreamHelper(traffic_item, stream, param_id)
-
-                self.ixnet.setMultiAttribute(helper.transmissionControl,
-                                             '-type', '{0}'.format(param.get('traffic_type',
-                                                                             'continuous')),
-                                             '-duration', '{0}'.format(param.get('duration',
-                                                                                 "30")))
-
-                stream_frame_rate_path = helper.frameRate
-                self.ixnet.setMultiAttribute(stream_frame_rate_path, '-rate', param['iload'])
-                if param['outer_l2']['framesPerSecond']:
-                    self.ixnet.setMultiAttribute(stream_frame_rate_path,
-                                                 '-type', 'framesPerSecond')
-
-                framesize_data.populate_data(param['outer_l2']['framesize'])
-
-                make_attr_args = framesize_data.make_args('-incrementFrom', '66',
-                                                          '-randomMin', '66',
-                                                          '-quadGaussian', [],
-                                                          '-type', 'weightedPairs',
-                                                          '-presetDistribution', 'cisco',
-                                                          '-incrementTo', '1518')
-
-                self.ixnet.setMultiAttribute(helper.frameSize, *make_attr_args)
-
-                self.ixnet.commit()
-
-    def update_ether_multi_attribute(self, ether, mac_addr):
-        self.ixnet.setMultiAttribute(ether,
-                                     '-singleValue', mac_addr,
-                                     '-fieldValue', mac_addr,
-                                     '-valueType', 'singleValue')
-
-    def update_ether_multi_attributes(self, ether, l2):
-        if "ethernet.header.destinationAddress" in ether:
-            self.update_ether_multi_attribute(ether, str(l2.get('dstmac', "00:00:00:00:00:02")))
-
-        if "ethernet.header.sourceAddress" in ether:
-            self.update_ether_multi_attribute(ether, str(l2.get('srcmac', "00:00:00:00:00:01")))
-
-    def ix_update_ether(self, params):
-        for _, ep, index in self.iter_over_get_lists('/traffic', 'trafficItem',
-                                                      "configElement", 1):
-            iter1 = (v['outer_l2'] for v in params.values() if str(v['id']) == str(index))
-            try:
-                l2 = next(iter1, {})
-            except KeyError:
-                continue
-
-            for _, ether, _ in self.iter_over_get_lists(ep, 'stack', 'field'):
-                self.update_ether_multi_attributes(ether, l2)
-
-        self.ixnet.commit()
-
-    def ix_update_udp(self, params):
-        pass
-
-    def ix_update_tcp(self, params):
-        pass
-
-    def ix_start_traffic(self):
-        tis = self.ixnet.getList('/traffic', 'trafficItem')
-        for ti in tis:
-            self.ixnet.execute('generate', [ti])
-            self.ixnet.execute('apply', '/traffic')
-            self.ixnet.execute('start', '/traffic')
-
-    def ix_stop_traffic(self):
-        tis = self.ixnet.getList('/traffic', 'trafficItem')
-        for _ in tis:
-            self.ixnet.execute('stop', '/traffic')
-
-    def build_stats_map(self, view_obj, name_map):
-        return {kl: self.execute_get_column_values(view_obj, kr) for kl, kr in name_map.items()}
-
-    def execute_get_column_values(self, view_obj, name):
-        return self.ixnet.execute('getColumnValues', view_obj, name)
-
-    def ix_get_statistics(self):
-        views = self.ixnet.getList('/statistics', 'view')
-        stats = {}
-        view_obj = self.find_view_obj("Traffic Item Statistics", views)
-        stats = self.build_stats_map(view_obj, self.STATS_NAME_MAP)
-
-        view_obj = self.find_view_obj("Port Statistics", views)
-        ports_stats = self.build_stats_map(view_obj, self.PORT_STATS_NAME_MAP)
-
-        view_obj = self.find_view_obj("Flow Statistics", views)
-        stats["latency"] = self.build_stats_map(view_obj, self.LATENCY_NAME_MAP)
-
-        return stats, ports_stats
diff --git a/yardstick/network_services/libs/ixia_libs/ixnet/ixnet_api.py b/yardstick/network_services/libs/ixia_libs/ixnet/ixnet_api.py
new file mode 100644 (file)
index 0000000..393f60f
--- /dev/null
@@ -0,0 +1,470 @@
+# Copyright (c) 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import logging
+
+import IxNetwork
+
+from yardstick.common import exceptions
+from yardstick.common import utils
+
+
+log = logging.getLogger(__name__)
+
+IP_VERSION_4 = 4
+IP_VERSION_6 = 6
+
+PROTO_ETHERNET = 'ethernet'
+PROTO_IPV4 = 'ipv4'
+PROTO_IPV6 = 'ipv6'
+PROTO_UDP = 'udp'
+PROTO_TCP = 'tcp'
+PROTO_VLAN = 'vlan'
+
+IP_VERSION_4_MASK = '0.0.0.255'
+IP_VERSION_6_MASK = '0:0:0:0:0:0:0:ff'
+
+TRAFFIC_STATUS_STARTED = 'started'
+TRAFFIC_STATUS_STOPPED = 'stopped'
+
+
+# NOTE(ralonsoh): this pragma will be removed in the last patch of this series
+class IxNextgen(object):  # pragma: no cover
+
+    PORT_STATS_NAME_MAP = {
+        "stat_name": 'Stat Name',
+        "Frames_Tx": 'Frames Tx.',
+        "Valid_Frames_Rx": 'Valid Frames Rx.',
+        "Frames_Tx_Rate": 'Frames Tx. Rate',
+        "Valid_Frames_Rx_Rate": 'Valid Frames Rx. Rate',
+        "Tx_Rate_Kbps": 'Tx. Rate (Kbps)',
+        "Rx_Rate_Kbps": 'Rx. Rate (Kbps)',
+        "Tx_Rate_Mbps": 'Tx. Rate (Mbps)',
+        "Rx_Rate_Mbps": 'Rx. Rate (Mbps)',
+    }
+
+    LATENCY_NAME_MAP = {
+        "Store-Forward_Avg_latency_ns": 'Store-Forward Avg Latency (ns)',
+        "Store-Forward_Min_latency_ns": 'Store-Forward Min Latency (ns)',
+        "Store-Forward_Max_latency_ns": 'Store-Forward Max Latency (ns)',
+    }
+
+    @staticmethod
+    def get_config(tg_cfg):
+        card = []
+        port = []
+        external_interface = tg_cfg["vdu"][0]["external-interface"]
+        for intf in external_interface:
+            card_port0 = intf["virtual-interface"]["vpci"]
+            card0, port0 = card_port0.split(':')[:2]
+            card.append(card0)
+            port.append(port0)
+
+        cfg = {
+            'machine': tg_cfg["mgmt-interface"]["ip"],
+            'port': tg_cfg["mgmt-interface"]["tg-config"]["tcl_port"],
+            'chassis': tg_cfg["mgmt-interface"]["tg-config"]["ixchassis"],
+            'cards': card,
+            'ports': port,
+            'output_dir': tg_cfg["mgmt-interface"]["tg-config"]["dut_result_dir"],
+            'version': tg_cfg["mgmt-interface"]["tg-config"]["version"],
+            'bidir': True,
+        }
+
+        return cfg
+
+    def __init__(self):  # pragma: no cover
+        self._ixnet = None
+        self._cfg = None
+        self._params = None
+        self._bidir = None
+
+    @property
+    def ixnet(self):  # pragma: no cover
+        if self._ixnet:
+            return self._ixnet
+        raise exceptions.IxNetworkClientNotConnected()
+
+    def _get_config_element_by_flow_group_name(self, flow_group_name):
+        """Get a config element using the flow group name
+
+        Each named flow group contains one config element (by configuration).
+        According to the documentation, "configElements" is a list and "each
+        item in this list is aligned to the sequential order of your endpoint
+        list".
+
+        :param flow_group_name: (str) flow group name; this parameter is
+                                always a number (converted to string) starting
+                                from "1".
+        :return: (str) config element reference ID or None.
+        """
+        traffic_item = self.ixnet.getList(self.ixnet.getRoot() + '/traffic',
+                                          'trafficItem')[0]
+        flow_groups = self.ixnet.getList(traffic_item, 'endpointSet')
+        for flow_group in flow_groups:
+            if (str(self.ixnet.getAttribute(flow_group, '-name')) ==
+                    flow_group_name):
+                return traffic_item + '/configElement:' + flow_group_name
+
+    def _get_stack_item(self, flow_group_name, protocol_name):
+        """Return the stack item given the flow group name and the proto name
+
+        :param flow_group_name: (str) flow group name
+        :param protocol_name: (str) protocol name, referred to PROTO_*
+                              constants
+        :return: list of stack item descriptors
+        """
+        celement = self._get_config_element_by_flow_group_name(flow_group_name)
+        if not celement:
+            raise exceptions.IxNetworkFlowNotPresent(
+                flow_group=flow_group_name)
+        stack_items = self.ixnet.getList(celement, 'stack')
+        return [s_i for s_i in stack_items if protocol_name in s_i]
+
+    def _get_field_in_stack_item(self, stack_item, field_name):
+        """Return the field in a stack item given the name
+
+        :param stack_item: (str) stack item descriptor
+        :param field_name: (str) field name
+        :return: (str) field descriptor
+        """
+        fields = self.ixnet.getList(stack_item, 'field')
+        for field in (field for field in fields if field_name in field):
+            return field
+        raise exceptions.IxNetworkFieldNotPresentInStackItem(
+            field_name=field_name, stack_item=stack_item)
+
+    def _get_traffic_state(self):
+        """Get traffic state"""
+        return self.ixnet.getAttribute(self.ixnet.getRoot() + 'traffic',
+                                       '-state')
+
+    def is_traffic_running(self):
+        """Returns true if traffic state == TRAFFIC_STATUS_STARTED"""
+        return self._get_traffic_state() == TRAFFIC_STATUS_STARTED
+
+    def is_traffic_stopped(self):
+        """Returns true if traffic state == TRAFFIC_STATUS_STOPPED"""
+        return self._get_traffic_state() == TRAFFIC_STATUS_STOPPED
+
+    @staticmethod
+    def _parse_framesize(framesize):
+        """Parse "framesize" config param. to return a list of weighted pairs
+
+        :param framesize: dictionary of frame sizes and weights
+        :return: list of paired frame sizes and weights
+        """
+        weighted_range_pairs = []
+        for size, weight in framesize.items():
+            weighted_range_pairs.append(int(size.upper().replace('B', '')))
+            weighted_range_pairs.append(int(weight))
+        return weighted_range_pairs
+
+    def iter_over_get_lists(self, x1, x2, y2, offset=0):
+        for x in self.ixnet.getList(x1, x2):
+            y_list = self.ixnet.getList(x, y2)
+            for i, y in enumerate(y_list, offset):
+                yield x, y, i
+
+    def connect(self, tg_cfg):
+        self._cfg = self.get_config(tg_cfg)
+        self._ixnet = IxNetwork.IxNet()
+
+        machine = self._cfg['machine']
+        port = str(self._cfg['port'])
+        version = str(self._cfg['version'])
+        return self.ixnet.connect(machine, '-port', port,
+                                  '-version', version)
+
+    def clear_config(self):
+        """Wipe out any possible configuration present in the client"""
+        self.ixnet.execute('newConfig')
+
+    def assign_ports(self):
+        """Create and assign vports for each physical port defined in config
+
+        This configuration is present in the IXIA profile file. E.g.:
+            name: trafficgen_1
+            role: IxNet
+            interfaces:
+                xe0:
+                    vpci: "2:15" # Card:port
+                    driver: "none"
+                    dpdk_port_num: 0
+                    local_ip: "152.16.100.20"
+                    netmask: "255.255.0.0"
+                    local_mac: "00:98:10:64:14:00"
+                xe1:
+                    ...
+        """
+        chassis_ip = self._cfg['chassis']
+        ports = [(chassis_ip, card, port) for card, port in
+                 zip(self._cfg['cards'], self._cfg['ports'])]
+
+        log.info('Create and assign vports: %s', ports)
+        for port in ports:
+            vport = self.ixnet.add(self.ixnet.getRoot(), 'vport')
+            self.ixnet.commit()
+            self.ixnet.execute('assignPorts', [port], [], [vport], True)
+            self.ixnet.commit()
+            if self.ixnet.getAttribute(vport, '-state') != 'up':
+                log.warning('Port %s is down', vport)
+
+    def _create_traffic_item(self):
+        """Create the traffic item to hold the flow groups
+
+        The traffic item tracking by "Traffic Item" is enabled to retrieve the
+        latency statistics.
+        """
+        log.info('Create the traffic item "RFC2544"')
+        traffic_item = self.ixnet.add(self.ixnet.getRoot() + '/traffic',
+                                      'trafficItem')
+        self.ixnet.setMultiAttribute(traffic_item, '-name', 'RFC2544',
+                                     '-trafficType', 'raw')
+        self.ixnet.commit()
+
+        traffic_item_id = self.ixnet.remapIds(traffic_item)[0]
+        self.ixnet.setAttribute(traffic_item_id + '/tracking',
+                                '-trackBy', 'trafficGroupId0')
+        self.ixnet.commit()
+
+    def _create_flow_groups(self):
+        """Create the flow groups between the assigned ports"""
+        traffic_item_id = self.ixnet.getList(self.ixnet.getRoot() + 'traffic',
+                                             'trafficItem')[0]
+        log.info('Create the flow groups')
+        vports = self.ixnet.getList(self.ixnet.getRoot(), 'vport')
+        uplink_ports = vports[::2]
+        downlink_ports = vports[1::2]
+        index = 0
+        for up, down in zip(uplink_ports, downlink_ports):
+            log.info('FGs: %s <--> %s', up, down)
+            endpoint_set_1 = self.ixnet.add(traffic_item_id, 'endpointSet')
+            endpoint_set_2 = self.ixnet.add(traffic_item_id, 'endpointSet')
+            self.ixnet.setMultiAttribute(
+                endpoint_set_1, '-name', str(index + 1),
+                '-sources', [up + '/protocols'],
+                '-destinations', [down + '/protocols'])
+            self.ixnet.setMultiAttribute(
+                endpoint_set_2, '-name', str(index + 2),
+                '-sources', [down + '/protocols'],
+                '-destinations', [up + '/protocols'])
+            self.ixnet.commit()
+            index += 2
+
+    def _append_procotol_to_stack(self, protocol_name, previous_element):
+        """Append a new element in the packet definition stack"""
+        protocol = (self.ixnet.getRoot() +
+                    '/traffic/protocolTemplate:"{}"'.format(protocol_name))
+        self.ixnet.execute('append', previous_element, protocol)
+
+    def _setup_config_elements(self):
+        """Setup the config elements
+
+        The traffic item is configured to allow individual configurations per
+        config element. The default frame configuration is applied:
+            Ethernet II: added by default
+            IPv4: element to add
+            UDP: element to add
+            Payload: added by default
+            Ethernet II (Trailer): added by default
+        :return:
+        """
+        traffic_item_id = self.ixnet.getList(self.ixnet.getRoot() + 'traffic',
+                                             'trafficItem')[0]
+        log.info('Split the frame rate distribution per config element')
+        config_elements = self.ixnet.getList(traffic_item_id, 'configElement')
+        for config_element in config_elements:
+            self.ixnet.setAttribute(config_element + '/frameRateDistribution',
+                                    '-portDistribution', 'splitRateEvenly')
+            self.ixnet.setAttribute(config_element + '/frameRateDistribution',
+                                    '-streamDistribution', 'splitRateEvenly')
+            self.ixnet.commit()
+            self._append_procotol_to_stack(
+                PROTO_UDP, config_element + '/stack:"ethernet-1"')
+            self._append_procotol_to_stack(
+                PROTO_IPV4, config_element + '/stack:"ethernet-1"')
+
+    def create_traffic_model(self):
+        """Create a traffic item and the needed flow groups
+
+        Each flow group inside the traffic item (only one is present)
+        represents the traffic between two ports:
+                        (uplink)    (downlink)
+            FlowGroup1: port1    -> port2
+            FlowGroup2: port1    <- port2
+            FlowGroup3: port3    -> port4
+            FlowGroup4: port3    <- port4
+        """
+        self._create_traffic_item()
+        self._create_flow_groups()
+        self._setup_config_elements()
+
+    def _update_frame_mac(self, ethernet_descriptor, field, mac_address):
+        """Set the MAC address in a config element stack Ethernet field
+
+        :param ethernet_descriptor: (str) ethernet descriptor, e.g.:
+            /traffic/trafficItem:1/configElement:1/stack:"ethernet-1"
+        :param field: (str) field name, e.g.: destinationAddress
+        :param mac_address: (str) MAC address
+        """
+        field_descriptor = self._get_field_in_stack_item(ethernet_descriptor,
+                                                         field)
+        self.ixnet.setMultiAttribute(field_descriptor,
+                                     '-singleValue', mac_address,
+                                     '-fieldValue', mac_address,
+                                     '-valueType', 'singleValue')
+        self.ixnet.commit()
+
+    def update_frame(self, traffic):
+        """Update the L2 frame
+
+        This function updates the L2 frame options:
+        - Traffic type: "continuous", "fixedDuration".
+        - Duration: in case of traffic_type="fixedDuration", amount of seconds
+                    to inject traffic.
+        - Rate: in frames per seconds or percentage.
+        - Type of rate: "framesPerSecond" ("bitsPerSecond" and
+                        "percentLineRate" no used)
+        - Frame size: custom IMIX [1] definition; a list of packet size in
+                      bytes and the weight. E.g.:
+                      [64, 10, 128, 15, 512, 5]
+
+        [1] https://en.wikipedia.org/wiki/Internet_Mix
+
+        :param traffic: list of traffic elements; each traffic element contains
+                        the injection parameter for each flow group.
+        """
+        for traffic_param in traffic.values():
+            fg_id = str(traffic_param['id'])
+            config_element = self._get_config_element_by_flow_group_name(fg_id)
+            if not config_element:
+                raise exceptions.IxNetworkFlowNotPresent(flow_group=fg_id)
+
+            type = traffic_param.get('traffic_type', 'fixedDuration')
+            duration = traffic_param.get('duration', 30)
+            rate = traffic_param['iload']
+            weighted_range_pairs = self._parse_framesize(
+                traffic_param['outer_l2']['framesize'])
+            srcmac = str(traffic_param.get('srcmac', '00:00:00:00:00:01'))
+            dstmac = str(traffic_param.get('dstmac', '00:00:00:00:00:02'))
+            # NOTE(ralonsoh): add QinQ tagging when
+            # traffic_param['outer_l2']['QinQ'] exists.
+            # s_vlan = traffic_param['outer_l2']['QinQ']['S-VLAN']
+            # c_vlan = traffic_param['outer_l2']['QinQ']['C-VLAN']
+
+            self.ixnet.setMultiAttribute(
+                config_element + '/transmissionControl',
+                '-type', type, '-duration', duration)
+            self.ixnet.setMultiAttribute(
+                config_element + '/frameRate',
+                '-rate', rate, '-type', 'framesPerSecond')
+            self.ixnet.setMultiAttribute(
+                config_element + '/frameSize',
+                '-type', 'weightedPairs',
+                '-weightedRangePairs', weighted_range_pairs)
+            self.ixnet.commit()
+
+            self._update_frame_mac(
+                self._get_stack_item(fg_id, PROTO_ETHERNET)[0],
+                'destinationAddress', dstmac)
+            self._update_frame_mac(
+                self._get_stack_item(fg_id, PROTO_ETHERNET)[0],
+                'sourceAddress', srcmac)
+
+    def _update_ipv4_address(self, ip_descriptor, field, ip_address, seed,
+                             mask, count):
+        """Set the IPv4 address in a config element stack IP field
+
+        :param ip_descriptor: (str) IP descriptor, e.g.:
+            /traffic/trafficItem:1/configElement:1/stack:"ipv4-2"
+        :param field: (str) field name, e.g.: scrIp, dstIp
+        :param ip_address: (str) IP address
+        :param seed: (int) seed length
+        :param mask: (str) IP address mask
+        :param count: (int) number of random IPs to generate
+        """
+        field_descriptor = self._get_field_in_stack_item(ip_descriptor,
+                                                         field)
+        self.ixnet.setMultiAttribute(field_descriptor,
+                                     '-seed', seed,
+                                     '-fixedBits', ip_address,
+                                     '-randomMask', mask,
+                                     '-valueType', 'random',
+                                     '-countValue', count)
+        self.ixnet.commit()
+
+    def update_ip_packet(self, traffic):
+        """Update the IP packet
+
+        NOTE: Only IPv4 is currently supported.
+        :param traffic: list of traffic elements; each traffic element contains
+                        the injection parameter for each flow group.
+        """
+        # NOTE(ralonsoh): L4 configuration is not set.
+        for traffic_param in traffic.values():
+            fg_id = str(traffic_param['id'])
+            if not self._get_config_element_by_flow_group_name(fg_id):
+                raise exceptions.IxNetworkFlowNotPresent(flow_group=fg_id)
+
+            count = traffic_param['outer_l3']['count']
+            srcip4 = str(traffic_param['outer_l3']['srcip4'])
+            dstip4 = str(traffic_param['outer_l3']['dstip4'])
+
+            self._update_ipv4_address(
+                self._get_stack_item(fg_id, PROTO_IPV4)[0],
+                'srcIp', srcip4, 1, IP_VERSION_4_MASK, count)
+            self._update_ipv4_address(
+                self._get_stack_item(fg_id, PROTO_IPV4)[0],
+                'dstIp', dstip4, 1, IP_VERSION_4_MASK, count)
+
+    def _build_stats_map(self, view_obj, name_map):
+        return {data_yardstick: self.ixnet.execute(
+            'getColumnValues', view_obj, data_ixia)
+            for data_yardstick, data_ixia in name_map.items()}
+
+    def get_statistics(self):
+        """Retrieve port and flow statistics
+
+        "Port Statistics" parameters are stored in self.PORT_STATS_NAME_MAP.
+        "Flow Statistics" parameters are stored in self.LATENCY_NAME_MAP.
+
+        :return: dictionary with the statistics; the keys of this dictionary
+                 are PORT_STATS_NAME_MAP and LATENCY_NAME_MAP keys.
+        """
+        port_statistics = '::ixNet::OBJ-/statistics/view:"Port Statistics"'
+        flow_statistics = '::ixNet::OBJ-/statistics/view:"Flow Statistics"'
+        stats = self._build_stats_map(port_statistics,
+                                      self.PORT_STATS_NAME_MAP)
+        stats.update(self._build_stats_map(flow_statistics,
+                                          self.LATENCY_NAME_MAP))
+        return stats
+
+    def start_traffic(self):
+        """Start the traffic injection in the traffic item
+
+        By configuration, there is only one traffic item. This function returns
+        when the traffic state is TRAFFIC_STATUS_STARTED.
+        """
+        traffic_items = self.ixnet.getList('/traffic', 'trafficItem')
+        if self.is_traffic_running():
+            self.ixnet.execute('stop', '/traffic')
+            # pylint: disable=unnecessary-lambda
+            utils.wait_until_true(lambda: self.is_traffic_stopped())
+
+        self.ixnet.execute('generate', traffic_items)
+        self.ixnet.execute('apply', '/traffic')
+        self.ixnet.execute('start', '/traffic')
+        # pylint: disable=unnecessary-lambda
+        utils.wait_until_true(lambda: self.is_traffic_running())
index 162bab2..9eba550 100644 (file)
@@ -44,7 +44,7 @@ class TrafficProfile(object):
         # IMIX = {"10K": 0.1, "100M": 0.5}
         self.params = tp_config
 
-    def execute_traffic(self, traffic_generator):
+    def execute_traffic(self, traffic_generator, **kawrgs):
         """ This methods defines the behavior of the traffic generator.
         It will be called in a loop until the traffic generator exits.
 
index 3480565..6cbdb8a 100644 (file)
@@ -12,9 +12,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from __future__ import absolute_import
-from __future__ import print_function
-
 import sys
 import os
 import logging
@@ -27,22 +24,14 @@ try:
 except ImportError:
     import json as jsonutils
 
-
-class ErrorClass(object):
-
-    def __init__(self, *args, **kwargs):
-        if 'test' not in kwargs:
-            raise RuntimeError
-
-    def __getattr__(self, item):
-        raise AttributeError
-
+from yardstick.common import exceptions
 
 try:
     from IxLoad import IxLoad, StatCollectorUtils
 except ImportError:
-    IxLoad = ErrorClass
-    StatCollectorUtils = ErrorClass
+    IxLoad = exceptions.ErrorClass
+    StatCollectorUtils = exceptions.ErrorClass
+
 
 LOG = logging.getLogger(__name__)
 CSV_FILEPATH_NAME = 'IxL_statResults.csv'
@@ -93,7 +82,7 @@ def validate_non_string_sequence(value, default=None, raise_exc=None):
     if isinstance(value, collections.Sequence) and not isinstance(value, str):
         return value
     if raise_exc:
-        raise raise_exc
+        raise raise_exc  # pylint: disable=raising-bad-type
     return default
 
 
@@ -218,7 +207,7 @@ class IXLOADHttpTest(object):
         #  ---- Remap ports ----
         try:
             self.reassign_ports(test, repository, self.ports_to_reassign)
-        except Exception:
+        except Exception:  # pylint: disable=broad-except
             LOG.exception("Exception occurred during reassign_ports")
 
         # -----------------------------------------------------------------------
index 7f04722..73806f9 100644 (file)
@@ -12,7 +12,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from __future__ import absolute_import
 import logging
 
 from yardstick.network_services.traffic_profile.trex_traffic_profile import \
@@ -82,13 +81,10 @@ class IXIARFC2544Profile(TrexProfile):
     def _ixia_traffic_generate(self, traffic, ixia_obj):
         for key, value in traffic.items():
             if key.startswith((self.UPLINK, self.DOWNLINK)):
-                value["iload"] = str(self.rate)
-        ixia_obj.ix_update_frame(traffic)
-        ixia_obj.ix_update_ether(traffic)
-        ixia_obj.add_ip_header(traffic, 4)
-        ixia_obj.ix_start_traffic()
-        self.tmp_drop = 0
-        self.tmp_throughput = 0
+                value['iload'] = str(self.rate)
+        ixia_obj.update_frame(traffic)
+        ixia_obj.update_ip_packet(traffic)
+        ixia_obj.start_traffic()
 
     def update_traffic_profile(self, traffic_generator):
         def port_generator():
@@ -106,78 +102,59 @@ class IXIARFC2544Profile(TrexProfile):
 
         self.ports = [port for port in port_generator()]
 
-    def execute_traffic(self, traffic_generator, ixia_obj, mac=None):
-        if mac is None:
-            mac = {}
+    def execute_traffic(self, traffic_generator, ixia_obj=None, mac=None):
+        mac = {} if mac is None else mac
+        first_run = self.first_run
         if self.first_run:
+            self.first_run = False
             self.full_profile = {}
             self.pg_id = 0
             self.update_traffic_profile(traffic_generator)
-            traffic = \
-                self._get_ixia_traffic_profile(self.full_profile, mac)
             self.max_rate = self.rate
             self.min_rate = 0
-            self.get_multiplier()
-            self._ixia_traffic_generate(traffic, ixia_obj)
-
-    def get_multiplier(self):
-        self.rate = round((self.max_rate + self.min_rate) / 2.0, 2)
-        multiplier = round(self.rate / self.pps, 2)
-        return str(multiplier)
+        else:
+            self.rate = round(float(self.max_rate + self.min_rate) / 2.0, 2)
 
-    def start_ixia_latency(self, traffic_generator, ixia_obj, mac=None):
-        if mac is None:
-            mac = {}
-        self.update_traffic_profile(traffic_generator)
-        traffic = \
-            self._get_ixia_traffic_profile(self.full_profile, mac)
+        traffic = self._get_ixia_traffic_profile(self.full_profile, mac)
         self._ixia_traffic_generate(traffic, ixia_obj)
+        return first_run
 
-    def get_drop_percentage(self, samples, tol_min, tolerance, ixia_obj,
-                            mac=None):
-        if mac is None:
-            mac = {}
-        status = 'Running'
+    def get_drop_percentage(self, samples, tol_min, tolerance, duration=30.0,
+                            first_run=False):
+        completed = False
         drop_percent = 100
-        in_packets = sum([samples[iface]['in_packets'] for iface in samples])
-        out_packets = sum([samples[iface]['out_packets'] for iface in samples])
-        rx_throughput = \
-            sum([samples[iface]['RxThroughput'] for iface in samples])
-        tx_throughput = \
-            sum([samples[iface]['TxThroughput'] for iface in samples])
-        packet_drop = abs(out_packets - in_packets)
+        num_ifaces = len(samples)
+        in_packets_sum = sum(
+            [samples[iface]['in_packets'] for iface in samples])
+        out_packets_sum = sum(
+            [samples[iface]['out_packets'] for iface in samples])
+        rx_throughput = sum(
+            [samples[iface]['RxThroughput'] for iface in samples])
+        rx_throughput = round(float(rx_throughput), 2)
+        tx_throughput = sum(
+            [samples[iface]['TxThroughput'] for iface in samples])
+        tx_throughput = round(float(tx_throughput), 2)
+        packet_drop = abs(out_packets_sum - in_packets_sum)
+
         try:
-            drop_percent = round((packet_drop / float(out_packets)) * 100, 2)
+            drop_percent = round(
+                (packet_drop / float(out_packets_sum)) * 100, 2)
         except ZeroDivisionError:
             LOG.info('No traffic is flowing')
-        samples['TxThroughput'] = round(tx_throughput / 1.0, 2)
-        samples['RxThroughput'] = round(rx_throughput / 1.0, 2)
-        samples['CurrentDropPercentage'] = drop_percent
-        samples['Throughput'] = self.tmp_throughput
-        samples['DropPercentage'] = self.tmp_drop
-        if drop_percent > tolerance and self.tmp_throughput == 0:
-            samples['Throughput'] = round(rx_throughput / 1.0, 2)
-            samples['DropPercentage'] = drop_percent
-        if self.first_run:
-            max_supported_rate = out_packets / 30.0
-            self.rate = max_supported_rate
-            self.first_run = False
-            if drop_percent <= tolerance:
-                status = 'Completed'
+
+        samples['TxThroughput'] = tx_throughput
+        samples['RxThroughput'] = rx_throughput
+        samples['DropPercentage'] = drop_percent
+
+        if first_run:
+            self.rate = out_packets_sum / duration / num_ifaces
+            completed = True if drop_percent <= tolerance else False
+
         if drop_percent > tolerance:
             self.max_rate = self.rate
         elif drop_percent < tol_min:
             self.min_rate = self.rate
-            if drop_percent >= self.tmp_drop:
-                self.tmp_drop = drop_percent
-                self.tmp_throughput = round((rx_throughput / 1.0), 2)
-                samples['Throughput'] = round(rx_throughput / 1.0, 2)
-                samples['DropPercentage'] = drop_percent
         else:
-            samples['Throughput'] = round(rx_throughput / 1.0, 2)
-            samples['DropPercentage'] = drop_percent
-            return status, samples
-        self.get_multiplier()
-        traffic = self._get_ixia_traffic_profile(self.full_profile, mac)
-        self._ixia_traffic_generate(traffic, ixia_obj)
-        return status, samples
+            completed = True
+
+        return completed, samples
index 1e926ac..225ee43 100644 (file)
@@ -108,7 +108,6 @@ class ProxBinSearchProfile(ProxProfile):
                                                                  self.tolerated_loss,
                                                                  line_speed)
             self.curr_time = time.time()
-            diff_time = self.curr_time - self.prev_time
             self.prev_time = self.curr_time
 
             if result.success:
@@ -120,10 +119,11 @@ class ProxBinSearchProfile(ProxProfile):
                 # store results with success tag in influxdb
                 success_samples = {'Success_' + key: value for key, value in samples.items()}
 
-                success_samples["Success_rx_total"] = int(result.rx_total / diff_time)
-                success_samples["Success_tx_total"] = int(result.tx_total / diff_time)
-                success_samples["Success_can_be_lost"] = int(result.can_be_lost / diff_time)
-                success_samples["Success_drop_total"] = int(result.drop_total / diff_time)
+                # Store number of packets based statistics (we already have throughput)
+                success_samples["Success_rx_total"] = int(result.rx_total)
+                success_samples["Success_tx_total"] = int(result.tx_total)
+                success_samples["Success_can_be_lost"] = int(result.can_be_lost)
+                success_samples["Success_drop_total"] = int(result.drop_total)
                 self.queue.put(success_samples)
 
                 # Store Actual throughput for result samples
@@ -133,20 +133,16 @@ class ProxBinSearchProfile(ProxProfile):
                 LOG.debug("Failure... Decreasing upper bound")
                 self.current_upper = test_value
                 samples = result.get_samples(pkt_size, successful_pkt_loss, port_samples)
+                # samples  contains data such as Latency, Throughput, number of packets
+                # Hence they should not be divided by the time difference
 
-            for k in samples:
-                    tmp = samples[k]
-                    if isinstance(tmp, dict):
-                        for k2 in tmp:
-                            samples[k][k2] = int(samples[k][k2] / diff_time)
-
-            if theor_max_thruput < samples["TxThroughput"]:
-                theor_max_thruput = samples['TxThroughput']
+            if theor_max_thruput < samples["RequestedTxThroughput"]:
+                theor_max_thruput = samples['RequestedTxThroughput']
                 self.queue.put({'theor_max_throughput': theor_max_thruput})
 
             LOG.debug("Collect TG KPIs %s %s", datetime.datetime.now(), samples)
             self.queue.put(samples)
 
         result_samples["Result_pktSize"] = pkt_size
-        result_samples["Result_theor_max_throughput"] = theor_max_thruput/(1000 * 1000)
+        result_samples["Result_theor_max_throughput"] = theor_max_thruput
         self.queue.put(result_samples)
index 31ed301..7816c6d 100644 (file)
@@ -44,6 +44,8 @@ SECTION_CONTENTS = 1
 
 LOG = logging.getLogger(__name__)
 LOG.setLevel(logging.DEBUG)
+LOG_RESULT = logging.getLogger('yardstick')
+LOG_RESULT.setLevel(logging.DEBUG)
 
 BITS_PER_BYTE = 8
 RETRY_SECONDS = 60
@@ -123,7 +125,8 @@ class TotStatsTuple(namedtuple('TotStats', 'rx,tx,tsc,hz')):
 
 class ProxTestDataTuple(namedtuple('ProxTestDataTuple', 'tolerated,tsc_hz,delta_rx,'
                                                         'delta_tx,delta_tsc,'
-                                                        'latency,rx_total,tx_total,pps')):
+                                                        'latency,rx_total,tx_total,'
+                                                        'requested_pps')):
     @property
     def pkt_loss(self):
         try:
@@ -132,10 +135,15 @@ class ProxTestDataTuple(namedtuple('ProxTestDataTuple', 'tolerated,tsc_hz,delta_
             return 100.0
 
     @property
-    def mpps(self):
+    def tx_mpps(self):
         # calculate the effective throughput in Mpps
         return float(self.delta_tx) * self.tsc_hz / self.delta_tsc / 1e6
 
+    @property
+    def rx_mpps(self):
+        # calculate the effective throughput in Mpps
+        return float(self.delta_rx) * self.tsc_hz / self.delta_tsc / 1e6
+
     @property
     def can_be_lost(self):
         return int(self.tx_total * self.tolerated / 1e2)
@@ -162,11 +170,12 @@ class ProxTestDataTuple(namedtuple('ProxTestDataTuple', 'tolerated,tsc_hz,delta_
         ]
 
         samples = {
-            "Throughput": self.mpps,
+            "Throughput": self.rx_mpps,
+            "RxThroughput": self.rx_mpps,
             "DropPackets": pkt_loss,
             "CurrentDropPackets": pkt_loss,
-            "TxThroughput": self.pps / 1e6,
-            "RxThroughput": self.mpps,
+            "RequestedTxThroughput": self.requested_pps / 1e6,
+            "TxThroughput": self.tx_mpps,
             "PktSize": pkt_size,
         }
         if port_samples:
@@ -177,11 +186,12 @@ class ProxTestDataTuple(namedtuple('ProxTestDataTuple', 'tolerated,tsc_hz,delta_
 
     def log_data(self, logger=None):
         if logger is None:
-            logger = LOG
+            logger = LOG_RESULT
 
         template = "RX: %d; TX: %d; dropped: %d (tolerated: %d)"
-        logger.debug(template, self.rx_total, self.tx_total, self.drop_total, self.can_be_lost)
-        logger.debug("Mpps configured: %f; Mpps effective %f", self.pps / 1e6, self.mpps)
+        logger.info(template, self.rx_total, self.tx_total, self.drop_total, self.can_be_lost)
+        logger.info("Mpps configured: %f; Mpps generated %f; Mpps received %f",
+                    self.requested_pps / 1e6, self.tx_mpps, self.rx_mpps)
 
 
 class PacketDump(object):
@@ -288,7 +298,7 @@ class ProxSocketHelper(object):
             if mode != 'pktdump':
                 # Regular 1-line message. Stop reading from the socket.
                 LOG.debug("Regular response read")
-                return ret_str
+                return ret_str, True
 
             LOG.debug("Packet dump header read: [%s]", ret_str)
 
@@ -309,11 +319,11 @@ class ProxSocketHelper(object):
                 # Return boolean instead of string to signal
                 # successful reception of the packet dump.
                 LOG.debug("Packet dump stored, returning")
-                return True
+                return True, False
 
             index = data_end + 1
 
-        return ret_str
+        return ret_str, False
 
     def get_data(self, pkt_dump_only=False, timeout=1):
         """ read data from the socket """
@@ -352,7 +362,9 @@ class ProxSocketHelper(object):
         ret_str = ""
         for status in iter(is_ready, False):
             decoded_data = self._sock.recv(256).decode('utf-8')
-            ret_str = self._parse_socket_data(decoded_data, pkt_dump_only)
+            ret_str, done = self._parse_socket_data(decoded_data, pkt_dump_only)
+            if (done):
+                break
 
         LOG.debug("Received data from socket: [%s]", ret_str)
         return ret_str if status else ''
@@ -1001,8 +1013,8 @@ class ProxDataHelper(object):
     def totals_and_pps(self):
         if self._totals_and_pps is None:
             rx_total, tx_total = self.sut.port_stats(range(self.port_count))[6:8]
-            pps = self.value / 100.0 * self.line_rate_to_pps()
-            self._totals_and_pps = rx_total, tx_total, pps
+            requested_pps = self.value / 100.0 * self.line_rate_to_pps()
+            self._totals_and_pps = rx_total, tx_total, requested_pps
         return self._totals_and_pps
 
     @property
@@ -1014,7 +1026,7 @@ class ProxDataHelper(object):
         return self.totals_and_pps[1]
 
     @property
-    def pps(self):
+    def requested_pps(self):
         return self.totals_and_pps[2]
 
     @property
@@ -1055,7 +1067,7 @@ class ProxDataHelper(object):
             self.latency,
             self.rx_total,
             self.tx_total,
-            self.pps,
+            self.requested_pps,
         )
         self.result_tuple.log_data()
 
@@ -1134,6 +1146,7 @@ class ProxProfileHelper(object):
             self.sut.set_pkt_size(self.test_cores, pkt_size)
             self.sut.set_speed(self.test_cores, value)
             self.sut.start_all()
+            time.sleep(1)
             yield
         finally:
             self.sut.stop_all()
@@ -1246,6 +1259,7 @@ class ProxMplsProfileHelper(ProxProfileHelper):
             ratio = 1.0 * (pkt_size - 4 + 20) / (pkt_size + 20)
             self.sut.set_speed(self.plain_cores, value * ratio)
             self.sut.start_all()
+            time.sleep(1)
             yield
         finally:
             self.sut.stop_all()
index 285e086..36f1a19 100644 (file)
@@ -15,8 +15,6 @@
 import errno
 import logging
 import datetime
-import time
-
 
 from yardstick.common.process import check_if_process_failed
 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxDpdkVnfSetupEnvHelper
@@ -44,7 +42,8 @@ class ProxApproxVnf(SampleVNF):
 
         self.prev_packets_in = 0
         self.prev_packets_sent = 0
-        self.prev_time = time.time()
+        self.prev_tsc = 0
+        self.tsc_hz = 0
         super(ProxApproxVnf, self).__init__(name, vnfd, setup_env_helper_type,
                                             resource_helper_type)
 
@@ -68,8 +67,7 @@ class ProxApproxVnf(SampleVNF):
 
     def collect_kpi(self):
         # we can't get KPIs if the VNF is down
-        check_if_process_failed(self._vnf_process)
-
+        check_if_process_failed(self._vnf_process, 0.01)
         if self.resource_helper is None:
             result = {
                 "packets_in": 0,
@@ -79,6 +77,12 @@ class ProxApproxVnf(SampleVNF):
             }
             return result
 
+        if (self.tsc_hz == 0):
+            self.tsc_hz = float(self.resource_helper.sut.hz())
+            LOG.debug("TSC = %f", self.tsc_hz)
+            if (self.tsc_hz == 0):
+                raise RuntimeError("Unable to retrieve TSC")
+
         # use all_ports so we only use ports matched in topology
         port_count = len(self.vnfd_helper.port_pairs.all_ports)
         if port_count not in {1, 2, 4}:
@@ -86,10 +90,10 @@ class ProxApproxVnf(SampleVNF):
                                "1, 2 or 4 ports only supported at this time")
 
         self.port_stats = self.vnf_execute('port_stats', range(port_count))
-        curr_time = time.time()
         try:
             rx_total = self.port_stats[6]
             tx_total = self.port_stats[7]
+            tsc = self.port_stats[10]
         except IndexError:
             LOG.debug("port_stats parse fail ")
             # return empty dict so we don't mess up existing KPIs
@@ -103,15 +107,17 @@ class ProxApproxVnf(SampleVNF):
             # collectd KPIs here and not TG KPIs, so use a different method name
             "collect_stats": self.resource_helper.collect_collectd_kpi(),
         }
-        curr_packets_in = int((rx_total - self.prev_packets_in) / (curr_time - self.prev_time))
-        curr_packets_fwd = int((tx_total - self.prev_packets_sent) / (curr_time - self.prev_time))
+        curr_packets_in = int(((rx_total - self.prev_packets_in) * self.tsc_hz)
+                                / (tsc - self.prev_tsc) * port_count)
+        curr_packets_fwd = int(((tx_total - self.prev_packets_sent) * self.tsc_hz)
+                                / (tsc - self.prev_tsc) * port_count)
 
         result["curr_packets_in"] = curr_packets_in
         result["curr_packets_fwd"] = curr_packets_fwd
 
         self.prev_packets_in = rx_total
         self.prev_packets_sent = tx_total
-        self.prev_time = curr_time
+        self.prev_tsc = tsc
 
         LOG.debug("%s collect KPIs %s %s", self.APP_NAME, datetime.datetime.now(), result)
         return result
index 1687361..ef8b3f1 100644 (file)
@@ -825,7 +825,7 @@ class SampleVNF(GenericVNF):
 
     def collect_kpi(self):
         # we can't get KPIs if the VNF is down
-        check_if_process_failed(self._vnf_process)
+        check_if_process_failed(self._vnf_process, 0.01)
         stats = self.get_stats()
         m = re.search(self.COLLECT_KPI, stats, re.MULTILINE)
         if m:
index 265d0b7..2010546 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from __future__ import absolute_import
-
-import time
 import os
 import logging
 import sys
 
+from yardstick.common import exceptions
 from yardstick.common import utils
-from yardstick import error
 from yardstick.network_services.vnf_generic.vnf.sample_vnf import SampleVNFTrafficGen
 from yardstick.network_services.vnf_generic.vnf.sample_vnf import ClientResourceHelper
 from yardstick.network_services.vnf_generic.vnf.sample_vnf import Rfc2544ResourceHelper
 
+
 LOG = logging.getLogger(__name__)
 
 WAIT_AFTER_CFG_LOAD = 10
@@ -36,7 +34,7 @@ sys.path.append(IXNET_LIB)
 try:
     from IxNet import IxNextgen
 except ImportError:
-    IxNextgen = error.ErrorClass
+    IxNextgen = exceptions.ErrorClass
 
 
 class IxiaRfc2544Helper(Rfc2544ResourceHelper):
@@ -64,10 +62,10 @@ class IxiaResourceHelper(ClientResourceHelper):
         self._connect()
 
     def _connect(self, client=None):
-        self.client._connect(self.vnfd_helper)
+        self.client.connect(self.vnfd_helper)
 
     def get_stats(self, *args, **kwargs):
-        return self.client.ix_get_statistics()
+        return self.client.get_statistics()
 
     def stop_collect(self):
         self._terminated.value = 1
@@ -76,8 +74,6 @@ class IxiaResourceHelper(ClientResourceHelper):
 
     def generate_samples(self, ports, key=None, default=None):
         stats = self.get_stats()
-        last_result = stats[1]
-        latency = stats[0]
 
         samples = {}
         # this is not DPDK port num, but this is whatever number we gave
@@ -88,19 +84,21 @@ class IxiaResourceHelper(ClientResourceHelper):
                 intf = self.vnfd_helper.find_interface_by_port(port_num)
                 port_name = intf["name"]
                 samples[port_name] = {
-                    "rx_throughput_kps": float(last_result["Rx_Rate_Kbps"][port_num]),
-                    "tx_throughput_kps": float(last_result["Tx_Rate_Kbps"][port_num]),
-                    "rx_throughput_mbps": float(last_result["Rx_Rate_Mbps"][port_num]),
-                    "tx_throughput_mbps": float(last_result["Tx_Rate_Mbps"][port_num]),
-                    "in_packets": int(last_result["Valid_Frames_Rx"][port_num]),
-                    "out_packets": int(last_result["Frames_Tx"][port_num]),
-                    "RxThroughput": int(last_result["Valid_Frames_Rx"][port_num]) / 30,
-                    "TxThroughput": int(last_result["Frames_Tx"][port_num]) / 30,
+                    "rx_throughput_kps": float(stats["Rx_Rate_Kbps"][port_num]),
+                    "tx_throughput_kps": float(stats["Tx_Rate_Kbps"][port_num]),
+                    "rx_throughput_mbps": float(stats["Rx_Rate_Mbps"][port_num]),
+                    "tx_throughput_mbps": float(stats["Tx_Rate_Mbps"][port_num]),
+                    "in_packets": int(stats["Valid_Frames_Rx"][port_num]),
+                    "out_packets": int(stats["Frames_Tx"][port_num]),
+                    # NOTE(ralonsoh): we need to make the traffic injection
+                    # time variable.
+                    "RxThroughput": int(stats["Valid_Frames_Rx"][port_num]) / 30,
+                    "TxThroughput": int(stats["Frames_Tx"][port_num]) / 30,
                 }
                 if key:
-                    avg_latency = latency["Store-Forward_Avg_latency_ns"][port_num]
-                    min_latency = latency["Store-Forward_Min_latency_ns"][port_num]
-                    max_latency = latency["Store-Forward_Max_latency_ns"][port_num]
+                    avg_latency = stats["Store-Forward_Avg_latency_ns"][port_num]
+                    min_latency = stats["Store-Forward_Min_latency_ns"][port_num]
+                    max_latency = stats["Store-Forward_Max_latency_ns"][port_num]
                     samples[port_name][key] = \
                         {"Store-Forward_Avg_latency_ns": avg_latency,
                          "Store-Forward_Min_latency_ns": min_latency,
@@ -110,6 +108,12 @@ class IxiaResourceHelper(ClientResourceHelper):
 
         return samples
 
+    def _initialize_client(self):
+        """Initialize the IXIA IxNetwork client and configure the server"""
+        self.client.clear_config()
+        self.client.assign_ports()
+        self.client.create_traffic_model()
+
     def run_traffic(self, traffic_profile):
         if self._terminated.value:
             return
@@ -119,16 +123,7 @@ class IxiaResourceHelper(ClientResourceHelper):
         default = "00:00:00:00:00:00"
 
         self._build_ports()
-
-        # we don't know client_file_name until runtime as instantiate
-        client_file_name = \
-            utils.find_relative_file(
-                self.scenario_helper.scenario_cfg['ixia_profile'],
-                self.scenario_helper.scenario_cfg["task_path"])
-        self.client.ix_load_config(client_file_name)
-        time.sleep(WAIT_AFTER_CFG_LOAD)
-
-        self.client.ix_assign_ports()
+        self._initialize_client()
 
         mac = {}
         for port_name in self.vnfd_helper.port_pairs.all_ports:
@@ -140,43 +135,28 @@ class IxiaResourceHelper(ClientResourceHelper):
             mac["src_mac_{}".format(port_num)] = virt_intf.get("local_mac", default)
             mac["dst_mac_{}".format(port_num)] = virt_intf.get("dst_mac", default)
 
-        samples = {}
-        # Generate ixia traffic config...
         try:
             while not self._terminated.value:
-                traffic_profile.execute_traffic(self, self.client, mac)
+                first_run = traffic_profile.execute_traffic(
+                    self, self.client, mac)
                 self.client_started.value = 1
-                time.sleep(WAIT_FOR_TRAFFIC)
-                self.client.ix_stop_traffic()
+                # pylint: disable=unnecessary-lambda
+                utils.wait_until_true(lambda: self.client.is_traffic_stopped())
                 samples = self.generate_samples(traffic_profile.ports)
+
+                # NOTE(ralonsoh): the traffic injection duration is fixed to 30
+                # seconds. This parameter is configurable and must be retrieved
+                # from the traffic_profile.full_profile information.
+                # Every flow must have the same duration.
+                completed, samples = traffic_profile.get_drop_percentage(
+                    samples, min_tol, max_tol, first_run=first_run)
                 self._queue.put(samples)
-                status, samples = traffic_profile.get_drop_percentage(samples, min_tol,
-                                                                      max_tol, self.client, mac)
 
-                current = samples['CurrentDropPercentage']
-                if min_tol <= current <= max_tol or status == 'Completed':
+                if completed:
                     self._terminated.value = 1
 
-            self.client.ix_stop_traffic()
-            self._queue.put(samples)
-
-            if not self.rfc_helper.is_done():
-                self._terminated.value = 1
-                return
-
-            traffic_profile.execute_traffic(self, self.client, mac)
-            for _ in range(5):
-                time.sleep(self.LATENCY_TIME_SLEEP)
-                self.client.ix_stop_traffic()
-                samples = self.generate_samples(traffic_profile.ports, 'latency', {})
-                self._queue.put(samples)
-                traffic_profile.start_ixia_latency(self, self.client, mac)
-                if self._terminated.value:
-                    break
-
-            self.client.ix_stop_traffic()
         except Exception:  # pylint: disable=broad-except
-            LOG.exception("Run Traffic terminated")
+            LOG.exception('Run Traffic terminated')
 
         self._terminated.value = 1
 
index 0067f6b..9deef5c 100644 (file)
@@ -115,7 +115,8 @@ class ConfigCreate(object):
         pktq = "SWQ{0}{1}".format(self.sw_q, sink)
         return pktq
 
-    def vpe_upstream(self, vnf_cfg, index=0):
+    def vpe_upstream(self, vnf_cfg, index=0):  # pragma: no cover
+        # NOTE(ralonsoh): this function must be covered in UTs.
         parser = configparser.ConfigParser()
         parser.read(os.path.join(vnf_cfg, 'vpe_upstream'))
 
@@ -147,7 +148,8 @@ class ConfigCreate(object):
             self.n_pipeline += 1
         return parser
 
-    def vpe_downstream(self, vnf_cfg, index):
+    def vpe_downstream(self, vnf_cfg, index):  # pragma: no cover
+        # NOTE(ralonsoh): this function must be covered in UTs.
         parser = configparser.ConfigParser()
         parser.read(os.path.join(vnf_cfg, 'vpe_downstream'))
         for pipeline in parser.sections():
index d7adc0d..6b5e6fa 100644 (file)
@@ -62,15 +62,13 @@ Eventlet:
     sshclient = eventlet.import_patched("yardstick.ssh")
 
 """
-from __future__ import absolute_import
-import os
 import io
+import logging
+import os
+import re
 import select
 import socket
 import time
-import re
-
-import logging
 
 import paramiko
 from chainmap import ChainMap
@@ -78,6 +76,7 @@ from oslo_utils import encodeutils
 from scp import SCPClient
 import six
 
+from yardstick.common import exceptions
 from yardstick.common.utils import try_int, NON_NONE_DEFAULT, make_dict_from_map
 from yardstick.network_services.utils import provision_tool
 
@@ -90,12 +89,12 @@ def convert_key_to_str(key):
     return k.getvalue()
 
 
-class SSHError(Exception):
-    pass
-
-
-class SSHTimeout(SSHError):
-    pass
+class SSHError(Exception):
+    pass
+#
+#
+class SSHTimeout(SSHError):
+    pass
 
 
 class SSH(object):
@@ -193,7 +192,7 @@ class SSH(object):
                 return key_class.from_private_key(key)
             except paramiko.SSHException as e:
                 errors.append(e)
-        raise SSHError("Invalid pkey: %s" % errors)
+        raise exceptions.SSHError(error_msg='Invalid pkey: %s' % errors)
 
     @property
     def is_connected(self):
@@ -214,10 +213,10 @@ class SSH(object):
             return self._client
         except Exception as e:
             message = ("Exception %(exception_type)s was raised "
-                       "during connect. Exception value is: %(exception)r")
+                       "during connect. Exception value is: %(exception)r" %
+                       {"exception": e, "exception_type": type(e)})
             self._client = False
-            raise SSHError(message % {"exception": e,
-                                      "exception_type": type(e)})
+            raise exceptions.SSHError(error_msg=message)
 
     def _make_dict(self):
         return {
@@ -334,11 +333,11 @@ class SSH(object):
                 break
 
             if timeout and (time.time() - timeout) > start_time:
-                args = {"cmd": cmd, "host": self.host}
-                raise SSHTimeout("Timeout executing command "
-                                 "'%(cmd)s' on host %(host)s" % args)
+                message = ('Timeout executing command %(cmd)s on host %(host)s'
+                           % {"cmd": cmd, "host": self.host})
+                raise exceptions.SSHTimeout(error_msg=message)
             if e:
-                raise SSHError("Socket error.")
+                raise exceptions.SSHError(error_msg='Socket error')
 
         exit_status = session.recv_exit_status()
         if exit_status != 0 and raise_on_error:
@@ -346,7 +345,7 @@ class SSH(object):
             details = fmt % {"cmd": cmd, "status": exit_status}
             if stderr_data:
                 details += " Last stderr data: '%s'." % stderr_data
-            raise SSHError(details)
+            raise exceptions.SSHError(error_msg=details)
         return exit_status
 
     def execute(self, cmd, stdin=None, timeout=3600):
@@ -377,11 +376,12 @@ class SSH(object):
         while True:
             try:
                 return self.execute("uname")
-            except (socket.error, SSHError) as e:
+            except (socket.error, exceptions.SSHError) as e:
                 self.log.debug("Ssh is still unavailable: %r", e)
                 time.sleep(interval)
             if time.time() > end_time:
-                raise SSHTimeout("Timeout waiting for '%s'" % self.host)
+                raise exceptions.SSHTimeout(
+                    error_msg='Timeout waiting for "%s"' % self.host)
 
     def put(self, files, remote_path=b'.', recursive=False):
         client = self._get_client()
@@ -486,11 +486,12 @@ class AutoConnectSSH(SSH):
             while True:
                 try:
                     return self._get_client()
-                except (socket.error, SSHError) as e:
+                except (socket.error, exceptions.SSHError) as e:
                     self.log.debug("Ssh is still unavailable: %r", e)
                     time.sleep(interval)
                 if time.time() > end_time:
-                    raise SSHTimeout("Timeout waiting for '%s'" % self.host)
+                    raise exceptions.SSHTimeout(
+                        error_msg='Timeout waiting for "%s"' % self.host)
 
     def drop_connection(self):
         """ Don't close anything, just force creation of a new client """
index 72e684a..2cf1d92 100644 (file)
@@ -549,5 +549,5 @@ class OvsDeployTestCase(unittest.TestCase):
                     'ovs_version': ovs_version,
                     'dpdk_version': dpdk_version,
                     'proxy': 'test_proxy'})
-            mock_execute.assert_called_once_with(cmd)
-            mock_env_get.assert_called_once_with('http_proxy', '')
+            mock_execute.assert_called_with(cmd)
+            mock_env_get.assert_called_with('http_proxy', '')
index bc3bb73..6eb438c 100644 (file)
@@ -19,6 +19,7 @@ import mock
 import six
 import unittest
 
+from yardstick.benchmark.contexts import base
 from yardstick.benchmark.contexts.standalone import model
 from yardstick.benchmark.contexts.standalone import ovs_dpdk
 from yardstick.common import exceptions
@@ -59,9 +60,11 @@ class OvsDpdkContextTestCase(unittest.TestCase):
         self.ovs_dpdk = ovs_dpdk.OvsDpdkContext()
         self.addCleanup(self._remove_contexts)
 
-    def _remove_contexts(self):
-        if self.ovs_dpdk in self.ovs_dpdk.list:
-            self.ovs_dpdk._delete_context()
+    @staticmethod
+    def _remove_contexts():
+        for context in base.Context.list:
+            context._delete_context()
+        base.Context.list = []
 
     @mock.patch('yardstick.benchmark.contexts.standalone.model.Server')
     @mock.patch('yardstick.benchmark.contexts.standalone.model.StandaloneContextHelper')
index e70ab0a..de748e2 100644 (file)
@@ -18,6 +18,7 @@ import mock
 import unittest
 
 from yardstick import ssh
+from yardstick.benchmark.contexts import base
 from yardstick.benchmark.contexts.standalone import model
 from yardstick.benchmark.contexts.standalone import sriov
 
@@ -66,9 +67,11 @@ class SriovContextTestCase(unittest.TestCase):
         self.sriov = sriov.SriovContext()
         self.addCleanup(self._remove_contexts)
 
-    def _remove_contexts(self):
-        if self.sriov in self.sriov.list:
-            self.sriov._delete_context()
+    @staticmethod
+    def _remove_contexts():
+        for context in base.Context.list:
+            context._delete_context()
+        base.Context.list = []
 
     @mock.patch.object(model, 'StandaloneContextHelper')
     @mock.patch.object(model, 'Libvirt')
@@ -242,18 +245,19 @@ class SriovContextTestCase(unittest.TestCase):
         self.assertIsNone(self.sriov.configure_nics_for_sriov())
 
     @mock.patch.object(ssh, 'SSH', return_value=(0, "a", ""))
-    @mock.patch.object(model, 'Libvirt')
-    def test__enable_interfaces(self, mock_libvirt, mock_ssh):
-        # pylint: disable=unused-argument
-        # NOTE(ralonsoh): the pylint exception should be removed.
+    @mock.patch.object(model.Libvirt, 'add_sriov_interfaces',
+                       return_value='out_xml')
+    def test__enable_interfaces(self, mock_add_sriov, mock_ssh):
         self.sriov.vm_deploy = True
         self.sriov.connection = mock_ssh
         self.sriov.vm_names = ['vm_0', 'vm_1']
         self.sriov.drivers = []
         self.sriov.networks = self.NETWORKS
-        self.sriov.get_vf_data = mock.Mock(return_value="")
-        self.assertIsNone(self.sriov._enable_interfaces(
-            0, 0, ["private_0"], 'test'))
+        self.assertEqual(
+            'out_xml',
+            self.sriov._enable_interfaces(0, 0, ['private_0'], 'test'))
+        mock_add_sriov.assert_called_once_with(
+            '0000:00:0a.0', 0, self.NETWORKS['private_0']['mac'], 'test')
 
     @mock.patch.object(model.Libvirt, 'build_vm_xml')
     @mock.patch.object(model.Libvirt, 'check_if_vm_exists_and_delete')
@@ -282,7 +286,9 @@ class SriovContextTestCase(unittest.TestCase):
         mock_build_vm_xml.return_value = (xml_out, '00:00:00:00:00:01')
 
         with mock.patch.object(self.sriov, 'vnf_node') as mock_vnf_node, \
-                mock.patch.object(self.sriov, '_enable_interfaces'):
+                mock.patch.object(self.sriov, '_enable_interfaces') as \
+                mock_enable_interfaces:
+            mock_enable_interfaces.return_value = 'out_xml'
             mock_vnf_node.generate_vnf_instance = mock.Mock(
                 return_value='node')
             nodes_out = self.sriov.setup_sriov_context()
@@ -294,7 +300,10 @@ class SriovContextTestCase(unittest.TestCase):
             connection, 'flavor', vm_name, 0)
         mock_create_vm.assert_called_once_with(connection, cfg)
         mock_check.assert_called_once_with(vm_name, connection)
-        mock_write_file.assert_called_once_with(cfg, xml_out)
+        mock_write_file.assert_called_once_with(cfg, 'out_xml')
+        mock_enable_interfaces.assert_has_calls([
+            mock.call(0, mock.ANY, ['private_0'], mock.ANY),
+            mock.call(0, mock.ANY, ['public_0'], mock.ANY)], any_order=True)
 
     def test__get_vf_data(self):
         with mock.patch("yardstick.ssh.SSH") as ssh:
index e393001..c4113be 100644 (file)
@@ -9,6 +9,7 @@
 
 import unittest
 
+from yardstick.benchmark.contexts import base
 from yardstick.benchmark.contexts import dummy
 
 
@@ -20,7 +21,12 @@ class DummyContextTestCase(unittest.TestCase):
             'task_id': '1234567890',
         }
         self.test_context = dummy.DummyContext()
-        self.addCleanup(self.test_context._delete_context)
+        self.addCleanup(self._delete_contexts)
+
+    @staticmethod
+    def _delete_contexts():
+        for context in base.Context.list:
+            context._delete_context()
 
     def test___init__(self):
         self.assertFalse(self.test_context._flags.no_setup)
index ebb1d69..9c822b3 100644 (file)
@@ -8,38 +8,34 @@
 ##############################################################################
 
 from collections import OrderedDict
-from itertools import count
 import logging
 import os
 
 import mock
-import unittest
 
+from yardstick import ssh
 from yardstick.benchmark.contexts import base
 from yardstick.benchmark.contexts import heat
 from yardstick.benchmark.contexts import model
 from yardstick.common import constants as consts
 from yardstick.common import exceptions as y_exc
-from yardstick import ssh
+from yardstick.tests.unit import base as ut_base
 
 
 LOG = logging.getLogger(__name__)
 
 
-class HeatContextTestCase(unittest.TestCase):
-
-    def __init__(self, *args, **kwargs):
-        super(HeatContextTestCase, self).__init__(*args, **kwargs)
-        self.name_iter = ('vnf{:03}'.format(x) for x in count(0, step=3))
+class HeatContextTestCase(ut_base.BaseUnitTestCase):
 
     def setUp(self):
         self.test_context = heat.HeatContext()
         self.addCleanup(self._remove_contexts)
-        self.mock_context = mock.Mock(spec=heat.HeatContext())
 
-    def _remove_contexts(self):
-        if self.test_context in self.test_context.list:
-            self.test_context._delete_context()
+    @staticmethod
+    def _remove_contexts():
+        for context in base.Context.list:
+            context._delete_context()
+        base.Context.list = []
 
     def test___init__(self):
         self.assertIsNone(self.test_context._name)
@@ -658,6 +654,7 @@ class HeatContextTestCase(unittest.TestCase):
         baz3_server.public_ip = None
         baz3_server.context.user = 'zab'
 
+        self.mock_context = mock.Mock(spec=heat.HeatContext())
         self.mock_context._name = 'bar1'
         self.test_context.stack = mock.Mock()
         self.mock_context.stack.outputs = {
index 4dd9d40..0e11a53 100644 (file)
@@ -10,6 +10,7 @@
 import mock
 import unittest
 
+from yardstick.benchmark.contexts import base
 from yardstick.benchmark.contexts import kubernetes
 
 
@@ -43,9 +44,11 @@ class KubernetesTestCase(unittest.TestCase):
         self.addCleanup(self._remove_contexts)
         self.k8s_context.init(context_cfg)
 
-    def _remove_contexts(self):
-        if self.k8s_context in self.k8s_context.list:
-            self.k8s_context._delete_context()
+    @staticmethod
+    def _remove_contexts():
+        for context in base.Context.list:
+            context._delete_context()
+        base.Context.list = []
 
     @mock.patch.object(kubernetes.KubernetesContext, '_delete_services')
     @mock.patch.object(kubernetes.KubernetesContext, '_delete_ssh_key')
index 8b23248..b67be37 100644 (file)
@@ -13,6 +13,7 @@ import errno
 import mock
 
 from yardstick.common import constants as consts
+from yardstick.benchmark.contexts import base
 from yardstick.benchmark.contexts import node
 
 
@@ -33,9 +34,11 @@ class NodeContextTestCase(unittest.TestCase):
             'file': self._get_file_abspath(self.NODES_SAMPLE)
         }
 
-    def _remove_contexts(self):
-        if self.test_context in self.test_context.list:
-            self.test_context._delete_context()
+    @staticmethod
+    def _remove_contexts():
+        for context in base.Context.list:
+            context._delete_context()
+        base.Context.list = []
 
     def _get_file_abspath(self, filename):
         curr_path = os.path.dirname(os.path.abspath(__file__))
index 9e8e4e9..7468368 100644 (file)
@@ -17,6 +17,7 @@ import six
 import unittest
 import uuid
 
+from yardstick.benchmark.contexts import base
 from yardstick.benchmark.contexts import dummy
 from yardstick.benchmark.core import task
 from yardstick.common import constants as consts
@@ -357,6 +358,12 @@ key2:
                 }
             }
 
+    @staticmethod
+    def _remove_contexts():
+        for context in base.Context.list:
+            context._delete_context()
+        base.Context.list = []
+
     def test__change_node_names(self):
 
         ctx_attrs = {
@@ -371,6 +378,7 @@ key2:
             }
 
         my_context = dummy.DummyContext()
+        self.addCleanup(self._remove_contexts)
         my_context.init(ctx_attrs)
 
         expected_scenario = {
@@ -413,6 +421,7 @@ key2:
             }
 
         my_context = dummy.DummyContext()
+        self.addCleanup(self._remove_contexts)
         my_context.init(ctx_attrs)
 
         scenario = copy.deepcopy(self.scenario)
@@ -428,6 +437,7 @@ key2:
         }
 
         my_context = dummy.DummyContext()
+        self.addCleanup(self._remove_contexts)
         my_context.init(ctx_attrs)
         scenario = copy.deepcopy(self.scenario)
         scenario['options'] = None
@@ -442,6 +452,7 @@ key2:
         }
 
         my_context = dummy.DummyContext()
+        self.addCleanup(self._remove_contexts)
         my_context.init(ctx_attrs)
         scenario = copy.deepcopy(self.scenario)
         scenario['options']['server_name'] = None
index 639cf29..aebd1df 100644 (file)
@@ -6,30 +6,50 @@
 # which accompanies this distribution, and is available at
 # http://www.apache.org/licenses/LICENSE-2.0
 ##############################################################################
-import unittest
+
 import mock
+from oslo_utils import uuidutils
+import unittest
 
-from yardstick.benchmark.scenarios.lib import create_image
 from yardstick.common import openstack_utils
+from yardstick.common import exceptions
+from yardstick.benchmark.scenarios.lib import create_image
+
 
-# NOTE(elfoley): There should be more tests here.
 class CreateImageTestCase(unittest.TestCase):
 
-    @mock.patch.object(openstack_utils, 'create_image')
-    @mock.patch.object(openstack_utils, 'get_glance_client')
-    def test_create_image(self, mock_get_glance_client, mock_create_image):
-        options = {
-            'image_name': 'yardstick_test_image_01',
-            'disk_format': 'qcow2',
-            'container_format': 'bare',
-            'min_disk': '1',
-            'min_ram': '512',
-            'protected': 'False',
-            'tags': '["yardstick automatic test image"]',
-            'file_path': '/home/opnfv/images/cirros-0.3.5-x86_64-disk.img'
-        }
-        args = {"options": options}
-        obj = create_image.CreateImage(args, {})
-        obj.run({})
-        mock_create_image.assert_called_once()
-        mock_get_glance_client.assert_called_once()
+    def setUp(self):
+        self._mock_create_image = mock.patch.object(
+            openstack_utils, 'create_image')
+        self.mock_create_image = (
+            self._mock_create_image.start())
+        self._mock_get_shade_client = mock.patch.object(
+            openstack_utils, 'get_shade_client')
+        self.mock_get_shade_client = self._mock_get_shade_client.start()
+        self._mock_log = mock.patch.object(create_image, 'LOG')
+        self.mock_log = self._mock_log.start()
+        self.args = {'options': {'image_name': 'yardstick_image'}}
+        self.result = {}
+        self.cimage_obj = create_image.CreateImage(self.args, mock.ANY)
+        self.addCleanup(self._stop_mock)
+
+    def _stop_mock(self):
+        self._mock_create_image.stop()
+        self._mock_get_shade_client.stop()
+        self._mock_log.stop()
+
+    def test_run(self):
+        _uuid = uuidutils.generate_uuid()
+        self.cimage_obj.scenario_cfg = {'output': 'id'}
+        self.mock_create_image.return_value = _uuid
+        output = self.cimage_obj.run(self.result)
+        self.assertEqual({'image_create': 1}, self.result)
+        self.assertEqual({'id': _uuid}, output)
+        self.mock_log.info.asset_called_once_with('Create image successful!')
+
+    def test_run_fail(self):
+        self.mock_create_image.return_value = None
+        with self.assertRaises(exceptions.ScenarioCreateImageError):
+            self.cimage_obj.run(self.result)
+        self.assertEqual({'image_create': 0}, self.result)
+        self.mock_log.error.assert_called_once_with('Create image failed!')
index e382d46..8a1d6d6 100644 (file)
@@ -9,21 +9,44 @@
 import unittest
 import mock
 
-from yardstick.benchmark.scenarios.lib.delete_image import DeleteImage
+from yardstick.common import openstack_utils
+from yardstick.common import exceptions
+from yardstick.benchmark.scenarios.lib import delete_image
 
 
 class DeleteImageTestCase(unittest.TestCase):
 
-    @mock.patch('yardstick.common.openstack_utils.delete_image')
-    @mock.patch('yardstick.common.openstack_utils.get_image_id')
-    @mock.patch('yardstick.common.openstack_utils.get_glance_client')
-    def test_delete_image(self, mock_get_glance_client, mock_image_id, mock_delete_image):
-        options = {
-            'image_name': 'yardstick_test_image_01'
-        }
-        args = {"options": options}
-        obj = DeleteImage(args, {})
-        obj.run({})
-        mock_delete_image.assert_called_once()
-        mock_image_id.assert_called_once()
-        mock_get_glance_client.assert_called_once()
+    def setUp(self):
+        self._mock_delete_image = mock.patch.object(
+            openstack_utils, 'delete_image')
+        self.mock_delete_image = (
+            self._mock_delete_image.start())
+        self._mock_get_shade_client = mock.patch.object(
+            openstack_utils, 'get_shade_client')
+        self.mock_get_shade_client = self._mock_get_shade_client.start()
+        self._mock_log = mock.patch.object(delete_image, 'LOG')
+        self.mock_log = self._mock_log.start()
+        self.args = {'options': {'name_or_id': 'yardstick_image'}}
+        self.result = {}
+
+        self.delimg_obj = delete_image.DeleteImage(self.args, mock.ANY)
+
+        self.addCleanup(self._stop_mock)
+
+    def _stop_mock(self):
+        self._mock_delete_image.stop()
+        self._mock_get_shade_client.stop()
+        self._mock_log.stop()
+
+    def test_run(self):
+        self.mock_delete_image.return_value = True
+        self.assertIsNone(self.delimg_obj.run(self.result))
+        self.assertEqual({'delete_image': 1}, self.result)
+        self.mock_log.info.assert_called_once_with('Delete image successful!')
+
+    def test_run_fail(self):
+        self.mock_delete_image.return_value = False
+        with self.assertRaises(exceptions.ScenarioDeleteImageError):
+            self.delimg_obj.run(self.result)
+        self.assertEqual({'delete_image': 0}, self.result)
+        self.mock_log.error.assert_called_once_with('Delete image failed!')
index 9bfbf07..2885dc6 100644 (file)
@@ -20,11 +20,11 @@ import mock
 import unittest
 
 from yardstick import tests
+from yardstick.common import exceptions
 from yardstick.common import utils
 from yardstick.network_services.collector.subscriber import Collector
 from yardstick.network_services.traffic_profile import base
 from yardstick.network_services.vnf_generic import vnfdgen
-from yardstick.error import IncorrectConfig
 from yardstick.network_services.vnf_generic.vnf.base import GenericTrafficGen
 from yardstick.network_services.vnf_generic.vnf.base import GenericVNF
 
@@ -423,7 +423,7 @@ class TestNetworkServiceTestCase(unittest.TestCase):
         with mock.patch.dict(sys.modules, tests.STL_MOCKS):
             self.assertIsNotNone(self.s.get_vnf_impl(vnfd))
 
-        with self.assertRaises(vnf_generic.IncorrectConfig) as raised:
+        with self.assertRaises(exceptions.IncorrectConfig) as raised:
             self.s.get_vnf_impl('NonExistentClass')
 
         exc_str = str(raised.exception)
@@ -465,7 +465,7 @@ class TestNetworkServiceTestCase(unittest.TestCase):
 
         cfg_patch = mock.patch.object(self.s, 'context_cfg', cfg)
         with cfg_patch:
-            with self.assertRaises(IncorrectConfig):
+            with self.assertRaises(exceptions.IncorrectConfig):
                 self.s.map_topology_to_infrastructure()
 
     def test_map_topology_to_infrastructure_config_invalid(self):
@@ -482,7 +482,7 @@ class TestNetworkServiceTestCase(unittest.TestCase):
 
         config_patch = mock.patch.object(self.s, 'context_cfg', cfg)
         with config_patch:
-            with self.assertRaises(IncorrectConfig):
+            with self.assertRaises(exceptions.IncorrectConfig):
                 self.s.map_topology_to_infrastructure()
 
     def test__resolve_topology_invalid_config(self):
@@ -496,7 +496,7 @@ class TestNetworkServiceTestCase(unittest.TestCase):
             for interface in self.tg__1['interfaces'].values():
                 del interface['local_mac']
 
-            with self.assertRaises(vnf_generic.IncorrectConfig) as raised:
+            with self.assertRaises(exceptions.IncorrectConfig) as raised:
                 self.s._resolve_topology()
 
             self.assertIn('not found', str(raised.exception))
@@ -509,7 +509,7 @@ class TestNetworkServiceTestCase(unittest.TestCase):
             self.s.topology["vld"][0]['vnfd-connection-point-ref'].append(
                 self.s.topology["vld"][0]['vnfd-connection-point-ref'][0])
 
-            with self.assertRaises(vnf_generic.IncorrectConfig) as raised:
+            with self.assertRaises(exceptions.IncorrectConfig) as raised:
                 self.s._resolve_topology()
 
             self.assertIn('wrong endpoint count', str(raised.exception))
@@ -518,7 +518,7 @@ class TestNetworkServiceTestCase(unittest.TestCase):
             self.s.topology["vld"][0]['vnfd-connection-point-ref'] = \
                 self.s.topology["vld"][0]['vnfd-connection-point-ref'][:1]
 
-            with self.assertRaises(vnf_generic.IncorrectConfig) as raised:
+            with self.assertRaises(exceptions.IncorrectConfig) as raised:
                 self.s._resolve_topology()
 
             self.assertIn('wrong endpoint count', str(raised.exception))
diff --git a/yardstick/tests/unit/common/test_exceptions.py b/yardstick/tests/unit/common/test_exceptions.py
new file mode 100644 (file)
index 0000000..8840155
--- /dev/null
@@ -0,0 +1,28 @@
+# Copyright 2018 Intel Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from yardstick.common import exceptions
+from yardstick.tests.unit import base as ut_base
+
+
+class ErrorClassTestCase(ut_base.BaseUnitTestCase):
+
+    def test_init(self):
+        with self.assertRaises(RuntimeError):
+            exceptions.ErrorClass()
+
+    def test_getattr(self):
+        error_instance = exceptions.ErrorClass(test='')
+        with self.assertRaises(AttributeError):
+            error_instance.get_name()
index a1a4af2..9361a97 100644 (file)
@@ -656,3 +656,66 @@ class DetachVolumeTestCase(unittest.TestCase):
                                                'volume_name_or_id')
         mock_logger.error.assert_called_once()
         self.assertFalse(output)
+
+
+# *********************************************
+#   GLANCE
+# *********************************************
+
+class CreateImageTestCase(unittest.TestCase):
+
+    def setUp(self):
+        self.mock_shade_client = mock.Mock()
+        self._uuid = uuidutils.generate_uuid()
+        self.name = 'image_name'
+
+    @mock.patch.object(openstack_utils, 'log')
+    def test_create_image_already_exit(self, mock_logger):
+        self.mock_shade_client.get_image_id.return_value = self._uuid
+        output = openstack_utils.create_image(self.mock_shade_client, self.name)
+        mock_logger.info.assert_called_once()
+        self.assertEqual(self._uuid, output)
+
+    def test_create_image(self):
+        self.mock_shade_client.get_image_id.return_value = None
+        self.mock_shade_client.create_image.return_value = {'id': self._uuid}
+        output = openstack_utils.create_image(self.mock_shade_client, self.name)
+        self.assertEqual(self._uuid, output)
+
+    @mock.patch.object(openstack_utils, 'log')
+    def test_create_image_exception(self, mock_logger):
+        self.mock_shade_client.get_image_id.return_value = None
+        self.mock_shade_client.create_image.side_effect = (
+            exc.OpenStackCloudException('error message'))
+
+        output = openstack_utils.create_image(self.mock_shade_client,
+                                              self.name)
+        mock_logger.error.assert_called_once()
+        self.assertIsNone(output)
+
+
+class DeleteImageTestCase(unittest.TestCase):
+
+    def test_delete_image(self):
+        self.mock_shade_client = mock.Mock()
+        self.mock_shade_client.delete_image.return_value = True
+        output = openstack_utils.delete_image(self.mock_shade_client,
+                                              'image_name_or_id')
+        self.assertTrue(output)
+
+    def test_delete_image_fail(self):
+        self.mock_shade_client = mock.Mock()
+        self.mock_shade_client.delete_image.return_value = False
+        output = openstack_utils.delete_image(self.mock_shade_client,
+                                              'image_name_or_id')
+        self.assertFalse(output)
+
+    @mock.patch.object(openstack_utils, 'log')
+    def test_delete_image_exception(self, mock_logger):
+        self.mock_shade_client = mock.Mock()
+        self.mock_shade_client.delete_image.side_effect = (
+            exc.OpenStackCloudException('error message'))
+        output = openstack_utils.delete_image(self.mock_shade_client,
+                                              'image_name_or_id')
+        mock_logger.error.assert_called_once()
+        self.assertFalse(output)
index 666b29b..5fd91c8 100644 (file)
@@ -21,7 +21,6 @@ import unittest
 
 import yardstick
 from yardstick import ssh
-import yardstick.error
 from yardstick.common import constants
 from yardstick.common import utils
 from yardstick.common import exceptions
@@ -895,7 +894,7 @@ class TestUtils(unittest.TestCase):
         os.environ.clear()
         os.environ.update(base_env)
 
-    @mock.patch('yardstick.common.utils.configparser.ConfigParser')
+    @mock.patch.object(configparser, 'ConfigParser')
     def test_parse_ini_file(self, mock_config_parser_type):
         defaults = {
             'default1': 'value1',
@@ -927,23 +926,26 @@ class TestUtils(unittest.TestCase):
         result = utils.parse_ini_file('my_path')
         self.assertDictEqual(result, expected)
 
-    @mock.patch('yardstick.common.utils.configparser.ConfigParser')
-    def test_parse_ini_file_missing_section_header(self, mock_config_parser_type):
+    @mock.patch.object(utils, 'logger')
+    @mock.patch.object(configparser, 'ConfigParser')
+    def test_parse_ini_file_missing_section_header(
+            self, mock_config_parser_type, *args):
         mock_config_parser = mock_config_parser_type()
-        mock_config_parser.read.side_effect = \
-            configparser.MissingSectionHeaderError(mock.Mock(), 321, mock.Mock())
+        mock_config_parser.read.side_effect = (
+            configparser.MissingSectionHeaderError(mock.Mock(), 321,
+                                                   mock.Mock()))
 
         with self.assertRaises(configparser.MissingSectionHeaderError):
             utils.parse_ini_file('my_path')
 
-    @mock.patch('yardstick.common.utils.configparser.ConfigParser')
+    @mock.patch.object(configparser, 'ConfigParser')
     def test_parse_ini_file_no_file(self, mock_config_parser_type):
         mock_config_parser = mock_config_parser_type()
         mock_config_parser.read.return_value = False
         with self.assertRaises(RuntimeError):
             utils.parse_ini_file('my_path')
 
-    @mock.patch('yardstick.common.utils.configparser.ConfigParser')
+    @mock.patch.object(configparser, 'ConfigParser')
     def test_parse_ini_file_no_default_section_header(self, mock_config_parser_type):
         s1 = {
             'key1': 'value11',
@@ -989,14 +991,6 @@ class TestUtils(unittest.TestCase):
         with self.assertRaises(RuntimeError):
             utils.validate_non_string_sequence(1, raise_exc=RuntimeError)
 
-    def test_error_class(self):
-        with self.assertRaises(RuntimeError):
-            yardstick.error.ErrorClass()
-
-        error_instance = yardstick.error.ErrorClass(test='')
-        with self.assertRaises(AttributeError):
-            error_instance.get_name()
-
 
 class TestUtilsIpAddrMethods(unittest.TestCase):
 
index 367072e..9d94e3d 100644 (file)
@@ -17,9 +17,7 @@ import unittest
 
 import os
 
-from yardstick.error import IncorrectConfig, SSHError
-from yardstick.error import IncorrectNodeSetup
-from yardstick.error import IncorrectSetup
+from yardstick.common import exceptions
 from yardstick.network_services.helpers.dpdkbindnic_helper import DpdkInterface
 from yardstick.network_services.helpers.dpdkbindnic_helper import DpdkNode
 from yardstick.network_services.helpers.dpdkbindnic_helper import DpdkBindHelper
@@ -142,12 +140,13 @@ class TestDpdkInterface(unittest.TestCase):
 
     def test_probe_missing_values_negative(self):
         mock_dpdk_node = mock.Mock()
-        mock_dpdk_node.netdevs.values.side_effect = IncorrectNodeSetup
+        mock_dpdk_node.netdevs.values.side_effect = (
+            exceptions.IncorrectNodeSetup(error_msg=''))
 
         interface = {'local_mac': '0a:de:ad:be:ef:f5'}
         dpdk_intf = DpdkInterface(mock_dpdk_node, interface)
 
-        with self.assertRaises(IncorrectConfig):
+        with self.assertRaises(exceptions.IncorrectConfig):
             dpdk_intf.probe_missing_values()
 
 
@@ -213,7 +212,7 @@ class TestDpdkNode(unittest.TestCase):
     def test_check(self):
         def update():
             if not mock_force_rebind.called:
-                raise IncorrectConfig
+                raise exceptions.IncorrectConfig(error_msg='')
 
             interfaces[0]['virtual-interface'].update({
                 'vpci': '0000:01:02.1',
@@ -244,11 +243,11 @@ class TestDpdkNode(unittest.TestCase):
         mock_ssh_helper = mock.Mock()
         mock_ssh_helper.execute.return_value = 0, '', ''
 
-        mock_intf_type().check.side_effect = SSHError
+        mock_intf_type().check.side_effect = exceptions.SSHError
 
         dpdk_node = DpdkNode(NAME, self.INTERFACES, mock_ssh_helper)
 
-        with self.assertRaises(IncorrectSetup):
+        with self.assertRaises(exceptions.IncorrectSetup):
             dpdk_node.check()
 
     def test_probe_netdevs(self):
diff --git a/yardstick/tests/unit/network_services/libs/ixia_libs/test_IxNet.py b/yardstick/tests/unit/network_services/libs/ixia_libs/test_IxNet.py
deleted file mode 100644 (file)
index 7ca2f0f..0000000
+++ /dev/null
@@ -1,874 +0,0 @@
-# Copyright (c) 2016-2017 Intel Corporation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-import mock
-import IxNetwork
-import unittest
-
-from yardstick.network_services.libs.ixia_libs.IxNet.IxNet import IxNextgen
-from yardstick.network_services.libs.ixia_libs.IxNet.IxNet import IP_VERSION_4
-from yardstick.network_services.libs.ixia_libs.IxNet.IxNet import IP_VERSION_6
-
-UPLINK = "uplink"
-DOWNLINK = "downlink"
-
-
-class TestIxNextgen(unittest.TestCase):
-
-    def test___init__(self):
-        ixnet_gen = IxNextgen()
-        self.assertIsNone(ixnet_gen._bidir)
-
-    @mock.patch.object(IxNetwork, 'IxNet')
-    def test_connect(self, mock_ixnet):
-        ixnet_instance = mock.Mock()
-        mock_ixnet.return_value = ixnet_instance
-        ixnet_gen = IxNextgen()
-        with mock.patch.object(ixnet_gen, 'get_config') as mock_config:
-            mock_config.return_value = {'machine': 'machine_fake',
-                                        'port': 'port_fake',
-                                        'version': 12345}
-            ixnet_gen._connect(mock.ANY)
-
-        ixnet_instance.connect.assert_called_once_with(
-            'machine_fake', '-port', 'port_fake', '-version', '12345')
-        mock_config.assert_called_once()
-
-    def test_clear_ixia_config(self):
-        ixnet = mock.MagicMock()
-        ixnet.execute = mock.Mock()
-
-        ixnet_gen = IxNextgen(ixnet)
-
-        result = ixnet_gen.clear_ixia_config()
-        self.assertIsNone(result)
-        self.assertEqual(ixnet.execute.call_count, 1)
-
-    def test_load_ixia_profile(self):
-        ixnet = mock.MagicMock()
-        ixnet.execute = mock.Mock()
-
-        ixnet_gen = IxNextgen(ixnet)
-
-        result = ixnet_gen.load_ixia_profile({})
-        self.assertIsNone(result)
-        self.assertEqual(ixnet.execute.call_count, 1)
-
-    def test_load_ixia_config(self):
-        ixnet = mock.MagicMock()
-        ixnet.execute = mock.Mock()
-
-        ixnet_gen = IxNextgen(ixnet)
-
-        result = ixnet_gen.ix_load_config({})
-        self.assertIsNone(result)
-        self.assertEqual(ixnet.execute.call_count, 2)
-
-    @mock.patch('yardstick.network_services.libs.ixia_libs.IxNet.IxNet.log')
-    def test_ix_assign_ports(self, mock_logger):
-        ixnet = mock.MagicMock()
-        ixnet.getList.return_value = [0, 1]
-        ixnet.getAttribute.side_effect = ['up', 'down']
-
-        config = {
-            'chassis': '1.1.1.1',
-            'cards': ['1', '2'],
-            'ports': ['2', '2'],
-        }
-
-        ixnet_gen = IxNextgen(ixnet)
-        ixnet_gen._cfg = config
-
-        result = ixnet_gen.ix_assign_ports()
-        self.assertIsNone(result)
-        self.assertEqual(ixnet.execute.call_count, 1)
-        self.assertEqual(ixnet.commit.call_count, 1)
-        self.assertEqual(ixnet.getAttribute.call_count, 2)
-        self.assertEqual(mock_logger.error.call_count, 1)
-
-    def test_ix_update_frame(self):
-        static_traffic_params = {
-            UPLINK: {
-                "id": 1,
-                "bidir": "False",
-                "duration": 60,
-                "iload": "100",
-                "outer_l2": {
-                    "dstmac": "00:00:00:00:00:03",
-                    "framesPerSecond": True,
-                    "framesize": {
-                        "64B": "100",
-                        "1KB": "0",
-                    },
-                    "srcmac": "00:00:00:00:00:01"
-                },
-                "outer_l3": {
-                    "dscp": 0,
-                    "dstip4": "152.16.40.20",
-                    "proto": "udp",
-                    "srcip4": "152.16.100.20",
-                    "ttl": 32
-                },
-                "outer_l3v4": {
-                    "dscp": 0,
-                    "dstip4": "152.16.40.20",
-                    "proto": "udp",
-                    "srcip4": "152.16.100.20",
-                    "ttl": 32
-                },
-                "outer_l3v6": {
-                    "count": 1024,
-                    "dscp": 0,
-                    "dstip4": "152.16.100.20",
-                    "proto": "udp",
-                    "srcip4": "152.16.40.20",
-                    "ttl": 32
-                },
-                "outer_l4": {
-                    "dstport": "2001",
-                    "srcport": "1234"
-                },
-                "traffic_type": "continuous"
-            },
-            DOWNLINK: {
-                "id": 2,
-                "bidir": "False",
-                "duration": 60,
-                "iload": "100",
-                "outer_l2": {
-                    "dstmac": "00:00:00:00:00:04",
-                    "framesPerSecond": False,
-                    "framesize": {"64B": "100"},
-                    "srcmac": "00:00:00:00:00:01"
-                },
-                "outer_l3": {
-                    "count": 1024,
-                    "dscp": 0,
-                    "dstip4": "152.16.100.20",
-                    "proto": "udp",
-                    "srcip4": "152.16.40.20",
-                    "ttl": 32
-                },
-                "outer_l3v4": {
-                    "count": 1024,
-                    "dscp": 0,
-                    "dstip4": "152.16.100.20",
-                    "proto": "udp",
-                    "srcip4": "152.16.40.20",
-                    "ttl": 32
-                },
-                "outer_l3v6": {
-                    "count": 1024,
-                    "dscp": 0,
-                    "dstip4": "152.16.100.20",
-                    "proto": "udp",
-                    "srcip4": "152.16.40.20",
-                    "ttl": 32
-                },
-                "outer_l4": {
-                    "dstport": "1234",
-                    "srcport": "2001"
-                },
-                "traffic_type": "continuous"
-            }
-        }
-
-        ixnet = mock.MagicMock()
-        ixnet.remapIds.return_value = ["0"]
-        ixnet.setMultiAttribute.return_value = [1]
-        ixnet.commit.return_value = [1]
-        ixnet.getList.side_effect = [
-            [1],
-            [1],
-            [1],
-            [
-                "ethernet.header.destinationAddress",
-                "ethernet.header.sourceAddress",
-            ],
-        ]
-
-        ixnet_gen = IxNextgen(ixnet)
-
-        result = ixnet_gen.ix_update_frame(static_traffic_params)
-        self.assertIsNone(result)
-        self.assertEqual(ixnet.setMultiAttribute.call_count, 7)
-        self.assertEqual(ixnet.commit.call_count, 2)
-
-    def test_ix_update_udp(self):
-        ixnet = mock.MagicMock()
-
-        ixnet_gen = IxNextgen(ixnet)
-
-        result = ixnet_gen.ix_update_udp({})
-        self.assertIsNone(result)
-
-    def test_ix_update_tcp(self):
-        ixnet = mock.MagicMock()
-        ixnet_gen = IxNextgen(ixnet)
-
-        result = ixnet_gen.ix_update_tcp({})
-        self.assertIsNone(result)
-
-    def test_ix_start_traffic(self):
-        ixnet = mock.MagicMock()
-        ixnet.getList.return_value = [0]
-        ixnet.getAttribute.return_value = 'down'
-
-        ixnet_gen = IxNextgen(ixnet)
-
-        result = ixnet_gen.ix_start_traffic()
-        self.assertIsNone(result)
-        self.assertEqual(ixnet.getList.call_count, 1)
-        self.assertEqual(ixnet.execute.call_count, 3)
-
-    def test_ix_stop_traffic(self):
-        ixnet = mock.MagicMock()
-        ixnet.getList.return_value = [0]
-
-        ixnet_gen = IxNextgen(ixnet)
-
-        result = ixnet_gen.ix_stop_traffic()
-        self.assertIsNone(result)
-        self.assertEqual(ixnet.getList.call_count, 1)
-        self.assertEqual(ixnet.execute.call_count, 1)
-
-    def test_ix_get_statistics(self):
-        ixnet = mock.MagicMock()
-        ixnet.execute.return_value = ""
-        ixnet.getList.side_effect = [
-            [
-                '::ixNet::OBJ-/statistics/view:"Traffic Item Statistics"',
-                '::ixNet::OBJ-/statistics/view:"Port Statistics"',
-            ],
-            [
-                '::ixNet::OBJ-/statistics/view:"Flow Statistics"',
-            ],
-        ]
-
-        ixnet_gen = IxNextgen(ixnet)
-
-        result = ixnet_gen.ix_get_statistics()
-        self.assertIsNotNone(result)
-        self.assertEqual(ixnet.getList.call_count, 1)
-        self.assertEqual(ixnet.execute.call_count, 20)
-
-    def test_find_view_obj_no_where(self):
-        views = ['here', 'there', 'everywhere']
-        result = IxNextgen.find_view_obj('no_where', views)
-        self.assertEqual(result, '')
-
-    def test_add_ip_header_v4(self):
-        static_traffic_params = {
-            "uplink_0": {
-                "id": 1,
-                "bidir": "False",
-                "duration": 60,
-                "iload": "100",
-                "outer_l2": {
-                    "dstmac": "00:00:00:00:00:03",
-                    "framesPerSecond": True,
-                    "framesize": {"64B": "100"},
-                    "srcmac": "00:00:00:00:00:01"
-                },
-                "outer_l3": {
-                    "dscp": 0,
-                    "dstip4": "152.16.40.20",
-                    "proto": "udp",
-                    "srcip4": "152.16.100.20",
-                    "count": 1024,
-                    "ttl": 32
-                },
-                "outer_l3v4": {
-                    "dscp": 0,
-                    "dstip4": "152.16.40.20",
-                    "proto": "udp",
-                    "srcip4": "152.16.100.20",
-                    "ttl": 32
-                },
-                "outer_l3v6": {
-                    "count": 1024,
-                    "dscp": 0,
-                    "dstip4": "152.16.100.20",
-                    "proto": "udp",
-                    "srcip4": "152.16.40.20",
-                    "ttl": 32
-                },
-                "outer_l4": {
-                    "dstport": "2001",
-                    "srcport": "1234"
-                },
-                "traffic_type": "continuous"
-            },
-            "downlink_0": {
-                "id": 2,
-                "bidir": "False",
-                "duration": 60,
-                "iload": "100",
-                "outer_l2": {
-                    "dstmac": "00:00:00:00:00:04",
-                    "framesPerSecond": True,
-                    "framesize": {"64B": "100"},
-                    "srcmac": "00:00:00:00:00:01"
-                },
-                "outer_l3": {
-                    "count": 1024,
-                    "dscp": 0,
-                    "dstip4": "152.16.100.20",
-                    "proto": "udp",
-                    "srcip4": "152.16.40.20",
-                    "ttl": 32
-                },
-                "outer_l3v4": {
-                    "count": 1024,
-                    "dscp": 0,
-                    "dstip4": "152.16.100.20",
-                    "proto": "udp",
-                    "srcip4": "152.16.40.20",
-                    "ttl": 32
-                },
-                "outer_l3v6": {
-                    "count": 1024,
-                    "dscp": 0,
-                    "dstip4": "152.16.100.20",
-                    "proto": "udp",
-                    "srcip4": "152.16.40.20",
-                    "ttl": 32
-                },
-                "outer_l4": {
-                    "dstport": "1234",
-                    "srcport": "2001"
-                },
-                "traffic_type": "continuous"
-            }
-        }
-
-        ixnet = mock.MagicMock()
-        ixnet.remapIds.return_value = ["0"]
-        ixnet.setMultiAttribute.return_value = [1]
-        ixnet.commit.return_value = [1]
-        ixnet.getList.side_effect = [[1], [0], [0], ["srcIp", "dstIp"]]
-
-        ixnet_gen = IxNextgen(ixnet)
-
-        result = ixnet_gen.add_ip_header(static_traffic_params, IP_VERSION_4)
-        self.assertIsNone(result)
-        self.assertGreater(ixnet.setMultiAttribute.call_count, 0)
-        self.assertEqual(ixnet.commit.call_count, 1)
-
-    def test_add_ip_header_v4_nothing_to_do(self):
-        static_traffic_params = {
-            "uplink_0": {
-                "id": 1,
-                "bidir": "False",
-                "duration": 60,
-                "iload": "100",
-                "outer_l2": {
-                    "dstmac": "00:00:00:00:00:03",
-                    "framesPerSecond": True,
-                    "framesize": {"64B": "100"},
-                    "srcmac": "00:00:00:00:00:01"
-                },
-                "outer_l3": {
-                    "dscp": 0,
-                    "dstip4": "152.16.40.20",
-                    "proto": "udp",
-                    "srcip4": "152.16.100.20",
-                    "count": 1024,
-                    "ttl": 32
-                },
-                "outer_l3v4": {
-                    "dscp": 0,
-                    "dstip4": "152.16.40.20",
-                    "proto": "udp",
-                    "srcip4": "152.16.100.20",
-                    "ttl": 32
-                },
-                "outer_l3v6": {
-                    "count": 1024,
-                    "dscp": 0,
-                    "dstip4": "152.16.100.20",
-                    "proto": "udp",
-                    "srcip4": "152.16.40.20",
-                    "ttl": 32
-                },
-                "outer_l4": {
-                    "dstport": "2001",
-                    "srcport": "1234"
-                },
-                "traffic_type": "continuous"
-            },
-            "downlink_0": {
-                "id": 2,
-                "bidir": "False",
-                "duration": 60,
-                "iload": "100",
-                "outer_l2": {
-                    "dstmac": "00:00:00:00:00:04",
-                    "framesPerSecond": True,
-                    "framesize": {"64B": "100"},
-                    "srcmac": "00:00:00:00:00:01"
-                },
-                "outer_l3": {
-                    "count": 1024,
-                    "dscp": 0,
-                    "dstip4": "152.16.100.20",
-                    "proto": "udp",
-                    "srcip4": "152.16.40.20",
-                    "ttl": 32
-                },
-                "outer_l3v4": {
-                    "count": 1024,
-                    "dscp": 0,
-                    "dstip4": "152.16.100.20",
-                    "proto": "udp",
-                    "srcip4": "152.16.40.20",
-                    "ttl": 32
-                },
-                "outer_l3v6": {
-                    "count": 1024,
-                    "dscp": 0,
-                    "dstip4": "152.16.100.20",
-                    "proto": "udp",
-                    "srcip4": "152.16.40.20",
-                    "ttl": 32
-                },
-                "outer_l4": {
-                    "dstport": "1234",
-                    "srcport": "2001"
-                },
-                "traffic_type": "continuous"
-            }
-        }
-
-        ixnet = mock.MagicMock()
-        ixnet.remapIds.return_value = ["0"]
-        ixnet.setMultiAttribute.return_value = [1]
-        ixnet.commit.return_value = [1]
-        ixnet.getList.side_effect = [[1], [0, 1], [0], ["srcIp", "dstIp"]]
-
-        ixnet_gen = IxNextgen(ixnet)
-
-        result = ixnet_gen.add_ip_header(static_traffic_params, IP_VERSION_4)
-        self.assertIsNone(result)
-        self.assertGreater(ixnet.setMultiAttribute.call_count, 0)
-        self.assertEqual(ixnet.commit.call_count, 1)
-
-    def test_add_ip_header_v6(self):
-        static_traffic_profile = {
-            "uplink_0": {
-                "id": 1,
-                "bidir": "False",
-                "duration": 60,
-                "iload": "100",
-                "outer_l2": {
-                    "dstmac": "00:00:00:00:00:03",
-                    "framesPerSecond": True,
-                    "framesize": {"64B": "100"},
-                    "srcmac": "00:00:00:00:00:01"
-                },
-                "outer_l3": {
-                    "count": 1024,
-                    "dscp": 0,
-                    "dstip4": "152.16.40.20",
-                    "proto": "udp",
-                    "srcip4": "152.16.100.20",
-                    "ttl": 32
-                },
-                "outer_l3v6": {
-                    "count": 1024,
-                    "dscp": 0,
-                    "dstip4": "152.16.100.20",
-                    "proto": "udp",
-                    "srcip4": "152.16.40.20",
-                    "ttl": 32
-                },
-                "outer_l4": {
-                    "dstport": "2001",
-                    "srcport": "1234"
-                },
-                "traffic_type": "continuous"
-            },
-            "downlink_0": {
-                "id": 2,
-                "bidir": "False",
-                "duration": 60,
-                "iload": "100",
-                "outer_l2": {
-                    "dstmac": "00:00:00:00:00:04",
-                    "framesPerSecond": True,
-                    "framesize": {"64B": "100"},
-                    "srcmac": "00:00:00:00:00:01"
-                },
-                "outer_l3": {
-                    "count": 1024,
-                    "dscp": 0,
-                    "dstip4": "152.16.100.20",
-                    "proto": "udp",
-                    "srcip4": "152.16.40.20",
-                    "ttl": 32
-                },
-                "outer_l3v6": {
-                    "count": 1024,
-                    "dscp": 0,
-                    "dstip4": "152.16.100.20",
-                    "proto": "udp",
-                    "srcip4": "152.16.40.20",
-                    "ttl": 32
-                },
-                "outer_l4": {
-                    "dstport": "1234",
-                    "srcport": "2001"
-                },
-                "traffic_type": "continuous"
-            }
-        }
-
-        ixnet = mock.MagicMock()
-        ixnet.getList.side_effect = [[1], [1], [1], ["srcIp", "dstIp"]]
-        ixnet.remapIds.return_value = ["0"]
-        ixnet.setMultiAttribute.return_value = [1]
-        ixnet.commit.return_value = [1]
-
-        ixnet_gen = IxNextgen(ixnet)
-
-        result = ixnet_gen.add_ip_header(static_traffic_profile, IP_VERSION_6)
-        self.assertIsNone(result)
-        self.assertGreater(ixnet.setMultiAttribute.call_count, 0)
-        self.assertEqual(ixnet.commit.call_count, 1)
-
-    def test_add_ip_header_v6_nothing_to_do(self):
-        static_traffic_params = {
-            "uplink_0": {
-                "id": 1,
-                "bidir": "False",
-                "duration": 60,
-                "iload": "100",
-                "outer_l2": {
-                    "dstmac": "00:00:00:00:00:03",
-                    "framesPerSecond": True,
-                    "framesize": {"64B": "100"},
-                    "srcmac": "00:00:00:00:00:01"
-                },
-                "outer_l3": {
-                    "dscp": 0,
-                    "dstip4": "152.16.40.20",
-                    "proto": "udp",
-                    "srcip4": "152.16.100.20",
-                    "count": 1024,
-                    "ttl": 32
-                },
-                "outer_l3v6": {
-                    "dscp": 0,
-                    "dstip4": "152.16.40.20",
-                    "proto": "udp",
-                    "srcip4": "152.16.100.20",
-                    "ttl": 32
-                },
-                "outer_l4": {
-                    "dstport": "2001",
-                    "srcport": "1234"
-                },
-                "traffic_type": "continuous"
-            },
-            "downlink_0": {
-                "id": 2,
-                "bidir": "False",
-                "duration": 60,
-                "iload": "100",
-                "outer_l2": {
-                    "dstmac": "00:00:00:00:00:04",
-                    "framesPerSecond": True,
-                    "framesize": {"64B": "100"},
-                    "srcmac": "00:00:00:00:00:01"
-                },
-                "outer_l3": {
-                    "count": 1024,
-                    "dscp": 0,
-                    "dstip4": "152.16.100.20",
-                    "proto": "udp",
-                    "srcip4": "152.16.40.20",
-                    "ttl": 32
-                },
-                "outer_l3v6": {
-                    "count": 1024,
-                    "dscp": 0,
-                    "dstip4": "152.16.100.20",
-                    "proto": "udp",
-                    "srcip4": "152.16.40.20",
-                    "ttl": 32
-                },
-                "outer_l4": {
-                    "dstport": "1234",
-                    "srcport": "2001"
-                },
-                "traffic_type": "continuous"
-            }
-        }
-
-        ixnet = mock.MagicMock()
-        ixnet.getList.side_effect = [[1], [0, 1], [1], ["srcIP", "dstIP"]]
-        ixnet.remapIds.return_value = ["0"]
-        ixnet.setMultiAttribute.return_value = [1]
-        ixnet.commit.return_value = [1]
-
-        ixnet_gen = IxNextgen(ixnet)
-
-        result = ixnet_gen.add_ip_header(static_traffic_params, IP_VERSION_6)
-        self.assertIsNone(result)
-        self.assertEqual(ixnet.setMultiAttribute.call_count, 0)
-
-    def test_set_random_ip_multi_attributes_bad_ip_version(self):
-        bad_ip_version = object()
-        ixnet_gen = IxNextgen(mock.Mock())
-        with self.assertRaises(ValueError):
-            ixnet_gen.set_random_ip_multi_attributes(
-                mock.Mock(), bad_ip_version, mock.Mock(), mock.Mock())
-
-    def test_get_config(self):
-        tg_cfg = {
-            "vdu": [
-                {
-                    "external-interface": [
-                        {
-                            "virtual-interface": {
-                                "vpci": "0000:07:00.1",
-                            },
-                        },
-                        {
-                            "virtual-interface": {
-                                "vpci": "0001:08:01.2",
-                            },
-                        },
-                    ],
-                },
-            ],
-            "mgmt-interface": {
-                "ip": "test1",
-                "tg-config": {
-                    "dut_result_dir": "test2",
-                    "version": "test3",
-                    "ixchassis": "test4",
-                    "tcl_port": "test5",
-                },
-            }
-        }
-
-        expected = {
-            'machine': 'test1',
-            'port': 'test5',
-            'chassis': 'test4',
-            'cards': ['0000', '0001'],
-            'ports': ['07', '08'],
-            'output_dir': 'test2',
-            'version': 'test3',
-            'bidir': True,
-        }
-
-        result = IxNextgen.get_config(tg_cfg)
-        self.assertDictEqual(result, expected)
-
-    def test_ix_update_ether(self):
-        static_traffic_params = {
-            "uplink_0": {
-                "id": 1,
-                "bidir": "False",
-                "duration": 60,
-                "iload": "100",
-                "outer_l2": {
-                    "dstmac": "00:00:00:00:00:03",
-                    "framesPerSecond": True,
-                    "framesize": 64,
-                    "srcmac": "00:00:00:00:00:01"
-                },
-                "outer_l3": {
-                    "dscp": 0,
-                    "dstip4": "152.16.40.20",
-                    "proto": "udp",
-                    "srcip4": "152.16.100.20",
-                    "ttl": 32
-                },
-                "outer_l3v4": {
-                    "dscp": 0,
-                    "dstip4": "152.16.40.20",
-                    "proto": "udp",
-                    "srcip4": "152.16.100.20",
-                    "ttl": 32
-                },
-                "outer_l3v6": {
-                    "count": 1024,
-                    "dscp": 0,
-                    "dstip4": "152.16.100.20",
-                    "proto": "udp",
-                    "srcip4": "152.16.40.20",
-                    "ttl": 32
-                },
-                "outer_l4": {
-                    "dstport": "2001",
-                    "srcport": "1234"
-                },
-                "traffic_type": "continuous"
-            },
-            "downlink_0": {
-                "id": 2,
-                "bidir": "False",
-                "duration": 60,
-                "iload": "100",
-                "outer_l2": {
-                    "dstmac": "00:00:00:00:00:04",
-                    "framesPerSecond": True,
-                    "framesize": 64,
-                    "srcmac": "00:00:00:00:00:01"
-                },
-                "outer_l3": {
-                    "count": 1024,
-                    "dscp": 0,
-                    "dstip4": "152.16.100.20",
-                    "proto": "udp",
-                    "srcip4": "152.16.40.20",
-                    "ttl": 32
-                },
-                "outer_l3v4": {
-                    "count": 1024,
-                    "dscp": 0,
-                    "dstip4": "152.16.100.20",
-                    "proto": "udp",
-                    "srcip4": "152.16.40.20",
-                    "ttl": 32
-                },
-                "outer_l3v6": {
-                    "count": 1024,
-                    "dscp": 0,
-                    "dstip4": "152.16.100.20",
-                    "proto": "udp",
-                    "srcip4": "152.16.40.20",
-                    "ttl": 32
-                },
-                "outer_l4": {
-                    "dstport": "1234",
-                    "srcport": "2001"
-                },
-                "traffic_type": "continuous"
-            }
-        }
-
-        ixnet = mock.MagicMock()
-        ixnet.setMultiAttribute.return_value = [1]
-        ixnet.commit.return_value = [1]
-        ixnet.getList.side_effect = [
-            [1],
-            [1],
-            [1],
-            [
-                "ethernet.header.destinationAddress",
-                "ethernet.header.sourceAddress",
-            ],
-        ]
-
-        ixnet_gen = IxNextgen(ixnet)
-
-        result = ixnet_gen.ix_update_ether(static_traffic_params)
-        self.assertIsNone(result)
-        self.assertGreater(ixnet.setMultiAttribute.call_count, 0)
-
-    def test_ix_update_ether_nothing_to_do(self):
-        static_traffic_params = {
-            "uplink_0": {
-                "id": 1,
-                "bidir": "False",
-                "duration": 60,
-                "iload": "100",
-                "outer_l3": {
-                    "dscp": 0,
-                    "dstip4": "152.16.40.20",
-                    "proto": "udp",
-                    "srcip4": "152.16.100.20",
-                    "ttl": 32
-                },
-                "outer_l3v4": {
-                    "dscp": 0,
-                    "dstip4": "152.16.40.20",
-                    "proto": "udp",
-                    "srcip4": "152.16.100.20",
-                    "ttl": 32
-                },
-                "outer_l3v6": {
-                    "count": 1024,
-                    "dscp": 0,
-                    "dstip4": "152.16.100.20",
-                    "proto": "udp",
-                    "srcip4": "152.16.40.20",
-                    "ttl": 32
-                },
-                "outer_l4": {
-                    "dstport": "2001",
-                    "srcport": "1234"
-                },
-                "traffic_type": "continuous"
-            },
-            "downlink_0": {
-                "id": 2,
-                "bidir": "False",
-                "duration": 60,
-                "iload": "100",
-                "outer_l3": {
-                    "count": 1024,
-                    "dscp": 0,
-                    "dstip4": "152.16.100.20",
-                    "proto": "udp",
-                    "srcip4": "152.16.40.20",
-                    "ttl": 32
-                },
-                "outer_l3v4": {
-                    "count": 1024,
-                    "dscp": 0,
-                    "dstip4": "152.16.100.20",
-                    "proto": "udp",
-                    "srcip4": "152.16.40.20",
-                    "ttl": 32
-                },
-                "outer_l3v6": {
-                    "count": 1024,
-                    "dscp": 0,
-                    "dstip4": "152.16.100.20",
-                    "proto": "udp",
-                    "srcip4": "152.16.40.20",
-                    "ttl": 32
-                },
-                "outer_l4": {
-                    "dstport": "1234",
-                    "srcport": "2001"
-                },
-                "traffic_type": "continuous"
-            }
-        }
-
-        ixnet = mock.MagicMock()
-        ixnet.setMultiAttribute.return_value = [1]
-        ixnet.commit.return_value = [1]
-        ixnet.getList.side_effect = [
-            [1],
-            [1],
-            [1],
-            [
-                "ethernet.header.destinationAddress",
-                "ethernet.header.sourceAddress",
-            ],
-        ]
-
-        ixnet_gen = IxNextgen(ixnet)
-
-        result = ixnet_gen.ix_update_ether(static_traffic_params)
-        self.assertIsNone(result)
-        self.assertEqual(ixnet.setMultiAttribute.call_count, 0)
diff --git a/yardstick/tests/unit/network_services/libs/ixia_libs/test_ixnet_api.py b/yardstick/tests/unit/network_services/libs/ixia_libs/test_ixnet_api.py
new file mode 100644 (file)
index 0000000..34afa3d
--- /dev/null
@@ -0,0 +1,512 @@
+# Copyright (c) 2018 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import mock
+import IxNetwork
+import unittest
+
+from yardstick.common import exceptions
+from yardstick.network_services.libs.ixia_libs.ixnet import ixnet_api
+
+
+UPLINK = 'uplink'
+DOWNLINK = 'downlink'
+
+TRAFFIC_PARAMETERS = {
+    UPLINK: {
+        'id': 1,
+        'bidir': 'False',
+        'duration': 60,
+        'iload': '100',
+        'outer_l2': {
+            'framesize': {'64B': '25', '256B': '75'}
+        },
+        'outer_l3': {
+            'count': 512,
+            'dscp': 0,
+            'dstip4': '152.16.40.20',
+            'proto': 'udp',
+            'srcip4': '152.16.100.20',
+            'ttl': 32
+        },
+        'outer_l3v4': {
+            'dscp': 0,
+            'dstip4': '152.16.40.20',
+            'proto': 'udp',
+            'srcip4': '152.16.100.20',
+            'ttl': 32
+        },
+        'outer_l3v6': {
+            'count': 1024,
+            'dscp': 0,
+            'dstip4': '152.16.100.20',
+            'proto': 'udp',
+            'srcip4': '152.16.40.20',
+            'ttl': 32
+        },
+        'outer_l4': {
+            'dstport': '2001',
+            'srcport': '1234'
+        },
+        'traffic_type': 'continuous'
+    },
+    DOWNLINK: {
+        'id': 2,
+        'bidir': 'False',
+        'duration': 60,
+        'iload': '100',
+        'outer_l2': {
+            'framesize': {'128B': '35', '1024B': '65'}
+        },
+        'outer_l3': {
+            'count': 1024,
+            'dscp': 0,
+            'dstip4': '152.16.100.20',
+            'proto': 'udp',
+            'srcip4': '152.16.40.20',
+            'ttl': 32
+        },
+        'outer_l3v4': {
+            'count': 1024,
+            'dscp': 0,
+            'dstip4': '152.16.100.20',
+            'proto': 'udp',
+            'srcip4': '152.16.40.20',
+            'ttl': 32
+        },
+        'outer_l3v6': {
+            'count': 1024,
+            'dscp': 0,
+            'dstip4': '152.16.100.20',
+            'proto': 'udp',
+            'srcip4': '152.16.40.20',
+            'ttl': 32
+        },
+        'outer_l4': {
+            'dstport': '1234',
+            'srcport': '2001'
+        },
+        'traffic_type': 'continuous'
+    }
+}
+
+
+class TestIxNextgen(unittest.TestCase):
+
+    def setUp(self):
+        self.ixnet = mock.Mock()
+        self.ixnet.execute = mock.Mock()
+        self.ixnet.getRoot.return_value = 'my_root'
+
+    def test_get_config(self):
+        tg_cfg = {
+            'vdu': [
+                {
+                    'external-interface': [
+                        {'virtual-interface': {'vpci': '0000:07:00.1'}},
+                        {'virtual-interface': {'vpci': '0001:08:01.2'}}
+                    ]
+                },
+            ],
+            'mgmt-interface': {
+                'ip': 'test1',
+                'tg-config': {
+                    'dut_result_dir': 'test2',
+                    'version': 'test3',
+                    'ixchassis': 'test4',
+                    'tcl_port': 'test5',
+                },
+            }
+        }
+
+        expected = {
+            'machine': 'test1',
+            'port': 'test5',
+            'chassis': 'test4',
+            'cards': ['0000', '0001'],
+            'ports': ['07', '08'],
+            'output_dir': 'test2',
+            'version': 'test3',
+            'bidir': True,
+        }
+
+        result = ixnet_api.IxNextgen.get_config(tg_cfg)
+        self.assertEqual(result, expected)
+
+    def test__get_config_element_by_flow_group_name(self):
+        ixnet_gen = ixnet_api.IxNextgen()
+        ixnet_gen._ixnet = self.ixnet
+        ixnet_gen._ixnet.getList.side_effect = [['traffic_item'],
+                                                ['fg_01']]
+        ixnet_gen._ixnet.getAttribute.return_value = 'flow_group_01'
+        output = ixnet_gen._get_config_element_by_flow_group_name(
+            'flow_group_01')
+        self.assertEqual('traffic_item/configElement:flow_group_01', output)
+
+    def test__get_config_element_by_flow_group_name_no_match(self):
+        ixnet_gen = ixnet_api.IxNextgen()
+        ixnet_gen._ixnet = self.ixnet
+        ixnet_gen._ixnet.getList.side_effect = [['traffic_item'],
+                                                ['fg_01']]
+        ixnet_gen._ixnet.getAttribute.return_value = 'flow_group_02'
+        output = ixnet_gen._get_config_element_by_flow_group_name(
+            'flow_group_01')
+        self.assertIsNone(output)
+
+    def test__get_stack_item(self):
+        ixnet_gen = ixnet_api.IxNextgen()
+        ixnet_gen._ixnet = self.ixnet
+        ixnet_gen._ixnet.getList.return_value = ['tcp1', 'tcp2', 'udp']
+        with mock.patch.object(
+                ixnet_gen, '_get_config_element_by_flow_group_name') as \
+                mock_get_cfg_element:
+            mock_get_cfg_element.return_value = 'cfg_element'
+            output = ixnet_gen._get_stack_item(mock.ANY, ixnet_api.PROTO_TCP)
+        self.assertEqual(['tcp1', 'tcp2'], output)
+
+    def test__get_stack_item_no_config_element(self):
+        ixnet_gen = ixnet_api.IxNextgen()
+        ixnet_gen._ixnet = self.ixnet
+        with mock.patch.object(
+                ixnet_gen, '_get_config_element_by_flow_group_name',
+                return_value=None):
+            with self.assertRaises(exceptions.IxNetworkFlowNotPresent):
+                ixnet_gen._get_stack_item(mock.ANY, mock.ANY)
+
+    def test__get_field_in_stack_item(self):
+        ixnet_gen = ixnet_api.IxNextgen()
+        ixnet_gen._ixnet = self.ixnet
+        ixnet_gen._ixnet.getList.return_value = ['field1', 'field2']
+        output = ixnet_gen._get_field_in_stack_item(mock.ANY, 'field2')
+        self.assertEqual('field2', output)
+
+    def test__get_field_in_stack_item_no_field_present(self):
+        ixnet_gen = ixnet_api.IxNextgen()
+        ixnet_gen._ixnet = self.ixnet
+        ixnet_gen._ixnet.getList.return_value = ['field1', 'field2']
+        with self.assertRaises(exceptions.IxNetworkFieldNotPresentInStackItem):
+            ixnet_gen._get_field_in_stack_item(mock.ANY, 'field3')
+
+    def test__parse_framesize(self):
+        ixnet_gen = ixnet_api.IxNextgen()
+        ixnet_gen._ixnet = self.ixnet
+        framesize = {'64B': '75', '512b': '25'}
+        output = ixnet_gen._parse_framesize(framesize)
+        for idx in range(len(framesize)):
+            if output[idx * 2] == 64:
+                self.assertEqual(75, output[idx * 2 + 1])
+            elif output[idx * 2] == 512:
+                self.assertEqual(25, output[idx * 2 + 1])
+            else:
+                raise self.failureException('Framesize (64, 512) not present')
+
+    @mock.patch.object(IxNetwork, 'IxNet')
+    def test_connect(self, mock_ixnet):
+        mock_ixnet.return_value = self.ixnet
+        ixnet_gen = ixnet_api.IxNextgen()
+        with mock.patch.object(ixnet_gen, 'get_config') as mock_config:
+            mock_config.return_value = {'machine': 'machine_fake',
+                                        'port': 'port_fake',
+                                        'version': 12345}
+            ixnet_gen.connect(mock.ANY)
+
+        self.ixnet.connect.assert_called_once_with(
+            'machine_fake', '-port', 'port_fake', '-version', '12345')
+        mock_config.assert_called_once()
+
+    def test_connect_invalid_config_no_machine(self):
+        ixnet_gen = ixnet_api.IxNextgen()
+        ixnet_gen._ixnet = self.ixnet
+        ixnet_gen.get_config = mock.Mock(return_value={
+            'port': 'port_fake',
+            'version': '12345'})
+        self.assertRaises(KeyError, ixnet_gen.connect, mock.ANY)
+        self.ixnet.connect.assert_not_called()
+
+    def test_connect_invalid_config_no_port(self):
+        ixnet_gen = ixnet_api.IxNextgen()
+        ixnet_gen._ixnet = self.ixnet
+        ixnet_gen.get_config = mock.Mock(return_value={
+            'machine': 'machine_fake',
+            'version': '12345'})
+        self.assertRaises(KeyError, ixnet_gen.connect, mock.ANY)
+        self.ixnet.connect.assert_not_called()
+
+    def test_connect_invalid_config_no_version(self):
+        ixnet_gen = ixnet_api.IxNextgen()
+        ixnet_gen._ixnet = self.ixnet
+        ixnet_gen.get_config = mock.Mock(return_value={
+            'machine': 'machine_fake',
+            'port': 'port_fake'})
+        self.assertRaises(KeyError, ixnet_gen.connect, mock.ANY)
+        self.ixnet.connect.assert_not_called()
+
+    def test_connect_no_config(self):
+        ixnet_gen = ixnet_api.IxNextgen()
+        ixnet_gen._ixnet = self.ixnet
+        ixnet_gen.get_config = mock.Mock(return_value={})
+        self.assertRaises(KeyError, ixnet_gen.connect, mock.ANY)
+        self.ixnet.connect.assert_not_called()
+
+    def test_clear_config(self):
+        ixnet_gen = ixnet_api.IxNextgen()
+        ixnet_gen._ixnet = self.ixnet
+        ixnet_gen.clear_config()
+        self.ixnet.execute.assert_called_once_with('newConfig')
+
+    @mock.patch.object(ixnet_api, 'log')
+    def test_assign_ports_2_ports(self, *args):
+        self.ixnet.getAttribute.side_effect = ['up', 'down']
+        config = {
+            'chassis': '1.1.1.1',
+            'cards': ['1', '2'],
+            'ports': ['2', '2']}
+        ixnet_gen = ixnet_api.IxNextgen()
+        ixnet_gen._ixnet = self.ixnet
+        ixnet_gen._cfg = config
+
+        self.assertIsNone(ixnet_gen.assign_ports())
+        self.assertEqual(self.ixnet.execute.call_count, 2)
+        self.assertEqual(self.ixnet.commit.call_count, 4)
+        self.assertEqual(self.ixnet.getAttribute.call_count, 2)
+
+    @mock.patch.object(ixnet_api, 'log')
+    def test_assign_ports_port_down(self, mock_log):
+        self.ixnet.getAttribute.return_value = 'down'
+        config = {
+            'chassis': '1.1.1.1',
+            'cards': ['1', '2'],
+            'ports': ['3', '4']}
+        ixnet_gen = ixnet_api.IxNextgen()
+        ixnet_gen._ixnet = self.ixnet
+        ixnet_gen._cfg = config
+        ixnet_gen.assign_ports()
+        mock_log.warning.assert_called()
+
+    def test_assign_ports_no_config(self):
+        ixnet_gen = ixnet_api.IxNextgen()
+        ixnet_gen._ixnet = self.ixnet
+        ixnet_gen._cfg = {}
+        self.assertRaises(KeyError, ixnet_gen.assign_ports)
+
+    def test__create_traffic_item(self):
+        ixnet_gen = ixnet_api.IxNextgen()
+        ixnet_gen._ixnet = self.ixnet
+        self.ixnet.add.return_value = 'my_new_traffic_item'
+        self.ixnet.remapIds.return_value = ['my_traffic_item_id']
+
+        ixnet_gen._create_traffic_item()
+        self.ixnet.add.assert_called_once_with(
+            'my_root/traffic', 'trafficItem')
+        self.ixnet.setMultiAttribute.assert_called_once_with(
+            'my_new_traffic_item', '-name', 'RFC2544', '-trafficType', 'raw')
+        self.assertEqual(2, self.ixnet.commit.call_count)
+        self.ixnet.remapIds.assert_called_once_with('my_new_traffic_item')
+        self.ixnet.setAttribute('my_traffic_item_id/tracking',
+                                '-trackBy', 'trafficGroupId0')
+
+    def test__create_flow_groups(self):
+        ixnet_gen = ixnet_api.IxNextgen()
+        ixnet_gen._ixnet = self.ixnet
+        ixnet_gen.ixnet.getList.side_effect = [['traffic_item'], ['1', '2']]
+        ixnet_gen.ixnet.add.side_effect = ['endp1', 'endp2']
+        ixnet_gen._create_flow_groups()
+        ixnet_gen.ixnet.add.assert_has_calls([
+            mock.call('traffic_item', 'endpointSet'),
+            mock.call('traffic_item', 'endpointSet')])
+        ixnet_gen.ixnet.setMultiAttribute.assert_has_calls([
+            mock.call('endp1', '-name', '1', '-sources', ['1/protocols'],
+                      '-destinations', ['2/protocols']),
+            mock.call('endp2', '-name', '2', '-sources', ['2/protocols'],
+                      '-destinations', ['1/protocols'])])
+
+    def test__append_protocol_to_stack(self):
+        ixnet_gen = ixnet_api.IxNextgen()
+        ixnet_gen._ixnet = self.ixnet
+
+        ixnet_gen._append_procotol_to_stack('my_protocol', 'prev_element')
+        self.ixnet.execute.assert_called_with(
+            'append', 'prev_element',
+            'my_root/traffic/protocolTemplate:"my_protocol"')
+
+    def test__setup_config_elements(self):
+        ixnet_gen = ixnet_api.IxNextgen()
+        ixnet_gen._ixnet = self.ixnet
+        ixnet_gen.ixnet.getList.side_effect = [['traffic_item'],
+                                               ['cfg_element']]
+        with mock.patch.object(ixnet_gen, '_append_procotol_to_stack') as \
+                mock_append_proto:
+            ixnet_gen._setup_config_elements()
+        mock_append_proto.assert_has_calls([
+            mock.call(ixnet_api.PROTO_UDP, 'cfg_element/stack:"ethernet-1"'),
+            mock.call(ixnet_api.PROTO_IPV4, 'cfg_element/stack:"ethernet-1"')])
+        ixnet_gen.ixnet.setAttribute.assert_has_calls([
+            mock.call('cfg_element/frameRateDistribution', '-portDistribution',
+                      'splitRateEvenly'),
+            mock.call('cfg_element/frameRateDistribution',
+                      '-streamDistribution', 'splitRateEvenly')])
+
+    @mock.patch.object(ixnet_api.IxNextgen, '_create_traffic_item')
+    @mock.patch.object(ixnet_api.IxNextgen, '_create_flow_groups')
+    @mock.patch.object(ixnet_api.IxNextgen, '_setup_config_elements')
+    def test_create_traffic_model(self, mock__setup_config_elements,
+                                  mock__create_flow_groups,
+                                  mock__create_traffic_item):
+        ixnet_gen = ixnet_api.IxNextgen()
+        ixnet_gen._ixnet = self.ixnet
+
+        ixnet_gen.create_traffic_model()
+        mock__create_traffic_item.assert_called_once()
+        mock__create_flow_groups.assert_called_once()
+        mock__setup_config_elements.assert_called_once()
+
+    def test__update_frame_mac(self):
+        ixnet_gen = ixnet_api.IxNextgen()
+        ixnet_gen._ixnet = self.ixnet
+        with mock.patch.object(ixnet_gen, '_get_field_in_stack_item') as \
+                mock_get_field:
+            mock_get_field.return_value = 'field_descriptor'
+            ixnet_gen._update_frame_mac('ethernet_descriptor', 'field', 'mac')
+        mock_get_field.assert_called_once_with('ethernet_descriptor', 'field')
+        ixnet_gen.ixnet.setMultiAttribute(
+            'field_descriptor', '-singleValue', 'mac', '-fieldValue', 'mac',
+            '-valueType', 'singleValue')
+        ixnet_gen.ixnet.commit.assert_called_once()
+
+    def test_update_frame(self):
+        ixnet_gen = ixnet_api.IxNextgen()
+        ixnet_gen._ixnet = self.ixnet
+        with mock.patch.object(
+                ixnet_gen, '_get_config_element_by_flow_group_name',
+                return_value='cfg_element'), \
+                mock.patch.object(ixnet_gen, '_update_frame_mac') as \
+                mock_update_frame, \
+                mock.patch.object(ixnet_gen, '_get_stack_item') as \
+                mock_get_stack_item:
+            mock_get_stack_item.side_effect = [['item1'], ['item2'],
+                                               ['item3'], ['item4']]
+            ixnet_gen.update_frame(TRAFFIC_PARAMETERS)
+
+        self.assertEqual(6, len(ixnet_gen.ixnet.setMultiAttribute.mock_calls))
+        self.assertEqual(4, len(mock_update_frame.mock_calls))
+
+    def test_update_frame_flow_not_present(self):
+        ixnet_gen = ixnet_api.IxNextgen()
+        ixnet_gen._ixnet = self.ixnet
+        with mock.patch.object(
+                ixnet_gen, '_get_config_element_by_flow_group_name',
+                return_value=None):
+            with self.assertRaises(exceptions.IxNetworkFlowNotPresent):
+                ixnet_gen.update_frame(TRAFFIC_PARAMETERS)
+
+    def test_get_statistics(self):
+        ixnet_gen = ixnet_api.IxNextgen()
+        port_statistics = '::ixNet::OBJ-/statistics/view:"Port Statistics"'
+        flow_statistics = '::ixNet::OBJ-/statistics/view:"Flow Statistics"'
+        with mock.patch.object(ixnet_gen, '_build_stats_map') as \
+                mock_build_stats:
+            ixnet_gen.get_statistics()
+
+        mock_build_stats.assert_has_calls([
+            mock.call(port_statistics, ixnet_gen.PORT_STATS_NAME_MAP),
+            mock.call(flow_statistics, ixnet_gen.LATENCY_NAME_MAP)])
+
+    def test__update_ipv4_address(self):
+        ixnet_gen = ixnet_api.IxNextgen()
+        ixnet_gen._ixnet = self.ixnet
+        with mock.patch.object(ixnet_gen, '_get_field_in_stack_item',
+                               return_value='field_desc'):
+            ixnet_gen._update_ipv4_address(mock.ANY, mock.ANY, '192.168.1.1',
+                                           100, '255.255.255.0', 25)
+        ixnet_gen.ixnet.setMultiAttribute.assert_called_once_with(
+            'field_desc', '-seed', 100, '-fixedBits', '192.168.1.1',
+            '-randomMask', '255.255.255.0', '-valueType', 'random',
+            '-countValue', 25)
+
+    def test_update_ip_packet(self):
+        ixnet_gen = ixnet_api.IxNextgen()
+        ixnet_gen._ixnet = self.ixnet
+        with mock.patch.object(ixnet_gen, '_update_ipv4_address') as \
+                mock_update_add, \
+                mock.patch.object(ixnet_gen, '_get_stack_item'), \
+                mock.patch.object(ixnet_gen,
+                '_get_config_element_by_flow_group_name', return_value='celm'):
+            ixnet_gen.update_ip_packet(TRAFFIC_PARAMETERS)
+
+        self.assertEqual(4, len(mock_update_add.mock_calls))
+
+    def test_update_ip_packet_exception_no_config_element(self):
+        ixnet_gen = ixnet_api.IxNextgen()
+        ixnet_gen._ixnet = self.ixnet
+        with mock.patch.object(ixnet_gen,
+                               '_get_config_element_by_flow_group_name',
+                               return_value=None):
+            with self.assertRaises(exceptions.IxNetworkFlowNotPresent):
+                ixnet_gen.update_ip_packet(TRAFFIC_PARAMETERS)
+
+    @mock.patch.object(ixnet_api.IxNextgen, '_get_traffic_state')
+    def test_start_traffic(self, mock_ixnextgen_get_traffic_state):
+        ixnet_gen = ixnet_api.IxNextgen()
+        ixnet_gen._ixnet = self.ixnet
+        ixnet_gen._ixnet.getList.return_value = [0]
+
+        mock_ixnextgen_get_traffic_state.side_effect = [
+            'stopped', 'started', 'started', 'started']
+
+        result = ixnet_gen.start_traffic()
+        self.assertIsNone(result)
+        self.ixnet.getList.assert_called_once()
+        self.assertEqual(3, ixnet_gen._ixnet.execute.call_count)
+
+    @mock.patch.object(ixnet_api.IxNextgen, '_get_traffic_state')
+    def test_start_traffic_traffic_running(
+            self, mock_ixnextgen_get_traffic_state):
+        ixnet_gen = ixnet_api.IxNextgen()
+        ixnet_gen._ixnet = self.ixnet
+        ixnet_gen._ixnet.getList.return_value = [0]
+        mock_ixnextgen_get_traffic_state.side_effect = [
+            'started', 'stopped', 'started']
+
+        result = ixnet_gen.start_traffic()
+        self.assertIsNone(result)
+        self.ixnet.getList.assert_called_once()
+        self.assertEqual(4, ixnet_gen._ixnet.execute.call_count)
+
+    @mock.patch.object(ixnet_api.IxNextgen, '_get_traffic_state')
+    def test_start_traffic_wait_for_traffic_to_stop(
+            self, mock_ixnextgen_get_traffic_state):
+        ixnet_gen = ixnet_api.IxNextgen()
+        ixnet_gen._ixnet = self.ixnet
+        ixnet_gen._ixnet.getList.return_value = [0]
+        mock_ixnextgen_get_traffic_state.side_effect = [
+            'started', 'started', 'started', 'stopped', 'started']
+
+        result = ixnet_gen.start_traffic()
+        self.assertIsNone(result)
+        self.ixnet.getList.assert_called_once()
+        self.assertEqual(4, ixnet_gen._ixnet.execute.call_count)
+
+    @mock.patch.object(ixnet_api.IxNextgen, '_get_traffic_state')
+    def test_start_traffic_wait_for_traffic_start(
+            self, mock_ixnextgen_get_traffic_state):
+        ixnet_gen = ixnet_api.IxNextgen()
+        ixnet_gen._ixnet = self.ixnet
+        ixnet_gen._ixnet.getList.return_value = [0]
+        mock_ixnextgen_get_traffic_state.side_effect = [
+            'stopped', 'stopped', 'stopped', 'started']
+
+        result = ixnet_gen.start_traffic()
+        self.assertIsNone(result)
+        self.ixnet.getList.assert_called_once()
+        self.assertEqual(3, ixnet_gen._ixnet.execute.call_count)
index 9f337c6..de96794 100644 (file)
@@ -17,10 +17,10 @@ import errno
 import mock
 import unittest
 
+from yardstick.common import exceptions
 from yardstick.network_services.nfvi.resource import ResourceProfile
 from yardstick.network_services.nfvi import resource, collectd
-from yardstick.common.exceptions import ResourceCommandError
-from yardstick import ssh
+
 
 class TestResourceProfile(unittest.TestCase):
     VNFD = {'vnfd:vnfd-catalog':
@@ -134,8 +134,8 @@ class TestResourceProfile(unittest.TestCase):
         self.assertIsNone(self.resource_profile._start_collectd(ssh_mock,
                                                                 "/opt/nsb_bin"))
 
-        ssh_mock.execute = mock.Mock(side_effect=ssh.SSHError)
-        with self.assertRaises(ssh.SSHError):
+        ssh_mock.execute = mock.Mock(side_effect=exceptions.SSHError)
+        with self.assertRaises(exceptions.SSHError):
             self.resource_profile._start_collectd(ssh_mock, "/opt/nsb_bin")
 
         ssh_mock.execute = mock.Mock(return_value=(1, "", ""))
@@ -148,11 +148,11 @@ class TestResourceProfile(unittest.TestCase):
         self.assertIsNone(self.resource_profile._start_rabbitmq(ssh_mock))
 
         ssh_mock.execute = mock.Mock(return_value=(0, "", ""))
-        with self.assertRaises(ResourceCommandError):
+        with self.assertRaises(exceptions.ResourceCommandError):
             self.resource_profile._start_rabbitmq(ssh_mock)
 
         ssh_mock.execute = mock.Mock(return_value=(1, "", ""))
-        with self.assertRaises(ResourceCommandError):
+        with self.assertRaises(exceptions.ResourceCommandError):
             self.resource_profile._start_rabbitmq(ssh_mock)
 
     def test__prepare_collectd_conf(self):
index 3b88049..641064c 100644 (file)
@@ -44,7 +44,7 @@ class TestTrafficProfile(unittest.TestCase):
         traffic_profile = base.TrafficProfile(self.TRAFFIC_PROFILE)
         self.assertEqual(self.TRAFFIC_PROFILE, traffic_profile.params)
 
-    def test_execute(self):
+    def test_execute_traffic(self):
         traffic_profile = base.TrafficProfile(self.TRAFFIC_PROFILE)
         self.assertRaises(NotImplementedError,
                           traffic_profile.execute_traffic, {})
index a0abe2b..6b3532f 100644 (file)
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
-#
-
-import unittest
-import mock
 
 from copy import deepcopy
 
-from yardstick.tests import STL_MOCKS
-
-STLClient = mock.MagicMock()
-stl_patch = mock.patch.dict("sys.modules", STL_MOCKS)
-stl_patch.start()
+import mock
+import unittest
 
-if stl_patch:
-    from yardstick.network_services.traffic_profile.trex_traffic_profile \
-        import TrexProfile
-    from yardstick.network_services.traffic_profile.ixia_rfc2544 import \
-        IXIARFC2544Profile
-    from yardstick.network_services.traffic_profile import ixia_rfc2544
+from yardstick.network_services.traffic_profile import ixia_rfc2544
+from yardstick.network_services.traffic_profile import trex_traffic_profile
 
 
 class TestIXIARFC2544Profile(unittest.TestCase):
@@ -52,7 +41,7 @@ class TestIXIARFC2544Profile(unittest.TestCase):
         'traffic_profile': {
             'traffic_type': 'IXIARFC2544Profile',
             'frame_rate': 100},
-        IXIARFC2544Profile.DOWNLINK: {
+        ixia_rfc2544.IXIARFC2544Profile.DOWNLINK: {
             'ipv4': {
                 'outer_l2': {
                     'framesize': {
@@ -73,7 +62,7 @@ class TestIXIARFC2544Profile(unittest.TestCase):
                 'outer_l4': {
                     'srcport': '2001',
                     'dsrport': '1234'}}},
-        IXIARFC2544Profile.UPLINK: {
+        ixia_rfc2544.IXIARFC2544Profile.UPLINK: {
             'ipv4': {
                 'outer_l2': {
                     'framesize': {
@@ -97,14 +86,15 @@ class TestIXIARFC2544Profile(unittest.TestCase):
         'schema': 'isb:traffic_profile:0.1'}
 
     def test_get_ixia_traffic_profile_error(self):
-        traffic_generator = mock.Mock(autospec=TrexProfile)
+        traffic_generator = mock.Mock(
+            autospec=trex_traffic_profile.TrexProfile)
         traffic_generator.my_ports = [0, 1]
         traffic_generator.uplink_ports = [-1]
         traffic_generator.downlink_ports = [1]
         traffic_generator.client = \
             mock.Mock(return_value=True)
         STATIC_TRAFFIC = {
-            IXIARFC2544Profile.UPLINK: {
+            ixia_rfc2544.IXIARFC2544Profile.UPLINK: {
                 "id": 1,
                 "bidir": "False",
                 "duration": 60,
@@ -143,7 +133,7 @@ class TestIXIARFC2544Profile(unittest.TestCase):
                 },
                 "traffic_type": "continuous"
             },
-            IXIARFC2544Profile.DOWNLINK: {
+            ixia_rfc2544.IXIARFC2544Profile.DOWNLINK: {
                 "id": 2,
                 "bidir": "False",
                 "duration": 60,
@@ -187,7 +177,8 @@ class TestIXIARFC2544Profile(unittest.TestCase):
         }
         ixia_rfc2544.STATIC_TRAFFIC = STATIC_TRAFFIC
 
-        r_f_c2544_profile = IXIARFC2544Profile(self.TRAFFIC_PROFILE)
+        r_f_c2544_profile = ixia_rfc2544.IXIARFC2544Profile(
+            self.TRAFFIC_PROFILE)
         r_f_c2544_profile.rate = 100
         mac = {"src_mac_0": "00:00:00:00:00:01",
                "src_mac_1": "00:00:00:00:00:02",
@@ -199,14 +190,15 @@ class TestIXIARFC2544Profile(unittest.TestCase):
         self.assertIsNotNone(result)
 
     def test_get_ixia_traffic_profile(self):
-        traffic_generator = mock.Mock(autospec=TrexProfile)
+        traffic_generator = mock.Mock(
+            autospec=trex_traffic_profile.TrexProfile)
         traffic_generator.my_ports = [0, 1]
         traffic_generator.uplink_ports = [-1]
         traffic_generator.downlink_ports = [1]
         traffic_generator.client = \
             mock.Mock(return_value=True)
         STATIC_TRAFFIC = {
-            IXIARFC2544Profile.UPLINK: {
+            ixia_rfc2544.IXIARFC2544Profile.UPLINK: {
                 "id": 1,
                 "bidir": "False",
                 "duration": 60,
@@ -246,7 +238,7 @@ class TestIXIARFC2544Profile(unittest.TestCase):
                 },
                 "traffic_type": "continuous"
             },
-            IXIARFC2544Profile.DOWNLINK: {
+            ixia_rfc2544.IXIARFC2544Profile.DOWNLINK: {
                 "id": 2,
                 "bidir": "False",
                 "duration": 60,
@@ -289,7 +281,8 @@ class TestIXIARFC2544Profile(unittest.TestCase):
         }
         ixia_rfc2544.STATIC_TRAFFIC = STATIC_TRAFFIC
 
-        r_f_c2544_profile = IXIARFC2544Profile(self.TRAFFIC_PROFILE)
+        r_f_c2544_profile = ixia_rfc2544.IXIARFC2544Profile(
+            self.TRAFFIC_PROFILE)
         r_f_c2544_profile.rate = 100
         mac = {"src_mac_0": "00:00:00:00:00:01",
                "src_mac_1": "00:00:00:00:00:02",
@@ -302,14 +295,15 @@ class TestIXIARFC2544Profile(unittest.TestCase):
 
     @mock.patch("yardstick.network_services.traffic_profile.ixia_rfc2544.open")
     def test_get_ixia_traffic_profile_v6(self, *args):
-        traffic_generator = mock.Mock(autospec=TrexProfile)
+        traffic_generator = mock.Mock(
+            autospec=trex_traffic_profile.TrexProfile)
         traffic_generator.my_ports = [0, 1]
         traffic_generator.uplink_ports = [-1]
         traffic_generator.downlink_ports = [1]
         traffic_generator.client = \
             mock.Mock(return_value=True)
         STATIC_TRAFFIC = {
-            IXIARFC2544Profile.UPLINK: {
+            ixia_rfc2544.IXIARFC2544Profile.UPLINK: {
                 "id": 1,
                 "bidir": "False",
                 "duration": 60,
@@ -348,7 +342,7 @@ class TestIXIARFC2544Profile(unittest.TestCase):
                 },
                 "traffic_type": "continuous"
             },
-            IXIARFC2544Profile.DOWNLINK: {
+            ixia_rfc2544.IXIARFC2544Profile.DOWNLINK: {
                 "id": 2,
                 "bidir": "False",
                 "duration": 60,
@@ -392,7 +386,8 @@ class TestIXIARFC2544Profile(unittest.TestCase):
         }
         ixia_rfc2544.STATIC_TRAFFIC = STATIC_TRAFFIC
 
-        r_f_c2544_profile = IXIARFC2544Profile(self.TRAFFIC_PROFILE)
+        r_f_c2544_profile = ixia_rfc2544.IXIARFC2544Profile(
+            self.TRAFFIC_PROFILE)
         r_f_c2544_profile.rate = 100
         mac = {"src_mac_0": "00:00:00:00:00:01",
                "src_mac_1": "00:00:00:00:00:02",
@@ -405,7 +400,7 @@ class TestIXIARFC2544Profile(unittest.TestCase):
                         'traffic_profile':
                         {'traffic_type': 'IXIARFC2544Profile',
                          'frame_rate': 100},
-                        IXIARFC2544Profile.DOWNLINK:
+                        ixia_rfc2544.IXIARFC2544Profile.DOWNLINK:
                         {'ipv4':
                          {'outer_l2': {'framesize':
                                        {'64B': '100', '1518B': '0',
@@ -422,7 +417,7 @@ class TestIXIARFC2544Profile(unittest.TestCase):
                                          'dscp': 0, 'ttl': 32},
                           'outer_l4': {'srcport': '2001',
                                        'dsrport': '1234'}}},
-                        IXIARFC2544Profile.UPLINK: {'ipv4':
+                        ixia_rfc2544.IXIARFC2544Profile.UPLINK: {'ipv4':
                                                     {'outer_l2': {'framesize':
                                                                   {'64B': '100', '1518B': '0',
                                                                    '128B': '0', '1400B': '0',
@@ -446,51 +441,75 @@ class TestIXIARFC2544Profile(unittest.TestCase):
         self.assertIsNotNone(result)
 
     def test__get_ixia_traffic_profile_default_args(self):
-        r_f_c2544_profile = IXIARFC2544Profile(self.TRAFFIC_PROFILE)
+        r_f_c2544_profile = ixia_rfc2544.IXIARFC2544Profile(
+            self.TRAFFIC_PROFILE)
 
         expected = {}
         result = r_f_c2544_profile._get_ixia_traffic_profile({})
         self.assertDictEqual(result, expected)
 
     def test__ixia_traffic_generate(self):
-        traffic_generator = mock.Mock(autospec=TrexProfile)
+        traffic_generator = mock.Mock(
+            autospec=trex_traffic_profile.TrexProfile)
         traffic_generator.networks = {
             "uplink_0": ["xe0"],
             "downlink_0": ["xe1"],
         }
         traffic_generator.client = \
             mock.Mock(return_value=True)
-        traffic = {IXIARFC2544Profile.DOWNLINK: {'iload': 10},
-                   IXIARFC2544Profile.UPLINK: {'iload': 10}}
+        traffic = {ixia_rfc2544.IXIARFC2544Profile.DOWNLINK: {'iload': 10},
+                   ixia_rfc2544.IXIARFC2544Profile.UPLINK: {'iload': 10}}
         ixia_obj = mock.MagicMock()
-        r_f_c2544_profile = IXIARFC2544Profile(self.TRAFFIC_PROFILE)
+        r_f_c2544_profile = ixia_rfc2544.IXIARFC2544Profile(
+            self.TRAFFIC_PROFILE)
         r_f_c2544_profile.rate = 100
         result = r_f_c2544_profile._ixia_traffic_generate(traffic, ixia_obj)
         self.assertIsNone(result)
 
-    def test_execute(self):
-        traffic_generator = mock.Mock(autospec=TrexProfile)
-        traffic_generator.networks = {
-            "uplink_0": ["xe0"],
-            "downlink_0": ["xe1"],
-        }
-        traffic_generator.client = \
-            mock.Mock(return_value=True)
-        r_f_c2544_profile = IXIARFC2544Profile(self.TRAFFIC_PROFILE)
-        r_f_c2544_profile.first_run = True
-        r_f_c2544_profile.params = {IXIARFC2544Profile.DOWNLINK: {'iload': 10},
-                                    IXIARFC2544Profile.UPLINK: {'iload': 10}}
+    def test_execute_traffic_first_run(self):
+        rfc2544_profile = ixia_rfc2544.IXIARFC2544Profile(self.TRAFFIC_PROFILE)
+        rfc2544_profile.first_run = True
+        rfc2544_profile.rate = 50
+        with mock.patch.object(rfc2544_profile, '_get_ixia_traffic_profile') \
+                as mock_get_tp, \
+                mock.patch.object(rfc2544_profile, '_ixia_traffic_generate') \
+                as mock_tgenerate, \
+                mock.patch.object(rfc2544_profile, 'update_traffic_profile') \
+                as mock_update_tp:
+            mock_get_tp.return_value = 'fake_tprofile'
+            output = rfc2544_profile.execute_traffic(mock.ANY,
+                                                     ixia_obj=mock.ANY)
 
-        r_f_c2544_profile.get_streams = mock.Mock()
-        r_f_c2544_profile.full_profile = {}
-        r_f_c2544_profile._get_ixia_traffic_profile = mock.Mock()
-        r_f_c2544_profile.get_multiplier = mock.Mock()
-        r_f_c2544_profile._ixia_traffic_generate = mock.Mock()
-        ixia_obj = mock.MagicMock()
-        self.assertIsNone(r_f_c2544_profile.execute_traffic(traffic_generator, ixia_obj))
+        self.assertTrue(output)
+        self.assertFalse(rfc2544_profile.first_run)
+        self.assertEqual(50, rfc2544_profile.max_rate)
+        self.assertEqual(0, rfc2544_profile.min_rate)
+        mock_get_tp.assert_called_once()
+        mock_tgenerate.assert_called_once()
+        mock_update_tp.assert_called_once()
+
+    def test_execute_traffic_not_first_run(self):
+        rfc2544_profile = ixia_rfc2544.IXIARFC2544Profile(self.TRAFFIC_PROFILE)
+        rfc2544_profile.first_run = False
+        rfc2544_profile.max_rate = 70
+        rfc2544_profile.min_rate = 0
+        with mock.patch.object(rfc2544_profile, '_get_ixia_traffic_profile') \
+                as mock_get_tp, \
+                mock.patch.object(rfc2544_profile, '_ixia_traffic_generate') \
+                as mock_tgenerate:
+            mock_get_tp.return_value = 'fake_tprofile'
+            rfc2544_profile.full_profile = mock.ANY
+            output = rfc2544_profile.execute_traffic(mock.ANY,
+                                                     ixia_obj=mock.ANY)
+
+        self.assertFalse(output)
+        self.assertEqual(35.0, rfc2544_profile.rate)
+        mock_get_tp.assert_called_once()
+        mock_tgenerate.assert_called_once()
 
     def test_update_traffic_profile(self):
-        traffic_generator = mock.Mock(autospec=TrexProfile)
+        traffic_generator = mock.Mock(
+            autospec=trex_traffic_profile.TrexProfile)
         traffic_generator.networks = {
             "uplink_0": ["xe0"],  # private, one value for intfs
             "downlink_0": ["xe1", "xe2"],  # public, two values for intfs
@@ -508,7 +527,7 @@ class TestIXIARFC2544Profile(unittest.TestCase):
             "downlink_0": ["xe1", "xe2"],
         })
 
-        r_f_c2544_profile = IXIARFC2544Profile(traffic_profile)
+        r_f_c2544_profile = ixia_rfc2544.IXIARFC2544Profile(traffic_profile)
         r_f_c2544_profile.full_profile = {}
         r_f_c2544_profile.get_streams = mock.Mock()
 
@@ -516,112 +535,89 @@ class TestIXIARFC2544Profile(unittest.TestCase):
             r_f_c2544_profile.update_traffic_profile(traffic_generator))
         self.assertEqual(r_f_c2544_profile.ports, ports_expected)
 
-    def test_get_drop_percentage(self):
-        r_f_c2544_profile = IXIARFC2544Profile(self.TRAFFIC_PROFILE)
-        r_f_c2544_profile.params = self.PROFILE
-        ixia_obj = mock.MagicMock()
-        r_f_c2544_profile.execute = mock.Mock()
-        r_f_c2544_profile._get_ixia_traffic_profile = mock.Mock()
-        r_f_c2544_profile._ixia_traffic_generate = mock.Mock()
-        r_f_c2544_profile.get_multiplier = mock.Mock()
-        r_f_c2544_profile.tmp_throughput = 0
-        r_f_c2544_profile.tmp_drop = 0
-        r_f_c2544_profile.full_profile = {}
-        samples = {}
-        for ifname in range(1):
-            name = "xe{}".format(ifname)
-            samples[name] = {"rx_throughput_fps": 20,
-                             "tx_throughput_fps": 20,
-                             "rx_throughput_mbps": 10,
-                             "tx_throughput_mbps": 10,
-                             "RxThroughput": 10,
-                             "TxThroughput": 10,
-                             "in_packets": 1000,
-                             "out_packets": 1000}
-        tol_min = 100.0
-        tolerance = 0.0
-        self.assertIsNotNone(
-            r_f_c2544_profile.get_drop_percentage(samples, tol_min, tolerance,
-                                                  ixia_obj))
+    def test_get_drop_percentage_completed(self):
+        samples = {'iface_name_1':
+                       {'RxThroughput': 10, 'TxThroughput': 10,
+                        'in_packets': 1000, 'out_packets': 1000},
+                   'iface_name_2':
+                       {'RxThroughput': 11, 'TxThroughput': 13,
+                        'in_packets': 1005, 'out_packets': 1007}
+                   }
+        rfc2544_profile = ixia_rfc2544.IXIARFC2544Profile(self.TRAFFIC_PROFILE)
+        completed, samples = rfc2544_profile.get_drop_percentage(samples, 0, 1)
+        self.assertTrue(completed)
+        self.assertEqual(23.0, samples['TxThroughput'])
+        self.assertEqual(21.0, samples['RxThroughput'])
+        self.assertEqual(0.1, samples['DropPercentage'])
 
-    def test_get_drop_percentage_update(self):
-        r_f_c2544_profile = IXIARFC2544Profile(self.TRAFFIC_PROFILE)
-        r_f_c2544_profile.params = self.PROFILE
-        ixia_obj = mock.MagicMock()
-        r_f_c2544_profile.execute = mock.Mock()
-        r_f_c2544_profile._get_ixia_traffic_profile = mock.Mock()
-        r_f_c2544_profile._ixia_traffic_generate = mock.Mock()
-        r_f_c2544_profile.get_multiplier = mock.Mock()
-        r_f_c2544_profile.tmp_throughput = 0
-        r_f_c2544_profile.tmp_drop = 0
-        r_f_c2544_profile.full_profile = {}
-        samples = {}
-        for ifname in range(1):
-            name = "xe{}".format(ifname)
-            samples[name] = {"rx_throughput_fps": 20,
-                             "tx_throughput_fps": 20,
-                             "rx_throughput_mbps": 10,
-                             "tx_throughput_mbps": 10,
-                             "RxThroughput": 10,
-                             "TxThroughput": 10,
-                             "in_packets": 1000,
-                             "out_packets": 1002}
-        tol_min = 0.0
-        tolerance = 1.0
-        self.assertIsNotNone(
-            r_f_c2544_profile.get_drop_percentage(samples, tol_min, tolerance,
-                                                  ixia_obj))
+    def test_get_drop_percentage_over_drop_percentage(self):
+        samples = {'iface_name_1':
+                       {'RxThroughput': 10, 'TxThroughput': 10,
+                        'in_packets': 1000, 'out_packets': 1000},
+                   'iface_name_2':
+                       {'RxThroughput': 11, 'TxThroughput': 13,
+                        'in_packets': 1005, 'out_packets': 1007}
+                   }
+        rfc2544_profile = ixia_rfc2544.IXIARFC2544Profile(self.TRAFFIC_PROFILE)
+        rfc2544_profile.rate = 1000
+        completed, samples = rfc2544_profile.get_drop_percentage(
+            samples, 0, 0.05)
+        self.assertFalse(completed)
+        self.assertEqual(23.0, samples['TxThroughput'])
+        self.assertEqual(21.0, samples['RxThroughput'])
+        self.assertEqual(0.1, samples['DropPercentage'])
+        self.assertEqual(rfc2544_profile.rate, rfc2544_profile.max_rate)
 
-    def test_get_drop_percentage_div_zero(self):
-        r_f_c2544_profile = IXIARFC2544Profile(self.TRAFFIC_PROFILE)
-        r_f_c2544_profile.params = self.PROFILE
-        ixia_obj = mock.MagicMock()
-        r_f_c2544_profile.execute = mock.Mock()
-        r_f_c2544_profile._get_ixia_traffic_profile = mock.Mock()
-        r_f_c2544_profile._ixia_traffic_generate = mock.Mock()
-        r_f_c2544_profile.get_multiplier = mock.Mock()
-        r_f_c2544_profile.tmp_throughput = 0
-        r_f_c2544_profile.tmp_drop = 0
-        r_f_c2544_profile.full_profile = {}
-        samples = {}
-        for ifname in range(1):
-            name = "xe{}".format(ifname)
-            samples[name] = {"rx_throughput_fps": 20,
-                             "tx_throughput_fps": 20,
-                             "rx_throughput_mbps": 10,
-                             "tx_throughput_mbps": 10,
-                             "RxThroughput": 10,
-                             "TxThroughput": 10,
-                             "in_packets": 1000,
-                             "out_packets": 0}
-        tol_min = 0.0
-        tolerance = 0.0
-        r_f_c2544_profile.tmp_throughput = 0
-        self.assertIsNotNone(
-            r_f_c2544_profile.get_drop_percentage(samples, tol_min, tolerance,
-                                                  ixia_obj))
+    def test_get_drop_percentage_under_drop_percentage(self):
+        samples = {'iface_name_1':
+                       {'RxThroughput': 10, 'TxThroughput': 10,
+                        'in_packets': 1000, 'out_packets': 1000},
+                   'iface_name_2':
+                       {'RxThroughput': 11, 'TxThroughput': 13,
+                        'in_packets': 1005, 'out_packets': 1007}
+                   }
+        rfc2544_profile = ixia_rfc2544.IXIARFC2544Profile(self.TRAFFIC_PROFILE)
+        rfc2544_profile.rate = 1000
+        completed, samples = rfc2544_profile.get_drop_percentage(
+            samples, 0.2, 1)
+        self.assertFalse(completed)
+        self.assertEqual(23.0, samples['TxThroughput'])
+        self.assertEqual(21.0, samples['RxThroughput'])
+        self.assertEqual(0.1, samples['DropPercentage'])
+        self.assertEqual(rfc2544_profile.rate, rfc2544_profile.min_rate)
 
-    def test_get_multiplier(self):
-        r_f_c2544_profile = IXIARFC2544Profile(self.TRAFFIC_PROFILE)
-        r_f_c2544_profile.max_rate = 100
-        r_f_c2544_profile.min_rate = 100
-        self.assertEqual("1.0", r_f_c2544_profile.get_multiplier())
+    @mock.patch.object(ixia_rfc2544.LOG, 'info')
+    def test_get_drop_percentage_not_flow(self, *args):
+        samples = {'iface_name_1':
+                       {'RxThroughput': 0, 'TxThroughput': 10,
+                        'in_packets': 1000, 'out_packets': 0},
+                   'iface_name_2':
+                       {'RxThroughput': 0, 'TxThroughput': 13,
+                        'in_packets': 1005, 'out_packets': 0}
+                   }
+        rfc2544_profile = ixia_rfc2544.IXIARFC2544Profile(self.TRAFFIC_PROFILE)
+        rfc2544_profile.rate = 1000
+        completed, samples = rfc2544_profile.get_drop_percentage(
+            samples, 0.2, 1)
+        self.assertFalse(completed)
+        self.assertEqual(23.0, samples['TxThroughput'])
+        self.assertEqual(0, samples['RxThroughput'])
+        self.assertEqual(100, samples['DropPercentage'])
+        self.assertEqual(rfc2544_profile.rate, rfc2544_profile.max_rate)
 
-    def test_start_ixia_latency(self):
-        traffic_generator = mock.Mock(autospec=TrexProfile)
-        traffic_generator.networks = {
-            "uplink_0": ["xe0"],
-            "downlink_0": ["xe1"],
-        }
-        traffic_generator.client = \
-            mock.Mock(return_value=True)
-        r_f_c2544_profile = IXIARFC2544Profile(self.TRAFFIC_PROFILE)
-        r_f_c2544_profile.max_rate = 100
-        r_f_c2544_profile.min_rate = 100
-        ixia_obj = mock.MagicMock()
-        r_f_c2544_profile._get_ixia_traffic_profile = \
-            mock.Mock(return_value={})
-        r_f_c2544_profile.full_profile = {}
-        r_f_c2544_profile._ixia_traffic_generate = mock.Mock()
-        self.assertIsNone(
-            r_f_c2544_profile.start_ixia_latency(traffic_generator, ixia_obj))
+    def test_get_drop_percentage_first_run(self):
+        samples = {'iface_name_1':
+                       {'RxThroughput': 10, 'TxThroughput': 10,
+                        'in_packets': 1000, 'out_packets': 1000},
+                   'iface_name_2':
+                       {'RxThroughput': 11, 'TxThroughput': 13,
+                        'in_packets': 1005, 'out_packets': 1007}
+                   }
+        rfc2544_profile = ixia_rfc2544.IXIARFC2544Profile(self.TRAFFIC_PROFILE)
+        completed, samples = rfc2544_profile.get_drop_percentage(
+            samples, 0, 1, first_run=True)
+        self.assertTrue(completed)
+        self.assertEqual(23.0, samples['TxThroughput'])
+        self.assertEqual(21.0, samples['RxThroughput'])
+        self.assertEqual(0.1, samples['DropPercentage'])
+        self.assertEqual(33.45, rfc2544_profile.rate)
index 58343ff..7bfd67f 100644 (file)
@@ -65,9 +65,10 @@ class TestProxBinSearchProfile(unittest.TestCase):
         self.assertEqual(len(runs), 7)
 
         # Result Samples inc theor_max
-        result_tuple = {"Result_Actual_throughput": 7.5e-07,
-                        "Result_theor_max_throughput": 1.234e-10,
-                        "Result_pktSize": 200}
+        result_tuple = {'Result_Actual_throughput': 5e-07,
+                        'Result_theor_max_throughput': 0.00012340000000000002,
+                        'Result_pktSize': 200}
+
         profile.queue.put.assert_called_with(result_tuple)
 
         success_result_tuple = {"Success_CurrentDropPackets": 0.5,
 # limitations under the License.
 #
 
-# Unittest for yardstick.network_services.vnf_generic.vnfdgen
-
-from __future__ import absolute_import
-import unittest
 from six.moves import range
+import unittest
 
 from yardstick.common.yaml_loader import yaml_load
 from yardstick.network_services.vnf_generic import vnfdgen
@@ -202,10 +199,10 @@ TRAFFIC_PROFILE_TPL = """
 
 TRAFFIC_PROFILE = {
     UPLINK: [{"ipv4": {"outer_l2":
-                          {"framesize": {"64B": '10', "128B": '10',
-                                         "256B": '10', "373B": '10',
-                                         "570B": '10', "1400B": '10',
-                                         "1518B": '40'}}}}]}
+                       {"framesize": {"64B": '10', "128B": '10',
+                                      "256B": '10', "373B": '10',
+                                      "570B": '10', "1400B": '10',
+                                      "1518B": '40'}}}}]}
 
 
 class TestRender(unittest.TestCase):
@@ -214,12 +211,14 @@ class TestRender(unittest.TestCase):
 
         tmpl = "{{ routing_table }}"
         self.assertEqual(vnfdgen.render(tmpl, routing_table=None), u'~')
-        self.assertEqual(yaml_load(vnfdgen.render(tmpl, routing_table=None)), None)
+        self.assertIsNone(
+            yaml_load(vnfdgen.render(tmpl, routing_table=None)))
 
     def test_render_unicode_dict(self):
 
         tmpl = "{{ routing_table }}"
-        self.assertEqual(yaml_load(vnfdgen.render(tmpl, **NODE_CFG)), NODE_CFG["routing_table"])
+        self.assertEqual(yaml_load(vnfdgen.render(
+            tmpl, **NODE_CFG)), NODE_CFG["routing_table"])
 
 
 class TestVnfdGen(unittest.TestCase):
@@ -266,7 +265,6 @@ class TestVnfdGen(unittest.TestCase):
         d = {'0': 1, 0: 24, 'b': 2}
         self.assertRaises(AttributeError, vnfdgen.deepgetitem, d, 0)
 
-
     def test_generate_tp_single_var(self):
         """ Function to verify traffic profile generation with imix """
 
@@ -17,8 +17,8 @@ import unittest
 import mock
 import os
 
-from tests.unit import STL_MOCKS
-from tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh
+from yardstick.tests import STL_MOCKS
+from yardstick.tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh
 from yardstick.common import utils
 
 
@@ -324,7 +324,7 @@ class TestAclApproxVnf(unittest.TestCase):
         acl_approx_vnf.resource_helper = mock.MagicMock()
         acl_approx_vnf._build_config = mock.MagicMock()
         self.scenario_cfg['vnf_options'] = {'acl': {'cfg': "",
-                                                        'rules': ""}}
+                                                    'rules': ""}}
         acl_approx_vnf.q_out.put("pipeline>")
         acl_approx_vnf.WAIT_TIME = 0
         self.scenario_cfg.update({"nodes": {"vnf__1": ""}})
@@ -13,8 +13,6 @@
 # limitations under the License.
 #
 
-# Unittest for yardstick.network_services.vnf_generic.vnf.test_base
-
 import multiprocessing
 import os
 
 
 from copy import deepcopy
 import os
-import unittest
+
 import mock
+import unittest
+
 
-from tests.unit import STL_MOCKS
-from tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh
 from yardstick.common import utils
 
-STLClient = mock.MagicMock()
-stl_patch = mock.patch.dict("sys.modules", STL_MOCKS)
-stl_patch.start()
+from yardstick.tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh
+
 
-if stl_patch:
-    from yardstick.network_services.vnf_generic.vnf.cgnapt_vnf import CgnaptApproxVnf, \
-        CgnaptApproxSetupEnvHelper
-    from yardstick.network_services.vnf_generic.vnf import cgnapt_vnf
-    from yardstick.network_services.nfvi.resource import ResourceProfile
+
+from yardstick.network_services.vnf_generic.vnf.cgnapt_vnf import CgnaptApproxVnf, \
+    CgnaptApproxSetupEnvHelper
+from yardstick.network_services.vnf_generic.vnf import cgnapt_vnf
+from yardstick.network_services.nfvi.resource import ResourceProfile
 
 TEST_FILE_YAML = 'nsb_test_case.yaml'
 SSH_HELPER = 'yardstick.network_services.vnf_generic.vnf.sample_vnf.VnfSshHelper'
@@ -409,6 +408,22 @@ class TestCgnaptApproxVnf(unittest.TestCase):
         self.assertIsNone(cgnapt_approx_vnf.instantiate(self.scenario_cfg,
                                                         self.context_cfg))
 
+    @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time")
+    @mock.patch(SSH_HELPER)
+    def test_terminate(self, ssh, *args):
+        mock_ssh(ssh)
+
+        vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+        cgnapt_approx_vnf = CgnaptApproxVnf(name, vnfd)
+        cgnapt_approx_vnf._vnf_process = mock.MagicMock()
+        cgnapt_approx_vnf._vnf_process.terminate = mock.Mock()
+        cgnapt_approx_vnf.used_drivers = {"01:01.0": "i40e",
+                                          "01:01.1": "i40e"}
+        cgnapt_approx_vnf.vnf_execute = mock.MagicMock()
+        cgnapt_approx_vnf.dpdk_nic_bind = "dpdk_nic_bind.py"
+        cgnapt_approx_vnf._resource_collect_stop = mock.Mock()
+        self.assertIsNone(cgnapt_approx_vnf.terminate())
+
     @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time")
     @mock.patch(SSH_HELPER)
     def test__vnf_up_post(self, ssh, *args):
@@ -1,3 +1,4 @@
+
 # Copyright (c) 2016-2017 Intel Corporation
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
@@ -21,7 +22,7 @@ import time
 import mock
 import unittest
 
-from tests.unit import STL_MOCKS
+from yardstick.tests import STL_MOCKS
 from yardstick.common import utils
 from yardstick.network_services.vnf_generic.vnf.base import VnfdHelper
 from yardstick.network_services import constants
@@ -151,12 +152,12 @@ class TestProxTestDataTuple(unittest.TestCase):
         self.assertEqual(prox_test_data.latency, 6)
         self.assertEqual(prox_test_data.rx_total, 7)
         self.assertEqual(prox_test_data.tx_total, 8)
-        self.assertEqual(prox_test_data.pps, 9)
+        self.assertEqual(prox_test_data.requested_pps, 9)
 
     def test_properties(self):
         prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, 6, 7, 8, 9)
         self.assertEqual(prox_test_data.pkt_loss, 12.5)
-        self.assertEqual(prox_test_data.mpps, 1.6 / 1e6)
+        self.assertEqual(prox_test_data.tx_mpps, 1.6 / 1e6)
         self.assertEqual(prox_test_data.can_be_lost, 0)
         self.assertEqual(prox_test_data.drop_total, 1)
         self.assertFalse(prox_test_data.success)
@@ -172,11 +173,12 @@ class TestProxTestDataTuple(unittest.TestCase):
         prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, [6.1, 6.9, 6.4], 7, 8, 9)
 
         expected = {
-            "Throughput": 1.6 / 1e6,
+            "Throughput": 1.2 / 1e6,
             "DropPackets": 12.5,
             "CurrentDropPackets": 12.5,
-            "TxThroughput": 9 / 1e6,
-            "RxThroughput": 1.6 / 1e6,
+            "RequestedTxThroughput": 9 / 1e6,
+            "TxThroughput": 1.6 / 1e6,
+            "RxThroughput": 1.2 / 1e6,
             "PktSize": 64,
             "PortSample": 1,
             "LatencyMin": 6.1,
@@ -187,11 +189,12 @@ class TestProxTestDataTuple(unittest.TestCase):
         self.assertDictEqual(result, expected)
 
         expected = {
-            "Throughput": 1.6 / 1e6,
+            "Throughput": 1.2 / 1e6,
             "DropPackets": 0.123,
             "CurrentDropPackets": 0.123,
-            "TxThroughput": 9 / 1e6,
-            "RxThroughput": 1.6 / 1e6,
+            "RequestedTxThroughput": 9 / 1e6,
+            "TxThroughput": 1.6 / 1e6,
+            "RxThroughput": 1.2 / 1e6,
             "PktSize": 64,
             "LatencyMin": 6.1,
             "LatencyMax": 6.9,
@@ -200,17 +203,17 @@ class TestProxTestDataTuple(unittest.TestCase):
         result = prox_test_data.get_samples(64, 0.123)
         self.assertDictEqual(result, expected)
 
-    @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.LOG')
+    @mock.patch('yardstick.LOG_RESULT', create=True)
     def test_log_data(self, mock_logger):
         my_mock_logger = mock.MagicMock()
         prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, [6.1, 6.9, 6.4], 7, 8, 9)
         prox_test_data.log_data()
         self.assertEqual(my_mock_logger.debug.call_count, 0)
-        self.assertEqual(mock_logger.debug.call_count, 2)
+        self.assertEqual(mock_logger.debug.call_count, 0)
 
         mock_logger.debug.reset_mock()
         prox_test_data.log_data(my_mock_logger)
-        self.assertEqual(my_mock_logger.debug.call_count, 2)
+        self.assertEqual(my_mock_logger.debug.call_count, 0)
         self.assertEqual(mock_logger.debug.call_count, 0)
 
 
@@ -290,7 +293,12 @@ no data length value
 class TestProxSocketHelper(unittest.TestCase):
 
     def setUp(self):
-        self.mock_time_sleep = mock.patch.object(time, 'sleep').start()
+        self._mock_time_sleep = mock.patch.object(time, 'sleep')
+        self.mock_time_sleep = self._mock_time_sleep.start()
+        self.addCleanup(self._stop_mocks)
+
+    def _stop_mocks(self):
+        self._mock_time_sleep.stop()
 
     @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.socket')
     def test___init__(self, mock_socket):
@@ -311,6 +319,7 @@ class TestProxSocketHelper(unittest.TestCase):
         result = prox.get_socket()
         self.assertIs(result, mock_sock)
 
+    # TODO(elfoley): Split this into three tests
     @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.select')
     def test_get_data(self, mock_select):
         mock_select.select.side_effect = [[1], [0]]
@@ -334,17 +343,17 @@ class TestProxSocketHelper(unittest.TestCase):
         mock_select.select.side_effect = chain([[object()], [None]], repeat([1], 3))
         mock_recv.decode.return_value = PACKET_DUMP_2
         ret = prox.get_data()
-        self.assertEqual(mock_select.select.call_count, 2)
+        self.assertEqual(mock_select.select.call_count, 1)
         self.assertEqual(ret, 'jumped over')
         self.assertEqual(len(prox._pkt_dumps), 3)
 
     def test__parse_socket_data_mixed_data(self):
         prox = ProxSocketHelper(mock.MagicMock())
-        ret = prox._parse_socket_data(PACKET_DUMP_NON_1, False)
+        ret, _ = prox._parse_socket_data(PACKET_DUMP_NON_1, False)
         self.assertEqual(ret, 'not_a_dump,1,2')
         self.assertEqual(len(prox._pkt_dumps), 0)
 
-        ret = prox._parse_socket_data(PACKET_DUMP_MIXED_1, False)
+        ret, _ = prox._parse_socket_data(PACKET_DUMP_MIXED_1, False)
         self.assertEqual(ret, 'not_a_dump,1,2')
         self.assertEqual(len(prox._pkt_dumps), 1)
 
@@ -356,18 +365,18 @@ class TestProxSocketHelper(unittest.TestCase):
         with self.assertRaises(ValueError):
             prox._parse_socket_data(PACKET_DUMP_BAD_2, False)
 
-        ret = prox._parse_socket_data(PACKET_DUMP_BAD_3, False)
+        ret, _ = prox._parse_socket_data(PACKET_DUMP_BAD_3, False)
         self.assertEqual(ret, 'pktdump,3')
 
     def test__parse_socket_data_pkt_dump_only(self):
         prox = ProxSocketHelper(mock.MagicMock())
-        ret = prox._parse_socket_data('', True)
+        ret, _ = prox._parse_socket_data('', True)
         self.assertFalse(ret)
 
-        ret = prox._parse_socket_data(PACKET_DUMP_1, True)
+        ret, _ = prox._parse_socket_data(PACKET_DUMP_1, True)
         self.assertTrue(ret)
 
-        ret = prox._parse_socket_data(PACKET_DUMP_2, True)
+        ret, _ = prox._parse_socket_data(PACKET_DUMP_2, True)
         self.assertTrue(ret)
 
     def test_put_command(self):
@@ -907,6 +916,7 @@ class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase):
         result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
         self.assertEqual(result, expected)
 
+    # TODO(elfoley): Split this into several smaller tests
     def test_write_prox_config(self):
         input_data = {}
         expected = ''
@@ -1520,6 +1530,7 @@ class TestProxResourceHelper(unittest.TestCase):
         result = helper.execute('my_command')
         self.assertEqual(result, expected)
 
+        # TODO(elfoley): Make this a separate test: test_execute_no_client
         helper.client = object()
 
         result = helper.execute('my_command')
@@ -1542,7 +1553,7 @@ class TestProxDataHelper(unittest.TestCase):
 
         self.assertEqual(data_helper.rx_total, 6)
         self.assertEqual(data_helper.tx_total, 7)
-        self.assertEqual(data_helper.pps, 6.25e6)
+        self.assertEqual(data_helper.requested_pps, 6.25e6)
 
     def test_samples(self):
         vnfd_helper = mock.MagicMock()
@@ -1681,6 +1692,7 @@ class TestProxProfileHelper(unittest.TestCase):
         self.assertIs(result, helper._cpu_topology)
         self.assertIs(result, helper.cpu_topology)
 
+    # TODO(elfoley): Split this test; there are two sets of inputs/outputs
     def test_test_cores(self):
         resource_helper = mock.MagicMock()
         resource_helper.setup_helper.prox_config_data = []
@@ -1738,6 +1750,7 @@ class TestProxProfileHelper(unittest.TestCase):
         self.assertIs(result, helper._test_cores)
         self.assertIs(result, helper.test_cores)
 
+    # TODO(elfoley): Split this test; there are two sets of inputs/outputs
     def test_latency_cores(self):
         resource_helper = mock.MagicMock()
         resource_helper.setup_helper.prox_config_data = []
@@ -19,7 +19,7 @@ import unittest
 import mock
 from copy import deepcopy
 
-from tests.unit import STL_MOCKS
+from yardstick.tests import STL_MOCKS
 
 
 SSH_HELPER = 'yardstick.network_services.vnf_generic.vnf.sample_vnf.VnfSshHelper'
@@ -30,7 +30,7 @@ stl_patch.start()
 
 if stl_patch:
     from yardstick.network_services.vnf_generic.vnf.prox_vnf import ProxApproxVnf
-    from tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh
+    from yardstick.tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh
 
 
 NAME = "vnf__1"
 # limitations under the License.
 #
 
-from __future__ import absolute_import
-
 import unittest
 import mock
 
-from tests.unit import STL_MOCKS
-from tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh
+from yardstick.tests import STL_MOCKS
+from yardstick.tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh
 
 
 STLClient = mock.MagicMock()
@@ -19,8 +19,8 @@ import unittest
 import mock
 import six
 
-from tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh
-from tests.unit import STL_MOCKS
+from yardstick.tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh
+from yardstick.tests import STL_MOCKS
 from yardstick.benchmark.contexts.base import Context
 from yardstick.common import exceptions as y_exceptions
 from yardstick.common import utils
@@ -19,7 +19,7 @@ import mock
 import unittest
 import six
 
-from tests.unit import STL_MOCKS
+from yardstick.tests import STL_MOCKS
 from yardstick import ssh
 from yardstick.common import utils
 
@@ -115,6 +115,18 @@ class TestIxLoadTrafficGen(unittest.TestCase):
             "flow_number": 10,
             "frame_size": 64}}
 
+    def setUp(self):
+        self._mock_call = mock.patch.object(subprocess, "call")
+        self.mock_call = self._mock_call.start()
+        self._mock_open = mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.open")
+        self.mock_open = self._mock_open.start()
+
+        self.addCleanup(self._stop_mock)
+
+    def _stop_mock(self):
+        self._mock_call.stop()
+        self._mock_open.stop()
+
     def test___init__(self):
         with mock.patch("yardstick.ssh.SSH") as ssh:
             ssh_mock = mock.Mock(autospec=ssh.SSH)
@@ -149,9 +161,8 @@ class TestIxLoadTrafficGen(unittest.TestCase):
 
     @mock.patch.object(utils, 'find_relative_file')
     @mock.patch.object(utils, 'makedirs')
-    @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.call")
     @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.shutil")
-    def test_instantiate(self, shutil, *args):
+    def test_instantiate(self, *args):
         with mock.patch("yardstick.ssh.SSH") as ssh:
             ssh_mock = mock.Mock(autospec=ssh.SSH)
             ssh_mock.execute = \
@@ -165,7 +176,6 @@ class TestIxLoadTrafficGen(unittest.TestCase):
                             'ixia_profile': "ixload.cfg",
                             'task_path': "/path/to/task"}
             ixload_traffic_gen.RESULTS_MOUNT = "/tmp/result"
-            shutil.copy = mock.Mock()
             scenario_cfg.update({'options': {'packetsize': 64, 'traffic_type': 4,
                                              'rfc2544': {'allowed_drop_rate': '0.8 - 1'},
                                              'vnf__1': {'rules': 'acl_1rule.yaml',
@@ -180,13 +190,12 @@ class TestIxLoadTrafficGen(unittest.TestCase):
                 mock_open.return_value = mock.MagicMock()
                 ixload_traffic_gen.instantiate(scenario_cfg, {})
 
-    @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.call")
     @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.open")
     @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.min")
     @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.max")
     @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.len")
     @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.shutil")
-    def test_run_traffic(self, shutil, *args):
+    def test_run_traffic(self, *args):
         mock_traffic_profile = mock.Mock(autospec=TrafficProfile)
         mock_traffic_profile.get_traffic_definition.return_value = "64"
         mock_traffic_profile.params = self.TRAFFIC_PROFILE
@@ -207,17 +216,15 @@ class TestIxLoadTrafficGen(unittest.TestCase):
             sut.connection = mock.Mock()
             sut.connection.run = mock.Mock()
             sut._traffic_runner = mock.Mock(return_value=0)
-            shutil.copy = mock.Mock()
             result = sut.run_traffic(mock_traffic_profile)
             self.assertIsNone(result)
 
-    @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.call")
     @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.open")
     @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.min")
     @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.max")
     @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.len")
     @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.shutil")
-    def test_run_traffic_csv(self, shutil, *args):
+    def test_run_traffic_csv(self, *args):
         mock_traffic_profile = mock.Mock(autospec=TrafficProfile)
         mock_traffic_profile.get_traffic_definition.return_value = "64"
         mock_traffic_profile.params = self.TRAFFIC_PROFILE
@@ -238,7 +245,6 @@ class TestIxLoadTrafficGen(unittest.TestCase):
             sut.connection = mock.Mock()
             sut.connection.run = mock.Mock()
             sut._traffic_runner = mock.Mock(return_value=0)
-            shutil.copy = mock.Mock()
             subprocess.call(["touch", "/tmp/1.csv"])
             sut.rel_bin_path = mock.Mock(return_value="/tmp/*.csv")
             result = sut.run_traffic(mock_traffic_profile)
@@ -251,9 +257,8 @@ class TestIxLoadTrafficGen(unittest.TestCase):
         ixload_traffic_gen = IxLoadTrafficGen(NAME, vnfd)
         self.assertIsNone(ixload_traffic_gen.terminate())
 
-    @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.call")
-    @mock.patch.object(ssh, 'SSH')
-    def test_parse_csv_read(self, mock_ssh, *args):
+    @mock.patch("yardstick.ssh.SSH")
+    def test_parse_csv_read(self, mock_ssh):
         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
         kpi_data = {
             'HTTP Total Throughput (Kbps)': 1,
@@ -275,9 +280,8 @@ class TestIxLoadTrafficGen(unittest.TestCase):
         for key_left, key_right in IxLoadResourceHelper.KPI_LIST.items():
             self.assertEqual(result[key_left][-1], int(kpi_data[key_right]))
 
-    @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.call")
-    @mock.patch.object(ssh, 'SSH')
-    def test_parse_csv_read_value_error(self, mock_ssh, *args):
+    @mock.patch("yardstick.ssh.SSH")
+    def test_parse_csv_read_value_error(self, mock_ssh):
         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
         http_reader = [{
             'HTTP Total Throughput (Kbps)': 1,
@@ -297,9 +301,8 @@ class TestIxLoadTrafficGen(unittest.TestCase):
         ixload_traffic_gen.resource_helper.parse_csv_read(http_reader)
         self.assertDictEqual(ixload_traffic_gen.resource_helper.result, init_value)
 
-    @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.call")
     @mock.patch.object(ssh, 'SSH')
-    def test_parse_csv_read_error(self, mock_ssh, *args):
+    def test_parse_csv_read_error(self, mock_ssh):
         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
         http_reader = [{
             'HTTP Total Throughput (Kbps)': 1,
 # limitations under the License.
 #
 
-from __future__ import absolute_import
-
-import unittest
-import mock
 from multiprocessing import Queue
 import multiprocessing
 
-from tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh
-from tests.unit import STL_MOCKS
+import mock
+import unittest
+
+from yardstick.tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh
+from yardstick.tests import STL_MOCKS
 
 SSH_HELPER = "yardstick.network_services.vnf_generic.vnf.sample_vnf.VnfSshHelper"
 
@@ -16,8 +16,8 @@
 import unittest
 import mock
 
-from tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh
-from tests.unit import STL_MOCKS
+from yardstick.tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh
+from yardstick.tests import STL_MOCKS
 
 
 SSH_HELPER = 'yardstick.network_services.vnf_generic.vnf.sample_vnf.VnfSshHelper'
@@ -11,7 +11,6 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
-#
 
 import os
 
@@ -19,57 +18,74 @@ import mock
 import six
 import unittest
 
-from tests.unit import STL_MOCKS
-
-STLClient = mock.MagicMock()
-stl_patch = mock.patch.dict("sys.modules", STL_MOCKS)
-stl_patch.start()
+from yardstick.network_services.vnf_generic.vnf import tg_rfc2544_ixia
+from yardstick.network_services.traffic_profile import base as tp_base
 
-if stl_patch:
-    from yardstick.network_services.vnf_generic.vnf.tg_rfc2544_ixia import IxiaTrafficGen
-    from yardstick.network_services.vnf_generic.vnf.tg_rfc2544_ixia import IxiaRfc2544Helper
-    from yardstick.network_services.vnf_generic.vnf.tg_rfc2544_ixia import IxiaResourceHelper
-    from yardstick.network_services.traffic_profile.base import TrafficProfile
 
 TEST_FILE_YAML = 'nsb_test_case.yaml'
 
 NAME = "tg__1"
 
 
-@mock.patch("yardstick.network_services.vnf_generic.vnf.tg_rfc2544_ixia.IxNextgen")
 class TestIxiaResourceHelper(unittest.TestCase):
-    def test___init___with_custom_rfc_helper(self, *args):
-        class MyRfcHelper(IxiaRfc2544Helper):
+
+    def setUp(self):
+        self._mock_IxNextgen = mock.patch.object(tg_rfc2544_ixia,
+                                                 'IxNextgen')
+        self.mock_IxNextgen = self._mock_IxNextgen.start()
+        self.addCleanup(self._stop_mocks)
+
+    def _stop_mocks(self):
+        self._mock_IxNextgen.stop()
+
+    def test___init___with_custom_rfc_helper(self):
+        class MyRfcHelper(tg_rfc2544_ixia.IxiaRfc2544Helper):
             pass
 
-        ixia_resource_helper = IxiaResourceHelper(mock.Mock(), MyRfcHelper)
+        ixia_resource_helper = tg_rfc2544_ixia.IxiaResourceHelper(
+            mock.Mock(), MyRfcHelper)
         self.assertIsInstance(ixia_resource_helper.rfc_helper, MyRfcHelper)
 
-    def test_stop_collect_with_client(self, *args):
+    def test_stop_collect_with_client(self):
         mock_client = mock.Mock()
 
-        ixia_resource_helper = IxiaResourceHelper(mock.Mock())
+        ixia_resource_helper = tg_rfc2544_ixia.IxiaResourceHelper(mock.Mock())
 
         ixia_resource_helper.client = mock_client
         ixia_resource_helper.stop_collect()
         self.assertEqual(mock_client.ix_stop_traffic.call_count, 1)
 
+    def test_run_traffic(self):
+        mock_tprofile = mock.Mock()
+        mock_tprofile.get_drop_percentage.return_value = True, 'fake_samples'
+        ixia_rhelper = tg_rfc2544_ixia.IxiaResourceHelper(mock.Mock())
+        ixia_rhelper.rfc_helper = mock.Mock()
+        ixia_rhelper.vnfd_helper = mock.Mock()
+        ixia_rhelper.vnfd_helper.port_pairs.all_ports = []
+        with mock.patch.object(ixia_rhelper, 'generate_samples'), \
+                mock.patch.object(ixia_rhelper, '_build_ports'), \
+                mock.patch.object(ixia_rhelper, '_initialize_client'):
+            ixia_rhelper.run_traffic(mock_tprofile)
 
-@mock.patch("yardstick.network_services.vnf_generic.vnf.tg_rfc2544_ixia.IxNextgen")
+        self.assertEqual('fake_samples', ixia_rhelper._queue.get())
+
+
+@mock.patch(
+    "yardstick.network_services.vnf_generic.vnf.tg_rfc2544_ixia.IxNextgen")
 class TestIXIATrafficGen(unittest.TestCase):
     VNFD = {'vnfd:vnfd-catalog':
-                {'vnfd':
-                     [{'short-name': 'VpeVnf',
-                       'vdu':
-                           [{'routing_table':
-                                 [{'network': '152.16.100.20',
-                                   'netmask': '255.255.255.0',
-                                   'gateway': '152.16.100.20',
-                                   'if': 'xe0'},
-                                  {'network': '152.16.40.20',
-                                   'netmask': '255.255.255.0',
-                                   'gateway': '152.16.40.20',
-                                   'if': 'xe1'}],
+            {'vnfd':
+             [{'short-name': 'VpeVnf',
+               'vdu':
+               [{'routing_table':
+                             [{'network': '152.16.100.20',
+                               'netmask': '255.255.255.0',
+                               'gateway': '152.16.100.20',
+                               'if': 'xe0'},
+                              {'network': '152.16.40.20',
+                               'netmask': '255.255.255.0',
+                               'gateway': '152.16.40.20',
+                               'if': 'xe1'}],
                              'description': 'VPE approximation using DPDK',
                              'name': 'vpevnf-baremetal',
                              'nd_route_tbl':
@@ -84,45 +100,46 @@ class TestIXIATrafficGen(unittest.TestCase):
                              'id': 'vpevnf-baremetal',
                              'external-interface':
                                  [{'virtual-interface':
-                                       {'dst_mac': '00:00:00:00:00:04',
-                                        'vpci': '0000:05:00.0',
-                                        'local_ip': '152.16.100.19',
-                                        'type': 'PCI-PASSTHROUGH',
-                                        'netmask': '255.255.255.0',
-                                        'dpdk_port_num': 0,
-                                        'bandwidth': '10 Gbps',
-                                        'driver': "i40e",
-                                        'dst_ip': '152.16.100.20',
-                                        'local_iface_name': 'xe0',
-                                        'local_mac': '00:00:00:00:00:02'},
+                                   {'dst_mac': '00:00:00:00:00:04',
+                                    'vpci': '0000:05:00.0',
+                                    'local_ip': '152.16.100.19',
+                                    'type': 'PCI-PASSTHROUGH',
+                                    'netmask': '255.255.255.0',
+                                    'dpdk_port_num': 0,
+                                    'bandwidth': '10 Gbps',
+                                    'driver': "i40e",
+                                    'dst_ip': '152.16.100.20',
+                                    'local_iface_name': 'xe0',
+                                    'local_mac': '00:00:00:00:00:02'},
                                    'vnfd-connection-point-ref': 'xe0',
                                    'name': 'xe0'},
                                   {'virtual-interface':
-                                       {'dst_mac': '00:00:00:00:00:03',
-                                        'vpci': '0000:05:00.1',
-                                        'local_ip': '152.16.40.19',
-                                        'type': 'PCI-PASSTHROUGH',
-                                        'driver': "i40e",
-                                        'netmask': '255.255.255.0',
-                                        'dpdk_port_num': 1,
-                                        'bandwidth': '10 Gbps',
-                                        'dst_ip': '152.16.40.20',
-                                        'local_iface_name': 'xe1',
-                                        'local_mac': '00:00:00:00:00:01'},
+                                   {'dst_mac': '00:00:00:00:00:03',
+                                    'vpci': '0000:05:00.1',
+                                    'local_ip': '152.16.40.19',
+                                    'type': 'PCI-PASSTHROUGH',
+                                    'driver': "i40e",
+                                    'netmask': '255.255.255.0',
+                                    'dpdk_port_num': 1,
+                                    'bandwidth': '10 Gbps',
+                                    'dst_ip': '152.16.40.20',
+                                    'local_iface_name': 'xe1',
+                                    'local_mac': '00:00:00:00:00:01'},
                                    'vnfd-connection-point-ref': 'xe1',
                                    'name': 'xe1'}]}],
-                       'description': 'Vpe approximation using DPDK',
-                       'mgmt-interface':
-                           {'vdu-id': 'vpevnf-baremetal',
-                            'host': '1.1.1.1',
-                            'password': 'r00t',
+               'description': 'Vpe approximation using DPDK',
+               'mgmt-interface':
+               {'vdu-id': 'vpevnf-baremetal',
+                'host': '1.1.1.1',
+                'password': 'r00t',
                             'user': 'root',
                             'ip': '1.1.1.1'},
-                       'benchmark':
-                           {'kpi': ['packets_in', 'packets_fwd', 'packets_dropped']},
-                       'connection-point': [{'type': 'VPORT', 'name': 'xe0'},
-                                            {'type': 'VPORT', 'name': 'xe1'}],
-                       'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'}]}}
+               'benchmark':
+               {'kpi': ['packets_in', 'packets_fwd',
+                        'packets_dropped']},
+               'connection-point': [{'type': 'VPORT', 'name': 'xe0'},
+                                    {'type': 'VPORT', 'name': 'xe1'}],
+               'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'}]}}
 
     TRAFFIC_PROFILE = {
         "schema": "isb:traffic_profile:0.1",
@@ -135,7 +152,7 @@ class TestIXIATrafficGen(unittest.TestCase):
             "frame_size": 64}}
 
     TC_YAML = {'scenarios': [{'tc_options':
-                                  {'rfc2544': {'allowed_drop_rate': '0.8 - 1'}},
+                              {'rfc2544': {'allowed_drop_rate': '0.8 - 1'}},
                               'runner': {'duration': 400,
                                          'interval': 35, 'type': 'Duration'},
                               'traffic_options':
@@ -160,7 +177,7 @@ class TestIXIATrafficGen(unittest.TestCase):
             ssh.from_node.return_value = ssh_mock
             vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
             # NOTE(ralonsoh): check the object returned.
-            IxiaTrafficGen(NAME, vnfd)
+            tg_rfc2544_ixia.IxiaTrafficGen(NAME, vnfd)
 
     def test_listen_traffic(self, *args):
         with mock.patch("yardstick.ssh.SSH") as ssh:
@@ -169,7 +186,7 @@ class TestIXIATrafficGen(unittest.TestCase):
                 mock.Mock(return_value=(0, "", ""))
             ssh.from_node.return_value = ssh_mock
             vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
-            ixnet_traffic_gen = IxiaTrafficGen(NAME, vnfd)
+            ixnet_traffic_gen = tg_rfc2544_ixia.IxiaTrafficGen(NAME, vnfd)
             self.assertIsNone(ixnet_traffic_gen.listen_traffic({}))
 
     def test_instantiate(self, *args):
@@ -181,19 +198,23 @@ class TestIXIATrafficGen(unittest.TestCase):
                 mock.Mock(return_value=(0, "", ""))
             ssh.from_node.return_value = ssh_mock
             vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
-            ixnet_traffic_gen = IxiaTrafficGen(NAME, vnfd)
+            ixnet_traffic_gen = tg_rfc2544_ixia.IxiaTrafficGen(NAME, vnfd)
             scenario_cfg = {'tc': "nsb_test_case", "topology": "",
                             'ixia_profile': "ixload.cfg"}
-            scenario_cfg.update({'options': {'packetsize': 64,
-                                             'traffic_type': 4,
-                                             'rfc2544': {'allowed_drop_rate': '0.8 - 1'},
-                                             'vnf__1': {'rules': 'acl_1rule.yaml',
-                                                        'vnf_config': {'lb_config': 'SW',
-                                                                       'lb_count': 1,
-                                                                       'worker_config':
-                                                                           '1C/1T',
-                                                                       'worker_threads': 1}}
-                                             }})
+            scenario_cfg.update(
+                {
+                    'options': {
+                        'packetsize': 64,
+                        'traffic_type': 4,
+                        'rfc2544': {
+                            'allowed_drop_rate': '0.8 - 1'},
+                        'vnf__1': {
+                            'rules': 'acl_1rule.yaml',
+                            'vnf_config': {
+                                'lb_config': 'SW',
+                                'lb_count': 1,
+                                'worker_config': '1C/1T',
+                                'worker_threads': 1}}}})
             ixnet_traffic_gen.topology = ""
             ixnet_traffic_gen.get_ixobj = mock.MagicMock()
             ixnet_traffic_gen._ixia_traffic_gen = mock.MagicMock()
@@ -209,7 +230,7 @@ class TestIXIATrafficGen(unittest.TestCase):
                 mock.Mock(return_value=(0, "", ""))
             ssh.from_node.return_value = ssh_mock
             vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
-            ixnet_traffic_gen = IxiaTrafficGen(NAME, vnfd)
+            ixnet_traffic_gen = tg_rfc2544_ixia.IxiaTrafficGen(NAME, vnfd)
             ixnet_traffic_gen.data = {}
             restult = ixnet_traffic_gen.collect_kpi()
             self.assertEqual({}, restult)
@@ -221,7 +242,7 @@ class TestIXIATrafficGen(unittest.TestCase):
             ssh_mock.execute = \
                 mock.Mock(return_value=(0, "", ""))
             ssh.from_node.return_value = ssh_mock
-            ixnet_traffic_gen = IxiaTrafficGen(NAME, vnfd)
+            ixnet_traffic_gen = tg_rfc2544_ixia.IxiaTrafficGen(NAME, vnfd)
             ixnet_traffic_gen._terminated = mock.MagicMock()
             ixnet_traffic_gen._terminated.value = 0
             ixnet_traffic_gen._ixia_traffic_gen = mock.MagicMock()
@@ -237,13 +258,12 @@ class TestIXIATrafficGen(unittest.TestCase):
 
     def test__check_status(self, *args):
         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
-        sut = IxiaTrafficGen('vnf1', vnfd)
+        sut = tg_rfc2544_ixia.IxiaTrafficGen('vnf1', vnfd)
         sut._check_status()
 
-    @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_rfc2544_ixia.time")
     @mock.patch("yardstick.ssh.SSH")
     def test_traffic_runner(self, mock_ssh, *args):
-        mock_traffic_profile = mock.Mock(autospec=TrafficProfile)
+        mock_traffic_profile = mock.Mock(autospec=tp_base.TrafficProfile)
         mock_traffic_profile.get_traffic_definition.return_value = "64"
         mock_traffic_profile.params = self.TRAFFIC_PROFILE
         # traffic_profile.ports is standardized on port_num
@@ -299,10 +319,12 @@ class TestIXIATrafficGen(unittest.TestCase):
             },
         ]
 
-        mock_traffic_profile.execute_traffic.return_value = ['Completed', samples]
-        mock_traffic_profile.get_drop_percentage.return_value = ['Completed', samples]
+        mock_traffic_profile.execute_traffic.return_value = [
+            'Completed', samples]
+        mock_traffic_profile.get_drop_percentage.return_value = [
+            'Completed', samples]
 
-        sut = IxiaTrafficGen(name, vnfd)
+        sut = tg_rfc2544_ixia.IxiaTrafficGen(name, vnfd)
         sut.vnf_port_pairs = [[[0], [1]]]
         sut.tc_file_name = self._get_file_abspath(TEST_FILE_YAML)
         sut.topology = ""
 # limitations under the License.
 #
 
-from __future__ import absolute_import
-
 import unittest
 import mock
 
-from tests.unit import STL_MOCKS
+from yardstick.tests import STL_MOCKS
 SSH_HELPER = 'yardstick.network_services.vnf_generic.vnf.sample_vnf.VnfSshHelper'
 
 
@@ -31,7 +29,8 @@ if stl_patch:
         TrexRfcResourceHelper
     from yardstick.network_services.vnf_generic.vnf import tg_rfc2544_trex
     from yardstick.network_services.traffic_profile.base import TrafficProfile
-    from tests.unit.network_services.vnf_generic.vnf.test_base import FileAbsPath, mock_ssh
+    from yardstick.tests.unit.network_services.vnf_generic.vnf.test_base \
+        import FileAbsPath, mock_ssh
 
 MODULE_PATH = FileAbsPath(__file__)
 get_file_abspath = MODULE_PATH.get_path
 #
 
 import copy
-import mock
 
+import mock
 import unittest
 
-from tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh
-from tests.unit import STL_MOCKS
+from yardstick.tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh
+from yardstick.tests import STL_MOCKS
 
 
 SSH_HELPER = 'yardstick.network_services.vnf_generic.vnf.sample_vnf.VnfSshHelper'
@@ -37,18 +37,18 @@ if stl_patch:
 
 class TestTrexTrafficGen(unittest.TestCase):
     VNFD = {'vnfd:vnfd-catalog':
-                {'vnfd':
-                     [{'short-name': 'VpeVnf',
-                       'vdu':
-                           [{'routing_table':
-                                 [{'network': '152.16.100.20',
-                                   'netmask': '255.255.255.0',
-                                   'gateway': '152.16.100.20',
-                                   'if': 'xe0'},
-                                  {'network': '152.16.40.20',
-                                   'netmask': '255.255.255.0',
-                                   'gateway': '152.16.40.20',
-                                   'if': 'xe1'}],
+            {'vnfd':
+             [{'short-name': 'VpeVnf',
+               'vdu':
+               [{'routing_table':
+                             [{'network': '152.16.100.20',
+                               'netmask': '255.255.255.0',
+                               'gateway': '152.16.100.20',
+                               'if': 'xe0'},
+                              {'network': '152.16.40.20',
+                               'netmask': '255.255.255.0',
+                               'gateway': '152.16.40.20',
+                               'if': 'xe1'}],
                              'description': 'VPE approximation using DPDK',
                              'name': 'vpevnf-baremetal',
                              'nd_route_tbl':
@@ -63,49 +63,50 @@ class TestTrexTrafficGen(unittest.TestCase):
                              'id': 'vpevnf-baremetal',
                              'external-interface':
                                  [{'virtual-interface':
-                                       {'dst_mac': '00:00:00:00:00:04',
-                                        'vpci': '0000:05:00.0',
-                                        'local_ip': '152.16.100.19',
-                                        'type': 'PCI-PASSTHROUGH',
-                                        'netmask': '255.255.255.0',
-                                        'dpdk_port_num': 0,
-                                        'bandwidth': '10 Gbps',
-                                        'driver': "i40e",
-                                        'dst_ip': '152.16.100.20',
-                                        'local_iface_name': 'xe0',
-                                        'vld_id': 'downlink_0',
-                                        'ifname': 'xe0',
-                                        'local_mac': '00:00:00:00:00:02'},
+                                   {'dst_mac': '00:00:00:00:00:04',
+                                    'vpci': '0000:05:00.0',
+                                    'local_ip': '152.16.100.19',
+                                    'type': 'PCI-PASSTHROUGH',
+                                    'netmask': '255.255.255.0',
+                                    'dpdk_port_num': 0,
+                                    'bandwidth': '10 Gbps',
+                                    'driver': "i40e",
+                                    'dst_ip': '152.16.100.20',
+                                    'local_iface_name': 'xe0',
+                                    'vld_id': 'downlink_0',
+                                    'ifname': 'xe0',
+                                    'local_mac': '00:00:00:00:00:02'},
                                    'vnfd-connection-point-ref': 'xe0',
                                    'name': 'xe0'},
                                   {'virtual-interface':
-                                       {'dst_mac': '00:00:00:00:00:03',
-                                        'vpci': '0000:05:00.1',
-                                        'local_ip': '152.16.40.19',
-                                        'type': 'PCI-PASSTHROUGH',
-                                        'driver': "i40e",
-                                        'netmask': '255.255.255.0',
-                                        'dpdk_port_num': 1,
-                                        'bandwidth': '10 Gbps',
-                                        'dst_ip': '152.16.40.20',
-                                        'local_iface_name': 'xe1',
-                                        'vld_id': 'uplink_0',
-                                        'ifname': 'xe1',
-                                        'local_mac': '00:00:00:00:00:01'},
+                                   {'dst_mac': '00:00:00:00:00:03',
+                                    'vpci': '0000:05:00.1',
+                                    'local_ip': '152.16.40.19',
+                                    'type': 'PCI-PASSTHROUGH',
+                                    'driver': "i40e",
+                                    'netmask': '255.255.255.0',
+                                    'dpdk_port_num': 1,
+                                    'bandwidth': '10 Gbps',
+                                    'dst_ip': '152.16.40.20',
+                                    'local_iface_name': 'xe1',
+                                    'vld_id': 'uplink_0',
+                                    'ifname': 'xe1',
+                                    'local_mac': '00:00:00:00:00:01'},
                                    'vnfd-connection-point-ref': 'xe1',
                                    'name': 'xe1'}]}],
-                       'description': 'Vpe approximation using DPDK',
-                       'mgmt-interface':
-                           {'vdu-id': 'vpevnf-baremetal',
-                            'host': '1.1.1.1',
-                            'password': 'r00t',
+               'description': 'Vpe approximation using DPDK',
+               'mgmt-interface':
+               {'vdu-id': 'vpevnf-baremetal',
+                'host': '1.1.1.1',
+                'password': 'r00t',
                             'user': 'root',
                             'ip': '1.1.1.1'},
-                       'benchmark':
-                           {'kpi': ['packets_in', 'packets_fwd', 'packets_dropped']},
-                       'connection-point': [{'type': 'VPORT', 'name': 'xe0'},
-                                            {'type': 'VPORT', 'name': 'xe1'}],
-                       'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'}]}}
+               'benchmark':
+               {'kpi': ['packets_in', 'packets_fwd',
+                        'packets_dropped']},
+               'connection-point': [{'type': 'VPORT', 'name': 'xe0'},
+                                    {'type': 'VPORT', 'name': 'xe1'}],
+               'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'}]}}
 
     TRAFFIC_PROFILE = {
         "schema": "isb:traffic_profile:0.1",
@@ -301,7 +302,8 @@ class TestTrexTrafficGen(unittest.TestCase):
         mock_ssh(ssh)
         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
         trex_traffic_gen = TrexTrafficGen(NAME, vnfd)
-        self.assertIsInstance(trex_traffic_gen.resource_helper, TrexResourceHelper)
+        self.assertIsInstance(
+            trex_traffic_gen.resource_helper, TrexResourceHelper)
 
     @mock.patch(SSH_HELPER)
     def test_collect_kpi(self, ssh):
@@ -334,7 +336,8 @@ class TestTrexTrafficGen(unittest.TestCase):
         trex_traffic_gen.resource_helper.ssh_helper = mock.MagicMock()
         trex_traffic_gen.setup_helper.setup_vnf_environment = mock.MagicMock()
 
-        self.assertIsNone(trex_traffic_gen.instantiate(self.SCENARIO_CFG, self.CONTEXT_CFG))
+        self.assertIsNone(trex_traffic_gen.instantiate(
+            self.SCENARIO_CFG, self.CONTEXT_CFG))
 
     @mock.patch(SSH_HELPER)
     def test_instantiate_error(self, ssh):
@@ -349,7 +352,8 @@ class TestTrexTrafficGen(unittest.TestCase):
         trex_traffic_gen.ssh_helper = mock.MagicMock()
         trex_traffic_gen.resource_helper.ssh_helper = mock.MagicMock()
         trex_traffic_gen.setup_helper.setup_vnf_environment = mock.MagicMock()
-        self.assertIsNone(trex_traffic_gen.instantiate(self.SCENARIO_CFG, self.CONTEXT_CFG))
+        self.assertIsNone(trex_traffic_gen.instantiate(
+            self.SCENARIO_CFG, self.CONTEXT_CFG))
 
     @mock.patch(SSH_HELPER)
     def test__start_server(self, ssh):
@@ -368,7 +372,8 @@ class TestTrexTrafficGen(unittest.TestCase):
         trex_traffic_gen = TrexTrafficGen(NAME, vnfd)
         trex_traffic_gen.ssh_helper = mock.MagicMock()
         trex_traffic_gen.resource_helper.ssh_helper = mock.MagicMock()
-        trex_traffic_gen.scenario_helper.scenario_cfg = {"options": {NAME: {"queues_per_port": 2}}}
+        trex_traffic_gen.scenario_helper.scenario_cfg = {
+            "options": {NAME: {"queues_per_port": 2}}}
         self.assertIsNone(trex_traffic_gen._start_server())
 
     @mock.patch(SSH_HELPER)
@@ -406,42 +411,43 @@ class TestTrexTrafficGen(unittest.TestCase):
         vnfd = copy.deepcopy(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0])
         vnfd['vdu'][0]['external-interface'] = [
             {'virtual-interface':
-                 {'dst_mac': '00:00:00:00:00:04',
-                  'vpci': '0000:05:00.0',
-                  'local_ip': '152.16.100.19',
-                  'type': 'PCI-PASSTHROUGH',
-                  'netmask': '255.255.255.0',
-                  'dpdk_port_num': 2,
-                  'bandwidth': '10 Gbps',
-                  'driver': "i40e",
-                  'dst_ip': '152.16.100.20',
-                  'local_iface_name': 'xe0',
-                  'vld_id': 'downlink_0',
-                  'ifname': 'xe0',
-                  'local_mac': '00:00:00:00:00:02'},
+             {'dst_mac': '00:00:00:00:00:04',
+              'vpci': '0000:05:00.0',
+              'local_ip': '152.16.100.19',
+              'type': 'PCI-PASSTHROUGH',
+              'netmask': '255.255.255.0',
+              'dpdk_port_num': 2,
+              'bandwidth': '10 Gbps',
+              'driver': "i40e",
+              'dst_ip': '152.16.100.20',
+              'local_iface_name': 'xe0',
+              'vld_id': 'downlink_0',
+              'ifname': 'xe0',
+              'local_mac': '00:00:00:00:00:02'},
              'vnfd-connection-point-ref': 'xe0',
              'name': 'xe0'},
             {'virtual-interface':
-                 {'dst_mac': '00:00:00:00:00:03',
-                  'vpci': '0000:04:00.0',
-                  'local_ip': '152.16.40.19',
-                  'type': 'PCI-PASSTHROUGH',
-                  'driver': "i40e",
-                  'netmask': '255.255.255.0',
-                  'dpdk_port_num': 0,
-                  'bandwidth': '10 Gbps',
-                  'dst_ip': '152.16.40.20',
-                  'local_iface_name': 'xe1',
-                  'vld_id': 'uplink_0',
-                  'ifname': 'xe1',
-                  'local_mac': '00:00:00:00:00:01'},
+             {'dst_mac': '00:00:00:00:00:03',
+              'vpci': '0000:04:00.0',
+              'local_ip': '152.16.40.19',
+              'type': 'PCI-PASSTHROUGH',
+              'driver': "i40e",
+              'netmask': '255.255.255.0',
+              'dpdk_port_num': 0,
+              'bandwidth': '10 Gbps',
+              'dst_ip': '152.16.40.20',
+              'local_iface_name': 'xe1',
+              'vld_id': 'uplink_0',
+              'ifname': 'xe1',
+              'local_mac': '00:00:00:00:00:01'},
              'vnfd-connection-point-ref': 'xe1',
              'name': 'xe1'}]
         trex_traffic_gen = TrexTrafficGen(NAME, vnfd)
         trex_traffic_gen.resource_helper.ssh_helper = mock.MagicMock()
         trex_traffic_gen.resource_helper.generate_cfg()
         trex_traffic_gen.resource_helper._build_ports()
-        self.assertEqual(sorted(trex_traffic_gen.resource_helper.all_ports), [0, 1])
+        self.assertEqual(
+            sorted(trex_traffic_gen.resource_helper.all_ports), [0, 1])
         # there is a gap in ordering
         self.assertEqual(dict(trex_traffic_gen.resource_helper.dpdk_to_trex_port_map),
                          {0: 0, 2: 1})
@@ -17,8 +17,8 @@ import unittest
 import mock
 import os
 
-from tests.unit import STL_MOCKS
-from tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh
+from yardstick.tests import STL_MOCKS
+from yardstick.tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh
 
 
 SSH_HELPER = 'yardstick.network_services.vnf_generic.vnf.sample_vnf.VnfSshHelper'
@@ -335,16 +335,18 @@ class TestUdpReplayApproxVnf(unittest.TestCase):
         mock_ssh(ssh)
 
         vnfd = self.VNFD_0
-        result = "stats\r\r\n\r\nUDP_Replay stats:\r\n--------------\r\n" \
-                 "Port\t\tRx Packet\t\tTx Packet\t\tRx Pkt Drop\t\tTx Pkt Drop \r\n"\
-                 "0\t\t7374156\t\t7374136\t\t\t0\t\t\t0\r\n" \
-                 "1\t\t7374316\t\t7374315\t\t\t0\t\t\t0\r\n\r\nReplay>\r\r\nReplay>"
+        get_stats_ret_val = \
+            "stats\r\r\n\r\nUDP_Replay stats:\r\n--------------\r\n" \
+            "Port\t\tRx Packet\t\tTx Packet\t\tRx Pkt Drop\t\tTx Pkt Drop \r\n"\
+            "0\t\t7374156\t\t7374136\t\t\t0\t\t\t0\r\n" \
+            "1\t\t7374316\t\t7374315\t\t\t0\t\t\t0\r\n\r\nReplay>\r\r\nReplay>"
         udp_replay_approx_vnf = UdpReplayApproxVnf(NAME, vnfd)
         udp_replay_approx_vnf.q_in = mock.MagicMock()
         udp_replay_approx_vnf.q_out = mock.MagicMock()
         udp_replay_approx_vnf.q_out.qsize = mock.Mock(return_value=0)
         udp_replay_approx_vnf.all_ports = ["xe0", "xe1"]
-        udp_replay_approx_vnf.get_stats = mock.Mock(return_value=result)
+        udp_replay_approx_vnf.get_stats = mock.Mock(return_value=get_stats_ret_val)
+
         result = {'collect_stats': {}, 'packets_dropped': 0,
                   'packets_fwd': 14748451, 'packets_in': 14748472}
         self.assertEqual(result, udp_replay_approx_vnf.collect_kpi())
@@ -17,8 +17,8 @@ import unittest
 import mock
 import os
 
-from tests.unit import STL_MOCKS
-from tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh
+from yardstick.tests import STL_MOCKS
+from yardstick.tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh
 
 from yardstick.common import utils
 
@@ -253,9 +253,9 @@ VFW TOTAL: pkts_received: 6007180, "pkts_fw_forwarded": 6007180, "pkts_drop_fw":
 "CT TOTAL: ct_packets_forwarded" : 6007180, " ct_packets_dropped" : 0, "ct_sessions" : {"active" : 130050, "open_attempt" : 130050, "re-open_attempt" : 0, "established" : 0, "closed" : 0, "timeout" : 0}, "ct_drops" : {"out_of_window" : 0, "invalid_conn" : 0, "invalid_state_transition" : 0 "RST" : 0}
 Action ID: 00, packetCount: 2954633, byteCount: 177277980
 Action ID: 01, packetCount: 3052547, byteCount: 183152820
-pipeline> 
+pipeline>
 
-pipeline> 
+pipeline>
 """  # noqa
 
     @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time")
@@ -21,9 +21,9 @@ import mock
 from six.moves import configparser
 import unittest
 
-from tests.unit import STL_MOCKS
-from tests.unit.network_services.vnf_generic.vnf.test_base import FileAbsPath
-from tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh
+from yardstick.tests import STL_MOCKS
+from yardstick.tests.unit.network_services.vnf_generic.vnf.test_base import FileAbsPath
+from yardstick.tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh
 from yardstick.network_services.vnf_generic.vnf.base import QueueFileWrapper
 from yardstick.network_services.vnf_generic.vnf.base import VnfdHelper
 
@@ -536,7 +536,12 @@ class TestVpeApproxVnf(unittest.TestCase):
     }
 
     def setUp(self):
-        self.mock_sleep = mock.patch.object(time, 'sleep').start()
+        self._mock_time_sleep = mock.patch.object(time, 'sleep')
+        self.mock_time_sleep = self._mock_time_sleep.start()
+        self.addCleanup(self._stop_mocks)
+
+    def _stop_mocks(self):
+        self._mock_time_sleep.stop()
 
     def test___init__(self):
         vpe_approx_vnf = VpeApproxVnf(NAME, self.VNFD_0)
@@ -631,7 +636,7 @@ class TestVpeApproxVnf(unittest.TestCase):
     @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.MultiPortConfig")
     @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.Context")
     @mock.patch("yardstick.network_services.vnf_generic.vnf.vpe_vnf.ConfigCreate")
-    @mock.patch("yardstick.network_services.vnf_generic.vnf.vpe_vnf.open")
+    @mock.patch("six.moves.builtins.open")
     @mock.patch(SSH_HELPER)
     def test_build_config(self, ssh, *args):
         mock_ssh(ssh)
index 4af9a39..be4882e 100644 (file)
@@ -6,16 +6,16 @@
 # which accompanies this distribution, and is available at
 # http://www.apache.org/licenses/LICENSE-2.0
 ##############################################################################
-import unittest
 
 import mock
 
+from yardstick.common.exceptions import UnsupportedPodFormatError
 from yardstick.service.environment import Environment
 from yardstick.service.environment import AnsibleCommon
-from yardstick.common.exceptions import UnsupportedPodFormatError
+from yardstick.tests.unit import base as ut_base
 
 
-class EnvironmentTestCase(unittest.TestCase):
+class EnvironmentTestCase(ut_base.BaseUnitTestCase):
 
     def test_get_sut_info(self):
         pod_info = {
@@ -31,11 +31,11 @@ class EnvironmentTestCase(unittest.TestCase):
             ]
         }
 
-        AnsibleCommon.gen_inventory_ini_dict = mock.MagicMock()
-        AnsibleCommon.get_sut_info = mock.MagicMock(return_value={'node1': {}})
-
-        env = Environment(pod=pod_info)
-        env.get_sut_info()
+        with mock.patch.object(AnsibleCommon, 'gen_inventory_ini_dict'), \
+                mock.patch.object(AnsibleCommon, 'get_sut_info',
+                                  return_value={'node1': {}}):
+            env = Environment(pod=pod_info)
+            env.get_sut_info()
 
     def test_get_sut_info_pod_str(self):
         pod_info = 'nodes'
@@ -43,7 +43,3 @@ class EnvironmentTestCase(unittest.TestCase):
         env = Environment(pod=pod_info)
         with self.assertRaises(UnsupportedPodFormatError):
             env.get_sut_info()
-
-
-if __name__ == '__main__':
-    unittest.main()
index d64b0c5..5de8922 100644 (file)
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
-#
 
-from __future__ import absolute_import
-import unittest
-import mock
-import subprocess
+import argparse
 import os
+import subprocess
+
+import mock
+from six.moves import builtins
+import unittest
 
-from yardstick.cmd.NSBperf import YardstickNSCli
 from yardstick.cmd import NSBperf
 
 
@@ -32,30 +32,39 @@ class TestHandler(unittest.TestCase):
 
 
 class TestYardstickNSCli(unittest.TestCase):
+
+    def setUp(self):
+        self._mock_print = mock.patch.object(builtins, 'print')
+        self.mock_print = self._mock_print.start()
+        self.addCleanup(self._stop_mocks)
+
+    def _stop_mocks(self):
+        self._mock_print.stop()
+
     def test___init__(self):
-        yardstick_ns_cli = YardstickNSCli()
+        yardstick_ns_cli = NSBperf.YardstickNSCli()
         self.assertIsNotNone(yardstick_ns_cli)
 
     def test_generate_final_report(self):
-        yardstick_ns_cli = YardstickNSCli()
+        yardstick_ns_cli = NSBperf.YardstickNSCli()
         test_case = "tc_baremetal_rfc2544_ipv4_1flow_1518B.yaml"
         if os.path.isfile("/tmp/yardstick.out"):
             os.remove('/tmp/yardstick.out')
         self.assertIsNone(yardstick_ns_cli.generate_final_report(test_case))
 
     def test_generate_kpi_results(self):
-        yardstick_ns_cli = YardstickNSCli()
+        yardstick_ns_cli = NSBperf.YardstickNSCli()
         tkey = "cpu"
         tgen = {"cpu": {"ipc": 0}}
         self.assertIsNone(yardstick_ns_cli.generate_kpi_results(tkey, tgen))
 
     def test_generate_nfvi_results(self):
-        yardstick_ns_cli = YardstickNSCli()
+        yardstick_ns_cli = NSBperf.YardstickNSCli()
         nfvi = {"collect_stats": {"cpu": {"ipc": 0, "Hz": 2.6}}}
         self.assertIsNone(yardstick_ns_cli.generate_nfvi_results(nfvi))
 
     def test_handle_list_options(self):
-        yardstick_ns_cli = YardstickNSCli()
+        yardstick_ns_cli = NSBperf.YardstickNSCli()
         CLI_PATH = os.path.dirname(os.path.realpath(__file__))
         repo_dir = CLI_PATH + "/../../../"
         test_path = os.path.join(repo_dir, "../samples/vnf_samples/nsut/")
@@ -68,16 +77,21 @@ class TestYardstickNSCli(unittest.TestCase):
                           args, test_path)
 
     def test_main(self):
-        yardstick_ns_cli = YardstickNSCli()
+        yardstick_ns_cli = NSBperf.YardstickNSCli()
         yardstick_ns_cli.parse_arguments = mock.Mock(return_value=0)
         yardstick_ns_cli.handle_list_options = mock.Mock(return_value=0)
         yardstick_ns_cli.terminate_if_less_options = mock.Mock(return_value=0)
         yardstick_ns_cli.run_test = mock.Mock(return_value=0)
         self.assertIsNone(yardstick_ns_cli.main())
 
-    def test_parse_arguments(self):
-        yardstick_ns_cli = YardstickNSCli()
-        self.assertRaises(SystemExit, yardstick_ns_cli.parse_arguments)
+    @mock.patch.object(argparse.ArgumentParser, 'parse_args')
+    def test_parse_arguments(self, mock_parse):
+        class DummyArgs(object):
+            var1 = 'value1'
+
+        mock_parse.return_value = DummyArgs
+        yardstick_ns_cli = NSBperf.YardstickNSCli()
+        self.assertIn('var1', yardstick_ns_cli.parse_arguments())
 
     def test_run_test(self):
         cur_dir = os.getcwd()
@@ -85,7 +99,7 @@ class TestYardstickNSCli(unittest.TestCase):
         YARDSTICK_REPOS_DIR = os.path.join(CLI_PATH + "/../../")
         test_path = os.path.join(YARDSTICK_REPOS_DIR,
                                  "../samples/vnf_samples/nsut/")
-        yardstick_ns_cli = YardstickNSCli()
+        yardstick_ns_cli = NSBperf.YardstickNSCli()
         subprocess.check_output = mock.Mock(return_value=0)
         args = {"vnf": "vpe",
                 "test": "tc_baremetal_rfc2544_ipv4_1flow_1518B.yaml"}
@@ -103,13 +117,13 @@ class TestYardstickNSCli(unittest.TestCase):
         os.chdir(cur_dir)
 
     def test_terminate_if_less_options(self):
-        yardstick_ns_cli = YardstickNSCli()
+        yardstick_ns_cli = NSBperf.YardstickNSCli()
         args = {"vnf": False}
         self.assertRaises(SystemExit,
                           yardstick_ns_cli.terminate_if_less_options, args)
 
     def test_validate_input(self):
-        yardstick_ns_cli = YardstickNSCli()
+        yardstick_ns_cli = NSBperf.YardstickNSCli()
         self.assertEqual(1, yardstick_ns_cli.validate_input("", 4))
         NSBperf.input = lambda _: 'yes'
         self.assertEqual(1, yardstick_ns_cli.validate_input(5, 4))
index f922900..080d278 100644 (file)
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
-# yardstick comment: this file is a modified copy of
-# rally/tests/unit/common/test_sshutils.py
-
-from __future__ import absolute_import
 import os
 import socket
 import unittest
@@ -26,8 +22,8 @@ from itertools import count
 import mock
 from oslo_utils import encodeutils
 
+from yardstick.common import exceptions
 from yardstick import ssh
-from yardstick.ssh import SSHError, SSHTimeout
 from yardstick.ssh import SSH
 from yardstick.ssh import AutoConnectSSH
 
@@ -127,7 +123,7 @@ class SSHTestCase(unittest.TestCase):
         dss = mock_paramiko.dsskey.DSSKey
         rsa.from_private_key.side_effect = mock_paramiko.SSHException
         dss.from_private_key.side_effect = mock_paramiko.SSHException
-        self.assertRaises(ssh.SSHError, self.test_client._get_pkey, "key")
+        self.assertRaises(exceptions.SSHError, self.test_client._get_pkey, "key")
 
     @mock.patch("yardstick.ssh.six.moves.StringIO")
     @mock.patch("yardstick.ssh.paramiko")
@@ -194,7 +190,7 @@ class SSHTestCase(unittest.TestCase):
 
         test_ssh = ssh.SSH("admin", "example.net", pkey="key")
 
-        with self.assertRaises(SSHError) as raised:
+        with self.assertRaises(exceptions.SSHError) as raised:
             test_ssh._get_client()
 
         self.assertEqual(mock_paramiko.SSHClient.call_count, 1)
@@ -245,18 +241,18 @@ class SSHTestCase(unittest.TestCase):
     @mock.patch("yardstick.ssh.time")
     def test_wait_timeout(self, mock_time):
         mock_time.time.side_effect = [1, 50, 150]
-        self.test_client.execute = mock.Mock(side_effect=[ssh.SSHError,
-                                                          ssh.SSHError,
+        self.test_client.execute = mock.Mock(side_effect=[exceptions.SSHError,
+                                                          exceptions.SSHError,
                                                           0])
-        self.assertRaises(ssh.SSHTimeout, self.test_client.wait)
+        self.assertRaises(exceptions.SSHTimeout, self.test_client.wait)
         self.assertEqual([mock.call("uname")] * 2,
                          self.test_client.execute.mock_calls)
 
     @mock.patch("yardstick.ssh.time")
     def test_wait(self, mock_time):
         mock_time.time.side_effect = [1, 50, 100]
-        self.test_client.execute = mock.Mock(side_effect=[ssh.SSHError,
-                                                          ssh.SSHError,
+        self.test_client.execute = mock.Mock(side_effect=[exceptions.SSHError,
+                                                          exceptions.SSHError,
                                                           0])
         self.test_client.wait()
         self.assertEqual([mock.call("uname")] * 3,
@@ -333,7 +329,7 @@ class SSHRunTestCase(unittest.TestCase):
     def test_run_nonzero_status(self, mock_select):
         mock_select.select.return_value = ([], [], [])
         self.fake_session.recv_exit_status.return_value = 1
-        self.assertRaises(ssh.SSHError, self.test_client.run, "cmd")
+        self.assertRaises(exceptions.SSHError, self.test_client.run, "cmd")
         self.assertEqual(1, self.test_client.run("cmd", raise_on_error=False))
 
     @mock.patch("yardstick.ssh.select")
@@ -401,7 +397,7 @@ class SSHRunTestCase(unittest.TestCase):
     def test_run_select_error(self, mock_select):
         self.fake_session.exit_status_ready.return_value = False
         mock_select.select.return_value = ([], [], [True])
-        self.assertRaises(ssh.SSHError, self.test_client.run, "cmd")
+        self.assertRaises(exceptions.SSHError, self.test_client.run, "cmd")
 
     @mock.patch("yardstick.ssh.time")
     @mock.patch("yardstick.ssh.select")
@@ -409,7 +405,7 @@ class SSHRunTestCase(unittest.TestCase):
         mock_time.time.side_effect = [1, 3700]
         mock_select.select.return_value = ([], [], [])
         self.fake_session.exit_status_ready.return_value = False
-        self.assertRaises(ssh.SSHTimeout, self.test_client.run, "cmd")
+        self.assertRaises(exceptions.SSHTimeout, self.test_client.run, "cmd")
 
     @mock.patch("yardstick.ssh.open", create=True)
     def test__put_file_shell(self, mock_open):
@@ -529,9 +525,9 @@ class TestAutoConnectSSH(unittest.TestCase):
 
         auto_connect_ssh = AutoConnectSSH('user1', 'host1', wait=10)
         auto_connect_ssh._get_client = mock__get_client = mock.Mock()
-        mock__get_client.side_effect = SSHError
+        mock__get_client.side_effect = exceptions.SSHError
 
-        with self.assertRaises(SSHTimeout):
+        with self.assertRaises(exceptions.SSHTimeout):
             auto_connect_ssh._connect()
 
         self.assertEqual(mock_time.time.call_count, 12)