aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore6
-rw-r--r--.gitlab-ci.yml76
-rw-r--r--INFO.yaml52
-rw-r--r--README.rst28
-rw-r--r--behave_tests/__init__.py (renamed from docs/testing/developer/devguide/index.rst)0
-rw-r--r--behave_tests/behavedriver.py70
-rw-r--r--behave_tests/features/__init__.py (renamed from docs/testing/user/configguide/configguide.rst)0
-rw-r--r--behave_tests/features/characterization-full.feature69
-rw-r--r--behave_tests/features/characterization-samples.feature42
-rw-r--r--behave_tests/features/environment.py88
-rw-r--r--behave_tests/features/non-regression.feature45
-rw-r--r--behave_tests/features/quick-test-10kpps.feature13
-rw-r--r--behave_tests/features/steps/__init__.py0
-rw-r--r--behave_tests/features/steps/steps.py629
-rw-r--r--behave_tests/features/steps/testapi.py195
-rw-r--r--cleanup/__init__.py13
-rw-r--r--cleanup/nfvbench_cleanup.py594
-rw-r--r--client/client.py36
-rw-r--r--client/nfvbench_client.py5
-rw-r--r--client/requirements.txt6
-rw-r--r--docker/Dockerfile53
-rwxr-xr-xdocker/cleanup_generators.py14
-rwxr-xr-xdocker/nfvbench-entrypoint.sh14
-rw-r--r--docs/Makefile231
-rw-r--r--docs/conf.py68
-rw-r--r--docs/developer/building.rst77
-rw-r--r--docs/developer/design/design.rst (renamed from docs/development/design/design.rst)38
-rw-r--r--docs/developer/design/index.rst (renamed from docs/development/design/index.rst)8
-rw-r--r--docs/developer/design/ndrpdr.rst83
-rw-r--r--docs/developer/design/overview.rst (renamed from docs/development/overview/overview.rst)12
-rw-r--r--docs/developer/design/traffic_desc.rst85
-rw-r--r--docs/developer/design/versioning.rst (renamed from docs/development/design/versioning.rst)10
-rw-r--r--docs/developer/index.rst (renamed from docs/development/index.rst)8
-rw-r--r--docs/developer/nfvbenchvm.rst365
-rw-r--r--docs/developer/testing-nfvbench.rst91
-rw-r--r--docs/development/design/ndrpdr.rst44
-rw-r--r--docs/development/overview/index.rst13
-rw-r--r--docs/index.rst12
-rw-r--r--docs/make.bat35
-rw-r--r--docs/release-notes/index.rst (renamed from docs/release/release-notes/index.rst)9
-rw-r--r--docs/release-notes/nfvbench-release-notes.rst147
-rw-r--r--docs/release-notes/nfvbenchvm-release-notes.rst94
-rw-r--r--docs/release/release-notes/release-notes.rst40
-rw-r--r--docs/requirements.txt7
-rw-r--r--docs/testing/index.rst11
-rw-r--r--docs/testing/user/configguide/index.rst9
-rw-r--r--docs/testing/user/userguide/_static/custom.css4
-rw-r--r--docs/testing/user/userguide/_templates/layout.html5
-rw-r--r--docs/testing/user/userguide/advanced.rst359
-rw-r--r--docs/testing/user/userguide/conf.py358
-rw-r--r--docs/testing/user/userguide/faq.rst44
-rw-r--r--docs/testing/user/userguide/quickstart_docker.rst241
-rw-r--r--docs/testing/user/userguide/sriov.rst63
-rw-r--r--docs/user/advanced.rst897
-rw-r--r--docs/user/examples.rst (renamed from docs/testing/user/userguide/examples.rst)0
-rw-r--r--docs/user/extchains.rst77
-rw-r--r--docs/user/faq.rst95
-rw-r--r--docs/user/fluentd.rst (renamed from docs/testing/user/userguide/fluentd.rst)1
-rw-r--r--docs/user/hw_requirements.rst (renamed from docs/testing/user/userguide/hw_requirements.rst)7
-rw-r--r--docs/user/images/extchain-config.png (renamed from docs/testing/user/userguide/images/extchain-config.png)bin227354 -> 227354 bytes
-rw-r--r--docs/user/images/nfvbench-all-sriov-pvvp.png (renamed from docs/testing/user/userguide/images/nfvbench-all-sriov-pvvp.png)bin34850 -> 34850 bytes
-rw-r--r--docs/user/images/nfvbench-all-sriov-pvvp2.png (renamed from docs/testing/user/userguide/images/nfvbench-all-sriov-pvvp2.png)bin44379 -> 44379 bytes
-rw-r--r--docs/user/images/nfvbench-ext-multi-vlans.pngbin0 -> 120315 bytes
-rw-r--r--docs/user/images/nfvbench-ext-shared.pngbin0 -> 100743 bytes
-rw-r--r--docs/user/images/nfvbench-kibana-filter-kql.pngbin0 -> 27039 bytes
-rw-r--r--docs/user/images/nfvbench-kibana-filter.pngbin0 -> 22998 bytes
-rw-r--r--docs/user/images/nfvbench-kibana-gbps-line.pngbin0 -> 61856 bytes
-rw-r--r--docs/user/images/nfvbench-kibana-pps-scatter.pngbin0 -> 56762 bytes
-rw-r--r--docs/user/images/nfvbench-kibana-pps-theoretical.pngbin0 -> 60589 bytes
-rw-r--r--docs/user/images/nfvbench-kibana-zoom-selection.pngbin0 -> 54663 bytes
-rw-r--r--docs/user/images/nfvbench-kibana.pngbin0 -> 23015 bytes
-rw-r--r--docs/user/images/nfvbench-npvp.png (renamed from docs/testing/user/userguide/images/nfvbench-npvp.png)bin30328 -> 30328 bytes
-rw-r--r--docs/user/images/nfvbench-pvp.png (renamed from docs/testing/user/userguide/images/nfvbench-pvp.png)bin20770 -> 20770 bytes
-rw-r--r--docs/user/images/nfvbench-pvpl3.pngbin0 -> 45570 bytes
-rw-r--r--docs/user/images/nfvbench-pvvp.png (renamed from docs/testing/user/userguide/images/nfvbench-pvvp.png)bin31338 -> 31338 bytes
-rw-r--r--docs/user/images/nfvbench-pvvp2.png (renamed from docs/testing/user/userguide/images/nfvbench-pvvp2.png)bin42583 -> 42583 bytes
-rw-r--r--docs/user/images/nfvbench-sriov-pvp.png (renamed from docs/testing/user/userguide/images/nfvbench-sriov-pvp.png)bin19982 -> 19982 bytes
-rw-r--r--docs/user/images/nfvbench-sriov-pvvp.png (renamed from docs/testing/user/userguide/images/nfvbench-sriov-pvvp.png)bin31769 -> 31769 bytes
-rw-r--r--docs/user/images/nfvbench-sriov-pvvp2.png (renamed from docs/testing/user/userguide/images/nfvbench-sriov-pvvp2.png)bin44101 -> 44101 bytes
-rw-r--r--docs/user/images/nfvbench-trex-setup.png (renamed from docs/testing/user/userguide/images/nfvbench-trex-setup.png)bin34090 -> 34090 bytes
-rw-r--r--docs/user/images/nfvbench-xtesting.pngbin0 -> 17342 bytes
-rw-r--r--docs/user/index.rst (renamed from docs/testing/user/userguide/index.rst)12
-rw-r--r--docs/user/installation.rst (renamed from docs/testing/user/userguide/installation.rst)0
-rw-r--r--docs/user/kibana.rst96
-rw-r--r--docs/user/mpls.rst96
-rw-r--r--docs/user/pvpl3.rst69
-rw-r--r--docs/user/quickstart_docker.rst333
-rw-r--r--docs/user/readme.rst (renamed from docs/testing/user/userguide/readme.rst)109
-rw-r--r--docs/user/server.rst (renamed from docs/testing/user/userguide/server.rst)126
-rw-r--r--docs/user/sriov.rst462
-rw-r--r--docs/user/xtesting.rst252
-rw-r--r--kibana/visualizations/export.ndjson25
-rw-r--r--kibana/visualizations/ndr_capacity_gbps_line_chart.json95
-rw-r--r--kibana/visualizations/ndr_capacity_gbps_scatter_plot.json108
-rw-r--r--kibana/visualizations/ndr_capacity_gbps_theoretical_line_chart.json114
-rw-r--r--kibana/visualizations/ndr_capacity_gbps_theoretical_scatter_plot.json128
-rw-r--r--kibana/visualizations/ndr_capacity_pps_line_chart.json98
-rw-r--r--kibana/visualizations/ndr_capacity_pps_scatter_plot.json108
-rw-r--r--kibana/visualizations/ndr_capacity_pps_theoretical_line_chart.json115
-rw-r--r--kibana/visualizations/ndr_capacity_pps_theoretical_scatter_plot.json128
-rw-r--r--nfvbench/cfg.default.yaml712
-rw-r--r--nfvbench/chain_clients.py596
-rw-r--r--nfvbench/chain_managers.py244
-rw-r--r--nfvbench/chain_router.py190
-rw-r--r--nfvbench/chain_runner.py224
-rw-r--r--nfvbench/chain_workers.py47
-rw-r--r--nfvbench/chaining.py1559
-rw-r--r--nfvbench/cleanup.py305
-rw-r--r--nfvbench/compute.py382
-rw-r--r--nfvbench/config.py16
-rw-r--r--nfvbench/config_plugin.py48
-rw-r--r--nfvbench/credentials.py112
-rw-r--r--nfvbench/factory.py50
-rw-r--r--nfvbench/fluentd.py15
-rw-r--r--nfvbench/network.py62
-rw-r--r--nfvbench/nfvbench.py702
-rw-r--r--nfvbench/nfvbenchd.py141
-rw-r--r--nfvbench/nfvbenchvm/nfvbenchvm.conf5
-rw-r--r--nfvbench/packet_analyzer.py64
-rw-r--r--nfvbench/packet_stats.py341
-rw-r--r--nfvbench/service_chain.py141
-rw-r--r--nfvbench/specs.py20
-rw-r--r--nfvbench/stats_collector.py51
-rw-r--r--nfvbench/stats_manager.py101
-rw-r--r--nfvbench/summarizer.py355
-rw-r--r--nfvbench/tor_client.py52
-rwxr-xr-x[-rw-r--r--]nfvbench/traffic_client.py1301
-rw-r--r--nfvbench/traffic_gen/dummy.py99
-rw-r--r--nfvbench/traffic_gen/traffic_base.py147
-rw-r--r--nfvbench/traffic_gen/traffic_utils.py53
-rw-r--r--nfvbench/traffic_gen/trex.py460
-rw-r--r--nfvbench/traffic_gen/trex_gen.py1208
-rw-r--r--nfvbench/traffic_server.py159
-rw-r--r--nfvbench/utils.py213
-rw-r--r--nfvbenchvm/README.rst86
-rwxr-xr-xnfvbenchvm/dib/build-image.sh268
-rw-r--r--nfvbenchvm/dib/elements/nfvbenchvm/element-deps1
-rw-r--r--nfvbenchvm/dib/elements/nfvbenchvm/fdio-release.repo12
-rwxr-xr-xnfvbenchvm/dib/elements/nfvbenchvm/finalise.d/51-add-cpu-isolation12
-rwxr-xr-xnfvbenchvm/dib/elements/nfvbenchvm/finalise.d/52-change-resolution7
-rwxr-xr-xnfvbenchvm/dib/elements/nfvbenchvm/finalise.d/53-boot-from-new-kernel7
-rw-r--r--nfvbenchvm/dib/elements/nfvbenchvm/package-installs.yaml8
-rwxr-xr-xnfvbenchvm/dib/elements/nfvbenchvm/post-install.d/01-update-kernel7
-rwxr-xr-xnfvbenchvm/dib/elements/nfvbenchvm/post-install.d/02-pip-package12
-rwxr-xr-xnfvbenchvm/dib/elements/nfvbenchvm/post-install.d/02-testpmd-script26
-rwxr-xr-xnfvbenchvm/dib/elements/nfvbenchvm/post-install.d/03-add-execute-attribute4
-rwxr-xr-xnfvbenchvm/dib/elements/nfvbenchvm/post-install.d/03-copy-rc-local15
-rwxr-xr-xnfvbenchvm/dib/elements/nfvbenchvm/post-install.d/04-add-execute-attribute14
-rwxr-xr-xnfvbenchvm/dib/elements/nfvbenchvm/post-install.d/50-pip-package8
-rwxr-xr-xnfvbenchvm/dib/elements/nfvbenchvm/post-install.d/51-cloudcfg-edit5
-rwxr-xr-xnfvbenchvm/dib/elements/nfvbenchvm/post-install.d/52-nfvbench-script56
-rwxr-xr-xnfvbenchvm/dib/elements/nfvbenchvm/post-install.d/53-sshd-script11
-rwxr-xr-xnfvbenchvm/dib/elements/nfvbenchvm/post-install.d/99-cleanup9
-rw-r--r--nfvbenchvm/dib/elements/nfvbenchvm/static/etc/modprobe.d/vfio.conf1
-rw-r--r--nfvbenchvm/dib/elements/nfvbenchvm/static/etc/modules-load.d/vfio-pci.conf1
-rw-r--r--nfvbenchvm/dib/elements/nfvbenchvm/static/etc/openstack/clouds.yaml1
-rw-r--r--nfvbenchvm/dib/elements/nfvbenchvm/static/etc/profile.d/nfvbench.sh1
-rw-r--r--nfvbenchvm/dib/elements/nfvbenchvm/static/etc/rc.d/rc.local112
-rw-r--r--nfvbenchvm/dib/elements/nfvbenchvm/static/etc/rc.d/rc.local.generator122
-rw-r--r--nfvbenchvm/dib/elements/nfvbenchvm/static/etc/rc.d/rc.local.loopvm298
-rw-r--r--nfvbenchvm/dib/elements/nfvbenchvm/static/etc/systemd/system/nfvbench.service12
-rw-r--r--nfvbenchvm/dib/elements/nfvbenchvm/static/nfvbench/configure-nfvbench.sh258
-rw-r--r--nfvbenchvm/dib/elements/nfvbenchvm/static/nfvbench/nfvbench.conf25
-rw-r--r--nfvbenchvm/dib/elements/nfvbenchvm/static/nfvbench/start-nfvbench.sh51
-rw-r--r--nfvbenchvm/dib/elements/nfvbenchvm/static/vpp/startup.conf4
-rw-r--r--nfvbenchvm/dib/verify-image.sh7
-rw-r--r--pylint.rc44
-rw-r--r--requirements-dev.txt17
-rw-r--r--requirements.txt39
-rw-r--r--setup.cfg8
-rw-r--r--setup.py28
-rw-r--r--test-requirements.txt29
-rw-r--r--test/mock_trex.py82
-rw-r--r--test/test_chains.py505
-rw-r--r--test/test_nfvbench.py1284
-rw-r--r--test/ut_behave_tests/__init__.py1
-rw-r--r--test/ut_behave_tests/test_data/project=nfvbench&case=characterization&criteria=PASS&page=1.json48702
-rw-r--r--test/ut_behave_tests/test_data/project=nfvbench&case=characterization&criteria=PASS&page=2.json25065
-rw-r--r--test/ut_behave_tests/test_data/project=nfvbench&case=non-regression&criteria=PASS&page=1.json8124
-rw-r--r--test/ut_behave_tests/test_steps.py151
-rw-r--r--test/ut_behave_tests/test_testapi.py132
-rw-r--r--test/ut_behave_tests/test_utils.py119
-rw-r--r--tox.ini69
-rw-r--r--xtesting/ansible/host_vars/127.0.0.110
-rw-r--r--xtesting/ansible/site.yml22
-rw-r--r--xtesting/testcases.yaml101
186 files changed, 98139 insertions, 6199 deletions
diff --git a/.gitignore b/.gitignore
index 322c5b2..93ef7df 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,17 +1,19 @@
.DS_store
*.pyc
+*~
.idea
.tox
.cache
.eggs
+.vscode
+.pytest_cache/
venv
nfvbench.egg-info
nfvbenchvm/dib/dib-venv
nfvbenchvm/dib/nfvbenchvm_centos-*.d/
*.qcow2
-docs/_build
-docs/conf.py
docs/_static
build/
AUTHORS
ChangeLog
+docs/_build/*
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000..32e3299
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,76 @@
+# NFVBench Gitlab-CI Jobs
+---
+include:
+ - project: anuket/releng
+ file: '/gitlab-templates/RTD.gitlab-ci.yml'
+ - project: anuket/releng
+ file: '/gitlab-templates/Docker.gitlab-ci.yml'
+ - project: anuket/releng
+ file: '/gitlab-templates/GoogleStorage.gitlab-ci.yml'
+
+variables:
+ DOCKER_REGISTRY: docker.io
+
+.tox-defaults: &tox-defaults
+ stage: test
+ image: python:3.8
+ before_script:
+ - pip install tox==3.21.4
+ cache:
+ paths:
+ - .cache/pip
+ - venv/
+ rules:
+ - if: $CI_PIPELINE_SOURCE == "merge_request_event" || $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+
+pep8:
+ <<: *tox-defaults
+ stage: build
+ script:
+ tox -e pep8
+
+tox-py38:
+ <<: *tox-defaults
+ script:
+ tox -e py38
+
+verify-image:
+ stage: build
+ image: centos:7
+ before_script:
+ - yum -y install python3 qemu-img kpartx sudo e2fsprogs
+ - python3 -m venv venv
+ script:
+ - source venv/bin/activate
+ - !reference [.gsutil-install, script]
+ - cd nfvbenchvm/dib
+ - |
+ echo -e "\e[0Ksection_start:`date +%s`:build_image\r\e[0KBuild Image"
+ bash verify-image.sh -v
+ echo -e "\e[0Ksection_end:`date +%s`:build_image\r\e[0K"
+ rules:
+ - if: $CI_PIPELINE_SOURCE == "merge_request_event" || $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+
+build-image:
+ stage: deploy
+ image: centos:7
+ before_script:
+ - yum -y install python3 qemu-img kpartx sudo e2fsprogs
+ - python3 -m venv venv
+ script:
+ - source venv/bin/activate
+ - !reference [.gsutil-install, script]
+ - cd nfvbenchvm/dib
+ - |
+ echo -e "\e[0Ksection_start:`date +%s`:build_image\r\e[0KBuild Image"
+ bash build-image.sh
+ echo -e "\e[0Ksection_end:`date +%s`:build_image\r\e[0K"
+ rules:
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+
+docker-build-nfvbench:
+ extends: .docker-build-and-push
+ variables:
+ DOCKER_IMAGE: "$DOCKER_ORGANIZATION/nfvbench"
+ DOCKER_BUILDCONTEXT: "docker"
+ DOCKER_FILEPATH: "docker/Dockerfile"
diff --git a/INFO.yaml b/INFO.yaml
new file mode 100644
index 0000000..703d920
--- /dev/null
+++ b/INFO.yaml
@@ -0,0 +1,52 @@
+---
+project: 'L2/L3 forwarding performance toolkit for NFVi (NFVbench)'
+project_creation_date: 'May 2nd 2017'
+project_category: ''
+lifecycle_state: ''
+project_lead: &opnfv_nfvbench_ptl
+ name: 'Alec Hothan'
+ email: 'ahothan@cisco.com'
+ id: 'ahothan'
+ company: 'cisco.com'
+ timezone: 'PST'
+primary_contact: *opnfv_nfvbench_ptl
+issue_tracking:
+ type: 'jira'
+ url: 'https://jira-old.opnfv.org/projects/NFVBENCH'
+ key: 'NFVBENCH'
+mailing_list:
+ type: 'mailman2'
+ url: 'anuket-tech-discuss@lists.anuket.io'
+ tag: '#nfvbench'
+realtime_discussion:
+ type: irc
+ server: 'freenode.net'
+ channel: '#opnfv-nfvbench'
+meetings:
+ - type: 'gotomeeting+irc'
+ agenda: # eg: 'https://wiki.opnfv.org/display/'
+ url: # eg: 'https://global.gotomeeting.com/join/819733085'
+ server: 'freenode.net'
+ channel: '#opnfv-meeting'
+ repeats: 'weekly'
+ time: # eg: '16:00 UTC'
+repositories:
+ - 'nfvbench'
+committers:
+ - <<: *opnfv_nfvbench_ptl
+ - name: 'Yichen Wang'
+ email: 'yicwang@cisco.com'
+ company: 'cisco.com'
+ id: 'yicwang'
+ - name: 'Francois-Regis Menguy'
+ email: 'francoisregis.menguy@orange.com'
+ company: 'orange.com'
+ id: 'fmenguy'
+ - name: 'Gwenael Lambrouin'
+ email: 'gwenael.lambrouin@orange.com'
+ company: 'orange.com'
+ id: 'glambrouin'
+tsc:
+ # yamllint disable rule:line-length
+ approval: ''
+ # yamllint enable rule:line-length
diff --git a/README.rst b/README.rst
index 0a9295d..ead5053 100644
--- a/README.rst
+++ b/README.rst
@@ -1,19 +1,31 @@
NFVbench: A Network Performance Benchmarking Tool for NFVi Full Stacks
**********************************************************************
-The NFVbench tool provides an automated way to measure the network performance for the most common data plane packet flows on any OpenStack based NFVi system viewed as a black box (NFVi Full Stack).
+The NFVbench tool provides an automated way to measure the network performance for the most common data plane packet flows
+on any NFVi system viewed as a black box (NFVi Full Stack).
An NFVi full stack exposes the following interfaces:
-- an OpenStack API
-- an interface to send and receive packets on the data plane (typically through top of rack switches)
+- an OpenStack API for those NFVi platforms based on OpenStack
+- an interface to send and receive packets on the data plane (typically through top of rack switches
+ while simpler direct wiring to a looping device would also work)
-The NFVi full stack does not have to be supported by the OPNFV ecosystem and can be any functional OpenStack system that provides the aboce interfaces. NFVbench can be installed standalone (in the form of a single Docker container) and is fully functional without the need to install any other OPNFV framework.
+The NFVi full stack does not have to be supported by the OPNFV ecosystem and can be any functional OpenStack system that provides
+the above interfaces.
+NFVbench can also be used without OpenStack on any networking device that can handle L2 forwarding or L3 routing.
-It is designed to be easy to install and easy to use by non experts (no need to be an expert in traffic generators and data plane performance testing).
+NFVbench can be installed standalone (in the form of a single Docker container) and is fully functional without
+the need to install any other OPNFV framework.
+It is designed to be easy to install and easy to use by non experts (no need to be an expert in traffic generators and data plane
+performance benchmarking).
+
+Online Documentation
+--------------------
+The latest version of the NFVbench documentation is available online at:
+
+https://docs.anuket.io/projects/nfvbench/en/latest/index.html
Contact Information
-------------------
-Inquiries and questions: send an email to opnfv-tech-discuss@lists.opnfv.org with a Subject line starting with "[nfvbench]".
-
-Open issues or submit an issue or enhancement request: https://jira.opnfv.org/projects/NFVBENCH/issues (this requires an OPNFV Linux Foundation login).
+Inquiries and questions: send an email to anuket-tech-discuss@lists.anuket.io with a Subject line starting with "#nfvbench"
+Open issues or submit an issue or enhancement request: https://jira-old.opnfv.org/projects/NFVBENCH/issues (this requires an OPNFV Linux Foundation login).
diff --git a/docs/testing/developer/devguide/index.rst b/behave_tests/__init__.py
index e69de29..e69de29 100644
--- a/docs/testing/developer/devguide/index.rst
+++ b/behave_tests/__init__.py
diff --git a/behave_tests/behavedriver.py b/behave_tests/behavedriver.py
new file mode 100644
index 0000000..ad0c8b7
--- /dev/null
+++ b/behave_tests/behavedriver.py
@@ -0,0 +1,70 @@
+#!/usr/bin/env python
+# Copyright 2021 Orange
+#
+# 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.
+#
+
+"""Define classes required to run any Behave test suites."""
+
+from __future__ import division
+
+import json
+import logging
+import os
+
+from xtesting.core.behaveframework import BehaveFramework
+
+__author__ = "François-Régis Menguy <francoisregis.menguy@orange.com>"
+
+
+class BehaveDriver(BehaveFramework):
+ """NFVbench custom BehaveDriver for Xtesting."""
+ # pylint: disable=too-many-instance-attributes
+
+ __logger = logging.getLogger('xtesting.core.behavedriver')
+
+ def __init__(self, **kwargs):
+ super().__init__(**kwargs)
+ self.campaign_json_file = os.path.join(self.res_dir, 'campaign_result.json')
+
+ def extract_nfvbench_results(self):
+ with open(self.campaign_json_file) as stream_:
+ self.details['results'] = json.load(stream_)
+
+ def run(self, **kwargs):
+
+ """Override existing Xtesting BehaveFramework core script run method
+ to extract NFVbench result and push them to DB
+
+ Here are the steps:
+ * run Xtesting behave method:
+ * create the output directories if required,
+ * run behave features with parameters
+ * get the behave results in output.json,
+ * get the nfvbench results in campaign_result.json
+
+ Args:
+ kwargs: Arbitrary keyword arguments.
+
+ Returns:
+ EX_OK if all suites ran well.
+ EX_RUN_ERROR otherwise.
+ """
+ try:
+ super().run(**kwargs)
+ self.extract_nfvbench_results()
+ self.__logger.info("NFVbench results were successfully parsed")
+ except Exception: # pylint: disable=broad-except
+ self.__logger.exception("Cannot parse NFVbench results")
+ return self.EX_RUN_ERROR
+ return self.EX_OK
diff --git a/docs/testing/user/configguide/configguide.rst b/behave_tests/features/__init__.py
index e69de29..e69de29 100644
--- a/docs/testing/user/configguide/configguide.rst
+++ b/behave_tests/features/__init__.py
diff --git a/behave_tests/features/characterization-full.feature b/behave_tests/features/characterization-full.feature
new file mode 100644
index 0000000..8b47dec
--- /dev/null
+++ b/behave_tests/features/characterization-full.feature
@@ -0,0 +1,69 @@
+@characterization
+Feature: characterization
+
+ @throughput
+ Scenario Outline: Run a NDR test for a defined frame size and flow count
+ Given 10 sec run duration
+ And <frame_size> frame size
+ And <flow_count> flow count
+ And ndr rate
+ When NFVbench API is ready
+ Then 3 runs are started and waiting for maximum result
+ And push result to database
+ And extract offered rate result
+
+ Examples: Frame sizes and flow counts
+ | frame_size | flow_count |
+ | 64 | 128 |
+ | 128 | 128 |
+ | 256 | 128 |
+ | 512 | 128 |
+ | 768 | 128 |
+ | 1024 | 128 |
+ | 1280 | 128 |
+ | 1518 | 128 |
+ | IMIX | 128 |
+ | 9000 | 128 |
+ | 64 | 10k |
+ | 128 | 10k |
+ | 256 | 10k |
+ | 512 | 10k |
+ | 768 | 10k |
+ | 1024 | 10k |
+ | 1280 | 10k |
+ | 1518 | 10k |
+ | IMIX | 10k |
+ | 9000 | 10k |
+ | 64 | 100k |
+ | 128 | 100k |
+ | 256 | 100k |
+ | 512 | 100k |
+ | 768 | 100k |
+ | 1024 | 100k |
+ | 1280 | 100k |
+ | 1518 | 100k |
+ | IMIX | 100k |
+ | 9000 | 100k |
+
+
+ @latency
+ Scenario Outline: Run a latency test for a defined frame size and throughput percentage
+ Given 10 sec run duration
+ And TRex is restarted
+ And <frame_size> frame size
+ And 100k flow count
+ And <throughput> rate of previous scenario
+ When NFVbench API is ready
+ Then run is started and waiting for result
+ And push result to database
+
+ Examples: Frame sizes and throughput percentages
+ | frame_size | throughput |
+ | 64 | 70% |
+ | 64 | 90% |
+ | 768 | 70% |
+ | 768 | 90% |
+ | 1518 | 70% |
+ | 1518 | 90% |
+ | 9000 | 70% |
+ | 9000 | 90% |
diff --git a/behave_tests/features/characterization-samples.feature b/behave_tests/features/characterization-samples.feature
new file mode 100644
index 0000000..fc55762
--- /dev/null
+++ b/behave_tests/features/characterization-samples.feature
@@ -0,0 +1,42 @@
+@characterization
+Feature: characterization
+
+ @throughput
+ Scenario Outline: Run a NDR test for a defined frame size and flow count
+ Given 10 sec run duration
+ And <frame_size> frame size
+ And <flow_count> flow count
+ And ndr rate
+ When NFVbench API is ready
+ Then 3 runs are started and waiting for maximum result
+ And push result to database
+ And extract offered rate result
+
+ Examples: Frame sizes and flow counts
+ | frame_size | flow_count |
+ | 64 | 100k |
+ | 768 | 100k |
+ | 1518 | 100k |
+ | 9000 | 100k |
+
+
+ @latency
+ Scenario Outline: Run a latency test for a defined frame size and throughput percentage
+ Given 10 sec run duration
+ And <frame_size> frame size
+ And 100k flow count
+ And <throughput> rate of previous scenario
+ When NFVbench API is ready
+ Then run is started and waiting for result
+ And push result to database
+
+ Examples: Frame sizes and throughput percentages
+ | frame_size | throughput |
+ | 64 | 70% |
+ | 64 | 90% |
+ | 768 | 70% |
+ | 768 | 90% |
+ | 1518 | 70% |
+ | 1518 | 90% |
+ | 9000 | 70% |
+ | 9000 | 90% |
diff --git a/behave_tests/features/environment.py b/behave_tests/features/environment.py
new file mode 100644
index 0000000..7621075
--- /dev/null
+++ b/behave_tests/features/environment.py
@@ -0,0 +1,88 @@
+#!/usr/bin/env python
+# Copyright 2021 Orange
+#
+# 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 json
+import os
+import logging
+import pathlib
+import time
+
+
+def before_all(context):
+ context.data = {'config': os.getenv('NFVBENCH_CONFIG_PATH', '/etc/nfvbench/nfvbench.cfg')}
+
+ context.data['PROJECT_NAME'] = os.getenv('PROJECT_NAME', 'nfvbench')
+ context.data['TEST_DB_URL'] = os.getenv('TEST_DB_URL')
+ context.data['BASE_TEST_DB_URL'] = ''
+ if context.data['TEST_DB_URL']:
+ context.data['BASE_TEST_DB_URL'] = context.data['TEST_DB_URL'].replace('results', '')
+ context.data['INSTALLER_TYPE'] = os.getenv('INSTALLER_TYPE')
+ context.data['DEPLOY_SCENARIO'] = os.getenv('DEPLOY_SCENARIO')
+ context.data['NODE_NAME'] = os.getenv('NODE_NAME', 'nfvbench')
+ context.data['BUILD_TAG'] = os.getenv('BUILD_TAG')
+
+ # NFVbench server host and port
+ context.host_ip = os.getenv('NFVBENCH_SERVER_HOST', '127.0.0.1')
+ context.port = int(os.getenv('NFVBENCH_SERVER_PORT', '7555'))
+
+
+def before_feature(context, feature):
+ context.rates = {}
+ context.results = {}
+ context.start_time = time.time()
+ context.CASE_NAME = feature.name
+
+ # Create results dir if needed
+ results_dir = pathlib.Path('/var/lib/xtesting/results/' + context.CASE_NAME)
+ if not results_dir.exists():
+ results_dir.mkdir()
+
+ # Setup a second logger to be able to understand why a test passed or failed
+ # (The main logger is used by behave itself)
+ context.logger = logging.getLogger('behave_tests')
+ context.logger.setLevel(logging.INFO)
+ fh = logging.FileHandler(filename=results_dir / pathlib.Path('behave_tests.log'),
+ mode='w') # Re-create the file at the beginning of the feature
+ fh.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
+ context.logger.addHandler(fh)
+
+ context.logger.info('before_feature: ' + feature.name)
+
+
+def before_scenario(context, scenario):
+ context.tag = scenario.tags[0]
+ context.json = {'log_file': '/var/lib/xtesting/results/' + context.CASE_NAME + '/nfvbench.log'}
+ user_label = os.getenv('NFVBENCH_USER_LABEL', None)
+ if user_label:
+ context.json['user_label'] = user_label
+ loopvm_flavor = os.getenv('NFVBENCH_LOOPVM_FLAVOR_NAME', None)
+ if loopvm_flavor:
+ context.json['flavor_type'] = loopvm_flavor
+ context.synthesis = {}
+ context.percentage_rate = None
+
+ context.logger.info('before_scenario: ' + scenario.name)
+
+
+def after_feature(context, feature):
+ if len(context.results) == 0:
+ # No result to dump
+ return
+
+ results_dir = pathlib.Path('/var/lib/xtesting/results/' + context.CASE_NAME)
+ results_file = results_dir / pathlib.Path('campaign_result.json')
+ results_file.write_text(json.dumps(context.results, indent=4))
diff --git a/behave_tests/features/non-regression.feature b/behave_tests/features/non-regression.feature
new file mode 100644
index 0000000..1c21c47
--- /dev/null
+++ b/behave_tests/features/non-regression.feature
@@ -0,0 +1,45 @@
+@non-regression
+Feature: non-regression
+
+ @throughput
+ Scenario Outline: Run a NDR test for a defined frame size
+ Given 10 sec run duration
+ And <frame_size> frame size
+ And 100k flow count
+ And ndr rate
+ When NFVbench API is ready
+ Then 3 runs are started and waiting for maximum result
+ And push result to database
+ And extract offered rate result
+ And verify throughput result is in same range as the previous result
+ And verify throughput result is in same range as the characterization result
+
+ Examples: Frame sizes
+ | frame_size |
+ | 64 |
+ | 768 |
+ | 1518 |
+ | 9000 |
+
+
+ @latency
+ Scenario Outline: Run a latency test for a defined frame size and throughput percentage
+ Given 10 sec run duration
+ And <frame_size> frame size
+ And 100k flow count
+ And packet rate equal to <percentage> of max throughput of last characterization
+ When NFVbench API is ready
+ Then run is started and waiting for result
+ And push result to database
+ And verify latency result is lower than 1000 microseconds
+
+ Examples: Frame sizes and throughput percentages
+ | frame_size | percentage |
+ | 64 | 70% |
+ | 64 | 90% |
+ | 768 | 70% |
+ | 768 | 90% |
+ | 1518 | 70% |
+ | 1518 | 90% |
+ | 9000 | 70% |
+ | 9000 | 90% |
diff --git a/behave_tests/features/quick-test-10kpps.feature b/behave_tests/features/quick-test-10kpps.feature
new file mode 100644
index 0000000..d46000c
--- /dev/null
+++ b/behave_tests/features/quick-test-10kpps.feature
@@ -0,0 +1,13 @@
+@quick-test-10kpps
+Feature: quick-test-10kpps
+
+ @throughput
+ Scenario: Run a 10s test at 10kpps with 64-byte frames and 128 flows
+ Given 10 sec run duration
+ And TRex is restarted
+ And 64 frame size
+ And 128 flow count
+ And 10kpps rate
+ When NFVbench API is ready
+ Then 1 runs are started and waiting for maximum result
+ And push result to database
diff --git a/behave_tests/features/steps/__init__.py b/behave_tests/features/steps/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/behave_tests/features/steps/__init__.py
diff --git a/behave_tests/features/steps/steps.py b/behave_tests/features/steps/steps.py
new file mode 100644
index 0000000..c347871
--- /dev/null
+++ b/behave_tests/features/steps/steps.py
@@ -0,0 +1,629 @@
+#!/usr/bin/env python
+# Copyright 2021 Orange
+#
+# 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 behave import given
+from behave import when
+from behave import then
+from copy import deepcopy
+from requests import RequestException
+from retry import retry
+import json
+import requests
+import subprocess
+from subprocess import DEVNULL
+from typing import Optional
+
+from nfvbench.summarizer import Formatter
+from nfvbench.traffic_gen.traffic_utils import parse_rate_str
+
+from behave_tests.features.steps.testapi import TestapiClient, nfvbench_input_to_str
+
+
+STATUS_ERROR = "ERROR"
+
+STATUS_OK = "OK"
+
+
+"""Given steps."""
+
+
+@given('PROJECT_NAME: {project_name}')
+def override_xtesting_project_name(context, project_name):
+ context.data['PROJECT_NAME'] = project_name
+
+
+@given('TEST_DB_URL: {test_db_url}')
+def override_xtesting_test_db_url(context, test_db_url):
+ context.data['TEST_DB_URL'] = test_db_url
+ context.data['BASE_TEST_DB_URL'] = context.data['TEST_DB_URL'].replace('results', '')
+
+
+@given('INSTALLER_TYPE: {installer_type}')
+def override_xtesting_installer_type(context, installer_type):
+ context.data['INSTALLER_TYPE'] = installer_type
+
+
+@given('DEPLOY_SCENARIO: {deploy_scenario}')
+def override_xtesting_deploy_scenario(context, deploy_scenario):
+ context.data['DEPLOY_SCENARIO'] = deploy_scenario
+
+
+@given('NODE_NAME: {node_name}')
+def override_xtesting_node_name(context, node_name):
+ context.data['NODE_NAME'] = node_name
+
+
+@given('BUILD_TAG: {build_tag}')
+def override_xtesting_build_tag(context, build_tag):
+ context.data['BUILD_TAG'] = build_tag
+
+
+@given('NFVbench config from file: {config_path}')
+def init_config(context, config_path):
+ context.data['config'] = config_path
+
+
+@given('a JSON NFVbench config')
+def init_config_from_json(context):
+ context.json.update(json.loads(context.text))
+
+
+@given('log file: {log_file_path}')
+def log_config(context, log_file_path):
+ context.json['log_file'] = log_file_path
+
+
+@given('json file: {json_file_path}')
+def json_config(context, json_file_path):
+ context.json['json'] = json_file_path
+
+
+@given('no clean up')
+def add_no_clean_up_flag(context):
+ context.json['no_cleanup'] = 'true'
+
+
+@given('TRex is restarted')
+def add_restart(context):
+ context.json['restart'] = 'true'
+
+
+@given('{label} label')
+def add_label(context, label):
+ context.json['label'] = label
+
+
+@given('{frame_size} frame size')
+def add_frame_size(context, frame_size):
+ context.json['frame_sizes'] = [frame_size]
+
+
+@given('{flow_count} flow count')
+def add_flow_count(context, flow_count):
+ context.json['flow_count'] = flow_count
+
+
+@given('{rate} rate')
+def add_rate(context, rate):
+ context.json['rate'] = rate
+
+
+@given('{duration} sec run duration')
+def add_duration(context, duration):
+ context.json['duration_sec'] = duration
+
+
+@given('{percentage_rate} rate of previous scenario')
+def add_percentage_rate(context, percentage_rate):
+ context.percentage_rate = percentage_rate
+ rate = percentage_previous_rate(context, percentage_rate)
+ context.json['rate'] = rate
+ context.logger.info(f"add_percentage_rate: {percentage_rate} => rate={rate}")
+
+
+@given('packet rate equal to {percentage} of max throughput of last characterization')
+def add_packet_rate(context, percentage: str):
+ """Update nfvbench run config with packet rate based on reference value.
+
+ For the already configured frame size and flow count, retrieve the max
+ throughput obtained during the latest successful characterization run. Then
+ retain `percentage` of this value for the packet rate and update `context`.
+
+ Args:
+ context: The context data of the current scenario run. It includes the
+ testapi endpoints to retrieve the reference values.
+
+ percentage: String representation of the percentage of the reference max
+ throughput. Example: "70%"
+
+ Updates context:
+ context.percentage_rate: percentage of reference max throughput
+ using a string representation. Example: "70%"
+
+ context.json['rate']: packet rate in packets per second using a string
+ representation. Example: "2000pps"
+
+ Raises:
+ ValueError: invalid percentage string
+
+ AssertionError: cannot find reference throughput value
+
+ """
+ # Validate percentage
+ if not percentage.endswith('%'):
+ raise ValueError('Invalid percentage string: "{0}"'.format(percentage))
+ percentage_float = convert_percentage_str_to_float(percentage)
+
+ # Retrieve nfvbench results report from testapi for:
+ # - the latest throughput scenario inside a characterization feature that passed
+ # - the test duration, frame size and flow count given in context.json
+ # - (optionally) the user_label and flavor_type given in context.json
+ # - the 'ndr' rate
+ testapi_params = {"project_name": context.data['PROJECT_NAME'],
+ "case_name": "characterization"}
+ nfvbench_test_conditions = deepcopy(context.json)
+ nfvbench_test_conditions['rate'] = 'ndr'
+ testapi_client = TestapiClient(testapi_url=context.data['TEST_DB_URL'])
+ last_result = testapi_client.find_last_result(testapi_params,
+ scenario_tag="throughput",
+ nfvbench_test_input=nfvbench_test_conditions)
+ if last_result is None:
+ error_msg = "No characterization result found for scenario_tag=throughput"
+ error_msg += " and nfvbench test conditions "
+ error_msg += nfvbench_input_to_str(nfvbench_test_conditions)
+ context.logger.error(error_msg)
+ raise AssertionError(error_msg)
+
+ # From the results report, extract the max throughput in packets per second
+ total_tx_rate = extract_value(last_result["output"], "total_tx_rate")
+ context.logger.info("add_packet_rate: max throughput of last characterization (pps): "
+ f"{total_tx_rate:,}")
+
+ # Compute the desired packet rate
+ rate = round(total_tx_rate * percentage_float)
+ context.logger.info(f"add_packet_rate: percentage={percentage} rate(pps)={rate:,}")
+
+ # Build rate string using a representation understood by nfvbench
+ rate_str = str(rate) + "pps"
+
+ # Update context
+ context.percentage_rate = percentage
+ context.json['rate'] = rate_str
+
+
+"""When steps."""
+
+
+@when('NFVbench API is ready')
+@when('NFVbench API is ready on host {host_ip}')
+@when('NFVbench API is ready on host {host_ip} and port {port:d}')
+def start_server(context, host_ip: Optional[str]=None, port: Optional[int]=None):
+ """Start nfvbench server if needed and wait until it is ready.
+
+ Quickly check whether nfvbench HTTP server is ready by reading the "/status"
+ page. If not, start the server locally. Then wait until nfvbench API is
+ ready by polling the "/status" page.
+
+ This code is useful when behave and nfvbench run on the same machine. In
+ particular, it is needed to run behave tests with nfvbench Docker container.
+
+ There is currently no way to prevent behave from starting automatically
+ nfvbench server when this is not desirable, for instance when behave is
+ started using ansible-role-nfvbench. The user or the orchestration layer
+ should make sure nfvbench API is ready before starting behave tests.
+
+ """
+ # NFVbench server host IP and port number have been setup from environment variables (see
+ # environment.py:before_all()). Here we allow to override them from feature files:
+ if host_ip is not None:
+ context.host_ip = host_ip
+ if port is not None:
+ context.port = port
+
+ nfvbench_test_url = "http://{ip}:{port}/status".format(ip=context.host_ip, port=context.port)
+ context.logger.info("start_server: test nfvbench API on URL: " + nfvbench_test_url)
+
+ try:
+ # check if API is already available
+ requests.get(nfvbench_test_url)
+ except RequestException:
+ context.logger.info("nfvbench server not running")
+
+ cmd = ["nfvbench", "-c", context.data['config'], "--server"]
+ if context.host_ip != "127.0.0.1":
+ cmd.append("--host")
+ cmd.append(context.host_ip)
+ if context.port != 7555:
+ cmd.append("--port")
+ cmd.append(str(context.port))
+
+ context.logger.info("Start nfvbench server with command: " + " ".join(cmd))
+
+ subprocess.Popen(cmd, stdout=DEVNULL, stderr=subprocess.STDOUT)
+
+ # Wait until nfvbench API is ready
+ test_nfvbench_api(nfvbench_test_url)
+
+
+"""Then steps."""
+
+
+@then('run is started and waiting for result')
+@then('{repeat:d} runs are started and waiting for maximum result')
+def run_nfvbench_traffic(context, repeat=1):
+ context.logger.info(f"run_nfvbench_traffic: fs={context.json['frame_sizes'][0]} "
+ f"fc={context.json['flow_count']} "
+ f"rate={context.json['rate']} repeat={repeat}")
+
+ if 'json' not in context.json:
+ # Build filename for nfvbench results in JSON format
+ context.json['json'] = '/var/lib/xtesting/results/' + context.CASE_NAME + \
+ '/nfvbench-' + context.tag + \
+ '-fs_' + context.json['frame_sizes'][0] + \
+ '-fc_' + context.json['flow_count']
+ if context.percentage_rate is not None:
+ # Add rate as a percentage, eg '-rate_70%'
+ context.json['json'] += '-rate_' + context.percentage_rate
+ else:
+ # Add rate in bits or packets per second, eg '-rate_15Gbps' or '-rate_10kpps'
+ context.json['json'] += '-rate_' + context.json['rate']
+ context.json['json'] += '.json'
+
+ json_base_name = context.json['json']
+
+ max_total_tx_rate = None
+ # rem: don't init with 0 in case nfvbench gets crazy and returns a negative packet rate
+
+ for i in range(repeat):
+ if repeat > 1:
+ context.json['json'] = json_base_name.strip('.json') + '-' + str(i) + '.json'
+
+ # Start nfvbench traffic and wait result:
+ url = "http://{ip}:{port}/start_run".format(ip=context.host_ip, port=context.port)
+ payload = json.dumps(context.json)
+ r = requests.post(url, data=payload, headers={'Content-Type': 'application/json'})
+ context.request_id = json.loads(r.text)["request_id"]
+ assert r.status_code == 200
+ result = wait_result(context)
+ assert result["status"] == STATUS_OK
+
+ # Extract useful metrics from result:
+ total_tx_rate = extract_value(result, "total_tx_rate")
+ overall = extract_value(result, "overall")
+ avg_delay_usec = extract_value(overall, "avg_delay_usec")
+
+ # Log latest result:
+ context.logger.info(f"run_nfvbench_traffic: result #{i+1}: "
+ f"total_tx_rate(pps)={total_tx_rate:,} " # Add ',' thousand separator
+ f"avg_latency_usec={round(avg_delay_usec)}")
+
+ # Keep only the result with the highest packet rate:
+ if max_total_tx_rate is None or total_tx_rate > max_total_tx_rate:
+ max_total_tx_rate = total_tx_rate
+ context.result = result
+ context.synthesis['total_tx_rate'] = total_tx_rate
+ context.synthesis['avg_delay_usec'] = avg_delay_usec
+
+ # Log max result only when we did two nfvbench runs or more:
+ if repeat > 1:
+ context.logger.info(f"run_nfvbench_traffic: max result: "
+ f"total_tx_rate(pps)={context.synthesis['total_tx_rate']:,} "
+ f"avg_latency_usec={round(context.synthesis['avg_delay_usec'])}")
+
+
+@then('extract offered rate result')
+def save_rate_result(context):
+ total_tx_rate = extract_value(context.result, "total_tx_rate")
+ context.rates[context.json['frame_sizes'][0] + '_' + context.json['flow_count']] = total_tx_rate
+
+
+@then('verify throughput result is in same range as the previous result')
+@then('verify throughput result is greater than {threshold} of the previous result')
+def get_throughput_result_from_database(context, threshold='90%'):
+ last_result = get_last_result(context)
+
+ if last_result:
+ compare_throughput_values(context, last_result, threshold)
+
+
+@then('verify latency result is in same range as the previous result')
+@then('verify latency result is greater than {threshold} of the previous result')
+def get_latency_result_from_database(context, threshold='90%'):
+ last_result = get_last_result(context)
+
+ if last_result:
+ compare_latency_values(context, last_result, threshold)
+
+
+@then('verify latency result is lower than {max_avg_latency_usec:g} microseconds')
+def check_latency_result_against_fixed_threshold(context, max_avg_latency_usec: float):
+ """Check latency result against a fixed threshold.
+
+ Check that the average latency measured during the current scenario run is
+ lower or equal to the provided fixed reference value.
+
+ Args:
+ context: The context data of the current scenario run. It includes the
+ test results for that run.
+
+ max_avg_latency_usec: Reference value to be used as a threshold. This
+ is a maximum average latency expressed in microseconds.
+
+ Raises:
+ AssertionError: The latency result is strictly greater than the reference value.
+
+ """
+ # Get the just measured average latency (a float):
+ new_avg_latency_usec = context.synthesis['avg_delay_usec']
+
+ # Log what we test:
+ context.logger.info("check_latency_result_against_fixed_threshold(usec): "
+ "{value}<={ref}?".format(
+ value=round(new_avg_latency_usec),
+ ref=round(max_avg_latency_usec)))
+
+ # Compare measured value to reference:
+ if new_avg_latency_usec > max_avg_latency_usec:
+ raise AssertionError("Average latency higher than max threshold: "
+ "{value} usec > {ref} usec".format(
+ value=round(new_avg_latency_usec),
+ ref=round(max_avg_latency_usec)))
+
+
+@then(
+ 'verify result is in [{min_reference_value}pps, {max_reference_value}pps] range for throughput')
+def compare_throughput_pps_result_with_range_values(context, min_reference_value,
+ max_reference_value):
+ context.unit = 'pps'
+ reference_values = [min_reference_value + 'pps', max_reference_value + 'pps']
+ throughput_comparison(context, reference_values=reference_values)
+
+
+@then(
+ 'verify result is in [{min_reference_value}bps, {max_reference_value}bps] range for throughput')
+def compare_throughput_bps_result_with_range_values(context, min_reference_value,
+ max_reference_value):
+ context.unit = 'bps'
+ reference_values = [min_reference_value + 'bps', max_reference_value + 'bps']
+ throughput_comparison(context, reference_values=reference_values)
+
+
+@then('verify result is in {reference_values} range for latency')
+def compare_result_with_range_values(context, reference_values):
+ latency_comparison(context, reference_values=reference_values)
+
+
+@then('verify throughput result is in same range as the characterization result')
+@then('verify throughput result is greater than {threshold} of the characterization result')
+def get_characterization_throughput_result_from_database(context, threshold='90%'):
+ last_result = get_last_result(context, True)
+ if not last_result:
+ raise AssertionError("No characterization result found.")
+ compare_throughput_values(context, last_result, threshold)
+
+
+@then('verify latency result is in same range as the characterization result')
+@then('verify latency result is greater than {threshold} of the characterization result')
+def get_characterization_latency_result_from_database(context, threshold='90%'):
+ last_result = get_last_result(context, True)
+ if not last_result:
+ raise AssertionError("No characterization result found.")
+ compare_latency_values(context, last_result, threshold)
+
+@then('push result to database')
+def push_result_database(context):
+ if context.tag == "latency":
+ # override input rate value with percentage one to avoid no match
+ # if pps is not accurate with previous one
+ context.json["rate"] = context.percentage_rate
+ json_result = {"synthesis": context.synthesis, "input": context.json, "output": context.result}
+
+ if context.tag not in context.results:
+ context.results[context.tag] = [json_result]
+ else:
+ context.results[context.tag].append(json_result)
+
+
+"""Utils methods."""
+
+
+@retry(AssertionError, tries=24, delay=5.0, logger=None)
+def test_nfvbench_api(nfvbench_test_url: str):
+ try:
+ r = requests.get(nfvbench_test_url)
+ assert r.status_code == 200
+ assert json.loads(r.text)["error_message"] == "no pending NFVbench run"
+ except RequestException as exc:
+ raise AssertionError("Fail to access NFVbench API") from exc
+
+
+@retry(AssertionError, tries=1000, delay=2.0, logger=None)
+def wait_result(context):
+ r = requests.get("http://{ip}:{port}/status".format(ip=context.host_ip, port=context.port))
+ context.raw_result = r.text
+ result = json.loads(context.raw_result)
+ assert r.status_code == 200
+ assert result["status"] == STATUS_OK or result["status"] == STATUS_ERROR
+ return result
+
+
+def percentage_previous_rate(context, rate):
+ previous_rate = context.rates[context.json['frame_sizes'][0] + '_' + context.json['flow_count']]
+
+ if rate.endswith('%'):
+ rate_percent = convert_percentage_str_to_float(rate)
+ return str(int(previous_rate * rate_percent)) + 'pps'
+ raise Exception('Unknown rate string format %s' % rate)
+
+
+def convert_percentage_str_to_float(percentage):
+ float_percent = float(percentage.replace('%', '').strip())
+ if float_percent <= 0 or float_percent > 100.0:
+ raise Exception('%s is out of valid range (must be 1-100%%)' % percentage)
+ return float_percent / 100
+
+
+def compare_throughput_values(context, last_result, threshold):
+ assert last_result["output"]["status"] == context.result["status"]
+ if last_result["output"]["status"] == "OK":
+ old_throughput = extract_value(last_result["output"], "total_tx_rate")
+ throughput_comparison(context, old_throughput, threshold=threshold)
+
+
+def compare_latency_values(context, last_result, threshold):
+ assert last_result["output"]["status"] == context.result["status"]
+ if last_result["output"]["status"] == "OK":
+ old_latency = extract_value(extract_value(last_result["output"], "overall"),
+ "avg_delay_usec")
+ latency_comparison(context, old_latency, threshold=threshold)
+
+
+def throughput_comparison(context, old_throughput_pps=None, threshold=None, reference_values=None):
+ current_throughput_pps = extract_value(context.result, "total_tx_rate")
+
+ if old_throughput_pps:
+ if not current_throughput_pps >= convert_percentage_str_to_float(
+ threshold) * old_throughput_pps:
+ raise AssertionError(
+ "Current run throughput {current_throughput_pps} is not over {threshold} "
+ " of previous value ({old_throughput_pps})".format(
+ current_throughput_pps=Formatter.suffix('pps')(
+ Formatter.standard(current_throughput_pps)),
+ threshold=threshold, old_throughput_pps=Formatter.suffix('pps')(
+ Formatter.standard(old_throughput_pps))))
+ elif reference_values:
+ if context.unit == 'bps':
+ current_throughput = extract_value(context.result, "offered_tx_rate_bps")
+ reference_values = [int(parse_rate_str(x)['rate_bps']) for x in reference_values]
+ formatted_current_throughput = Formatter.bits(current_throughput)
+ formatted_min_reference_value = Formatter.bits(reference_values[0])
+ formatted_max_reference_value = Formatter.bits(reference_values[1])
+ else:
+ current_throughput = current_throughput_pps
+ reference_values = [int(parse_rate_str(x)['rate_pps']) for x in reference_values]
+ formatted_current_throughput = Formatter.suffix('pps')(
+ Formatter.standard(current_throughput))
+ formatted_min_reference_value = Formatter.suffix('pps')(
+ Formatter.standard(reference_values[0]))
+ formatted_max_reference_value = Formatter.suffix('pps')(
+ Formatter.standard(reference_values[1]))
+ if not reference_values[0] <= int(current_throughput) <= reference_values[1]:
+ raise AssertionError(
+ "Current run throughput {current_throughput} is not in reference values "
+ "[{min_reference_value}, {max_reference_value}]".format(
+ current_throughput=formatted_current_throughput,
+ min_reference_value=formatted_min_reference_value,
+ max_reference_value=formatted_max_reference_value))
+
+
+def latency_comparison(context, old_latency=None, threshold=None, reference_values=None):
+ overall = extract_value(context.result, "overall")
+ current_latency = extract_value(overall, "avg_delay_usec")
+
+ if old_latency:
+ if not current_latency <= (2 - convert_percentage_str_to_float(threshold)) * old_latency:
+ threshold = str(200 - int(threshold.strip('%'))) + '%'
+ raise AssertionError(
+ "Current run latency {current_latency}usec is not less than {threshold} of "
+ "previous value ({old_latency}usec)".format(
+ current_latency=Formatter.standard(current_latency), threshold=threshold,
+ old_latency=Formatter.standard(old_latency)))
+ elif reference_values:
+ if not reference_values[0] <= current_latency <= reference_values[1]:
+ raise AssertionError(
+ "Current run latency {current_latency}usec is not in reference values "
+ "[{min_reference_value}, {max_reference_value}]".format(
+ current_latency=Formatter.standard(current_latency),
+ min_reference_value=Formatter.standard(reference_values[0]),
+ max_reference_value=Formatter.standard(reference_values[1])))
+
+
+def extract_value(obj, key):
+ """Pull all values of specified key from nested JSON."""
+ arr = []
+
+ def extract(obj, arr, key):
+ """Recursively search for values of key in JSON tree."""
+ if isinstance(obj, dict):
+ for k, v in obj.items():
+ if k == key:
+ arr.append(v)
+ elif isinstance(v, (dict, list)):
+ extract(v, arr, key)
+ elif isinstance(obj, list):
+ for item in obj:
+ extract(item, arr, key)
+ return arr
+
+ results = extract(obj, arr, key)
+ return results[0]
+
+
+def get_last_result(context, reference: bool = False):
+ """Look for a previous result in TestAPI database.
+
+ Search TestAPI results from newest to oldest and return the first result
+ record matching the context constraints. Log an overview of the results
+ found (max rate pps, avg delay usec, test conditions, date of measurement).
+
+ The result record test case must match the current test case
+ ('characterization' or 'non-regression') unless `reference` is set to True.
+
+ The result record scenario tag must match the current scenario tag
+ ('throughput' or 'latency').
+
+ Args:
+ context: behave context including project name, test case name, traffic
+ configuration (frame size, flow count, test duration), type of the
+ compute node under test (via loop VM flavor_type) and platform (via
+ user_label).
+
+ reference: when True, look for results with the 'characterization' test
+ case name instead of the current test case name.
+
+ Returns:
+ a JSON dictionary with the results, ie a dict with the keys "input",
+ "output" and "synthesis" when the scenario tag is 'throughput' or
+ 'latency'
+ """
+ if reference:
+ case_name = 'characterization'
+ else:
+ case_name = context.CASE_NAME
+ testapi_params = {"project_name": context.data['PROJECT_NAME'],
+ "case_name": case_name}
+ testapi_client = TestapiClient(testapi_url=context.data['TEST_DB_URL'])
+ last_result = testapi_client.find_last_result(testapi_params,
+ scenario_tag=context.tag,
+ nfvbench_test_input=context.json)
+ if last_result is None:
+ error_msg = "get_last_result: No result found in TestAPI database:"
+ error_msg += f" case_name={case_name} scenario_tag={context.tag} "
+ error_msg += nfvbench_input_to_str(context.json)
+ context.logger.error(error_msg)
+ raise AssertionError(error_msg)
+
+ # Log an overview of the last result (latency and max throughput)
+ measurement_date = last_result["output"]["result"]["date"]
+ total_tx_rate = extract_value(last_result["output"], "total_tx_rate")
+ avg_delay_usec = extract_value(extract_value(last_result["output"], "overall"),
+ "avg_delay_usec")
+ context.logger.info(f"get_last_result: case_name={case_name} scenario_tag={context.tag}"
+ f' measurement_date="{measurement_date}"'
+ f" total_tx_rate(pps)={total_tx_rate:,}"
+ f" avg_latency_usec={round(avg_delay_usec)}")
+
+ return last_result
diff --git a/behave_tests/features/steps/testapi.py b/behave_tests/features/steps/testapi.py
new file mode 100644
index 0000000..f211ee5
--- /dev/null
+++ b/behave_tests/features/steps/testapi.py
@@ -0,0 +1,195 @@
+#!/usr/bin/env python
+# Copyright 2021 Orange
+#
+# 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 requests
+
+
+class TestapiClient:
+ __test__ = False # Hint for pytest: TestapiClient is not a test class.
+
+ def __init__(self, testapi_url: str):
+ """
+ Args:
+ testapi_url: testapi URL as a string, for instance
+ "http://172.20.73.203:8000/api/v1/results"
+ """
+ self._base_url = testapi_url
+ self._logger = logging.getLogger("behave_tests")
+
+ def find_last_result(self, testapi_params, scenario_tag: str, nfvbench_test_input):
+ """Search testapi database and return latest result matching filters.
+
+ Look for the most recent testapi result matching testapi params, behave
+ scenario tag and nfvbench test input params, and return that result as a
+ dictionary.
+
+ Args:
+ testapi_params: dict holding the parameters of the testapi request. See
+ `build_testapi_url()` for the list of supported keys.
+
+ scenario_tag: Behave scenario tag to filter results. One of
+ "throughput" or "latency".
+
+ nfvbench_test_input: dict holding nfvbench test parameters and used
+ to filter the testapi results. The following keys are currently
+ supported:
+ - mandatory keys: 'duration_sec', 'frame_sizes', 'flow_count', 'rate'
+ - optional keys: 'user_label'
+
+ Returns:
+ None if no result matching the filters can be found, else a dictionary
+ built from testapi JSON test result.
+
+ """
+ self._logger.info(f"find_last_result: filter on scenario tag: {scenario_tag}")
+ nfvbench_input_str = nfvbench_input_to_str(nfvbench_test_input)
+ self._logger.info(f"find_last_result: filter on test conditions: {nfvbench_input_str}")
+
+ page = 1
+ while True: # While there are results pages to read
+ url = self._build_testapi_url(testapi_params, page)
+ self._logger.info("find_last_result: GET " + url)
+ last_results = self._do_testapi_request(url)
+
+ for result in last_results["results"]:
+ for tagged_result in result["details"]["results"][scenario_tag]:
+ if tagged_result["output"]["status"] != "OK":
+ # Drop result if nfvbench status is not OK
+ # (such result should not have been put in database by behave_tests,
+ # but let's be cautious)
+ continue
+ if equal_test_conditions(tagged_result["input"], nfvbench_test_input):
+ return tagged_result
+
+ if page >= last_results["pagination"]["total_pages"]:
+ break
+ page += 1
+
+ return None
+
+ def _build_testapi_url(self, testapi_params, page=1):
+ """Build URL for testapi request.
+
+ Build a URL for a testapi HTTP GET request using the provided parameters and
+ limiting the results to the tests whose criteria equals "PASS".
+
+ Args:
+ testapi_params: dictionary holding the parameters of the testapi
+ request:
+ - mandatory keys: "project_name", "case_name"
+ - optional keys: "installer", "pod_name"
+ - ignored keys: "build_tag", "scenario", "version", "criteria".
+
+ page: (Optional) number of the results page to get.
+
+ """
+ url = self._base_url
+ url += f"?project={testapi_params['project_name']}"
+ url += f"&case={testapi_params['case_name']}"
+
+ if "installer" in testapi_params.keys():
+ url += f"&installer={testapi_params['installer']}"
+ if "pod_name" in testapi_params.keys():
+ url += f"&pod={testapi_params['pod_name']}"
+
+ url += '&criteria=PASS'
+ url += f"&page={page}"
+
+ return url
+
+ def _do_testapi_request(self, testapi_url):
+ """Perform HTTP GET request on testapi.
+
+ Perform an HTTP GET request on testapi, check status code and return JSON
+ results as dictionary.
+
+ Args:
+ testapi_url: a complete URL to request testapi results (with base
+ endpoint and parameters)
+
+ Returns:
+ The JSON document from testapi as a Python dictionary
+
+ Raises:
+ * requests.exceptions.ConnectionError in case of network problem
+ when trying to establish a connection with the TestAPI database
+ (DNS failure, refused connection, ...)
+
+ * requests.exceptions.ConnectTimeout in case of timeout during the
+ request.
+
+ * requests.exception.HTTPError if the HTTP request returned an
+ unsuccessful status code.
+
+ * another exception derived from requests.exceptions.RequestException
+ in case of problem during the HTTP request.
+ """
+ response = requests.get(testapi_url)
+ # raise an HTTPError if the HTTP request returned an unsuccessful status code:
+ response.raise_for_status()
+ return response.json()
+
+
+def equal_test_conditions(testapi_input, nfvbench_input):
+ """Check test conditions in behave scenario results record.
+
+ Check whether a behave scenario results record from testapi matches a given
+ nfvbench input, ie whether the record comes from a test done under the same
+ conditions (frame size, flow count, ...)
+
+ Args:
+ testapi_input: dict holding the test conditions of a behave scenario
+ results record from testapi
+
+ nfvbench_input: dict of nfvbench test parameters (reference)
+
+ The following dict keys are currently supported:
+ - mandatory keys: 'duration_sec', 'frame_sizes', 'flow_count', 'rate'
+ - optional keys: 'user_label'
+
+ Optional keys are taken into account only when they can be found in
+ `nfvbench_input`, else they are ignored.
+
+ Returns:
+ True if test conditions match, else False.
+
+ """
+ # Select required keys (other keys can be not set or unconsistent between scenarios)
+ required_keys = ['duration_sec', 'frame_sizes', 'flow_count', 'rate']
+ if 'user_label' in nfvbench_input:
+ required_keys.append('user_label')
+
+ try:
+ testapi_subset = {k: testapi_input[k] for k in required_keys}
+ nfvbench_subset = {k: nfvbench_input[k] for k in required_keys}
+ return testapi_subset == nfvbench_subset
+ except KeyError:
+ # Fail the comparison if a required key is missing from one of the dicts
+ return False
+
+
+def nfvbench_input_to_str(nfvbench_input: dict) -> str:
+ """Build string showing nfvbench input parameters used for results search
+
+ Args:
+ nfvbench_input: dict of nfvbench test parameters
+ """
+ string = ""
+ for key in ['user_label', 'frame_sizes', 'flow_count', 'rate', 'duration_sec']:
+ if key in nfvbench_input:
+ string += f"{key}={nfvbench_input[key]} "
+ return string
diff --git a/cleanup/__init__.py b/cleanup/__init__.py
deleted file mode 100644
index 04924ec..0000000
--- a/cleanup/__init__.py
+++ /dev/null
@@ -1,13 +0,0 @@
-# Copyright 2017 Cisco Systems, Inc. All rights reserved.
-#
-# 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.
diff --git a/cleanup/nfvbench_cleanup.py b/cleanup/nfvbench_cleanup.py
deleted file mode 100644
index 1520647..0000000
--- a/cleanup/nfvbench_cleanup.py
+++ /dev/null
@@ -1,594 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2017 Cisco Systems, Inc. All rights reserved.
-#
-# 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.
-#
-
-###############################################################################
-# #
-# This is a helper script which will delete all resources created by #
-# NFVbench. #
-# #
-# Normally, NFVbench will clean up automatically when it is done. However, #
-# sometimes errors or timeouts happen during the resource creation stage, #
-# which will cause NFVbench out of sync with the real environment. If that #
-# happens, a force cleanup may be needed. #
-# #
-# It is safe to use the script with the resource list generated by #
-# NFVbench, usage: #
-# $ python nfvbench_cleanup.py -r /path/to/openrc #
-# #
-# Note: If running under single-tenant or tenant/user reusing mode, you have #
-# to cleanup the server resources first, then client resources. #
-# #
-# When there is no resource list provided, the script will simply grep the #
-# resource name with "nfvbench" and delete them. If running on a production #
-# network, please double and triple check all resources names are *NOT* #
-# starting with "nfvbench", otherwise they will be deleted by the script. #
-# #
-###############################################################################
-
-# ======================================================
-# WARNING
-# ======================================================
-# IMPORTANT FOR RUNNING NFVbench ON PRODUCTION CLOUDS
-#
-# DOUBLE CHECK THE NAMES OF ALL RESOURCES THAT DO NOT
-# BELONG TO NFVbench ARE *NOT* STARTING WITH "nfvbench".
-# ======================================================
-
-from abc import ABCMeta
-from abc import abstractmethod
-import argparse
-import re
-import sys
-import time
-import traceback
-
-# openstack python clients
-import cinderclient
-from keystoneclient import client as keystoneclient
-import neutronclient
-from novaclient.exceptions import NotFound
-from tabulate import tabulate
-
-from nfvbench import credentials
-
-resource_name_re = None
-
-def prompt_to_run():
- print "Warning: You didn't specify a resource list file as the input. "\
- "The script will delete all resources shown above."
- answer = raw_input("Are you sure? (y/n) ")
- if answer.lower() != 'y':
- sys.exit(0)
-
-def fetch_resources(fetcher, options=None):
- try:
- if options:
- res_list = fetcher(search_opts=options)
- else:
- res_list = fetcher()
- except Exception as e:
- res_list = []
- traceback.print_exc()
- print "Warning exception while listing resources:" + str(e)
- resources = {}
- for res in res_list:
- # some objects provide direct access some
- # require access by key
- try:
- resid = res.id
- resname = res.name
- except AttributeError:
- resid = res['id']
- resname = res['name']
- if resname and resource_name_re.match(resname):
- resources[resid] = resname
- return resources
-
-class AbstractCleaner(object):
- __metaclass__ = ABCMeta
-
- def __init__(self, res_category, res_desc, resources, dryrun):
- self.dryrun = dryrun
- self.category = res_category
- self.resources = {}
- if not resources:
- print 'Discovering %s resources...' % (res_category)
- for rtype, fetch_args in res_desc.iteritems():
- if resources:
- if rtype in resources:
- self.resources[rtype] = resources[rtype]
- else:
- self.resources[rtype] = fetch_resources(*fetch_args)
-
- def report_deletion(self, rtype, name):
- if self.dryrun:
- print ' + ' + rtype + ' ' + name + ' should be deleted (but is not deleted: dry run)'
- else:
- print ' + ' + rtype + ' ' + name + ' is successfully deleted'
-
- def report_not_found(self, rtype, name):
- print ' ? ' + rtype + ' ' + name + ' not found (already deleted?)'
-
- def report_error(self, rtype, name, reason):
- print ' - ' + rtype + ' ' + name + ' ERROR:' + reason
-
- def get_resource_list(self):
- result = []
- for rtype, rdict in self.resources.iteritems():
- for resid, resname in rdict.iteritems():
- result.append([rtype, resname, resid])
- return result
-
- @abstractmethod
- def clean(self):
- pass
-
-class StorageCleaner(AbstractCleaner):
- def __init__(self, sess, resources, dryrun):
- from cinderclient import client as cclient
- from novaclient import client as nclient
-
- self.nova = nclient.Client('2', endpoint_type='publicURL', session=sess)
- self.cinder = cclient.Client('2', endpoint_type='publicURL', session=sess)
-
- res_desc = {'volumes': [self.cinder.volumes.list, {"all_tenants": 1}]}
- super(StorageCleaner, self).__init__('Storage', res_desc, resources, dryrun)
-
- def clean(self):
- print '*** STORAGE cleanup'
- try:
- volumes = []
- detaching_volumes = []
- for id, name in self.resources['volumes'].iteritems():
- try:
- vol = self.cinder.volumes.get(id)
- if vol.attachments:
- # detach the volume
- try:
- if not self.dryrun:
- ins_id = vol.attachments[0]['server_id']
- self.nova.volumes.delete_server_volume(ins_id, id)
- print ' . VOLUME ' + vol.name + ' detaching...'
- else:
- print ' . VOLUME ' + vol.name + ' to be detached...'
- detaching_volumes.append(vol)
- except NotFound:
- print 'WARNING: Volume %s attached to an instance that no longer '\
- 'exists (will require manual cleanup of the database)' % (id)
- except Exception as e:
- print str(e)
- else:
- # no attachments
- volumes.append(vol)
- except cinderclient.exceptions.NotFound:
- self.report_not_found('VOLUME', name)
-
- # check that the volumes are no longer attached
- if detaching_volumes:
- if not self.dryrun:
- print ' . Waiting for %d volumes to be fully detached...' % \
- (len(detaching_volumes))
- retry_count = 5 + len(detaching_volumes)
- while True:
- retry_count -= 1
- for vol in list(detaching_volumes):
- if not self.dryrun:
- latest_vol = self.cinder.volumes.get(detaching_volumes[0].id)
- if self.dryrun or not latest_vol.attachments:
- if not self.dryrun:
- print ' + VOLUME ' + vol.name + ' detach complete'
- detaching_volumes.remove(vol)
- volumes.append(vol)
- if detaching_volumes and not self.dryrun:
- if retry_count:
- print ' . VOLUME %d left to be detached, retries left=%d...' % \
- (len(detaching_volumes), retry_count)
- time.sleep(2)
- else:
- print ' - VOLUME detach timeout, %d volumes left:' % \
- (len(detaching_volumes))
- for vol in detaching_volumes:
- print ' ', vol.name, vol.status, vol.id, vol.attachments
- break
- else:
- break
-
- # finally delete the volumes
- for vol in volumes:
- if not self.dryrun:
- try:
- vol.force_delete()
- except cinderclient.exceptions.BadRequest as exc:
- print str(exc)
- self.report_deletion('VOLUME', vol.name)
- except KeyError:
- pass
-
-class ComputeCleaner(AbstractCleaner):
- def __init__(self, sess, resources, dryrun):
- from neutronclient.neutron import client as nclient
- from novaclient import client as novaclient
- self.neutron_client = nclient.Client('2.0', endpoint_type='publicURL', session=sess)
- self.nova_client = novaclient.Client('2', endpoint_type='publicURL', session=sess)
- res_desc = {
- 'instances': [self.nova_client.servers.list, {"all_tenants": 1}],
- 'flavors': [self.nova_client.flavors.list],
- 'keypairs': [self.nova_client.keypairs.list]
- }
- super(ComputeCleaner, self).__init__('Compute', res_desc, resources, dryrun)
-
- def clean(self):
- print '*** COMPUTE cleanup'
- try:
- # Get a list of floating IPs
- fip_lst = self.neutron_client.list_floatingips()['floatingips']
- deleting_instances = self.resources['instances']
- for id, name in self.resources['instances'].iteritems():
- try:
- if self.nova_client.servers.get(id).addresses.values():
- ins_addr = self.nova_client.servers.get(id).addresses.values()[0]
- fips = [x['addr'] for x in ins_addr if x['OS-EXT-IPS:type'] == 'floating']
- else:
- fips = []
- if self.dryrun:
- self.nova_client.servers.get(id)
- for fip in fips:
- self.report_deletion('FLOATING IP', fip)
- self.report_deletion('INSTANCE', name)
- else:
- for fip in fips:
- fip_id = [x['id'] for x in fip_lst if x['floating_ip_address'] == fip]
- self.neutron_client.delete_floatingip(fip_id[0])
- self.report_deletion('FLOATING IP', fip)
- self.nova_client.servers.delete(id)
- except NotFound:
- deleting_instances.remove(id)
- self.report_not_found('INSTANCE', name)
-
- if not self.dryrun and len(deleting_instances):
- print ' . Waiting for %d instances to be fully deleted...' % \
- (len(deleting_instances))
- retry_count = 5 + len(deleting_instances)
- while True:
- retry_count -= 1
- for ins_id in deleting_instances.keys():
- try:
- self.nova_client.servers.get(ins_id)
- except NotFound:
- self.report_deletion('INSTANCE', deleting_instances[ins_id])
- deleting_instances.pop(ins_id)
-
- if not len(deleting_instances):
- break
-
- if retry_count:
- print ' . INSTANCE %d left to be deleted, retries left=%d...' % \
- (len(deleting_instances), retry_count)
- time.sleep(2)
- else:
- print ' - INSTANCE deletion timeout, %d instances left:' % \
- (len(deleting_instances))
- for ins_id in deleting_instances.keys():
- try:
- ins = self.nova_client.servers.get(ins_id)
- print ' ', ins.name, ins.status, ins.id
- except NotFound:
- print(' ', deleting_instances[ins_id],
- '(just deleted)', ins_id)
- break
- except KeyError:
- pass
-
- try:
- for id, name in self.resources['flavors'].iteritems():
- try:
- flavor = self.nova_client.flavors.find(name=name)
- if not self.dryrun:
- flavor.delete()
- self.report_deletion('FLAVOR', name)
- except NotFound:
- self.report_not_found('FLAVOR', name)
- except KeyError:
- pass
-
- try:
- for id, name in self.resources['keypairs'].iteritems():
- try:
- if self.dryrun:
- self.nova_client.keypairs.get(name)
- else:
- self.nova_client.keypairs.delete(name)
- self.report_deletion('KEY PAIR', name)
- except NotFound:
- self.report_not_found('KEY PAIR', name)
- except KeyError:
- pass
-
-class NetworkCleaner(AbstractCleaner):
-
- def __init__(self, sess, resources, dryrun):
- from neutronclient.neutron import client as nclient
- self.neutron = nclient.Client('2.0', endpoint_type='publicURL', session=sess)
-
- # because the response has an extra level of indirection
- # we need to extract it to present the list of network or router objects
- def networks_fetcher():
- return self.neutron.list_networks()['networks']
-
- def routers_fetcher():
- return self.neutron.list_routers()['routers']
-
- def secgroup_fetcher():
- return self.neutron.list_security_groups()['security_groups']
-
- res_desc = {
- 'sec_groups': [secgroup_fetcher],
- 'networks': [networks_fetcher],
- 'routers': [routers_fetcher]
- }
- super(NetworkCleaner, self).__init__('Network', res_desc, resources, dryrun)
-
- def remove_router_interface(self, router_id, port):
- """
- Remove the network interface from router
- """
- body = {
- # 'port_id': port['id']
- 'subnet_id': port['fixed_ips'][0]['subnet_id']
- }
- try:
- self.neutron.remove_interface_router(router_id, body)
- self.report_deletion('Router Interface', port['fixed_ips'][0]['ip_address'])
- except neutronclient.common.exceptions.NotFound:
- pass
-
- def remove_network_ports(self, net):
- """
- Remove ports belonging to network
- """
- for port in filter(lambda p: p['network_id'] == net, self.neutron.list_ports()['ports']):
- try:
- self.neutron.delete_port(port['id'])
- self.report_deletion('Network port', port['id'])
- except neutronclient.common.exceptions.NotFound:
- pass
-
- def clean(self):
- print '*** NETWORK cleanup'
-
- try:
- for id, name in self.resources['sec_groups'].iteritems():
- try:
- if self.dryrun:
- self.neutron.show_security_group(id)
- else:
- self.neutron.delete_security_group(id)
- self.report_deletion('SECURITY GROUP', name)
- except NotFound:
- self.report_not_found('SECURITY GROUP', name)
- except KeyError:
- pass
-
- try:
- for id, name in self.resources['floating_ips'].iteritems():
- try:
- if self.dryrun:
- self.neutron.show_floatingip(id)
- else:
- self.neutron.delete_floatingip(id)
- self.report_deletion('FLOATING IP', name)
- except neutronclient.common.exceptions.NotFound:
- self.report_not_found('FLOATING IP', name)
- except KeyError:
- pass
-
- try:
- for id, name in self.resources['routers'].iteritems():
- try:
- if self.dryrun:
- self.neutron.show_router(id)
- self.report_deletion('Router Gateway', name)
- port_list = self.neutron.list_ports(id)['ports']
- for port in port_list:
- if 'fixed_ips' in port:
- self.report_deletion('Router Interface',
- port['fixed_ips'][0]['ip_address'])
- else:
- self.neutron.remove_gateway_router(id)
- self.report_deletion('Router Gateway', name)
- # need to delete each interface before deleting the router
- port_list = self.neutron.list_ports(id)['ports']
- for port in port_list:
- self.remove_router_interface(id, port)
- self.neutron.delete_router(id)
- self.report_deletion('ROUTER', name)
- except neutronclient.common.exceptions.NotFound:
- self.report_not_found('ROUTER', name)
- except neutronclient.common.exceptions.Conflict as exc:
- self.report_error('ROUTER', name, str(exc))
- except KeyError:
- pass
- try:
- for id, name in self.resources['networks'].iteritems():
- try:
- if self.dryrun:
- self.neutron.show_network(id)
- else:
- self.remove_network_ports(id)
- self.neutron.delete_network(id)
- self.report_deletion('NETWORK', name)
- except neutronclient.common.exceptions.NetworkNotFoundClient:
- self.report_not_found('NETWORK', name)
- except neutronclient.common.exceptions.NetworkInUseClient as exc:
- self.report_error('NETWORK', name, str(exc))
- except KeyError:
- pass
-
-class KeystoneCleaner(AbstractCleaner):
-
- def __init__(self, sess, resources, dryrun):
- self.keystone = keystoneclient.Client(endpoint_type='publicURL', session=sess)
- self.tenant_api = self.keystone.tenants \
- if self.keystone.version == 'v2.0' else self.keystone.projects
- res_desc = {
- 'users': [self.keystone.users.list],
- 'tenants': [self.tenant_api.list]
- }
- super(KeystoneCleaner, self).__init__('Keystone', res_desc, resources, dryrun)
-
- def clean(self):
- print '*** KEYSTONE cleanup'
- try:
- for id, name in self.resources['users'].iteritems():
- try:
- if self.dryrun:
- self.keystone.users.get(id)
- else:
- self.keystone.users.delete(id)
- self.report_deletion('USER', name)
- except keystoneclient.auth.exceptions.http.NotFound:
- self.report_not_found('USER', name)
- except KeyError:
- pass
-
- try:
- for id, name in self.resources['tenants'].iteritems():
- try:
- if self.dryrun:
- self.tenant_api.get(id)
- else:
- self.tenant_api.delete(id)
- self.report_deletion('TENANT', name)
- except keystoneclient.auth.exceptions.http.NotFound:
- self.report_not_found('TENANT', name)
- except KeyError:
- pass
-
-class Cleaners(object):
-
- def __init__(self, creds_obj, resources, dryrun):
- self.cleaners = []
- sess = creds_obj.get_session()
- for cleaner_type in [StorageCleaner, ComputeCleaner, NetworkCleaner, KeystoneCleaner]:
- self.cleaners.append(cleaner_type(sess, resources, dryrun))
-
- def show_resources(self):
- table = [["Type", "Name", "UUID"]]
- for cleaner in self.cleaners:
- table.extend(cleaner.get_resource_list())
- count = len(table) - 1
- print
- if count:
- print 'SELECTED RESOURCES:'
- print tabulate(table, headers="firstrow", tablefmt="psql")
- else:
- print 'There are no resources to delete.'
- print
- return count
-
- def clean(self):
- for cleaner in self.cleaners:
- cleaner.clean()
-
-# A dictionary of resources to cleanup
-# First level keys are:
-# flavors, keypairs, users, routers, floating_ips, instances, volumes, sec_groups, tenants, networks
-# second level keys are the resource IDs
-# values are the resource name (e.g. 'nfvbench-net0')
-def get_resources_from_cleanup_log(logfile):
- '''Load triplets separated by '|' into a 2 level dictionary
- '''
- resources = {}
- with open(logfile) as ff:
- content = ff.readlines()
- for line in content:
- tokens = line.strip().split('|')
- restype = tokens[0]
- resname = tokens[1]
- resid = tokens[2]
- if not resid:
- # normally only the keypairs have no ID
- if restype != "keypairs":
- print 'Error: resource type %s has no ID - ignored!!!' % (restype)
- else:
- resid = '0'
- if restype not in resources:
- resources[restype] = {}
- tres = resources[restype]
- tres[resid] = resname
- return resources
-
-
-def main():
- parser = argparse.ArgumentParser(description='NFVbench Force Cleanup')
-
- parser.add_argument('-r', '--rc', dest='rc',
- action='store', required=False,
- help='openrc file',
- metavar='<file>')
- parser.add_argument('-f', '--file', dest='file',
- action='store', required=False,
- help='get resources to delete from cleanup log file '
- '(default:discover from OpenStack)',
- metavar='<file>')
- parser.add_argument('-d', '--dryrun', dest='dryrun',
- action='store_true',
- default=False,
- help='check resources only - do not delete anything')
- parser.add_argument('--filter', dest='filter',
- action='store', required=False,
- help='resource name regular expression filter (default:"nfvbench")'
- ' - OpenStack discovery only',
- metavar='<any-python-regex>')
- opts = parser.parse_args()
-
- cred = credentials.Credentials(openrc_file=opts.rc)
-
- if opts.file:
- resources = get_resources_from_cleanup_log(opts.file)
- else:
- # None means try to find the resources from openstack directly by name
- resources = None
- global resource_name_re
- if opts.filter:
- try:
- resource_name_re = re.compile(opts.filter)
- except Exception as exc:
- print 'Provided filter is not a valid python regular expression: ' + opts.filter
- print str(exc)
- sys.exit(1)
- else:
- resource_name_re = re.compile('nfvbench')
-
- cleaners = Cleaners(cred, resources, opts.dryrun)
-
- if opts.dryrun:
- print
- print('!!! DRY RUN - RESOURCES WILL BE CHECKED BUT WILL NOT BE DELETED !!!')
- print
-
- # Display resources to be deleted
- count = cleaners.show_resources()
- if not count:
- sys.exit(0)
-
- if not opts.file and not opts.dryrun:
- prompt_to_run()
-
- cleaners.clean()
-
-if __name__ == '__main__':
- main()
diff --git a/client/client.py b/client/client.py
index 5cbc733..b1be69c 100644
--- a/client/client.py
+++ b/client/client.py
@@ -17,8 +17,6 @@
import requests
import time
-from socketIO_client import SocketIO
-
class TimeOutException(Exception):
pass
@@ -32,42 +30,14 @@ class NfvbenchClient(object):
"""Python client class to control a nfvbench server
The nfvbench server must run in background using the --server option.
- Since HTML pages are not required, the path to pass to --server can be
- any directory on the host.
"""
- def __init__(self, nfvbench_url, use_socketio):
+ def __init__(self, nfvbench_url):
"""Client class to send requests to the nfvbench server
Args:
nfvbench_url: the URL of the nfvbench server (e.g. 'http://127.0.0.1:7555')
"""
self.url = nfvbench_url
- self.use_socketio = use_socketio
-
- def socketio_send(self, send_event, receive_event, config, timeout):
- class Exec(object):
- socketIO = None
- socketio_result = None
-
- def close_socketio(result):
- Exec.socketio_result = result
- Exec.socketIO.disconnect()
-
- def on_response(*args):
- close_socketio(args[0])
-
- def on_error(*args):
- raise NfvbenchException(args[0])
-
- Exec.socketIO = SocketIO(self.url)
- Exec.socketIO.on(receive_event, on_response)
- Exec.socketIO.on('error', on_error)
- Exec.socketIO.emit(send_event, config)
- Exec.socketIO.wait(seconds=timeout)
-
- if timeout and not Exec.socketio_result:
- raise TimeOutException()
- return Exec.socketio_result
def http_get(self, command, config):
url = self.url + '/' + command
@@ -102,8 +72,6 @@ class NfvbenchClient(object):
TimeOutException: the request timed out (and might still being executed
by the server)
"""
- if self.use_socketio:
- return self.socketio_send('echo', 'echo', config, timeout)
return self.http_get('echo', config)
def run_config(self, config, timeout=300, poll_interval=5):
@@ -132,8 +100,6 @@ class NfvbenchClient(object):
the exception contains the description of the failure.
TimeOutException: the request timed out but will still be executed by the server.
"""
- if self.use_socketio:
- return self.socketio_send('start_run', 'run_end', config, timeout)
res = self.http_post('start_run', config)
if res['status'] != 'PENDING':
raise NfvbenchException(res['error_message'])
diff --git a/client/nfvbench_client.py b/client/nfvbench_client.py
index 3973b9c..c528df8 100644
--- a/client/nfvbench_client.py
+++ b/client/nfvbench_client.py
@@ -54,9 +54,6 @@ def main():
action='store',
help='time (seconds) to wait for NFVbench result',
metavar='<config>')
- parser.add_argument('--use-socketio', dest='use_socketio',
- action='store_true',
- help='NFVbench config to echo (json format)')
parser.add_argument('url', help='nfvbench server url (e.g. http://10.0.0.1:5000)')
opts = parser.parse_args()
@@ -64,7 +61,7 @@ def main():
print('at least one of -f or -c or -e required')
sys.exit(-1)
- nfvbench = NfvbenchClient(opts.url, opts.use_socketio)
+ nfvbench = NfvbenchClient(opts.url)
# convert JSON into a dict
try:
timeout = int(opts.timeout)
diff --git a/client/requirements.txt b/client/requirements.txt
index 80fc402..84ced9c 100644
--- a/client/requirements.txt
+++ b/client/requirements.txt
@@ -1,7 +1,5 @@
#
#
backports.ssl-match-hostname==3.5.0.1 # via websocket-client
-requests==2.13.0 # via socketio-client
-six==1.10.0 # via socketio-client, websocket-client
-socketIO-client==0.7.2
-websocket-client==0.40.0 # via socketio-client
+requests==2.13.0
+six==1.10.0 # via websocket-client
diff --git a/docker/Dockerfile b/docker/Dockerfile
index ec31b1a..46be733 100644
--- a/docker/Dockerfile
+++ b/docker/Dockerfile
@@ -1,42 +1,53 @@
# docker file for creating a container that has nfvbench installed and ready to use
-FROM ubuntu:16.04
+FROM ubuntu:20.04
-ENV TREX_VER "v2.32"
-ENV NFVBENCH_TAG "1.2.1"
-ENV VM_IMAGE_VER "0.5"
+ENV TREX_VER "v2.89"
+ENV VM_IMAGE_VER "0.15"
+ENV PYTHONIOENCODING "utf8"
RUN apt-get update && apt-get install -y \
git \
kmod \
pciutils \
- python \
- python-pip \
+ python3.8 \
vim \
wget \
net-tools \
+ iproute2 \
libelf1 \
- && mkdir /tmp/http_root \
+ python3-dev \
+ libpython3.8-dev \
+ python3-distutils \
+ gcc \
+ && ln -s /usr/bin/python3.8 /usr/local/bin/python3 \
&& mkdir -p /opt/trex \
&& mkdir /var/log/nfvbench \
- && wget --no-cache https://trex-tgn.cisco.com/trex/release/$TREX_VER.tar.gz \
+ && wget --no-cache --no-check-certificate https://trex-tgn.cisco.com/trex/release/$TREX_VER.tar.gz \
&& tar xzf $TREX_VER.tar.gz -C /opt/trex \
&& rm -f /$TREX_VER.tar.gz \
&& rm -f /opt/trex/$TREX_VER/trex_client_$TREX_VER.tar.gz \
- && cp -a /opt/trex/$TREX_VER/automation/trex_control_plane/stl/trex_stl_lib /usr/local/lib/python2.7/dist-packages/ \
- && rm -rf /opt/trex/$TREX_VER/automation/trex_control_plane/stl/trex_stl_lib \
- && sed -i -e "s/2048 /512 /" -e "s/2048\"/512\"/" /opt/trex/$TREX_VER/trex-cfg \
- && pip install -U pip pbr \
- && pip install -U setuptools \
- && cd / \
- && git clone --depth 1 -b $NFVBENCH_TAG https://gerrit.opnfv.org/gerrit/nfvbench \
- && cd /nfvbench && pip install -e . \
+ && cp -a /opt/trex/$TREX_VER/automation/trex_control_plane/interactive/trex /usr/local/lib/python3.8/dist-packages/ \
+ && rm -rf /opt/trex/$TREX_VER/automation/trex_control_plane/interactive/trex \
+ && wget https://bootstrap.pypa.io/get-pip.py \
+ && python3 get-pip.py \
+ && pip3 install -U pbr \
+ && pip3 install -U setuptools \
+ && cd /opt \
+ # Note: do not clone with --depth 1 as it will cause pbr to fail extracting the nfvbench version
+ # from the git tag
+ && git clone https://gerrit.opnfv.org/gerrit/nfvbench \
+ && cd nfvbench && pip3 install -e . \
&& wget -O nfvbenchvm-$VM_IMAGE_VER.qcow2 http://artifacts.opnfv.org/nfvbench/images/nfvbenchvm_centos-$VM_IMAGE_VER.qcow2 \
- && python ./docker/cleanup_generators.py \
- && rm -rf /nfvbench/.git \
- && apt-get remove -y wget git \
+ # Override Xtesting testcases.yaml file by NFVbench default one
+ && cp xtesting/testcases.yaml /usr/local/lib/python3.8/dist-packages/xtesting/ci/testcases.yaml \
+ && python3 ./docker/cleanup_generators.py \
+ && rm -rf /opt/nfvbench/.git \
+ # Symlink for retrocompatibility 4.x
+ && ln -s /opt/nfvbench /nfvbench \
+ && apt-get remove -y wget git python3-dev libpython3.8-dev gcc \
&& apt-get autoremove -y && apt-get clean && rm -rf /var/lib/apt/lists/*
-ENV TREX_STL_EXT_PATH "/opt/trex/$TREX_VER/external_libs"
+ENV TREX_EXT_LIBS "/opt/trex/$TREX_VER/external_libs"
-ENTRYPOINT ["/nfvbench/docker/nfvbench-entrypoint.sh"]
+ENTRYPOINT ["/opt/nfvbench/docker/nfvbench-entrypoint.sh"]
diff --git a/docker/cleanup_generators.py b/docker/cleanup_generators.py
index db68dcb..c555d59 100755
--- a/docker/cleanup_generators.py
+++ b/docker/cleanup_generators.py
@@ -40,8 +40,8 @@ def remove_unused_libs(path, files):
else:
os.remove(f)
except OSError:
- print "Skipped file:"
- print f
+ print("Skipped file:")
+ print(f)
continue
@@ -65,14 +65,14 @@ if __name__ == "__main__":
versions = os.listdir(TREX_OPT)
for version in versions:
trex_path = os.path.join(TREX_OPT, version)
- print 'Cleaning TRex', version
+ print('Cleaning TRex', version)
try:
size_before = get_dir_size(trex_path)
remove_unused_libs(trex_path, TREX_UNUSED)
size_after = get_dir_size(trex_path)
- print '==== Saved Space ===='
- print size_before - size_after
+ print('==== Saved Space ====')
+ print(size_before - size_after)
except OSError:
import traceback
- print traceback.print_exc()
- print 'Cleanup was not finished.'
+ print(traceback.print_exc())
+ print('Cleanup was not finished.')
diff --git a/docker/nfvbench-entrypoint.sh b/docker/nfvbench-entrypoint.sh
index ed98ced..913e5ba 100755
--- a/docker/nfvbench-entrypoint.sh
+++ b/docker/nfvbench-entrypoint.sh
@@ -13,11 +13,19 @@
# License for the specific language governing permissions and limitations
# under the License.
#
-
-if [ -z "$1" ] || [ $1 != 'start_rest_server' ]; then
+if [ -z "$1" ] || ([ $1 != 'start_rest_server' ] && [ $1 != 'run_tests' ] && [ $1 != 'zip_campaign' ]); then
tail -f /dev/null
+elif [ $1 == 'run_tests' ]; then
+ PARAMS=""
+ for var in "${@:2}"
+ do
+ PARAMS+="$var "
+ done
+ eval "run_tests $PARAMS"
+elif [ $1 == 'zip_campaign' ]; then
+ zip_campaign
else
- PARAMS="--server /tmp/http_root"
+ PARAMS="--server"
if [ -n "$HOST" ]; then
PARAMS+=" --host $HOST"
fi
diff --git a/docs/Makefile b/docs/Makefile
index 2d4ff46..d4bb2cb 100644
--- a/docs/Makefile
+++ b/docs/Makefile
@@ -1,225 +1,20 @@
-# Makefile for Sphinx documentation
+# Minimal makefile for Sphinx documentation
#
-# You can set these variables from the command line.
-SPHINXOPTS =
-SPHINXBUILD = sphinx-build
-PAPER =
+# You can set these variables from the command line, and also
+# from the environment for the first two.
+SPHINXOPTS ?=
+SPHINXBUILD ?= sphinx-build
+SOURCEDIR = .
BUILDDIR = _build
-# Internal variables.
-PAPEROPT_a4 = -D latex_paper_size=a4
-PAPEROPT_letter = -D latex_paper_size=letter
-ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) testing/user/userguide
-# the i18n builder cannot share the environment and doctrees with the others
-I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) testing/user/userguide
-
-.PHONY: help
+# Put it first so that "make" without argument is like "make help".
help:
- @echo "Please use \`make <target>' where <target> is one of"
- @echo " html to make standalone HTML files"
- @echo " dirhtml to make HTML files named index.html in directories"
- @echo " singlehtml to make a single large HTML file"
- @echo " pickle to make pickle files"
- @echo " json to make JSON files"
- @echo " htmlhelp to make HTML files and a HTML help project"
- @echo " qthelp to make HTML files and a qthelp project"
- @echo " applehelp to make an Apple Help Book"
- @echo " devhelp to make HTML files and a Devhelp project"
- @echo " epub to make an epub"
- @echo " epub3 to make an epub3"
- @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
- @echo " latexpdf to make LaTeX files and run them through pdflatex"
- @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
- @echo " text to make text files"
- @echo " man to make manual pages"
- @echo " texinfo to make Texinfo files"
- @echo " info to make Texinfo files and run them through makeinfo"
- @echo " gettext to make PO message catalogs"
- @echo " changes to make an overview of all changed/added/deprecated items"
- @echo " xml to make Docutils-native XML files"
- @echo " pseudoxml to make pseudoxml-XML files for display purposes"
- @echo " linkcheck to check all external links for integrity"
- @echo " doctest to run all doctests embedded in the documentation (if enabled)"
- @echo " coverage to run coverage check of the documentation (if enabled)"
- @echo " dummy to check syntax errors of document sources"
-
-.PHONY: clean
-clean:
- rm -rf $(BUILDDIR)/*
-
-.PHONY: html
-html:
- $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
- @echo
- @echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
-
-.PHONY: dirhtml
-dirhtml:
- $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
- @echo
- @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
-
-.PHONY: singlehtml
-singlehtml:
- $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
- @echo
- @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
-
-.PHONY: pickle
-pickle:
- $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
- @echo
- @echo "Build finished; now you can process the pickle files."
-
-.PHONY: json
-json:
- $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
- @echo
- @echo "Build finished; now you can process the JSON files."
-
-.PHONY: htmlhelp
-htmlhelp:
- $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
- @echo
- @echo "Build finished; now you can run HTML Help Workshop with the" \
- ".hhp project file in $(BUILDDIR)/htmlhelp."
-
-.PHONY: qthelp
-qthelp:
- $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
- @echo
- @echo "Build finished; now you can run "qcollectiongenerator" with the" \
- ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
- @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/NFVBench.qhcp"
- @echo "To view the help file:"
- @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/NFVBench.qhc"
-
-.PHONY: applehelp
-applehelp:
- $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp
- @echo
- @echo "Build finished. The help book is in $(BUILDDIR)/applehelp."
- @echo "N.B. You won't be able to view it unless you put it in" \
- "~/Library/Documentation/Help or install it in your application" \
- "bundle."
-
-.PHONY: devhelp
-devhelp:
- $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
- @echo
- @echo "Build finished."
- @echo "To view the help file:"
- @echo "# mkdir -p $$HOME/.local/share/devhelp/NFVBench"
- @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/NFVBench"
- @echo "# devhelp"
-
-.PHONY: epub
-epub:
- $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
- @echo
- @echo "Build finished. The epub file is in $(BUILDDIR)/epub."
-
-.PHONY: epub3
-epub3:
- $(SPHINXBUILD) -b epub3 $(ALLSPHINXOPTS) $(BUILDDIR)/epub3
- @echo
- @echo "Build finished. The epub3 file is in $(BUILDDIR)/epub3."
-
-.PHONY: latex
-latex:
- $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
- @echo
- @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
- @echo "Run \`make' in that directory to run these through (pdf)latex" \
- "(use \`make latexpdf' here to do that automatically)."
-
-.PHONY: latexpdf
-latexpdf:
- $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
- @echo "Running LaTeX files through pdflatex..."
- $(MAKE) -C $(BUILDDIR)/latex all-pdf
- @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
-
-.PHONY: latexpdfja
-latexpdfja:
- $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
- @echo "Running LaTeX files through platex and dvipdfmx..."
- $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
- @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
-
-.PHONY: text
-text:
- $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
- @echo
- @echo "Build finished. The text files are in $(BUILDDIR)/text."
-
-.PHONY: man
-man:
- $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
- @echo
- @echo "Build finished. The manual pages are in $(BUILDDIR)/man."
-
-.PHONY: texinfo
-texinfo:
- $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
- @echo
- @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
- @echo "Run \`make' in that directory to run these through makeinfo" \
- "(use \`make info' here to do that automatically)."
-
-.PHONY: info
-info:
- $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
- @echo "Running Texinfo files through makeinfo..."
- make -C $(BUILDDIR)/texinfo info
- @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
-
-.PHONY: gettext
-gettext:
- $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
- @echo
- @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
-
-.PHONY: changes
-changes:
- $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
- @echo
- @echo "The overview file is in $(BUILDDIR)/changes."
-
-.PHONY: linkcheck
-linkcheck:
- $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
- @echo
- @echo "Link check complete; look for any errors in the above output " \
- "or in $(BUILDDIR)/linkcheck/output.txt."
-
-.PHONY: doctest
-doctest:
- $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
- @echo "Testing of doctests in the sources finished, look at the " \
- "results in $(BUILDDIR)/doctest/output.txt."
-
-.PHONY: coverage
-coverage:
- $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage
- @echo "Testing of coverage in the sources finished, look at the " \
- "results in $(BUILDDIR)/coverage/python.txt."
-
-.PHONY: xml
-xml:
- $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
- @echo
- @echo "Build finished. The XML files are in $(BUILDDIR)/xml."
+ @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
-.PHONY: pseudoxml
-pseudoxml:
- $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
- @echo
- @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
+.PHONY: help Makefile
-.PHONY: dummy
-dummy:
- $(SPHINXBUILD) -b dummy $(ALLSPHINXOPTS) $(BUILDDIR)/dummy
- @echo
- @echo "Build finished. Dummy builder generates no files."
+# Catch-all target: route all unknown targets to Sphinx using the new
+# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
+%: Makefile
+ @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
diff --git a/docs/conf.py b/docs/conf.py
new file mode 100644
index 0000000..cf53232
--- /dev/null
+++ b/docs/conf.py
@@ -0,0 +1,68 @@
+# Copyright 2016 - 2023, Cisco Systems, Inc. and the NFVbench project contributors
+# SPDX-License-Identifier: Apache-2.0
+
+# Configuration file for the Sphinx documentation builder.
+#
+# This file only contains a selection of the most common options. For a full
+# list see the documentation:
+# https://www.sphinx-doc.org/en/master/usage/configuration.html
+
+import pbr.version
+
+
+# -- Path setup --------------------------------------------------------------
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#
+# import os
+# import sys
+# sys.path.insert(0, os.path.abspath('.'))
+
+
+# -- Project information -----------------------------------------------------
+
+project = 'NFVbench'
+copyright = '2016 - 2023, Cisco Systems, Inc. and the NFVbench project contributors'
+author = 'Cisco Systems, Inc. and the NFVbench project contributors'
+
+# -- Project version ---------------------------------------------------------
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = pbr.version.VersionInfo(project).version_string()
+# The full version, including alpha/beta/rc tags.
+release = pbr.version.VersionInfo(project).version_string_with_vcs()
+
+# -- General configuration ---------------------------------------------------
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = [
+]
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+# This pattern also affects html_static_path and html_extra_path.
+exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
+
+
+# -- Options for HTML output -------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages. See the documentation for
+# a list of builtin themes.
+#
+html_theme = 'piccolo_theme'
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
diff --git a/docs/developer/building.rst b/docs/developer/building.rst
new file mode 100644
index 0000000..00b8654
--- /dev/null
+++ b/docs/developer/building.rst
@@ -0,0 +1,77 @@
+
+.. This work is licensed under a Creative Commons Attribution 4.0 International
+.. License.
+.. http://creativecommons.org/licenses/by/4.0
+.. (c) Cisco Systems, Inc
+
+Building Containers and VM Images
+=================================
+
+NFVbench is delivered as Docker container which is built using the Dockerfile under the docker directory.
+This container includes the following parts:
+
+- TRex traffic generator
+- NFVbench orchestration
+- NFVbench test VM (qcow2)
+
+.. _nfvbench-artefact-versioning:
+
+Versioning
+----------
+These 3 parts are versioned independently and the Dockerfile will determine the combination of versions that
+are packaged in the container for the version associated to the Dockerfile.
+
+The NFVbench version is controlled by the git tag that conforms to the semver version (e.g. "3.3.0").
+This tag controls the version of the Dockerfile used for building the container.
+
+The TRex version is controlled by the TREX_VER variable in Dockerfile (e.g. ENV TREX_VER "v2.56").
+TRex is installed in container from https://github.com/cisco-system-traffic-generator/trex-core/releases
+
+The Test VM version is controlled by the VM_IMAGE_VER variable in Dockerfile (e.g. ENV VM_IMAGE_VER "0.8").
+The VM is extracted from google storage (http://artifacts.opnfv.org)
+
+Updating the VM image
+---------------------
+
+When the VM image is changed, its version must be increased in order to distinguish from previous image versions.
+The version strings to change are located in 2 files:
+
+- docker/Dockerfile
+- nfvbench/nfvbenchvm/dib/build-image.sh
+
+Building and uploading the VM image
+-----------------------------------
+The VM image is built on gerrit verify when the image is not present in google storage.
+It is not uploaded yet on google storage.
+
+The build + upload of the new VM image is done after the review is merged.
+
+For details on how this is done, refer to ./jjb/nfvbench/nfvbench.yaml in the opnfv releng repository.
+
+Building a new NFVbench container image
+---------------------------------------
+A new container image can be built and published to Dockerhub by CI/CD by applying a new semver tag to the
+nfvbench repository.
+
+
+Workflow summary
+----------------
+
+NFVbench code has changed:
+
+- commit with gerrit
+- apply a new semver tag to trigger the container image build/publication
+
+VM code has changed:
+
+- update VM version in the 2 locations
+- commit VM changes with gerrit to trigger VM build and publication to google storage
+- IMPORTANT! wait for the VM image to be pushed to google storage before going to the next step
+ (otherwise the container build will fail as it will not find the VM image)
+- apply a new semver tag to trigger the container image build/publication
+
+To increase the TRex version:
+
+- change the Trex version in Dockerfile
+- commit with gerrit
+- apply a new semver tag to trigger the container image build/publication
diff --git a/docs/development/design/design.rst b/docs/developer/design/design.rst
index d0f2f45..43011ad 100644
--- a/docs/development/design/design.rst
+++ b/docs/developer/design/design.rst
@@ -1,32 +1,31 @@
-
-
-.. contents::
- :depth: 3
- :local:
-
.. This work is licensed under a Creative Commons Attribution 4.0 International
.. License.
.. http://creativecommons.org/licenses/by/4.0
.. (c) Cisco Systems, Inc
-Introduction
-------------
+*******************
+NFVbench components
+*******************
NFVbench can be decomposed in the following components:
+
- Configuration
-- Staging
-- Traffic generation
-- Traffic generator results analysis
+- Orchestration:
+
+ - Staging
+ - Traffic generation
+ - Results analysis
Configuration
--------------
+=============
This component is in charge of getting the configuration options from the user and consolidate them with
the default configuration into a running configuration.
default configuration + user configuration options = running configuration
User configuration can come from:
+
- CLI configuration shortcut arguments (e.g --frame-size)
- CLI configuration file (--config [file])
- CLI configuration string (--config [string])
@@ -34,7 +33,8 @@ User configuration can come from:
- custom platform pluging
The precedence order for configuration is (from highest precedence to lowest precedence)
-- CLI confguration or REST configuration
+
+- CLI configuration or REST configuration
- custom platform plugin
- default configuration
@@ -43,6 +43,11 @@ with default platform options which can be either hardcoded or calculated at run
(such as platform deployment configuration files).
A custom platform plugin class is a child of the parent class nfvbench.config_plugin.ConfigPlugin.
+Orchestration
+=============
+Once the configuration is settled, benchmark orchestration is managed by the ChainRunner class (nfvbench.chain_runner.ChainRunner).
+The chain runner will take care of orchestrating the staging, traffic generation and results analysis.
+
Staging
-------
@@ -50,14 +55,15 @@ The staging component is in charge of staging the OpenStack resources that are u
For example, for a PVP packet path, this module will create 2 Neutron networks and one VM instance connected to these 2 networks.
Multi-chaining and VM placement is also handled by this module.
-Main class: nfvbench.chain_managers.StageManager
+Main class: nfvbench.chaining.ChainManager
Traffic Generation
------------------
The traffic generation component is in charge of contrilling the TRex traffic generator using its python API.
It includes tasks such as:
+
- traffic check end to end to make sure the packet path is clear in both directions before starting a benchmark
-- programming the Trex traffic flows based on requested parameters
+- programming the TRex traffic flows based on requested parameters
- fixed rate control
- NDR/PDR binary search
@@ -70,4 +76,4 @@ At the end of a traffic generation session, this component collects the results
is suitable for the various output formats (JSON, REST, file, fluentd).
In the case of multi-chaining, it handles aggregation of results across chains.
-Main class: nfvbench.chain_managers.StatsManager
+Main class: nfvbench.stats_manager.StatsManager
diff --git a/docs/development/design/index.rst b/docs/developer/design/index.rst
index c54888a..4c52f98 100644
--- a/docs/development/design/index.rst
+++ b/docs/developer/design/index.rst
@@ -3,13 +3,15 @@
.. http://creativecommons.org/licenses/by/4.0
.. (c) Cisco Systems, Inc
-===============================
-OPNFV NFVbench Euphrates Design
-===============================
+=====================
+NFVbench Design Notes
+=====================
.. toctree::
:maxdepth: 2
+ overview
design
versioning
+ traffic_desc
ndrpdr
diff --git a/docs/developer/design/ndrpdr.rst b/docs/developer/design/ndrpdr.rst
new file mode 100644
index 0000000..dd769c0
--- /dev/null
+++ b/docs/developer/design/ndrpdr.rst
@@ -0,0 +1,83 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International
+.. License.
+.. http://creativecommons.org/licenses/by/4.0
+.. (c) Cisco Systems, Inc
+
+NDR/PDR Binary Search
+=====================
+
+The NDR/PDR binary search algorithm used by NFVbench is based on the algorithm used by the
+FD.io CSIT project, with some additional optimizations.
+
+Algorithm Outline
+-----------------
+
+The ServiceChain class (nfvbench/service_chain.py) is responsible for calculating the NDR/PDR
+or all frame sizes requested in the configuration.
+Calculation for 1 frame size is delegated to the TrafficClient class (nfvbench/traffic_client.py)
+
+Call chain for calculating the NDR-PDR for a list of frame sizes:
+
+- ServiceChain.run()
+ - ServiceChain._get_chain_results()
+ - for every frame size:
+ - ServiceChain.__get_result_per_frame_size()
+ - TrafficClient.get_ndr_pdr()
+ - TrafficClient.__range_search() recursive binary search
+
+The search range is delimited by a left and right rate (expressed as a % of line rate per direction).
+The search always start at line rate per port, e.g. in the case of 2x10Gbps, the first iteration
+will send 10Gbps of traffic on each port.
+
+The load_epsilon configuration parameter defines the accuracy of the result as a % of line rate.
+The default value of 0.1 indicates for example that the measured NDR and PDR are within 0.1% of line rate of the
+actual NDR/PDR (e.g. 0.1% of 10Gbps is 10Mbps). It also determines how small the search range must be in the binary search.
+Smaller values of load_epsilon will result in more iterations and will take more time but may not
+always be beneficial if the absolute value falls below the precision level of the measurement.
+For example a value of 0.01% would translate to an absolute value of 1Mbps (for a 10Gbps port) or
+around 10kpps (at 64 byte size) which might be too fine grain.
+
+The recursion narrows down the range by half and stops when:
+
+- the range is smaller than the configured load_epsilon value
+- or when the search hits 100% or 0% of line rate
+
+Optimization
+------------
+
+Binary search algorithms assume that the drop rate curve is monotonically increasing with the Tx rate.
+To save time, the algorithm used by NFVbench is capable of calculating the optimal Tx rate for an
+arbitrary list of target maximum drop rates in one pass instead of the usual 1 pass per target maximum drop rate.
+This saves time linearly to the number target drop rates.
+For example, a typical NDR/PDR search will have 2 target maximum drop rates:
+
+- NDR = 0.001%
+- PDR = 0.1%
+
+The binary search will then start with a sorted list of 2 target drop rates: [0.1, 0.001].
+The first part of the binary search will then focus on finding the optimal rate for the first target
+drop rate (0.1%). When found, the current target drop rate is removed from the list and
+iteration continues with the next target drop rate in the list but this time
+starting from the upper/lower range of the previous target drop rate, which saves significant time.
+The binary search continues until the target maximum drop rate list is empty.
+
+Results Granularity
+-------------------
+The binary search results contain per direction stats (forward and reverse).
+In the case of multi-chaining, results contain per chain stats.
+The current code only reports aggregated stats (forward + reverse for all chains) but could be enhanced
+to report per chain stats.
+
+
+CPU Limitations
+---------------
+One particularity of using a software traffic generator is that the requested Tx rate may not always be met due to
+resource limitations (e.g. CPU is not fast enough to generate a very high load). The algorithm should take this into
+consideration:
+
+- always monitor the actual Tx rate achieved as reported back by the traffic generator
+- actual Tx rate is always <= requested Tx rate
+- the measured drop rate should always be relative to the actual Tx rate
+- if the actual Tx rate is < requested Tx rate and the measured drop rate is already within threshold
+ (<NDR/PDR threshold) then the binary search must stop with proper warning because the actual NDR/PDR
+ might probably be higher than the reported values
diff --git a/docs/development/overview/overview.rst b/docs/developer/design/overview.rst
index 792d50f..9876d62 100644
--- a/docs/development/overview/overview.rst
+++ b/docs/developer/design/overview.rst
@@ -3,21 +3,19 @@
.. http://creativecommons.org/licenses/by/4.0
.. (c) Cisco Systems, Inc
-.. contents::
- :depth: 3
- :local:
+Overview
+--------
-Introduction
-----------------
NFVbench is a python application that is designed to run in a compact and portable format inside a container and on production pods.
As such it only uses open sourec software with minimal hardware requirements (just a NIC card that is DPDK compatible).
Traffic generation is handled by TRex on 2 physical ports (2x10G or higher) forming traffic loops up to VNF level and following
-a path that is common to all NFV applications: external source to top of rack switch(es) to conpute node(s) to vswitch (if applicable)
+a path that is common to all NFV applications: external source to top of rack switch(es) to compute node(s) to vswitch (if applicable)
to VNF(s) and back.
-Configuration of benchmarks is through a hierarchy of yaml configuraton files and command line arguments.
+Configuration of benchmarks is through a yaml configuraton file and command line arguments.
Results are available in different formats:
+
- text output with tabular results
- json result in file or in REST reply (most detailed)
diff --git a/docs/developer/design/traffic_desc.rst b/docs/developer/design/traffic_desc.rst
new file mode 100644
index 0000000..d6bbb6b
--- /dev/null
+++ b/docs/developer/design/traffic_desc.rst
@@ -0,0 +1,85 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International
+.. License.
+.. http://creativecommons.org/licenses/by/4.0
+.. (c) Cisco Systems, Inc
+
+Traffic Description
+===================
+
+The general packet path model followed by NFVbench requires injecting traffic into an arbitrary
+number of service chains, where each service chain is identified by 2 edge networks (left and right).
+In the current multi-chaining model:
+
+- all service chains can either share the same left and right edge networks or can have their own edge networks
+- each port associated to the traffic generator is dedicated to send traffic to one side of the edge networks
+
+If VLAN encapsulation is used, all traffic sent to a port will either have the same VLAN id (shared networks) or distinct VLAN ids (dedicated egde networks)
+
+Basic Packet Description
+------------------------
+
+The code to create the UDP packet is located in TRex.create_pkt() (nfvbench/traffic_gen/trex.py).
+
+NFVbench always generates UDP packets (even when doing L2 forwarding).
+The final size of the frame containing each UDP packet will be based on the requested L2 frame size.
+When taking into account the minimum payload size requirements from the traffic generator for
+the latency streams, the minimum L2 frame size is 64 byte.
+
+Flows Specification
+-------------------
+
+Mac Addresses
+.............
+The source MAC address is always the local port MAC address (for each port).
+The destination MAC address is based on the configuration and can be:
+
+- the traffic generator peer port MAC address in the case of L2 loopback at the switch level
+ or when using a loopback cable
+- the dest MAC as specified by the configuration file (EXT chain no ARP)
+- the dest MAC as discovered by ARP (EXT chain)
+- the router MAC as discovered from Neutron API (PVPL3 chain)
+- the VM MAC as dicovered from Neutron API (PVP, PVVP chains)
+
+NFVbench does not currently range on the MAC addresses.
+
+IP addresses
+............
+The source IP address is fixed per chain.
+The destination IP address is variable within a distinct range per chain.
+
+UDP ports
+.........
+The source and destination ports are fixed for all packets and can be set in the configuratoon
+file (default is 53).
+
+Payload User Data
+.................
+The length of the user data is based on the requested L2 frame size and takes into account the
+size of the L2 header - including the VLAN tag if applicable.
+
+
+IMIX Support
+------------
+In the case of IMIX, each direction is made of 4 streams:
+
+- 1 latency stream
+- 1 stream for each IMIX frame size
+
+The IMIX ratio is encoded into the number of consecutive packets sent by each stream in turn.
+
+Service Chains and Streams
+--------------------------
+A stream identifies one "stream" of packets with same characteristics such as rate and destination address.
+NFVbench will create 2 streams per service chain per direction:
+
+- 1 latency stream set to 1000pps
+- 1 main traffic stream set to the requested Tx rate less the latency stream rate (1000pps)
+
+For example, a benchmark with 1 chain (fixed rate) will result in a total of 4 streams.
+A benchmark with 20 chains will results in a total of 80 streams (fixed rate, it is more with IMIX).
+
+The overall flows are split equally between the number of chains by using the appropriate destination
+MAC address.
+
+For example, in the case of 10 chains, 1M flows and fixed rate, there will be a total of 40 streams.
+Each of the 20 non-latency stream will generate packets corresponding to 50,000 flows (unique src/dest address tuples).
diff --git a/docs/development/design/versioning.rst b/docs/developer/design/versioning.rst
index 870ed86..40e70f2 100644
--- a/docs/development/design/versioning.rst
+++ b/docs/developer/design/versioning.rst
@@ -8,15 +8,9 @@ Versioning
==========
NFVbench uses semver compatible git tags such as "1.0.0". These tags are also called project tags and applied at important commits on the master branch exclusively.
-Rules for the version numbers follow the semver 2.0 specification (http://semver.org).
+Rules for the version numbers follow the semver 2.0 specification (https://semver.org).
These git tags are applied indepently of the OPNFV release tags which are applied only on the stable release branches (e.g. "opnfv-5.0.0").
In general it is recommeneded to always have a project git version tag associated to any OPNFV release tag content obtained from a sync from master.
-NFVbench Docker containers will be versioned based on the OPNF release tags or based on NFVbench project tags.
-
-
-
-
-
-
+NFVbench Docker containers will be versioned based on the NFVbench project tags.
diff --git a/docs/development/index.rst b/docs/developer/index.rst
index 1db91e7..d9bf844 100644
--- a/docs/development/index.rst
+++ b/docs/developer/index.rst
@@ -3,8 +3,14 @@
.. http://creativecommons.org/licenses/by/4.0
.. (c) Cisco Systems, Inc
+************************
+NFVbench Developer Guide
+************************
+
.. toctree::
:maxdepth: 3
- overview/index
+ building
+ nfvbenchvm
+ testing-nfvbench
design/index
diff --git a/docs/developer/nfvbenchvm.rst b/docs/developer/nfvbenchvm.rst
new file mode 100644
index 0000000..5d6166f
--- /dev/null
+++ b/docs/developer/nfvbenchvm.rst
@@ -0,0 +1,365 @@
+.. Copyright 2016 - 2023, Cisco Systems, Inc. and the NFVbench project contributors
+.. SPDX-License-Identifier: CC-BY-4.0
+
+NFVBENCH VM IMAGES FOR OPENSTACK
+++++++++++++++++++++++++++++++++
+
+This repo will build two centos 7 images with:
+ - testpmd and VPP installed for loop VM use case
+ - NFVbench and TRex installed for generator VM use case
+
+These VMs will come with a pre-canned user/password: nfvbench/nfvbench
+
+BUILD INSTRUCTIONS
+==================
+
+Pre-requisites
+--------------
+- must run on Linux
+- the following packages must be installed prior to using this script:
+ - python3 (+ python3-venv on Ubuntu)
+ - python3-pip
+ - git
+ - qemu-img (CentOs) or qemu-utils (Ubuntu)
+ - kpartx
+
+.. note:: The image build process is based on `diskimage-builder
+ <https://docs.openstack.org/diskimage-builder/latest/index.html>`_
+ that will be installed in a Python virtual environment by nfvbenchvm
+ build script build-image.sh.
+
+.. note:: build-image.sh uses the `gsutil <https://pypi.org/project/gsutil/>`_
+ tool to interact with Google cloud storage (to check if the images
+ exist and to upload the images). This is normally only needed in the
+ context of OPNFV build infrastructure, and build-image.sh can be used
+ without that tool in development environments.
+
+Build the image
+---------------
+- cd dib
+- update the version number for the image (if needed) by modifying __version__ in build-image.sh
+- setup your http_proxy if needed
+- run ``build-image.sh`` to build the images. A few examples:
+
+ - to build all the images and publish the code to Google cloud storage:
+ - ``bash build-image.sh``
+ - to build and publish only the loop VM:
+ - ``bash build-image.sh -l``
+ - to build and publish only the generator VM:
+ - ``bash build-image.sh -g``
+ - to build the generator VM without publishing it:
+ - ``bash build-image.sh -gv``
+
+.. note:: Run ``bash build-image.sh`` -h to see all options available.
+
+.. note:: By default, the generator VM image embeds the latest nfvbench code
+ found at the time of the build on the master branch of NFVbench Git
+ repository on OPNFV Gerrit instance (latest commit).
+
+ During development phases, it is also possible to build the image with
+ all the committed changes found in the current working copy of
+ nfvbench (local code). To do that, run the image build with the ``-s``
+ option, for instance: ``bash build-image.sh -gvs``.
+
+ In that case, the version of the generator VM image will be extended
+ with nfvbench development version number to be able to distinguish the
+ development images from the latest published image.
+
+LOOP VM IMAGE INSTANCE AND CONFIG
+=================================
+
+Interface Requirements
+----------------------
+The instance must be launched using OpenStack with 2 network interfaces.
+For best performance, it should use a flavor with:
+
+- 2 vCPU
+- 4 GB RAM
+- cpu pinning set to exclusive
+
+Auto-configuration
+------------------
+nfvbench VM will automatically find the two virtual interfaces to use, and use the forwarder specifed in the config file.
+
+In the case testpmd is used, testpmd will be launched with mac forwarding mode where the destination macs rewritten according to the config file.
+
+In the case VPP is used, VPP will set up a L3 router, and forwarding traffic from one port to the other.
+
+nfvbenchvm Config
+-----------------
+nfvbenchvm config file is located at ``/etc/nfvbenchvm.conf``.
+
+.. code-block:: bash
+
+ FORWARDER=testpmd
+ INTF_MAC1=FA:16:3E:A2:30:41
+ INTF_MAC2=FA:16:3E:10:DA:10
+ TG_MAC1=00:10:94:00:0A:00
+ TG_MAC2=00:11:94:00:0A:00
+ VNF_GATEWAY1_CIDR=1.1.0.2/8
+ VNF_GATEWAY2_CIDR=2.2.0.2/8
+ TG_NET1=10.0.0.0/8
+ TG_NET2=20.0.0.0/8
+ TG_GATEWAY1_IP=1.1.0.100
+ TG_GATEWAY2_IP=2.2.0.100
+
+
+Launching nfvbenchvm VM
+-----------------------
+
+Normally this image will be used together with NFVBench, and the required configurations will be automatically generated and pushed to VM by NFVBench. If launched manually, no forwarder will be run. Users will have the full control to run either testpmd or VPP via VNC console.
+
+To check if testpmd is running, you can run this command in VNC console:
+
+.. code-block:: bash
+
+ sudo screen -r testpmd
+
+To check if VPP is running, you can run this command in VNC console:
+
+.. code-block:: bash
+
+ service vpp status
+
+
+Hardcoded Username and Password
+--------------------------------
+- Username: nfvbench
+- Password: nfvbench
+
+
+GENERATOR IMAGE INSTANCE AND CONFIG
+===================================
+
+Pre-requisites
+--------------
+To use openstack APIs, NFVbench generator VM will use `clouds.yaml` file as openstack configuration.
+The OpenStack clouds configuration from clouds.yaml file to use.
+clouds.yaml file must be in one of the following paths:
+- ~/.config/openstack
+- /etc/openstack
+
+Example of `clouds.yaml`:
+
+.. code-block:: yaml
+
+ clouds:
+ devstack:
+ auth:
+ auth_url: http://192.168.122.10:35357/
+ project_name: demo
+ username: demo
+ password: 0penstack
+ region_name: RegionOne
+
+.. note:: Add `CLOUD_DETAIL` property with the accurate value for your openstack configuration (`devstack` in the above example) in ``/etc/nfvbenchvm.conf``
+
+Interface Requirements
+----------------------
+The instance must be launched using OpenStack with 2 network interfaces for dataplane traffic (using SR-IOV function) and 1 management interface to control nfvbench.
+For best performance, it should use network interfaces for dataplane traffic with a `vnic_type` to `direct-physical` (or `direct` if physical function is not possible)
+and a flavor with:
+
+- 6 vCPU
+- 8 GB RAM
+- cpu pinning set to exclusive
+
+.. note:: For the management interface: any interface type can be used. This interface required a routable IP (through floating IP or direct) and an access to the openstack APIs.
+.. note:: CPU pinning: 1 core dedicated for guest OS and NFVbench process, other provided cores are used by TRex
+
+Template of a genarator profile using CPU pinning:
+
+.. code-block:: bash
+
+ generator_profile:
+ - name: {{name}}
+ tool: {{tool}}
+ ip: {{ip}}
+ zmq_pub_port: {{zmq_pub_port}}
+ zmq_rpc_port: {{zmq_rpc_port}}
+ software_mode: {{software_mode}}
+ cores: {{CORES}}
+ platform:
+ master_thread_id: '0'
+ latency_thread_id: '1'
+ dual_if:
+ - socket: 0
+ threads: [{{CORE_THREADS}}]
+
+ interfaces:
+ - port: 0
+ pci: "{{PCI_ADDRESS_1}}"
+ switch:
+ - port: 1
+ pci: "{{PCI_ADDRESS_2}}"
+ switch:
+ intf_speed:
+
+.. note:: `CORE_THREADS` value is determined automatically based on the cores available on the VM starting from 2 to last worker core available.
+
+Auto-configuration
+------------------
+nfvbench VM will automatically find the two virtual interfaces to use for dataplane based on MAC addresses or openstack port name (see config part below).
+This applies to the management interface as well.
+
+nfvbenchvm Config
+-----------------
+nfvbenchvm config file is located at ``/etc/nfvbenchvm.conf``.
+
+Example of configuration:
+
+.. code-block:: bash
+
+ ACTION=e2e
+ LOOPBACK_INTF_MAC1=FA:16:3E:A2:30:41
+ LOOPBACK_INTF_MAC2=FA:16:3E:10:DA:10
+ E2E_INTF_MAC1=FA:16:3E:B0:E2:43
+ E2E_INTF_MAC2=FA:16:3E:D3:6A:FC
+
+.. note:: `ACTION` parameter is not mandatory but will permit to start NFVbench with the accurate ports (loopback or e2e).
+.. note:: Set of MAC parameters cannot be used in parallel as only one NFVbench/TRex process is running.
+.. note:: Switching from `loopback` to `e2e` action can be done manually using `/nfvbench/start-nfvbench.sh <action>` with the accurate keyword for `action` parameter. This script will restart NFVbench with the good set of MAC.
+
+nfvbenchvm config file with management interface:
+
+.. code-block:: bash
+
+ ACTION=e2e
+ LOOPBACK_INTF_MAC1=FA:16:3E:A2:30:41
+ LOOPBACK_INTF_MAC2=FA:16:3E:10:DA:10
+ INTF_MAC_MGMT=FA:16:3E:06:11:8A
+ INTF_MGMT_CIDR=172.20.56.228/2
+ INTF_MGMT_IP_GW=172.20.56.225
+ INTF_MGMT_MTU=1500
+
+.. note:: `INTF_MGMT_IP_GW` and `INTF_MGMT_CIDR` parameters are used by the VM to automatically configure virtual interface and route to allow an external access through SSH.
+
+.. note:: ``INTF_MGMT_MTU`` allows to specify the MTU of the management
+ interface in bytes.
+
+ If ``INTF_MGMT_MTU`` is not specified, the MTU will be configured to
+ the conservative value of 1500: this will reduce the risk to get an
+ unmanageable VM.
+
+ ``INTF_MGMT_MTU`` can also be set to the special value ``auto``: in
+ that case, the MTU will not be configured and it will keep the value
+ set by the hypervisor (default nfvbench behavior up to version
+ 5.0.3).
+
+Using pre-created direct-physical ports on openstack, mac addresses value are only known when VM is deployed. In this case, you can pass the port name in config:
+
+.. code-block:: bash
+
+ LOOPBACK_PORT_NAME1=nfvbench-pf1
+ LOOPBACK_PORT_NAME2=nfvbench-pf2
+ E2E_PORT_NAME1=nfvbench-pf1
+ E2E_PORT_NAME1=nfvbench-pf3
+ INTF_MAC_MGMT=FA:16:3E:06:11:8A
+ INTF_MGMT_CIDR=172.20.56.228/2
+ INTF_MGMT_IP_GW=172.20.56.225
+ DNS_SERVERS=8.8.8.8,dns.server.com
+
+.. note:: A management interface is required to automatically find the virtual interface to use according to the MAC address provided (see `INTF_MAC_MGMT` parameter).
+.. note:: NFVbench VM will call openstack API through the management interface to retrieve mac address for these ports
+.. note:: If openstack API required a host name resolution, add the parameter DNS_SERVERS to add IP or DNS server names (multiple servers can be added separated by a `,`)
+
+Control nfvbenchvm VM and run test
+----------------------------------
+
+By default, NFVbench will be started in server mode (`--server`) and will act as an API.
+
+NFVbench VM will be accessible through SSH or HTTP using the management interface IP.
+
+NFVbench API endpoint is : `http://<management_ip>:<port>`
+
+.. note:: by default port value is 7555
+
+Get NFVbench status
+^^^^^^^^^^^^^^^^^^^
+
+To check NFVbench is up and running use REST request:
+
+.. code-block:: bash
+
+ curl -XGET '<management_ip>:<port>/status'
+
+Example of answer:
+
+.. code-block:: bash
+
+ {
+ "error_message": "nfvbench run still pending",
+ "status": "PENDING"
+ }
+
+Start NFVbench test
+^^^^^^^^^^^^^^^^^^^
+
+To start a test run using NFVbench API use this type of REST request:
+
+.. code-block:: bash
+
+ curl -XPOST '<management_ip>:<port>/start_run' -H "Content-Type: application/json" -d @nfvbenchconfig.json
+
+Example of return when the submission is successful:
+
+.. code-block:: bash
+
+ {
+ "error_message": "NFVbench run still pending",
+ "request_id": "42cccb7effdc43caa47f722f0ca8ec96",
+ "status": "PENDING"
+ }
+
+
+Start NFVbench test using Xtesting
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+To start a test run using Xtesting python library and NFVbench API use this type of command on the VM:
+
+.. code-block:: bash
+
+ run_tests -t nfvbench-demo
+
+.. note:: `-t` option determine which test case to be runned by Xtesting
+ (see `xtesting/testcases.yaml` file content to see available list of test cases)
+
+
+Connect to the VM using SSH keypair
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+If a key is provided at VM creation you can use it to log on the VM using `cloud-user` username:
+
+.. code-block:: bash
+
+ ssh -i key.pem cloud-user@<management_ip>
+
+
+Connect to VM using SSH username/password
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+VM is accessible over SSH using the hardcoded username and password (see below):
+
+.. code-block:: bash
+
+ ssh nfvbench@<management_ip>
+
+
+Launching nfvbenchvm VM
+-----------------------
+
+Normally this image will be deployed using Ansible role, and the required configurations will be automatically generated and pushed to VM by Ansible.
+If launched manually, users will have the full control to configure and run NFVbench via VNC console.
+
+To check if NFVbench is running, you can run this command in VNC console:
+
+.. code-block:: bash
+
+ sudo screen -r nfvbench
+
+
+Hardcoded Username and Password
+--------------------------------
+- Username: nfvbench
+- Password: nfvbench
+
diff --git a/docs/developer/testing-nfvbench.rst b/docs/developer/testing-nfvbench.rst
new file mode 100644
index 0000000..fd6c6f7
--- /dev/null
+++ b/docs/developer/testing-nfvbench.rst
@@ -0,0 +1,91 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International License.
+.. SPDX-License-Identifier: CC-BY-4.0
+
+================
+Testing NFVbench
+================
+
+tox
+===
+
+NFVbench project uses `tox`_ to orchestrate the testing of the code base:
+
+* run unit tests
+* check code style
+* run linter
+* check links in the docs
+
+In addition to testing, tox is also used to generate the documentation in HTML
+format.
+
+What tox should do is specified in a ``tox.ini`` file located at the project root.
+
+tox is used in continuous integration: all the actions performed by tox must
+succeed before a patchset can be merged. As a developer, it is also useful to
+run tox locally to detect and fix the issues before pushing the code for review.
+
+.. _tox: https://tox.wiki/en/latest/
+
+
+
+Using tox on a developer's machine
+==================================
+
+Requirement: |python-version|
+-----------------------------
+
+.. |python-version| replace:: Python 3.8
+
+The current version of Python used by NFVbench is |python-version|. In
+particular, this means that |python-version| is used:
+
+* by tox in CI
+* in nfvbench Docker image
+* in nfvbench traffic generator VM image
+
+|python-version| is needed to be able to run tox locally. If it is not
+available through the package manager, it can be installed using `pyenv`_. In
+that case, it will also be necessary to install the `pyenv-virtualenv`_ plugin.
+Refer to the documentation of those projects for installation instructions.
+
+.. _pyenv: https://github.com/pyenv/pyenv
+.. _pyenv-virtualenv: https://github.com/pyenv/pyenv-virtualenv
+
+
+tox installation
+----------------
+
+Install tox with::
+
+ $ pip install tox==3.21.4
+
+.. note:: tox 3.21.4 is the version that comes with Ubuntu 22.04 and that can be
+ found on gerrit.opnfv.org build servers.
+
+
+Running tox
+-----------
+
+In nfvbench root directory, simply run tox with::
+
+ $ tox
+
+If all goes well, tox shows a green summary such as::
+
+ py38: commands succeeded
+ pep8: commands succeeded
+ lint: commands succeeded
+ docs: commands succeeded
+ docs-linkcheck: commands succeeded
+ congratulations :)
+
+It is possible to run only a subset of tox *environments* with the ``-e``
+command line option. For instance, to check the code style only, do::
+
+ $ tox -e pep8
+
+Each tox *environment* uses a dedicated python virtual environment. The
+``-r`` command line option can be used to force the recreation of the virtual
+environment(s). For instance::
+
+ $ tox -r
diff --git a/docs/development/design/ndrpdr.rst b/docs/development/design/ndrpdr.rst
deleted file mode 100644
index 5361174..0000000
--- a/docs/development/design/ndrpdr.rst
+++ /dev/null
@@ -1,44 +0,0 @@
-.. This work is licensed under a Creative Commons Attribution 4.0 International
-.. License.
-.. http://creativecommons.org/licenses/by/4.0
-.. (c) Cisco Systems, Inc
-
-NDR/PDR Binary Search
-=====================
-
-Algorithm Outline
------------------
-
-The ServiceChain class is responsible for calculating the NDR/PDR for all frame sizes requested in the configuration.
-Calculation for 1 frame size is delegated to the TrafficClient class.
-
-Call chain for calculating the NDR-PDR for a list of frame sizes:
-
-- ServiceChain.run()
- - ServiceChain._get_chain_results()
- - for every frame size:
- - ServiceChain.__get_result_per_frame_size()
- - TrafficClient.get_ndr_pdr()
- - TrafficClient.__range_search() recursive binary search
-
-The search range is delimited by a left and right rate (expressed as a % of line rate per direction).
-
-The load_epsilon configuration parameter defines the accuracy of the result as a % of line rate.
-The default value of 0.1 indicates for example that the measured NDR and PDR are within 0.1% of line rate of the
-actual NDR/PDR (e.g. 0.1% of 10Gbps is 10Mbps). It also determines how small the search range must be in the binary search.
-
-The recursion narrows down the range by half and stops when:
-
-- the range is smaller than the configured load_epsilon value
-- or when the search hits 100% or 0% of line rate
-
-One particularity of using a software traffic generator is that the requested Tx rate may not always be met due to
-resource limitations (e.g. CPU is not fast enough to generate a very high load). The algorithm should take this into
-consideration:
-
-- always monitor the actual Tx rate achieved
-- actual Tx rate is always <= requested Tx rate
-- the measured drop rate should always be relative to the actual Tx rate
-- if the actual Tx rate is < requested Tx rate and the measured drop rate is already within threshold (<NDR/PDR threshold) then the binary search must stop with proper warning
-
-
diff --git a/docs/development/overview/index.rst b/docs/development/overview/index.rst
deleted file mode 100644
index ce99621..0000000
--- a/docs/development/overview/index.rst
+++ /dev/null
@@ -1,13 +0,0 @@
-.. This work is licensed under a Creative Commons Attribution 4.0 International
-.. License.
-.. http://creativecommons.org/licenses/by/4.0
-.. (c) Cisco Systems, Inc
-
-=============================================
-OPNFV NFVbench Euphrates Overview
-=============================================
-
-.. toctree::
- :maxdepth: 1
-
- overview
diff --git a/docs/index.rst b/docs/index.rst
index 720b670..1339a7f 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -3,9 +3,13 @@
.. http://creativecommons.org/licenses/by/4.0
.. (c) Cisco Systems, Inc
+
+NFVbench |release| Documentation
+================================
+
.. toctree::
- :maxdepth: 1
+ :maxdepth: 2
- development/index
- release/release-notes/index
- testing/index
+ release-notes/index
+ user/index
+ developer/index
diff --git a/docs/make.bat b/docs/make.bat
new file mode 100644
index 0000000..153be5e
--- /dev/null
+++ b/docs/make.bat
@@ -0,0 +1,35 @@
+@ECHO OFF
+
+pushd %~dp0
+
+REM Command file for Sphinx documentation
+
+if "%SPHINXBUILD%" == "" (
+ set SPHINXBUILD=sphinx-build
+)
+set SOURCEDIR=.
+set BUILDDIR=_build
+
+if "%1" == "" goto help
+
+%SPHINXBUILD% >NUL 2>NUL
+if errorlevel 9009 (
+ echo.
+ echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
+ echo.installed, then set the SPHINXBUILD environment variable to point
+ echo.to the full path of the 'sphinx-build' executable. Alternatively you
+ echo.may add the Sphinx directory to PATH.
+ echo.
+ echo.If you don't have Sphinx installed, grab it from
+ echo.https://www.sphinx-doc.org/
+ exit /b 1
+)
+
+%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+goto end
+
+:help
+%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+
+:end
+popd
diff --git a/docs/release/release-notes/index.rst b/docs/release-notes/index.rst
index 12acbab..827c674 100644
--- a/docs/release/release-notes/index.rst
+++ b/docs/release-notes/index.rst
@@ -3,11 +3,12 @@
.. This work is licensed under a Creative Commons Attribution 4.0 International License.
.. http://creativecommons.org/licenses/by/4.0
-**********************
-NFVbench Release Notes
-**********************
+*************
+Release Notes
+*************
.. toctree::
:maxdepth: 1
- release-notes
+ nfvbench-release-notes
+ nfvbenchvm-release-notes
diff --git a/docs/release-notes/nfvbench-release-notes.rst b/docs/release-notes/nfvbench-release-notes.rst
new file mode 100644
index 0000000..c1c52d4
--- /dev/null
+++ b/docs/release-notes/nfvbench-release-notes.rst
@@ -0,0 +1,147 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International License.
+.. http://creativecommons.org/licenses/by/4.0
+.. (c) Cisco Systems, Inc
+
+NFVbench Release Notes
+++++++++++++++++++++++
+
+Release 3.6.2
+=============
+
+- NFVBENCH-152 Add service_mode method for debugging purpose
+- NFVBENCH-150 Add support for VXLAN latency
+- NFVBENCH-146 Add cache_size option
+- NFVBENCH-151 Allocate hugepages on two NUMAs in nfvbenchvm
+- NFVBENCH-149 Negative latency exception during NDR/PDR search
+- NFVBENCH-148 Increase the waiting time based on # of instances
+
+Release 3.5.1
+=============
+
+- NFVBENCH-147 Incorrect URL used for admin check in credentials
+- Release the validation check for VxLAN networks
+- NFVBENCH-145 Config file not found. No explicit error
+- NFVBENCH-144 Trex cannot take account NFVBench config (platform thread id 0)
+
+- NFVBENCH-140 Retrieve High Dynamic Range latency histograms with TRex v2.59
+- NFVBENCH-143 Trex cannot start due to invalid config (platform None)
+- NFVBENCH-141 Fix Openstack user admin role check
+- NFVBENCH-139 Fix master_thread_id and latency_thread_id property checking
+- NFVBENCH-95 Add HdrHistogram encodes returned by TRex to JSON results
+- NFVBENCH-138 Use yaml.safe_load() instead of unsafe yaml load
+- NFVBENCH-137 NFVbench generates wrong L4 checksums for VxLAN traffic
+
+Release 3.4.0
+=============
+
+- Add L3 traffic management with Neutron routers
+
+
+Release 3.3.0
+=============
+
+Major release highlights:
+
+- VxLAN support
+- test VM can now have idle interfaces
+- test VM can be launched with multiqueue enabled
+- upgrade to TRex v2.56
+
+
+Release 2.0
+===========
+NFVbench will now follow its own project release numbering (x.y.z) which is independent of the OPNFV release numbering (opnfv-x.y.z)
+
+Major release highlights:
+
+- Dedicated edge networks for each chain
+- Enhanced chain analysis
+- Code refactoring and enhanced unit testing
+- Miscellaneous enhancement
+
+Dedicated edge networks for each chain
+--------------------------------------
+NFVbench 1.x only supported shared edge networks for all chains.
+For example, 20xPVP would create only 2 edge networks (left and right) shared by all chains.
+With NFVbench 2.0, chain networks are dedicated (unshared) by default with an option in
+the nfvbench configuration to share them. A 20xPVP run will create 2x20 networks instead.
+
+Enhanced chain analysis
+-----------------------
+The new chain analysis improves at multiple levels:
+
+- there is now one table for each direction (forward and reverse) that both read from left to right
+- per-chain packet counters and latency
+- all-chain aggregate packet counters and latency
+- supports both shared and dedicated chain networks
+
+Code refactoring and enhanced unit testing
+------------------------------------------
+The overall code structure is now better partitioned in the following functions:
+
+- staging and resource discovery
+- traffic generator
+- stats collection
+
+The staging algorithm was rewritten to be:
+
+- a lot more robust to errors and to handle better resource reuse use cases.
+ For example when a network with a matching name is discovered the new code will verify that the
+ network is associated to the right VM instance
+- a lot more strict when it comes to the inventory of MAC addresses. For example the association
+ from each VM MAC to a chain index for each Trex port is handled in a much more strict manner.
+
+Although not all code is unit tested, the most critical parts are unit tested with the use of
+the mock library. The resulting unit test code can run in isolation without needing a real system under test.
+
+
+OPNFV Fraser Release
+====================
+
+Over 30 Jira tickets have been addressed in this release (Jira NFVBENCH-55 to NFVBENCH-78)
+
+The Fraser release adds the following new features:
+
+- support for benchmarking non-OpenStack environments (with external setup and no OpenStack openrc file)
+- PVVP packet path with SRIOV at the edge and vswitch between VMs
+- support logging events and results through fluentd
+
+Enhancements and main bug fixes:
+
+- end to end connectivity for larger chain count is now much more accurate for large chain count - avoiding excessive drops
+- use newer version of TRex (2.32)
+- use newer version of testpmd DPDK
+- NDR/PDR uses actual TX rate to calculate drops - resulting in more accurate results
+- add pylint to unit testing
+- add self sufficient and standalone unit testing (without actual testbed)
+
+
+OPNFV Euphrates Release
+=======================
+
+This is the introductory release for NFVbench. In this release, NFVbench provides the following features/capabilities:
+
+- standalone installation with a single Docker container integrating the open source TRex traffic generator
+- can measure data plane performance for any NFVi full stack
+- can setup automatically service chains with the following packet paths:
+ - PVP (physical-VM-physical)
+ - PVVP (physical-VM-VM-physical) intra-node and inter-node
+- can setup multiple service chains
+ - N * PVP
+ - N * PVVP
+- supports any external service chain (pre-set externally) that can do basic IPv4 routing
+- can measure
+ - drop rate and latency for any given fixed rate
+ - NDR (No Drop Rate) and PDR (Partial Drop Rate) with configurable drop rates
+- traffic specification
+ - any fixed frame size or IMIX
+ - uni or bidirectional traffic
+ - any number of flows
+ - vlan tagging can be enabled or disabled
+- user interface:
+ - CLI
+ - REST+socketIO
+- fully configurable runs with yaml-JSON configuration
+- detailed results in JSON format
+- summary tabular results
+- can send logs and results to one or more fluentd aggregators (per configuration)
diff --git a/docs/release-notes/nfvbenchvm-release-notes.rst b/docs/release-notes/nfvbenchvm-release-notes.rst
new file mode 100644
index 0000000..234a086
--- /dev/null
+++ b/docs/release-notes/nfvbenchvm-release-notes.rst
@@ -0,0 +1,94 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International License.
+.. http://creativecommons.org/licenses/by/4.0
+
+
+NFVbench Loop VM Image Release Notes
+++++++++++++++++++++++++++++++++++++
+
+As explained in :ref:`nfvbench-artefact-versioning`, NFVbench loop VM image has
+its own version numbering scheme. Starting from version 0.11, this page
+summarizes the news of each release.
+
+
+Release 0.16 (2022-11-15)
+=========================
+
+Fixes:
+
+- Increase wait for VPP service from 10 to 30 seconds (10s is not enough on some
+ setups) and poll every second instead of sleeping 10s.
+
+- Set the MTU of the management interface to 1500 by default (to reduce the risk
+ to get an unmanageable VM). A different value can be set using the
+ ``INTF_MGMT_MTU`` variable in ``/etc/nfvbenchvm.conf``.
+
+Changes for developers:
+
+- Add 2 debug features to ``build-image.sh``:
+
+ - The new option ``-t`` (enable debug traces) allows to show in the build log
+ the commands run in the shell scripts, including the commands defined in the
+ disk image builder elements.
+
+ - The new option ``-d`` (debug) instructs ``disk-image-create`` to drop the
+ developer in a shell inside the chroot in case an error occurs. This makes
+ troubleshooting of the image possible (inspect files, run commands, ...)
+
+- Abort build on error: make sure a VM image build fails if any step fails.
+ Else we can end up with a bad image not containing all that we want, and we
+ discover this later at run time.
+
+- Fix build with diskimage_builder (dib) 3.16.0.
+
+- Switch VPP package repository to packagecloud.io instead of nexus.fd.io. This
+ fixes intermittent access issues with nexus.fd.io and this will make it
+ possible to get vpp releases higher than 19.08.
+
+- Separate loop VM and generator VM version numbers (a first step towards using
+ nfvbench version number for the generator VM).
+
+
+Release 0.15 (2021-06-04)
+=========================
+
+- NFVBENCH-211 Fix VPP driver for loop VM (switch UIO driver for VPP forwarder:
+ use ``uio_pci_generic`` instead of ``igb_uio``).
+
+
+Release 0.14 (2021-05-21)
+=========================
+
+- NFVBENCH-209 Fix NFVbench loopvm build failed on testpmd step (includes switch
+ UIO driver for testmpd forwarder: use ``uio_pci_generic`` instead of
+ ``igb_uio``).
+
+
+Release 0.13 (2021-04-28)
+=========================
+
+- NFVBENCH-196: New NFVbench image for generator part (nfvbench and TRex codes inside VM)
+- Change Linux kernel boot-time configuration (kernel CLI parameters):
+
+ - Extend CPU isolation (``isolcpus=1-7`` instead of ``isolcpus=1``)
+ - Increase the number of 1GB huge pages (``hugepages=4`` instead of ``hugepages=2``)
+ - Enable IOMMU (``intel_iommu=on iommu=pt``)
+
+- Load the ``vfio-pci`` kernel module with the ``enable_unsafe_noiommu_mode=1`` option.
+
+
+Release 0.12 (2020-01-23)
+=========================
+
+- NFVBENCH-157 Add possibility to not use the ARP static configuration for VPP loop VM
+
+
+Release 0.11 (2019-11-26)
+=========================
+
+- NFVBENCH-156 Add management interface and ssh config in NFVBench image
+
+
+Earlier releases
+================
+
+See NFVbench commit history.
diff --git a/docs/release/release-notes/release-notes.rst b/docs/release/release-notes/release-notes.rst
deleted file mode 100644
index a3402cb..0000000
--- a/docs/release/release-notes/release-notes.rst
+++ /dev/null
@@ -1,40 +0,0 @@
-.. This work is licensed under a Creative Commons Attribution 4.0 International License.
-.. http://creativecommons.org/licenses/by/4.0
-.. (c) Cisco Systems, Inc
-
-OPNFV Euphrates Release
-=======================
-
-This is the introductory release for NFVbench. In this release, NFVbench provides the following features/capabilities:
-
-- standalone installation with a single Docker container integrating the open source TRex traffic generator
-- can measure data plane performance for any NFVi full stack
-- can setup automatically service chains with the following packet paths:
- - PVP (physical-VM-physical)
- - PVVP (physical-VM-VM-physical) intra-node and inter-node
-- can setup multiple service chains
- - N * PVP
- - N * PVVP
-- supports any external service chain (pre-set externally) that can do basic IPv4 routing
-- can measure
- - drop rate and latency for any given fixed rate
- - NDR (No Drop Rate) and PDR (Partial Drop Rate) with configurable drop rates
-- traffic specification
- - any fixed frame size or IMIX
- - uni or bidirectional traffic
- - any number of flows
- - vlan tagging can be enabled or disabled
-- user interface:
- - CLI
- - REST+socketIO
-- fully configurable runs with yaml-JSON configuration
-- detailed results in JSON format
-- summary tabular results
-- can send logs and results to one or more fluentd aggregators (per configuration)
-
-
-
-
-
-
-
diff --git a/docs/requirements.txt b/docs/requirements.txt
new file mode 100644
index 0000000..4c9e064
--- /dev/null
+++ b/docs/requirements.txt
@@ -0,0 +1,7 @@
+# Python dependencies needed to build and check nfvbench documentation
+
+sphinx # BSD
+piccolo_theme
+
+# Extract nfvbench version from git
+pbr
diff --git a/docs/testing/index.rst b/docs/testing/index.rst
deleted file mode 100644
index b795e6b..0000000
--- a/docs/testing/index.rst
+++ /dev/null
@@ -1,11 +0,0 @@
-.. This work is licensed under a Creative Commons Attribution 4.0 International
-.. License.
-.. http://creativecommons.org/licenses/by/4.0
-.. (c) Cisco Systems, Inc
-
-.. toctree::
- :maxdepth: 2
-
- developer/devguide/index
- user/configguide/index
- user/userguide/index
diff --git a/docs/testing/user/configguide/index.rst b/docs/testing/user/configguide/index.rst
deleted file mode 100644
index ce3b778..0000000
--- a/docs/testing/user/configguide/index.rst
+++ /dev/null
@@ -1,9 +0,0 @@
-.. This work is licensed under a Creative Commons Attribution 4.0 International
-.. License.
-.. http://creativecommons.org/licenses/by/4.0
-.. (c) Cisco Systems, Inc
-
-.. toctree::
- :maxdepth: 1
-
- configguide
diff --git a/docs/testing/user/userguide/_static/custom.css b/docs/testing/user/userguide/_static/custom.css
deleted file mode 100644
index 6cbfde3..0000000
--- a/docs/testing/user/userguide/_static/custom.css
+++ /dev/null
@@ -1,4 +0,0 @@
-.wy-nav-content {
- max-width: 1200px !important;
-}
-
diff --git a/docs/testing/user/userguide/_templates/layout.html b/docs/testing/user/userguide/_templates/layout.html
deleted file mode 100644
index f3387d5..0000000
--- a/docs/testing/user/userguide/_templates/layout.html
+++ /dev/null
@@ -1,5 +0,0 @@
-{% extends "!layout.html" %}
-{% block extrahead %}
- <link href="{{ pathto("_static/custom.css", True) }}" rel="stylesheet" type="text/css">
-{% endblock %}
-
diff --git a/docs/testing/user/userguide/advanced.rst b/docs/testing/user/userguide/advanced.rst
deleted file mode 100644
index 252cbc9..0000000
--- a/docs/testing/user/userguide/advanced.rst
+++ /dev/null
@@ -1,359 +0,0 @@
-.. This work is licensed under a Creative Commons Attribution 4.0 International License.
-.. SPDX-License-Identifier: CC-BY-4.0
-.. (c) Cisco Systems, Inc
-
-==============
-Advanced Usage
-==============
-
-This section covers a few examples on how to run NFVbench with multiple different settings.
-Below are shown the most common and useful use-cases and explained some fields from a default config file.
-
-How to change any NFVbench run configuration (CLI)
---------------------------------------------------
-NFVbench always starts with a default configuration which can further be refined (overridden) by the user from the CLI or from REST requests.
-
-At first have a look at the default config:
-
-.. code-block:: bash
-
- nfvbench --show-default-config
-
-It is sometimes useful derive your own configuration from a copy of the default config:
-
-.. code-block:: bash
-
- nfvbench --show-default-config > nfvbench.cfg
-
-At this point you can edit the copy by:
-
-- removing any parameter that is not to be changed (since NFVbench will always load the default configuration, default values are not needed)
-- edit the parameters that are to be changed changed
-
-A run with the new confguration can then simply be requested using the -c option and by using the actual path of the configuration file
-as seen from inside the container (in this example, we assume the current directory is mapped to /tmp/nfvbench in the container):
-
-.. code-block:: bash
-
- nfvbench -c /tmp/nfvbench/nfvbench.cfg
-
-The same -c option also accepts any valid yaml or json string to override certain parameters without having to create a configuration file.
-
-NFVbench provides many configuration options as optional arguments. For example the number of flows can be specified using the --flow-count option.
-
-The flow count option can be specified in any of 3 ways:
-
-- by providing a confguration file that has the flow_count value to use (-c myconfig.yaml and myconfig.yaml contains 'flow_count: 100k')
-- by passing that yaml paremeter inline (-c "flow_count: 100k") or (-c "{flow_count: 100k}")
-- by using the flow count optional argument (--flow-count 100k)
-
-Showing the running configuration
----------------------------------
-
-Because configuration parameters can be overriden, it is sometimes useful to show the final configuration (after all oevrrides are done) by using the --show-config option.
-This final configuration is also called the "running" configuration.
-
-For example, this will only display the running configuration (without actually running anything):
-
-.. code-block:: bash
-
- nfvbench -c "{flow_count: 100k, debug: true}" --show-config
-
-
-Connectivity and Configuration Check
-------------------------------------
-
-NFVbench allows to test connectivity to devices used with the selected packet path.
-It runs the whole test, but without actually sending any traffic.
-It is also a good way to check if everything is configured properly in the configuration file and what versions of components are used.
-
-To verify everything works without sending any traffic, use the --no-traffic option:
-
-.. code-block:: bash
-
- nfvbench --no-traffic
-
-Used parameters:
-
-* ``--no-traffic`` or ``-0`` : sending traffic from traffic generator is skipped
-
-
-
-Fixed Rate Run
---------------
-
-Fixed rate run is the most basic type of NFVbench usage. It can be used to measure the drop rate with a fixed transmission rate of packets.
-
-This example shows how to run the PVP packet path (which is the default packet path) with multiple different settings:
-
-.. code-block:: bash
-
- nfvbench -c nfvbench.cfg --no-cleanup --rate 100000pps --duration 30 --interval 15 --json results.json
-
-Used parameters:
-
-* ``-c nfvbench.cfg`` : path to the config file
-* ``--no-cleanup`` : resources (networks, VMs, attached ports) are not deleted after test is finished
-* ``--rate 100000pps`` : defines rate of packets sent by traffic generator
-* ``--duration 30`` : specifies how long should traffic be running in seconds
-* ``--interval 15`` : stats are checked and shown periodically (in seconds) in this interval when traffic is flowing
-* ``--json results.json`` : collected data are stored in this file after run is finished
-
-.. note:: It is your responsibility to clean up resources if needed when ``--no-cleanup`` parameter is used. You can use the nfvbench_cleanup helper script for that purpose.
-
-The ``--json`` parameter makes it easy to store NFVbench results. The --show-summary (or -ss) option can be used to display the results in a json results file in a text tabular format:
-
-.. code-block:: bash
-
- nfvbench --show-summary results.json
-
-
-This example shows how to specify a different packet path:
-
-.. code-block:: bash
-
- nfvbench -c nfvbench.cfg --rate 1Mbps --inter-node --service-chain PVVP
-
-Used parameters:
-
-* ``-c nfvbench.cfg`` : path to the config file
-* ``--rate 1Mbps`` : defines rate of packets sent by traffic generator
-* ``--inter-node`` : VMs are created on different compute nodes, works only with PVVP flow
-* ``--service-chain PVVP`` or ``-sc PVVP`` : specifies the type of service chain (or packet path) to use
-
-.. note:: When parameter ``--inter-node`` is not used or there aren't enough compute nodes, VMs are on the same compute node.
-
-
-Rate Units
-^^^^^^^^^^
-
-Parameter ``--rate`` accepts different types of values:
-
-* packets per second (pps, kpps, mpps), e.g. ``1000pps`` or ``10kpps``
-* load percentage (%), e.g. ``50%``
-* bits per second (bps, kbps, Mbps, Gbps), e.g. ``1Gbps``, ``1000bps``
-* NDR/PDR (ndr, pdr, ndr_pdr), e.g. ``ndr_pdr``
-
-NDR/PDR is the default rate when not specified.
-
-NDR and PDR
------------
-
-The NDR and PDR test is used to determine the maximum throughput performance of the system under test
-following guidelines defined in RFC-2544:
-
-* NDR (No Drop Rate): maximum packet rate sent without dropping any packet
-* PDR (Partial Drop Rate): maximum packet rate sent while allowing a given maximum drop rate
-
-The NDR search can also be relaxed to allow some very small amount of drop rate (lower than the PDR maximum drop rate).
-NFVbench will measure the NDR and PDR values by driving the traffic generator through multiple iterations
-at different transmission rates using a binary search algorithm.
-
-The configuration file contains section where settings for NDR/PDR can be set.
-
-.. code-block:: bash
-
- # NDR/PDR configuration
- measurement:
- # Drop rates represent the ratio of dropped packet to the total number of packets sent.
- # Values provided here are percentages. A value of 0.01 means that at most 0.01% of all
- # packets sent are dropped (or 1 packet every 10,000 packets sent)
-
- # No Drop Rate; Default to 0.001%
- NDR: 0.001
- # Partial Drop Rate; NDR should always be less than PDR
- PDR: 0.1
- # The accuracy of NDR and PDR load percentiles; The actual load percentile that match NDR
- # or PDR should be within `load_epsilon` difference than the one calculated.
- load_epsilon: 0.1
-
-Because NDR/PDR is the default ``--rate`` value, it is possible to run NFVbench simply like this:
-
-.. code-block:: bash
-
- nfvbench -c nfvbench.cfg
-
-Other possible run options:
-
-.. code-block:: bash
-
- nfvbench -c nfvbench.cfg --duration 120 --json results.json
-
-Used parameters:
-
-* ``-c nfvbench.cfg`` : path to the config file
-* ``--duration 120`` : specifies how long should be traffic running in each iteration
-* ``--json results.json`` : collected data are stored in this file after run is finished
-
-
-Multichain
-----------
-
-NFVbench allows to run multiple chains at the same time. For example it is possible to stage the PVP service chain N-times,
-where N can be as much as your compute power can scale. With N = 10, NFVbench will spawn 10 VMs as a part of 10 simultaneous PVP chains.
-
-The number of chains is specified by ``--service-chain-count`` or ``-scc`` flag with a default value of 1.
-For example to run NFVbench with 3 PVP chains:
-
-.. code-block:: bash
-
- nfvbench -c nfvbench.cfg --rate 10000pps -scc 3
-
-It is not necessary to specify the service chain type (-sc) because PVP is set as default. The PVP service chains will have 3 VMs in 3 chains with this configuration.
-If ``-sc PVVP`` is specified instead, there would be 6 VMs in 3 chains as this service chain has 2 VMs per chain.
-Both **single run** or **NDR/PDR** can be run as multichain. Running multichain is a scenario closer to a real life situation than runs with a single chain.
-
-
-External Chain
---------------
-
-NFVbench can measure the performance of 1 or more L3 service chains that are setup externally. Instead of being setup by NFVbench,
-the complete environment (VMs and networks) has to be setup prior to running NFVbench.
-
-Each external chain is made of 1 or more VNFs and has exactly 2 end network interfaces (left and right network interfaces) that are connected to 2 neutron networks (left and right networks).
-The internal composition of a multi-VNF service chain can be arbitrary (usually linear) as far as NFVbench is concerned,
-the only requirement is that the service chain can route L3 packets properly between the left and right networks.
-
-To run NFVbench on such external service chains:
-
-- explicitly tell NFVbench to use external service chain by adding ``-sc EXT`` or ``--service-chain EXT`` to NFVbench CLI options
-- specify the number of external chains using the ``-scc`` option (defaults to 1 chain)
-- specify the 2 end point networks of your environment in ``external_networks`` inside the config file.
- - The two networks specified there have to exist in Neutron and will be used as the end point networks by NFVbench ('napa' and 'marin' in the diagram below)
-- specify the router gateway IPs for the external service chains (1.1.0.2 and 2.2.0.2)
-- specify the traffic generator gateway IPs for the external service chains (1.1.0.102 and 2.2.0.102 in diagram below)
-- specify the packet source and destination IPs for the virtual devices that are simulated (10.0.0.0/8 and 20.0.0.0/8)
-
-
-.. image:: images/extchain-config.png
-
-L3 routing must be enabled in the VNF and configured to:
-
-- reply to ARP requests to its public IP addresses on both left and right networks
-- route packets from each set of remote devices toward the appropriate dest gateway IP in the traffic generator using 2 static routes (as illustrated in the diagram)
-
-Upon start, NFVbench will:
-- first retrieve the properties of the left and right networks using Neutron APIs,
-- extract the underlying network ID (typically VLAN segmentation ID),
-- generate packets with the proper VLAN ID and measure traffic.
-
-Note that in the case of multiple chains, all chains end interfaces must be connected to the same two left and right networks.
-The traffic will be load balanced across the corresponding gateway IP of these external service chains.
-
-
-Multiflow
----------
-
-NFVbench always generates L3 packets from the traffic generator but allows the user to specify how many flows to generate.
-A flow is identified by a unique src/dest MAC IP and port tuple that is sent by the traffic generator. Flows are
-generated by ranging the IP adresses but using a small fixed number of MAC addresses.
-
-The number of flows will be spread roughly even between chains when more than 1 chain is being tested.
-For example, for 11 flows and 3 chains, number of flows that will run for each chain will be 3, 4, and 4 flows respectively.
-
-The number of flows is specified by ``--flow-count`` or ``-fc`` flag, the default value is 2 (1 flow in each direction).
-To run NFVbench with 3 chains and 100 flows, use the following command:
-
-.. code-block:: bash
-
- nfvbench -c nfvbench.cfg --rate 10000pps -scc 3 -fc 100
-
-Note that from a vswitch point of view, the
-number of flows seen will be higher as it will be at least 4 times the number of flows sent by the traffic generator
-(add flow to VM and flow from VM).
-
-IP addresses generated can be controlled with the following NFVbench configuration options:
-
-.. code-block:: bash
-
- ip_addrs: ['10.0.0.0/8', '20.0.0.0/8']
- ip_addrs_step: 0.0.0.1
- tg_gateway_ip_addrs: ['1.1.0.100', '2.2.0.100']
- tg_gateway_ip_addrs_step: 0.0.0.1
- gateway_ip_addrs: ['1.1.0.2', '2.2.0.2']
- gateway_ip_addrs_step: 0.0.0.1
-
-``ip_addrs`` are the start of the 2 ip address ranges used by the traffic generators as the packets source and destination packets
-where each range is associated to virtual devices simulated behind 1 physical interface of the traffic generator.
-These can also be written in CIDR notation to represent the subnet.
-
-``tg_gateway_ip_addrs`` are the traffic generator gateway (virtual) ip addresses, all traffic to/from the virtual devices go through them.
-
-``gateway_ip_addrs`` are the 2 gateway ip address ranges of the VMs used in the external chains. They are only used with external chains and must correspond to their public IP address.
-
-The corresponding ``step`` is used for ranging the IP addresses from the `ip_addrs``, ``tg_gateway_ip_addrs`` and ``gateway_ip_addrs`` base addresses.
-0.0.0.1 is the default step for all IP ranges. In ``ip_addrs``, 'random' can be configured which tells NFVBench to generate random src/dst IP pairs in the traffic stream.
-
-
-Traffic Configuration via CLI
------------------------------
-
-While traffic configuration can be modified using the configuration file, it can be inconvenient to have to change the configuration file everytime
-you need to change a traffic configuration option. Traffic configuration options can be overridden with a few CLI options.
-
-Here is an example of configuring traffic via CLI:
-
-.. code-block:: bash
-
- nfvbench --rate 10kpps --service-chain-count 2 -fs 64 -fs IMIX -fs 1518 --unidir
-
-This command will run NFVbench with a unidirectional flow for three packet sizes 64B, IMIX, and 1518B.
-
-Used parameters:
-
-* ``--rate 10kpps`` : defines rate of packets sent by traffic generator (total TX rate)
-* ``-scc 2`` or ``--service-chain-count 2`` : specifies number of parallel chains of given flow to run (default to 1)
-* ``-fs 64`` or ``--frame-size 64``: add the specified frame size to the list of frame sizes to run
-* ``--unidir`` : run traffic with unidirectional flow (default to bidirectional flow)
-
-
-MAC Addresses
--------------
-
-NFVbench will dicover the MAC addresses to use for generated frames using:
-- either OpenStack discovery (find the MAC of an existing VM) in the case of PVP and PVVP service chains
-- or using dynamic ARP discovery (find MAC from IP) in the case of external chains.
-
-Cleanup Script
---------------
-
-The nfvbench_cleanup script will cleanup resources created by NFVbench. You need to pass the OpenStack RC file in order to connect to
-OpenStack.
-Example of run:
-
-.. code-block:: none
-
- # nfvbench_cleanup -r /tmp/nfvbench/openrc
- Discovering Storage resources...
- Discovering Compute resources...
- Discovering Network resources...
- Discovering Keystone resources...
-
- SELECTED RESOURCES:
- +-----------+-------------------+--------------------------------------+
- | Type | Name | UUID |
- |-----------+-------------------+--------------------------------------|
- | flavors | nfvbench.medium | 362b2215-89d1-4f46-8b89-8e58165ff5bc |
- | instances | nfvbench-loop-vm0 | f78dfb74-1b8e-4c5c-8d83-652a7571da95 |
- | networks | nfvbench-net0 | 57d7e6c9-325f-4c13-9b1b-929344cc9c39 |
- | networks | nfvbench-net1 | 2d429bcd-33fa-4aa4-9f2e-299a735177c9 |
- +-----------+-------------------+--------------------------------------+
-
- Warning: You didn't specify a resource list file as the input. The script will delete all resources shown above.
- Are you sure? (y/n) y
- *** STORAGE cleanup
- *** COMPUTE cleanup
- . Waiting for 1 instances to be fully deleted...
- . INSTANCE 1 left to be deleted, retries left=5...
- . INSTANCE 1 left to be deleted, retries left=4...
- + INSTANCE nfvbench-loop-vm0 is successfully deleted
- + FLAVOR nfvbench.medium is successfully deleted
- *** NETWORK cleanup
- + Network port 075d91f3-fa6a-428c-bd3f-ebd40cd935e1 is successfully deleted
- + Network port 3a7ccd8c-53a6-43d0-a823-4b5ca762d06e is successfully deleted
- + NETWORK nfvbench-net0 is successfully deleted
- + Network port 5b5a75bd-e0b5-4f81-91b9-9e216d194f48 is successfully deleted
- + Network port cc2d8f1b-49fe-491e-9e44-6990fc57e891 is successfully deleted
- + NETWORK nfvbench-net1 is successfully deleted
- *** KEYSTONE cleanup
- #
diff --git a/docs/testing/user/userguide/conf.py b/docs/testing/user/userguide/conf.py
deleted file mode 100644
index 5846b00..0000000
--- a/docs/testing/user/userguide/conf.py
+++ /dev/null
@@ -1,358 +0,0 @@
-# Copyright 2017 Cisco Systems, Inc. All rights reserved.
-#
-# 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.
-#
-# NFVBench documentation build configuration file, created by
-# sphinx-quickstart on Thu Sep 29 14:25:18 2016.
-#
-# This file is execfile()d with the current directory set to its
-# containing dir.
-#
-# Note that not all possible configuration values are present in this
-# autogenerated file.
-#
-# All configuration values have a default; values that are commented out
-# serve to show the default.
-
-# If extensions (or modules to document with autodoc) are in another directory,
-# add these directories to sys.path here. If the directory is relative to the
-# documentation root, use os.path.abspath to make it absolute, like shown here.
-#
-
-
-
-# import os
-# import sys
-# sys.path.insert(0, os.path.abspath('.'))
-import os
-from pbr import version as pbr_ver
-import sys
-
-sys.path.insert(0, os.path.abspath('../..'))
-
-# -- General configuration ------------------------------------------------
-
-# If your documentation needs a minimal Sphinx version, state it here.
-#
-# needs_sphinx = '1.0'
-
-# Add any Sphinx extension module names here, as strings. They can be
-# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
-# ones.
-extensions = []
-
-# Add any paths that contain templates here, relative to this directory.
-templates_path = ['_templates']
-
-# The suffix(es) of source filenames.
-# You can specify multiple suffix as a list of string:
-#
-# source_suffix = ['.rst', '.md']
-source_suffix = '.rst'
-
-# The encoding of source files.
-#
-# source_encoding = 'utf-8-sig'
-
-# The master toctree document.
-master_doc = 'index'
-
-# General information about the project.
-project = u'NFVBench'
-copyright = u'2016 Cisco Systems, Inc.'
-author = u'Cisco Systems, Inc.'
-
-# The version info for the project you're documenting, acts as replacement for
-# |version| and |release|, also used in various other places throughout the
-# built documents.
-#
-# The short X.Y version.
-version = pbr_ver.VersionInfo(project).version_string()
-# The full version, including alpha/beta/rc tags.
-release = pbr_ver.VersionInfo(project).version_string_with_vcs()
-
-# The language for content autogenerated by Sphinx. Refer to documentation
-# for a list of supported languages.
-#
-# This is also used if you do content translation via gettext catalogs.
-# Usually you set "language" from the command line for these cases.
-language = None
-
-# There are two options for replacing |today|: either, you set today to some
-# non-false value, then it is used:
-#
-# today = ''
-#
-# Else, today_fmt is used as the format for a strftime call.
-#
-# today_fmt = '%B %d, %Y'
-
-# List of patterns, relative to source directory, that match files and
-# directories to ignore when looking for source files.
-# This patterns also effect to html_static_path and html_extra_path
-exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
-
-# The reST default role (used for this markup: `text`) to use for all
-# documents.
-#
-# default_role = None
-
-# If true, '()' will be appended to :func: etc. cross-reference text.
-#
-# add_function_parentheses = True
-
-# If true, the current module name will be prepended to all description
-# unit titles (such as .. function::).
-#
-# add_module_names = True
-
-# If true, sectionauthor and moduleauthor directives will be shown in the
-# output. They are ignored by default.
-#
-# show_authors = False
-
-# The name of the Pygments (syntax highlighting) style to use.
-pygments_style = 'sphinx'
-
-# A list of ignored prefixes for module index sorting.
-# modindex_common_prefix = []
-
-# If true, keep warnings as "system message" paragraphs in the built documents.
-# keep_warnings = False
-
-# If true, `todo` and `todoList` produce output, else they produce nothing.
-todo_include_todos = False
-
-# -- Options for HTML output ----------------------------------------------
-
-# The theme to use for HTML and HTML Help pages. See the documentation for
-# a list of builtin themes.
-#
-# html_theme = 'haiku'
-html_theme = 'sphinx_rtd_theme'
-
-# Theme options are theme-specific and customize the look and feel of a theme
-# further. For a list of options available for each theme, see the
-# documentation.
-#
-html_theme_options = {}
-
-# Add any paths that contain custom themes here, relative to this directory.
-# html_theme_path = []
-
-# The name for this set of Sphinx documents.
-# "<project> v<release> documentation" by default.
-#
-# html_title = u'NFVBench vdev117'
-
-# A shorter title for the navigation bar. Default is the same as html_title.
-#
-html_short_title = 'nfvbench'
-
-# The name of an image file (relative to this directory) to place at the topß
-# of the sidebar.
-#
-# html_logo = None
-
-# The name of an image file (relative to this directory) to use as a favicon of
-# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
-# pixels large.
-#
-# html_favicon = None
-
-# Add any paths that contain custom static files (such as style sheets) here,
-# relative to this directory. They are copied after the builtin static files,
-# so a file named "default.css" will overwrite the builtin "default.css".
-html_static_path = ['_static']
-
-# Add any extra paths that contain custom files (such as robots.txt or
-# .htaccess) here, relative to this directory. These files are copied
-# directly to the root of the documentation.
-#
-# html_extra_path = []
-
-# If not None, a 'Last updated on:' timestamp is inserted at every page
-# bottom, using the given strftime format.
-# The empty string is equivalent to '%b %d, %Y'.
-#
-# html_last_updated_fmt = None
-
-# If true, SmartyPants will be used to convert quotes and dashes to
-# typographically correct entities.
-#
-html_use_smartypants = False
-
-# Custom sidebar templates, maps document names to template names.
-#
-# html_sidebars = {}
-
-# Additional templates that should be rendered to pages, maps page names to
-# template names.
-#
-# html_additional_pages = {}
-
-# If false, no module index is generated.
-#
-# html_domain_indices = True
-
-# If false, no index is generated.
-#
-# html_use_index = True
-
-# If true, the index is split into individual pages for each letter.
-#
-# html_split_index = False
-
-# If true, links to the reST sources are added to the pages.
-#
-# html_show_sourcelink = True
-
-# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
-#
-# html_show_sphinx = True
-
-# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
-#
-# html_show_copyright = True
-
-# If true, an OpenSearch description file will be output, and all pages will
-# contain a <link> tag referring to it. The value of this option must be the
-# base URL from which the finished HTML is served.
-#
-# html_use_opensearch = ''
-
-# This is the file name suffix for HTML files (e.g. ".xhtml").
-# html_file_suffix = None
-
-# Language to be used for generating the HTML full-text search index.
-# Sphinx supports the following languages:
-# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja'
-# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr', 'zh'
-#
-# html_search_language = 'en'
-
-# A dictionary with options for the search language support, empty by default.
-# 'ja' uses this config value.
-# 'zh' user can custom change `jieba` dictionary path.
-#
-# html_search_options = {'type': 'default'}
-
-# The name of a javascript file (relative to the configuration directory) that
-# implements a search results scorer. If empty, the default will be used.
-#
-# html_search_scorer = 'scorer.js'
-
-# Output file base name for HTML help builder.
-htmlhelp_basename = 'NFVBenchdoc'
-
-# -- Options for LaTeX output ---------------------------------------------
-
-latex_elements = {
- # The paper size ('letterpaper' or 'a4paper').
- #
- # 'papersize': 'letterpaper',
-
- # The font size ('10pt', '11pt' or '12pt').
- #
- # 'pointsize': '10pt',
-
- # Additional stuff for the LaTeX preamble.
- #
- # 'preamble': '',
-
- # Latex figure (float) alignment
- #
- # 'figure_align': 'htbp',
-}
-
-# Grouping the document tree into LaTeX files. List of tuples
-# (source start file, target name, title,
-# author, documentclass [howto, manual, or own class]).
-latex_documents = [
- (master_doc, 'NFVBench.tex', u'NFVBench Documentation',
- u'Alec Hothan, Stefano Suryanto, Jan Balaz', 'manual'),
-]
-
-# The name of an image file (relative to this directory) to place at the top of
-# the title page.
-#
-# latex_logo = None
-
-# For "manual" documents, if this is true, then toplevel headings are parts,
-# not chapters.
-#
-# latex_use_parts = False
-
-# If true, show page references after internal links.
-#
-# latex_show_pagerefs = False
-
-# If true, show URL addresses after external links.
-#
-# latex_show_urls = False
-
-# Documents to append as an appendix to all manuals.
-#
-# latex_appendices = []
-
-# It false, will not define \strong, \code, itleref, \crossref ... but only
-# \sphinxstrong, ..., \sphinxtitleref, ... To help avoid clash with user added
-# packages.
-#
-# latex_keep_old_macro_names = True
-
-# If false, no module index is generated.
-#
-# latex_domain_indices = True
-
-
-# -- Options for manual page output ---------------------------------------
-
-# One entry per manual page. List of tuples
-# (source start file, name, description, authors, manual section).
-man_pages = [
- (master_doc, 'nfvbench', u'NFVBench Documentation',
- [author], 1)
-]
-
-# If true, show URL addresses after external links.
-#
-# man_show_urls = False
-
-
-# -- Options for Texinfo output -------------------------------------------
-
-# Grouping the document tree into Texinfo files. List of tuples
-# (source start file, target name, title, author,
-# dir menu entry, description, category)
-texinfo_documents = [
- (master_doc, 'NFVBench', u'NFVBench Documentation',
- author, 'NFVBench', 'One line description of project.',
- 'Miscellaneous'),
-]
-
-# Documents to append as an appendix to all manuals.
-#
-# texinfo_appendices = []
-
-# If false, no module index is generated.
-#
-# texinfo_domain_indices = True
-
-# How to display URL addresses: 'footnote', 'no', or 'inline'.
-#
-# texinfo_show_urls = 'footnote'
-
-# If true, do not generate a @detailmenu in the "Top" node's menu.
-#
-# texinfo_no_detailmenu = False
diff --git a/docs/testing/user/userguide/faq.rst b/docs/testing/user/userguide/faq.rst
deleted file mode 100644
index 7daa8c9..0000000
--- a/docs/testing/user/userguide/faq.rst
+++ /dev/null
@@ -1,44 +0,0 @@
-.. This work is licensed under a Creative Commons Attribution 4.0 International License.
-.. SPDX-License-Identifier: CC-BY-4.0
-.. (c) Cisco Systems, Inc
-
-Frequently Asked Questions
-**************************
-
-General Questions
-=================
-
-Can NFVbench be used with a different traffic generator than TRex?
-------------------------------------------------------------------
-This is possible but requires developing a new python class to manage the new traffic generator interface.
-
-Can I connect Trex directly to my compute node?
------------------------------------------------
-That is possible but you will not be able to run more advanced use cases such as PVVP inter-node which requires 2 compute nodes.
-
-Can I drive NFVbench using a REST interface?
---------------------------------------------
-NFVbench can run in server mode and accept HTTP or WebSocket/SocketIO events to run any type of measurement (fixed rate run or NDR_PDR run)
-with any run configuration.
-
-Can I run NFVbench on a Cisco UCS-B series blade?
--------------------------------------------------
-Yes provided your UCS-B series server has a Cisco VIC 1340 (with a recent firmware version).
-TRex will require VIC firmware version 3.1(2) or higher for blade servers (which supports more filtering capabilities).
-In this setting, the 2 physical interfaces for data plane traffic are simply hooked to the UCS-B fabric interconnect (no need to connect to a switch).
-
-Troubleshooting
-===============
-
-TrafficClientException: End-to-end connectivity cannot be ensured
-------------------------------------------------------------------
-Prior to running a benchmark, NFVbench will make sure that traffic is passing in the service chain by sending a small flow of packets in each direction and verifying that they are received back at the other end.
-This exception means that NFVbench cannot pass any traffic in the service chain.
-
-The most common issues that prevent traffic from passing are:
-- incorrect wiring of the NFVbench/TRex interfaces
-- incorrect vlan_tagging setting in the NFVbench configuration, this needs to match how the NFVbench ports on the switch are configured (trunk or access port)
-
- - if the switch port is configured as access port, you must disable vlan_tagging in the NFVbench configuration
- - of the switch port is configured as trunk (recommended method), you must enable it
-
diff --git a/docs/testing/user/userguide/quickstart_docker.rst b/docs/testing/user/userguide/quickstart_docker.rst
deleted file mode 100644
index c5e5eda..0000000
--- a/docs/testing/user/userguide/quickstart_docker.rst
+++ /dev/null
@@ -1,241 +0,0 @@
-.. This work is licensed under a Creative Commons Attribution 4.0 International License.
-.. SPDX-License-Identifier: CC-BY-4.0
-.. (c) Cisco Systems, Inc
-
-===========================================
-NFVbench Installation and Quick Start Guide
-===========================================
-
-.. _docker_installation:
-
-Make sure you satisfy the `hardware and software requirements <requirements>` before you start .
-
-
-1. Container installation
--------------------------
-
-To pull the latest NFVbench container image:
-
-.. code-block:: bash
-
- docker pull opnfv/nfvbench
-
-2. Docker Container configuration
----------------------------------
-
-The NFVbench container requires the following Docker options to operate properly.
-
-+-------------------------------------------------------+-------------------------------------------------------+
-| Docker options | Description |
-+=======================================================+=======================================================+
-| -v /lib/modules/$(uname -r):/lib/modules/$(uname -r) | needed by kernel modules in the container |
-+-------------------------------------------------------+-------------------------------------------------------+
-| -v /usr/src/kernels:/usr/src/kernels | needed by TRex to build kernel modules when needed |
-+-------------------------------------------------------+-------------------------------------------------------+
-| -v /dev:/dev | needed by kernel modules in the container |
-+-------------------------------------------------------+-------------------------------------------------------+
-| -v $PWD:/tmp/nfvbench | optional but recommended to pass files between the |
-| | host and the docker space (see examples below) |
-| | Here we map the current directory on the host to the |
-| | /tmp/nfvbench director in the container but any |
-| | other similar mapping can work as well |
-+-------------------------------------------------------+-------------------------------------------------------+
-| --net=host | (optional) needed if you run the NFVbench ok |
-| | server in the container (or use any appropriate |
-| | docker network mode other than "host") |
-+-------------------------------------------------------+-------------------------------------------------------+
-| --privileged | (optional) required if SELinux is enabled on the host |
-+-------------------------------------------------------+-------------------------------------------------------+
-| -e HOST="127.0.0.1" | (optional) required if REST server is enabled |
-+-------------------------------------------------------+-------------------------------------------------------+
-| -e PORT=7556 | (optional) required if REST server is enabled |
-+-------------------------------------------------------+-------------------------------------------------------+
-| -e CONFIG_FILE="/root/nfvbenchconfig.json | (optional) required if REST server is enabled |
-+-------------------------------------------------------+-------------------------------------------------------+
-
-It can be convenient to write a shell script (or an alias) to automatically insert the necessary options.
-
-The minimal configuration file required must specify the openrc file to use (using in-container path), the PCI addresses of the 2 NIC ports to use
-for generating traffic and the line rate (in each direction) of each of these 2 interfaces.
-
-Here is an example of mimimal configuration where:
-the openrc file is located on the host current directory which is mapped under /tmp/nfvbench in the container (this is achieved using -v $PWD:/tmp/nfvbench)
-the 2 NIC ports to use for generating traffic have the PCI addresses "04:00.0" and "04:00.1"
-
-.. code-block:: bash
-
- {
- "openrc_file": "/tmp/nfvbench/openrc",
- "traffic_generator": {
- "generator_profile": [
- {
- "interfaces": [
- {
- "pci": "04:00.0",
- "port": 0,
- },
- {
- "pci": "04:00.1",
- "port": 1,
- }
- ],
- "intf_speed": "10Gbps",
- "ip": "127.0.0.1",
- "name": "trex-local",
- "software_mode": false,
- "tool": "TRex"
- }
- ]
- }
- }
-
-The other options in the minimal configuration must be present and must have the same values as above.
-
-3. Start the Docker container
------------------------------
-As for any Docker container, you can execute NFVbench measurement sessions using a temporary container ("docker run" - which exits after each NFVbench run)
-or you can decide to run the NFVbench container in the background then execute one or more NFVbench measurement sessions on that container ("docker exec").
-
-The former approach is simpler to manage (since each container is started and terminated after each command) but incurs a small delay at start time (several seconds).
-The second approach is more responsive as the delay is only incurred once when starting the container.
-
-We will take the second approach and start the NFVbench container in detached mode with the name "nfvbench" (this works with bash, prefix with "sudo" if you do not use the root login)
-
-First create a new working directory, and change the current working directory to there. A "nfvbench_ws" directory under your home directory is good place for that, and this is where the OpenStack RC file and NFVbench config file will sit.
-
-To run NFVBench without server mode
-
-.. code-block:: bash
-
- cd ~/nfvbench_ws
- docker run --detach --net=host --privileged -v $PWD:/tmp/nfvbench -v /dev:/dev -v /lib/modules/$(uname -r):/lib/modules/$(uname -r) -v /usr/src/kernels:/usr/src/kernels --name nfvbench opnfv/nfvbench
-
-To run NFVBench enabling REST server (mount the configuration json and the path for openrc)
-
-.. code-block:: bash
-
- cd ~/nfvbench_ws
- docker run --detach --net=host --privileged -e HOST="127.0.0.1" -e PORT=7556 --e CONFIG_FILE="/tmp/nfvbench/nfvbenchconfig.json -v $PWD:/tmp/nfvbench -v /dev:/dev -v /lib/modules/$(uname -r):/lib/modules/$(uname -r) -v /usr/src/kernels:/usr/src/kernels --name nfvbench opnfv/nfvbench start_rest_server
-
-
-The create an alias to make it easy to execute nfvbench commands directly from the host shell prompt:
-
-.. code-block:: bash
-
- alias nfvbench='docker exec -it nfvbench nfvbench'
-
-The next to last "nfvbench" refers to the name of the container while the last "nfvbench" refers to the NFVbench binary that is available to run in the container.
-
-To verify it is working:
-
-.. code-block:: bash
-
- nfvbench --version
- nfvbench --help
-
-
-4. NFVbench configuration
--------------------------
-
-Create a new file containing the minimal configuration for NFVbench, we can call it any name, for example "my_nfvbench.cfg" and paste the following yaml template in the file:
-
-.. code-block:: bash
-
- openrc_file:
- traffic_generator:
- generator_profile:
- - name: trex-local
- tool: TRex
- ip: 127.0.0.1
- cores: 3
- software_mode: false,
- interfaces:
- - port: 0
- switch_port:
- pci:
- - port: 1
- switch_port:
- pci:
- intf_speed: 10Gbps
-
-NFVbench requires an ``openrc`` file to connect to OpenStack using the OpenStack API. This file can be downloaded from the OpenStack Horizon dashboard (refer to the OpenStack documentation on how to
-retrieve the openrc file). The file pathname in the container must be stored in the "openrc_file" property. If it is stored on the host in the current directory, its full pathname must start with /tmp/nfvbench (since the current directory is mapped to /tmp/nfvbench in the container).
-
-The required configuration is the PCI address of the 2 physical interfaces that will be used by the traffic generator. The PCI address can be obtained for example by using the "lspci" Linux command. For example:
-
-.. code-block:: bash
-
- [root@sjc04-pod6-build ~]# lspci | grep 710
- 0a:00.0 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ (rev 01)
- 0a:00.1 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ (rev 01)
- 0a:00.2 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ (rev 01)
- 0a:00.3 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ (rev 01)
-
-
-Example of edited configuration with an OpenStack RC file stored in the current directory with the "openrc" name, and
-PCI addresses "0a:00.0" and "0a:00.1" (first 2 ports of the quad port NIC):
-
-.. code-block:: bash
-
- openrc_file: /tmp/nfvbench/openrc
- traffic_generator:
- generator_profile:
- - name: trex-local
- tool: TRex
- ip: 127.0.0.1
- cores: 3
- software_mode: false,
- interfaces:
- - port: 0
- switch_port:
- pci: "0a:00.0"
- - port: 1
- switch_port:
- pci: "0a:00.1"
- intf_speed: 10Gbps
-
-.. warning::
-
- You have to put quotes around the pci addresses as shown in the above example, otherwise TRex will read it wrong.
-
-Alternatively, the full template with comments can be obtained using the --show-default-config option in yaml format:
-
-.. code-block:: bash
-
- nfvbench --show-default-config > my_nfvbench.cfg
-
-Edit the nfvbench.cfg file to only keep those properties that need to be modified (preserving the nesting).
-
-Make sure you have your nfvbench configuration file (my_nfvbench.cfg) and OpenStack RC file in your pre-created working directory.
-
-
-5. Run NFVbench
----------------
-
-To do a single run at 10,000pps bi-directional (or 5kpps in each direction) using the PVP packet path:
-
-.. code-block:: bash
-
- nfvbench -c /tmp/nfvbench/my_nfvbench.cfg --rate 10kpps
-
-NFVbench options used:
-
-* ``-c /tmp/nfvbench/my_nfvbench.cfg`` : specify the config file to use (this must reflect the file path from inside the container)
-* ``--rate 10kpps`` : specify rate of packets for test for both directions using the kpps unit (thousands of packets per second)
-
-This should produce a result similar to this (a simple run with the above options should take less than 5 minutes):
-
-.. code-block:: none
-
- [TBP]
-
-
-7. Terminating the NFVbench container
--------------------------------------
-When no longer needed, the container can be terminated using the usual docker commands:
-
-.. code-block:: bash
-
- docker kill nfvbench
- docker rm nfvbench
-
diff --git a/docs/testing/user/userguide/sriov.rst b/docs/testing/user/userguide/sriov.rst
deleted file mode 100644
index 4898e85..0000000
--- a/docs/testing/user/userguide/sriov.rst
+++ /dev/null
@@ -1,63 +0,0 @@
-.. This work is licensed under a Creative Commons Attribution 4.0 International License.
-.. SPDX-License-Identifier: CC-BY-4.0
-.. (c) Cisco Systems, Inc
-
-
-Testing SR-IOV
-==============
-
-NFVbench supports SR-IOV with the PVP packet flow (PVVP is not supported). SR-IOV support is not applicable for external chains since the networks have to be setup externally (and can themselves be pre-set to use SR-IOV or not).
-
-Pre-requisites
---------------
-To test SR-IOV you need to have compute nodes configured to support one or more SR-IOV interfaces (also knows as PF or physical function) and you need OpenStack to be configured to support SR-IOV.
-You will also need to know:
-- the name of the physical networks associated to your SR-IOV interfaces (this is a configuration in Nova compute)
-- the VLAN range that can be used on the switch ports that are wired to the SR-IOV ports. Such switch ports are normally configured in trunk mode with a range of VLAN ids enabled on that port
-
-For example, in the case of 2 SR-IOV ports per compute node, 2 physical networks are generally configured in OpenStack with a distinct name.
-The VLAN range to use is is also allocated and reserved by the network administrator and in coordination with the corresponding top of rack switch port configuration.
-
-
-Configuration
--------------
-To enable SR-IOV test, you will need to provide the following configuration options to NFVbench (in the configuration file).
-This example instructs NFVbench to create the left and right networks of a PVP packet flow to run on 2 SRIOV ports named "phys_sriov0" and "phys_sriov1" using resp. segmentation_id 2000 and 2001:
-
-.. code-block:: bash
-
- internal_networks:
- left:
- segmentation_id: 2000
- physical_network: phys_sriov0
- right:
- segmentation_id: 2001
- physical_network: phys_sriov1
-
-The segmentation ID fields must be different.
-In the case of PVVP, the middle network also needs to be provisioned properly.
-The same physical network can also be shared by the virtual networks but with different segmentation IDs.
-
-
-NIC NUMA socket placement and flavors
--------------------------------------
-If the 2 selected ports reside on NICs that are on different NUMA sockets, you will need to explicitly tell Nova to use 2 numa nodes in the flavor used for the VMs in order to satisfy the filters, for example:
-
-.. code-block:: bash
-
- flavor:
- # Number of vCPUs for the flavor
- vcpus: 2
- # Memory for the flavor in MB
- ram: 8192
- # Size of local disk in GB
- disk: 0
- extra_specs:
- "hw:cpu_policy": dedicated
- "hw:mem_page_size": large
- "hw:numa_nodes": 2
-
-Failure to do so might cause the VM creation to fail with the Nova error
-"Instance creation error: Insufficient compute resources:
-Requested instance NUMA topology together with requested PCI devices cannot fit the given host NUMA topology."
-
diff --git a/docs/user/advanced.rst b/docs/user/advanced.rst
new file mode 100644
index 0000000..7cd6250
--- /dev/null
+++ b/docs/user/advanced.rst
@@ -0,0 +1,897 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International License.
+.. SPDX-License-Identifier: CC-BY-4.0
+.. (c) Cisco Systems, Inc
+
+==============
+Advanced Usage
+==============
+
+This section covers a few examples on how to run NFVbench with multiple different settings.
+Below are shown the most common and useful use-cases and explained some fields from a default config file.
+
+How to change any NFVbench run configuration (CLI)
+--------------------------------------------------
+NFVbench always starts with a default configuration which can further be refined (overridden) by the user from the CLI or from REST requests.
+
+At first have a look at the default config:
+
+.. code-block:: bash
+
+ nfvbench --show-default-config
+
+It is sometimes useful derive your own configuration from a copy of the default config:
+
+.. code-block:: bash
+
+ nfvbench --show-default-config > nfvbench.cfg
+
+At this point you can edit the copy by:
+
+- removing any parameter that is not to be changed (since NFVbench will always load the default configuration, default values are not needed)
+- edit the parameters that are to be changed changed
+
+A run with the new confguration can then simply be requested using the -c option and by using the actual path of the configuration file
+as seen from inside the container (in this example, we assume the current directory is mapped to /tmp/nfvbench in the container):
+
+.. code-block:: bash
+
+ nfvbench -c /tmp/nfvbench/nfvbench.cfg
+
+The same -c option also accepts any valid yaml or json string to override certain parameters without having to create a configuration file.
+
+NFVbench provides many configuration options as optional arguments. For example the number of flows can be specified using the --flow-count option.
+
+The flow count option can be specified in any of 3 ways:
+
+- by providing a confguration file that has the flow_count value to use (-c myconfig.yaml and myconfig.yaml contains 'flow_count: 100k')
+- by passing that yaml paremeter inline (-c "flow_count: 100k") or (-c "{flow_count: 100k}")
+- by using the flow count optional argument (--flow-count 100k)
+
+Showing the running configuration
+---------------------------------
+
+Because configuration parameters can be overriden, it is sometimes useful to show the final configuration (after all oevrrides are done) by using the --show-config option.
+This final configuration is also called the "running" configuration.
+
+For example, this will only display the running configuration (without actually running anything):
+
+.. code-block:: bash
+
+ nfvbench -c "{flow_count: 100k, debug: true}" --show-config
+
+
+Connectivity and Configuration Check
+------------------------------------
+
+NFVbench allows to test connectivity to devices used with the selected packet path.
+It runs the whole test, but without actually sending any traffic.
+It is also a good way to check if everything is configured properly in the configuration file and what versions of components are used.
+
+To verify everything works without sending any traffic, use the --no-traffic option:
+
+.. code-block:: bash
+
+ nfvbench --no-traffic
+
+Used parameters:
+
+* ``--no-traffic`` or ``-0`` : sending traffic from traffic generator is skipped
+
+
+TRex force restart
+------------------
+
+NFVbench allows to restart TRex traffic generator between runs.
+It runs the whole test, but restart TRex instance before generating new traffic.
+
+To force restart, use the --restart option:
+
+.. code-block:: bash
+
+ nfvbench --restart
+
+Used parameters:
+
+* ``--restart`` : restart traffic generator (TRex)
+
+Rate Units
+^^^^^^^^^^
+
+Parameter ``--rate`` accepts different types of values:
+
+* packets per second (pps, kpps, mpps), e.g. ``1000pps`` or ``10kpps``
+* load percentage (%), e.g. ``50%``
+* bits per second (bps, kbps, Mbps, Gbps), e.g. ``1Gbps``, ``1000bps``
+* NDR/PDR (ndr, pdr, ndr_pdr), e.g. ``ndr_pdr``
+
+NDR/PDR is the default rate when not specified.
+
+Fixed Rate Run
+--------------
+
+Fixed rate run is the most basic type of NFVbench usage. It can be used to measure the drop rate with a fixed transmission rate of packets.
+
+This example shows how to run the PVP packet path (which is the default packet path) with multiple different settings:
+
+.. code-block:: bash
+
+ nfvbench -c nfvbench.cfg --no-cleanup --rate 100000pps --duration 30 --interval 15 --json results.json
+
+Used parameters:
+
+* ``-c nfvbench.cfg`` : path to the config file
+* ``--no-cleanup`` : resources (networks, VMs, attached ports) are not deleted after test is finished
+* ``--rate 100000pps`` : defines rate of packets sent by traffic generator
+* ``--duration 30`` : specifies how long should traffic be running in seconds
+* ``--interval 15`` : stats are checked and shown periodically (in seconds) in this interval when traffic is flowing
+* ``--json results.json`` : collected data are stored in this file after run is finished
+
+.. note:: It is your responsibility to clean up resources if needed when ``--no-cleanup`` parameter is used. You can use the nfvbench_cleanup helper script for that purpose.
+
+The ``--json`` parameter makes it easy to store NFVbench results. The --show-summary (or -ss) option can be used to display the results in a json results file in a text tabular format:
+
+.. code-block:: bash
+
+ nfvbench --show-summary results.json
+
+
+This example shows how to specify a different packet path:
+
+.. code-block:: bash
+
+ nfvbench -c nfvbench.cfg --rate 1Mbps --inter-node --service-chain PVVP
+
+Used parameters:
+
+* ``-c nfvbench.cfg`` : path to the config file
+* ``--rate 1Mbps`` : defines rate of packets sent by traffic generator
+* ``--inter-node`` : VMs are created on different compute nodes, works only with PVVP flow
+* ``--service-chain PVVP`` or ``-sc PVVP`` : specifies the type of service chain (or packet path) to use
+
+.. note:: When parameter ``--inter-node`` is not used or there aren't enough compute nodes, VMs are on the same compute node.
+
+A fixed rate run can also be used to check the running drop rate while traffic is being generated. In that case the --interval option can be used
+to specify the reporting interval in seconds (minimum is 1 second). This can be useful for example to see how packet drop rate
+evolves over time. One common use case is to see the drop rate when there is a network degradation (e.g. one of the 2 links in a bond
+goes down).
+The console output will show at every reporting interval the number of packets transmitted, received and estimated drop rate for the last reporting interval.
+The smaller is the interval the more precise is the drop rate.
+
+Example of output where the reporting interval is set to 1 (second):
+
+.. code-block:: bash
+
+ 2020-04-25 12:59:16,618 INFO TX: 1,878,719,266; RX: 1,666,641,890; (Est.) Dropped: 2; Drop rate: 0.0000%
+ 2020-04-25 12:59:17,625 INFO TX: 1,883,740,078; RX: 1,671,662,706; (Est.) Dropped: -4; Drop rate: -0.0001%
+ 2020-04-25 12:59:18,632 INFO TX: 1,888,764,404; RX: 1,676,686,993; (Est.) Dropped: 39; Drop rate: 0.0008%
+ 2020-04-25 12:59:19,639 INFO TX: 1,893,785,063; RX: 1,681,276,714; (Est.) Dropped: 430,938; Drop rate: 8.5833%
+ 2020-04-25 12:59:20,645 INFO TX: 1,898,805,769; RX: 1,683,782,636; (Est.) Dropped: 2,514,784; Drop rate: 50.0883%
+ 2020-04-25 12:59:21,652 INFO TX: 1,903,829,191; RX: 1,686,289,860; (Est.) Dropped: 2,516,198; Drop rate: 50.0893%
+ 2020-04-25 12:59:22,658 INFO TX: 1,908,850,478; RX: 1,691,283,008; (Est.) Dropped: 28,139; Drop rate: 0.5604%
+ 2020-04-25 12:59:23,665 INFO TX: 1,913,870,692; RX: 1,696,301,242; (Est.) Dropped: 1,980; Drop rate: 0.0394%
+ 2020-04-25 12:59:24,672 INFO TX: 1,918,889,696; RX: 1,698,806,224; (Est.) Dropped: 2,514,022; Drop rate: 50.0901%
+ 2020-04-25 12:59:25,680 INFO TX: 1,923,915,470; RX: 1,701,314,663; (Est.) Dropped: 2,517,335; Drop rate: 50.0885%
+ 2020-04-25 12:59:26,687 INFO TX: 1,928,944,879; RX: 1,705,886,869; (Est.) Dropped: 457,203; Drop rate: 9.0906%
+ 2020-04-25 12:59:27,696 INFO TX: 1,933,969,377; RX: 1,710,911,346; (Est.) Dropped: 21; Drop rate: 0.0004%
+ 2020-04-25 12:59:28,702 INFO TX: 1,938,998,536; RX: 1,713,843,740; (Est.) Dropped: 2,096,765; Drop rate: 41.6922%
+ 2020-04-25 12:59:29,710 INFO TX: 1,944,019,920; RX: 1,718,226,356; (Est.) Dropped: 638,768; Drop rate: 12.7210%
+ 2020-04-25 12:59:30,718 INFO TX: 1,949,050,206; RX: 1,723,256,639; (Est.) Dropped: 3; Drop rate: 0.0001%
+ 2020-04-25 12:59:31,725 INFO TX: 1,954,075,270; RX: 1,728,281,726; (Est.) Dropped: -23; Drop rate: -0.0005%
+ 2020-04-25 12:59:32,732 INFO TX: 1,959,094,908; RX: 1,733,301,290; (Est.) Dropped: 74; Drop rate: 0.0015%
+ 2020-04-25 12:59:33,739 INFO TX: 1,964,118,902; RX: 1,738,325,357; (Est.) Dropped: -73; Drop rate: -0.0015%
+ 2020-04-25 12:59:34,746 INFO TX: 1,969,143,790; RX: 1,743,350,230; (Est.) Dropped: 15; Drop rate: 0.0003%
+ 2020-04-25 12:59:35,753 INFO TX: 1,974,165,773; RX: 1,748,372,291; (Est.) Dropped: -78; Drop rate: -0.0016%
+ 2020-04-25 12:59:36,759 INFO TX: 1,979,188,496; RX: 1,753,394,957; (Est.) Dropped: 57; Drop rate: 0.0011%
+ 2020-04-25 12:59:37,767 INFO TX: 1,984,208,956; RX: 1,757,183,844; (Est.) Dropped: 1,231,573; Drop rate: 24.5311%
+ 2020-04-25 12:59:38,773 INFO TX: 1,989,233,595; RX: 1,761,729,705; (Est.) Dropped: 478,778; Drop rate: 9.5286%
+ 2020-04-25 12:59:39,780 INFO TX: 1,994,253,350; RX: 1,766,749,467; (Est.) Dropped: -7; Drop rate: -0.0001%
+ 2020-04-25 12:59:40,787 INFO TX: 1,999,276,622; RX: 1,771,772,738; (Est.) Dropped: 1; Drop rate: 0.0000%
+ 2020-04-25 12:59:41,794 INFO TX: 2,004,299,940; RX: 1,776,796,065; (Est.) Dropped: -9; Drop rate: -0.0002%
+ 2020-04-25 12:59:42,800 INFO TX: 2,009,320,453; RX: 1,781,816,583; (Est.) Dropped: -5; Drop rate: -0.0001%
+ 2020-04-25 12:59:43,807 INFO TX: 2,014,340,581; RX: 1,786,503,172; (Est.) Dropped: 333,539; Drop rate: 6.6440%
+ 2020-04-25 12:59:44,814 INFO TX: 2,019,362,996; RX: 1,789,009,857; (Est.) Dropped: 2,515,730; Drop rate: 50.0900%
+ 2020-04-25 12:59:45,821 INFO TX: 2,024,386,346; RX: 1,791,517,070; (Est.) Dropped: 2,516,137; Drop rate: 50.0888%
+
+
+How to read each line:
+
+.. code-block:: bash
+
+ 2020-04-25 10:46:41,276 INFO TX: 4,004,436; RX: 4,004,381; (Est.) Dropped: 55; Drop rate: 0.0014%
+
+At this poing in time, NFvbench has sent 4,004,436 and received 4,004,381 since the start of the run.
+There is deficit of 55 packets on reception which corresponds to 0.0014% of all packets sent during that reporting window interval (last 1 second)
+A negative value means that the RX count is higher than the tx count in that window – this is possible since the RX and TX reads are not atomic.
+
+
+NDR and PDR
+-----------
+
+The NDR and PDR test is used to determine the maximum throughput performance of the system under test
+following guidelines defined in RFC-2544:
+
+* NDR (No Drop Rate): maximum packet rate sent without dropping any packet
+* PDR (Partial Drop Rate): maximum packet rate sent while allowing a given maximum drop rate
+
+The NDR search can also be relaxed to allow some very small amount of drop rate (lower than the PDR maximum drop rate).
+NFVbench will measure the NDR and PDR values by driving the traffic generator through multiple iterations
+at different transmission rates using a binary search algorithm.
+
+The configuration file contains section where settings for NDR/PDR can be set.
+
+.. code-block:: bash
+
+ # NDR/PDR configuration
+ measurement:
+ # Drop rates represent the ratio of dropped packet to the total number of packets sent.
+ # Values provided here are percentages. A value of 0.01 means that at most 0.01% of all
+ # packets sent are dropped (or 1 packet every 10,000 packets sent)
+
+ # No Drop Rate; Default to 0.001%
+ NDR: 0.001
+ # Partial Drop Rate; NDR should always be less than PDR
+ PDR: 0.1
+ # The accuracy of NDR and PDR load percentiles; The actual load percentile that match NDR
+ # or PDR should be within `load_epsilon` difference than the one calculated.
+ load_epsilon: 0.1
+
+Because NDR/PDR is the default ``--rate`` value, it is possible to run NFVbench simply like this:
+
+.. code-block:: bash
+
+ nfvbench -c nfvbench.cfg
+
+Other possible run options:
+
+.. code-block:: bash
+
+ nfvbench -c nfvbench.cfg --duration 120 --json results.json
+
+Used parameters:
+
+* ``-c nfvbench.cfg`` : path to the config file
+* ``--duration 120`` : specifies how long should be traffic running in each iteration
+* ``--json results.json`` : collected data are stored in this file after run is finished
+
+
+Multichain
+----------
+
+NFVbench allows to run multiple chains at the same time. For example it is possible to stage the PVP service chain N-times,
+where N can be as much as your compute power can scale. With N = 10, NFVbench will spawn 10 VMs as a part of 10 simultaneous PVP chains.
+
+The number of chains is specified by ``--service-chain-count`` or ``-scc`` flag with a default value of 1.
+For example to run NFVbench with 3 PVP chains:
+
+.. code-block:: bash
+
+ nfvbench -c nfvbench.cfg --rate 10000pps -scc 3
+
+It is not necessary to specify the service chain type (-sc) because PVP is set as default. The PVP service chains will have 3 VMs in 3 chains with this configuration.
+If ``-sc PVVP`` is specified instead, there would be 6 VMs in 3 chains as this service chain has 2 VMs per chain.
+Both **single run** or **NDR/PDR** can be run as multichain. Running multichain is a scenario closer to a real life situation than runs with a single chain.
+
+
+Multiflow
+---------
+
+NFVbench always generates L3 packets from the traffic generator but allows the user to specify how many flows to generate.
+A flow is identified by a unique src/dest MAC IP and port tuple that is sent by the traffic generator. Flows are
+generated by ranging the IP adresses but using a small fixed number of MAC addresses.
+
+The number of flows will be spread roughly even between chains when more than 1 chain is being tested.
+For example, for 11 flows and 3 chains, number of flows that will run for each chain will be 3, 4, and 4 flows respectively.
+
+The number of flows is specified by ``--flow-count`` or ``-fc`` flag, the default value is 2 (1 flow in each direction).
+To run NFVbench with 3 chains and 100 flows, use the following command:
+
+.. code-block:: bash
+
+ nfvbench -c nfvbench.cfg --rate 10000pps -scc 3 -fc 100
+
+Note that from a vswitch point of view, the
+number of flows seen will be higher as it will be at least 4 times the number of flows sent by the traffic generator
+(add flow to VM and flow from VM).
+
+IP addresses generated can be controlled with the following NFVbench configuration options:
+
+.. code-block:: bash
+
+ ip_addrs: ['10.0.0.0/8', '20.0.0.0/8']
+ ip_addrs_step: 0.0.0.1
+ tg_gateway_ip_addrs: ['1.1.0.100', '2.2.0.100']
+ tg_gateway_ip_addrs_step: 0.0.0.1
+ gateway_ip_addrs: ['1.1.0.2', '2.2.0.2']
+ gateway_ip_addrs_step: 0.0.0.1
+
+``ip_addrs`` are the start of the 2 ip address ranges used by the traffic generators as the packets source and destination packets
+where each range is associated to virtual devices simulated behind 1 physical interface of the traffic generator.
+These can also be written in CIDR notation to represent the subnet.
+
+``tg_gateway_ip_addrs`` are the traffic generator gateway (virtual) ip addresses, all traffic to/from the virtual devices go through them.
+
+``gateway_ip_addrs`` are the 2 gateway ip address ranges of the VMs used in the external chains. They are only used with external chains and must correspond to their public IP address.
+
+The corresponding ``step`` is used for ranging the IP addresses from the `ip_addrs``, ``tg_gateway_ip_addrs`` and ``gateway_ip_addrs`` base addresses.
+0.0.0.1 is the default step for all IP ranges. In ``ip_addrs``, 'random' can be configured which tells NFVBench to generate random src/dst IP pairs in the traffic stream.
+
+UDP ports can be controlled with the following NFVbench configuration options:
+
+.. code-block:: bash
+
+ udp_src_port: ['1024', '65000']
+ udp_dst_port: 53
+ udp_port_step: '1'
+
+``udp_src_port`` and ``udp_dst_port`` are the UDP port value used by the traffic generators.
+These can be written for unique port or range ports for all flow.
+
+The corresponding ``udp_port_step`` is used for ranging the UDP port.
+1 is the default step for all UDP ranges, 'random' can be configured which tells NFVBench to generate random src/dst UDP pairs in the traffic stream.
+
+NB:
+ Use of UDP range will increase possible values of flows (based on ip src/dst and port src/dst tuple).
+ NFVBench will calculate the least common multiple for this tuple to adapt flows generation to ``flow_count`` parameter.
+
+Examples of multiflow
+^^^^^^^^^^^^^^^^^^^^^
+
+1. Source IP is static and one UDP port used (default configuration)
+
+NFVbench configuration options:
+
+.. code-block:: bash
+
+ ip_addrs: ['110.0.0.0/8', '120.0.0.0/8']
+ ip_addrs_step: 0.0.0.1
+ tg_gateway_ip_addrs: ['1.1.0.100', '2.2.0.100']
+ tg_gateway_ip_addrs_step: 0.0.0.1
+ gateway_ip_addrs: ['1.1.0.2', '2.2.0.2']
+ gateway_ip_addrs_step: 0.0.0.1
+
+To run NFVbench with 3 chains and 100 flows, use the following command:
+
+.. code-block:: bash
+
+ nfvbench -c nfvbench.cfg --rate 10000pps -scc 3 -fc 100
+
+The least common multiple for this configuration is lcm(16 777 216, 16 777 216, 1, 1) = 16 777 216.
+.. note:: LCM method used IP pools sizes and UDP source and destination range sizes
+
+Requested flow count is lower than configuration capacity. So, NFVbench will limit IP range to generate accurate flows:
+
+.. code-block:: bash
+
+ 2020-06-17 07:37:47,012 INFO Port 0, chain 0: IP src range [110.0.0.0,110.0.0.0]
+ 2020-06-17 07:37:47,012 INFO Port 0, chain 0: IP dst range [120.0.0.0,120.0.0.15]
+ 2020-06-17 07:37:47,012 INFO Port 0, chain 0: UDP src range [53,53]
+ 2020-06-17 07:37:47,012 INFO Port 0, chain 0: UDP dst range [53,53]
+ 2020-06-17 07:37:47,015 INFO Port 1, chain 0: IP src range [120.0.0.0,120.0.0.0]
+ 2020-06-17 07:37:47,015 INFO Port 1, chain 0: IP dst range [110.0.0.0,110.0.0.15]
+ 2020-06-17 07:37:47,015 INFO Port 1, chain 0: UDP src range [53,53]
+ 2020-06-17 07:37:47,015 INFO Port 1, chain 0: UDP dst range [53,53]
+
+ 2020-06-17 07:38:47,012 INFO Port 0, chain 1: IP src range [110.0.0.1,110.0.0.1]
+ 2020-06-17 07:38:47,012 INFO Port 0, chain 1: IP dst range [120.0.0.16,120.0.0.32]
+ 2020-06-17 07:38:47,012 INFO Port 0, chain 1: UDP src range [53,53]
+ 2020-06-17 07:38:47,012 INFO Port 0, chain 1: UDP dst range [53,53]
+ 2020-06-17 07:38:47,015 INFO Port 1, chain 1: IP src range [120.0.0.1,120.0.0.1]
+ 2020-06-17 07:38:47,015 INFO Port 1, chain 1: IP dst range [110.0.0.16,110.0.0.32]
+ 2020-06-17 07:38:47,015 INFO Port 1, chain 1: UDP src range [53,53]
+ 2020-06-17 07:38:47,015 INFO Port 1, chain 1: UDP dst range [53,53]
+
+ 2020-06-17 07:39:47,012 INFO Port 0, chain 2: IP src range [110.0.0.2,110.0.0.2]
+ 2020-06-17 07:39:47,012 INFO Port 0, chain 2: IP dst range [120.0.0.33,120.0.0.49]
+ 2020-06-17 07:39:47,012 INFO Port 0, chain 2: UDP src range [53,53]
+ 2020-06-17 07:39:47,012 INFO Port 0, chain 2: UDP dst range [53,53]
+ 2020-06-17 07:39:47,015 INFO Port 1, chain 2: IP src range [120.0.0.2,120.0.0.2]
+ 2020-06-17 07:39:47,015 INFO Port 1, chain 2: IP dst range [110.0.0.33,110.0.0.49]
+ 2020-06-17 07:39:47,015 INFO Port 1, chain 2: UDP src range [53,53]
+ 2020-06-17 07:39:47,015 INFO Port 1, chain 2: UDP dst range [53,53]
+
+
+2. Source IP is static, IP step is random and one UDP port used
+
+NFVbench configuration options:
+
+.. code-block:: bash
+
+ ip_addrs: ['110.0.0.0/8', '120.0.0.0/8']
+ ip_addrs_step: 'random'
+ tg_gateway_ip_addrs: ['1.1.0.100', '2.2.0.100']
+ tg_gateway_ip_addrs_step: 0.0.0.1
+ gateway_ip_addrs: ['1.1.0.2', '2.2.0.2']
+ gateway_ip_addrs_step: 0.0.0.1
+
+To run NFVbench with 3 chains and 100 flows, use the following command:
+
+.. code-block:: bash
+
+ nfvbench -c nfvbench.cfg --rate 10000pps -scc 3 -fc 100
+
+The least common multiple for this configuration is lcm(16 777 216, 16 777 216, 1, 1) = 16 777 216.
+.. note:: LCM method used IP pools sizes and UDP source and destination range sizes
+
+Requested flow count is lower than configuration capacity. So, NFVbench will limit IP range to generate accurate flows:
+
+.. code-block:: bash
+
+ 2020-06-17 07:37:47,012 INFO Port 0, chain 0: IP src range [110.0.0.0,110.0.0.0]
+ 2020-06-17 07:37:47,012 INFO Port 0, chain 0: IP dst range [120.0.0.0,120.0.0.15]
+ 2020-06-17 07:37:47,012 INFO Port 0, chain 0: UDP src range [53,53]
+ 2020-06-17 07:37:47,012 INFO Port 0, chain 0: UDP dst range [53,53]
+ 2020-06-17 07:37:47,015 INFO Port 1, chain 0: IP src range [120.0.0.0,120.0.0.0]
+ 2020-06-17 07:37:47,015 INFO Port 1, chain 0: IP dst range [110.0.0.0,110.0.0.15]
+ 2020-06-17 07:37:47,015 INFO Port 1, chain 0: UDP src range [53,53]
+ 2020-06-17 07:37:47,015 INFO Port 1, chain 0: UDP dst range [53,53]
+
+ 2020-06-17 07:38:47,012 INFO Port 0, chain 1: IP src range [110.0.0.1,110.0.0.1]
+ 2020-06-17 07:38:47,012 INFO Port 0, chain 1: IP dst range [120.0.0.16,120.0.0.32]
+ 2020-06-17 07:38:47,012 INFO Port 0, chain 1: UDP src range [53,53]
+ 2020-06-17 07:38:47,012 INFO Port 0, chain 1: UDP dst range [53,53]
+ 2020-06-17 07:38:47,015 INFO Port 1, chain 1: IP src range [120.0.0.1,120.0.0.1]
+ 2020-06-17 07:38:47,015 INFO Port 1, chain 1: IP dst range [110.0.0.16,110.0.0.32]
+ 2020-06-17 07:38:47,015 INFO Port 1, chain 1: UDP src range [53,53]
+ 2020-06-17 07:38:47,015 INFO Port 1, chain 1: UDP dst range [53,53]
+
+ 2020-06-17 07:39:47,012 INFO Port 0, chain 2: IP src range [110.0.0.2,110.0.0.2]
+ 2020-06-17 07:39:47,012 INFO Port 0, chain 2: IP dst range [120.0.0.33,120.0.0.49]
+ 2020-06-17 07:39:47,012 INFO Port 0, chain 2: UDP src range [53,53]
+ 2020-06-17 07:39:47,012 INFO Port 0, chain 2: UDP dst range [53,53]
+ 2020-06-17 07:39:47,015 INFO Port 1, chain 2: IP src range [120.0.0.2,120.0.0.2]
+ 2020-06-17 07:39:47,015 INFO Port 1, chain 2: IP dst range [110.0.0.33,110.0.0.49]
+ 2020-06-17 07:39:47,015 INFO Port 1, chain 2: UDP src range [53,53]
+ 2020-06-17 07:39:47,015 INFO Port 1, chain 2: UDP dst range [53,53]
+ 2020-06-17 07:39:47,015 WARNING Using random step, the number of flows can be less than the requested number of flows due to repeatable multivariate random generation which can reproduce the same pattern of values
+
+By using a random step the number of generated flows may be less than the number of requested flows. This is due to the probability of drawing the same value several times (Bernouillian drawing) from the IP range used and thus generating the same flow sequence.
+By using a high range of UDP ports couple with ``udp_port_step='random'`` the probability to reach the requested flow counts is greater.
+As latency stream is a separate stream than data one and have his own random draw, NFVbench will use only one packet signature (same IP and ports used for all latency packets) to avoid flow count overflow.
+So in some cases, generated flow count can be equal to the requested flow count + 1 (latency stream).
+
+**For deterministic flow count we recommend to use a step different from random.**
+
+
+3. Source IP is static, IP step is 5 and one UDP port used
+
+NFVbench configuration options:
+
+.. code-block:: bash
+
+ ip_addrs: ['110.0.0.0/8', '120.0.0.0/8']
+ ip_addrs_step: '0.0.0.5'
+ tg_gateway_ip_addrs: ['1.1.0.100', '2.2.0.100']
+ tg_gateway_ip_addrs_step: 0.0.0.1
+ gateway_ip_addrs: ['1.1.0.2', '2.2.0.2']
+ gateway_ip_addrs_step: 0.0.0.1
+
+To run NFVbench with 3 chains and 100 flows, use the following command:
+
+.. code-block:: bash
+
+ nfvbench -c nfvbench.cfg --rate 10000pps -scc 3 -fc 100
+
+The least common multiple for this configuration is lcm(16 777 216, 16 777 216, 1, 1) = 16 777 216.
+.. note:: LCM method used IP pools sizes and UDP source and destination range sizes
+
+Requested flow count is lower than configuration capacity. So, NFVbench will limit IP range to generate accurate flows:
+
+.. code-block:: bash
+
+ 2020-06-17 07:37:47,012 INFO Port 0, chain 0: IP src range [110.0.0.0,110.0.0.0]
+ 2020-06-17 07:37:47,012 INFO Port 0, chain 0: IP dst range [120.0.0.0,120.0.0.75]
+ 2020-06-17 07:37:47,012 INFO Port 0, chain 0: UDP src range [53,53]
+ 2020-06-17 07:37:47,012 INFO Port 0, chain 0: UDP dst range [53,53]
+ 2020-06-17 07:37:47,015 INFO Port 1, chain 0: IP src range [120.0.0.0,120.0.0.0]
+ 2020-06-17 07:37:47,015 INFO Port 1, chain 0: IP dst range [110.0.0.0,110.0.0.75]
+ 2020-06-17 07:37:47,015 INFO Port 1, chain 0: UDP src range [53,53]
+ 2020-06-17 07:37:47,015 INFO Port 1, chain 0: UDP dst range [53,53]
+
+ 2020-06-17 07:38:47,012 INFO Port 0, chain 1: IP src range [110.0.0.5,110.0.0.5]
+ 2020-06-17 07:38:47,012 INFO Port 0, chain 1: IP dst range [120.0.0.80,120.0.0.160]
+ 2020-06-17 07:38:47,012 INFO Port 0, chain 1: UDP src range [53,53]
+ 2020-06-17 07:38:47,012 INFO Port 0, chain 1: UDP dst range [53,53]
+ 2020-06-17 07:38:47,015 INFO Port 1, chain 1: IP src range [120.0.0.5,120.0.0.5]
+ 2020-06-17 07:38:47,015 INFO Port 1, chain 1: IP dst range [110.0.0.80,110.0.0.160]
+ 2020-06-17 07:38:47,015 INFO Port 1, chain 1: UDP src range [53,53]
+ 2020-06-17 07:38:47,015 INFO Port 1, chain 1: UDP dst range [53,53]
+
+ 2020-06-17 07:39:47,012 INFO Port 0, chain 2: IP src range [110.0.0.10,110.0.0.10]
+ 2020-06-17 07:39:47,012 INFO Port 0, chain 2: IP dst range [120.0.0.165,120.0.0.245]
+ 2020-06-17 07:39:47,012 INFO Port 0, chain 2: UDP src range [53,53]
+ 2020-06-17 07:39:47,012 INFO Port 0, chain 2: UDP dst range [53,53]
+ 2020-06-17 07:39:47,015 INFO Port 1, chain 2: IP src range [120.0.0.10,120.0.0.10]
+ 2020-06-17 07:39:47,015 INFO Port 1, chain 2: IP dst range [110.0.0.165,110.0.0.245]
+ 2020-06-17 07:39:47,015 INFO Port 1, chain 2: UDP src range [53,53]
+ 2020-06-17 07:39:47,015 INFO Port 1, chain 2: UDP dst range [53,53]
+
+4. Source IP is static, IP and UDP ranges sizes greater than requested flow count, UDP step is random
+
+NFVbench configuration options:
+
+.. code-block:: bash
+
+ ip_addrs: ['110.0.0.0/29', '120.0.0.0/30']
+ tg_gateway_ip_addrs: ['1.1.0.100', '2.2.0.100']
+ tg_gateway_ip_addrs_step: 0.0.0.1
+ gateway_ip_addrs: ['1.1.0.2', '2.2.0.2']
+ gateway_ip_addrs_step: 0.0.0.1
+ udp_src_port: ['10', '14']
+ udp_dst_port: ['20', '25']
+ udp_port_step: 'random'
+
+To run NFVbench with 3 chains and 100 flows, use the following command:
+
+.. code-block:: bash
+
+ nfvbench -c nfvbench.cfg --rate 10000pps -scc 3 -fc 100
+
+The least common multiple for this configuration is lcm(8, 4, 5, 6) = 120.
+.. note:: LCM method used IP pools sizes and UDP source and destination range sizes
+
+Requested flow count is higher than IP range (8 and 4 IP addresses available) and UDP (5 and 6 ports available) configuration capacity.
+As the combination of ranges does not permit to obtain an accurate flow count, NFVbench will override the `udp_port_step` property to '1' (was 'random') to allow flows creation.
+A warning log will appear to inform NFVbench user that step properties will be overriden
+So, NFVbench will determine each pool size to generate accurate flows:
+
+.. code-block:: bash
+
+ 2020-06-17 07:37:47,010 WARNING Current values of ip_addrs_step and/or udp_port_step properties do not allow to control an accurate flow count. Values will be overridden as follows:
+ 2020-06-17 07:37:47,011 INFO udp_port_step='1' (previous value: udp_port_step='random')
+ 2020-06-17 07:37:47,012 INFO Port 0, chain 0: IP src range [110.0.0.0,110.0.0.0]
+ 2020-06-17 07:37:47,012 INFO Port 0, chain 0: IP dst range [120.0.0.0,120.0.0.0]
+ 2020-06-17 07:37:47,012 INFO Port 0, chain 0: UDP src range [10,14]
+ 2020-06-17 07:37:47,012 INFO Port 0, chain 0: UDP dst range [20,25]
+ 2020-06-17 07:37:47,013 WARNING Current values of ip_addrs_step and/or udp_port_step properties do not allow to control an accurate flow count. Values will be overridden as follows:
+ 2020-06-17 07:37:47,013 INFO udp_port_step='1' (previous value: udp_port_step='random'
+ 2020-06-17 07:37:47,015 INFO Port 1, chain 0: IP src range [120.0.0.0,120.0.0.0]
+ 2020-06-17 07:37:47,015 INFO Port 1, chain 0: IP dst range [110.0.0.0,110.0.0.0]
+ 2020-06-17 07:37:47,015 INFO Port 1, chain 0: UDP src range [10,14]
+ 2020-06-17 07:37:47,015 INFO Port 1, chain 0: UDP dst range [20,25]
+
+ 2020-06-17 07:38:47,010 WARNING Current values of ip_addrs_step and/or udp_port_step properties do not allow to control an accurate flow count. Values will be overridden as follows:
+ 2020-06-17 07:38:47,011 INFO udp_port_step='1' (previous value: udp_port_step='random'
+ 2020-06-17 07:38:47,012 INFO Port 0, chain 1: IP src range [110.0.0.1,110.0.0.1]
+ 2020-06-17 07:38:47,012 INFO Port 0, chain 1: IP dst range [120.0.0.1,120.0.0.1]
+ 2020-06-17 07:38:47,012 INFO Port 0, chain 1: UDP src range [10,14]
+ 2020-06-17 07:38:47,012 INFO Port 0, chain 1: UDP dst range [20,25]
+ 2020-06-17 07:38:47,013 WARNING Current values of ip_addrs_step and/or udp_port_step properties do not allow to control an accurate flow count. Values will be overridden as follows:
+ 2020-06-17 07:38:47,013 INFO udp_port_step='1' (previous value: udp_port_step='random'
+ 2020-06-17 07:38:47,015 INFO Port 1, chain 1: IP src range [120.0.0.1,120.0.0.1]
+ 2020-06-17 07:38:47,015 INFO Port 1, chain 1: IP dst range [110.0.0.1,110.0.0.1]
+ 2020-06-17 07:38:47,015 INFO Port 1, chain 1: UDP src range [10,14]
+ 2020-06-17 07:38:47,015 INFO Port 1, chain 1: UDP dst range [20,25]
+
+ 2020-06-17 07:39:47,010 WARNING Current values of ip_addrs_step and/or udp_port_step properties do not allow to control an accurate flow count. Values will be overridden as follows:
+ 2020-06-17 07:39:47,011 INFO udp_port_step='1' (previous value: udp_port_step='random'
+ 2020-06-17 07:39:47,012 INFO Port 0, chain 2: IP src range [110.0.0.2,110.0.0.2]
+ 2020-06-17 07:39:47,012 INFO Port 0, chain 2: IP dst range [120.0.0.2,120.0.0.2]
+ 2020-06-17 07:39:47,012 INFO Port 0, chain 2: UDP src range [10,14]
+ 2020-06-17 07:39:47,012 INFO Port 0, chain 2: UDP dst range [20,25]
+ 2020-06-17 07:39:47,013 WARNING Current values of ip_addrs_step and/or udp_port_step properties do not allow to control an accurate flow count. Values will be overridden as follows:
+ 2020-06-17 07:39:47,013 INFO udp_port_step='1' (previous value: udp_port_step='random'
+ 2020-06-17 07:39:47,015 INFO Port 1, chain 2: IP src range [120.0.0.2,120.0.0.2]
+ 2020-06-17 07:39:47,015 INFO Port 1, chain 2: IP dst range [110.0.0.2,110.0.0.2]
+ 2020-06-17 07:39:47,015 INFO Port 1, chain 2: UDP src range [10,14]
+ 2020-06-17 07:39:47,015 INFO Port 1, chain 2: UDP dst range [20,25]
+
+
+Traffic Configuration via CLI
+-----------------------------
+
+While traffic configuration can be modified using the configuration file, it can be inconvenient to have to change the configuration file everytime
+you need to change a traffic configuration option. Traffic configuration options can be overridden with a few CLI options.
+
+Here is an example of configuring traffic via CLI:
+
+.. code-block:: bash
+
+ nfvbench --rate 10kpps --service-chain-count 2 -fs 64 -fs IMIX -fs 1518 --unidir
+
+This command will run NFVbench with a unidirectional flow for three packet sizes 64B, IMIX, and 1518B.
+
+Used parameters:
+
+* ``--rate 10kpps`` : defines rate of packets sent by traffic generator (total TX rate)
+* ``-scc 2`` or ``--service-chain-count 2`` : specifies number of parallel chains of given flow to run (default to 1)
+* ``-fs 64`` or ``--frame-size 64``: add the specified frame size to the list of frame sizes to run
+* ``--unidir`` : run traffic with unidirectional flow (default to bidirectional flow)
+
+
+.. _adv-l2l-cli:
+
+L2 loopback test via CLI
+------------------------
+
+The CLI allows running a pure L2 loopback benchmark with the ``--l2-loopback`` option.
+Enabling this mode overrides any service chain type selected in the config file.
+The usual argument would be a single VLAN ID but the syntax has been extended.
+
+Examples of runs:
+
+* specify the vlan ID
+
+ .. code-block:: bash
+
+ nfvbench -c nfvbench.cfg --frame-size=64 --rate=100% --duration=10 --l2-loopback=123
+
+* specify a list of vlan IDs
+
+ Several service chains are created, the count is adjusted to the list size.
+
+ .. code-block:: bash
+
+ nfvbench -c nfvbench.cfg -fs=64 --rate=100% --duration=10 --l2-loopback=123,124,125
+
+* enable the mode without VLAN tagging
+
+ In this case the service chain count is forced to 1.
+
+ .. code-block:: bash
+
+ nfvbench -c nfvbench.cfg -fs=64 --rate=100% --duration=10 --l2-loopback=no-tag
+
+* use different VLAN tags for left & right side ports
+
+ .. code-block:: bash
+
+ nfvbench -c nfvbench.cfg -fs=64 --rate=100% --duration=10 --l2-loopback=111_211
+ nfvbench -c nfvbench.cfg -fs=64 --rate=100% --duration=10 --l2-loopback=111,112_211,212
+
+ .. note::
+ It may look bizarre to specify mismatched VLAN tags for left & right sides,
+ however no assumption is made about the loop implementation.
+ This could help testing some exotic L2 layer configuration comprising a VLAN rewriting.
+
+* enable the mode, starting from current settings (prepared in the cfg file)
+
+ In this case the service chain count is not adjusted.
+
+ .. code-block:: bash
+
+ nfvbench -c nfvbench.cfg -fs=64 --rate=100% --duration=10 --l2-loopback=true
+
+* disable the mode (possibly enabled in the cfg file)
+
+ .. code-block:: bash
+
+ nfvbench -c nfvbench.cfg --l2-loopback=false
+
+
+MAC Addresses
+-------------
+
+NFVbench will dicover the MAC addresses to use for generated frames using:
+- either OpenStack discovery (find the MAC of an existing VM) in the case of PVP and PVVP service chains
+- or using dynamic ARP discovery (find MAC from IP) in the case of external chains.
+- In case of L3 chain with SDN-GW or router between traffic generator and loop VM ARP is needed to discover SDN-GW mac addresses, use ``--loop-vm-arp`` flag or ``loop_vm_arp: true`` in config file.
+
+Status and Cleanup of NFVbench Resources
+----------------------------------------
+
+The --status option will display the status of NFVbench and list any NFVbench resources. You need to pass the OpenStack RC
+file in order to connect to OpenStack.
+
+.. code-block:: none
+
+ # nfvbench --status -r /tmp/nfvbench/openrc
+ 2018-04-09 17:05:48,682 INFO Version: 1.3.2.dev1
+ 2018-04-09 17:05:48,683 INFO Status: idle
+ 2018-04-09 17:05:48,757 INFO Discovering instances nfvbench-loop-vm...
+ 2018-04-09 17:05:49,252 INFO Discovering flavor nfvbench.medium...
+ 2018-04-09 17:05:49,281 INFO Discovering networks...
+ 2018-04-09 17:05:49,365 INFO No matching NFVbench resources found
+ #
+
+The Status can be either "idle" or "busy (run pending)".
+
+The --cleanup option will first discover resources created by NFVbench and prompt if you want to proceed with cleaning them up.
+Example of run:
+
+.. code-block:: none
+
+ # nfvbench --cleanup -r /tmp/nfvbench/openrc
+ 2018-04-09 16:58:00,204 INFO Version: 1.3.2.dev1
+ 2018-04-09 16:58:00,205 INFO Status: idle
+ 2018-04-09 16:58:00,279 INFO Discovering instances nfvbench-loop-vm...
+ 2018-04-09 16:58:00,829 INFO Discovering flavor nfvbench.medium...
+ 2018-04-09 16:58:00,876 INFO Discovering networks...
+ 2018-04-09 16:58:00,960 INFO Discovering ports...
+ 2018-04-09 16:58:01,012 INFO Discovered 6 NFVbench resources:
+ +----------+-------------------+--------------------------------------+
+ | Type | Name | UUID |
+ |----------+-------------------+--------------------------------------|
+ | Instance | nfvbench-loop-vm0 | b039b858-777e-467e-99fb-362f856f4a94 |
+ | Flavor | nfvbench.medium | a027003c-ad86-4f24-b676-2b05bb06adc0 |
+ | Network | nfvbench-net0 | bca8d183-538e-4965-880e-fd92d48bfe0d |
+ | Network | nfvbench-net1 | c582a201-8279-4309-8084-7edd6511092c |
+ | Port | | 67740862-80ac-4371-b04e-58a0b0f05085 |
+ | Port | | b5db95b9-e419-4725-951a-9a8f7841e66a |
+ +----------+-------------------+--------------------------------------+
+ 2018-04-09 16:58:01,013 INFO NFVbench will delete all resources shown...
+ Are you sure? (y/n) y
+ 2018-04-09 16:58:01,865 INFO Deleting instance nfvbench-loop-vm0...
+ 2018-04-09 16:58:02,058 INFO Waiting for 1 instances to be fully deleted...
+ 2018-04-09 16:58:02,182 INFO 1 yet to be deleted by Nova, retries left=6...
+ 2018-04-09 16:58:04,506 INFO 1 yet to be deleted by Nova, retries left=5...
+ 2018-04-09 16:58:06,636 INFO 1 yet to be deleted by Nova, retries left=4...
+ 2018-04-09 16:58:08,701 INFO Deleting flavor nfvbench.medium...
+ 2018-04-09 16:58:08,729 INFO Deleting port 67740862-80ac-4371-b04e-58a0b0f05085...
+ 2018-04-09 16:58:09,102 INFO Deleting port b5db95b9-e419-4725-951a-9a8f7841e66a...
+ 2018-04-09 16:58:09,620 INFO Deleting network nfvbench-net0...
+ 2018-04-09 16:58:10,357 INFO Deleting network nfvbench-net1...
+ #
+
+The --force-cleanup option will do the same but without prompting for confirmation.
+
+Service mode for TRex
+---------------------
+
+The ``--service-mode`` option allows you to capture traffic on a TRex window during the NFVBench test. Thus, you will be
+able to capture packets generated by TRex to observe many information on it.
+
+Example of use :
+
+.. code-block:: bash
+
+ nfvbench ``--service-mode``
+
+.. note:: It is preferable to define the minimum rate (2002 pps) to have a better capture
+
+In another bash window, you should connect to the TRex console doing:
+
+.. code-block:: bash
+
+ cd /opt/trex/vX.XX/ # use completion here to find your corresponding TRex version
+ ./trex-console --python3 -r
+ # capture on port number 0
+ capture monitor start --rx 0 -v
+
+ # to stop capture
+ capture monitor stop
+
+Start this capture once you have started the NFVBench test, and you will observe packets on the TRex console:
+
+.. code-block:: bash
+
+ #26342 Port: 0 ◀── RX
+
+ trex(read-only)>
+
+ Type: UDP, Size: 66 B, TS: 26.30 [sec]
+
+ trex(read-only)>
+ ###[ Ethernet ]###
+ dst = a0:36:9f:7a:58:8e
+ src = fa:16:3e:57:8f:df
+ type = 0x8100
+ ###[ 802.1Q ]###
+ prio = 0
+ id = 0
+ vlan = 1093
+ type = 0x800
+ ###[ IP ]###
+ version = 4
+ ihl = 5
+ tos = 0x1
+ len = 46
+ id = 65535
+ flags =
+ frag = 0
+ ttl = 63
+ proto = udp
+ chksum = 0x8425
+ src = 120.0.0.0
+ dst = 110.0.17.153
+ \options \
+ ###[ UDP ]###
+ sport = 53
+ dport = 53
+ len = 26
+ chksum = 0xfd83
+ ###[ Raw ]###
+ load = "xx\xab'\x01\x00?s\x00\x00\xbci\xf0_{U~\x00"
+ ###[ Padding ]###
+ load = '6\x85'
+
+Check on the NFVBench window that the following log appears just before the testing phase:
+
+.. code-block:: bash
+
+ 2019-10-21 09:38:51,532 INFO Starting to generate traffic...
+ 2019-10-21 09:38:51,532 INFO Running traffic generator
+ 2019-10-21 09:38:51,541 INFO ``Service mode is enabled``
+ 2019-10-21 09:38:52,552 INFO TX: 2004; RX: 2003; Est. Dropped: 1; Est. Drop rate: 0.0499%
+ 2019-10-21 09:38:53,559 INFO TX: 4013; RX: 4011; Est. Dropped: 2; Est. Drop rate: 0.0498%
+
+Recording packet using service mode for TRex
+--------------------------------------------
+
+Check on the NFVBench window that the following log appears just before the testing phase:
+
+.. code-block:: bash
+
+ 2019-10-21 09:38:51,532 INFO Starting to generate traffic...
+ 2019-10-21 09:38:51,532 INFO Running traffic generator
+ 2019-10-21 09:38:51,541 INFO ``Service mode is enabled``
+ 2019-10-21 09:38:52,552 INFO TX: 2004; RX: 2003; Est. Dropped: 1; Est. Drop rate: 0.0499%
+
+In another bash window, you should connect to the TRex console doing :
+
+.. code-block:: bash
+
+ cd /opt/trex/vX.XX/ #use completion here to find your corresponding TRex version
+ ./trex-console -r
+ capture record start --rx [port number] --limit 10000
+.. note::Start this capture once traffic generation is started (after ``Service mode is enabled`` log)
+
+Check on the TRex window that the following log appears just after capture is started:
+
+.. code-block:: bash
+
+ Starting packet capturing up to 10000 packets [SUCCESS]
+ *** Capturing ID is set to '8' ***
+ *** Please call 'capture record stop --id 8 -o <out.pcap>' when done ***
+
+Then **before end of traffic generation**, stop capture and save it as a PCAP file:
+
+.. code-block:: bash
+
+ capture record stop --id 8 -o /tmp/nfvb/record.pcap
+.. note:: Provide a shared path with between NFVbench container and your host to retrieve pcap file
+
+Check on the TRex window that the following log appears just after capture is started:
+
+.. code-block:: bash
+
+ Stopping packet capture 8 [SUCCESS]
+ Writing up to 10000 packets to '/tmp/nfvb/record.pcap' [SUCCESS]
+ Removing PCAP capture 8 from server [SUCCESS]
+
+.. _user-info:
+
+User info data
+--------------
+
+The ``--user-info`` option allows you to pass custom information as a JSON string.
+This information will be available through JSON output and also exported to ``fluentd`` and can be used in results post-processing.
+
+Example of use :
+
+.. code-block:: bash
+
+ nfvbench ``--user-info='{"status":"explore","description":{"target":"lab","ok":true,"version":2020}'``
+
+.. note:: only JSON string is allowed
+
+``--user-info`` can be used for determining theoretical max rate. In some cases, an overhead encapsulation exists between NFVbench and SUT so NFVbench will not reach line rate inside SUT due to this extra encapsulation.
+To calculate this theoretical line rate inside SUT, NFVbench will use a reserved key: ``extra_encapsulation_bytes`` in ``--user-info`` property.
+
+.. code-block:: bash
+
+ nfvbench ``--user-info='{"extra_encapsulation_bytes": 28}'``
+
+
+As a result, NFVbench will return two values ``theoretical_tx_rate_bps`` and ``theoretical_tx_rate_pps``:
+
+.. code-block:: bash
+
+ "ndr": {
+ "duration_sec": 2.0,
+ "initial_rate_type": "rate_percent",
+ "l2frame_size": "64",
+ "load_percent_per_direction": 100.0,
+ "rate_bps": 20000000000.0,
+ "rate_percent": 200.0,
+ "rate_pps": 29761904,
+ "stats": {
+ ...
+ "offered_tx_rate_bps": 15000000000.0,
+ ...
+ "theoretical_tx_rate_bps": 15000000000.0,
+ "theoretical_tx_rate_pps": 22321428.57142857,
+ "total_tx_rate": 22321428
+ },
+
+In the above example, line rate is 20Gbps but NFVbench is outside SUT and a SDN gateway add an extra encapsulation of 28 bytes.
+Overall, theoretical line rate inside SUT is only 15 Gbps for 64 bytes packet size and it will be this max capacity treated by the target compute node.
diff --git a/docs/testing/user/userguide/examples.rst b/docs/user/examples.rst
index fd6be5c..fd6be5c 100644
--- a/docs/testing/user/userguide/examples.rst
+++ b/docs/user/examples.rst
diff --git a/docs/user/extchains.rst b/docs/user/extchains.rst
new file mode 100644
index 0000000..f7c0e51
--- /dev/null
+++ b/docs/user/extchains.rst
@@ -0,0 +1,77 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International License.
+.. SPDX-License-Identifier: CC-BY-4.0
+.. (c) Cisco Systems, Inc
+
+===============
+External Chains
+===============
+
+NFVbench can measure the performance of 1 or more L3 service chains that are setup externally using OpenStack or without OpenStack.
+Instead of being setup by NFVbench, the complete environment (VNFs and networks) must be setup prior to running NFVbench.
+
+Each external chain is made of 1 or more VNFs and has exactly 2 edge network interfaces (left and right network interfaces)
+that are connected to 2 edge networks (left and right networks).
+The 2 edge networks for each chain can either be shared across all chains or can be independent.
+
+The internal composition of a multi-VNF service chain can be arbitrary (usually linear) as far as NFVbench is concerned,
+the only requirement is that the service chain can route L3 packets properly between the left and right networks.
+
+The network topology of the service chains is defined by the "service_chain_shared_net" option in the
+NFVbench configuration file.
+
+
+Shared Edge Networks
+--------------------
+
+This option is defined when "service_chain_shared_net" is set to true.
+All chains must share the same 2 edge networks and the VNF gateway IP addresses on each edge
+must all belong to the same subnet.
+
+.. image:: images/nfvbench-ext-shared.png
+
+The main advantage of this mode is that only 2 network segments are needed to support an arbitrary number of chains.
+
+
+Multi-VLAN Edge Networks
+------------------------
+
+This option is defined when "service_chain_shared_net" is set to false (default).
+Each chain has its own dedicated left and right network and there is no inter-chain constraint
+on the VNF IP addresses since they all belong to different network segments.
+
+.. image:: images/nfvbench-ext-multi-vlans.png
+
+The advantage of this mode is that the configuration of the VNFs can be made identical (same
+gateway IP addresses, same static routes).
+However this mode requires 2 network segments per chain.
+
+
+Detailed Example
+----------------
+To run NFVbench on an external service chains using shared edge networks:
+
+- tell NFVbench to use external service chain by adding "-sc EXT" or "--service-chain EXT" to NFVbench CLI options
+- specify the number of external chains using the "-scc" option (defaults to 1 chain)
+- if OpenStack is used:
+ - specify the name of the 2 edge networks in "external_networks" in the NFVbench configuration file
+ - The two networks specified have to exist in Neutron ('napa' and 'marin' in the diagram below)
+- if OpenStack is not used:
+ - specify the VLAN id to use for the 2 edge networks in "vlans" in the NFVbench configuration file
+- specify the VNF gateway IPs for the external service chains (1.1.0.2 and 2.2.0.2)
+- specify the traffic generator gateway IPs for the external service chains (1.1.0.102 and 2.2.0.102 in diagram below)
+- specify the packet source and destination IPs for the virtual devices that are simulated (10.0.0.0/8 and 20.0.0.0/8)
+
+.. image:: images/extchain-config.png
+
+L3 routing must be enabled in the VNF and configured to:
+
+- reply to ARP requests to its public IP addresses on both left and right networks
+- route packets from each set of remote devices toward the appropriate dest gateway IP in the traffic generator using 2 static routes (as illustrated in the diagram)
+
+Upon start, NFVbench will:
+- first retrieve the properties of the left and right networks using Neutron APIs,
+- extract the underlying network ID (typically VLAN segmentation ID),
+- generate packets with the proper VLAN ID and measure traffic.
+
+Note that in the case of multiple chains, all chains end interfaces must be connected to the same two left and right networks.
+The traffic will be load balanced across the corresponding gateway IP of these external service chains.
diff --git a/docs/user/faq.rst b/docs/user/faq.rst
new file mode 100644
index 0000000..014a1ab
--- /dev/null
+++ b/docs/user/faq.rst
@@ -0,0 +1,95 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International License.
+.. SPDX-License-Identifier: CC-BY-4.0
+.. (c) Cisco Systems, Inc
+
+Frequently Asked Questions
+**************************
+
+General Questions
+=================
+
+Can NFVbench be used without OpenStack
+--------------------------------------
+Yes. This can be done using the EXT chain mode, with or without ARP
+(depending on whether your systen under test can do routing) and by setting the openrc_file
+property to empty in the NFVbench configuration.
+
+Can NFVbench be used with a different traffic generator than TRex?
+------------------------------------------------------------------
+This is possible but requires developing a new python class to manage the new traffic generator interface.
+
+Can I connect Trex directly to my compute node?
+-----------------------------------------------
+Yes.
+
+Can I drive NFVbench using a REST interface?
+--------------------------------------------
+NFVbench can run in server mode and accept HTTP requests to run any type of measurement (fixed rate run or NDR_PDR run)
+with any run configuration.
+
+Can I run NFVbench on a Cisco UCS-B series blade?
+-------------------------------------------------
+Yes provided your UCS-B series server has a Cisco VIC 1340 (with a recent firmware version).
+TRex will require VIC firmware version 3.1(2) or higher for blade servers (which supports more filtering capabilities).
+In this setting, the 2 physical interfaces for data plane traffic are simply hooked to the UCS-B fabric interconnect (no need to connect to a switch).
+
+Troubleshooting
+===============
+
+TrafficClientException: End-to-end connectivity cannot be ensured
+------------------------------------------------------------------
+Prior to running a benchmark, NFVbench will make sure that traffic is passing in the service chain by sending a small flow of packets in each direction and verifying that they are received back at the other end.
+This exception means that NFVbench cannot pass any traffic in the service chain.
+
+The most common issues that prevent traffic from passing are:
+- incorrect wiring of the NFVbench/TRex interfaces
+- incorrect vlan_tagging setting in the NFVbench configuration, this needs to match how the NFVbench ports on the switch are configured (trunk or access port)
+
+ - if the switch port is configured as access port, you must disable vlan_tagging in the NFVbench configuration
+ - if the switch port is configured as trunk (recommended method), you must enable it
+
+Issues with high performances at a high line rate
+-------------------------------------------------
+
+Flow statistics and/or latency stream can cause performance issue when testing high line rate.
+
+Flow statistics implies CPU usage to analyse packets and retrieve statistics. CPU can reach 100% usage when high throughput is tested because only one CPU is used for packet reception in TRex.
+The ``--no-flow-stats`` option allows you to disable TRex statistics aggregation during the NFVBench test.
+This, will permit to save CPU capabilities used for packet reception.
+
+Example of use :
+
+.. code-block:: bash
+
+ nfvbench ``--no-flow-stats``
+
+ 2019-10-28 10:26:52,099 INFO End-to-end connectivity established
+ 2019-10-28 10:26:52,127 INFO Cleared all existing streams
+ 2019-10-28 10:26:52,129 INFO Traffic flow statistics are disabled.
+
+
+Latency streams implies also CPU usage to analyse packets and retrieve latency values. CPU can reach 100% usage when high throughput is tested because only one CPU is used for packet reception in TRex.
+The ``--no-latency-streams`` option allows you to disable latency streams during the NFVBench test.
+This, will permit to save CPU capabilities used for packet reception but no latency information will be return (to be used only if latency value has no meaning for your test).
+
+Example of use :
+
+.. code-block:: bash
+
+ nfvbench ``--no-latency-streams``
+ 2019-10-28 10:30:03,955 INFO End-to-end connectivity established
+ 2019-10-28 10:30:03,982 INFO Cleared all existing streams
+ 2019-10-28 10:30:03,982 INFO Latency streams are disabled
+
+
+Latency flow statistics implies CPU usage to analyse packets and retrieve statistics. CPU can reach 100% usage when high throughput is tested because only one CPU is used for packet reception in TRex.
+The ``--no-latency-stats`` option allows you to disable TRex statistics aggregation for latency packets during the NFVBench test.
+This, will permit to save CPU capabilities used for packet reception.
+
+Example of use :
+
+.. code-block:: bash
+
+ nfvbench ``--no-latency-stats``
+ 2019-10-28 10:28:21,559 INFO Cleared all existing streams
+ 2019-10-28 10:28:21,567 INFO Latency flow statistics are disabled.
diff --git a/docs/testing/user/userguide/fluentd.rst b/docs/user/fluentd.rst
index e1ff37f..7332458 100644
--- a/docs/testing/user/userguide/fluentd.rst
+++ b/docs/user/fluentd.rst
@@ -192,3 +192,4 @@ And the results of this command obtained from fluentd by elasticsearch:
1508264203755
]
}
+
diff --git a/docs/testing/user/userguide/hw_requirements.rst b/docs/user/hw_requirements.rst
index 1ebb19e..44ab549 100644
--- a/docs/testing/user/userguide/hw_requirements.rst
+++ b/docs/user/hw_requirements.rst
@@ -14,7 +14,8 @@ To run NFVbench you need the following hardware:
- a DPDK compatible NIC with at least 2 ports (preferably 10Gbps or higher)
- 2 ethernet cables between the NIC and the OpenStack pod under test (usually through a top of rack switch)
-The DPDK-compliant NIC must be one supported by the TRex traffic generator (such as Intel X710, refer to the `Trex Installation Guide <https://trex-tgn.cisco.com/trex/doc/trex_manual.html#_download_and_installation>`_ for a complete list of supported NIC)
+The DPDK-compliant NIC must be one supported by the TRex traffic generator (such as Intel X710,
+refer to the Trex Installation Guide for a complete list of supported NIC)
To run the TRex traffic generator (that is bundled with NFVbench) you will need to wire 2 physical interfaces of the NIC to the TOR switch(es):
- if you have only 1 TOR, wire both interfaces to that same TOR
@@ -30,7 +31,7 @@ The 2 corresponding ports on the switch(es) facing the Trex ports on the Linux s
Using a TOR switch is more representative of a real deployment and allows to measure packet flows on any compute node in the rack without rewiring and includes the overhead of the TOR switch.
Although not the primary targeted use case, NFVbench could also support the direct wiring of the traffic generator to
-a compute node without a switch (although that will limit some of the features that invove multiple compute nodes in the packet path).
+a compute node without a switch.
Software Requirements
---------------------
@@ -67,4 +68,4 @@ Finally, the correct iommu options and huge pages to be configured on the Linux
- enable intel_iommu and iommu pass through: "intel_iommu=on iommu=pt"
- for Trex, pre-allocate 1024 huge pages of 2MB each (for a total of 2GB): "hugepagesz=2M hugepages=1024"
-More detailed instructions can be found in the DPDK documentation (https://media.readthedocs.org/pdf/dpdk/latest/dpdk.pdf).
+More detailed instructions can be found in the DPDK documentation (https://buildmedia.readthedocs.org/media/pdf/dpdk/latest/dpdk.pdf).
diff --git a/docs/testing/user/userguide/images/extchain-config.png b/docs/user/images/extchain-config.png
index 2fd39ba..2fd39ba 100644
--- a/docs/testing/user/userguide/images/extchain-config.png
+++ b/docs/user/images/extchain-config.png
Binary files differ
diff --git a/docs/testing/user/userguide/images/nfvbench-all-sriov-pvvp.png b/docs/user/images/nfvbench-all-sriov-pvvp.png
index d7b1cbb..d7b1cbb 100644
--- a/docs/testing/user/userguide/images/nfvbench-all-sriov-pvvp.png
+++ b/docs/user/images/nfvbench-all-sriov-pvvp.png
Binary files differ
diff --git a/docs/testing/user/userguide/images/nfvbench-all-sriov-pvvp2.png b/docs/user/images/nfvbench-all-sriov-pvvp2.png
index 3d161cd..3d161cd 100644
--- a/docs/testing/user/userguide/images/nfvbench-all-sriov-pvvp2.png
+++ b/docs/user/images/nfvbench-all-sriov-pvvp2.png
Binary files differ
diff --git a/docs/user/images/nfvbench-ext-multi-vlans.png b/docs/user/images/nfvbench-ext-multi-vlans.png
new file mode 100644
index 0000000..2ef2300
--- /dev/null
+++ b/docs/user/images/nfvbench-ext-multi-vlans.png
Binary files differ
diff --git a/docs/user/images/nfvbench-ext-shared.png b/docs/user/images/nfvbench-ext-shared.png
new file mode 100644
index 0000000..efe1c71
--- /dev/null
+++ b/docs/user/images/nfvbench-ext-shared.png
Binary files differ
diff --git a/docs/user/images/nfvbench-kibana-filter-kql.png b/docs/user/images/nfvbench-kibana-filter-kql.png
new file mode 100644
index 0000000..f5c7b2d
--- /dev/null
+++ b/docs/user/images/nfvbench-kibana-filter-kql.png
Binary files differ
diff --git a/docs/user/images/nfvbench-kibana-filter.png b/docs/user/images/nfvbench-kibana-filter.png
new file mode 100644
index 0000000..18a6dc5
--- /dev/null
+++ b/docs/user/images/nfvbench-kibana-filter.png
Binary files differ
diff --git a/docs/user/images/nfvbench-kibana-gbps-line.png b/docs/user/images/nfvbench-kibana-gbps-line.png
new file mode 100644
index 0000000..1947412
--- /dev/null
+++ b/docs/user/images/nfvbench-kibana-gbps-line.png
Binary files differ
diff --git a/docs/user/images/nfvbench-kibana-pps-scatter.png b/docs/user/images/nfvbench-kibana-pps-scatter.png
new file mode 100644
index 0000000..89a8e47
--- /dev/null
+++ b/docs/user/images/nfvbench-kibana-pps-scatter.png
Binary files differ
diff --git a/docs/user/images/nfvbench-kibana-pps-theoretical.png b/docs/user/images/nfvbench-kibana-pps-theoretical.png
new file mode 100644
index 0000000..da7dc7a
--- /dev/null
+++ b/docs/user/images/nfvbench-kibana-pps-theoretical.png
Binary files differ
diff --git a/docs/user/images/nfvbench-kibana-zoom-selection.png b/docs/user/images/nfvbench-kibana-zoom-selection.png
new file mode 100644
index 0000000..6af64ea
--- /dev/null
+++ b/docs/user/images/nfvbench-kibana-zoom-selection.png
Binary files differ
diff --git a/docs/user/images/nfvbench-kibana.png b/docs/user/images/nfvbench-kibana.png
new file mode 100644
index 0000000..d185fa0
--- /dev/null
+++ b/docs/user/images/nfvbench-kibana.png
Binary files differ
diff --git a/docs/testing/user/userguide/images/nfvbench-npvp.png b/docs/user/images/nfvbench-npvp.png
index 53d7b00..53d7b00 100644
--- a/docs/testing/user/userguide/images/nfvbench-npvp.png
+++ b/docs/user/images/nfvbench-npvp.png
Binary files differ
diff --git a/docs/testing/user/userguide/images/nfvbench-pvp.png b/docs/user/images/nfvbench-pvp.png
index b460beb..b460beb 100644
--- a/docs/testing/user/userguide/images/nfvbench-pvp.png
+++ b/docs/user/images/nfvbench-pvp.png
Binary files differ
diff --git a/docs/user/images/nfvbench-pvpl3.png b/docs/user/images/nfvbench-pvpl3.png
new file mode 100644
index 0000000..d583724
--- /dev/null
+++ b/docs/user/images/nfvbench-pvpl3.png
Binary files differ
diff --git a/docs/testing/user/userguide/images/nfvbench-pvvp.png b/docs/user/images/nfvbench-pvvp.png
index d412b20..d412b20 100644
--- a/docs/testing/user/userguide/images/nfvbench-pvvp.png
+++ b/docs/user/images/nfvbench-pvvp.png
Binary files differ
diff --git a/docs/testing/user/userguide/images/nfvbench-pvvp2.png b/docs/user/images/nfvbench-pvvp2.png
index 94f84de..94f84de 100644
--- a/docs/testing/user/userguide/images/nfvbench-pvvp2.png
+++ b/docs/user/images/nfvbench-pvvp2.png
Binary files differ
diff --git a/docs/testing/user/userguide/images/nfvbench-sriov-pvp.png b/docs/user/images/nfvbench-sriov-pvp.png
index 7faec17..7faec17 100644
--- a/docs/testing/user/userguide/images/nfvbench-sriov-pvp.png
+++ b/docs/user/images/nfvbench-sriov-pvp.png
Binary files differ
diff --git a/docs/testing/user/userguide/images/nfvbench-sriov-pvvp.png b/docs/user/images/nfvbench-sriov-pvvp.png
index 5faf8b2..5faf8b2 100644
--- a/docs/testing/user/userguide/images/nfvbench-sriov-pvvp.png
+++ b/docs/user/images/nfvbench-sriov-pvvp.png
Binary files differ
diff --git a/docs/testing/user/userguide/images/nfvbench-sriov-pvvp2.png b/docs/user/images/nfvbench-sriov-pvvp2.png
index f0c1e93..f0c1e93 100644
--- a/docs/testing/user/userguide/images/nfvbench-sriov-pvvp2.png
+++ b/docs/user/images/nfvbench-sriov-pvvp2.png
Binary files differ
diff --git a/docs/testing/user/userguide/images/nfvbench-trex-setup.png b/docs/user/images/nfvbench-trex-setup.png
index 6268068..6268068 100644
--- a/docs/testing/user/userguide/images/nfvbench-trex-setup.png
+++ b/docs/user/images/nfvbench-trex-setup.png
Binary files differ
diff --git a/docs/user/images/nfvbench-xtesting.png b/docs/user/images/nfvbench-xtesting.png
new file mode 100644
index 0000000..d5dca8d
--- /dev/null
+++ b/docs/user/images/nfvbench-xtesting.png
Binary files differ
diff --git a/docs/testing/user/userguide/index.rst b/docs/user/index.rst
index c7c57c8..65b6c2a 100644
--- a/docs/testing/user/userguide/index.rst
+++ b/docs/user/index.rst
@@ -15,8 +15,8 @@ The NFVbench tool provides an automated way to measure the network performance f
It is designed to be easy to install and easy to use by non experts (no need to be an expert in traffic generators and data plane performance testing).
-Table of Content
-----------------
+Table of Contents
+
.. toctree::
:maxdepth: 3
@@ -24,10 +24,12 @@ Table of Content
installation
examples
advanced
+ pvpl3
+ xtesting
+ mpls
+ extchains
fluentd
+ kibana
sriov
server
faq
-
-
-
diff --git a/docs/testing/user/userguide/installation.rst b/docs/user/installation.rst
index 8a0511a..8a0511a 100644
--- a/docs/testing/user/userguide/installation.rst
+++ b/docs/user/installation.rst
diff --git a/docs/user/kibana.rst b/docs/user/kibana.rst
new file mode 100644
index 0000000..5fb41f7
--- /dev/null
+++ b/docs/user/kibana.rst
@@ -0,0 +1,96 @@
+.. Copyright 2016 - 2023, Cisco Systems, Inc. and the NFVbench project contributors
+.. SPDX-License-Identifier: CC-BY-4.0
+
+NFVbench Kibana visualization: overview
+=======================================
+
+The fluentd integration offers the possibility to use elasticsearch and kibana as a visualization chain.
+
+Chain overview:
+
+.. image:: images/nfvbench-kibana.png
+
+Example of NFVbench visualizations
+----------------------------------
+
+Kibana offers a lot of visualization type (line and bar charts, pie, time series chart, data table ...) and also provide a plugin to develop graph using Vega.
+In the below examples, visualizations are based on an NDR result and are developed using `Vega-lite <https://vega.github.io/vega-lite-v2>`_.
+Data are aggregated using ``user_label`` and ``flow_count`` properties.
+
+In ``kibana/visualizations/`` pre-created graphs are available into json files.
+
+For NDR capacity in Gbps using line chart, the offered load in Gbps (``offered_tx_rate_bps``) is used and only the maximum value of the aggregation is kept.
+For NDR capacity in Mpps using line chart, the actual TX rate is used (``rate_pps``) and only the maximum value of the aggregation is kept.
+
+Scatter plot graphs use the same values but keep all values instead of keeping maximum.
+
+Example of a line chart:
+
+.. image:: images/nfvbench-kibana-gbps-line.png
+
+Example of a scatter plot chart:
+
+.. image:: images/nfvbench-kibana-pps-scatter.png
+
+Vega offers the possibility to add another graph as a new layer of current graph.
+This solution is used to combine NFVbench results and theoretical line rate.
+Using ``extra_encapsulation_bytes`` in --user-info property (see :ref:`user-info`),
+the theoretical max value (for bps and pps) will be calculated and can be used in graph through ``theoretical_tx_rate_bps`` and ``theoretical_tx_rate_pps`` properties.
+
+Example of chart with theoretical value (red line):
+
+.. image:: images/nfvbench-kibana-pps-theoretical.png
+
+Each Vega graph can be moved, zoomed (using mouse scroll) and one set of data can be selected.
+
+Example:
+
+.. image:: images/nfvbench-kibana-zoom-selection.png
+
+These visualizations are included into Kibana dashboard for a synthesis of one set of result (i.e. same ``user_label`` value) or for comparison (i.e. a selection of ``user_label`` values).
+See :ref:`filterkibana` for more details about ``user_label`` selection.
+
+All these visualizations and dashboards are saved into the ``export.ndjson`` file and can be imported in an existing Kibana. See :ref:`importkibana`.
+
+.. _importkibana:
+
+Import Kibana dashboards and visualization
+------------------------------------------
+
+To import Kibana dashboard and visualization:
+
+.. code-block:: bash
+
+ curl -X POST localhost:5601/api/saved_objects/_import -H "kbn-xsrf: true" --form file=@export.ndjson
+
+.. note:: ``.kibana`` index must exists in elasticsearch.
+.. note:: ``.kibana`` index is created automatically after a first deployment and configuration of Kibana.
+
+.. _filterkibana:
+
+Kibana user guide: Filter dashboards and visualizations
+=======================================================
+
+Filter Kibana dashboard or visualization using Kibana query language (KQL)
+--------------------------------------------------------------------------
+
+.. code-block:: bash
+
+ user_label:*demo* and (flow_count: 128 or flow_count:130000 or flow_count:1000000)
+
+.. note:: This query will filter all user label which contains ``demo`` in the value and filter 3 flow count (128, 130k, 1M).
+.. note:: ``flow_count`` is a number so KQL query can not contain formatted string.
+
+Example:
+
+.. image:: images/nfvbench-kibana-filter-kql.png
+
+
+Filter Kibana dashboard or visualization using Kibana filters
+-------------------------------------------------------------
+
+Kibana offers the possibility to add filter by selecting field and operator (is, is not, is one of, is not one of, exists, does not exist).
+
+Example:
+
+.. image:: images/nfvbench-kibana-filter.png
diff --git a/docs/user/mpls.rst b/docs/user/mpls.rst
new file mode 100644
index 0000000..4a0621b
--- /dev/null
+++ b/docs/user/mpls.rst
@@ -0,0 +1,96 @@
+.. Copyright 2016 - 2023, Cisco Systems, Inc. and the NFVbench project contributors
+.. SPDX-License-Identifier: CC-BY-4.0
+
+==========================
+MPLS encapsulation feature
+==========================
+
+This feature allows to generate packets with standard MPLS L2VPN double stack MPLS labels, where the outer label is transport and the inner label is VPN.
+The top layer of a packets encapsulated inside MPLS L2VPN seems to be an Ethernet layer with the rest of the IP stack inside.
+Please refer to RFC-3031 for more details.
+The whole MPLS packet structure looks like the following:
+
+###[ Ethernet ]###
+ dst = ['00:8a:96:bb:14:28']
+ src = 3c:fd:fe:a3:48:7c
+ type = 0x8847
+###[ MPLS ]### <-------------- Outer Label
+ label = 16303
+ cos = 1
+ s = 0
+ ttl = 255
+###[ MPLS ]### <-------------- Inner Label
+ label = 5010
+ cos = 1
+ s = 1
+ ttl = 255
+###[ Ethernet ]###
+ dst = fa:16:3e:bd:02:b5
+ src = 3c:fd:fe:a3:48:7c
+ type = 0x800
+###[ IP ]###
+ version = 4
+ ihl = None
+ tos = 0x0
+ len = None
+ id = 1
+ flags =
+ frag = 0
+ ttl = 64
+ proto = udp
+ chksum = None
+ src = 16.0.0.1
+ dst = 48.0.0.1
+ \options \
+###[ UDP ]###
+ sport = 53
+ dport = 53
+ len = None
+ chksum = None
+
+Example: nfvbench generates mpls traffic port A ----> port B. This example assumes openstack is at the other end of the mpls tunnels.
+Packets generated and sent to port B are delivered to the MPLS domain infrastructure which will transport that packet to the other end
+of the MPLS transport tunnel using the outer label. At that point, the outer label is decapsulated and the inner label is used to
+select the destination openstack network. After decapsulation of the inner label, the resulting L2 frame is then forwarded to the
+destination VM corresponding to the destination MAC. When the VM receives the packet, it is sent back to far end port of the traffic
+generator (port B) using either L2 forwarding or L3 routing though the peer virtual interface. The return packet is then encapsulated
+with the inner label first then outer label to reach nfvbench on port B.
+
+Only 2 MPLS labels stack is supported. If more than two labels stack is required then these operations should be handled by MPLS transport
+domain where nfvbench is attached next-hop mpls router and rest of the mpls domain should be configured accordingly to be able
+pop/swap/push labels and deliver packet to the proper destination based on an initial transport label injected by nfvbench, VPN label
+should stay unchanged until its delivered to PE (compute node).
+Set nfvbench 'mpls' parameter to 'true' to enable MPLS encapsulation.
+When this option is enabled internal networks 'network type' parameter value should be 'mpls'
+MPLS and VxLAN encapsulations are mutual exclusive features if 'mpls' is 'true' then 'vxlan' should be set to 'false' and vise versa.
+no_flow_stats, no_latency_stats, no_latency_streams parameters should be set to 'true' because these features are not supported at the moment.
+In future when these features will be supported they will require special NIC hardware.
+
+Example of 1-chain MPLS configuration:
+ internal_networks:
+ left:
+ network_type: mpls
+ segmentation_id: 5010
+ mpls_transport_labels: 16303
+ physical_network: phys_sriov0
+ right:
+ network_type: mpls
+ segmentation_id: 5011
+ mpls_transport_labels: 16303
+ physical_network: phys_sriov1
+
+Example of 2-chain MPLS configuration:
+ internal_networks:
+ left:
+ network_type: mpls
+ segmentation_id: [5010, 5020]
+ mpls_transport_labels: [16303, 16304]
+ physical_network: phys_sriov0
+ right:
+ network_type: mpls
+ segmentation_id: [5011, 5021]
+ mpls_transport_labels: [16303, 16304]
+ physical_network: phys_sriov1
+
+Example of how to run:
+nfvbench --rate 50000pps --duration 30 --mpls
diff --git a/docs/user/pvpl3.rst b/docs/user/pvpl3.rst
new file mode 100644
index 0000000..1b242ca
--- /dev/null
+++ b/docs/user/pvpl3.rst
@@ -0,0 +1,69 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International License.
+.. SPDX-License-Identifier: CC-BY-4.0
+.. (c) Cisco Systems, Inc
+
+
+PVP L3 Router Internal Chain
+----------------------------
+
+NFVbench can measure the performance of 1 L3 service chain that are setup by NFVbench (VMs, routers and networks).
+
+PVP L3 router chain is made of 1 VNF (in vpp mode) and has exactly 2 end network interfaces (left and right internal network interfaces) that are connected to 2 neutron routers with 2 edge networks (left and right edge networks).
+The PVP L3 router service chain can route L3 packets properly between the left and right networks.
+
+To run NFVbench on such PVP L3 router service chain:
+
+- explicitly tell NFVbench to use PVP service chain with L3 router option by adding ``-l3`` or ``--l3-router`` to NFVbench CLI options or ``l3_router: true`` in config
+- explicitly tell NFVbench to use VPP forwarder with ``vm_forwarder: vpp`` in config
+- specify the 2 end point networks (networks between NFVBench and neutron routers) of your environment in ``internal_networks`` inside the config file.
+ - The two networks specified will be created if not existing in Neutron and will be used as the end point networks by NFVbench ('lyon' and 'bordeaux' in the diagram below)
+- specify the 2 edge networks (networks between neutron routers and loopback VM) of your environment in ``edge_networks`` inside the config file.
+ - The two networks specified will be created if not existing in Neutron and will be used as the router gateway networks by NFVbench ('paris' and 'marseille' in the diagram below)
+- specify the router gateway IPs for the PVPL3 router service chain (1.2.0.1 and 2.2.0.1)
+- specify the traffic generator gateway IPs for the PVPL3 router service chain (1.2.0.254 and 2.2.0.254 in diagram below)
+- specify the packet source and destination IPs for the virtual devices that are simulated (10.0.0.0/8 and 20.0.0.0/8)
+
+
+.. image:: images/nfvbench-pvpl3.png
+
+nfvbench configuration file:
+
+.. code-block:: bash
+
+ vm_forwarder: vpp
+
+ traffic_generator:
+ ip_addrs: ['10.0.0.0/8', '20.0.0.0/8']
+ tg_gateway_ip_addrs: ['1.2.0.254', '2.2.0.254']
+ gateway_ip_addrs: ['1.2.0.1', '2.2.0.1']
+
+ internal_networks:
+ left:
+ name: 'lyon'
+ cidr: '1.2.0.0/24'
+ gateway: '1.2.0.1'
+ right:
+ name: 'bordeaux'
+ cidr: '2.2.0.0/24'
+ gateway: '2.2.0.1'
+
+ edge_networks:
+ left:
+ name: 'paris'
+ cidr: '1.1.0.0/24'
+ gateway: '1.1.0.1'
+ right:
+ name: 'marseille'
+ cidr: '2.1.0.0/24'
+ gateway: '2.1.0.1'
+
+Upon start, NFVbench will:
+- first retrieve the properties of the left and right networks using Neutron APIs,
+- extract the underlying network ID (typically VLAN segmentation ID),
+- generate packets with the proper VLAN ID and measure traffic.
+
+
+Please note: ``l3_router`` option is also compatible with external routers. In this case NFVBench will use ``EXT`` chain.
+
+.. note:: Using a long NFVbench run test, end-to-end connectivity can be lost depending on ARP stale time SUT configuration.
+ To avoid this issue, activate Gratuitous ARP stream using ``--gratuitous-arp`` or ``-garp`` option.
diff --git a/docs/user/quickstart_docker.rst b/docs/user/quickstart_docker.rst
new file mode 100644
index 0000000..ae277de
--- /dev/null
+++ b/docs/user/quickstart_docker.rst
@@ -0,0 +1,333 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International License.
+.. SPDX-License-Identifier: CC-BY-4.0
+.. (c) Cisco Systems, Inc
+
+===========================================
+NFVbench Installation and Quick Start Guide
+===========================================
+
+.. _docker_installation:
+
+Make sure you satisfy the `hardware and software requirements <requirements>` before you start .
+
+
+NFVbench can be used in CLI mode or in REST server mode.
+The CLI mode allows to run NFVbench benchmarks from the CLI. The REST server mode allows to run NFVbench benchmarks through a REST interface.
+
+1. Container installation
+-------------------------
+
+To pull the latest NFVbench container image:
+
+.. code-block:: bash
+
+ docker pull opnfv/nfvbench
+
+2. NFVbench configuration file
+------------------------------
+
+Create a directory under $HOME called nfvbench to store the minimal configuration file:
+
+.. code-block:: bash
+
+ mkdir $HOME/nfvbench
+
+Create a new file containing the minimal configuration for NFVbench, we can call it any name, for example "nfvbench.cfg" and paste the following yaml template in the file:
+
+.. code-block:: bash
+
+ openrc_file: /tmp/nfvbench/openrc
+ traffic_generator:
+ generator_profile:
+ - name: trex-local
+ tool: TRex
+ ip: 127.0.0.1
+ cores: 3
+ software_mode: false
+ interfaces:
+ - port: 0
+ pci: "0a:00.0"
+ - port: 1
+ pci: "0a:00.1"
+ intf_speed:
+
+If OpenStack is not used, the openrc_file property can be removed.
+
+If OpenStack is used, the openrc_file property must contain a valid container pathname of the OpenStack ``openrc`` file to connect to OpenStack using the OpenStack API.
+This file can be downloaded from the OpenStack Horizon dashboard (refer to the OpenStack documentation on how to
+retrieve the openrc file). This property must point to a valid pathname in the container (/tmp/nfvbench/openrc).
+We will map the host $HOME/nfvbench directory to the container /tmp/nfvbench directory and name the file "openrc".
+The file name viewed from the container will be "/tmp/nfvbench/openrc" (see container file pathname mapping in the next sections).
+
+The PCI address of the 2 physical interfaces that will be used by the traffic generator must be configured.
+The PCI address can be obtained for example by using the "lspci" Linux command. For example:
+
+.. code-block:: bash
+
+ [root@sjc04-pod6-build ~]# lspci | grep 710
+ 0a:00.0 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ (rev 01)
+ 0a:00.1 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ (rev 01)
+ 0a:00.2 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ (rev 01)
+ 0a:00.3 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ (rev 01)
+
+In the above example, the PCI addresses "0a:00.0" and "0a:00.1" (first 2 ports of the quad port NIC) are used.
+
+.. warning::
+
+ You have to put quotes around the pci addresses as shown in the above example, otherwise TRex will read it wrong.
+ The other fields in the minimal configuration must be present and must have the same values as above.
+
+
+3. Starting NFVbench in CLI mode
+--------------------------------
+
+In this mode, the NFVbench code will reside in a container running in the background. This container will not run anything in the background.
+An alias is then used to invoke a new NFVbench benchmark run using docker exec.
+The $HOME/nfvbench directory on the host is mapped on the /tmp/nfvbench in the container to facilitate file sharing between the 2 environments.
+
+Start NFVbench container
+~~~~~~~~~~~~~~~~~~~~~~~~
+The NFVbench container can be started using docker run command or using docker compose.
+
+To run NFVBench in CLI mode using docker run:
+
+.. code-block:: bash
+
+ docker run --name nfvbench --detach --privileged -v /lib/modules/$(uname -r):/lib/modules/$(uname -r) -v /usr/src/kernels:/usr/src/kernels -v /dev:/dev -v $HOME/nfvbench:/tmp/nfvbench opnfv/nfvbench
+
++-------------------------------------------------------+-------------------------------------------------------+
+| Docker options | Description |
++=======================================================+=======================================================+
+| --name nfvbench | container name is "nfvbench" |
++-------------------------------------------------------+-------------------------------------------------------+
+| --detach | run container in background |
++-------------------------------------------------------+-------------------------------------------------------+
+| --privileged | (optional) required if SELinux is enabled on the host |
++-------------------------------------------------------+-------------------------------------------------------+
+| -v /lib/modules:/lib/modules | needed by kernel modules in the container |
++-------------------------------------------------------+-------------------------------------------------------+
+| -v /usr/src/kernels:/usr/src/kernels | needed by TRex to build kernel modules when needed |
++-------------------------------------------------------+-------------------------------------------------------+
+| -v /dev:/dev | needed by kernel modules in the container |
++-------------------------------------------------------+-------------------------------------------------------+
+| -v $HOME/nfvbench:/tmp/nfvbench | folder mapping to pass files between the |
+| | host and the docker space (see examples below) |
+| | Here we map the $HOME/nfvbench directory on the host |
+| | to the /tmp/nfvbench director in the container. |
+| | Any other mapping can work as well |
++-------------------------------------------------------+-------------------------------------------------------+
+| opnfv/nfvbench | container image name |
++-------------------------------------------------------+-------------------------------------------------------+
+
+To run NFVbench using docker compose, create the docker-compose.yml file and paste the following content:
+
+.. code-block:: bash
+
+ version: '3'
+ services:
+ nfvbench:
+ image: "opnfv/nfvbench"
+ container_name: "nfvbench"
+ volumes:
+ - /dev:/dev
+ - /usr/src/kernels:/usr/src/kernels
+ - /lib/modules:/lib/modules
+ - ${HOME}/nfvbench:/tmp/nfvbench
+ network_mode: "host"
+ privileged: true
+
+Then start the container in detached mode:
+
+.. code-block:: bash
+
+ docker-compose up -d
+
+Requesting an NFVbench benchmark run
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Create an alias to make it easy to execute nfvbench commands directly from the host shell prompt:
+
+.. code-block:: bash
+
+ alias nfvbench='docker exec -it nfvbench nfvbench'
+
+The next to last "nfvbench" refers to the name of the container while the last "nfvbench" refers to the NFVbench binary that is available to run inside the container.
+
+Once the alias is set, NFVbench runs can simply be requested from teh command line using "nfvbench <options>".
+
+To verify it is working:
+
+.. code-block:: bash
+
+ nfvbench --version
+ nfvbench --help
+
+Example of run
+~~~~~~~~~~~~~~
+
+To do a single run at 10,000pps bi-directional (or 5kpps in each direction) using the PVP packet path:
+
+.. code-block:: bash
+
+ nfvbench -c /tmp/nfvbench/nfvbench.cfg --rate 10kpps
+
+NFVbench options used:
+
+* ``-c /tmp/nfvbench/nfvbench.cfg`` : specify the config file to use
+* ``--rate 10kpps`` : specify rate of packets for test for both directions using the kpps unit (thousands of packets per second)
+
+
+Retrieve complete configuration file as template
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The full configuration file template with comments (yaml format) can be obtained using the --show-default-config option in order to use more advanced configuration options:
+
+.. code-block:: bash
+
+ nfvbench --show-default-config > $HOME/nfvbench/full_nfvbench.cfg
+
+Edit the full_nfvbench.cfg file to only keep those properties that need to be modified (preserving the nesting).
+
+
+4. Start NFVbench in REST server mode
+-------------------------------------
+In this mode, the NFVbench REST server will run in the container.
+The $HOME/nfvbench directory on the host is mapped on the /tmp/nfvbench in the container to facilitate file sharing between the 2 environments.
+
+Start NFVbench container
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+To start the NFVbench container with REST server using docker run cli:
+
+.. code-block:: bash
+
+ docker run --name nfvbench --detach --privileged --net=host -e CONFIG_FILE="/tmp/nfvbench/nfvbench.cfg" -v /lib/modules/$(uname -r):/lib/modules/$(uname -r) -v /usr/src/kernels:/usr/src/kernels -v /dev:/dev -v $HOME/nfvbench:/tmp/nfvbench opnfv/nfvbench start_rest_server
+
+REST mode requires the same arguments as CLI mode and adds the following options:
++-------------------------------------------------------+-------------------------------------------------------+
+| Docker options | Description |
++=======================================================+=======================================================+
+| --net=host | use "host" docker networking mode |
+| | Other modes (such as NAT) could be used if required |
+| | with proper adjustment of the port to use for REST |
++-------------------------------------------------------+-------------------------------------------------------+
+| -e CONFIG_FILE="/tmp/nfvbench/nfvbench.cfg" | (optional) |
+| | specify the initial NFVbench config file to use. |
+| | defaults to none |
++-------------------------------------------------------+-------------------------------------------------------+
+| start_rest_server | to request a REST server to run in background in the |
+| | container |
++-------------------------------------------------------+-------------------------------------------------------+
+| -e HOST="127.0.0.1" | (optional) |
+| | specify the IP address to listen to. |
+| | defaults to 127.0.0.1 |
++-------------------------------------------------------+-------------------------------------------------------+
+| -e PORT=7555 | (optional) |
+| | specify the port address to listen to. |
+| | defaults to 7555 |
++-------------------------------------------------------+-------------------------------------------------------+
+
+
+The initial configuration file is optional but is handy to define mandatory deployment parameters that are common to all subsequent REST requests.
+If this initial configuration file is not passed at container start time, it must be included in every REST request.
+
+To start the NFVbench container with REST server using docker compose, use the following compose file:
+
+.. code-block:: bash
+
+ version: '3'
+ services:
+ nfvbench:
+ image: "opnfv/nfvbench"
+ container_name: "nfvbench_server"
+ command: start_rest_server
+ volumes:
+ - /dev:/dev
+ - /usr/src/kernels:/usr/src/kernels
+ - /lib/modules:/lib/modules
+ - ${HOME}/nfvbench:/tmp/nfvbench
+ network_mode: "host"
+ environment:
+ - HOST="127.0.0.1"
+ - PORT=7555
+ privileged: true
+
+Requesting an NFVbench benchmark run
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+To request a benchmark run, you must create a JSON document that describes the benchmark and send it to the NFVbench server in the body of a POST request.
+
+
+Examples of REST requests
+~~~~~~~~~~~~~~~~~~~~~~~~~
+In this example, we will use curl to interact with the NFVbench REST server.
+
+Query the NFVbench version:
+
+.. code-block:: bash
+
+ [root@sjc04-pod3-mgmt ~]# curl -G http://127.0.0.1:7555/version
+ 3.1.1
+
+This is the JSON for a fixed rate run at 10,000pps bi-directional (or 5kpps in each direction) using the PVP packet path:
+
+.. code-block:: bash
+
+ {"rate": "10kpps"}
+
+This is the curl request to send this benchmark request to the NFVbench server:
+
+.. code-block:: bash
+
+ [root@sjc04-pod3-mgmt ~]# curl -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"rate": "10kpps"}' http://127.0.0.1:7555/start_run
+ {
+ "error_message": "nfvbench run still pending",
+ "status": "PENDING"
+ }
+ [root@sjc04-pod3-mgmt ~]#
+
+This request will return immediately with status set to "PENDING" if the request was started successfully.
+
+The status can be polled until the run completes. Here the poll returns a "PENDING" status, indicating the run is still not completed:
+
+.. code-block:: bash
+
+ [root@sjc04-pod3-mgmt ~]# curl -G http://127.0.0.1:7555/status
+ {
+ "error_message": "nfvbench run still pending",
+ "status": "PENDING"
+ }
+ [root@sjc04-pod3-mgmt ~]#
+
+Finally, the status request returns a "OK" status along with the full results (truncated here):
+
+.. code-block:: bash
+
+ [root@sjc04-pod3-mgmt ~]# curl -G http://127.0.0.1:7555/status
+ {
+ "result": {
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "bidirectional": true,
+
+ ...
+
+ "status": "OK"
+ }
+ [root@sjc04-pod3-mgmt ~]#
+
+
+Retrieve complete configuration file as template
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+7. Terminating the NFVbench container
+-------------------------------------
+When no longer needed, the container can be terminated using the usual docker commands:
+
+.. code-block:: bash
+
+ docker kill nfvbench
+ docker rm nfvbench
diff --git a/docs/testing/user/userguide/readme.rst b/docs/user/readme.rst
index 785ffed..f6cc153 100644
--- a/docs/testing/user/userguide/readme.rst
+++ b/docs/user/readme.rst
@@ -2,8 +2,33 @@
.. SPDX-License-Identifier: CC-BY-4.0
.. (c) Cisco Systems, Inc
-Features
-********
+NFVbench: A Network Performance Benchmarking Tool for NFVi Full Stacks
+**********************************************************************
+
+The NFVbench tool provides an automated way to measure the network performance for the most common data plane packet flows
+on any NFVi system viewed as a black box (NFVi Full Stack).
+An NFVi full stack exposes the following interfaces:
+- an OpenStack API for those NFVi platforms based on OpenStack
+- an interface to send and receive packets on the data plane (typically through top of rack switches while simpler direct wiring to a looping device would also work)
+
+The NFVi full stack can be any functional OpenStack system that provides the above interfaces.
+NFVbench can also be used without OpenStack on any networking device that can handle L2 forwarding or L3 routing.
+
+NFVbench can be installed standalone (in the form of a single Docker container) and is fully functional without
+the need to install any other OPNFV tool.
+
+It is designed to be easy to install and easy to use by non experts (no need to be an expert in traffic generators and data plane
+performance benchmarking). NFVbench integrates with the open source traffic generator TRex and provides the following benefits when compared
+to using a traffic generator directly:
+
+- yaml configuration driven benchmark runs
+- CLI or REST front end
+- finds highest throughput based on drop rate requirement using an optimized binary search with very fast convergence time
+- supports multi-chaining or dense VNF throughput measurement (e.g. find the throughput of a compute node running 20 loopback VNFs)
+- detailed stats itemized per VNF chain in text or JSON format
+- takes care of configuring packet flows and streams (often hard to use and specific to each gtraffic generator)
+- takes care of bring up loopback VNFs/chains using Nova/Neutron/Glance OpenStack APIs
+- saves you the hassle of searching what to measure, how to measure and how to interpret resuls
Data Plane Performance Measurement Features
-------------------------------------------
@@ -18,21 +43,21 @@ NFVbench supports the following main measurement capabilities:
- built-in loopback VNFs based on fast L2 or L3 forwarders running in VMs
- configurable number of flows and service chains
- configurable traffic direction (single or bi-directional)
-
+- can support optional VLAN tagging (dot1q) or VxLAN overlays
NDR is the highest throughput achieved without dropping packets.
PDR is the highest throughput achieved without dropping more than a pre-set limit (called PDR threshold or allowance, expressed in %).
Results of each run include the following data:
-- Aggregated achieved throughput in bps
+- Aggregated achieved bit rate throughput in bps
- Aggregated achieved packet rate in pps (or fps)
- Actual drop rate in %
- Latency in usec (min, max, average in the current version)
-Built-in OpenStack support
---------------------------
-NFVbench can stage OpenStack resources to build 1 or more service chains using direct OpenStack APIs. Each service chain is composed of:
+Built-in OpenStack support (optional)
+-------------------------------------
+NFVbench can optionally stage OpenStack resources to build 1 or more service chains using direct OpenStack APIs. Each service chain is composed of:
- 1 or 2 loopback VM instances per service chain
- 2 Neutron networks per loopback VM
@@ -46,18 +71,35 @@ main purpose is to measure the performance of the NFVi infrastructure which is m
External Chains
---------------
-NFVbench also supports settings that involve externally staged packet paths with or without OpenStack:
+NFVbench supports settings that involve externally staged packet paths with or without OpenStack:
- run benchmarks on existing service chains at the L3 level that are staged externally by any other tool (e.g. any VNF capable of L3 routing)
- run benchmarks on existing L2 chains that are configured externally (e.g. pure L2 forwarder such as DPDK testpmd)
+Direct L2 Loopback (Switch or wire loopback)
+--------------------------------------------
+NFVbench supports benchmarking of pure L2 loopbacks
+
+- Switch level loopback
+- Port to port wire loopback
+
+In this mode, NFVbench will send packets from each port to the other port
+(the destination MAC address is set to the other port MAC address).
+This can be useful for example to verify that the connectivity to the switch is working properly.
+
+Such a test can be quickly run using the CLI ``--l2-loopback`` :ref:`option <adv-l2l-cli>`.
+
+For a typical test, packets will be VLAN tagged with the same ID on both ports.
+However, multiple L2 vlan tagged service chains are also allowed,
+which permits testing various configurations and the behavior of the bench itself.
+
Traffic Generation
------------------
NFVbench currently integrates with the open source TRex traffic generator:
-- `TRex <https://trex-tgn.cisco.com>`_ (pre-built into the NFVbench container)
+- `TRex <https://github.com/cisco-system-traffic-generator/trex-core>`_ (pre-built into the NFVbench container)
Supported Packet Paths
@@ -90,6 +132,16 @@ In the case of VPP, VPP will act as a real L3 router, and the packets are routed
Which forwarder and what Nova flavor to use can be selected in the NFVbench configuration. Be default the DPDK testpmd forwarder is used with 2 vCPU per VM.
The configuration of these forwarders (such as MAC rewrite configuration or static route configuration) is managed by NFVbench.
+Importance of Dense VNF Measurement
+-----------------------------------
+Production deployments of NFVi stacks can require to run a large number of VMs per compute node in order to fully utilize all the
+hardware resources available in each of these compute nodes.
+Given that optimization of a compute node can be very different based on the number of VMs, it is therefore critical
+to do performance benchmarking at scale.
+NFVbench has been the first benchmarking tool to recognize this and to provide dense VNF dataplane benchmarking
+by staging multipe chains using OpenStack and configuring the traffic generator to split the traffic
+across all configured chains. This kind of measurement is very time consuming to do directly with traffic generators
+as it requires understanding how traffic is shaped in order to cover all chains in a balanced way.
PVP Packet Path
^^^^^^^^^^^^^^^
@@ -103,20 +155,17 @@ PVVP Packet Path
^^^^^^^^^^^^^^^^
This packet path represents a single service chain with 2 loopback VNFs in sequence and 3 Neutron networks.
-The 2 VNFs can run on the same compute node (PVVP intra-node):
+The 2 VNFs will only run on the same compute node (PVVP intra-node):
.. image:: images/nfvbench-pvvp.png
-or on different compute nodes (PVVP inter-node) based on a configuration option:
-
-.. image:: images/nfvbench-pvvp2.png
-
-Multi-Chaining (N*PVP or N*PVVP)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+Dense VNF or Multi-Chaining (N*PVP or N*PVVP)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Multiple service chains can be setup by NFVbench without any limit on the concurrency (other than limits imposed by available resources on compute nodes).
-In the case of multiple service chains, NFVbench will instruct the traffic generator to use multiple L3 packet streams (frames directed to each path will have a unique destination MAC address).
+In the case of multiple service chains, NFVbench will instruct the traffic generator to use multiple L3 packet streams (frames directed to each path will
+have a unique destination MAC address).
Example of multi-chaining with 2 concurrent PVP service chains:
@@ -124,8 +173,11 @@ Example of multi-chaining with 2 concurrent PVP service chains:
This innovative feature will allow to measure easily the performance of a fully loaded compute node running multiple service chains.
-Multi-chaining is currently limited to 1 compute node (PVP or PVVP intra-node) or 2 compute nodes (for PVVP inter-node).
-The 2 edge interfaces for all service chains will share the same 2 networks.
+Multi-chaining is currently limited to 1 compute node (VMs run on the same compute node).
+The 2 edge interfaces for all service chains can either share the same 2 networks or can use
+dedicated networks (based on a configuration option).
+The total traffic will be split equally across all chains.
+
SR-IOV
^^^^^^
@@ -142,20 +194,12 @@ The PVVP packet path will use SR-IOV for the left and right networks and the vir
.. image:: images/nfvbench-sriov-pvvp.png
-Or in the case of inter-node:
-
-.. image:: images/nfvbench-sriov-pvvp2.png
-
This packet path is a good way to approximate VM to VM (V2V) performance (middle network) given the high efficiency of the left and right networks. The V2V throughput will likely be very close to the PVVP throughput while its latency will be very close to the difference between the SR-IOV PVVP latency and the SR-IOV PVP latency.
It is possible to also force the middle network to use SR-IOV (in this version, the middle network is limited to use the same SR-IOV phys net):
.. image:: images/nfvbench-all-sriov-pvvp.png
-The chain can also span across 2 nodes with the use of 2 SR-IOV ports in each node:
-
-.. image:: images/nfvbench-all-sriov-pvvp2.png
-
Other Misc Packet Paths
^^^^^^^^^^^^^^^^^^^^^^^
@@ -164,6 +208,8 @@ P2P (Physical interface to Physical interface - no VM) can be supported using th
V2V (VM to VM) is not supported but PVVP provides a more complete (and more realistic) alternative.
+PVP chain with L3 routers in the path can be supported using PVP chain with L3 forwarding mode (l3_router option). See PVP L3 Router Internal Chain section for more details.
+
Supported Neutron Network Plugins and vswitches
-----------------------------------------------
@@ -178,8 +224,7 @@ NFVbench is agnostic of the virtual switch implementation and has been tested wi
- ML2/ODL/VPP (OPNFV Fast Data Stack)
-
-
-
-
-
+Limitations
+***********
+VxLAN: latency measurement is not available in the current VxLAN release
+PVVP Inter-node (where the 2 VMs are running on diofferent compute nodes) is no longer supported
diff --git a/docs/testing/user/userguide/server.rst b/docs/user/server.rst
index 70c5fdd..52645ad 100644
--- a/docs/testing/user/userguide/server.rst
+++ b/docs/user/server.rst
@@ -5,36 +5,6 @@
NFVbench Server mode and NFVbench client API
============================================
-NFVbench can run as an HTTP server to:
-
-- optionally provide access to any arbitrary HTLM files (HTTP server function) - this is optional
-- service fully parameterized aynchronous run requests using the HTTP protocol (REST/json with polling)
-- service fully parameterized run requests with interval stats reporting using the WebSocket/SocketIO protocol.
-
-Start the NFVbench server
--------------------------
-To run in server mode, simply use the --server <http_root_path> and optionally the listen address to use (--host <ip>, default is 0.0.0.0) and listening port to use (--port <port>, default is 7555).
-
-
-If HTTP files are to be serviced, they must be stored right under the http root path.
-This root path must contain a static folder to hold static files (css, js) and a templates folder with at least an index.html file to hold the template of the index.html file to be used.
-This mode is convenient when you do not already have a WEB server hosting the UI front end.
-If HTTP files servicing is not needed (REST only or WebSocket/SocketIO mode), the root path can point to any dummy folder.
-
-Once started, the NFVbench server will be ready to service HTTP or WebSocket/SocketIO requests at the advertised URL.
-
-Example of NFVbench server start in a container:
-
-.. code-block:: bash
-
- # get to the container shell (assume the container name is "nfvbench")
- docker exec -it nfvbench bash
- # from the container shell start the NFVbench server in the background
- nfvbench -c /tmp/nfvbench/nfvbench.cfg --server /tmp &
- # exit container
- exit
-
-
HTTP Interface
--------------
@@ -44,11 +14,11 @@ HTTP Interface
This request simply returns whatever content is sent in the body of the request (body should be in json format, only used for testing)
-Example request:
+Example request:
.. code-block:: bash
- curl -XGET '127.0.0.1:7556/echo' -H "Content-Type: application/json" -d '{"nfvbench": "test"}'
+ curl -XGET '127.0.0.1:7555/echo' -H "Content-Type: application/json" -d '{"nfvbench": "test"}'
Response:
{
"nfvbench": "test"
@@ -114,44 +84,6 @@ If there is already an NFVBench running then it will return:
"status": "ERROR"
}
-WebSocket/SocketIO events
--------------------------
-
-List of SocketIO events supported:
-
-Client to Server
-^^^^^^^^^^^^^^^^
-
-start_run:
-
- sent by client to start a new run with the configuration passed in argument (JSON).
- The configuration can be any valid NFVbench configuration passed as a JSON document (see "NFVbench configuration JSON parameter" below)
-
-Server to Client
-^^^^^^^^^^^^^^^^
-
-run_interval_stats:
-
- sent by server to report statistics during a run
- the message contains the statistics {'time_ms': time_ms, 'tx_pps': tx_pps, 'rx_pps': rx_pps, 'drop_pct': drop_pct}
-
-ndr_found:
-
- (during NDR-PDR search)
- sent by server when the NDR rate is found
- the message contains the NDR value {'rate_pps': ndr_pps}
-
-ndr_found:
-
- (during NDR-PDR search)
- sent by server when the PDR rate is found
- the message contains the PDR value {'rate_pps': pdr_pps}
-
-
-run_end:
-
- sent by server to report the end of a run
- the message contains the complete results in JSON format
NFVbench configuration JSON parameter
-------------------------------------
@@ -219,30 +151,13 @@ The entire default configuration can be viewed using the --show-json-config opti
},
"name": "(built-in default config)",
"no_cleanup": false,
- "no_int_config": false,
- "no_reset": false,
- "no_tor_access": false,
"no_traffic": false,
- "no_vswitch_access": false,
"openrc_file": "/tmp/nfvbench/openstack/openrc",
- "openstack_defaults": "/tmp/nfvbench/openstack/defaults.yaml",
- "openstack_setup": "/tmp/nfvbench/openstack/setup_data.yaml",
"rate": "ndr_pdr",
"service_chain": "PVP",
"service_chain_count": 1,
"sriov": false,
"std_json": null,
- "tor": {
- "switches": [
- {
- "host": "172.26.233.12",
- "password": "lab",
- "port": 22,
- "username": "admin"
- }
- ],
- "type": "N9K"
- },
"traffic": {
"bidirectional": true,
"profile": "traffic_profile_64B"
@@ -271,7 +186,7 @@ The entire default configuration can be viewed using the --show-json-config opti
"vlan": null
}
],
- "intf_speed": "10Gbps",
+ "intf_speed": null,
"ip": "127.0.0.1",
"name": "trex-local",
"tool": "TRex"
@@ -324,12 +239,6 @@ The entire default configuration can be viewed using the --show-json-config opti
],
"unidir_reverse_traffic_pps": 1,
"vlan_tagging": true,
- "vts_ncs": {
- "host": null,
- "password": "secret",
- "port": 22,
- "username": "admin"
- }
}
@@ -364,6 +273,15 @@ A short run of 5 seconds at a fixed rate of 1Mpps (and everything else same as t
"rate": "1Mpps"
}
+Use the default configuration but force TRex restart:
+
+.. code-block:: bash
+
+ {
+ "restart": true
+ }
+
+
Example of interaction with the NFVbench server using HTTP and curl
-------------------------------------------------------------------
HTTP requests can be sent directly to the NFVbench server from CLI using curl from any host that can connect to the server (here we run it from the local host).
@@ -429,7 +347,7 @@ Finally, the status request returns a "OK" status along with the full results (t
Example of interaction with the NFVbench server using a python CLI app (nfvbench_client)
----------------------------------------------------------------------------------------
-The module client/client.py contains an example of python class that can be used to control the NFVbench server from a python app using HTTP or WebSocket/SocketIO.
+The module client/client.py contains an example of python class that can be used to control the NFVbench server from a python app using HTTP.
The module client/nfvbench_client.py has a simple main application to control the NFVbench server from CLI.
The "nfvbench_client" wrapper script can be used to invoke the client front end (this wrapper is pre-installed in the NFVbench container)
@@ -445,23 +363,9 @@ use the default NFVbench configuration but do not generate traffic (no_traffic p
{u'status': u'PENDING', u'error_message': u'nfvbench run still pending'}
{u'status': u'OK', u'result': {u'date': u'2017-03-31 22:04:59', u'nfvbench_version': u'0.3.5',
- u'config': {u'compute_nodes': None, u'compute_node_user': u'root', u'vts_ncs': {u'username': u'admin', u'host': None, u'password': u'secret', u'port': 22}, u'traffic_generator': {u'tg_gateway_ip_addrs': [u'1.1.0.100', u'2.2.0.100'], u'ip_addrs_step': u'0.0.0.1', u'step_mac': None, u'generator_profile': [{u'intf_speed': u'10Gbps', u'interfaces': [{u'pci': u'0a:00.0', u'port': 0, u'vlan': 1998, u'switch_port': None},
+ u'config': {u'compute_nodes': None, u'compute_node_user': u'root', u'traffic_generator': {u'tg_gateway_ip_addrs': [u'1.1.0.100', u'2.2.0.100'], u'ip_addrs_step': u'0.0.0.1',
+ u'step_mac': None, u'generator_profile': [{u'intf_speed': u'', u'interfaces': [{u'pci': u'0a:00.0', u'port': 0, u'vlan': 1998, u'switch_port': None},
...
[root@sjc04-pod3-mgmt ~]#
-
-The http interface is used unless --use-socketio is defined.
-
-Example of invocation using Websocket/SocketIO, execute NFVbench using the default configuration but with a duration of 5 seconds and a fixed rate run of 5kpps.
-
-.. code-block:: bash
-
- [root@sjc04-pod3-mgmt ~]# docker exec -it nfvbench nfvbench_client -c '{"duration":5,"rate":"5kpps"}' --use-socketio http://127.0.0.1:7555 >results.json
-
-
-
-
-
-
-
diff --git a/docs/user/sriov.rst b/docs/user/sriov.rst
new file mode 100644
index 0000000..f5cc7d2
--- /dev/null
+++ b/docs/user/sriov.rst
@@ -0,0 +1,462 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International License.
+.. SPDX-License-Identifier: CC-BY-4.0
+.. (c) Cisco Systems, Inc
+
+
+Testing SR-IOV
+==============
+
+NFVbench supports SR-IOV with the PVP and PVVP packet flow. Most use cases for SR-IOV only require single VNF chains (NxPVP).
+Daisy chaining VNFs with SR-IOV (PVVP) requires selecting either SR-IOV for the middle network or a fast vswitch (using the
+standard OVS for that purpose works but would be a serious bottleneck)
+
+Instructions below refer to the PVP or PVVP use cases.
+For external chains using SR-IOV, select the VLAN tagging option that corresponds to the external chains SR-IOV setting.
+
+Pre-requisites
+--------------
+To test SR-IOV you need to have compute nodes configured to support one or more SR-IOV interfaces (also knows as PF or physical function)
+and you need OpenStack to be configured to support SR-IOV.
+You will also need to know:
+- the name of the physical networks associated to the SR-IOV interfaces (this is a configuration in Nova compute)
+- the VLAN range that can be used on the switch ports that are wired to the SR-IOV ports. Such switch ports are normally configured in trunk mode with a range of VLAN ids enabled on that port
+
+For example, in the case of 2 SR-IOV ports per compute node, 2 physical networks are generally configured in OpenStack with a distinct name.
+The VLAN range to use is is also allocated and reserved by the network administrator and in coordination with the corresponding top of rack switch port configuration.
+
+
+Configuration
+-------------
+To enable SR-IOV test, you will need to provide the following configuration options to NFVbench (in the configuration file).
+This example instructs NFVbench to create the left and right networks of a PVP packet flow to run on 2 SRIOV ports named "phys_sriov0" and "phys_sriov1" using resp. segmentation_id 2000 and 2001:
+
+.. code-block:: bash
+
+ sriov: true
+ internal_networks:
+ left:
+ segmentation_id: 2000
+ physical_network: phys_sriov0
+ right:
+ segmentation_id: 2001
+ physical_network: phys_sriov1
+
+The segmentation ID fields must be different.
+In the case of PVVP, the middle network also needs to be provisioned properly.
+The same physical network can also be shared by the virtual networks but with different segmentation IDs.
+
+Multi-Chaining
+--------------
+The above configuration works for multi-chaining and shared network ("service_chain_shared_net" set to true).
+In that case all VNFs will share the same left and right network/VLAN.
+
+In the case of non shared network ("service_chain_shared_net" set to false), the segmentation_id fields must
+contain a list of distinct VLANs to use for each chain. Example of configuration for 3 chains:
+
+.. code-block:: bash
+
+ sriov: true
+ internal_networks:
+ left:
+ segmentation_id: [2000, 2001, 2002]
+ physical_network: phys_sriov0
+ right:
+ segmentation_id: [2100, 2101, 2102]
+ physical_network: phys_sriov1
+
+Alternatively it is also possible to specify different physnets per chain:
+
+.. code-block:: bash
+
+ sriov: true
+ internal_networks:
+ left:
+ segmentation_id: [2000, 2001, 2002]
+ physical_network: [phys_sriov0, phys_sriov2, phys_sriov4]
+ right:
+ segmentation_id: [2100, 2101, 2102]
+ physical_network: [phys_sriov1, phys_srviov3, phys_sriov5]
+
+
+NFVbench cores with SR-IOV
+--------------------------
+The default core count for NFVbench/TRex may not be sufficient for higher throughput line cards (greater than 10Gbps).
+This will result in warning messages such as:
+
+.. code-block:: bash
+
+ INFO WARNING: There is a significant difference between requested TX rate (119047618) and actual TX rate (38897379).
+ The traffic generator may not have sufficient CPU to achieve the requested TX rate.
+
+In that case it is recommended to try allocating more cores to TRex using the cores property in the configuration
+file, for example to set to 8 cores:
+
+.. code-block:: bash
+
+ cores: 8
+
+It is also advisable to increase the number of vcpus in the VMs:
+
+
+VM Flavor for SR-IOV and NIC NUMA socket placement
+--------------------------------------------------
+
+Because SR-IOV throughput uses a lot of CPU in the VM, it is recommended to increase the
+vcpu count, for example to 4 vcpus:
+
+.. code-block:: bash
+
+ flavor:
+ # Number of vCPUs for the flavor
+ vcpus: 4
+ # Memory for the flavor in MB
+ ram: 8192
+ # Size of local disk in GB
+ disk: 0
+ extra_specs:
+ "hw:cpu_policy": dedicated
+
+If the 2 selected ports reside on NICs that are on different NUMA sockets, you will need to explicitly tell Nova to use 2 numa nodes in the flavor used for the VMs in order to satisfy the filters, for example:
+
+.. code-block:: bash
+
+ flavor:
+ # Number of vCPUs for the flavor
+ vcpus: 4
+ # Memory for the flavor in MB
+ ram: 8192
+ # Size of local disk in GB
+ disk: 0
+ extra_specs:
+ "hw:cpu_policy": dedicated
+ "hw:numa_nodes": 2
+
+Failure to do so might cause the VM creation to fail with the Nova error
+"Instance creation error: Insufficient compute resources:
+Requested instance NUMA topology together with requested PCI devices cannot fit the given host NUMA topology."
+
+Example of configuration file (shared network)
+----------------------------------------------
+
+Single chain or multi-chain with shared network (only requires 2 segmentation ID for all chains):
+
+.. code-block:: bash
+
+ flavor:
+ # Number of vCPUs for the flavor
+ vcpus: 4
+ # Memory for the flavor in MB
+ ram: 8192
+ # Size of local disk in GB
+ disk: 0
+ extra_specs:
+ "hw:cpu_policy": dedicated
+ cores: 8
+ sriov: true
+ internal_networks:
+ left:
+ segmentation_id: 3830
+ physical_network: phys_sriov0
+ right:
+ segmentation_id: 3831
+ physical_network: phys_sriov1
+
+Example of full run 2xPVP shared network SR-IOV:
+
+.. code-block:: bash
+
+ 2018-12-03 18:24:07,419 INFO Loading configuration file: /tmp/nfvbench/sriov.yaml
+ 2018-12-03 18:24:07,423 INFO -c /tmp/nfvbench/sriov.yaml --rate 10Mpps --duration 1 -scc 2 --no-cleanup
+ 2018-12-03 18:24:07,426 INFO Connecting to TRex (127.0.0.1)...
+ 2018-12-03 18:24:07,575 INFO Connected to TRex
+ 2018-12-03 18:24:07,575 INFO Port 0: Ethernet Controller XL710 for 40GbE QSFP+ speed=40Gbps mac=3c:fd:fe:b5:3d:70 pci=0000:5e:00.0 driver=net_i40e
+ 2018-12-03 18:24:07,575 INFO Port 1: Ethernet Controller XL710 for 40GbE QSFP+ speed=40Gbps mac=3c:fd:fe:b5:3d:71 pci=0000:5e:00.1 driver=net_i40e
+ 2018-12-03 18:24:07,626 INFO Found built-in VM image file nfvbenchvm-0.6.qcow2
+ 2018-12-03 18:24:09,072 INFO Created flavor 'nfvbench.medium'
+ 2018-12-03 18:24:10,004 INFO Created network: nfvbench-lnet.
+ 2018-12-03 18:24:10,837 INFO Created network: nfvbench-rnet.
+ 2018-12-03 18:24:12,065 INFO Security disabled on port nfvbench-loop-vm0-0
+ 2018-12-03 18:24:13,425 INFO Security disabled on port nfvbench-loop-vm0-1
+ 2018-12-03 18:24:13,425 INFO Creating instance nfvbench-loop-vm0 with AZ
+ 2018-12-03 18:24:16,052 INFO Created instance nfvbench-loop-vm0 - waiting for placement resolution...
+ 2018-12-03 18:24:16,240 INFO Waiting for instance nfvbench-loop-vm0 to become active (retry 1/101)...
+ <snip>
+ 2018-12-03 18:24:59,266 INFO Waiting for instance nfvbench-loop-vm0 to become active (retry 21/101)...
+ 2018-12-03 18:25:01,427 INFO Instance nfvbench-loop-vm0 is active and has been placed on nova:charter-compute-5
+ 2018-12-03 18:25:02,819 INFO Security disabled on port nfvbench-loop-vm1-0
+ 2018-12-03 18:25:04,198 INFO Security disabled on port nfvbench-loop-vm1-1
+ 2018-12-03 18:25:04,199 INFO Creating instance nfvbench-loop-vm1 with AZ nova:charter-compute-5
+ 2018-12-03 18:25:05,032 INFO Created instance nfvbench-loop-vm1 on nova:charter-compute-5
+ 2018-12-03 18:25:05,033 INFO Instance nfvbench-loop-vm0 is ACTIVE on nova:charter-compute-5
+ 2018-12-03 18:25:05,212 INFO Waiting for 1/2 instance to become active (retry 1/100)...
+ <snip>
+ 2018-12-03 18:25:48,531 INFO Waiting for 1/2 instance to become active (retry 21/100)...
+ 2018-12-03 18:25:50,677 INFO Instance nfvbench-loop-vm1 is ACTIVE on nova:charter-compute-5
+ 2018-12-03 18:25:50,677 INFO All instances are active
+ 2018-12-03 18:25:50,677 INFO Port 0: VLANs [3830, 3830]
+ 2018-12-03 18:25:50,677 INFO Port 1: VLANs [3831, 3831]
+ 2018-12-03 18:25:50,677 INFO Port 0: dst MAC ['fa:16:3e:de:4e:54', 'fa:16:3e:7a:26:2b']
+ 2018-12-03 18:25:50,677 INFO Port 1: dst MAC ['fa:16:3e:6c:bb:cd', 'fa:16:3e:e0:48:45']
+ 2018-12-03 18:25:50,678 INFO ChainRunner initialized
+ 2018-12-03 18:25:50,678 INFO Starting 2xPVP benchmark...
+ 2018-12-03 18:25:50,683 INFO Starting traffic generator to ensure end-to-end connectivity
+ 2018-12-03 18:25:50,698 INFO Created 2 traffic streams for port 0.
+ 2018-12-03 18:25:50,700 INFO Created 2 traffic streams for port 1.
+ 2018-12-03 18:25:50,821 INFO Captured unique src mac 0/4, capturing return packets (retry 1/100)...
+ 2018-12-03 18:25:52,944 INFO Received packet from mac: fa:16:3e:de:4e:54 (chain=0, port=0)
+ 2018-12-03 18:25:52,945 INFO Received packet from mac: fa:16:3e:6c:bb:cd (chain=0, port=1)
+ 2018-12-03 18:25:53,077 INFO Captured unique src mac 2/4, capturing return packets (retry 2/100)...
+ <snip>
+ 2018-12-03 18:26:10,798 INFO End-to-end connectivity established
+ 2018-12-03 18:26:10,816 INFO Cleared all existing streams
+ 2018-12-03 18:26:10,846 INFO Created 4 traffic streams for port 0.
+ 2018-12-03 18:26:10,849 INFO Created 4 traffic streams for port 1.
+ 2018-12-03 18:26:10,849 INFO Starting to generate traffic...
+ 2018-12-03 18:26:10,850 INFO Running traffic generator
+ 2018-12-03 18:26:11,877 INFO TX: 10000004; RX: 9999999; Est. Dropped: 5; Est. Drop rate: 0.0000%
+ 2018-12-03 18:26:11,877 INFO ...traffic generating ended.
+ 2018-12-03 18:26:11,882 INFO Service chain 'PVP' run completed.
+ 2018-12-03 18:26:11,936 INFO Clean up skipped.
+ 2018-12-03 18:26:11,969 INFO
+ ========== NFVBench Summary ==========
+ Date: 2018-12-03 18:25:50
+ NFVBench version 3.0.3.dev1
+ Openstack Neutron:
+ vSwitch: OPENVSWITCH
+ Encapsulation: VLAN
+ Benchmarks:
+ > Networks:
+ > Components:
+ > Traffic Generator:
+ Profile: trex-local
+ Tool: TRex
+ > Versions:
+ > Traffic_Generator:
+ build_date: Nov 13 2017
+ version: v2.32
+ built_by: hhaim
+ mode: STL
+ build_time: 10:58:17
+ > CiscoVIM: 2.9.7-17036
+ > Service chain:
+ > PVP:
+ > Traffic:
+ Profile: traffic_profile_64B
+ Bidirectional: True
+ Flow count: 10000
+ Service chains count: 2
+ Compute nodes: [u'nova:charter-compute-5']
+
+ Run Summary:
+
+ +-----------------+-------------+----------------------+----------------------+----------------------+
+ | L2 Frame Size | Drop Rate | Avg Latency (usec) | Min Latency (usec) | Max Latency (usec) |
+ +=================+=============+======================+======================+======================+
+ | 64 | 0.0000% | 13 | 10 | 141 |
+ +-----------------+-------------+----------------------+----------------------+----------------------+
+
+
+ L2 frame size: 64
+
+ Run Config:
+
+ +-------------+---------------------------+------------------------+-----------------+---------------------------+------------------------+-----------------+
+ | Direction | Requested TX Rate (bps) | Actual TX Rate (bps) | RX Rate (bps) | Requested TX Rate (pps) | Actual TX Rate (pps) | RX Rate (pps) |
+ +=============+===========================+========================+=================+===========================+========================+=================+
+ | Forward | 336.0000 Mbps | 336.0000 Mbps | 336.0000 Mbps | 500,000 pps | 500,000 pps | 500,000 pps |
+ +-------------+---------------------------+------------------------+-----------------+---------------------------+------------------------+-----------------+
+ | Reverse | 336.0000 Mbps | 336.0000 Mbps | 336.0000 Mbps | 500,000 pps | 500,000 pps | 500,000 pps |
+ +-------------+---------------------------+------------------------+-----------------+---------------------------+------------------------+-----------------+
+ | Total | 672.0000 Mbps | 672.0000 Mbps | 672.0000 Mbps | 1,000,000 pps | 1,000,000 pps | 1,000,000 pps |
+ +-------------+---------------------------+------------------------+-----------------+---------------------------+------------------------+-----------------+
+
+ Forward Chain Packet Counters and Latency:
+
+ +---------+--------------+--------------+------------+------------+------------+
+ | Chain | TRex.TX.p0 | TRex.RX.p1 | Avg lat. | Min lat. | Max lat. |
+ +=========+==============+==============+============+============+============+
+ | 0 | 250,000 | 250,000 | 17 usec | 10 usec | 138 usec |
+ +---------+--------------+--------------+------------+------------+------------+
+ | 1 | 250,000 | 250,000 | 17 usec | 10 usec | 139 usec |
+ +---------+--------------+--------------+------------+------------+------------+
+ | total | 500,000 | 500,000 | 17 usec | 10 usec | 139 usec |
+ +---------+--------------+--------------+------------+------------+------------+
+
+ Reverse Chain Packet Counters and Latency:
+
+ +---------+--------------+--------------+------------+------------+------------+
+ | Chain | TRex.TX.p1 | TRex.RX.p0 | Avg lat. | Min lat. | Max lat. |
+ +=========+==============+==============+============+============+============+
+ | 0 | 250,000 | 250,000 | 12 usec | 10 usec | 141 usec |
+ +---------+--------------+--------------+------------+------------+------------+
+ | 1 | 250,000 | 250,000 | 11 usec | 10 usec | 132 usec |
+ +---------+--------------+--------------+------------+------------+------------+
+ | total | 500,000 | 500,000 | 12 usec | 10 usec | 141 usec |
+ +---------+--------------+--------------+------------+------------+------------+
+
+Example of configuration file (non shared network)
+--------------------------------------------------
+
+Multi-chain with non shared network (requires 2 segmentation ID per chain), example with 2 chains
+sharing the same 2 SRIOV ports (or PF):
+
+.. code-block:: bash
+
+ flavor:
+ # Number of vCPUs for the flavor
+ vcpus: 4
+ # Memory for the flavor in MB
+ ram: 8192
+ # Size of local disk in GB
+ disk: 0
+ extra_specs:
+ "hw:cpu_policy": dedicated
+ cores: 8
+ sriov: true
+ internal_networks:
+ left:
+ segmentation_id: [3830, 3831]
+ physical_network: phys_sriov0
+ right:
+ segmentation_id: [3832, 3833]
+ physical_network: phys_sriov1
+
+Example of full run 2xPVP non-shared network SR-IOV:
+
+.. code-block:: bash
+
+ 2018-12-04 17:15:25,284 INFO -c /tmp/nfvbench/sriov.yaml --rate 1Mpps --duration 1 -scc 2 --no-cleanup
+ 2018-12-04 17:15:25,287 INFO Connecting to TRex (127.0.0.1)...
+ 2018-12-04 17:15:25,463 INFO Connected to TRex
+ 2018-12-04 17:15:25,464 INFO Port 0: Ethernet Controller XL710 for 40GbE QSFP+ speed=40Gbps mac=3c:fd:fe:b5:3d:70 pci=0000:5e:00.0 driver=net_i40e
+ 2018-12-04 17:15:25,464 INFO Port 1: Ethernet Controller XL710 for 40GbE QSFP+ speed=40Gbps mac=3c:fd:fe:b5:3d:71 pci=0000:5e:00.1 driver=net_i40e
+ 2018-12-04 17:15:25,515 INFO Found built-in VM image file nfvbenchvm-0.6.qcow2
+ 2018-12-04 17:15:26,457 INFO Created flavor 'nfvbench.medium'
+ 2018-12-04 17:15:27,449 INFO Created network: nfvbench-lnet0.
+ 2018-12-04 17:15:28,368 INFO Created network: nfvbench-rnet0.
+ 2018-12-04 17:15:29,143 INFO Created port nfvbench-loop-vm0-0
+ 2018-12-04 17:15:29,626 INFO Security disabled on port nfvbench-loop-vm0-0
+ 2018-12-04 17:15:30,636 INFO Created port nfvbench-loop-vm0-1
+ 2018-12-04 17:15:31,139 INFO Security disabled on port nfvbench-loop-vm0-1
+ 2018-12-04 17:15:31,140 INFO Creating instance nfvbench-loop-vm0 with AZ
+ 2018-12-04 17:15:34,893 INFO Created instance nfvbench-loop-vm0 - waiting for placement resolution...
+ 2018-12-04 17:15:35,068 INFO Waiting for instance nfvbench-loop-vm0 to become active (retry 1/101)...
+ <snip>
+ 2018-12-04 17:16:22,253 INFO Instance nfvbench-loop-vm0 is active and has been placed on nova:charter-compute-4
+ 2018-12-04 17:16:23,154 INFO Created network: nfvbench-lnet1.
+ 2018-12-04 17:16:23,863 INFO Created network: nfvbench-rnet1.
+ 2018-12-04 17:16:24,799 INFO Created port nfvbench-loop-vm1-0
+ 2018-12-04 17:16:25,267 INFO Security disabled on port nfvbench-loop-vm1-0
+ 2018-12-04 17:16:26,006 INFO Created port nfvbench-loop-vm1-1
+ 2018-12-04 17:16:26,612 INFO Security disabled on port nfvbench-loop-vm1-1
+ 2018-12-04 17:16:26,612 INFO Creating instance nfvbench-loop-vm1 with AZ nova:charter-compute-4
+ 2018-12-04 17:16:27,610 INFO Created instance nfvbench-loop-vm1 on nova:charter-compute-4
+ 2018-12-04 17:16:27,610 INFO Instance nfvbench-loop-vm0 is ACTIVE on nova:charter-compute-4
+ 2018-12-04 17:16:27,788 INFO Waiting for 1/2 instance to become active (retry 1/100)...
+ <snip>
+
+ 2018-12-04 17:17:04,258 INFO Instance nfvbench-loop-vm1 is ACTIVE on nova:charter-compute-4
+ 2018-12-04 17:17:04,258 INFO All instances are active
+ 2018-12-04 17:17:04,259 INFO Port 0: VLANs [3830, 3831]
+ 2018-12-04 17:17:04,259 INFO Port 1: VLANs [3832, 3833]
+ 2018-12-04 17:17:04,259 INFO Port 0: dst MAC ['fa:16:3e:ef:f4:b0', 'fa:16:3e:e5:74:cd']
+ 2018-12-04 17:17:04,259 INFO Port 1: dst MAC ['fa:16:3e:d6:dc:84', 'fa:16:3e:8e:d9:30']
+ 2018-12-04 17:17:04,259 INFO ChainRunner initialized
+ 2018-12-04 17:17:04,260 INFO Starting 2xPVP benchmark...
+ 2018-12-04 17:17:04,266 INFO Starting traffic generator to ensure end-to-end connectivity
+ 2018-12-04 17:17:04,297 INFO Created 2 traffic streams for port 0.
+ 2018-12-04 17:17:04,300 INFO Created 2 traffic streams for port 1.
+ 2018-12-04 17:17:04,420 INFO Captured unique src mac 0/4, capturing return packets (retry 1/100)...
+ 2018-12-04 17:17:06,532 INFO Received packet from mac: fa:16:3e:d6:dc:84 (chain=0, port=1)
+ 2018-12-04 17:17:06,532 INFO Received packet from mac: fa:16:3e:ef:f4:b0 (chain=0, port=0)
+ 2018-12-04 17:17:06,644 INFO Captured unique src mac 2/4, capturing return packets (retry 2/100)...
+ <snip>
+
+ 2018-12-04 17:17:24,337 INFO Received packet from mac: fa:16:3e:8e:d9:30 (chain=1, port=1)
+ 2018-12-04 17:17:24,338 INFO Received packet from mac: fa:16:3e:e5:74:cd (chain=1, port=0)
+ 2018-12-04 17:17:24,338 INFO End-to-end connectivity established
+ 2018-12-04 17:17:24,355 INFO Cleared all existing streams
+ 2018-12-04 17:17:24,383 INFO Created 4 traffic streams for port 0.
+ 2018-12-04 17:17:24,386 INFO Created 4 traffic streams for port 1.
+ 2018-12-04 17:17:24,386 INFO Starting to generate traffic...
+ 2018-12-04 17:17:24,386 INFO Running traffic generator
+ 2018-12-04 17:17:25,415 INFO TX: 1000004; RX: 1000004; Est. Dropped: 0; Est. Drop rate: 0.0000%
+ 2018-12-04 17:17:25,415 INFO ...traffic generating ended.
+ 2018-12-04 17:17:25,420 INFO Service chain 'PVP' run completed.
+ 2018-12-04 17:17:25,471 INFO Clean up skipped.
+ 2018-12-04 17:17:25,508 INFO
+ ========== NFVBench Summary ==========
+ Date: 2018-12-04 17:17:04
+ NFVBench version 3.0.3.dev1
+ Openstack Neutron:
+ vSwitch: OPENVSWITCH
+ Encapsulation: VLAN
+ Benchmarks:
+ > Networks:
+ > Components:
+ > Traffic Generator:
+ Profile: trex-local
+ Tool: TRex
+ > Versions:
+ > Traffic_Generator:
+ build_date: Nov 13 2017
+ version: v2.32
+ built_by: hhaim
+ mode: STL
+ build_time: 10:58:17
+ > CiscoVIM: 2.9.7-17036
+ > Service chain:
+ > PVP:
+ > Traffic:
+ Profile: traffic_profile_64B
+ Bidirectional: True
+ Flow count: 10000
+ Service chains count: 2
+ Compute nodes: [u'nova:charter-compute-4']
+
+ Run Summary:
+
+ +-----------------+-------------+----------------------+----------------------+----------------------+
+ | L2 Frame Size | Drop Rate | Avg Latency (usec) | Min Latency (usec) | Max Latency (usec) |
+ +=================+=============+======================+======================+======================+
+ | 64 | 0.0000% | 18 | 10 | 120 |
+ +-----------------+-------------+----------------------+----------------------+----------------------+
+
+
+ L2 frame size: 64
+
+ Run Config:
+
+ +-------------+---------------------------+------------------------+-----------------+---------------------------+------------------------+-----------------+
+ | Direction | Requested TX Rate (bps) | Actual TX Rate (bps) | RX Rate (bps) | Requested TX Rate (pps) | Actual TX Rate (pps) | RX Rate (pps) |
+ +=============+===========================+========================+=================+===========================+========================+=================+
+ | Forward | 336.0000 Mbps | 336.0013 Mbps | 336.0013 Mbps | 500,000 pps | 500,002 pps | 500,002 pps |
+ +-------------+---------------------------+------------------------+-----------------+---------------------------+------------------------+-----------------+
+ | Reverse | 336.0000 Mbps | 336.0013 Mbps | 336.0013 Mbps | 500,000 pps | 500,002 pps | 500,002 pps |
+ +-------------+---------------------------+------------------------+-----------------+---------------------------+------------------------+-----------------+
+ | Total | 672.0000 Mbps | 672.0027 Mbps | 672.0027 Mbps | 1,000,000 pps | 1,000,004 pps | 1,000,004 pps |
+ +-------------+---------------------------+------------------------+-----------------+---------------------------+------------------------+-----------------+
+
+ Forward Chain Packet Counters and Latency:
+
+ +---------+--------------+--------------+------------+------------+------------+
+ | Chain | TRex.TX.p0 | TRex.RX.p1 | Avg lat. | Min lat. | Max lat. |
+ +=========+==============+==============+============+============+============+
+ | 0 | 250,001 | 250,001 | 26 usec | 10 usec | 70 usec |
+ +---------+--------------+--------------+------------+------------+------------+
+ | 1 | 250,001 | 250,001 | 11 usec | 10 usec | 39 usec |
+ +---------+--------------+--------------+------------+------------+------------+
+ | total | 500,002 | 500,002 | 19 usec | 10 usec | 70 usec |
+ +---------+--------------+--------------+------------+------------+------------+
+
+ Reverse Chain Packet Counters and Latency:
+
+ +---------+--------------+--------------+------------+------------+------------+
+ | Chain | TRex.TX.p1 | TRex.RX.p0 | Avg lat. | Min lat. | Max lat. |
+ +=========+==============+==============+============+============+============+
+ | 0 | 250,001 | 250,001 | 19 usec | 10 usec | 119 usec |
+ +---------+--------------+--------------+------------+------------+------------+
+ | 1 | 250,001 | 250,001 | 19 usec | 10 usec | 120 usec |
+ +---------+--------------+--------------+------------+------------+------------+
+ | total | 500,002 | 500,002 | 19 usec | 10 usec | 120 usec |
+ +---------+--------------+--------------+------------+------------+------------+
diff --git a/docs/user/xtesting.rst b/docs/user/xtesting.rst
new file mode 100644
index 0000000..96d1d19
--- /dev/null
+++ b/docs/user/xtesting.rst
@@ -0,0 +1,252 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International License.
+.. SPDX-License-Identifier: CC-BY-4.0
+
+
+NFVbench Xtesting test cases and Xtesting CI integration
+--------------------------------------------------------
+
+NFVbench can leverages on `Xtesting CI <https://galaxy.ansible.com/collivier/xtesting>`_ and the common test case execution proposed by `Xtesting <https://xtesting.readthedocs.io/en/latest/>`_.
+Thanks to a simple test case list, this tool deploys anywhere plug-and-play `CI/CD toolchains in a few commands <https://github.com/collivier/ansible-role-xtesting/blob/master/README.md>`_.
+In addition, it supports multiple components such as Jenkins and Gitlab CI (test schedulers) and multiple deployment models such as all-in-one or centralized services.
+
+NFVbench using Xtesting and Xtesting CI will permit:
+
+- smoothly assemble multiple heterogeneous test cases
+- generate the Jenkins jobs
+- deploy local CI/CD toolchains everywhere
+- dump all test case results and logs for third-party conformance review
+
+Xtesting CI only requires GNU/Linux as Operating System and asks for a few dependencies as described in Deploy your own Xtesting CI/CD toolchains:
+
+- python-virtualenv
+- docker.io
+- git
+
+Please note the next two points depending on the GNU/Linux distributions and the network settings:
+
+- SELinux: you may have to add --system-site-packages when creating the virtualenv ("Aborting, target uses selinux but python bindings (libselinux-python) aren't installed!")
+- Proxy: you may set your proxy in env for Ansible and in systemd for Docker https://docs.docker.com/config/daemon/systemd/#httphttps-proxy
+
+Here is the default NFVbench tree on the host running nfvbench container as
+proposed in ``xtesting/ansible/host_vars/127.0.0.1`` file:
+
+- ``/home/opnfv/nfvbench/config``: contains nfvbench config files including
+ ``nfvbench.cfg``, the default config file used by xtesting test cases
+- ``/home/opnfv/nfvbench/results``: top directory to write nfvbench results and log files
+
+File content:
+
+.. code-block:: yaml
+
+ docker_args:
+ env: {}
+ params:
+ net: host
+ privileged: true
+ volumes:
+ - /lib/modules/$(uname -r):/lib/modules/$(uname -r)
+ - /usr/src/kernels:/usr/src/kernels -v /dev:/dev
+ - /home/opnfv/nfvbench/config:/etc/nfvbench
+ - /home/opnfv/nfvbench/results:/var/lib/xtesting/results
+
+Please note: if you want to use a different directory structure on the host,
+replace ``/home/opnfv/nfvbench/*`` paths with appropriate paths to permit
+NFVbench container to access config file and results directory. The config and
+results paths do not need to share the same root directory.
+
+To deploy your own CI toolchain running NFVbench:
+
+.. code-block:: bash
+
+ virtualenv nfvbench
+ . nfvbench/bin/activate
+ pip install ansible
+ ansible-galaxy install collivier.xtesting
+ git clone https://gerrit.opnfv.org/gerrit/nfvbench nfvbench
+ ansible-playbook nfvbench/xtesting/ansible/site.yml
+
+
+NFVbench Xtesting test cases and existing CI chain
+--------------------------------------------------
+
+For test automation purpose, Xtesting framework can be used as an executor of NFVbench test cases and called by a CI chain (Jenkins, Gitlab CI ...).
+Xtesting use a testcases.yaml file to list and run test case. One basic testcases.yaml is provided by NFVbench natively but can be override.
+
+Example of CI scenario:
+
+.. image:: images/nfvbench-xtesting.png
+
+1. Run NFVbench container using Xtesting python library
+
+The NFVbench container can be started using docker run command.
+
+To run NFVbench using docker run:
+
+.. code-block:: bash
+
+ docker run --rm \
+ -e S3_ENDPOINT_URL=http://127.0.0.1:9000 \
+ -e S3_DST_URL=s3://xtesting/$BUILD_TAG/$JOB_NAME-$BUILD_ID \
+ -e HTTP_DST_URL=http://127.0.0.1:8181/$BUILD_TAG/$JOB_NAME-$BUILD_ID \
+ -e AWS_ACCESS_KEY_ID=xtesting \
+ -e AWS_SECRET_ACCESS_KEY=xtesting \
+ -e TEST_DB_URL=http://127.0.0.1:8000/api/v1/results \
+ -e NODE_NAME=nfvbench \
+ -e BUILD_TAG=$BUILD_TAG \
+ --privileged \
+ -v /lib/modules/$(uname -r):/lib/modules/$(uname -r) \
+ -v /usr/src/kernels:/usr/src/kernels -v /dev:/dev \
+ -v $HOME/nfvbench/config:/etc/nfvbench \
+ -v $HOME/workspace/$JOB_NAME/results:/var/lib/xtesting/results \
+ opnfv/nfvbench run_tests -t 10kpps-pvp-run -r -p
+
++---------------------------------------------------------------+----------------------------------------------------------------------------+
+| Docker options | Description |
++===============================================================+============================================================================+
+| --rm | clean up container after execution |
++---------------------------------------------------------------+----------------------------------------------------------------------------+
+| -e S3_ENDPOINT_URL | (Xtesting) Environnement variable used to store NFVbench artifacts to Minio|
++---------------------------------------------------------------+----------------------------------------------------------------------------+
+| -e S3_DST_URL | (Xtesting) Environnement variable used for S3 storage destination |
++---------------------------------------------------------------+----------------------------------------------------------------------------+
+| -e HTTP_DST_URL | (Xtesting) Environnement variable used for S3www service |
++---------------------------------------------------------------+----------------------------------------------------------------------------+
+| -e AWS_ACCESS_KEY_ID | (Xtesting) Environnement variable used for S3 access key |
++---------------------------------------------------------------+----------------------------------------------------------------------------+
+| -e AWS_SECRET_ACCESS_KEY | (Xtesting) Environnement variable used for S3 access secret |
++---------------------------------------------------------------+----------------------------------------------------------------------------+
+| -e TEST_DB_URL | (Xtesting) Environnement variable used to export NFVbench results in DB |
++---------------------------------------------------------------+----------------------------------------------------------------------------+
+| -e NODE_NAME | (Xtesting) Environnement variable used as result key identifier in DB |
++---------------------------------------------------------------+----------------------------------------------------------------------------+
+| -e BUILD_TAG | (Xtesting) Environnement variable used as result key identifier in DB |
++---------------------------------------------------------------+----------------------------------------------------------------------------+
+| --privileged | (optional) required if SELinux is enabled on the host |
++---------------------------------------------------------------+----------------------------------------------------------------------------+
+| -v /lib/modules:/lib/modules | needed by kernel modules in the container |
++---------------------------------------------------------------+----------------------------------------------------------------------------+
+| -v /usr/src/kernels:/usr/src/kernels | needed by TRex to build kernel modules when needed |
++---------------------------------------------------------------+----------------------------------------------------------------------------+
+| -v /dev:/dev | needed by kernel modules in the container |
++---------------------------------------------------------------+----------------------------------------------------------------------------+
+| -v $HOME/nfvbench/config:/etc/nfvbench | folder mapping to pass config files between the |
+| | host and the docker space (see examples below) |
+| | Here we map the $HOME/nfvbench/config directory on the host |
+| | to the /etc/nfvbench directory in the container. |
+| | Any other mapping can work as well |
++---------------------------------------------------------------+----------------------------------------------------------------------------+
+| -v $HOME/workspace/$JOB_NAME/results:/var/lib/xtesting/results| (Xtesting) folder mapping to pass files between the |
+| | CI chain workspace and the docker space to store Xtesting result files |
+| | in orchestrator (Jenkins, Gitlab ...) |
++---------------------------------------------------------------+----------------------------------------------------------------------------+
+| opnfv/nfvbench | container image name |
++---------------------------------------------------------------+----------------------------------------------------------------------------+
+| run_tests | (Xtesting) Xtesting command to run test cases |
++---------------------------------------------------------------+----------------------------------------------------------------------------+
+| -t 10kpps-pvp-run | (Xtesting) Xtesting parameter: Test case or tier (group of tests) |
+| | to be executed. It will run all the test if not specified. |
++---------------------------------------------------------------+----------------------------------------------------------------------------+
+| -r | (Xtesting) Xtesting parameter: publish result to database |
++---------------------------------------------------------------+----------------------------------------------------------------------------+
+| -p | (Xtesting) Xtesting parameter: publish artifacts to a S3 service |
++---------------------------------------------------------------+----------------------------------------------------------------------------+
+
+2. Run Xtesting test cases
+
+Executed directly by NFVbench docker entrypoint after docker start.
+
+3. Perform NFVbench test
+
+Xtesting call NFVbench python script to execute test case scenario and wait for run to be terminated.
+
+4. Export NFVbench result
+
+If ``-r`` option is used, results are pushed to a DB through Xtesting.
+If ``-p`` option is used, results are pushed to a S3 service through Xtesting.
+
+
+Override testcases.yaml file
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+To replace existing testcases.yaml file, using Xtesting CI add the volume mapping in ``xtesting/ansible/host_vars/127.0.0.1`` file:
+
+.. code-block:: yaml
+
+ docker_args:
+ env: {}
+ volumes:
+ - /lib/modules/$(uname -r):/lib/modules/$(uname -r)
+ - /usr/src/kernels:/usr/src/kernels -v /dev:/dev
+ - /home/opnfv/nfvbench/config:/etc/nfvbench
+ - /home/opnfv/nfvbench/results:/var/lib/xtesting/results
+ - /home/opnfv/nfvbench/xtesting/testcases.yaml:/usr/local/lib/python3.8/dist-packages/xtesting/ci/testcases.yaml
+
+* ``/home/opnfv/nfvbench/xtesting/testcases.yaml:/usr/local/lib/python3.8/dist-packages/xtesting/ci/testcases.yaml`` : volume mapping to pass testcases.yaml file between the host and the docker space. Host path required testcases.yaml file inside.
+
+
+To replace existing testcases.yaml file, using NFVbench container:
+
+.. code-block:: bash
+
+ docker run --name nfvbench --detach --privileged \
+ -v /lib/modules/$(uname -r):/lib/modules/$(uname -r) \
+ -v /usr/src/kernels:/usr/src/kernels \
+ -v /dev:/dev \
+ -v $HOME/nfvbench/config:/etc/nfvbench \
+ -v $HOME/nfvbench/results:/var/lib/xtesting/results \
+ -v $HOME/nfvbench/xtesting/testcases.yaml:/usr/local/lib/python3.8/dist-packages/xtesting/ci/testcases.yaml \
+ opnfv/nfvbench
+
+* ``$HOME/nfvbench/xtesting/testcases.yaml:/usr/local/lib/python3.8/dist-packages/xtesting/ci/testcases.yaml`` : volume mapping to pass testcases.yaml file between the host and the docker space. Host path required testcases.yaml file inside.
+
+
+Example of Xtesting test case
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. code-block:: yaml
+
+ ---
+ tiers:
+ -
+ name: nfvbench
+ order: 1
+ description: 'Data Plane Performance Testing'
+ testcases:
+ -
+ case_name: 10kpps-pvp-run
+ project_name: nfvbench
+ criteria: 100
+ blocking: true
+ clean_flag: false
+ description: ''
+ run:
+ name: 'bashfeature'
+ args:
+ cmd:
+ - nfvbench -c /etc/nfvbench/nfvbench.cfg --rate 10kpps
+
+
+Examples of manual run
+~~~~~~~~~~~~~~~~~~~~~~
+
+If NFVbench container is already started in CLI mode (see Starting NFVbench in CLI mode dedicated chapter).
+To do a single run at 10,000pps bi-directional (or 5kpps in each direction) using the PVP packet path:
+
+.. code-block:: bash
+
+ docker exec -it nfvbench run_tests -t 10kpps-pvp-run
+
+Xtesting option used:
+
+* ``-t 10kpps-pvp-run`` : specify the test case to run
+
+To pass all test cases:
+
+.. code-block:: bash
+
+ docker exec -it nfvbench run_tests -t all
+
+Xtesting option used:
+
+* ``-t all`` : select all test cases existing in testcases.yaml file
+
diff --git a/kibana/visualizations/export.ndjson b/kibana/visualizations/export.ndjson
new file mode 100644
index 0000000..de72cb4
--- /dev/null
+++ b/kibana/visualizations/export.ndjson
@@ -0,0 +1,25 @@
+{"attributes":{"fieldFormatMap":"{\"frame_size_int\":{\"id\":\"number\",\"params\":{\"parsedUrl\":{\"origin\":\"http://172.20.73.203:5651\",\"pathname\":\"/app/kibana\",\"basePath\":\"\"},\"pattern\":\"0,0\"}},\"rate_pps\":{\"id\":\"number\",\"params\":{\"parsedUrl\":{\"origin\":\"http://172.20.73.203:5651\",\"pathname\":\"/app/kibana\",\"basePath\":\"\"},\"pattern\":\"0,0.[000]a\"}},\"rate_bps\":{\"id\":\"number\",\"params\":{\"parsedUrl\":{\"origin\":\"http://172.20.73.203:5651\",\"pathname\":\"/app/kibana\",\"basePath\":\"\"},\"pattern\":\"0,0.[0] bd\"}},\"forward_orig_rate_bps\":{\"id\":\"number\",\"params\":{\"parsedUrl\":{\"origin\":\"http://172.20.73.203:5651\",\"pathname\":\"/app/kibana\",\"basePath\":\"\"},\"pattern\":\"0,0.[0] bd\"}},\"forward_rx_rate_bps\":{\"id\":\"number\",\"params\":{\"parsedUrl\":{\"origin\":\"http://172.20.73.203:5651\",\"pathname\":\"/app/kibana\",\"basePath\":\"\"},\"pattern\":\"0,0.[0] bd\"}},\"forward_tx_rate_bps\":{\"id\":\"number\",\"params\":{\"parsedUrl\":{\"origin\":\"http://172.20.73.203:5651\",\"pathname\":\"/app/kibana\",\"basePath\":\"\"},\"pattern\":\"0,0.[0] bd\"}},\"reverse_orig_rate_bps\":{\"id\":\"number\",\"params\":{\"parsedUrl\":{\"origin\":\"http://172.20.73.203:5651\",\"pathname\":\"/app/kibana\",\"basePath\":\"\"},\"pattern\":\"0,0.[0] bd\"}},\"reverse_rx_rate_bps\":{\"id\":\"number\",\"params\":{\"parsedUrl\":{\"origin\":\"http://172.20.73.203:5651\",\"pathname\":\"/app/kibana\",\"basePath\":\"\"},\"pattern\":\"0,0.[0] bd\"}},\"reverse_tx_rate_bps\":{\"id\":\"number\",\"params\":{\"parsedUrl\":{\"origin\":\"http://172.20.73.203:5651\",\"pathname\":\"/app/kibana\",\"basePath\":\"\"},\"pattern\":\"0,0.[0] bd\"}},\"total_orig_rate_bps\":{\"id\":\"number\",\"params\":{\"parsedUrl\":{\"origin\":\"http://172.20.73.203:5651\",\"pathname\":\"/app/kibana\",\"basePath\":\"\"},\"pattern\":\"0,0.[0] bd\"}},\"total_rx_rate_bps\":{\"id\":\"number\",\"params\":{\"parsedUrl\":{\"origin\":\"http://172.20.73.203:5651\",\"pathname\":\"/app/kibana\",\"basePath\":\"\"},\"pattern\":\"0,0.[0] bd\"}},\"total_tx_rate_bps\":{\"id\":\"number\",\"params\":{\"parsedUrl\":{\"origin\":\"http://172.20.73.203:5651\",\"pathname\":\"/app/kibana\",\"basePath\":\"\"},\"pattern\":\"0,0.[0] bd\"}},\"forward_orig_rate_pps\":{\"id\":\"number\",\"params\":{\"parsedUrl\":{\"origin\":\"http://172.20.73.203:5651\",\"pathname\":\"/app/kibana\",\"basePath\":\"\"},\"pattern\":\"0,0.[000]a\"}},\"forward_rx_rate_pps\":{\"id\":\"number\",\"params\":{\"parsedUrl\":{\"origin\":\"http://172.20.73.203:5651\",\"pathname\":\"/app/kibana\",\"basePath\":\"\"},\"pattern\":\"0,0.[000]a\"}},\"forward_tx_rate_pps\":{\"id\":\"number\",\"params\":{\"parsedUrl\":{\"origin\":\"http://172.20.73.203:5651\",\"pathname\":\"/app/kibana\",\"basePath\":\"\"},\"pattern\":\"0,0.[000]a\"}},\"reverse_orig_rate_pps\":{\"id\":\"number\",\"params\":{\"parsedUrl\":{\"origin\":\"http://172.20.73.203:5651\",\"pathname\":\"/app/kibana\",\"basePath\":\"\"},\"pattern\":\"0,0.[000]a\"}},\"reverse_rx_rate_pps\":{\"id\":\"number\",\"params\":{\"parsedUrl\":{\"origin\":\"http://172.20.73.203:5651\",\"pathname\":\"/app/kibana\",\"basePath\":\"\"},\"pattern\":\"0,0.[000]a\"}},\"reverse_tx_rate_pps\":{\"id\":\"number\",\"params\":{\"parsedUrl\":{\"origin\":\"http://172.20.73.203:5651\",\"pathname\":\"/app/kibana\",\"basePath\":\"\"},\"pattern\":\"0,0.[000]a\"}},\"total_orig_rate_pps\":{\"id\":\"number\",\"params\":{\"parsedUrl\":{\"origin\":\"http://172.20.73.203:5651\",\"pathname\":\"/app/kibana\",\"basePath\":\"\"},\"pattern\":\"0,0.[000]a\"}},\"total_rx_rate_pps\":{\"id\":\"number\",\"params\":{\"parsedUrl\":{\"origin\":\"http://172.20.73.203:5651\",\"pathname\":\"/app/kibana\",\"basePath\":\"\"},\"pattern\":\"0,0.[000]a\"}},\"total_tx_rate_pps\":{\"id\":\"number\",\"params\":{\"parsedUrl\":{\"origin\":\"http://172.20.73.203:5651\",\"pathname\":\"/app/kibana\",\"basePath\":\"\"},\"pattern\":\"0,0.[000]a\"}},\"theoretical_tx_rate_bps\":{\"id\":\"number\",\"params\":{\"parsedUrl\":{\"origin\":\"http://172.20.73.203:5651\",\"pathname\":\"/app/kibana\",\"basePath\":\"\"},\"pattern\":\"0,0.[0] bd\"}},\"theoretical_tx_rate_pps\":{\"id\":\"number\",\"params\":{\"parsedUrl\":{\"origin\":\"http://172.20.73.203:5651\",\"pathname\":\"/app/kibana\",\"basePath\":\"\"},\"pattern\":\"0,0.[000]a\"}}}","fields":"[{\"name\":\"@timestamp\",\"type\":\"date\",\"esTypes\":[\"date\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"Encapsulation\",\"type\":\"string\",\"esTypes\":[\"text\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"Encapsulation.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"Encapsulation\"}}},{\"name\":\"_id\",\"type\":\"string\",\"esTypes\":[\"_id\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_index\",\"type\":\"string\",\"esTypes\":[\"_index\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_score\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_source\",\"type\":\"_source\",\"esTypes\":[\"_source\"],\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_type\",\"type\":\"string\",\"esTypes\":[\"_type\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"avg_delay_usec\",\"type\":\"number\",\"esTypes\":[\"float\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"bidirectional\",\"type\":\"boolean\",\"esTypes\":[\"boolean\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"drop_limit\",\"type\":\"number\",\"esTypes\":[\"float\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"drop_percentage\",\"type\":\"number\",\"esTypes\":[\"float\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"drop_rate_percent\",\"type\":\"number\",\"esTypes\":[\"float\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"flow_count\",\"type\":\"number\",\"esTypes\":[\"long\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"forward_orig_rate_bps\",\"type\":\"number\",\"esTypes\":[\"long\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"forward_orig_rate_pps\",\"type\":\"number\",\"esTypes\":[\"long\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"forward_rx_rate_bps\",\"type\":\"number\",\"esTypes\":[\"long\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"forward_rx_rate_pps\",\"type\":\"number\",\"esTypes\":[\"long\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"forward_tx_rate_bps\",\"type\":\"number\",\"esTypes\":[\"long\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"forward_tx_rate_pps\",\"type\":\"number\",\"esTypes\":[\"long\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"frame_size\",\"type\":\"string\",\"esTypes\":[\"text\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"frame_size.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"frame_size\"}}},{\"name\":\"lat_percentile_25\",\"type\":\"number\",\"esTypes\":[\"long\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"lat_percentile_75\",\"type\":\"number\",\"esTypes\":[\"long\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"lat_percentile_99\",\"type\":\"number\",\"esTypes\":[\"long\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"max_delay_usec\",\"type\":\"number\",\"esTypes\":[\"long\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"min_delay_usec\",\"type\":\"number\",\"esTypes\":[\"long\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"ndr_search_duration\",\"type\":\"string\",\"esTypes\":[\"text\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"ndr_search_duration.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"ndr_search_duration\"}}},{\"name\":\"offered_tx_rate_bps\",\"type\":\"number\",\"esTypes\":[\"float\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"profile\",\"type\":\"string\",\"esTypes\":[\"text\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"profile.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"profile\"}}},{\"name\":\"rate_bps\",\"type\":\"number\",\"esTypes\":[\"float\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"rate_pps\",\"type\":\"number\",\"esTypes\":[\"long\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"reverse_orig_rate_bps\",\"type\":\"number\",\"esTypes\":[\"long\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"reverse_orig_rate_pps\",\"type\":\"number\",\"esTypes\":[\"long\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"reverse_rx_rate_bps\",\"type\":\"number\",\"esTypes\":[\"long\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"reverse_rx_rate_pps\",\"type\":\"number\",\"esTypes\":[\"long\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"reverse_tx_rate_bps\",\"type\":\"number\",\"esTypes\":[\"long\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"reverse_tx_rate_pps\",\"type\":\"number\",\"esTypes\":[\"long\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"runlogdate\",\"type\":\"date\",\"esTypes\":[\"date\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"sc_count\",\"type\":\"number\",\"esTypes\":[\"long\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"service_chain\",\"type\":\"string\",\"esTypes\":[\"text\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"service_chain.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"service_chain\"}}},{\"name\":\"theoretical_tx_rate_bps\",\"type\":\"number\",\"esTypes\":[\"float\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"theoretical_tx_rate_pps\",\"type\":\"number\",\"esTypes\":[\"float\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"total_orig_rate_bps\",\"type\":\"number\",\"esTypes\":[\"long\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"total_orig_rate_pps\",\"type\":\"number\",\"esTypes\":[\"long\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"total_rx_rate_bps\",\"type\":\"number\",\"esTypes\":[\"long\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"total_rx_rate_pps\",\"type\":\"number\",\"esTypes\":[\"long\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"total_tx_rate_bps\",\"type\":\"number\",\"esTypes\":[\"long\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"total_tx_rate_pps\",\"type\":\"number\",\"esTypes\":[\"long\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"type\",\"type\":\"string\",\"esTypes\":[\"text\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"type.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"type\"}}},{\"name\":\"user_label\",\"type\":\"string\",\"esTypes\":[\"text\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"user_label.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"user_label\"}}},{\"name\":\"vSwitch\",\"type\":\"string\",\"esTypes\":[\"text\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"vSwitch.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"vSwitch\"}}},{\"name\":\"version\",\"type\":\"string\",\"esTypes\":[\"text\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"version.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"version\"}}},{\"name\":\"frame_size_int\",\"type\":\"number\",\"count\":0,\"scripted\":true,\"script\":\"if (doc['frame_size.keyword'] != null) {\\n if (doc['frame_size.keyword'].value != \\\"IMIX\\\") {\\n return Integer.parseInt(doc['frame_size.keyword'].value) \\n }\\n else { \\n return 362 \\n } \\n}\",\"lang\":\"painless\",\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false}]","timeFieldName":"@timestamp","title":"resu*"},"id":"e0939790-e78f-11ea-8ca2-35af0cc4217c","migrationVersion":{"index-pattern":"7.6.0"},"references":[],"type":"index-pattern","updated_at":"2020-10-06T12:53:31.024Z","version":"WzE2NTYsMTJd"}
+{"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"language\":\"kuery\",\"query\":\"\"},\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\",\"filter\":[{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"type.keyword\",\"negate\":true,\"params\":{\"query\":\"single_run\"},\"type\":\"phrase\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"},\"query\":{\"match_phrase\":{\"type.keyword\":\"single_run\"}}}]}"},"title":"Synthesis - one label","uiStateJSON":"{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}","version":1,"visState":"{\"type\":\"table\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"max\",\"schema\":\"metric\",\"params\":{\"field\":\"rate_bps\",\"customLabel\":\"Offered bps\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"max\",\"schema\":\"metric\",\"params\":{\"field\":\"rate_pps\",\"customLabel\":\"Offered pps\"}},{\"id\":\"3\",\"enabled\":true,\"type\":\"std_dev\",\"schema\":\"metric\",\"params\":{\"field\":\"total_orig_rate_bps\",\"customLabel\":\"std max bps\"}},{\"id\":\"4\",\"enabled\":true,\"type\":\"avg\",\"schema\":\"metric\",\"params\":{\"field\":\"avg_delay_usec\",\"customLabel\":\"latency avg\"}},{\"id\":\"6\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"split\",\"params\":{\"field\":\"flow_count\",\"orderBy\":\"_key\",\"order\":\"asc\",\"size\":50,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"flow count\"}},{\"id\":\"8\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"frame_size_int\",\"orderBy\":\"_key\",\"order\":\"asc\",\"size\":50,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"frame size (bytes)\"}}],\"params\":{\"perPage\":10,\"percentageCol\":\"\",\"row\":false,\"showMetricsAtAllLevels\":false,\"showPartialRows\":false,\"showTotal\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"totalFunc\":\"sum\"},\"title\":\"Synthesis - one label\"}"},"id":"0d2c4070-e6e3-11ea-a933-05dd8fc4d76f","migrationVersion":{"visualization":"7.8.0"},"references":[{"id":"e0939790-e78f-11ea-8ca2-35af0cc4217c","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"},{"id":"e0939790-e78f-11ea-8ca2-35af0cc4217c","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index","type":"index-pattern"}],"type":"visualization","updated_at":"2020-09-03T13:55:18.628Z","version":"WzExMTcsNV0="}
+{"attributes":{"description":"NDR / PDR line chart - in Mpps","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"type.keyword\",\"negate\":true,\"params\":{\"query\":\"single_run\"},\"type\":\"phrase\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"},\"query\":{\"match_phrase\":{\"type.keyword\":\"single_run\"}}},{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"frame_size\",\"negate\":true,\"params\":{\"query\":\"IMIX\"},\"type\":\"phrase\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[1].meta.index\"},\"query\":{\"match_phrase\":{\"frame_size\":\"IMIX\"}}}]}"},"title":"[NDR] Capacity in Mpps - Line chart","uiStateJSON":"{}","version":1,"visState":"{\"type\":\"vega\",\"aggs\":[],\"params\":{\"spec\":\"{\\n $schema: https: //vega.github.io/schema/vega-lite/v2.json\\n title: \\\"Capacity in Mpps - 0,001% loss ratio\\\"\\n data: {\\n url: {\\n %context%: true\\n %timefield%: \\\"@timestamp\\\"\\n index: resu*\\n body: {\\n _source: [\\\"@timestamp\\\", \\\"_source\\\", \\\"rate_pps\\\", \\\"flow_count\\\", \\\"frame_size\\\", \\\"user_label\\\", \\\"type\\\"]\\n },\\n size: 10000\\n },\\n format: { property: \\\"hits.hits\\\" }\\n },\\n\\n transform: [\\n { calculate: \\\"datum._source['rate_pps'] / 1000000\\\" as: \\\"offered_load_pps\\\"},\\n { calculate: \\\"datum._source['flow_count']\\\" as: \\\"flow_count\\\"},\\n { calculate: \\\"isNaN(toNumber(datum._source['frame_size'])) ? 362 : toNumber(datum._source['frame_size'])\\\" as: \\\"frame_size\\\"},\\n { calculate: \\\"datum._source['user_label'] + '-' + datum._source['flow_count']\\\" as: \\\"label\\\"}\\n { aggregate: [{op: \\\"max\\\", field: \\\"offered_load_pps\\\", as: \\\"max_offered_load_pps\\\"}], groupby: [\\\"frame_size\\\", \\\"label\\\",\\\"flow_count\\\"]}\\n \\n ],\\n center: true,\\n hconcat: [\\n {\\n width:10,\\n selection: {\\n legendSel: {\\n type: \\\"multi\\\",\\n encodings: [ \\\"color\\\", \\\"shape\\\" ],\\n toggle: \\\"event.shiftKey\\\"\\n }\\n },\\n encoding: {\\n y: {\\n field: \\\"label\\\",\\n type: \\\"nominal\\\",\\n axis: {\\n title: \\\"\\\",\\n domain: false,\\n ticks: false,\\n offset: 10\\n },\\n },\\n color: {\\n condition: {\\n selection: \\\"legendSel\\\",\\n field: \\\"label\\\",\\n type: \\\"nominal\\\",\\n legend: null\\n },\\n value: \\\"lightgrey\\\"\\n }\\n },\\n mark: {\\n type: \\\"square\\\",\\n size: 120,\\n opacity: 1\\n }\\n },\\n {\\n width:500,\\n height:280,\\n transform: [\\n {filter: { selection: \\\"legendSel\\\"}}\\n \\n ],\\n mark: {\\n type: \\\"line\\\",\\n tooltip: true,\\n point: true\\n },\\n selection: {\\n grid: {\\n type: \\\"interval\\\",\\n resolve: \\\"global\\\",\\n bind: \\\"scales\\\",\\n translate: \\\"[mousedown[!event.shiftKey], window:mouseup] > window:mousemove!\\\",\\n zoom: \\\"wheel![!event.shiftKey]\\\"\\n },\\n pts: {\\n type: \\\"single\\\",\\n fields: [\\\"Label\\\"]\\n }\\n },\\n encoding: {\\n x: { field: \\\"frame_size\\\", type: \\\"quantitative\\\", title: \\\"Frame size (bytes)\\\", axis: {offset: 10} }\\n y: { field: \\\"max_offered_load_pps\\\", type: \\\"quantitative\\\", title: \\\"Offered load (Mpps)\\\" , axis: {offset: 10} }\\n color: {field: \\\"label\\\", \\\"type\\\": \\\"nominal\\\",\\n \\\"legend\\\": null}\\n tooltip: {\\\"field\\\": \\\"max_offered_load_pps\\\", \\\"type\\\": \\\"quantitative\\\"},\\n shape: {field: \\\"flow_count\\\", type: \\\"nominal\\\"}\\n }\\n } \\n ]\\n}\"},\"title\":\"[NDR] Capacity in Mpps - Line chart\"}"},"id":"1b471fa0-e6b0-11ea-bdc0-1fe1db0b9cb6","migrationVersion":{"visualization":"7.8.0"},"references":[{"id":"e0939790-e78f-11ea-8ca2-35af0cc4217c","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index","type":"index-pattern"},{"id":"e0939790-e78f-11ea-8ca2-35af0cc4217c","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[1].meta.index","type":"index-pattern"}],"type":"visualization","updated_at":"2020-10-06T12:39:19.799Z","version":"WzE2MDgsMTJd"}
+{"attributes":{"description":"NDR / PDR line chart - in Gbps","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"type.keyword\",\"negate\":true,\"params\":{\"query\":\"single_run\"},\"type\":\"phrase\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"},\"query\":{\"match_phrase\":{\"type.keyword\":\"single_run\"}}},{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"frame_size\",\"negate\":true,\"params\":{\"query\":\"IMIX\"},\"type\":\"phrase\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[1].meta.index\"},\"query\":{\"match_phrase\":{\"frame_size\":\"IMIX\"}}},{\"$state\":{\"store\":\"appState\"},\"exists\":{\"field\":\"offered_tx_rate_bps\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"offered_tx_rate_bps\",\"negate\":false,\"type\":\"exists\",\"value\":\"exists\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[2].meta.index\"}}]}"},"title":"[NDR] Capacity in Gbps - Line chart","uiStateJSON":"{}","version":1,"visState":"{\"type\":\"vega\",\"aggs\":[],\"params\":{\"spec\":\"{\\n $schema: https: //vega.github.io/schema/vega-lite/v2.json\\n title: \\\"Capacity in Gbps - 0,001% loss ratio\\\"\\n data: {\\n url: {\\n %context%: true\\n %timefield%: \\\"@timestamp\\\"\\n index: resu*\\n body: {\\n _source: [\\\"@timestamp\\\", \\\"_source\\\", \\\"offered_tx_rate_bps\\\", \\\"flow_count\\\", \\\"frame_size\\\", \\\"user_label\\\"]\\n },\\n size: 10000\\n },\\n format: { property: \\\"hits.hits\\\" }\\n },\\n transform: [\\n { calculate: \\\"datum._source['offered_tx_rate_bps'] / 1000000000\\\" as: \\\"offered_load_gbps\\\"},\\n { calculate: \\\"datum._source['flow_count']\\\" as: \\\"flow_count\\\"},\\n { calculate: \\\"isNaN(toNumber(datum._source['frame_size'])) ? 362 : toNumber(datum._source['frame_size'])\\\" as: \\\"frame_size\\\"},\\n { calculate: \\\"datum._source['user_label'] + '-' + datum._source['flow_count']\\\" as: \\\"label\\\"}\\n { aggregate: [{op: \\\"max\\\", field: \\\"offered_load_gbps\\\", as: \\\"max_offered_load_gbps\\\"}], groupby: [\\\"frame_size\\\", \\\"label\\\",\\\"flow_count\\\"]}\\n ],\\n center: true,\\n hconcat: [\\n {\\n width:10,\\n selection: {\\n legendSel: {\\n type: \\\"multi\\\",\\n encodings: [ \\\"color\\\", \\\"shape\\\" ],\\n toggle: \\\"event.shiftKey\\\"\\n }\\n },\\n encoding: {\\n y: {\\n field: \\\"label\\\",\\n type: \\\"nominal\\\",\\n axis: {\\n title: \\\"\\\",\\n domain: false,\\n ticks: false,\\n offset: 10\\n },\\n },\\n color: {\\n condition: {\\n selection: \\\"legendSel\\\",\\n field: \\\"label\\\",\\n type: \\\"nominal\\\",\\n legend: null\\n },\\n value: \\\"lightgrey\\\"\\n }\\n },\\n mark: {\\n type: \\\"square\\\",\\n size: 120,\\n opacity: 1\\n }\\n },\\n {\\n width:500,\\n height:280,\\n transform: [\\n {filter: { selection: \\\"legendSel\\\"}}\\n ],\\n mark: {\\n type: \\\"line\\\",\\n tooltip: true,\\n point: true\\n },\\n selection: {\\n grid: {\\n type: \\\"interval\\\",\\n resolve: \\\"global\\\",\\n bind: \\\"scales\\\",\\n translate: \\\"[mousedown[!event.shiftKey], window:mouseup] > window:mousemove!\\\",\\n zoom: \\\"wheel![!event.shiftKey]\\\"\\n },\\n pts: {\\n type: \\\"single\\\",\\n fields: [\\\"Label\\\"]\\n }\\n },\\n encoding: {\\n x: { field: \\\"frame_size\\\", type: \\\"quantitative\\\", title: \\\"Frame size (bytes)\\\", axis: {offset: 10} }\\n y: { field: \\\"max_offered_load_gbps\\\", type: \\\"quantitative\\\", title: \\\"Offered load (Gbps)\\\" , axis: {offset: 10} }\\n color: {field: \\\"label\\\", \\\"type\\\": \\\"nominal\\\",\\n \\\"legend\\\": null}\\n shape: {field: \\\"flow_count\\\", type: \\\"nominal\\\"}\\n tooltip: {\\\"field\\\": \\\"max_offered_load_gbps\\\", \\\"type\\\": \\\"quantitative\\\"}\\n }\\n }\\n ]\\n}\"},\"title\":\"[NDR] Capacity in Gbps - Line chart\"}"},"id":"23b0eb40-e60a-11ea-bdc0-1fe1db0b9cb6","migrationVersion":{"visualization":"7.8.0"},"references":[{"id":"e0939790-e78f-11ea-8ca2-35af0cc4217c","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index","type":"index-pattern"},{"id":"e0939790-e78f-11ea-8ca2-35af0cc4217c","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[1].meta.index","type":"index-pattern"},{"id":"e0939790-e78f-11ea-8ca2-35af0cc4217c","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[2].meta.index","type":"index-pattern"}],"type":"visualization","updated_at":"2020-10-06T12:41:52.380Z","version":"WzE2MTUsMTJd"}
+{"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"language\":\"kuery\",\"query\":\"\"},\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\",\"filter\":[{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"type.keyword\",\"negate\":true,\"params\":{\"query\":\"single_run\"},\"type\":\"phrase\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"},\"query\":{\"match_phrase\":{\"type.keyword\":\"single_run\"}}}]}"},"title":"Synthesis - multiple labels","uiStateJSON":"{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}","version":1,"visState":"{\"type\":\"table\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"max\",\"schema\":\"metric\",\"params\":{\"field\":\"rate_bps\",\"customLabel\":\"Offered bps\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"max\",\"schema\":\"metric\",\"params\":{\"field\":\"rate_pps\",\"customLabel\":\"Offered pps\"}},{\"id\":\"3\",\"enabled\":true,\"type\":\"std_dev\",\"schema\":\"metric\",\"params\":{\"field\":\"total_orig_rate_bps\",\"customLabel\":\"std max bps\"}},{\"id\":\"4\",\"enabled\":true,\"type\":\"avg\",\"schema\":\"metric\",\"params\":{\"field\":\"avg_delay_usec\",\"customLabel\":\"latency avg\"}},{\"id\":\"6\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"split\",\"params\":{\"field\":\"flow_count\",\"orderBy\":\"_key\",\"order\":\"asc\",\"size\":50,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"flow count\"}},{\"id\":\"9\",\"enabled\":true,\"type\":\"significant_terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"user_label.keyword\",\"size\":10,\"customLabel\":\"label\"}},{\"id\":\"8\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"frame_size_int\",\"orderBy\":\"_key\",\"order\":\"asc\",\"size\":50,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"frame size (bytes)\"}}],\"params\":{\"perPage\":10,\"percentageCol\":\"\",\"row\":false,\"showMetricsAtAllLevels\":false,\"showPartialRows\":false,\"showTotal\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"totalFunc\":\"sum\"},\"title\":\"Synthesis - multiple labels\"}"},"id":"38cecb10-eded-11ea-a706-3fce679b2102","migrationVersion":{"visualization":"7.8.0"},"references":[{"id":"e0939790-e78f-11ea-8ca2-35af0cc4217c","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"},{"id":"e0939790-e78f-11ea-8ca2-35af0cc4217c","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index","type":"index-pattern"}],"type":"visualization","updated_at":"2020-09-03T13:56:10.433Z","version":"WzExMTksNV0="}
+{"attributes":{"description":"NDR / PDR scatter plot - in Gbps","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"type.keyword\",\"negate\":true,\"params\":{\"query\":\"single_run\"},\"type\":\"phrase\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"},\"query\":{\"match_phrase\":{\"type.keyword\":\"single_run\"}}},{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"frame_size\",\"negate\":true,\"params\":{\"query\":\"IMIX\"},\"type\":\"phrase\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[1].meta.index\"},\"query\":{\"match_phrase\":{\"frame_size\":\"IMIX\"}}},{\"$state\":{\"store\":\"appState\"},\"exists\":{\"field\":\"offered_tx_rate_bps\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"offered_tx_rate_bps\",\"negate\":false,\"type\":\"exists\",\"value\":\"exists\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[2].meta.index\"}}]}"},"title":"[NDR] Capacity in Gbps - Scatter plot","uiStateJSON":"{}","version":1,"visState":"{\"type\":\"vega\",\"aggs\":[],\"params\":{\"spec\":\"{\\n $schema: \\\"https://vega.github.io/schema/vega-lite/v2.json\\\"\\n title: \\\"Capacity in Gbps - 0.001% loss ratio\\\"\\n data: {\\n url: {\\n %context%: true\\n %timefield%: \\\"@timestamp\\\"\\n index: resu*\\n body: {\\n _source: [\\\"@timestamp\\\", \\\"_source\\\", \\\"offered_tx_rate_bps\\\", \\\"flow_count\\\", \\\"frame_size\\\", \\\"user_label\\\"]\\n },\\n size: 10000\\n },\\n format: { property: \\\"hits.hits\\\" }\\n },\\n transform: [\\n { calculate: \\\"datum._source['offered_tx_rate_bps'] / 1000000000\\\" as: \\\"Offered load (Gbps)\\\"},\\n { calculate: \\\"datum._source['flow_count']\\\" as: \\\"Flow count\\\"},\\n { calculate: \\\"isNaN(toNumber(datum._source['frame_size'])) ? 362 : toNumber(datum._source['frame_size'])\\\" as: \\\"Frame size (bytes)\\\"}\\n { calculate: \\\"datum._source['user_label'] + '-' + datum._source['flow_count']\\\" as: \\\"label\\\"}\\n ],\\n center: true,\\n hconcat: [\\n {\\n width:10,\\n selection: {\\n legendSel: {\\n type: \\\"multi\\\",\\n encodings: [ \\\"color\\\", \\\"shape\\\" ],\\n toggle: \\\"event.shiftKey\\\"\\n }\\n },\\n encoding: {\\n y: {\\n field: \\\"label\\\",\\n type: \\\"nominal\\\",\\n axis: {\\n title: \\\"\\\",\\n domain: false,\\n ticks: false,\\n offset: 10\\n },\\n },\\n color: {\\n condition: {\\n selection: \\\"legendSel\\\",\\n field: \\\"label\\\",\\n type: \\\"nominal\\\",\\n legend: null\\n },\\n value: \\\"lightgrey\\\"\\n }\\n },\\n mark: {\\n type: \\\"square\\\",\\n size: 120,\\n opacity: 1\\n }\\n },\\n {\\n width:500,\\n height:280,\\n transform: [\\n {filter: { selection: \\\"legendSel\\\"}}\\n \\n ],\\n mark: {\\n \\\"type\\\": \\\"point\\\",\\n \\\"tooltip\\\": true\\n },\\n selection: {\\n grid: {\\n type: \\\"interval\\\",\\n resolve: \\\"global\\\",\\n bind: \\\"scales\\\",\\n translate: \\\"[mousedown[!event.shiftKey], window:mouseup] > window:mousemove!\\\",\\n zoom: \\\"wheel![!event.shiftKey]\\\"\\n },\\n pts: {\\n type: \\\"single\\\",\\n fields: [\\\"label\\\"]\\n }\\n },\\n encoding: {\\n x: {\\n field: \\\"Frame size (bytes)\\\",\\n type: \\\"quantitative\\\"\\n }\\n y: {\\n field: \\\"Offered load (Gbps)\\\",\\n type: \\\"quantitative\\\"\\n }\\n color: {\\n field: \\\"label\\\", \\\"type\\\": \\\"nominal\\\",\\n \\\"legend\\\": null\\n }\\n shape: {\\n field: \\\"Flow count\\\",\\n type: \\\"nominal\\\"\\n }\\n tooltip: {\\n \\\"field\\\": \\\"Offered load (Gbps)\\\",\\n \\\"type\\\": \\\"quantitative\\\"\\n }\\n }\\n }\\n ]\\n}\"},\"title\":\"[NDR] Capacity in Gbps - Scatter plot\"}"},"id":"82fc8690-e77c-11ea-bb67-9b8ce9c25c00","migrationVersion":{"visualization":"7.8.0"},"references":[{"id":"e0939790-e78f-11ea-8ca2-35af0cc4217c","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index","type":"index-pattern"},{"id":"e0939790-e78f-11ea-8ca2-35af0cc4217c","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[1].meta.index","type":"index-pattern"},{"id":"e0939790-e78f-11ea-8ca2-35af0cc4217c","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[2].meta.index","type":"index-pattern"}],"type":"visualization","updated_at":"2020-10-06T12:43:07.344Z","version":"WzE2MjAsMTJd"}
+{"attributes":{"description":"NDR / PDR scatter plot - in Mpps","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"type.keyword\",\"negate\":true,\"params\":{\"query\":\"single_run\"},\"type\":\"phrase\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"},\"query\":{\"match_phrase\":{\"type.keyword\":\"single_run\"}}},{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"frame_size\",\"negate\":true,\"params\":{\"query\":\"IMIX\"},\"type\":\"phrase\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[1].meta.index\"},\"query\":{\"match_phrase\":{\"frame_size\":\"IMIX\"}}}]}"},"title":"[NDR] Capacity in Mpps - Scatter plot","uiStateJSON":"{}","version":1,"visState":"{\"type\":\"vega\",\"aggs\":[],\"params\":{\"spec\":\"{\\n $schema: \\\"https://vega.github.io/schema/vega-lite/v2.json\\\"\\n title: \\\"Capacity in Mpps - 0,001% loss ratio\\\"\\n data: {\\n url: {\\n %context%: true\\n %timefield%: \\\"@timestamp\\\"\\n index: resu*\\n body: {\\n _source: [\\\"@timestamp\\\", \\\"_source\\\", \\\"rate_pps\\\", \\\"flow_count\\\", \\\"frame_size\\\", \\\"user_label\\\"]\\n },\\n size: 10000\\n },\\n format: { property: \\\"hits.hits\\\" }\\n },\\n transform: [\\n { calculate: \\\"datum._source['rate_pps'] / 1000000\\\" as: \\\"Offered load (Mpps)\\\"},\\n { calculate: \\\"datum._source['flow_count']\\\" as: \\\"Flow count\\\"},\\n { calculate: \\\"isNaN(toNumber(datum._source['frame_size'])) ? 362 : toNumber(datum._source['frame_size'])\\\" as: \\\"Frame size (bytes)\\\"}\\n { calculate: \\\"datum._source['user_label'] + '-' + datum._source['flow_count']\\\" as: \\\"label\\\"}\\n ],\\n center: true,\\n hconcat: [\\n {\\n width:10,\\n selection: {\\n legendSel: {\\n type: \\\"multi\\\",\\n encodings: [ \\\"color\\\", \\\"shape\\\" ],\\n toggle: \\\"event.shiftKey\\\"\\n }\\n },\\n encoding: {\\n y: {\\n field: \\\"label\\\",\\n type: \\\"nominal\\\",\\n axis: {\\n title: \\\"\\\",\\n domain: false,\\n ticks: false,\\n offset: 10\\n },\\n },\\n color: {\\n condition: {\\n selection: \\\"legendSel\\\",\\n field: \\\"label\\\",\\n type: \\\"nominal\\\",\\n legend: null\\n },\\n value: \\\"lightgrey\\\"\\n }\\n },\\n mark: {\\n type: \\\"square\\\",\\n size: 120,\\n opacity: 1\\n }\\n },\\n {\\n width:500,\\n height:280,\\n transform: [\\n {filter: { selection: \\\"legendSel\\\"}}\\n \\n ],\\n mark: {\\n \\\"type\\\": \\\"point\\\",\\n \\\"tooltip\\\": true\\n },\\n selection: {\\n grid: {\\n type: \\\"interval\\\",\\n resolve: \\\"global\\\",\\n bind: \\\"scales\\\",\\n translate: \\\"[mousedown[!event.shiftKey], window:mouseup] > window:mousemove!\\\",\\n zoom: \\\"wheel![!event.shiftKey]\\\"\\n },\\n pts: {\\n type: \\\"single\\\",\\n fields: [\\\"label\\\"]\\n }\\n },\\n encoding: {\\n x: {\\n field: \\\"Frame size (bytes)\\\",\\n type: \\\"quantitative\\\"\\n }\\n y: {\\n field: \\\"Offered load (Mpps)\\\",\\n type: \\\"quantitative\\\"\\n }\\n color: {\\n field: \\\"label\\\", \\\"type\\\": \\\"nominal\\\",\\n \\\"legend\\\": null\\n }\\n shape: {\\n field: \\\"Flow count\\\",\\n type: \\\"nominal\\\"\\n }\\n tooltip: {\\n \\\"field\\\": \\\"Offered load (Mpps)\\\",\\n \\\"type\\\": \\\"quantitative\\\"\\n }\\n }\\n }\\n ]\\n}\"},\"title\":\"[NDR] Capacity in Mpps - Scatter plot\"}"},"id":"51110c20-e879-11ea-9fcb-3bb6d0d175f6","migrationVersion":{"visualization":"7.8.0"},"references":[{"id":"e0939790-e78f-11ea-8ca2-35af0cc4217c","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index","type":"index-pattern"},{"id":"e0939790-e78f-11ea-8ca2-35af0cc4217c","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[1].meta.index","type":"index-pattern"}],"type":"visualization","updated_at":"2020-10-06T12:44:30.320Z","version":"WzE2MjIsMTJd"}
+{"attributes":{"description":"","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"language\":\"kuery\",\"query\":\"\"},\"filter\":[]}"},"optionsJSON":"{\"hidePanelTitles\":false,\"useMargins\":true}","panelsJSON":"[{\"embeddableConfig\":{\"title\":\"Max value over 3 measurements\"},\"gridData\":{\"h\":15,\"i\":\"e9186fd0-d3a5-47ae-88c5-20cf0e44dc30\",\"w\":24,\"x\":0,\"y\":0},\"panelIndex\":\"e9186fd0-d3a5-47ae-88c5-20cf0e44dc30\",\"title\":\"Max value over 3 measurements\",\"version\":\"7.8.0\",\"panelRefName\":\"panel_0\"},{\"embeddableConfig\":{\"title\":\"Scatter plot\"},\"gridData\":{\"h\":15,\"i\":\"89f92958-de63-4244-af53-9ef60958de41\",\"w\":24,\"x\":24,\"y\":0},\"panelIndex\":\"89f92958-de63-4244-af53-9ef60958de41\",\"title\":\"Scatter plot\",\"version\":\"7.8.0\",\"panelRefName\":\"panel_1\"},{\"embeddableConfig\":{\"title\":\"Max value over 3 measurements\"},\"gridData\":{\"h\":15,\"i\":\"87ec5dff-5c9b-4c88-b079-cbc63b4275ad\",\"w\":24,\"x\":0,\"y\":15},\"panelIndex\":\"87ec5dff-5c9b-4c88-b079-cbc63b4275ad\",\"title\":\"Max value over 3 measurements\",\"version\":\"7.8.0\",\"panelRefName\":\"panel_2\"},{\"embeddableConfig\":{\"title\":\"Scatter plot\"},\"gridData\":{\"h\":15,\"i\":\"813ff050-1ec7-48f4-82db-b63ab98e40c6\",\"w\":24,\"x\":24,\"y\":15},\"panelIndex\":\"813ff050-1ec7-48f4-82db-b63ab98e40c6\",\"title\":\"Scatter plot\",\"version\":\"7.8.0\",\"panelRefName\":\"panel_3\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":10,\"i\":\"d806469f-2ea3-4b45-99d8-acc7f09ee8f5\",\"w\":48,\"x\":0,\"y\":30},\"panelIndex\":\"d806469f-2ea3-4b45-99d8-acc7f09ee8f5\",\"version\":\"7.8.0\",\"panelRefName\":\"panel_4\"}]","timeRestore":false,"title":"Synthesis Max Throughput - NDR (0.001% loss ratio)","version":1},"id":"46874a00-e2b9-11ea-bdc0-1fe1db0b9cb6","migrationVersion":{"dashboard":"7.3.0"},"references":[{"id":"23b0eb40-e60a-11ea-bdc0-1fe1db0b9cb6","name":"panel_0","type":"visualization"},{"id":"82fc8690-e77c-11ea-bb67-9b8ce9c25c00","name":"panel_1","type":"visualization"},{"id":"1b471fa0-e6b0-11ea-bdc0-1fe1db0b9cb6","name":"panel_2","type":"visualization"},{"id":"51110c20-e879-11ea-9fcb-3bb6d0d175f6","name":"panel_3","type":"visualization"},{"id":"0d2c4070-e6e3-11ea-a933-05dd8fc4d76f","name":"panel_4","type":"visualization"}],"type":"dashboard","updated_at":"2020-10-06T12:46:24.279Z","version":"WzE2MzEsMTJd"}
+{"attributes":{"buildNum":16588,"defaultIndex":"39955f20-78ac-11ea-ae77-8339e5fd808c"},"id":"6.2.2","references":[],"type":"config","updated_at":"2020-07-21T08:47:10.197Z","version":"WzYsMV0="}
+{"attributes":{"buildNum":20352,"defaultIndex":"39955f20-78ac-11ea-ae77-8339e5fd808c"},"id":"6.8.0","references":[],"type":"config","updated_at":"2020-07-30T15:12:33.985Z","version":"WzE4LDFd"}
+{"attributes":{"buildNum":31997,"defaultIndex":"e0939790-e78f-11ea-8ca2-35af0cc4217c"},"id":"7.8.0","references":[],"type":"config","updated_at":"2020-08-27T09:31:50.697Z","version":"Wzc5MCw0XQ=="}
+{"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[{\"$state\":{\"store\":\"appState\"},\"exists\":{\"field\":\"theoretical_tx_rate_bps\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"theoretical_tx_rate_bps\",\"negate\":false,\"type\":\"exists\",\"value\":\"exists\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"}}]}"},"title":"[NDR] Capacity in Gbps with theoretical max rate - Line chart","uiStateJSON":"{}","version":1,"visState":"{\"type\":\"vega\",\"aggs\":[],\"params\":{\"spec\":\"{\\n $schema: https: //vega.github.io/schema/vega-lite/v2.json\\n title: \\\"Capacity in Gbps - 0,001% loss ratio\\\"\\n data: {\\n url: {\\n %context%: true\\n %timefield%: \\\"@timestamp\\\"\\n index: resu*\\n body: {\\n _source: [\\\"@timestamp\\\", \\\"_source\\\", \\\"offered_tx_rate_bps\\\", \\\"theoretical_tx_rate_bps\\\", \\\"flow_count\\\", \\\"frame_size\\\", \\\"user_label\\\"]\\n },\\n size: 10000\\n },\\n format: { property: \\\"hits.hits\\\" }\\n },\\n transform: [\\n { calculate: \\\"datum._source['offered_tx_rate_bps'] / 1000000000\\\" as: \\\"offered_load_gbps\\\"},\\n { calculate: \\\"datum._source['theoretical_tx_rate_bps'] / 1000000000\\\" as: \\\"theoretical_tx_rate_bps\\\"},\\n { calculate: \\\"datum._source['flow_count']\\\" as: \\\"flow_count\\\"},\\n { calculate: \\\"isNaN(toNumber(datum._source['frame_size'])) ? 362 : toNumber(datum._source['frame_size'])\\\" as: \\\"frame_size\\\"},\\n { calculate: \\\"datum._source['user_label'] + '-' + datum._source['flow_count']\\\" as: \\\"label\\\"}\\n { aggregate: [{op: \\\"max\\\", field: \\\"offered_load_gbps\\\", as: \\\"max_offered_load_gbps\\\"}, {op: \\\"max\\\", field: \\\"theoretical_tx_rate_bps\\\", as: \\\"theoretical_tx_rate_bps\\\"}], groupby: [\\\"frame_size\\\", \\\"label\\\",\\\"flow_count\\\"]}\\n ],\\n center: true,\\n hconcat: [\\n {\\n width:10,\\n selection: {\\n legendSel: {\\n type: \\\"multi\\\",\\n encodings: [ \\\"color\\\", \\\"shape\\\" ],\\n toggle: \\\"event.shiftKey\\\"\\n }\\n },\\n encoding: {\\n y: {\\n field: \\\"label\\\",\\n type: \\\"nominal\\\",\\n axis: {\\n title: \\\"\\\",\\n domain: false,\\n ticks: false,\\n offset: 10\\n },\\n },\\n color: {\\n condition: {\\n selection: \\\"legendSel\\\",\\n field: \\\"label\\\",\\n type: \\\"nominal\\\",\\n legend: null\\n },\\n value: \\\"lightgrey\\\"\\n }\\n },\\n mark: {\\n type: \\\"square\\\",\\n size: 120,\\n opacity: 1\\n }\\n },\\n {\\n layer: [\\n {\\n mark: {\\n type: \\\"line\\\",\\n tooltip: true,\\n point: true\\n },\\n encoding: {\\n x: { field: \\\"frame_size\\\", type: \\\"quantitative\\\", title: \\\"Frame size (bytes)\\\", axis: {offset: 10} }\\n y: { field: \\\"theoretical_tx_rate_bps\\\", type: \\\"quantitative\\\", title: \\\"Theoretical rate (Gbps)\\\" , axis: {offset: 10} }\\n strokeDash: {\\\"field\\\": \\\"theoretical_tx_rate_bps\\\", \\\"type\\\": \\\"nominal\\\"}\\n tooltip: [{\\\"field\\\": \\\"theoretical_tx_rate_bps\\\", \\\"type\\\": \\\"quantitative\\\", title: \\\"theoretical max capacity\\\"}],\\n color: { \\\"value\\\": \\\"red\\\"}\\n }\\n },\\n {\\n width:500,\\n height:280,\\n transform: [\\n {filter: { selection: \\\"legendSel\\\"}}\\n ],\\n mark: {\\n type: \\\"line\\\",\\n tooltip: true,\\n point: true\\n },\\n selection: {\\n grid: {\\n type: \\\"interval\\\",\\n resolve: \\\"global\\\",\\n bind: \\\"scales\\\",\\n translate: \\\"[mousedown[!event.shiftKey], window:mouseup] > window:mousemove!\\\",\\n zoom: \\\"wheel![!event.shiftKey]\\\"\\n },\\n pts: {\\n type: \\\"single\\\",\\n fields: [\\\"Label\\\"]\\n }\\n },\\n encoding: {\\n x: { field: \\\"frame_size\\\", type: \\\"quantitative\\\", title: \\\"Frame size (bytes)\\\", axis: {offset: 10} }\\n y: { field: \\\"max_offered_load_gbps\\\", type: \\\"quantitative\\\", title: \\\"Offered load (Gbps)\\\" , axis: {offset: 10} }\\n color: {field: \\\"label\\\", \\\"type\\\": \\\"nominal\\\",\\n \\\"legend\\\": null}\\n shape: {field: \\\"flow_count\\\", type: \\\"nominal\\\"}\\n tooltip: {\\\"field\\\": \\\"max_offered_load_gbps\\\", \\\"type\\\": \\\"quantitative\\\"}\\n }\\n }\\n ]\\n }\\n ]\\n}\"},\"title\":\"[NDR] Capacity in Gbps with theoretical max rate - Line chart\"}"},"id":"966a5990-0712-11eb-92f0-3518df6b43ff","migrationVersion":{"visualization":"7.8.0"},"references":[{"id":"e0939790-e78f-11ea-8ca2-35af0cc4217c","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index","type":"index-pattern"}],"type":"visualization","updated_at":"2020-10-06T12:34:38.736Z","version":"WzE1OTIsMTJd"}
+{"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\",\"filter\":[{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"type.keyword\",\"negate\":true,\"params\":{\"query\":\"single_run\"},\"type\":\"phrase\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"},\"query\":{\"match_phrase\":{\"type.keyword\":\"single_run\"}}},{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"frame_size\",\"negate\":true,\"params\":{\"query\":\"IMIX\"},\"type\":\"phrase\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[1].meta.index\"},\"query\":{\"match_phrase\":{\"frame_size\":\"IMIX\"}}}]}"},"title":"[NDR] Capacity in Gbps - bar chart","uiStateJSON":"{}","version":1,"visState":"{\"type\":\"histogram\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"max\",\"schema\":\"metric\",\"params\":{\"field\":\"rate_bps\",\"customLabel\":\"Offered load (Gbps)\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"segment\",\"params\":{\"field\":\"frame_size_int\",\"orderBy\":\"_key\",\"order\":\"asc\",\"size\":50,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"Frame size (bytes)\"}},{\"id\":\"3\",\"enabled\":true,\"type\":\"significant_terms\",\"schema\":\"group\",\"params\":{\"field\":\"user_label.keyword\",\"size\":10,\"customLabel\":\"Label\"}},{\"id\":\"4\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"group\",\"params\":{\"field\":\"flow_count\",\"orderBy\":\"_key\",\"order\":\"desc\",\"size\":5,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\"}}],\"params\":{\"type\":\"histogram\",\"grid\":{\"categoryLines\":false},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"filter\":true,\"truncate\":100,\"rotate\":0},\"title\":{}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\",\"setYExtents\":false},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"Offered load (Gbps)\"}}],\"seriesParams\":[{\"show\":true,\"type\":\"histogram\",\"mode\":\"normal\",\"data\":{\"label\":\"Offered load (Gbps)\",\"id\":\"1\"},\"valueAxis\":\"ValueAxis-1\",\"drawLinesBetweenPoints\":true,\"lineWidth\":2,\"showCircles\":true}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":false,\"labels\":{\"show\":false},\"thresholdLine\":{\"show\":false,\"value\":10,\"width\":1,\"style\":\"full\",\"color\":\"#E7664C\"}},\"title\":\"[NDR] Capacity in Gbps - bar chart\"}"},"id":"8c87f800-edeb-11ea-a706-3fce679b2102","migrationVersion":{"visualization":"7.8.0"},"references":[{"id":"e0939790-e78f-11ea-8ca2-35af0cc4217c","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"},{"id":"e0939790-e78f-11ea-8ca2-35af0cc4217c","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index","type":"index-pattern"},{"id":"e0939790-e78f-11ea-8ca2-35af0cc4217c","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[1].meta.index","type":"index-pattern"}],"type":"visualization","updated_at":"2020-09-10T12:50:59.005Z","version":"WzEzNjIsOF0="}
+{"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\",\"filter\":[{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"type.keyword\",\"negate\":true,\"params\":{\"query\":\"single_run\"},\"type\":\"phrase\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"},\"query\":{\"match_phrase\":{\"type.keyword\":\"single_run\"}}},{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"frame_size\",\"negate\":true,\"params\":{\"query\":\"IMIX\"},\"type\":\"phrase\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[1].meta.index\"},\"query\":{\"match_phrase\":{\"frame_size\":\"IMIX\"}}}]}"},"title":"[NDR] Capacity in Mpps - bar chart","uiStateJSON":"{}","version":1,"visState":"{\"type\":\"histogram\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"max\",\"schema\":\"metric\",\"params\":{\"field\":\"rate_pps\",\"customLabel\":\"Offered load (Mpps)\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"segment\",\"params\":{\"field\":\"frame_size_int\",\"orderBy\":\"_key\",\"order\":\"asc\",\"size\":50,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"Frame size (bytes)\"}},{\"id\":\"3\",\"enabled\":true,\"type\":\"significant_terms\",\"schema\":\"group\",\"params\":{\"field\":\"user_label.keyword\",\"size\":10,\"customLabel\":\"Label\"}},{\"id\":\"4\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"group\",\"params\":{\"field\":\"flow_count\",\"orderBy\":\"_key\",\"order\":\"desc\",\"size\":5,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\"}}],\"params\":{\"type\":\"histogram\",\"grid\":{\"categoryLines\":true,\"valueAxis\":\"ValueAxis-1\"},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"filter\":true,\"truncate\":100,\"rotate\":0},\"title\":{}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\",\"setYExtents\":false},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"Offered load (Mpps)\"}}],\"seriesParams\":[{\"show\":true,\"type\":\"histogram\",\"mode\":\"normal\",\"data\":{\"label\":\"Offered load (Mpps)\",\"id\":\"1\"},\"valueAxis\":\"ValueAxis-1\",\"drawLinesBetweenPoints\":true,\"lineWidth\":2,\"showCircles\":true}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":false,\"labels\":{\"show\":false},\"thresholdLine\":{\"show\":false,\"value\":20,\"width\":1,\"style\":\"full\",\"color\":\"#E7664C\"}},\"title\":\"[NDR] Capacity in Mpps - bar chart\"}"},"id":"8c14a8b0-e6d8-11ea-a933-05dd8fc4d76f","migrationVersion":{"visualization":"7.8.0"},"references":[{"id":"e0939790-e78f-11ea-8ca2-35af0cc4217c","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"},{"id":"e0939790-e78f-11ea-8ca2-35af0cc4217c","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index","type":"index-pattern"},{"id":"e0939790-e78f-11ea-8ca2-35af0cc4217c","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[1].meta.index","type":"index-pattern"}],"type":"visualization","updated_at":"2020-09-10T12:51:33.492Z","version":"WzEzNjQsOF0="}
+{"attributes":{"description":"NDR / PDR line chart - in Mpps","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"type.keyword\",\"negate\":true,\"params\":{\"query\":\"single_run\"},\"type\":\"phrase\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"},\"query\":{\"match_phrase\":{\"type.keyword\":\"single_run\"}}},{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"frame_size\",\"negate\":true,\"params\":{\"query\":\"IMIX\"},\"type\":\"phrase\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[1].meta.index\"},\"query\":{\"match_phrase\":{\"frame_size\":\"IMIX\"}}},{\"$state\":{\"store\":\"appState\"},\"exists\":{\"field\":\"theoretical_tx_rate_pps\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"theoretical_tx_rate_pps\",\"negate\":false,\"type\":\"exists\",\"value\":\"exists\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[2].meta.index\"}}]}"},"title":"[NDR] Capacity in Mpps with theoretical max rate - Line chart","uiStateJSON":"{}","version":1,"visState":"{\"type\":\"vega\",\"aggs\":[],\"params\":{\"spec\":\"{\\n $schema: https: //vega.github.io/schema/vega-lite/v2.json\\n title: \\\"Capacity in Mpps - 0,001% loss ratio\\\"\\n data: {\\n url: {\\n %context%: true\\n %timefield%: \\\"@timestamp\\\"\\n index: resu*\\n body: {\\n _source: [\\\"@timestamp\\\", \\\"_source\\\", \\\"theoretical_tx_rate_pps\\\", \\\"rate_pps\\\", \\\"flow_count\\\", \\\"frame_size\\\", \\\"user_label\\\", \\\"type\\\"]\\n },\\n size: 10000\\n },\\n format: { property: \\\"hits.hits\\\" }\\n },\\n\\n transform: [\\n { calculate: \\\"datum._source['rate_pps'] / 1000000\\\" as: \\\"offered_load_pps\\\"},\\n { calculate: \\\"datum._source['theoretical_tx_rate_pps'] / 1000000\\\" as: \\\"theoretical_tx_rate_pps\\\"},\\n { calculate: \\\"datum._source['flow_count']\\\" as: \\\"flow_count\\\"},\\n { calculate: \\\"isNaN(toNumber(datum._source['frame_size'])) ? 362 : toNumber(datum._source['frame_size'])\\\" as: \\\"frame_size\\\"},\\n { calculate: \\\"datum._source['user_label'] + '-' + datum._source['flow_count']\\\" as: \\\"label\\\"}\\n { aggregate: [{op: \\\"max\\\", field: \\\"offered_load_pps\\\", as: \\\"max_offered_load_pps\\\"}, {op: \\\"max\\\", field: \\\"theoretical_tx_rate_pps\\\", as: \\\"theoretical_tx_rate_pps\\\"}], groupby: [\\\"frame_size\\\", \\\"label\\\",\\\"flow_count\\\"]}\\n \\n ],\\n center: true,\\n hconcat: [\\n {\\n width:10,\\n selection: {\\n legendSel: {\\n type: \\\"multi\\\",\\n encodings: [ \\\"color\\\", \\\"shape\\\" ],\\n toggle: \\\"event.shiftKey\\\"\\n }\\n },\\n encoding: {\\n y: {\\n field: \\\"label\\\",\\n type: \\\"nominal\\\",\\n axis: {\\n title: \\\"\\\",\\n domain: false,\\n ticks: false,\\n offset: 10\\n },\\n },\\n color: {\\n condition: {\\n selection: \\\"legendSel\\\",\\n field: \\\"label\\\",\\n type: \\\"nominal\\\",\\n legend: null\\n },\\n value: \\\"lightgrey\\\"\\n }\\n },\\n mark: {\\n type: \\\"square\\\",\\n size: 120,\\n opacity: 1\\n }\\n },\\n {\\n layer: [{\\n mark: {\\n type: \\\"line\\\",\\n tooltip: true,\\n point: true\\n },\\n encoding: {\\n x: { field: \\\"frame_size\\\", type: \\\"quantitative\\\", title: \\\"Frame size (bytes)\\\", axis: {offset: 10} }\\n y: { field: \\\"theoretical_tx_rate_pps\\\", type: \\\"quantitative\\\", title: \\\"Offered load (Mpps)\\\" , axis: {offset: 10} }\\n strokeDash: {\\\"field\\\": \\\"theoretical_tx_rate_pps\\\", \\\"type\\\": \\\"nominal\\\"}\\n tooltip: [{\\\"field\\\": \\\"theoretical_tx_rate_pps\\\", \\\"type\\\": \\\"quantitative\\\", title: \\\"theoretical max capacity\\\"}],\\n color: { \\\"value\\\": \\\"red\\\"}\\n }\\n },{\\n width:500,\\n height:280,\\n transform: [\\n {filter: { selection: \\\"legendSel\\\"}}\\n \\n ],mark: {\\n type: \\\"line\\\",\\n tooltip: true,\\n point: true\\n },\\n selection: {\\n grid: {\\n type: \\\"interval\\\",\\n resolve: \\\"global\\\",\\n bind: \\\"scales\\\",\\n translate: \\\"[mousedown[!event.shiftKey], window:mouseup] > window:mousemove!\\\",\\n zoom: \\\"wheel![!event.shiftKey]\\\"\\n },\\n pts: {\\n type: \\\"single\\\",\\n fields: [\\\"Label\\\"]\\n }\\n },\\n encoding: {\\n x: { field: \\\"frame_size\\\", type: \\\"quantitative\\\", title: \\\"Frame size (bytes)\\\", axis: {offset: 10} }\\n y: { field: \\\"max_offered_load_pps\\\", type: \\\"quantitative\\\", title: \\\"Offered load (Mpps)\\\" , axis: {offset: 10} }\\n color: {field: \\\"label\\\", \\\"type\\\": \\\"nominal\\\",\\n \\\"legend\\\": null}\\n tooltip: {\\\"field\\\": \\\"max_offered_load_pps\\\", \\\"type\\\": \\\"quantitative\\\"},\\n shape: {field: \\\"flow_count\\\", type: \\\"nominal\\\"}\\n }\\n }\\n ]\\n }\\n \\n ]\\n}\"},\"title\":\"[NDR] Capacity in Mpps with theoretical max rate - Line chart\"}"},"id":"a523c930-07d0-11eb-92f0-3518df6b43ff","migrationVersion":{"visualization":"7.8.0"},"references":[{"id":"e0939790-e78f-11ea-8ca2-35af0cc4217c","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index","type":"index-pattern"},{"id":"e0939790-e78f-11ea-8ca2-35af0cc4217c","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[1].meta.index","type":"index-pattern"},{"id":"e0939790-e78f-11ea-8ca2-35af0cc4217c","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[2].meta.index","type":"index-pattern"}],"type":"visualization","updated_at":"2020-10-06T12:37:07.011Z","version":"WzE1OTgsMTJd"}
+{"attributes":{"description":"","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"language\":\"kuery\",\"query\":\"\"},\"filter\":[]}"},"optionsJSON":"{\"hidePanelTitles\":false,\"useMargins\":true}","panelsJSON":"[{\"version\":\"7.8.0\",\"gridData\":{\"h\":15,\"i\":\"c6f77fa7-0493-4ef6-b995-9250039f26e0\",\"w\":24,\"x\":0,\"y\":0},\"panelIndex\":\"c6f77fa7-0493-4ef6-b995-9250039f26e0\",\"embeddableConfig\":{},\"panelRefName\":\"panel_0\"},{\"version\":\"7.8.0\",\"gridData\":{\"h\":15,\"i\":\"0b349901-c6f5-4a35-ad44-5331d75ceb8c\",\"w\":24,\"x\":24,\"y\":0},\"panelIndex\":\"0b349901-c6f5-4a35-ad44-5331d75ceb8c\",\"embeddableConfig\":{},\"panelRefName\":\"panel_1\"},{\"version\":\"7.8.0\",\"gridData\":{\"h\":15,\"i\":\"e7f9f670-3866-4795-a83e-3b208990262d\",\"w\":24,\"x\":24,\"y\":15},\"panelIndex\":\"e7f9f670-3866-4795-a83e-3b208990262d\",\"embeddableConfig\":{},\"panelRefName\":\"panel_2\"},{\"version\":\"7.8.0\",\"gridData\":{\"h\":16,\"i\":\"7ad18ce1-1916-4d5b-abe8-340571feb151\",\"w\":48,\"x\":0,\"y\":30},\"panelIndex\":\"7ad18ce1-1916-4d5b-abe8-340571feb151\",\"embeddableConfig\":{},\"panelRefName\":\"panel_3\"},{\"version\":\"7.8.0\",\"gridData\":{\"x\":0,\"y\":15,\"w\":24,\"h\":15,\"i\":\"29117e66-cb29-43fc-ba6f-5f61d356a236\"},\"panelIndex\":\"29117e66-cb29-43fc-ba6f-5f61d356a236\",\"embeddableConfig\":{},\"panelRefName\":\"panel_4\"}]","timeRestore":false,"title":"Comparison synthesis dashboard with max theoretical value","version":1},"id":"81cf0e70-070a-11eb-92f0-3518df6b43ff","migrationVersion":{"dashboard":"7.3.0"},"references":[{"id":"966a5990-0712-11eb-92f0-3518df6b43ff","name":"panel_0","type":"visualization"},{"id":"8c87f800-edeb-11ea-a706-3fce679b2102","name":"panel_1","type":"visualization"},{"id":"8c14a8b0-e6d8-11ea-a933-05dd8fc4d76f","name":"panel_2","type":"visualization"},{"id":"38cecb10-eded-11ea-a706-3fce679b2102","name":"panel_3","type":"visualization"},{"id":"a523c930-07d0-11eb-92f0-3518df6b43ff","name":"panel_4","type":"visualization"}],"type":"dashboard","updated_at":"2020-10-06T12:37:58.211Z","version":"WzE2MDIsMTJd"}
+{"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\",\"filter\":[{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"type.keyword\",\"negate\":true,\"params\":{\"query\":\"single_run\"},\"type\":\"phrase\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"},\"query\":{\"match_phrase\":{\"type.keyword\":\"single_run\"}}}]}"},"title":"IMIX KPI","uiStateJSON":"{}","version":1,"visState":"{\"type\":\"metric\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"max\",\"schema\":\"metric\",\"params\":{\"field\":\"rate_bps\",\"customLabel\":\"IMIX Offered load (Mbps)\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"significant_terms\",\"schema\":\"group\",\"params\":{\"field\":\"user_label.keyword\",\"size\":10,\"customLabel\":\"label\"}}],\"params\":{\"addTooltip\":true,\"addLegend\":false,\"type\":\"metric\",\"metric\":{\"percentageMode\":false,\"useRanges\":false,\"colorSchema\":\"Green to Red\",\"metricColorMode\":\"None\",\"colorsRange\":[{\"from\":0,\"to\":10000}],\"labels\":{\"show\":true},\"invertColors\":false,\"style\":{\"bgFill\":\"#000\",\"bgColor\":false,\"labelColor\":false,\"subText\":\"\",\"fontSize\":60}}},\"title\":\"IMIX KPI\"}"},"id":"83434d80-e882-11ea-9fcb-3bb6d0d175f6","migrationVersion":{"visualization":"7.8.0"},"references":[{"id":"e0939790-e78f-11ea-8ca2-35af0cc4217c","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"},{"id":"e0939790-e78f-11ea-8ca2-35af0cc4217c","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index","type":"index-pattern"}],"type":"visualization","updated_at":"2020-08-27T16:29:43.383Z","version":"Wzk4Miw0XQ=="}
+{"attributes":{"description":"NDR / PDR scatter plot - in Mpps","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"language\":\"kuery\",\"query\":\"\"},\"filter\":[{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"type.keyword\",\"negate\":true,\"params\":{\"query\":\"single_run\"},\"type\":\"phrase\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"},\"query\":{\"match_phrase\":{\"type.keyword\":\"single_run\"}}},{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"frame_size\",\"negate\":true,\"params\":{\"query\":\"IMIX\"},\"type\":\"phrase\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[1].meta.index\"},\"query\":{\"match_phrase\":{\"frame_size\":\"IMIX\"}}},{\"$state\":{\"store\":\"appState\"},\"exists\":{\"field\":\"theoretical_tx_rate_pps\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"theoretical_tx_rate_pps\",\"negate\":false,\"type\":\"exists\",\"value\":\"exists\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[2].meta.index\"}}]}"},"title":"[NDR] Capacity in Mpps with theoretical max rate - Scatter plot","uiStateJSON":"{}","version":1,"visState":"{\"aggs\":[],\"params\":{\"spec\":\"{\\n $schema: \\\"https://vega.github.io/schema/vega-lite/v2.json\\\"\\n title: \\\"Capacity in Mpps - 0,001% loss ratio\\\"\\n data: {\\n url: {\\n %context%: true\\n %timefield%: \\\"@timestamp\\\"\\n index: resu*\\n body: {\\n _source: [\\\"@timestamp\\\", \\\"_source\\\", \\\"rate_pps\\\", \\\"theoretical_tx_rate_pps\\\", \\\"flow_count\\\", \\\"frame_size\\\", \\\"user_label\\\"]\\n },\\n size: 10000\\n },\\n format: { property: \\\"hits.hits\\\" }\\n },\\n transform: [\\n { calculate: \\\"datum._source['rate_pps'] / 1000000\\\" as: \\\"rate_pps\\\"},\\n { calculate: \\\"datum._source['theoretical_tx_rate_pps'] / 1000000\\\" as: \\\"theoretical_tx_rate_pps\\\"},\\n { calculate: \\\"datum._source['flow_count']\\\" as: \\\"flow_count\\\"},\\n { calculate: \\\"isNaN(toNumber(datum._source['frame_size'])) ? 362 : toNumber(datum._source['frame_size'])\\\" as: \\\"frame_size\\\"}\\n { calculate: \\\"datum._source['user_label'] + '-' + datum._source['flow_count']\\\" as: \\\"label\\\"}\\n ],\\n center: true,\\n hconcat: [\\n {\\n width:10,\\n selection: {\\n legendSel: {\\n type: \\\"multi\\\",\\n encodings: [ \\\"color\\\", \\\"shape\\\" ],\\n toggle: \\\"event.shiftKey\\\"\\n }\\n },\\n encoding: {\\n y: {\\n field: \\\"label\\\",\\n type: \\\"nominal\\\",\\n axis: {\\n title: \\\"\\\",\\n domain: false,\\n ticks: false,\\n offset: 10\\n },\\n },\\n color: {\\n condition: {\\n selection: \\\"legendSel\\\",\\n field: \\\"label\\\",\\n type: \\\"nominal\\\",\\n legend: null\\n },\\n value: \\\"lightgrey\\\"\\n }\\n },\\n mark: {\\n type: \\\"square\\\",\\n size: 120,\\n opacity: 1\\n }\\n },\\n {\\n layer: [\\n {\\n mark: {\\n type: \\\"line\\\",\\n tooltip: true\\n },\\n encoding: {\\n x: { field: \\\"frame_size\\\", type: \\\"quantitative\\\", title: \\\"Frame size (bytes)\\\", axis: {offset: 10} }\\n y: { field: \\\"theoretical_tx_rate_pps\\\", type: \\\"quantitative\\\", title: \\\"Offered load (Mpps)\\\" , axis: {offset: 10} }\\n strokeDash: {\\\"field\\\": \\\"theoretical_tx_rate_pps\\\", \\\"type\\\": \\\"nominal\\\"}\\n tooltip: [{\\\"field\\\": \\\"theoretical_tx_rate_pps\\\", \\\"type\\\": \\\"quantitative\\\", title: \\\"theoretical max capacity\\\"}],\\n color: { \\\"value\\\": \\\"red\\\"}\\n }\\n },\\n {\\n width:500,\\n height:280,\\n transform: [\\n {filter: { selection: \\\"legendSel\\\"}}\\n ],\\n mark: {\\n \\\"type\\\": \\\"point\\\",\\n \\\"tooltip\\\": true\\n },\\n selection: {\\n grid: {\\n type: \\\"interval\\\",\\n resolve: \\\"global\\\",\\n bind: \\\"scales\\\",\\n translate: \\\"[mousedown[!event.shiftKey], window:mouseup] > window:mousemove!\\\",\\n zoom: \\\"wheel![!event.shiftKey]\\\"\\n },\\n pts: {\\n type: \\\"single\\\",\\n fields: [\\\"label\\\"]\\n }\\n },\\n encoding: {\\n x: {\\n field: \\\"frame_size\\\",\\n title: \\\"Frame size (bytes)\\\",\\n type: \\\"quantitative\\\"\\n }\\n y: {\\n field: \\\"rate_pps\\\",\\n title: \\\"Offered load (Mpps)\\\",\\n type: \\\"quantitative\\\"\\n }\\n color: {\\n field: \\\"label\\\", \\\"type\\\": \\\"nominal\\\",\\n \\\"legend\\\": null\\n }\\n shape: {\\n field: \\\"flow_count\\\",\\n type: \\\"nominal\\\"\\n }\\n tooltip: {\\n \\\"field\\\": \\\"rate_pps\\\",\\n \\\"title\\\": \\\"Offered load (Mpps)\\\",\\n \\\"type\\\": \\\"quantitative\\\"\\n }\\n }\\n }\\n ]\\n }\\n ]\\n}\"},\"title\":\"[NDR] Capacity in Mpps with theoretical max rate - Scatter plot\",\"type\":\"vega\"}"},"id":"8eb9cd00-07d2-11eb-92f0-3518df6b43ff","migrationVersion":{"visualization":"7.8.0"},"references":[{"id":"e0939790-e78f-11ea-8ca2-35af0cc4217c","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index","type":"index-pattern"},{"id":"e0939790-e78f-11ea-8ca2-35af0cc4217c","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[1].meta.index","type":"index-pattern"},{"id":"e0939790-e78f-11ea-8ca2-35af0cc4217c","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[2].meta.index","type":"index-pattern"}],"type":"visualization","updated_at":"2020-10-06T12:50:53.215Z","version":"WzE2NDksMTJd"}
+{"attributes":{"description":"","filters":[],"query":{"language":"kuery","query":"flow_count:128 or flow_count:2"},"title":"KQL - flow count"},"id":"KQL - flow count","references":[],"type":"query","updated_at":"2020-09-03T14:05:36.549Z","version":"WzExMjcsNV0="}
+{"attributes":{"description":"","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"language\":\"kuery\",\"query\":\"\"},\"filter\":[]}"},"optionsJSON":"{\"hidePanelTitles\":false,\"useMargins\":true}","panelsJSON":"[{\"version\":\"7.8.0\",\"gridData\":{\"h\":15,\"i\":\"885a2773-bf7e-4c93-a746-dd400ad3b25f\",\"w\":24,\"x\":0,\"y\":0},\"panelIndex\":\"885a2773-bf7e-4c93-a746-dd400ad3b25f\",\"embeddableConfig\":{},\"panelRefName\":\"panel_0\"},{\"version\":\"7.8.0\",\"gridData\":{\"h\":15,\"i\":\"e7f9f670-3866-4795-a83e-3b208990262d\",\"w\":24,\"x\":24,\"y\":15},\"panelIndex\":\"e7f9f670-3866-4795-a83e-3b208990262d\",\"embeddableConfig\":{},\"panelRefName\":\"panel_1\"},{\"version\":\"7.8.0\",\"gridData\":{\"h\":15,\"i\":\"0b349901-c6f5-4a35-ad44-5331d75ceb8c\",\"w\":24,\"x\":24,\"y\":0},\"panelIndex\":\"0b349901-c6f5-4a35-ad44-5331d75ceb8c\",\"embeddableConfig\":{},\"panelRefName\":\"panel_2\"},{\"version\":\"7.8.0\",\"gridData\":{\"x\":0,\"y\":30,\"w\":48,\"h\":16,\"i\":\"7ad18ce1-1916-4d5b-abe8-340571feb151\"},\"panelIndex\":\"7ad18ce1-1916-4d5b-abe8-340571feb151\",\"embeddableConfig\":{},\"panelRefName\":\"panel_3\"},{\"version\":\"7.8.0\",\"gridData\":{\"x\":0,\"y\":15,\"w\":24,\"h\":15,\"i\":\"631f6738-69c3-4637-b9cb-82d2a8cc1fae\"},\"panelIndex\":\"631f6738-69c3-4637-b9cb-82d2a8cc1fae\",\"embeddableConfig\":{},\"panelRefName\":\"panel_4\"}]","timeRestore":false,"title":"Comparison synthesis dashboard","version":1},"id":"c24f4c50-e778-11ea-bb67-9b8ce9c25c00","migrationVersion":{"dashboard":"7.3.0"},"references":[{"id":"23b0eb40-e60a-11ea-bdc0-1fe1db0b9cb6","name":"panel_0","type":"visualization"},{"id":"8c14a8b0-e6d8-11ea-a933-05dd8fc4d76f","name":"panel_1","type":"visualization"},{"id":"8c87f800-edeb-11ea-a706-3fce679b2102","name":"panel_2","type":"visualization"},{"id":"38cecb10-eded-11ea-a706-3fce679b2102","name":"panel_3","type":"visualization"},{"id":"1b471fa0-e6b0-11ea-bdc0-1fe1db0b9cb6","name":"panel_4","type":"visualization"}],"type":"dashboard","updated_at":"2020-09-03T15:32:16.951Z","version":"WzExODYsNV0="}
+{"attributes":{"description":"NDR / PDR scatter plot - in Gbps","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"language\":\"kuery\",\"query\":\"\"},\"filter\":[{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"type.keyword\",\"negate\":true,\"params\":{\"query\":\"single_run\"},\"type\":\"phrase\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"},\"query\":{\"match_phrase\":{\"type.keyword\":\"single_run\"}}},{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"frame_size\",\"negate\":true,\"params\":{\"query\":\"IMIX\"},\"type\":\"phrase\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[1].meta.index\"},\"query\":{\"match_phrase\":{\"frame_size\":\"IMIX\"}}},{\"$state\":{\"store\":\"appState\"},\"exists\":{\"field\":\"theoretical_tx_rate_bps\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"theoretical_tx_rate_bps\",\"negate\":false,\"type\":\"exists\",\"value\":\"exists\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[2].meta.index\"}}]}"},"title":"[NDR] Capacity in Gbps with theoretical max value - Scatter plot","uiStateJSON":"{}","version":1,"visState":"{\"type\":\"vega\",\"aggs\":[],\"params\":{\"spec\":\"{\\n $schema: \\\"https://vega.github.io/schema/vega-lite/v2.json\\\"\\n title: \\\"Capacity in Gbps - 0,001% loss ratio\\\"\\n data: {\\n url: {\\n %context%: true\\n %timefield%: \\\"@timestamp\\\"\\n index: resu*\\n body: {\\n _source: [\\\"@timestamp\\\", \\\"_source\\\", \\\"offered_tx_rate_bps\\\", \\\"theoretical_tx_rate_bps\\\", \\\"flow_count\\\", \\\"frame_size\\\", \\\"user_label\\\"]\\n },\\n size: 10000\\n },\\n format: { property: \\\"hits.hits\\\" }\\n },\\n transform: [\\n { calculate: \\\"datum._source['offered_tx_rate_bps'] / 1000000000\\\" as: \\\"offered_tx_rate_bps\\\"},\\n { calculate: \\\"datum._source['theoretical_tx_rate_bps'] / 1000000000\\\" as: \\\"theoretical_tx_rate_bps\\\"},\\n { calculate: \\\"datum._source['flow_count']\\\" as: \\\"flow_count\\\"},\\n { calculate: \\\"isNaN(toNumber(datum._source['frame_size'])) ? 362 : toNumber(datum._source['frame_size'])\\\" as: \\\"frame_size\\\"}\\n { calculate: \\\"datum._source['user_label'] + '-' + datum._source['flow_count']\\\" as: \\\"label\\\"}\\n ],\\n center: true,\\n hconcat: [\\n {\\n width:10,\\n selection: {\\n legendSel: {\\n type: \\\"multi\\\",\\n encodings: [ \\\"color\\\", \\\"shape\\\" ],\\n toggle: \\\"event.shiftKey\\\"\\n }\\n },\\n encoding: {\\n y: {\\n field: \\\"label\\\",\\n type: \\\"nominal\\\",\\n axis: {\\n title: \\\"\\\",\\n domain: false,\\n ticks: false,\\n offset: 10\\n },\\n },\\n color: {\\n condition: {\\n selection: \\\"legendSel\\\",\\n field: \\\"label\\\",\\n type: \\\"nominal\\\",\\n legend: null\\n },\\n value: \\\"lightgrey\\\"\\n }\\n },\\n mark: {\\n type: \\\"square\\\",\\n size: 120,\\n opacity: 1\\n }\\n },\\n {\\n layer: [\\n {\\n mark: {\\n type: \\\"line\\\",\\n tooltip: true\\n },\\n encoding: {\\n x: { field: \\\"frame_size\\\", type: \\\"quantitative\\\", title: \\\"Frame size (bytes)\\\", axis: {offset: 10} }\\n y: { field: \\\"theoretical_tx_rate_bps\\\", type: \\\"quantitative\\\", title: \\\"Offered load (Gbps)\\\" , axis: {offset: 10} }\\n strokeDash: {\\\"field\\\": \\\"theoretical_tx_rate_bps\\\", \\\"type\\\": \\\"nominal\\\"}\\n tooltip: [{\\\"field\\\": \\\"theoretical_tx_rate_bps\\\", \\\"type\\\": \\\"quantitative\\\", title: \\\"theoretical max capacity\\\"}],\\n color: { \\\"value\\\": \\\"red\\\"}\\n }\\n },\\n {\\n width:500,\\n height:280,\\n transform: [\\n {filter: { selection: \\\"legendSel\\\"}}\\n ],\\n mark: {\\n \\\"type\\\": \\\"point\\\",\\n \\\"tooltip\\\": true\\n },\\n selection: {\\n grid: {\\n type: \\\"interval\\\",\\n resolve: \\\"global\\\",\\n bind: \\\"scales\\\",\\n translate: \\\"[mousedown[!event.shiftKey], window:mouseup] > window:mousemove!\\\",\\n zoom: \\\"wheel![!event.shiftKey]\\\"\\n },\\n pts: {\\n type: \\\"single\\\",\\n fields: [\\\"label\\\"]\\n }\\n },\\n encoding: {\\n x: {\\n field: \\\"frame_size\\\",\\n title: \\\"Frame size (bytes)\\\",\\n type: \\\"quantitative\\\"\\n }\\n y: {\\n field: \\\"offered_tx_rate_bps\\\",\\n title: \\\"Offered load (Gbps)\\\",\\n type: \\\"quantitative\\\"\\n }\\n color: {\\n field: \\\"label\\\", \\\"type\\\": \\\"nominal\\\",\\n \\\"legend\\\": null\\n }\\n shape: {\\n field: \\\"flow_count\\\",\\n type: \\\"nominal\\\"\\n }\\n tooltip: {\\n \\\"field\\\": \\\"offered_tx_rate_bps\\\",\\n \\\"title\\\": \\\"Offered load (Gbps)\\\",\\n \\\"type\\\": \\\"quantitative\\\"\\n }\\n }\\n }\\n ]\\n }\\n ]\\n}\"},\"title\":\"[NDR] Capacity in Gbps with theoretical max value - Scatter plot\"}"},"id":"eea11370-f82a-11ea-8203-0fee5ecd414e","migrationVersion":{"visualization":"7.8.0"},"references":[{"id":"e0939790-e78f-11ea-8ca2-35af0cc4217c","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index","type":"index-pattern"},{"id":"e0939790-e78f-11ea-8ca2-35af0cc4217c","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[1].meta.index","type":"index-pattern"},{"id":"e0939790-e78f-11ea-8ca2-35af0cc4217c","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[2].meta.index","type":"index-pattern"}],"type":"visualization","updated_at":"2020-10-06T12:49:41.894Z","version":"WzE2NDcsMTJd"}
+{"attributes":{"description":"","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"language\":\"kuery\",\"query\":\"\"},\"filter\":[]}"},"optionsJSON":"{\"hidePanelTitles\":false,\"useMargins\":true}","panelsJSON":"[{\"version\":\"7.8.0\",\"gridData\":{\"h\":10,\"i\":\"d806469f-2ea3-4b45-99d8-acc7f09ee8f5\",\"w\":48,\"x\":0,\"y\":30},\"panelIndex\":\"d806469f-2ea3-4b45-99d8-acc7f09ee8f5\",\"embeddableConfig\":{},\"panelRefName\":\"panel_0\"},{\"version\":\"7.8.0\",\"gridData\":{\"x\":0,\"y\":0,\"w\":24,\"h\":15,\"i\":\"dfc3abc1-8fcf-486f-8b8e-fa8956a4299b\"},\"panelIndex\":\"dfc3abc1-8fcf-486f-8b8e-fa8956a4299b\",\"embeddableConfig\":{},\"panelRefName\":\"panel_1\"},{\"version\":\"7.8.0\",\"gridData\":{\"x\":24,\"y\":0,\"w\":24,\"h\":15,\"i\":\"82bcc455-a312-49dc-b9b7-7414d53cfdd5\"},\"panelIndex\":\"82bcc455-a312-49dc-b9b7-7414d53cfdd5\",\"embeddableConfig\":{},\"panelRefName\":\"panel_2\"},{\"version\":\"7.8.0\",\"gridData\":{\"x\":0,\"y\":15,\"w\":24,\"h\":15,\"i\":\"eb3a0dcc-e55a-4f0b-87e7-70b15f864bf2\"},\"panelIndex\":\"eb3a0dcc-e55a-4f0b-87e7-70b15f864bf2\",\"embeddableConfig\":{},\"panelRefName\":\"panel_3\"},{\"version\":\"7.8.0\",\"gridData\":{\"x\":24,\"y\":15,\"w\":24,\"h\":15,\"i\":\"e6c3eeb1-5a7e-4a3e-89d1-c61193f31ccf\"},\"panelIndex\":\"e6c3eeb1-5a7e-4a3e-89d1-c61193f31ccf\",\"embeddableConfig\":{},\"panelRefName\":\"panel_4\"}]","timeRestore":false,"title":"Synthesis Max Throughput - NDR (0.001% loss ratio) with max theoretical value","version":1},"id":"c61120f0-07d2-11eb-92f0-3518df6b43ff","migrationVersion":{"dashboard":"7.3.0"},"references":[{"id":"0d2c4070-e6e3-11ea-a933-05dd8fc4d76f","name":"panel_0","type":"visualization"},{"id":"966a5990-0712-11eb-92f0-3518df6b43ff","name":"panel_1","type":"visualization"},{"id":"eea11370-f82a-11ea-8203-0fee5ecd414e","name":"panel_2","type":"visualization"},{"id":"a523c930-07d0-11eb-92f0-3518df6b43ff","name":"panel_3","type":"visualization"},{"id":"8eb9cd00-07d2-11eb-92f0-3518df6b43ff","name":"panel_4","type":"visualization"}],"type":"dashboard","updated_at":"2020-10-06T12:52:55.971Z","version":"WzE2NTUsMTJd"}
+{"attributes":{"description":"","filters":[{"$state":{"store":"appState"},"meta":{"alias":null,"disabled":false,"index":"39955f20-78ac-11ea-ae77-8339e5fd808c","key":"flow_count","negate":false,"params":{"query":"2"},"type":"phrase"},"query":{"match_phrase":{"flow_count":"2"}}}],"query":{"language":"kuery","query":""},"title":"flow count 2"},"id":"flow count 2","references":[],"type":"query","updated_at":"2020-08-26T09:25:58.265Z","version":"WzY0Miw0XQ=="}
+{"attributes":{"description":"","filters":[{"$state":{"store":"appState"},"meta":{"alias":null,"disabled":false,"index":"39955f20-78ac-11ea-ae77-8339e5fd808c","key":"user_label.keyword","negate":false,"params":["oslodu_oiaas_g4r1_ovsdpdk_tc20_ndr4latency","icnfvbench_none_none_loopback_tc3"],"type":"phrases","value":"oslodu_oiaas_g4r1_ovsdpdk_tc20_ndr4latency, icnfvbench_none_none_loopback_tc3"},"query":{"bool":{"minimum_should_match":1,"should":[{"match_phrase":{"user_label.keyword":"oslodu_oiaas_g4r1_ovsdpdk_tc20_ndr4latency"}},{"match_phrase":{"user_label.keyword":"icnfvbench_none_none_loopback_tc3"}}]}}},{"$state":{"store":"appState"},"meta":{"alias":null,"disabled":false,"index":"39955f20-78ac-11ea-ae77-8339e5fd808c","key":"flow_count","negate":false,"params":["2","128"],"type":"phrases","value":"2, 128"},"query":{"bool":{"minimum_should_match":1,"should":[{"match_phrase":{"flow_count":"2"}},{"match_phrase":{"flow_count":"128"}}]}}}],"query":{"language":"kuery","query":""},"title":"test filter"},"id":"test filter","references":[],"type":"query","updated_at":"2020-08-26T13:13:10.130Z","version":"WzY3MSw0XQ=="}
+{"exportedCount":24,"missingRefCount":0,"missingReferences":[]} \ No newline at end of file
diff --git a/kibana/visualizations/ndr_capacity_gbps_line_chart.json b/kibana/visualizations/ndr_capacity_gbps_line_chart.json
new file mode 100644
index 0000000..cb696ba
--- /dev/null
+++ b/kibana/visualizations/ndr_capacity_gbps_line_chart.json
@@ -0,0 +1,95 @@
+{
+ $schema: https: //vega.github.io/schema/vega-lite/v2.json
+ title: "Capacity in Gbps - 0,001% loss ratio"
+ data: {
+ url: {
+ %context%: true
+ %timefield%: "@timestamp"
+ index: resu*
+ body: {
+ _source: ["@timestamp", "_source", "offered_tx_rate_bps", "flow_count", "frame_size", "user_label"]
+ },
+ size: 10000
+ },
+ format: { property: "hits.hits" }
+ },
+ transform: [
+ { calculate: "datum._source['offered_tx_rate_bps'] / 1000000000" as: "offered_load_gbps"},
+ { calculate: "datum._source['flow_count']" as: "flow_count"},
+ { calculate: "isNaN(toNumber(datum._source['frame_size'])) ? 362 : toNumber(datum._source['frame_size'])" as: "frame_size"},
+ { calculate: "datum._source['user_label'] + '-' + datum._source['flow_count']" as: "label"}
+ { aggregate: [{op: "max", field: "offered_load_gbps", as: "max_offered_load_gbps"}], groupby: ["frame_size", "label","flow_count"]}
+ ],
+ center: true,
+ hconcat: [
+ {
+ width:10,
+ selection: {
+ legendSel: {
+ type: "multi",
+ encodings: [ "color", "shape" ],
+ toggle: "event.shiftKey"
+ }
+ },
+ encoding: {
+ y: {
+ field: "label",
+ type: "nominal",
+ axis: {
+ title: "",
+ domain: false,
+ ticks: false,
+ offset: 10
+ },
+ },
+ color: {
+ condition: {
+ selection: "legendSel",
+ field: "label",
+ type: "nominal",
+ legend: null
+ },
+ value: "lightgrey"
+ }
+ },
+ mark: {
+ type: "square",
+ size: 120,
+ opacity: 1
+ }
+ },
+ {
+ width:500,
+ height:280,
+ transform: [
+ {filter: { selection: "legendSel"}}
+ ],
+ mark: {
+ type: "line",
+ tooltip: true,
+ point: true
+ },
+ selection: {
+ grid: {
+ type: "interval",
+ resolve: "global",
+ bind: "scales",
+ translate: "[mousedown[!event.shiftKey], window:mouseup] > window:mousemove!",
+ zoom: "wheel![!event.shiftKey]"
+ },
+ pts: {
+ type: "single",
+ fields: ["label"]
+ }
+ },
+ encoding: {
+ x: { field: "frame_size", type: "quantitative", title: "Frame size (bytes)", axis: {offset: 10} }
+ y: { field: "max_offered_load_gbps", type: "quantitative", title: "Offered load (Gbps)" , axis: {offset: 10} }
+ color: {field: "label", "type": "nominal",
+ "legend": null}
+ shape: {field: "flow_count", type: "nominal"}
+ tooltip: {"field": "max_offered_load_gbps", "type": "quantitative"}
+ }
+ }
+ ]
+} \ No newline at end of file
diff --git a/kibana/visualizations/ndr_capacity_gbps_scatter_plot.json b/kibana/visualizations/ndr_capacity_gbps_scatter_plot.json
new file mode 100644
index 0000000..9908e9d
--- /dev/null
+++ b/kibana/visualizations/ndr_capacity_gbps_scatter_plot.json
@@ -0,0 +1,108 @@
+{
+ $schema: "https://vega.github.io/schema/vega-lite/v2.json"
+ title: "Capacity in Gbps - 0.001% loss ratio"
+ data: {
+ url: {
+ %context%: true
+ %timefield%: "@timestamp"
+ index: resu*
+ body: {
+ _source: ["@timestamp", "_source", "offered_tx_rate_bps", "flow_count", "frame_size", "user_label"]
+ },
+ size: 10000
+ },
+ format: { property: "hits.hits" }
+ },
+ transform: [
+ { calculate: "datum._source['offered_tx_rate_bps'] / 1000000000" as: "Offered load (Gbps)"},
+ { calculate: "datum._source['flow_count']" as: "Flow count"},
+ { calculate: "isNaN(toNumber(datum._source['frame_size'])) ? 362 : toNumber(datum._source['frame_size'])" as: "Frame size (bytes)"}
+ { calculate: "datum._source['user_label'] + '-' + datum._source['flow_count']" as: "label"}
+ ],
+ center: true,
+ hconcat: [
+ {
+ width:10,
+ selection: {
+ legendSel: {
+ type: "multi",
+ encodings: [ "color", "shape" ],
+ toggle: "event.shiftKey"
+ }
+ },
+ encoding: {
+ y: {
+ field: "label",
+ type: "nominal",
+ axis: {
+ title: "",
+ domain: false,
+ ticks: false,
+ offset: 10
+ },
+ },
+ color: {
+ condition: {
+ selection: "legendSel",
+ field: "label",
+ type: "nominal",
+ legend: null
+ },
+ value: "lightgrey"
+ }
+ },
+ mark: {
+ type: "square",
+ size: 120,
+ opacity: 1
+ }
+ },
+ {
+ width:500,
+ height:280,
+ transform: [
+ {filter: { selection: "legendSel"}}
+
+ ],
+ mark: {
+ "type": "point",
+ "tooltip": true
+ },
+ selection: {
+ grid: {
+ type: "interval",
+ resolve: "global",
+ bind: "scales",
+ translate: "[mousedown[!event.shiftKey], window:mouseup] > window:mousemove!",
+ zoom: "wheel![!event.shiftKey]"
+ },
+ pts: {
+ type: "single",
+ fields: ["label"]
+ }
+ },
+ encoding: {
+ x: {
+ field: "Frame size (bytes)",
+ type: "quantitative"
+ }
+ y: {
+ field: "Offered load (Gbps)",
+ type: "quantitative"
+ }
+ color: {
+ field: "label", "type": "nominal",
+ "legend": null
+ }
+ shape: {
+ field: "Flow count",
+ type: "nominal"
+ }
+ tooltip: {
+ "field": "Offered load (Gbps)",
+ "type": "quantitative"
+ }
+ }
+ }
+ ]
+} \ No newline at end of file
diff --git a/kibana/visualizations/ndr_capacity_gbps_theoretical_line_chart.json b/kibana/visualizations/ndr_capacity_gbps_theoretical_line_chart.json
new file mode 100644
index 0000000..1ff4d23
--- /dev/null
+++ b/kibana/visualizations/ndr_capacity_gbps_theoretical_line_chart.json
@@ -0,0 +1,114 @@
+{
+ $schema: https: //vega.github.io/schema/vega-lite/v2.json
+ title: "Capacity in Gbps - 0,001% loss ratio"
+ data: {
+ url: {
+ %context%: true
+ %timefield%: "@timestamp"
+ index: resu*
+ body: {
+ _source: ["@timestamp", "_source", "offered_tx_rate_bps", "theoretical_tx_rate_bps", "flow_count", "frame_size", "user_label"]
+ },
+ size: 10000
+ },
+ format: { property: "hits.hits" }
+ },
+ transform: [
+ { calculate: "datum._source['offered_tx_rate_bps'] / 1000000000" as: "offered_load_gbps"},
+ { calculate: "datum._source['theoretical_tx_rate_bps'] / 1000000000" as: "theoretical_tx_rate_bps"},
+ { calculate: "datum._source['flow_count']" as: "flow_count"},
+ { calculate: "isNaN(toNumber(datum._source['frame_size'])) ? 362 : toNumber(datum._source['frame_size'])" as: "frame_size"},
+ { calculate: "datum._source['user_label'] + '-' + datum._source['flow_count']" as: "label"}
+ { aggregate: [{op: "max", field: "offered_load_gbps", as: "max_offered_load_gbps"}, {op: "max", field: "theoretical_tx_rate_bps", as: "theoretical_tx_rate_bps"}], groupby: ["frame_size", "label","flow_count"]}
+ ],
+ center: true,
+ hconcat: [
+ {
+ width:10,
+ selection: {
+ legendSel: {
+ type: "multi",
+ encodings: [ "color", "shape" ],
+ toggle: "event.shiftKey"
+ }
+ },
+ encoding: {
+ y: {
+ field: "label",
+ type: "nominal",
+ axis: {
+ title: "",
+ domain: false,
+ ticks: false,
+ offset: 10
+ },
+ },
+ color: {
+ condition: {
+ selection: "legendSel",
+ field: "label",
+ type: "nominal",
+ legend: null
+ },
+ value: "lightgrey"
+ }
+ },
+ mark: {
+ type: "square",
+ size: 120,
+ opacity: 1
+ }
+ },
+ {
+ layer: [
+ {
+ mark: {
+ type: "line",
+ tooltip: true,
+ point: true
+ },
+ encoding: {
+ x: { field: "frame_size", type: "quantitative", title: "Frame size (bytes)", axis: {offset: 10} }
+ y: { field: "theoretical_tx_rate_bps", type: "quantitative", title: "Theoretical rate (Gbps)" , axis: {offset: 10} }
+ strokeDash: {"field": "theoretical_tx_rate_bps", "type": "nominal"}
+ tooltip: [{"field": "theoretical_tx_rate_bps", "type": "quantitative", title: "theoretical max capacity"}],
+ color: { "value": "red"}
+ }
+ },
+ {
+ width:500,
+ height:280,
+ transform: [
+ {filter: { selection: "legendSel"}}
+ ],
+ mark: {
+ type: "line",
+ tooltip: true,
+ point: true
+ },
+ selection: {
+ grid: {
+ type: "interval",
+ resolve: "global",
+ bind: "scales",
+ translate: "[mousedown[!event.shiftKey], window:mouseup] > window:mousemove!",
+ zoom: "wheel![!event.shiftKey]"
+ },
+ pts: {
+ type: "single",
+ fields: ["Label"]
+ }
+ },
+ encoding: {
+ x: { field: "frame_size", type: "quantitative", title: "Frame size (bytes)", axis: {offset: 10} }
+ y: { field: "max_offered_load_gbps", type: "quantitative", title: "Offered load (Gbps)" , axis: {offset: 10} }
+ color: {field: "label", "type": "nominal",
+ "legend": null}
+ shape: {field: "flow_count", type: "nominal"}
+ tooltip: {"field": "max_offered_load_gbps", "type": "quantitative"}
+ }
+ }
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/kibana/visualizations/ndr_capacity_gbps_theoretical_scatter_plot.json b/kibana/visualizations/ndr_capacity_gbps_theoretical_scatter_plot.json
new file mode 100644
index 0000000..55a48ff
--- /dev/null
+++ b/kibana/visualizations/ndr_capacity_gbps_theoretical_scatter_plot.json
@@ -0,0 +1,128 @@
+{
+ $schema: "https://vega.github.io/schema/vega-lite/v2.json"
+ title: "Capacity in Gbps - 0,001% loss ratio"
+ data: {
+ url: {
+ %context%: true
+ %timefield%: "@timestamp"
+ index: resu*
+ body: {
+ _source: ["@timestamp", "_source", "offered_tx_rate_bps", "theoretical_tx_rate_bps", "flow_count", "frame_size", "user_label"]
+ },
+ size: 10000
+ },
+ format: { property: "hits.hits" }
+ },
+ transform: [
+ { calculate: "datum._source['offered_tx_rate_bps'] / 1000000000" as: "offered_tx_rate_bps"},
+ { calculate: "datum._source['theoretical_tx_rate_bps'] / 1000000000" as: "theoretical_tx_rate_bps"},
+ { calculate: "datum._source['flow_count']" as: "flow_count"},
+ { calculate: "isNaN(toNumber(datum._source['frame_size'])) ? 362 : toNumber(datum._source['frame_size'])" as: "frame_size"}
+ { calculate: "datum._source['user_label'] + '-' + datum._source['flow_count']" as: "label"}
+ ],
+ center: true,
+ hconcat: [
+ {
+ width:10,
+ selection: {
+ legendSel: {
+ type: "multi",
+ encodings: [ "color", "shape" ],
+ toggle: "event.shiftKey"
+ }
+ },
+ encoding: {
+ y: {
+ field: "label",
+ type: "nominal",
+ axis: {
+ title: "",
+ domain: false,
+ ticks: false,
+ offset: 10
+ },
+ },
+ color: {
+ condition: {
+ selection: "legendSel",
+ field: "label",
+ type: "nominal",
+ legend: null
+ },
+ value: "lightgrey"
+ }
+ },
+ mark: {
+ type: "square",
+ size: 120,
+ opacity: 1
+ }
+ },
+ {
+ layer: [
+ {
+ mark: {
+ type: "line",
+ tooltip: true
+ },
+ encoding: {
+ x: { field: "frame_size", type: "quantitative", title: "Frame size (bytes)", axis: {offset: 10} }
+ y: { field: "theoretical_tx_rate_bps", type: "quantitative", title: "Offered load (Gbps)" , axis: {offset: 10} }
+ strokeDash: {"field": "theoretical_tx_rate_bps", "type": "nominal"}
+ tooltip: [{"field": "theoretical_tx_rate_bps", "type": "quantitative", title: "theoretical max capacity"}],
+ color: { "value": "red"}
+ }
+ },
+ {
+ width:500,
+ height:280,
+ transform: [
+ {filter: { selection: "legendSel"}}
+ ],
+ mark: {
+ "type": "point",
+ "tooltip": true
+ },
+ selection: {
+ grid: {
+ type: "interval",
+ resolve: "global",
+ bind: "scales",
+ translate: "[mousedown[!event.shiftKey], window:mouseup] > window:mousemove!",
+ zoom: "wheel![!event.shiftKey]"
+ },
+ pts: {
+ type: "single",
+ fields: ["label"]
+ }
+ },
+ encoding: {
+ x: {
+ field: "frame_size",
+ title: "Frame size (bytes)",
+ type: "quantitative"
+ }
+ y: {
+ field: "offered_tx_rate_bps",
+ title: "Offered load (Gbps)",
+ type: "quantitative"
+ }
+ color: {
+ field: "label", "type": "nominal",
+ "legend": null
+ }
+ shape: {
+ field: "flow_count",
+ type: "nominal"
+ }
+ tooltip: {
+ "field": "offered_tx_rate_bps",
+ "title": "Offered load (Gbps)",
+ "type": "quantitative"
+ }
+ }
+ }
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/kibana/visualizations/ndr_capacity_pps_line_chart.json b/kibana/visualizations/ndr_capacity_pps_line_chart.json
new file mode 100644
index 0000000..ad79caa
--- /dev/null
+++ b/kibana/visualizations/ndr_capacity_pps_line_chart.json
@@ -0,0 +1,98 @@
+{
+ $schema: https: //vega.github.io/schema/vega-lite/v2.json
+ title: "Capacity in Mpps - 0,001% loss ratio"
+ data: {
+ url: {
+ %context%: true
+ %timefield%: "@timestamp"
+ index: resu*
+ body: {
+ _source: ["@timestamp", "_source", "rate_pps", "flow_count", "frame_size", "user_label", "type"]
+ },
+ size: 10000
+ },
+ format: { property: "hits.hits" }
+ },
+
+ transform: [
+ { calculate: "datum._source['rate_pps'] / 1000000" as: "offered_load_pps"},
+ { calculate: "datum._source['flow_count']" as: "flow_count"},
+ { calculate: "isNaN(toNumber(datum._source['frame_size'])) ? 362 : toNumber(datum._source['frame_size'])" as: "frame_size"},
+ { calculate: "datum._source['user_label'] + '-' + datum._source['flow_count']" as: "label"}
+ { aggregate: [{op: "max", field: "offered_load_pps", as: "max_offered_load_pps"}], groupby: ["frame_size", "label","flow_count"]}
+
+ ],
+ center: true,
+ hconcat: [
+ {
+ width:10,
+ selection: {
+ legendSel: {
+ type: "multi",
+ encodings: [ "color", "shape" ],
+ toggle: "event.shiftKey"
+ }
+ },
+ encoding: {
+ y: {
+ field: "label",
+ type: "nominal",
+ axis: {
+ title: "",
+ domain: false,
+ ticks: false,
+ offset: 10
+ },
+ },
+ color: {
+ condition: {
+ selection: "legendSel",
+ field: "label",
+ type: "nominal",
+ legend: null
+ },
+ value: "lightgrey"
+ }
+ },
+ mark: {
+ type: "square",
+ size: 120,
+ opacity: 1
+ }
+ },
+ {
+ width:500,
+ height:280,
+ transform: [
+ {filter: { selection: "legendSel"}}
+
+ ],
+ mark: {
+ type: "line",
+ tooltip: true,
+ point: true
+ },
+ selection: {
+ grid: {
+ type: "interval",
+ resolve: "global",
+ bind: "scales",
+ translate: "[mousedown[!event.shiftKey], window:mouseup] > window:mousemove!",
+ zoom: "wheel![!event.shiftKey]"
+ },
+ pts: {
+ type: "single",
+ fields: ["Label"]
+ }
+ },
+ encoding: {
+ x: { field: "frame_size", type: "quantitative", title: "Frame size (bytes)", axis: {offset: 10} }
+ y: { field: "max_offered_load_pps", type: "quantitative", title: "Offered load (Mpps)" , axis: {offset: 10} }
+ color: {field: "label", "type": "nominal",
+ "legend": null}
+ tooltip: {"field": "max_offered_load_pps", "type": "quantitative"},
+ shape: {field: "flow_count", type: "nominal"}
+ }
+ }
+ ]
+} \ No newline at end of file
diff --git a/kibana/visualizations/ndr_capacity_pps_scatter_plot.json b/kibana/visualizations/ndr_capacity_pps_scatter_plot.json
new file mode 100644
index 0000000..0bb8f2f
--- /dev/null
+++ b/kibana/visualizations/ndr_capacity_pps_scatter_plot.json
@@ -0,0 +1,108 @@
+{
+ $schema: "https://vega.github.io/schema/vega-lite/v2.json"
+ title: "Capacity in Mpps - 0,001% loss ratio"
+ data: {
+ url: {
+ %context%: true
+ %timefield%: "@timestamp"
+ index: resu*
+ body: {
+ _source: ["@timestamp", "_source", "rate_pps", "flow_count", "frame_size", "user_label"]
+ },
+ size: 10000
+ },
+ format: { property: "hits.hits" }
+ },
+ transform: [
+ { calculate: "datum._source['rate_pps'] / 1000000" as: "Offered load (Mpps)"},
+ { calculate: "datum._source['flow_count']" as: "Flow count"},
+ { calculate: "isNaN(toNumber(datum._source['frame_size'])) ? 362 : toNumber(datum._source['frame_size'])" as: "Frame size (bytes)"}
+ { calculate: "datum._source['user_label'] + '-' + datum._source['flow_count']" as: "label"}
+ ],
+ center: true,
+ hconcat: [
+ {
+ width:10,
+ selection: {
+ legendSel: {
+ type: "multi",
+ encodings: [ "color", "shape" ],
+ toggle: "event.shiftKey"
+ }
+ },
+ encoding: {
+ y: {
+ field: "label",
+ type: "nominal",
+ axis: {
+ title: "",
+ domain: false,
+ ticks: false,
+ offset: 10
+ },
+ },
+ color: {
+ condition: {
+ selection: "legendSel",
+ field: "label",
+ type: "nominal",
+ legend: null
+ },
+ value: "lightgrey"
+ }
+ },
+ mark: {
+ type: "square",
+ size: 120,
+ opacity: 1
+ }
+ },
+ {
+ width:500,
+ height:280,
+ transform: [
+ {filter: { selection: "legendSel"}}
+
+ ],
+ mark: {
+ "type": "point",
+ "tooltip": true
+ },
+ selection: {
+ grid: {
+ type: "interval",
+ resolve: "global",
+ bind: "scales",
+ translate: "[mousedown[!event.shiftKey], window:mouseup] > window:mousemove!",
+ zoom: "wheel![!event.shiftKey]"
+ },
+ pts: {
+ type: "single",
+ fields: ["label"]
+ }
+ },
+ encoding: {
+ x: {
+ field: "Frame size (bytes)",
+ type: "quantitative"
+ }
+ y: {
+ field: "Offered load (Mpps)",
+ type: "quantitative"
+ }
+ color: {
+ field: "label", "type": "nominal",
+ "legend": null
+ }
+ shape: {
+ field: "Flow count",
+ type: "nominal"
+ }
+ tooltip: {
+ "field": "Offered load (Mpps)",
+ "type": "quantitative"
+ }
+ }
+ }
+ ]
+} \ No newline at end of file
diff --git a/kibana/visualizations/ndr_capacity_pps_theoretical_line_chart.json b/kibana/visualizations/ndr_capacity_pps_theoretical_line_chart.json
new file mode 100644
index 0000000..00b9765
--- /dev/null
+++ b/kibana/visualizations/ndr_capacity_pps_theoretical_line_chart.json
@@ -0,0 +1,115 @@
+{
+ $schema: https: //vega.github.io/schema/vega-lite/v2.json
+ title: "Capacity in Mpps - 0,001% loss ratio"
+ data: {
+ url: {
+ %context%: true
+ %timefield%: "@timestamp"
+ index: resu*
+ body: {
+ _source: ["@timestamp", "_source", "theoretical_tx_rate_pps", "rate_pps", "flow_count", "frame_size", "user_label", "type"]
+ },
+ size: 10000
+ },
+ format: { property: "hits.hits" }
+ },
+
+ transform: [
+ { calculate: "datum._source['rate_pps'] / 1000000" as: "offered_load_pps"},
+ { calculate: "datum._source['theoretical_tx_rate_pps'] / 1000000" as: "theoretical_tx_rate_pps"},
+ { calculate: "datum._source['flow_count']" as: "flow_count"},
+ { calculate: "isNaN(toNumber(datum._source['frame_size'])) ? 362 : toNumber(datum._source['frame_size'])" as: "frame_size"},
+ { calculate: "datum._source['user_label'] + '-' + datum._source['flow_count']" as: "label"}
+ { aggregate: [{op: "max", field: "offered_load_pps", as: "max_offered_load_pps"}, {op: "max", field: "theoretical_tx_rate_pps", as: "theoretical_tx_rate_pps"}], groupby: ["frame_size", "label","flow_count"]}
+
+ ],
+ center: true,
+ hconcat: [
+ {
+ width:10,
+ selection: {
+ legendSel: {
+ type: "multi",
+ encodings: [ "color", "shape" ],
+ toggle: "event.shiftKey"
+ }
+ },
+ encoding: {
+ y: {
+ field: "label",
+ type: "nominal",
+ axis: {
+ title: "",
+ domain: false,
+ ticks: false,
+ offset: 10
+ },
+ },
+ color: {
+ condition: {
+ selection: "legendSel",
+ field: "label",
+ type: "nominal",
+ legend: null
+ },
+ value: "lightgrey"
+ }
+ },
+ mark: {
+ type: "square",
+ size: 120,
+ opacity: 1
+ }
+ },
+ {
+ layer: [{
+ mark: {
+ type: "line",
+ tooltip: true,
+ point: true
+ },
+ encoding: {
+ x: { field: "frame_size", type: "quantitative", title: "Frame size (bytes)", axis: {offset: 10} }
+ y: { field: "theoretical_tx_rate_pps", type: "quantitative", title: "Offered load (Mpps)" , axis: {offset: 10} }
+ strokeDash: {"field": "theoretical_tx_rate_pps", "type": "nominal"}
+ tooltip: [{"field": "theoretical_tx_rate_pps", "type": "quantitative", title: "theoretical max capacity"}],
+ color: { "value": "red"}
+ }
+ },{
+ width:500,
+ height:280,
+ transform: [
+ {filter: { selection: "legendSel"}}
+
+ ],mark: {
+ type: "line",
+ tooltip: true,
+ point: true
+ },
+ selection: {
+ grid: {
+ type: "interval",
+ resolve: "global",
+ bind: "scales",
+ translate: "[mousedown[!event.shiftKey], window:mouseup] > window:mousemove!",
+ zoom: "wheel![!event.shiftKey]"
+ },
+ pts: {
+ type: "single",
+ fields: ["Label"]
+ }
+ },
+ encoding: {
+ x: { field: "frame_size", type: "quantitative", title: "Frame size (bytes)", axis: {offset: 10} }
+ y: { field: "max_offered_load_pps", type: "quantitative", title: "Offered load (Mpps)" , axis: {offset: 10} }
+ color: {field: "label", "type": "nominal",
+ "legend": null}
+ tooltip: {"field": "max_offered_load_pps", "type": "quantitative"},
+ shape: {field: "flow_count", type: "nominal"}
+ }
+ }
+ ]
+ }
+
+ ]
+} \ No newline at end of file
diff --git a/kibana/visualizations/ndr_capacity_pps_theoretical_scatter_plot.json b/kibana/visualizations/ndr_capacity_pps_theoretical_scatter_plot.json
new file mode 100644
index 0000000..984a7f4
--- /dev/null
+++ b/kibana/visualizations/ndr_capacity_pps_theoretical_scatter_plot.json
@@ -0,0 +1,128 @@
+{
+ $schema: "https://vega.github.io/schema/vega-lite/v2.json"
+ title: "Capacity in Mpps - 0,001% loss ratio"
+ data: {
+ url: {
+ %context%: true
+ %timefield%: "@timestamp"
+ index: resu*
+ body: {
+ _source: ["@timestamp", "_source", "rate_pps", "theoretical_tx_rate_pps", "flow_count", "frame_size", "user_label"]
+ },
+ size: 10000
+ },
+ format: { property: "hits.hits" }
+ },
+ transform: [
+ { calculate: "datum._source['rate_pps'] / 1000000" as: "rate_pps"},
+ { calculate: "datum._source['theoretical_tx_rate_pps'] / 1000000" as: "theoretical_tx_rate_pps"},
+ { calculate: "datum._source['flow_count']" as: "flow_count"},
+ { calculate: "isNaN(toNumber(datum._source['frame_size'])) ? 362 : toNumber(datum._source['frame_size'])" as: "frame_size"}
+ { calculate: "datum._source['user_label'] + '-' + datum._source['flow_count']" as: "label"}
+ ],
+ center: true,
+ hconcat: [
+ {
+ width:10,
+ selection: {
+ legendSel: {
+ type: "multi",
+ encodings: [ "color", "shape" ],
+ toggle: "event.shiftKey"
+ }
+ },
+ encoding: {
+ y: {
+ field: "label",
+ type: "nominal",
+ axis: {
+ title: "",
+ domain: false,
+ ticks: false,
+ offset: 10
+ },
+ },
+ color: {
+ condition: {
+ selection: "legendSel",
+ field: "label",
+ type: "nominal",
+ legend: null
+ },
+ value: "lightgrey"
+ }
+ },
+ mark: {
+ type: "square",
+ size: 120,
+ opacity: 1
+ }
+ },
+ {
+ layer: [
+ {
+ mark: {
+ type: "line",
+ tooltip: true
+ },
+ encoding: {
+ x: { field: "frame_size", type: "quantitative", title: "Frame size (bytes)", axis: {offset: 10} }
+ y: { field: "theoretical_tx_rate_pps", type: "quantitative", title: "Offered load (Mpps)" , axis: {offset: 10} }
+ strokeDash: {"field": "theoretical_tx_rate_pps", "type": "nominal"}
+ tooltip: [{"field": "theoretical_tx_rate_pps", "type": "quantitative", title: "theoretical max capacity"}],
+ color: { "value": "red"}
+ }
+ },
+ {
+ width:500,
+ height:280,
+ transform: [
+ {filter: { selection: "legendSel"}}
+ ],
+ mark: {
+ "type": "point",
+ "tooltip": true
+ },
+ selection: {
+ grid: {
+ type: "interval",
+ resolve: "global",
+ bind: "scales",
+ translate: "[mousedown[!event.shiftKey], window:mouseup] > window:mousemove!",
+ zoom: "wheel![!event.shiftKey]"
+ },
+ pts: {
+ type: "single",
+ fields: ["label"]
+ }
+ },
+ encoding: {
+ x: {
+ field: "frame_size",
+ title: "Frame size (bytes)",
+ type: "quantitative"
+ }
+ y: {
+ field: "rate_pps",
+ title: "Offered load (Mpps)",
+ type: "quantitative"
+ }
+ color: {
+ field: "label", "type": "nominal",
+ "legend": null
+ }
+ shape: {
+ field: "flow_count",
+ type: "nominal"
+ }
+ tooltip: {
+ "field": "rate_pps",
+ "title": "Offered load (Mpps)",
+ "type": "quantitative"
+ }
+ }
+ }
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/nfvbench/cfg.default.yaml b/nfvbench/cfg.default.yaml
index 07d48f3..c76e738 100644
--- a/nfvbench/cfg.default.yaml
+++ b/nfvbench/cfg.default.yaml
@@ -18,18 +18,41 @@
# Fields that can be over-ridden at the command line are marked with the corresponding
# option, e.g. "--interval"
-# The OpenStack openrc file to use (must be a valid full pathname). If running
+
+# The OpenStack openrc file to use - must be a valid full pathname. If running
# in a container, this path must be valid in the container.
#
# The only case where this field can be empty is when measuring a system that does not run
# OpenStack or when OpenStack APIs are not accessible or OpenStack APis use is not
# desirable. In that case the EXT service chain must be used.
+#
+# If openrc is not admin some parameters are mandatory and must be filled with valid values in config file such as :
+# - availability_zone
+# - hypervisor_hostname
+# - vlans
+# WARNING: Not used if clouds_detail is sets
openrc_file:
+# The OpenStack clouds configuration from clouds.yaml file to use.
+# clouds.yaml file must be in one of the following paths:
+# - ~/.config/openstack
+# - /etc/openstack
+# Note: If running in a container, this path must be valid in the container.
+# The only case where this field can be empty is when measuring a system that does not run
+# OpenStack or when OpenStack APIs are not accessible or OpenStack APis use is not
+# desirable. In that case the EXT service chain must be used.
+#
+# If user is not admin some parameters are mandatory and must be filled with valid values in config file such as :
+# - availability_zone
+# - hypervisor_hostname
+# - vlans
+# If a value is sets, this parameter disable the use of openrc file
+clouds_detail:
+
# Forwarder to use in nfvbenchvm image. Available options: ['vpp', 'testpmd']
vm_forwarder: testpmd
-# By default (empty) NFVBench will try to locate a VM image file
+# By default (empty) NFVbench will try to locate a VM image file
# from the package root directory named "nfvbench-<version>.qcow2" and
# upload that file. The image name will be "nfvbench-<version>"
# This can be overridden by specifying here a pathname of a file
@@ -45,16 +68,16 @@ vm_image_file:
# Otherwise, a new flavor will be created with attributes listed below.
flavor_type: 'nfvbench.medium'
-# Custom flavor attributes
+# Custom flavor attributes for the test VM
flavor:
- # Number of vCPUs for the flavor
+ # Number of vCPUs for the flavor, must be at least 2!
vcpus: 2
# Memory for the flavor in MB
ram: 4096
# Size of local disk in GB
disk: 0
# metadata are supported and can be added if needed, optional
- # note that if your openstack does not have NUMA optimization
+ # note that if your OpenStack does not have NUMA optimization
# (cpu pinning and huge pages)
# you must comment out extra_specs completely otherwise
# loopback VM creation will fail
@@ -62,43 +85,38 @@ flavor:
"hw:cpu_policy": dedicated
"hw:mem_page_size": large
+# Enable multiqueue for all test VM interfaces (PVP and PVVP only).
+# When enabled, the test VM image will get added the property to enable
+# multiqueue (hw_vif_multiqueue_enabled='true').
+# The number of queues per interace will be set to the number of vCPUs configured for
+# the VM.
+# By default there is only 1 queue per interface
+# The max allowed queue per interface is 8.
+# The valid range for this parameter is [1..min(8, vcpu_count)]
+# When multiqueue is used the recommended setting is to set it to same value as the
+# number of vCPU used - up to a max of 8 queues.
+# Setting to a lower value than vCPU should also work. For example if using 4 vCPU and
+# vif_multiqueue_size is set to 2, OpenStack will create 4 queues per interface but the
+# test VM will only use the first 2 queues.
+vif_multiqueue_size: 1
+
+# Increase number of buffers allocated for VPP VM forwarder. May be needed in scenarios with large
+# number of interfaces and worker threads, or a lot of physical interfaces with multiple RSS queues.
+# Value is per CPU socket. Default is 16384.
+num_mbufs: 16384
+
# Name of the availability zone to use for the test VMs
# Must be one of the zones listed by 'nova availability-zone-list'
-# If the selected zone contains only 1 compute node and PVVP inter-node flow is selected,
-# application will use intra-node PVVP flow.
-# List of compute nodes can be specified, must be in given availability zone if not empty
-#availability_zone: 'nova'
+# availability_zone: 'nova'
+# If openrc is not admin set a valid value
availability_zone:
+# To force placement on a given hypervisor, set the name here
+# (if multiple names are provided, the first will be used)
+# Leave empty to let OpenStack pick the hypervisor
compute_nodes:
-
-
-# Credentials for SSH connection to TOR switches.
-tor:
- # Leave type empty or switch list empty to skip TOR switches configuration.
- # Preferably use 'no_tor_access' to achieve the same behavior.
- # (skipping TOR config will require the user to pre-stitch the traffic generator interfaces
- # to the service chain under test, needed only if configured in access mode)
- type:
- # Switches are only needed if type is not empty.
- # You can configure 0, 1 or 2 switches
- # no switch: in this case NFVbench will not attempt to ssh to the switch
- # and stitching of traffic must be done externally
- # 1 switch: this assumes that both traffic generator interfaces are wired to the same switch
- # 2 switches: this is the recommended setting wuth redundant switches, in this case each
- # traffic generator interface must be wired to a different switch
- switches:
- - host:
- username:
- password:
- port:
-
-# Skip TOR switch configuration and retrieving of stats
-# Can be overriden by --no-tor-access
-no_tor_access: false
-
-# Skip vswitch configuration and retrieving of stats
-# Can be overriden by --no-vswitch-access
-no_vswitch_access: false
+# If openrc is not admin set a valid value for hypervisor hostname
+# Example of value: hypervisor_hostname: "server1"
+hypervisor_hostname:
# Type of service chain to run, possible options are PVP, PVVP and EXT
# PVP - port to VM to port
@@ -112,6 +130,9 @@ service_chain: 'PVP'
# Can be overriden by --service-chain-count
service_chain_count: 1
+# Specifies if all chains share the same right/left/middle networks
+service_chain_shared_net: false
+
# Total number of traffic flows for all chains and directions generated by the traffic generator.
# Minimum is '2 * service_chain_count', it is automatically adjusted if too small
# value was configured. Must be even.
@@ -119,17 +140,21 @@ service_chain_count: 1
# Can be overriden by --flow-count
flow_count: 10000
-# Used by PVVP chain to spawn VMs on different compute nodes
-# Can be overriden by --inter-node
-inter_node: false
-
# set to true if service chains should use SRIOV
# This requires SRIOV to be available on compute nodes
sriov: false
-# Skip interfaces config on EXT service chain
-# Can be overriden by --no-int-config
-no_int_config: false
+# Perform port to port loopback (direct or through switch)
+# e.g. for unitary testing of the switch or the bench itself.
+# When selected, this mode forces EXT service chain and no ARP mode
+# Destination MAC for each port is set to the other (peer) port MAC.
+# VLAN tagging is defined by 'vlans' & 'vlan_tagging' properties.
+# Can be overriden by --l2-loopback (including vlan tagging spec).
+l2_loopback: false
+# No assumption is made about the loop implementation.
+# Multiple L2 vlan tagged service chains are allowed,
+# the vlan ID lists' size must be at least service_chain_count.
+# If not vlan tagging, the service chain count is forced to 1.
# Resources created by NFVbench will not be removed
# Can be overriden by --no-cleanup
@@ -146,58 +171,245 @@ traffic_generator:
default_profile: trex-local
# IP addresses for L3 traffic.
+ # This section describes the addresses to use to fill in the UDP packets sent by the
+ # traffic generator. If you VNFs are L2 forwarders, these fields below do not need to change.
+ # If your VNFs are L3 routers, the fields below must match the static routes in your VNFs
+ # so that UDP packets can be routed back to the peer port of the traffic generator.
+
# All of the IPs are used as base for IP sequence computed based on chain or flow count.
+ # (sim-devices-left)---(tg-gateway-left)---(vnf-left)- ...
+ # -(vnf-right)---(tg-gateway-right)---(sim-devices-right)
#
# `ip_addrs` base IPs used as src and dst in packet header, quantity depends on flow count
+ # these are used for addressing virtual devices simulated by the traffic generator
+ # and be a different subnet than tg_gateway_ip_addrs and gateway_ip_addrs
# `ip_addrs_step`: step for generating IP sequence. Use "random" for random patterns, default is 0.0.0.1.
- # `tg_gateway_ip_addrs` base IPs for traffic generator ports, quantity depends on chain count
- # `tg_gateway_ip_addrs__step`: step for generating traffic generator gateway sequences. default is 0.0.0.1
- # `gateway_ip_addrs`: base IPs of router gateways on both networks, quantity depends on chain count
- # `gateway_ip_addrs_step`: step for generating router gateway sequences. default is 0.0.0.1
- # `udp_src_port`: the source port for sending UDP traffic, default is picked by TRex (53)
- # `udp_dst_port`: the destination port for sending UDP traffic, default is picked by TRex (53)
ip_addrs: ['10.0.0.0/8', '20.0.0.0/8']
ip_addrs_step: 0.0.0.1
- tg_gateway_ip_addrs: ['1.1.0.100', '2.2.0.100']
+
+ #'ip_src_static': an attribute to precise the state of source IP during the generation of traffic, It indicates whether
+ # the IP source variate or remain constant. Use True for constant IP and False for varying IPs.
+ # default value is True
+ ip_src_static: True
+
+ # `tg_gateway_ip_addrs` base IP for traffic generator ports in the left and right networks to the VNFs
+ # chain count consecutive IP addresses spaced by tg_gateway_ip_addrs_step will be used
+ # `tg_gateway_ip_addrs__step`: step for generating traffic generator gateway sequences. default is 0.0.0.1
+ tg_gateway_ip_addrs: ['192.168.1.100', '192.168.2.100']
+ tg_gateway_ip_cidrs: ['192.168.1.0/24','192.168.2.0/24']
tg_gateway_ip_addrs_step: 0.0.0.1
- gateway_ip_addrs: ['1.1.0.2', '2.2.0.2']
+ # `gateway_ip_addrs`: base IPs of VNF router gateways (left and right), quantity used depends on chain count
+ # must correspond to the public IP on the left and right networks
+ # for each left-most and right-most VNF of every chain.
+ # must be the same subnet but not same IP as tg_gateway_ip_addrs.
+ # chain count consecutive IP addresses spaced by gateway_ip_addrs_step will be used
+ # `gateway_ip_addrs_step`: step for generating router gateway sequences. default is 0.0.0.1
+ gateway_ip_addrs: ['192.168.1.1', '192.168.2.1']
gateway_ip_addrs_step: 0.0.0.1
+
+ # UDP DEFINED VARIABLES
+ # TRex pick default UDP port (53) but the range of UDP source and destination ports are also
+ # defined from configuration file by using the following attributes:
+ #
+ # `udp_src_port`: the source port for sending UDP traffic, default is picked by TRex (53)
+ # `udp_dst_port`: the destination port for sending UDP traffic, default is picked by TRex (53)
+ # `udp_src_port` and `udp_dst_port` can be defined by a single port or a range. Example:
+ # udp_src_port: 80
+ # udp_dst_port: ['1024','65000']
+ # `udp_port_step`: the step between two generated ports, default is equal to '1'
+ #
+ # NOTICE:
+ # Following TRex functionalities, incrementation and decrementation of source port and destination
+ # port values occur simultaneously.
+ # So, in order to reach the highest possible number of packets, it's recommended that the range of source ports
+ # minus the range of destination ports should be different of 1
+ # i.e: |range[source_port] - range[destination_port]| = 1
udp_src_port:
udp_dst_port:
+ udp_port_step: '1'
+
+ # VxLAN only: optionally specify what VLAN tag to use for the VxLAN overlay
+ # This is used if the vxlan tunnels are running on a specific VLAN.
+ # Leave empty if there is no VLAN tagging required, or specify the VLAN id to use
+ # for all VxLAN tunneled traffic
+ vtep_vlan:
+ # VxLAN and MPLS only: local/source vteps IP addresses for port 0 and 1 ['10.1.1.230', '10.1.1.231']
+ src_vteps:
+ # VxLAN only: remote IP address of the remote VTEPs that terminate all tunnels originating from local VTEPs
+ dst_vtep:
+ # The encapsulated L3/MPLS packet needs to traverse L3 or MPLS fabric to reach to its final dst_vtep.
+ # This parameter is required to resolve first next-hop MAC address if it next-hop is not its final dst_vtep.
+ # This parameter is mandatory for MPLS only
+ vtep_gateway_ips:
+ # L2 ADDRESSING OF UDP PACKETS
+ # Lists of dest MAC addresses to use on each traffic generator port (one dest MAC per chain)
+ # Leave empty for PVP, PVVP, EXT with ARP
+ # Only used when `service_chain` is EXT and `no_arp` is true.
+ # - If both lists are empty the far end MAC of the traffic generator will be used for left and right
+ # (this is typicaly used to loop back on the first hop switch or using a loopback cable)
+ # - The length of each list must match the number of chains being used!
+ # - The index of each list must correspond to the chain index to ensure proper pairing.
+ # - Below is an example of using two chains:
+ # - mac_addrs_left: ['00:00:00:00:01:00', '00:00:00:00:02:00']
+ # - mac_addrs_right: ['00:00:00:00:01:01', '00:00:00:00:02:01']
+ # UDP packets sent on port 0 will use dest MAC '00:00:00:00:01:00' for chain #0 and
+ # dest MAC '00:00:00:00:02:00' for chain #1
+ # UDP packets sent on port 1 will use dest MAC '00:00:00:00:01:01' for chain #0 and
+ # dest MAC '00:00:00:00:02:01' for chain #1
+ # It is expected that the looping device (L2 forwarder) will rewrite the src and dst MAC
+ # of the looping UDP packet so that it can reach back to the peer port of the traffic
+ # generator.
+ #
+ mac_addrs_left:
+ mac_addrs_right:
# Traffic Generator Profiles
# In case you have multiple testbeds or traffic generators,
# you can define one traffic generator profile per testbed/traffic generator.
+ # In most cases you only need to fill in the pci address for the 2 ports used by the
+ # traffic generator and leave all other fields unchanged
#
# Generator profiles are listed in the following format:
# `name`: Traffic generator profile name (use a unique name, no space or special character)
+ # Do not change this field
# `tool`: Traffic generator tool to be used (currently supported is `TRex`).
+ # Do not change this field
# `ip`: IP address of the traffic generator.
- # `cores`: Specify the number of cores for TRex traffic generator. ONLY applies to trex-local.
+ # The default loopback address is used when the traffic generator runs on the same host
+ # as NFVbench.
+ # `cores`: Specify the number of cores for running the TRex traffic generator.
+ # ONLY applies to trex-local.
# `software_mode`: Advice TRex to use software mode which provides the best compability. But
# note that TRex will not use any hardware acceleration technology under
# software mode, therefore the performance of TRex will be significantly
# lower. ONLY applies to trex-local.
+ # Recommended to leave the default value (false)
+ # `limit_memory`: Specify the memory reserved for running the TRex traffic generator (in MB). Limit the amount
+ # of packet memory used. (Passed to dpdk as -m arg)
+ # ONLY applies to trex-local.
+ # `zmq_pub_port`: Specify the ZMQ pub port number for the TRex traffic generator instance (default value is 4500).
+ # ONLY applies to trex-local.
+ # `zmq_rpc_port`: Specify the ZMQ rpc port for the TRex traffic generator instance (default value is 4501).
+ # ONLY applies to trex-local.
# `interfaces`: Configuration of traffic generator interfaces.
# `interfaces.port`: The port of the traffic generator to be used (leave as 0 and 1 resp.)
- # `interfaces.switch_port`: Leave empty (reserved for advanced use cases)
+ # `interfaces.switch_port`: Leave empty (deprecated)
# `interfaces.pci`: The PCI address of the intel NIC interface associated to this port
+ # This field is required and cannot be empty
+ # Use lspci to list the PCI address of all devices
+ # Example of value: "0000:5e:00.0"
# `intf_speed`: The speed of the interfaces used by the traffic generator (per direction).
+ # Empty value (default) to use the speed discovered by the traffic generator.
+ # Recommended to leave this field empty.
+ # Do not use unless you want to override the speed discovered by the
+ # traffic generator. Expected format: 10Gbps
+ #
+ # `platform`: Optional. Used to tune the performance and allocate the cores to the right NUMA.
+ # See https://trex-tgn.cisco.com/trex/doc/trex_manual.html (6.2.3. Platform section configuration)
+ # for more details
+ # `platform.master_thread_id`: Hardware thread_id for control thread. (Valid value is mandatory if platform property is set)
+ # `platform.latency_thread_id`: Hardware thread_id for RX thread. (Valid value is mandatory if platform property is set)
+ # `platform.dual_if`: Section defines info for interface pairs (according to the order in “interfaces” list). (Valid value is mandatory if platform property is set)
+ # Each section, starting with “- socket” defines info for different interface pair. (Valid value is mandatory if platform property is set)
+ # `platform.dual_if.socket`: The NUMA node from which memory will be allocated for use by the interface pair. (Valid value is mandatory if platform property is set)
+ # `platform.dual_if.threads`: Hardware threads to be used for sending packets for the interface pair. (Valid value is mandatory if platform property is set)
+ # Threads are pinned to cores, so specifying threads actually determines the hardware cores.
+ # Example of values:
+ # platform:
+ # master_thread_id: 0
+ # latency_thread_id: 2
+ # dual_if:
+ # - socket: 0
+ # threads: [1]
#
generator_profile:
- name: trex-local
tool: TRex
ip: 127.0.0.1
- cores: 3
+ cores: 4
software_mode: false
+ limit_memory: 1024
+ zmq_pub_port: 4500
+ zmq_rpc_port: 4501
interfaces:
- port: 0
- switch_port:
pci:
- - port: 1
switch_port:
+ - port: 1
pci:
- intf_speed: 10Gbps
+ switch_port:
+ intf_speed:
+ platform:
+ master_thread_id:
+ latency_thread_id:
+ dual_if:
+ - socket:
+ threads:
+
+# Use 'true' to force restart of local TRex server before next run
+# TRex local server will be restarted even if restart property is false in case of generator config changes between runs
+restart: false
+
+# Simpler override for trex core count and mbuf multilier factor
+# if empty defaults to the one specified in generator_profile.cores
+cores:
+
+# Simpler override for the interface speed
+# if empty, the current generator_profile.intf_speed parameter applies
+# if value = 'auto' the auto-detection is forced
+intf_speed:
+
+# 'cores' and 'intf_speed' parameters can be overriden themselves
+# by respective options --cores and --intf-speed on the command-line.
+
+# By default, the real ports line rate is detected and used as
+# the reference for computing the theoretical maximum traffic load (100%).
+# Note that specifying 'intf_speed' allows to artificially lower this
+# reference while not modifying the actual transmission bit rate.
+
+# The values of the following parameters are ignored on entry
+# they are defined here in order to appear in the reported configuration.
+# They will reflect the value active at run-time (after overriding or detection)
+cores_used:
+intf_speed_used:
+intf_speed_detected:
+
+# A cache size value is passed to the TRex field engine (FE) at packet generation.
+# Can be overridden by --cache-size
+# More information for TRex performance:
+# https://trex-tgn.cisco.com/trex/doc/trex_stateless.html#_tutorial_field_engine_significantly_improve_performance
+# If cache_size = 0 (or empty): no cache will be used by TRex (default)
+# If cache_size < 0: cache_size will be set to flow count value
+cache_size: 0
+# The cache size is actually limited by the number of 64B mbufs configured in the trex platform configuration (see Trex manual 6.2.2. Memory section configuration)
+# Note that the resulting value is finally capped to 10000, whatever the requested size is (by design limitation).
+
+# Specification of the TRex behaviour dealing with the i40e network card driver issue: Trex-528
+# see https://trex-tgn.cisco.com/youtrack/issue/trex-528
+# This issue states that if other ports, in the same card,
+# are in kernel mode, they could impair traffic counting.
+# Can be overridden by --i40e-mixed
+# Values can be:
+# ignore - don't consider the case (default)
+# exit - should the case arise, exit (TRex default behaviour)
+# unbind - unbind kernel bound ports (the former NFVbench behaviour)
+# The 'ignore' option might be OK as soon as the issue has been fixed in the driver.
+# The 'unbind' option should not be used! who knows the current use of other ports?
+i40e_mixed:
+
+# Trex will use 1 x 64B mbuf per pre-built cached packet, assuming 1 pre-built cached packet per flow, it means for very large number of flows, the number of configured mbuf_64 will need to be set accordingly.
+mbuf_64:
+
+# mbuffer ratio to use for TRex (see TRex documentation for more details)
+mbuf_factor: 0.2
+
+# A switch to disable hdrh
+# hdrh is enabled by default and requires TRex v2.58 or higher
+disable_hdrh: false
+
+# List of latency percentiles values returned using hdrh
+# elements should be int or float between 0.0 and 100.0
+lat_percentiles: [25, 75, 99]
# -----------------------------------------------------------------------------
# These variables are not likely to be changed
@@ -214,21 +426,28 @@ generic_poll_sec: 2
# name of the loop VM
loop_vm_name: 'nfvbench-loop-vm'
-# Default names, subnets and CIDRs for PVP/PVVP networks
+# Default names, subnets and CIDRs for PVP/PVVP networks (OpenStack only)
+#
# If a network with given name already exists it will be reused.
# - PVP only uses left and right
# - PVVP uses left, middle and right
# - for EXT chains, this structure is not relevant - refer to external_networks
# Otherwise a new internal network will be created with that name, subnet and CIDR.
-#
-# segmentation_id can be set to enforce a specific VLAN id - by default (empty) the VLAN id
-# will be assigned by Neutron.
-# Must be unique for each network
+#
+# network_type must be 'vlan' (for VLAN and SRIOV) or 'vxlan' (for VxLAN)
+# all 3 networks must use the same network type in this release
+# segmentation_id can be set to enforce a specific segmentation id (vlan ID or VNI if vxlan)
+# by default (empty) the segmentation id will be assigned by Neutron.
+# If specified, it must be unique for each network
+# For multi-chaining, see notes below
# physical_network can be set to pick a specific phsyical network - by default (empty) the
# default physical network will be picked
-# In the case of SR-IOV, both physical_network and segmentation ID must be provided
-# For example to setup PVP using 2 different SR-IOV ports, you must put the appropriate physnet
+# SR-IOV: both physical_network and VLAN segmentation ID must be provided
+# VxLAN: the VNI must generally be provided (except special Neutron VxLAN implementations)
+#
+# For example to setup 1xPVP using 2 different SR-IOV ports, you must put the appropriate physnet
# names under left.physical_network and right.physical_network.
+# For multi-chaining and non shared networks,
# Example of override configuration to force PVP to run on 2 SRIOV ports (phys_sriov0 and phys_sriov1)
# using VLAN ID 2000 and 2001:
# internal_networks:
@@ -238,56 +457,286 @@ loop_vm_name: 'nfvbench-loop-vm'
# right:
# segmentation_id: 2001
# physical_network: phys_sriov1
+#
+# For multi-chaining and non shared network mode (VLAN, SRIOV, VxLAN, MPLS):
+# - the segmentation_id field if provided must be a list of values (as many as chains)
+# - segmentation_id auto-indexing:
+# the segmentation_id field can also be a single value that represents the base value from which
+# values for each chain is derived using the chain ID as an offset. For example
+# if 2000 is specified, NFVbench will use 2000 for chain 0, 2001 for chain 1 etc...
+# The ranges of all the networks must not overlap.
+# - the physical_network can be a single name (all VFs to be allocated on same physnet)
+# of a list of physnet names to use different PFs
+#
+# Example of 2-chain VLAN configuration:
+# internal_networks:
+# left:
+# segmentation_id: [2000, 2001]
+# physical_network: phys_sriov0
+# right:
+# segmentation_id: [2010, 2011]
+# physical_network: phys_sriov1
+# Equivalent to (using auto-indexing):
+# internal_networks:
+# left:
+# segmentation_id: 2000
+# physical_network: phys_sriov0
+# right:
+# segmentation_id: 2010
+# physical_network: phys_sriov1
+#
+# - mpls_transport_labels is used only when MPLS encapsulation is enabled (mpls: true)
+# this parameter doesn't support auto-indexing because this is not a typical scenario
+# expected the list of values in a range 256-1048575, one value per chain is expected
+#
+# In the bellow configuration example 'segmentation_id; contains the inner MPLS label for each chain
+# and 'mpls_transport_labels' contains the outer transport MPLS label for each chain
+# Example of 2-chain MPLS configuration:
+# internal_networks:
+# left:
+# network_type: mpls
+# segmentation_id: [2000, 2001]
+# mpls_transport_labels: [10000, 10000]
+# physical_network: phys_sriov0
+# right:
+# network_type: mpls
+# segmentation_id: [2010, 2011]
+# mpls_transport_labels: [11000, 11000]
+# physical_network: phys_sriov1
+
internal_networks:
left:
- name: 'nfvbench-net0'
- subnet: 'nfvbench-subnet0'
+ name: 'nfvbench-lnet'
+ subnet: 'nfvbench-lsubnet'
cidr: '192.168.1.0/24'
network_type: 'vlan'
segmentation_id:
physical_network:
+ mpls_transport_labels:
right:
- name: 'nfvbench-net1'
- subnet: 'nfvbench-subnet1'
+ name: 'nfvbench-rnet'
+ subnet: 'nfvbench-rsubnet'
cidr: '192.168.2.0/24'
network_type: 'vlan'
segmentation_id:
physical_network:
+ mpls_transport_labels:
middle:
- name: 'nfvbench-net2'
- subnet: 'nfvbench-subnet2'
+ name: 'nfvbench-mnet'
+ subnet: 'nfvbench-msubnet'
cidr: '192.168.3.0/24'
network_type: 'vlan'
segmentation_id:
physical_network:
+ mpls_transport_labels:
+
+# IDLE INTERFACES: PVP, PVVP and non shared net only.
+# By default each test VM will have 2 virtual interfaces for looping traffic.
+# If service_chain_shared_net is false, additional virtual interfaces can be
+# added at VM creation time, these interfaces will not carry any traffic and
+# can be used to test the impact of idle interfaces in the overall performance.
+# All these idle interfaces will use normal ports (not direct).
+# Number of idle interfaces per VM (none by default)
+idle_interfaces_per_vm: 0
+
+# A new network is created for each idle interface.
+# If service_chain_shared_net is true, the options below will be ignored
+# and no idle interfaces will be added.
+idle_networks:
+ # Prefix for all idle networks, the final name will append the chain ID and idle index
+ # e.g. "nfvbench-idle-net.0.4" chain 0 idle index 4
+ name: 'nfvbench-idle-net'
+ # Subnet name to use for all idle subnetworks
+ subnet: 'nfvbench-idle-subnet'
+ # CIDR to use for all idle networks (value should not matter)
+ cidr: '192.169.1.0/24'
+ # Type of network associated to the idle virtual interfaces (vlan or vxlan)
+ network_type: 'vlan'
+ # segmentation ID to use for the network attached to the idle virtual interfaces
+ # vlan: leave empty to let neutron pick the segmentation ID
+ # vxlan: must specify the starting VNI value to be used (cannot be empty)
+ # Note that NFVbench will use as many consecutive segmentation IDs as needed.
+ # For example, for 4 PVP chains and 8 idle
+ # interfaces per VM, NFVbench will use 32 consecutive values of segmentation ID
+ # starting from the value provided.
+ segmentation_id:
+ # physnet name to use for all idle interfaces
+ physical_network:
+
+# MANAGEMENT INTERFACE
+# By default each test VM will have 2 virtual interfaces for looping traffic.
+# If use_management_port is true, additional virtual interface can be
+# added at VM creation time, this interface will be used for VM management over SSH.
+# This will be helpful for debug (forwarder config, capture traffic...)
+# or to emulate VNF with management interface
+use_management_port: false
+
+# If a network with given name already exists it will be reused.
+# Otherwise a new network is created for management interface.
+# If use_management_port is false, the options below will be ignored
+# and no management interface will be added.
+management_network:
+ name: 'nfvbench-management-net'
+ # Subnet name to use for management subnetwork
+ subnet: 'nfvbench-management-subnet'
+ # CIDR to use for management network
+ cidr: '192.168.0.0/24'
+ gateway: '192.168.0.254'
+ # Type of network associated to the management virtual interface (vlan or vxlan)
+ network_type: 'vlan'
+ # segmentation ID to use for the network attached to the management virtual interface
+ # vlan: leave empty to let neutron pick the segmentation ID
+ # vxlan: must specify the starting VNI value to be used (cannot be empty)
+ segmentation_id:
+ # physnet name to use for all idle interfaces
+ physical_network:
+
+# Floating IP for management interface
+# If use_floating_ip is true, floating IP will be set on management interface port
+# One floating IP by loop VM will be used (floating ips are often limited,
+# use them on limited context mainly for debug). If there are 10 PVP chains, this will require 10
+# floating IPs. If 10 PVVP chains, it will require 20 floating IPs
+use_floating_ip: false
+
+# If a network with given name already exists it will be reused.
+# Set same name as management_network if you want to use a floating IP from this network
+# Otherwise set name, subnet and CIDR information from your floating IP pool network
+# Floating network used to set floating IP on management port.
+# Only 1 floating network will be used for all VMs and chains (shared network).
+# If use_floating_ip is false, the options below will be ignored
+# and no floating IP will be added.
+floating_network:
+ name: 'nfvbench-floating-net'
+ # Subnet name to use for floating subnetwork
+ subnet: 'nfvbench-floating-subnet'
+ # CIDR to use for floating network
+ cidr: '192.168.0.0/24'
+ # Type of network associated to the management virtual interface (vlan or vxlan)
+ network_type: 'vlan'
+ # segmentation ID to use for the network attached to the management virtual interface
+ # vlan: leave empty to let neutron pick the segmentation ID
+ # vxlan: must specify the starting VNI value to be used (cannot be empty)
+ segmentation_id:
+ # physnet name to use for all idle interfaces
+ physical_network:
# In the scenario of PVVP + SRIOV, there is choice of how the traffic will be
# handled in the middle network. The default (false) will use vswitch, while
# SRIOV can be used by toggling below setting.
use_sriov_middle_net: false
-# EXT chain only. Names of edge networks which will be used to send traffic via traffic generator.
+# EXT chain only. Prefix names of edge networks or list of edge network names
+# used to send traffic via traffic generator.
+#
+# If service_chain_shared_net is true, the left and right networks must pre-exist and match exactly by name.
+#
+# If service_chain_shared_net is false, each chain must have its own pre-existing left and right networks.
+# left and right can take either a string prefix or a list of arbitrary network names
+# If a string prefix is passed, an index will be appended to each network name to form the final name.
+# Example:
+# external_networks:
+# left: 'ext-lnet'
+# right: 'ext-rnet'
+# ext-lnet0 ext-rnet0 for chain #0
+# ext-lnet1 ext-rnet1 for chain #1
+# etc...
+# If a list of strings is passed, each string in the list must be the name of the network used for the
+# chain indexed by the entry position in the list.
+# The list must have at least as many entries as there are chains
+# Example:
+# external_networks:
+# left: ['ext-lnet', 'ext-lnet2']
+# right: ['ext-rnet', 'ext-rnet2']
+#
external_networks:
- left: 'nfvbench-net0'
- right: 'nfvbench-net1'
+ left:
+ right:
+
+# PVP with L3 router in the packet path only.
+# Only use when l3_router option is True (see l3_router)
+# Prefix names of edge networks which will be used to send traffic via traffic generator.
+# If a network with given name already exists it will be reused.
+# Otherwise a new edge network will be created with that name, subnet and CIDR.
+#
+# gateway can be set in case of L3 traffic with edge networks - refer to edge_networks
+#
+# segmentation_id can be set to enforce a specific VLAN id - by default (empty) the VLAN id
+# will be assigned by Neutron.
+# Must be unique for each network
+# physical_network can be set to pick a specific phsyical network - by default (empty) the
+# default physical network will be picked
+#
+edge_networks:
+ left:
+ name: 'nfvbench-net2'
+ router_name: 'router_left'
+ subnet: 'nfvbench-subnet2'
+ cidr: '192.168.3.0/24'
+ gateway:
+ network_type:
+ segmentation_id:
+ physical_network:
+ right:
+ name: 'nfvbench-net3'
+ router_name: 'router_right'
+ subnet: 'nfvbench-subnet3'
+ cidr: '192.168.4.0/24'
+ gateway:
+ network_type:
+ segmentation_id:
+ physical_network:
+# Use 'true' to enable VXLAN encapsulation support and sent by the traffic generator
+# When this option enabled internal networks 'network type' parameter value should be 'vxlan'
+# VxLAN and MPLS encapsulations are mutual exclusive if 'vxlan' is true then 'mpls' should be false
+# and vise versa
+vxlan: false
+# Use 'true' to enable MPLS encapsulation support and sent by the traffic generator
+# When this option enabled internal networks 'network type' parameter value should be 'mpls'
+# MPLS and VxLAN encapsulations are mutual exclusive if 'mpls' is 'true' then 'vxlan' should be set to 'false'
+# and vise versa. no_flow_stats, no_latency_stats, no_latency_streams should be set to 'true' because these
+# features are not supported at the moment. In future when these features will be supported they will require
+# special NIC hardware. Only 2 label stack supported at the moment where one label is transport and another
+# is VPN for more details please refer to 'mpls_transport_labels' and 'segmentation_id' in networks configuration
+mpls: false
# Use 'true' to enable VLAN tagging of packets generated and sent by the traffic generator
-# Leave empty you do not want the traffic generator to insert the VLAN tag. This is
-# needed for example if VLAN tagging is enabled on switch (trunk mode) or if you want to hook directly to a NIC
-# By default is set to true (which is the nominal use case with TOR and trunk mode to Trex)
+# Leave empty or set to false if you do not want the traffic generator to insert the VLAN tag (this is
+# needed for example if VLAN tagging is enabled on switch (access mode) or if you want to hook
+# directly to a NIC).
+# By default is set to true (which is the nominal use case with TOR and trunk mode to Trex ports)
+# If VxLAN or MPLS are enabled, this option should be set to false (vlan tagging for encapsulated packets
+# is not supported). Use the vtep_vlan option to enable vlan tagging for the VxLAN overlay network.
vlan_tagging: true
-# Specify only when you want to override VLAN IDs used for tagging with own values (exactly 2).
-# Default behavior of VLAN tagging is to retrieve VLAN IDs from OpenStack networks provided above.
-# In case of VxLAN this setting is ignored and only vtep_vlan from traffic generator profile is used.
-# Example: [1998, 1999]
+# Used only in the case of EXT chain and no OpenStack or not admin access to specify the VLAN IDs to use.
+# This property is ignored when OpenStack is used or when 'vlan_tagging' is disabled.
+# If OpenStack is used leave the list empty, VLAN IDs are retrieved from OpenStack networks using Neutron API.
+# If networks are shared across all chains (service_chain_shared_net=true), the list should have exactly 2 values
+# If networks are not shared across chains (service_chain_shared_net=false), the list should have
+# 2 list of vlan IDs
+# Examples:
+# [1998, 1999] left network uses vlan 1998 right network uses vlan 1999
+# [[1,2],[3,4]] chain 0 left vlan 1, right vlan 2 - chain 1 left vlan 3 right vlan 4
+# [1010, 1010] same vlan ID on both sides, for a typical l2-loopback test (*)
+# The vlan lists may be oversized, compared to the actual service chain count
+# (lowest indexes are used) but an exception is raised if they are too short.
vlans: []
-
-# Used only with EXT chain. MAC addresses of traffic generator ports are used as destination
-# if 'no_arp' is set to 'true'. Otherwise ARP requests are sent to find out destination MAC addresses.
+# (*) actually there is no restriction, left/right IDs may differ
+# for some exotic purpose - see also the l2_loopback parameter.
+
+# ARP is used to discover the MAC address of VNFs that run L3 routing.
+# Used only with EXT chain.
+# False (default): ARP requests are sent to find out dest MAC addresses.
+# True: do not send ARP but use provisioned dest macs instead
+# (see mac_addrs_left and mac_addrs_right)
no_arp: false
+# Loop VM (VPP forwarder) can use ARP to discover next hop mac address
+# False (default): do not send ARP but use static config devices macs instead (TRex gratuitous ARP are not interpreted by VPP)
+# True: ARP requests are sent to find out next hop MAC addresses (for instance SDN-GW)
+loop_vm_arp: false
+
# Traffic Profiles
# You can add here more profiles as needed
# `l2frame_size` can be specified in any none zero integer value to represent the size in bytes
@@ -314,9 +763,18 @@ traffic:
# Can be overriden by --no-traffic
no_traffic: false
-# Do not reset tx/rx counters prior to running
-# Can be overriden by --no-reset
-no_reset: false
+# Use an L3 router in the packet path. This option if set will create or reuse an OpenStack neutron
+# router (PVP, PVVP) or reuse an existing L3 router (EXT) to route traffic to the destination VM.
+# Can be overriden by --l3-router
+l3_router: false
+
+# If l3_router is true and depending on ARP stale time SUT configuration
+# Gratuitous ARP (GARP) from TG port to the router is needed to keep traffic up
+# Default value: 1 packet per second
+# This value needs to be defined inferior to SUT ARP stale time to avoid GARP packets drop
+# in case of high load traffic
+periodic_gratuitous_arp: false
+gratuitous_arp_pps: 1
# Test configuration
@@ -343,6 +801,9 @@ duration_sec: 60
# Can be overridden by --interval
interval_sec: 10
+# Default pause between iterations of a binary search (NDR/PDR)
+pause_sec: 2
+
# NDR / PDR configuration
measurement:
# Drop rates represent the ratio of dropped packet to the total number of packets sent.
@@ -381,6 +842,26 @@ debug: false
# Defaults to disabled
log_file:
+# One can specify a user ID for changing ownership of output log/json files
+# - empty: depends on file existency
+# . yes? replacement, owner is unchanged
+# . no ? creation with root as user
+# - 0: this is the root user ID
+# - other: will corresponds (or not) to an existing user/group in the host
+# (the current user ID can be obtained with the command 'id -u')
+# Can be overriden by --user-id
+# Consider also that the default value below is overridable by a USER_ID env variable,
+# if nfvbench is run into a container, this information can be passed at its creation.
+# The overall precedence rule is: 'default_config (this) < env < config < command_line'
+user_id:
+
+# Similarly, the group ID is defined
+# Can be overriden by --group-id
+# Default may be set through env GROUP_ID
+# Caveat: user and group with a same name may have different numerical IDs
+# (the current group ID can be obtained with the command 'id -g')
+group_id:
+
# When enabled, all results and/or logs will be sent to a fluentd servers at the requested IPs and ports
# A list of one or more fluentd servers identified by their IPs and port numbers should be given.
# For each recipient it is possible to enable both sending logs and performance
@@ -415,3 +896,58 @@ factory_class: 'BasicFactory'
# Custom label added for every perf record generated during this run.
# Can be overriden by --user-label
user_label:
+
+# Custom information to be passed to results post-processing,
+# they will be included as is in the json report 'config' branch.
+# Useful for documenting or automating further treatments.
+# The value is any yaml object (=> open usage) - example:
+# |user_info:
+# | status: explore
+# | description:
+# | generator: VM
+# | attachment: direct
+# | target: lab-pf
+# | switch: qfx3500
+# Keys may be merged/overriden using the --user-info command line option
+# (the command-line parameter value is expressed as a json object string)
+user_info:
+
+
+# THESE FIELDS SHOULD BE USED VERY RARELY OR ON PURPOSE
+
+# Skip vswitch configuration and retrieving of stats
+# Can be overriden by --no-vswitch-access
+# Should be left to the default value (false)
+no_vswitch_access: false
+
+# Enable service mode for trafic capture from TRex console (for debugging purpose)
+# Can be overriden by --service-mode
+# Should be left to the default value (false)
+service_mode: false
+
+# Disable extra flow stats (on high load traffic)
+# Can be overriden by --no-flow-stats
+# Should be left to the default value (false)
+no_flow_stats: false
+
+# Disable flow stats for latency traffic
+# Can be overriden by --no-latency-stats
+# Should be left to the default value (false)
+no_latency_stats: false
+
+# Disable latency measurements (no streams)
+# Can be overriden by --no-latency-streams
+# Should be left to the default value (false)
+no_latency_streams: false
+
+# Skip "end to end" connectivity check on traffic setup
+# Can be overriden by --no-e2e-check
+# Should be left to the default value (false)
+# This flag is usable for traffic generation only
+no_e2e_check: false
+
+# General purpose register (debugging flags)
+# Can be overriden by --debug-mask
+# Designed for development needs
+# The hexadecimal notation (0x...) is accepted.
+debug_mask: 0x00000000
diff --git a/nfvbench/chain_clients.py b/nfvbench/chain_clients.py
deleted file mode 100644
index faf7c2a..0000000
--- a/nfvbench/chain_clients.py
+++ /dev/null
@@ -1,596 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 Cisco Systems, Inc. All rights reserved.
-#
-# 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 os
-import re
-import time
-
-from glanceclient.v2 import client as glanceclient
-from neutronclient.neutron import client as neutronclient
-from novaclient.client import Client
-
-import compute
-from log import LOG
-
-class StageClientException(Exception):
- pass
-
-
-class BasicStageClient(object):
- """Client for spawning and accessing the VM setup"""
-
- nfvbenchvm_config_name = 'nfvbenchvm.conf'
-
- def __init__(self, config, cred):
- self.comp = None
- self.image_instance = None
- self.image_name = None
- self.config = config
- self.cred = cred
- self.nets = []
- self.vms = []
- self.created_ports = []
- self.ports = {}
- self.compute_nodes = set([])
- self.comp = None
- self.neutron = None
- self.flavor_type = {'is_reuse': True, 'flavor': None}
- self.host_ips = None
-
- def _ensure_vms_active(self):
- retry_count = (self.config.check_traffic_time_sec +
- self.config.generic_poll_sec - 1) / self.config.generic_poll_sec
- for _ in range(retry_count):
- for i, instance in enumerate(self.vms):
- if instance.status == 'ACTIVE':
- continue
- is_reuse = getattr(instance, 'is_reuse', True)
- instance = self.comp.poll_server(instance)
- if instance.status == 'ERROR':
- raise StageClientException('Instance creation error: %s' %
- instance.fault['message'])
- if instance.status == 'ACTIVE':
- LOG.info('Created instance: %s', instance.name)
- self.vms[i] = instance
- setattr(self.vms[i], 'is_reuse', is_reuse)
-
- if all([(vm.status == 'ACTIVE') for vm in self.vms]):
- return
- time.sleep(self.config.generic_poll_sec)
- raise StageClientException('Timed out waiting for VMs to spawn')
-
- def _setup_openstack_clients(self):
- self.session = self.cred.get_session()
- nova_client = Client(2, session=self.session)
- self.neutron = neutronclient.Client('2.0', session=self.session)
- self.glance_client = glanceclient.Client('2',
- session=self.session)
- self.comp = compute.Compute(nova_client, self.glance_client, self.neutron, self.config)
-
- def _lookup_network(self, network_name):
- networks = self.neutron.list_networks(name=network_name)
- return networks['networks'][0] if networks['networks'] else None
-
- def _create_net(self, name, subnet, cidr, network_type=None,
- segmentation_id=None, physical_network=None):
- network = self._lookup_network(name)
- if network:
- # a network of same name already exists, we need to verify it has the same
- # characteristics
- if segmentation_id:
- if network['provider:segmentation_id'] != segmentation_id:
- raise StageClientException("Mismatch of 'segmentation_id' for reused "
- "network '{net}'. Network has id '{seg_id1}', "
- "configuration requires '{seg_id2}'."
- .format(net=name,
- seg_id1=network['provider:segmentation_id'],
- seg_id2=segmentation_id))
-
- if physical_network:
- if network['provider:physical_network'] != physical_network:
- raise StageClientException("Mismatch of 'physical_network' for reused "
- "network '{net}'. Network has '{phys1}', "
- "configuration requires '{phys2}'."
- .format(net=name,
- phys1=network['provider:physical_network'],
- phys2=physical_network))
-
- LOG.info('Reusing existing network: %s', name)
- network['is_reuse'] = True
- return network
-
- body = {
- 'network': {
- 'name': name,
- 'admin_state_up': True
- }
- }
-
- if network_type:
- body['network']['provider:network_type'] = network_type
- if segmentation_id:
- body['network']['provider:segmentation_id'] = segmentation_id
- if physical_network:
- body['network']['provider:physical_network'] = physical_network
-
- network = self.neutron.create_network(body)['network']
- body = {
- 'subnet': {
- 'name': subnet,
- 'cidr': cidr,
- 'network_id': network['id'],
- 'enable_dhcp': False,
- 'ip_version': 4,
- 'dns_nameservers': []
- }
- }
- subnet = self.neutron.create_subnet(body)['subnet']
- # add subnet id to the network dict since it has just been added
- network['subnets'] = [subnet['id']]
- network['is_reuse'] = False
- LOG.info('Created network: %s.', name)
- return network
-
- def _create_port(self, net, vnic_type='normal'):
- body = {
- "port": {
- 'network_id': net['id'],
- 'binding:vnic_type': vnic_type
- }
- }
- port = self.neutron.create_port(body)
- return port['port']
-
- def __delete_port(self, port):
- retry = 0
- while retry < self.config.generic_retry_count:
- try:
- self.neutron.delete_port(port['id'])
- return
- except Exception:
- retry += 1
- time.sleep(self.config.generic_poll_sec)
- LOG.error('Unable to delete port: %s', port['id'])
-
- def __delete_net(self, network):
- retry = 0
- while retry < self.config.generic_retry_count:
- try:
- self.neutron.delete_network(network['id'])
- return
- except Exception:
- retry += 1
- time.sleep(self.config.generic_poll_sec)
- LOG.error('Unable to delete network: %s', network['name'])
-
- def __get_server_az(self, server):
- availability_zone = getattr(server, 'OS-EXT-AZ:availability_zone', None)
- host = getattr(server, 'OS-EXT-SRV-ATTR:host', None)
- if availability_zone is None:
- return None
- if host is None:
- return None
- return availability_zone + ':' + host
-
- def _lookup_servers(self, name=None, nets=None, az=None, flavor_id=None):
- error_msg = 'VM with the same name, but non-matching {} found. Aborting.'
- networks = set([net['name'] for net in nets]) if nets else None
- server_list = self.comp.get_server_list()
- matching_servers = []
-
- for server in server_list:
- if name and server.name != name:
- continue
-
- if flavor_id and server.flavor['id'] != flavor_id:
- raise StageClientException(error_msg.format('flavors'))
-
- if networks and not set(server.networks.keys()).issuperset(networks):
- raise StageClientException(error_msg.format('networks'))
-
- if server.status != "ACTIVE":
- raise StageClientException(error_msg.format('state'))
-
- # everything matches
- matching_servers.append(server)
-
- return matching_servers
-
- def _create_server(self, name, ports, az, nfvbenchvm_config):
- port_ids = [{'port-id': port['id']} for port in ports]
- nfvbenchvm_config_location = os.path.join('/etc/', self.nfvbenchvm_config_name)
- server = self.comp.create_server(name,
- self.image_instance,
- self.flavor_type['flavor'],
- None,
- port_ids,
- None,
- avail_zone=az,
- user_data=None,
- config_drive=True,
- files={nfvbenchvm_config_location: nfvbenchvm_config})
- if server:
- setattr(server, 'is_reuse', False)
- LOG.info('Creating instance: %s on %s', name, az)
- else:
- raise StageClientException('Unable to create instance: %s.' % (name))
- return server
-
- def _setup_resources(self):
- # To avoid reuploading image in server mode, check whether image_name is set or not
- if self.image_name:
- self.image_instance = self.comp.find_image(self.image_name)
- if self.image_instance:
- LOG.info("Reusing image %s", self.image_name)
- else:
- image_name_search_pattern = r'(nfvbenchvm-\d+(\.\d+)*).qcow2'
- if self.config.vm_image_file:
- match = re.search(image_name_search_pattern, self.config.vm_image_file)
- if match:
- self.image_name = match.group(1)
- LOG.info('Using provided VM image file %s', self.config.vm_image_file)
- else:
- raise StageClientException('Provided VM image file name %s must start with '
- '"nfvbenchvm-<version>"' % self.config.vm_image_file)
- else:
- pkg_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
- for f in os.listdir(pkg_root):
- if re.search(image_name_search_pattern, f):
- self.config.vm_image_file = pkg_root + '/' + f
- self.image_name = f.replace('.qcow2', '')
- LOG.info('Found built-in VM image file %s', f)
- break
- else:
- raise StageClientException('Cannot find any built-in VM image file.')
- if self.image_name:
- self.image_instance = self.comp.find_image(self.image_name)
- if not self.image_instance:
- LOG.info('Uploading %s', self.image_name)
- res = self.comp.upload_image_via_url(self.image_name,
- self.config.vm_image_file)
-
- if not res:
- raise StageClientException('Error uploading image %s from %s. ABORTING.'
- % (self.image_name,
- self.config.vm_image_file))
- LOG.info('Image %s successfully uploaded.', self.image_name)
- self.image_instance = self.comp.find_image(self.image_name)
-
- self.__setup_flavor()
-
- def __setup_flavor(self):
- if self.flavor_type.get('flavor', False):
- return
-
- self.flavor_type['flavor'] = self.comp.find_flavor(self.config.flavor_type)
- if self.flavor_type['flavor']:
- self.flavor_type['is_reuse'] = True
- else:
- flavor_dict = self.config.flavor
- extra_specs = flavor_dict.pop('extra_specs', None)
-
- self.flavor_type['flavor'] = self.comp.create_flavor(self.config.flavor_type,
- override=True,
- **flavor_dict)
-
- LOG.info("Flavor '%s' was created.", self.config.flavor_type)
-
- if extra_specs:
- self.flavor_type['flavor'].set_keys(extra_specs)
-
- self.flavor_type['is_reuse'] = False
-
- if self.flavor_type['flavor'] is None:
- raise StageClientException('%s: flavor to launch VM not found. ABORTING.'
- % self.config.flavor_type)
-
- def __delete_flavor(self, flavor):
- if self.comp.delete_flavor(flavor=flavor):
- LOG.info("Flavor '%s' deleted", self.config.flavor_type)
- self.flavor_type = {'is_reuse': False, 'flavor': None}
- else:
- LOG.error('Unable to delete flavor: %s', self.config.flavor_type)
-
- def get_config_file(self, chain_index, src_mac, dst_mac, intf_mac1, intf_mac2):
- boot_script_file = os.path.join(os.path.dirname(os.path.abspath(__file__)),
- 'nfvbenchvm/', self.nfvbenchvm_config_name)
-
- with open(boot_script_file, 'r') as boot_script:
- content = boot_script.read()
-
- g1cidr = self.config.generator_config.src_device.get_gw_ip(chain_index) + '/8'
- g2cidr = self.config.generator_config.dst_device.get_gw_ip(chain_index) + '/8'
-
- vm_config = {
- 'forwarder': self.config.vm_forwarder,
- 'intf_mac1': intf_mac1,
- 'intf_mac2': intf_mac2,
- 'tg_gateway1_ip': self.config.traffic_generator.tg_gateway_ip_addrs[0],
- 'tg_gateway2_ip': self.config.traffic_generator.tg_gateway_ip_addrs[1],
- 'tg_net1': self.config.traffic_generator.ip_addrs[0],
- 'tg_net2': self.config.traffic_generator.ip_addrs[1],
- 'vnf_gateway1_cidr': g1cidr,
- 'vnf_gateway2_cidr': g2cidr,
- 'tg_mac1': src_mac,
- 'tg_mac2': dst_mac
- }
-
- return content.format(**vm_config)
-
- def set_ports(self):
- """Stores all ports of NFVbench networks."""
- nets = self.get_networks_uuids()
- for port in self.neutron.list_ports()['ports']:
- if port['network_id'] in nets:
- ports = self.ports.setdefault(port['network_id'], [])
- ports.append(port)
-
- def disable_port_security(self):
- """
- Disable security at port level.
- """
- vm_ids = [vm.id for vm in self.vms]
- for net in self.nets:
- for port in self.ports[net['id']]:
- if port['device_id'] in vm_ids:
- try:
- self.neutron.update_port(port['id'], {
- 'port': {
- 'security_groups': [],
- 'port_security_enabled': False,
- }
- })
- LOG.info('Security disabled on port %s', port['id'])
- except Exception:
- LOG.warning('Failed to disable port security on port %s, ignoring...',
- port['id'])
-
-
- def get_loop_vm_hostnames(self):
- return [getattr(vm, 'OS-EXT-SRV-ATTR:hypervisor_hostname') for vm in self.vms]
-
- def get_host_ips(self):
- '''Return the IP adresss(es) of the host compute nodes for this VMclient instance.
- Returns a list of 1 IP adress or 2 IP addresses (PVVP inter-node)
- '''
- if not self.host_ips:
- # get the hypervisor object from the host name
- self.host_ips = [self.comp.get_hypervisor(
- getattr(vm, 'OS-EXT-SRV-ATTR:hypervisor_hostname')).host_ip for vm in self.vms]
- return self.host_ips
-
- def get_loop_vm_compute_nodes(self):
- compute_nodes = []
- for vm in self.vms:
- az = getattr(vm, 'OS-EXT-AZ:availability_zone')
- hostname = getattr(vm, 'OS-EXT-SRV-ATTR:hypervisor_hostname')
- compute_nodes.append(az + ':' + hostname)
- return compute_nodes
-
- def get_reusable_vm(self, name, nets, az):
- servers = self._lookup_servers(name=name, nets=nets, az=az,
- flavor_id=self.flavor_type['flavor'].id)
- if servers:
- server = servers[0]
- LOG.info('Reusing existing server: %s', name)
- setattr(server, 'is_reuse', True)
- return server
- return None
-
- def get_networks_uuids(self):
- """
- Extract UUID of used networks. Order is important.
-
- :return: list of UUIDs of created networks
- """
- return [net['id'] for net in self.nets]
-
- def get_vlans(self):
- """
- Extract vlans of used networks. Order is important.
-
- :return: list of UUIDs of created networks
- """
- vlans = []
- for net in self.nets:
- assert net['provider:network_type'] == 'vlan'
- vlans.append(net['provider:segmentation_id'])
-
- return vlans
-
- def setup(self):
- """
- Creates two networks and spawn a VM which act as a loop VM connected
- with the two networks.
- """
- if self.cred:
- self._setup_openstack_clients()
-
- def dispose(self, only_vm=False):
- """
- Deletes the created two networks and the VM.
- """
- for vm in self.vms:
- if vm:
- if not getattr(vm, 'is_reuse', True):
- self.comp.delete_server(vm)
- else:
- LOG.info('Server %s not removed since it is reused', vm.name)
-
- for port in self.created_ports:
- self.__delete_port(port)
-
- if not only_vm:
- for net in self.nets:
- if 'is_reuse' in net and not net['is_reuse']:
- self.__delete_net(net)
- else:
- LOG.info('Network %s not removed since it is reused', net['name'])
-
- if not self.flavor_type['is_reuse']:
- self.__delete_flavor(self.flavor_type['flavor'])
-
-
-class EXTStageClient(BasicStageClient):
- def setup(self):
- super(EXTStageClient, self).setup()
-
- # Lookup two existing networks
- if self.cred:
- for net_name in [self.config.external_networks.left,
- self.config.external_networks.right]:
- net = self._lookup_network(net_name)
- if net:
- self.nets.append(net)
- else:
- raise StageClientException('Existing network {} cannot be found.'.
- format(net_name))
-
-
-class PVPStageClient(BasicStageClient):
- def get_end_port_macs(self):
- vm_ids = [vm.id for vm in self.vms]
- port_macs = []
- for _index, net in enumerate(self.nets):
- vm_mac_map = {port['device_id']: port['mac_address'] for port in self.ports[net['id']]}
- port_macs.append([vm_mac_map[vm_id] for vm_id in vm_ids])
- return port_macs
-
- def setup(self):
- super(PVPStageClient, self).setup()
- self._setup_resources()
-
- # Create two networks
- nets = self.config.internal_networks
- self.nets.extend([self._create_net(**n) for n in [nets.left, nets.right]])
-
- az_list = self.comp.get_enabled_az_host_list(required_count=1)
- if not az_list:
- raise Exception('Not enough hosts found.')
-
- az = az_list[0]
- self.compute_nodes.add(az)
- for chain_index in xrange(self.config.service_chain_count):
- name = self.config.loop_vm_name + str(chain_index)
- reusable_vm = self.get_reusable_vm(name, self.nets, az)
- if reusable_vm:
- self.vms.append(reusable_vm)
- else:
- vnic_type = 'direct' if self.config.sriov else 'normal'
- ports = [self._create_port(net, vnic_type) for net in self.nets]
- config_file = self.get_config_file(chain_index,
- self.config.generator_config.src_device.mac,
- self.config.generator_config.dst_device.mac,
- ports[0]['mac_address'],
- ports[1]['mac_address'])
- self.created_ports.extend(ports)
- self.vms.append(self._create_server(name, ports, az, config_file))
- self._ensure_vms_active()
- self.set_ports()
-
-
-class PVVPStageClient(BasicStageClient):
- def get_end_port_macs(self):
- port_macs = []
- for index, net in enumerate(self.nets[:2]):
- vm_ids = [vm.id for vm in self.vms[index::2]]
- vm_mac_map = {port['device_id']: port['mac_address'] for port in self.ports[net['id']]}
- port_macs.append([vm_mac_map[vm_id] for vm_id in vm_ids])
- return port_macs
-
- def setup(self):
- super(PVVPStageClient, self).setup()
- self._setup_resources()
-
- # Create two networks
- nets = self.config.internal_networks
- self.nets.extend([self._create_net(**n) for n in [nets.left, nets.right, nets.middle]])
-
- required_count = 2 if self.config.inter_node else 1
- az_list = self.comp.get_enabled_az_host_list(required_count=required_count)
-
- if not az_list:
- raise Exception('Not enough hosts found.')
-
- az1 = az2 = az_list[0]
- if self.config.inter_node:
- if len(az_list) > 1:
- az1 = az_list[0]
- az2 = az_list[1]
- else:
- # fallback to intra-node
- az1 = az2 = az_list[0]
- self.config.inter_node = False
- LOG.info('Using intra-node instead of inter-node.')
-
- self.compute_nodes.add(az1)
- self.compute_nodes.add(az2)
-
- # Create loop VMs
- for chain_index in xrange(self.config.service_chain_count):
- name0 = self.config.loop_vm_name + str(chain_index) + 'a'
- # Attach first VM to net0 and net2
- vm0_nets = self.nets[0::2]
- reusable_vm0 = self.get_reusable_vm(name0, vm0_nets, az1)
-
- name1 = self.config.loop_vm_name + str(chain_index) + 'b'
- # Attach second VM to net1 and net2
- vm1_nets = self.nets[1:]
- reusable_vm1 = self.get_reusable_vm(name1, vm1_nets, az2)
-
- if reusable_vm0 and reusable_vm1:
- self.vms.extend([reusable_vm0, reusable_vm1])
- else:
- edge_vnic_type = 'direct' if self.config.sriov else 'normal'
- middle_vnic_type = 'direct' \
- if self.config.sriov and self.config.use_sriov_middle_net \
- else 'normal'
- vm0_port_net0 = self._create_port(vm0_nets[0], edge_vnic_type)
- vm0_port_net2 = self._create_port(vm0_nets[1], middle_vnic_type)
-
- vm1_port_net2 = self._create_port(vm1_nets[1], middle_vnic_type)
- vm1_port_net1 = self._create_port(vm1_nets[0], edge_vnic_type)
-
- self.created_ports.extend([vm0_port_net0,
- vm0_port_net2,
- vm1_port_net2,
- vm1_port_net1])
-
- # order of ports is important for sections below
- # order of MAC addresses needs to follow order of interfaces
- # TG0 (net0) -> VM0 (net2) -> VM1 (net2) -> TG1 (net1)
- config_file0 = self.get_config_file(chain_index,
- self.config.generator_config.src_device.mac,
- vm1_port_net2['mac_address'],
- vm0_port_net0['mac_address'],
- vm0_port_net2['mac_address'])
- config_file1 = self.get_config_file(chain_index,
- vm0_port_net2['mac_address'],
- self.config.generator_config.dst_device.mac,
- vm1_port_net2['mac_address'],
- vm1_port_net1['mac_address'])
-
- self.vms.append(self._create_server(name0,
- [vm0_port_net0, vm0_port_net2],
- az1,
- config_file0))
- self.vms.append(self._create_server(name1,
- [vm1_port_net2, vm1_port_net1],
- az2,
- config_file1))
-
- self._ensure_vms_active()
- self.set_ports()
diff --git a/nfvbench/chain_managers.py b/nfvbench/chain_managers.py
deleted file mode 100644
index 087c751..0000000
--- a/nfvbench/chain_managers.py
+++ /dev/null
@@ -1,244 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 Cisco Systems, Inc. All rights reserved.
-#
-# 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 time
-
-
-from log import LOG
-from network import Network
-from packet_analyzer import PacketAnalyzer
-from specs import ChainType
-from stats_collector import IntervalCollector
-
-
-class StageManager(object):
-
- def __init__(self, config, cred, factory):
- self.config = config
- self.client = None
- # conditions due to EXT chain special cases
- if (config.vlan_tagging and not config.vlans) or not config.no_int_config:
- VM_CLASS = factory.get_stage_class(config.service_chain)
- self.client = VM_CLASS(config, cred)
- self.client.setup()
-
- def get_vlans(self):
- return self.client.get_vlans() if self.client else []
-
- def get_host_ips(self):
- return self.client.get_host_ips()
-
- def get_networks_uuids(self):
- return self.client.get_networks_uuids()
-
- def disable_port_security(self):
- self.client.disable_port_security()
-
- def get_vms(self):
- return self.client.vms
-
- def get_nets(self):
- return self.client.nets
-
- def get_ports(self):
- return self.client.ports
-
- def get_compute_nodes(self):
- return self.client.compute_nodes
-
- def set_vm_macs(self):
- if self.client and self.config.service_chain != ChainType.EXT:
- self.config.generator_config.set_vm_mac_list(self.client.get_end_port_macs())
-
- def close(self):
- if not self.config.no_cleanup and self.client:
- self.client.dispose()
-
-
-class StatsManager(object):
-
- def __init__(self, config, clients, specs, factory, vlans, notifier=None):
- self.config = config
- self.clients = clients
- self.specs = specs
- self.notifier = notifier
- self.interval_collector = None
- self.vlans = vlans
- self.factory = factory
- self._setup()
-
- def set_vlan_tag(self, device, vlan):
- self.worker.set_vlan_tag(device, vlan)
-
- def _setup(self):
- WORKER_CLASS = self.factory.get_chain_worker(self.specs.openstack.encaps,
- self.config.service_chain)
- self.worker = WORKER_CLASS(self.config, self.clients, self.specs)
- try:
- self.worker.set_vlans(self.vlans)
- self._config_interfaces()
- except Exception as exc:
- # since the wrorker is up and running, we need to close it
- # in case of exception
- self.close()
- raise exc
-
- def _get_data(self):
- return self.worker.get_data() if self.worker else {}
-
- def _get_network(self, traffic_port, index=None, reverse=False):
- interfaces = [self.clients['traffic'].get_interface(traffic_port)]
- if self.worker:
- interfaces.extend(self.worker.get_network_interfaces(index))
- return Network(interfaces, reverse)
-
- def _config_interfaces(self):
- if self.config.service_chain != ChainType.EXT:
- self.clients['vm'].disable_port_security()
-
- self.worker.config_interfaces()
-
- def _generate_traffic(self):
- if self.config.no_traffic:
- return {}
-
- self.interval_collector = IntervalCollector(time.time())
- self.interval_collector.attach_notifier(self.notifier)
- LOG.info('Starting to generate traffic...')
- stats = {}
- for stats in self.clients['traffic'].run_traffic():
- self.interval_collector.add(stats)
-
- LOG.info('...traffic generating ended.')
- return stats
-
- def get_stats(self):
- return self.interval_collector.get() if self.interval_collector else []
-
- def get_version(self):
- return self.worker.get_version() if self.worker else {}
-
- def run(self):
- """
- Run analysis in both direction and return the analysis
- """
- if self.worker:
- self.worker.run()
-
- stats = self._generate_traffic()
- result = {
- 'raw_data': self._get_data(),
- 'packet_analysis': {},
- 'stats': stats
- }
-
- LOG.info('Requesting packet analysis on the forward direction...')
- result['packet_analysis']['direction-forward'] = \
- self.get_analysis([self._get_network(0, 0),
- self._get_network(0, 1, reverse=True)])
- LOG.info('Packet analysis on the forward direction completed')
-
- LOG.info('Requesting packet analysis on the reverse direction...')
- result['packet_analysis']['direction-reverse'] = \
- self.get_analysis([self._get_network(1, 1),
- self._get_network(1, 0, reverse=True)])
-
- LOG.info('Packet analysis on the reverse direction completed')
- return result
-
- def get_compute_nodes_bios(self):
- return self.worker.get_compute_nodes_bios() if self.worker else {}
-
- @staticmethod
- def get_analysis(nets):
- LOG.info('Starting traffic analysis...')
-
- packet_analyzer = PacketAnalyzer()
- # Traffic types are assumed to always alternate in every chain. Add a no stats interface in
- # between if that is not the case.
- tx = True
- for network in nets:
- for interface in network.get_interfaces():
- packet_analyzer.record(interface, 'tx' if tx else 'rx')
- tx = not tx
-
- LOG.info('...traffic analysis completed')
- return packet_analyzer.get_analysis()
-
- def close(self):
- if self.worker:
- self.worker.close()
-
-
-class PVPStatsManager(StatsManager):
-
- def __init__(self, config, clients, specs, factory, vlans, notifier=None):
- StatsManager.__init__(self, config, clients, specs, factory, vlans, notifier)
-
-
-class PVVPStatsManager(StatsManager):
-
- def __init__(self, config, clients, specs, factory, vlans, notifier=None):
- StatsManager.__init__(self, config, clients, specs, factory, vlans, notifier)
-
- def run(self):
- """
- Run analysis in both direction and return the analysis
- """
- fwd_v2v_net, rev_v2v_net = self.worker.run()
-
- stats = self._generate_traffic()
- result = {
- 'raw_data': self._get_data(),
- 'packet_analysis': {},
- 'stats': stats
- }
-
- fwd_nets = [self._get_network(0, 0)]
- if fwd_v2v_net:
- fwd_nets.append(fwd_v2v_net)
- fwd_nets.append(self._get_network(0, 1, reverse=True))
-
- rev_nets = [self._get_network(1, 1)]
- if rev_v2v_net:
- rev_nets.append(rev_v2v_net)
- rev_nets.append(self._get_network(1, 0, reverse=True))
-
- LOG.info('Requesting packet analysis on the forward direction...')
- result['packet_analysis']['direction-forward'] = self.get_analysis(fwd_nets)
- LOG.info('Packet analysis on the forward direction completed')
-
- LOG.info('Requesting packet analysis on the reverse direction...')
- result['packet_analysis']['direction-reverse'] = self.get_analysis(rev_nets)
-
- LOG.info('Packet analysis on the reverse direction completed')
- return result
-
-
-class EXTStatsManager(StatsManager):
- def __init__(self, config, clients, specs, factory, vlans, notifier=None):
- StatsManager.__init__(self, config, clients, specs, factory, vlans, notifier)
-
- def _setup(self):
- if self.specs.openstack:
- WORKER_CLASS = self.factory.get_chain_worker(self.specs.openstack.encaps,
- self.config.service_chain)
- self.worker = WORKER_CLASS(self.config, self.clients, self.specs)
- self.worker.set_vlans(self.vlans)
-
- if not self.config.no_int_config:
- self._config_interfaces()
- else:
- self.worker = None
diff --git a/nfvbench/chain_router.py b/nfvbench/chain_router.py
new file mode 100644
index 0000000..99114e0
--- /dev/null
+++ b/nfvbench/chain_router.py
@@ -0,0 +1,190 @@
+#!/usr/bin/env python
+# Copyright 2018 Cisco Systems, Inc. All rights reserved.
+#
+# 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.
+#
+
+# This module takes care of chaining routers
+#
+"""NFVBENCH CHAIN DISCOVERY/STAGING.
+
+This module takes care of staging/discovering resources that are participating in a
+L3 benchmarking session: routers, networks, ports, routes.
+If a resource is discovered with the same name, it will be reused.
+Otherwise it will be created.
+
+Once created/discovered, instances are checked to be in the active state (ready to pass traffic)
+Configuration parameters that will influence how these resources are staged/related:
+- openstack or no openstack
+- chain type
+- number of chains
+- number of VNF in each chain (PVP, PVVP)
+- SRIOV and middle port SRIOV for port types
+- whether networks are shared across chains or not
+
+There is not traffic generation involved in this module.
+"""
+import time
+
+from netaddr import IPAddress
+from netaddr import IPNetwork
+
+from .log import LOG
+
+
+class ChainException(Exception):
+ """Exception while operating the chains."""
+
+class ChainRouter(object):
+ """Could be a shared router across all chains or a chain private router."""
+
+ def __init__(self, manager, name, subnets, routes):
+ """Create a router for given chain."""
+ self.manager = manager
+ self.subnets = subnets
+ self.routes = routes
+ self.name = name
+ self.ports = [None, None]
+ self.reuse = False
+ self.router = None
+ try:
+ self._setup()
+ except Exception:
+ LOG.error("Error creating router %s", self.name)
+ self.delete()
+ raise
+
+ def _setup(self):
+ # Lookup if there is a matching router with same name
+ routers = self.manager.neutron_client.list_routers(name=self.name)
+
+ if routers['routers']:
+ router = routers['routers'][0]
+ # a router of same name already exists, we need to verify it has the same
+ # characteristics
+ if self.subnets:
+ for subnet in self.subnets:
+ if not self.get_router_interface(router['id'], subnet.network['subnets'][0]):
+ raise ChainException("Mismatch of 'subnet_id' for reused "
+ "router '{router}'.Router has no subnet id '{sub_id}'."
+ .format(router=self.name,
+ sub_id=subnet.network['subnets'][0]))
+ interfaces = self.manager.neutron_client.list_ports(device_id=router['id'])['ports']
+ # This string filters nfvbench networks in case when some other specific networks
+ # created and attached to the test nfvebnch router manually or automatically
+ # like in case of HA when neutron router virtually present on several network nodes
+ interfaces = [x for x in interfaces if x['fixed_ips'][0]['subnet_id'] in
+ [s.network['subnets'][0] for s in self.subnets]]
+ for interface in interfaces:
+ if self.is_ip_in_network(
+ interface['fixed_ips'][0]['ip_address'],
+ self.manager.config.traffic_generator.tg_gateway_ip_cidrs[0]) \
+ or self.is_ip_in_network(
+ interface['fixed_ips'][0]['ip_address'],
+ self.manager.config.traffic_generator.tg_gateway_ip_cidrs[1]):
+ self.ports[0] = interface
+ else:
+ self.ports[1] = interface
+ if self.routes:
+ for route in self.routes:
+ if route not in router['routes']:
+ LOG.info("Mismatch of 'router' for reused router '%s'."
+ "Router has no existing route destination '%s', "
+ "and nexthop '%s'.", self.name,
+ route['destination'],
+ route['nexthop'])
+ LOG.info("New route added to router %s for reused ", self.name)
+ body = {
+ 'router': {
+ 'routes': self.routes
+ }
+ }
+ self.manager.neutron_client.update_router(router['id'], body)
+
+ LOG.info('Reusing existing router: %s', self.name)
+ self.reuse = True
+ self.router = router
+ return
+
+ body = {
+ 'router': {
+ 'name': self.name,
+ 'admin_state_up': True
+ }
+ }
+ router = self.manager.neutron_client.create_router(body)['router']
+ router_id = router['id']
+
+ if self.subnets:
+ for subnet in self.subnets:
+ router_interface = {'subnet_id': subnet.network['subnets'][0]}
+ self.manager.neutron_client.add_interface_router(router_id, router_interface)
+ interfaces = self.manager.neutron_client.list_ports(device_id=router_id)['ports']
+ interfaces = [x for x in interfaces if x['fixed_ips'][0]['subnet_id'] in
+ [s.network['subnets'][0] for s in self.subnets]]
+ for interface in interfaces:
+ itf = interface['fixed_ips'][0]['ip_address']
+ cidr0 = self.manager.config.traffic_generator.tg_gateway_ip_cidrs[0]
+ cidr1 = self.manager.config.traffic_generator.tg_gateway_ip_cidrs[1]
+ if self.is_ip_in_network(itf, cidr0) or self.is_ip_in_network(itf, cidr1):
+ self.ports[0] = interface
+ else:
+ self.ports[1] = interface
+
+ if self.routes:
+ body = {
+ 'router': {
+ 'routes': self.routes
+ }
+ }
+ self.manager.neutron_client.update_router(router_id, body)
+
+ LOG.info('Created router: %s.', self.name)
+ self.router = self.manager.neutron_client.show_router(router_id)
+
+ def get_uuid(self):
+ """
+ Extract UUID of this router.
+
+ :return: UUID of this router
+ """
+ return self.router['id']
+
+ def get_router_interface(self, router_id, subnet_id):
+ interfaces = self.manager.neutron_client.list_ports(device_id=router_id)['ports']
+ matching_interface = None
+ for interface in interfaces:
+ if interface['fixed_ips'][0]['subnet_id'] == subnet_id:
+ matching_interface = interface
+ return matching_interface
+
+ def is_ip_in_network(self, interface_ip, cidr):
+ return IPAddress(interface_ip) in IPNetwork(cidr)
+
+ def delete(self):
+ """Delete this router."""
+ if not self.reuse and self.router:
+ retry = 0
+ while retry < self.manager.config.generic_retry_count:
+ try:
+ self.manager.neutron_client.delete_router(self.router['id'])
+ LOG.info("Deleted router: %s", self.name)
+ return
+ except Exception:
+ retry += 1
+ LOG.info('Error deleting router %s (retry %d/%d)...',
+ self.name,
+ retry,
+ self.manager.config.generic_retry_count)
+ time.sleep(self.manager.config.generic_poll_sec)
+ LOG.error('Unable to delete router: %s', self.name)
diff --git a/nfvbench/chain_runner.py b/nfvbench/chain_runner.py
index 63cc48f..f045528 100644
--- a/nfvbench/chain_runner.py
+++ b/nfvbench/chain_runner.py
@@ -13,71 +13,217 @@
# License for the specific language governing permissions and limitations
# under the License.
#
+"""This module takes care of coordinating a benchmark run between various modules.
-import traceback
+The ChainRunner class is in charge of coordinating:
+- the chain manager which takes care of staging resources
+- traffic generator client which drives the traffic generator
+- the stats manager which collects and aggregates stats
+"""
-from log import LOG
-from service_chain import ServiceChain
-from traffic_client import TrafficClient
+from collections import OrderedDict
+
+from .chaining import ChainManager
+from .log import LOG
+from .specs import ChainType
+from .stats_manager import StatsManager
+from .traffic_client import TrafficClient
class ChainRunner(object):
"""Run selected chain, collect results and analyse them."""
- def __init__(self, config, clients, cred, specs, factory, notifier=None):
+ def __init__(self, config, cred, specs, factory, notifier=None):
+ """Create a new instance of chain runner.
+
+ Create dependent components
+ A new instance is created everytime the nfvbench config may have changed.
+
+ config: the new nfvbench config to use for this run
+ cred: openstack credentials (or None if no openstack)
+ specs: TBD
+ factory:
+ notifier:
+ """
self.config = config
- self.clients = clients
+ self.cred = cred
self.specs = specs
self.factory = factory
+ self.notifier = notifier
self.chain_name = self.config.service_chain
- try:
- TORClass = factory.get_tor_class(self.config.tor.type, self.config.no_tor_access)
- except AttributeError:
- raise Exception("Requested TOR class '{}' was not found.".format(self.config.tor.type))
-
- self.clients['tor'] = TORClass(self.config.tor.switches)
- self.clients['traffic'] = TrafficClient(config, notifier)
- self.chain = ServiceChain(config, clients, cred, specs, factory, notifier)
+ # get an instance of traffic client
+ self.traffic_client = TrafficClient(config, notifier)
+
+ if self.config.no_traffic:
+ LOG.info('Dry run: traffic generation is disabled')
+ else:
+ # Start the traffic generator server
+ self.traffic_client.start_traffic_generator()
+
+ # get an instance of a chain manager
+ self.chain_manager = ChainManager(self)
+
+ # at this point all resources are setup/discovered
+ # we need to program the traffic dest MAC and VLANs
+ gen_config = self.traffic_client.generator_config
+ if config.vlan_tagging:
+ # VLAN is discovered from the networks
+ gen_config.set_vlans(0, self.chain_manager.get_chain_vlans(0))
+ gen_config.set_vlans(1, self.chain_manager.get_chain_vlans(1))
+ else:
+ LOG.info("Ports: untagged")
+
+ # the only case we do not need to set the dest MAC is in the case of
+ # l2-loopback (because the traffic gen will default to use the peer MAC)
+ # or EXT+ARP+VLAN (because dest MAC will be discovered by TRex ARP)
+ # Note that in the case of EXT+ARP+VxLAN, the dest MACs need to be loaded
+ # because ARP only operates on the dest VTEP IP not on the VM dest MAC
+ if not config.l2_loopback and \
+ (config.service_chain != ChainType.EXT or config.no_arp or config.vxlan):
+ gen_config.set_dest_macs(0, self.chain_manager.get_dest_macs(0))
+ gen_config.set_dest_macs(1, self.chain_manager.get_dest_macs(1))
+
+ if config.vxlan:
+ # VXLAN is discovered from the networks
+ vtep_vlan = gen_config.gen_config.vtep_vlan
+ src_vteps = gen_config.gen_config.src_vteps
+ dst_vtep = gen_config.gen_config.dst_vtep
+ gen_config.set_vxlans(0, self.chain_manager.get_chain_vxlans(0))
+ gen_config.set_vxlans(1, self.chain_manager.get_chain_vxlans(1))
+ gen_config.set_vtep_vlan(0, vtep_vlan)
+ gen_config.set_vtep_vlan(1, vtep_vlan)
+ # Configuring source an remote VTEPs on TREx interfaces
+ gen_config.set_vxlan_endpoints(0, src_vteps[0], dst_vtep)
+ gen_config.set_vxlan_endpoints(1, src_vteps[1], dst_vtep)
+ self.config['vxlan_gen_config'] = gen_config
+
+ if config.mpls:
+ # MPLS VPN is discovered from the networks
+ src_vteps = gen_config.gen_config.src_vteps
+ vtep_gateway_ips = gen_config.gen_config.vtep_gateway_ips
+ gen_config.set_mpls_inner_labels(0, self.chain_manager.get_chain_mpls_inner_labels(0))
+ gen_config.set_mpls_inner_labels(1, self.chain_manager.get_chain_mpls_inner_labels(1))
+ outer_mpls_labels_left = self.config.internal_networks.left.mpls_transport_labels
+ outer_mpls_labels_right = self.config.internal_networks.right.mpls_transport_labels
+ if outer_mpls_labels_left or outer_mpls_labels_right:
+ gen_config.set_mpls_outer_labels(0, outer_mpls_labels_left)
+ gen_config.set_mpls_outer_labels(1, outer_mpls_labels_right)
+ # Configuring source an remote VTEPs on TREx interfaces
+ gen_config.set_mpls_peers(0, src_vteps[0], vtep_gateway_ips[0])
+ gen_config.set_mpls_peers(1, src_vteps[1], vtep_gateway_ips[1])
+ self.config['mpls_gen_config'] = gen_config
+
+ # get an instance of the stats manager
+ self.stats_manager = StatsManager(self)
+ LOG.info('ChainRunner initialized')
+
+ def __setup_traffic(self):
+ # possibly skip connectivity check
+ if self.config.no_e2e_check:
+ LOG.info('Skipping end to end connectivity check')
+ return
+ self.traffic_client.setup()
+ if not self.config.no_traffic:
+ # ARP is needed for EXT chain or VxLAN overlay or MPLS unless disabled explicitly
+ if (self.config.service_chain == ChainType.EXT or self.config.mpls or
+ self.config.vxlan or self.config.l3_router or self.config.loop_vm_arp)\
+ and not self.config.no_arp:
+ self.traffic_client.ensure_arp_successful()
+ self.traffic_client.ensure_end_to_end()
+
+ def __get_result_per_frame_size(self, frame_size, bidirectional):
+ traffic_result = {
+ frame_size: {}
+ }
+ result = {}
+ if not self.config.no_traffic:
+ self.traffic_client.set_traffic(frame_size, bidirectional)
- LOG.info('ChainRunner initialized.')
+ if self.config.single_run:
+ result = self.stats_manager.run_fixed_rate()
+ else:
+ results = self.traffic_client.get_ndr_and_pdr()
+
+ for dr in ['pdr', 'ndr']:
+ if dr in results:
+ traffic_result[frame_size][dr] = results[dr]
+ if 'warning' in results[dr]['stats'] and results[dr]['stats']['warning']:
+ traffic_result['warning'] = results[dr]['stats']['warning']
+ traffic_result[frame_size]['iteration_stats'] = results['iteration_stats']
+
+ if self.config.single_run:
+ result['run_config'] = self.traffic_client.get_run_config(result)
+ required = result['run_config']['direction-total']['orig']['rate_pps']
+ if self.config.periodic_gratuitous_arp:
+ actual = result['stats']['total_tx_rate'] + self.config.gratuitous_arp_pps
+ else:
+ actual = result['stats']['total_tx_rate']
+ warning = self.traffic_client.compare_tx_rates(required, actual)
+ if warning is not None:
+ result['run_config']['warning'] = warning
+
+ traffic_result[frame_size].update(result)
+ return traffic_result
+
+ def __get_chain_result(self):
+ result = OrderedDict()
+ for fs in self.config.frame_sizes:
+ result.update(self.__get_result_per_frame_size(fs,
+ self.config.traffic.bidirectional))
+ chain_result = {
+ 'flow_count': self.config.flow_count,
+ 'service_chain_count': self.config.service_chain_count,
+ 'bidirectional': self.config.traffic.bidirectional,
+ 'profile': self.config.traffic.profile,
+ 'compute_nodes': self.stats_manager.get_compute_nodes_bios(),
+ 'result': result
+ }
+ return chain_result
def run(self):
- """
- Run a chain, collect and analyse results.
+ """Run the requested benchmark.
- :return: dictionary
+ return: the results of the benchmark as a dict
"""
- self.clients['traffic'].start_traffic_generator()
- self.clients['traffic'].set_macs()
+ results = {}
+ if self.config.no_traffic:
+ return results
+
+ LOG.info('Starting %dx%s benchmark...', self.config.service_chain_count, self.chain_name)
+ self.stats_manager.create_worker()
+ if self.config.vxlan or self.config.mpls:
+ # Configure vxlan or mpls tunnels
+ self.stats_manager.worker.config_interfaces()
+ self.__setup_traffic()
- return self.chain.run()
+ results[self.chain_name] = {'result': self.__get_chain_result()}
+
+ LOG.info("Service chain '%s' run completed.", self.chain_name)
+ return results
def close(self):
+ """Close this instance of chain runner and delete resources if applicable."""
try:
if not self.config.no_cleanup:
LOG.info('Cleaning up...')
+ if self.chain_manager:
+ self.chain_manager.delete()
else:
LOG.info('Clean up skipped.')
-
- for client in ['traffic', 'tor']:
- try:
- self.clients[client].close()
- except Exception as e:
- traceback.print_exc()
- LOG.error(e)
-
- self.chain.close()
+ try:
+ self.traffic_client.close()
+ except Exception as exc:
+ LOG.exception(exc)
+ if self.stats_manager:
+ self.stats_manager.close()
except Exception:
- traceback.print_exc()
- LOG.error('Cleanup not finished.')
+ LOG.exception('Cleanup not finished')
def get_version(self):
- versions = {
- 'Traffic Generator': self.clients['traffic'].get_version(),
- 'TOR': self.clients['tor'].get_version(),
- }
-
- versions.update(self.chain.get_version())
-
+ """Retrieve the version of dependent components."""
+ versions = {}
+ if self.traffic_client:
+ versions['Traffic_Generator'] = self.traffic_client.get_version()
+ versions.update(self.stats_manager.get_version())
return versions
diff --git a/nfvbench/chain_workers.py b/nfvbench/chain_workers.py
index 2e36fb1..e332d7b 100644
--- a/nfvbench/chain_workers.py
+++ b/nfvbench/chain_workers.py
@@ -17,37 +17,38 @@
class BasicWorker(object):
- def __init__(self, config, clients, specs):
- self.config = config
- self.clients = clients
- self.specs = specs
+ def __init__(self, stats_manager):
+ self.stats_manager = stats_manager
+ self.chain_manager = stats_manager.chain_runner.chain_manager
+ self.config = stats_manager.config
+ self.specs = stats_manager.specs
- def set_vlan_tag(self, device, vlan):
- device.set_vlan_tag(vlan)
+ def get_compute_nodes_bios(self):
+ return {}
- def set_vlans(self, vlans):
- pass
+ def get_version(self):
+ return {}
def config_interfaces(self):
- pass
-
- def get_data(self):
return {}
- def get_network_interfaces(self, index):
- return []
-
- def clear_interfaces(self):
+ def close(self):
pass
- def run(self):
- return None, None
+ def insert_interface_stats(self, pps_list):
+ """Insert interface stats to a list of packet path stats.
- def get_compute_nodes_bios(self):
- return {}
+ pps_list: a list of packet path stats instances indexed by chain index
- def get_version(self):
- return {}
+ Specialized workers can insert their own interface stats inside each existing packet path
+ stats for every chain.
+ """
- def close(self):
- pass
+ def update_interface_stats(self, diff=False):
+ """Update all interface stats.
+
+ diff: if False, simply refresh the interface stats values with latest values
+ if True, diff the interface stats with the latest values
+ Make sure that the interface stats inserted in insert_interface_stats() are updated
+ with proper values
+ """
diff --git a/nfvbench/chaining.py b/nfvbench/chaining.py
new file mode 100644
index 0000000..d6f67f9
--- /dev/null
+++ b/nfvbench/chaining.py
@@ -0,0 +1,1559 @@
+#!/usr/bin/env python
+# Copyright 2018 Cisco Systems, Inc. All rights reserved.
+#
+# 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.
+#
+
+# This module takes care of chaining networks, ports and vms
+#
+"""NFVBENCH CHAIN DISCOVERY/STAGING.
+
+This module takes care of staging/discovering all resources that are participating in a
+benchmarking session: flavors, networks, ports, VNF instances.
+If a resource is discovered with the same name, it will be reused.
+Otherwise it will be created.
+
+ChainManager: manages VM image, flavor, the staging discovery of all chains
+ has 1 or more chains
+Chain: manages one chain, has 2 or more networks and 1 or more instances
+ChainNetwork: manages 1 network in a chain
+ChainVnf: manages 1 VNF instance in a chain, has 2 ports
+ChainVnfPort: manages 1 instance port
+
+ChainManager-->Chain(*)
+Chain-->ChainNetwork(*),ChainVnf(*)
+ChainVnf-->ChainVnfPort(2)
+
+Once created/discovered, instances are checked to be in the active state (ready to pass traffic)
+Configuration parameters that will influence how these resources are staged/related:
+- openstack or no openstack
+- chain type
+- number of chains
+- number of VNF in each chain (PVP, PVVP)
+- SRIOV and middle port SRIOV for port types
+- whether networks are shared across chains or not
+
+There is not traffic generation involved in this module.
+"""
+import os
+import re
+import time
+
+import glanceclient
+from neutronclient.neutron import client as neutronclient
+from novaclient.client import Client
+
+from attrdict import AttrDict
+from .chain_router import ChainRouter
+from . import compute
+from .log import LOG
+from .specs import ChainType
+# Left and right index for network and port lists
+LEFT = 0
+RIGHT = 1
+# L3 traffic edge networks are at the end of networks list
+EDGE_LEFT = -2
+EDGE_RIGHT = -1
+# Name of the VM config file
+NFVBENCH_CFG_FILENAME = 'nfvbenchvm.conf'
+# full pathame of the VM config in the VM
+NFVBENCH_CFG_VM_PATHNAME = os.path.join('/etc/', NFVBENCH_CFG_FILENAME)
+# full path of the boot shell script template file on the server where nfvbench runs
+BOOT_SCRIPT_PATHNAME = os.path.join(os.path.dirname(os.path.abspath(__file__)),
+ 'nfvbenchvm',
+ NFVBENCH_CFG_FILENAME)
+
+
+class ChainException(Exception):
+ """Exception while operating the chains."""
+
+class NetworkEncaps(object):
+ """Network encapsulation."""
+
+
+class ChainFlavor(object):
+ """Class to manage the chain flavor."""
+
+ def __init__(self, flavor_name, flavor_dict, comp):
+ """Create a flavor."""
+ self.name = flavor_name
+ self.comp = comp
+ self.flavor = self.comp.find_flavor(flavor_name)
+ self.reuse = False
+ if self.flavor:
+ self.reuse = True
+ LOG.info("Reused flavor '%s'", flavor_name)
+ else:
+ extra_specs = flavor_dict.pop('extra_specs', None)
+
+ self.flavor = comp.create_flavor(flavor_name,
+ **flavor_dict)
+
+ LOG.info("Created flavor '%s'", flavor_name)
+ if extra_specs:
+ self.flavor.set_keys(extra_specs)
+
+ def delete(self):
+ """Delete this flavor."""
+ if not self.reuse and self.flavor:
+ self.flavor.delete()
+ LOG.info("Flavor '%s' deleted", self.name)
+
+
+class ChainVnfPort(object):
+ """A port associated to one VNF in the chain."""
+
+ def __init__(self, name, vnf, chain_network, vnic_type):
+ """Create or reuse a port on a given network.
+
+ if vnf.instance is None the VNF instance is not reused and this ChainVnfPort instance must
+ create a new port.
+ Otherwise vnf.instance is a reused VNF instance and this ChainVnfPort instance must
+ find an existing port to reuse that matches the port requirements: same attached network,
+ instance, name, vnic type
+
+ name: name for this port
+ vnf: ChainVNf instance that owns this port
+ chain_network: ChainNetwork instance where this port should attach
+ vnic_type: required vnic type for this port
+ """
+ self.name = name
+ self.vnf = vnf
+ self.manager = vnf.manager
+ self.reuse = False
+ self.port = None
+ self.floating_ip = None
+ if vnf.instance:
+ # VNF instance is reused, we need to find an existing port that matches this instance
+ # and network
+ # discover ports attached to this instance
+ port_list = self.manager.get_ports_from_network(chain_network)
+ for port in port_list:
+ if port['name'] != name:
+ continue
+ if port['binding:vnic_type'] != vnic_type:
+ continue
+ if port['device_id'] == vnf.get_uuid():
+ self.port = port
+ LOG.info('Reusing existing port %s mac=%s', name, port['mac_address'])
+ break
+ else:
+ raise ChainException('Cannot find matching port')
+ else:
+ # VNF instance is not created yet, we need to create a new port
+ body = {
+ "port": {
+ 'name': name,
+ 'network_id': chain_network.get_uuid(),
+ 'binding:vnic_type': vnic_type
+ }
+ }
+ subnet_id = chain_network.get_subnet_uuid()
+ if subnet_id:
+ body['port']['fixed_ips'] = [{'subnet_id': subnet_id}]
+
+ port = self.manager.neutron_client.create_port(body)
+ self.port = port['port']
+ LOG.info('Created port %s', name)
+ try:
+ self.manager.neutron_client.update_port(self.port['id'], {
+ 'port': {
+ 'security_groups': [],
+ 'port_security_enabled': False,
+ }
+ })
+ LOG.info('Security disabled on port %s', name)
+ except Exception:
+ LOG.info('Failed to disable security on port %s (ignored)', name)
+
+ def get_mac(self):
+ """Get the MAC address for this port."""
+ return self.port['mac_address']
+
+ def get_ip(self):
+ """Get the IP address for this port."""
+ return self.port['fixed_ips'][0]['ip_address']
+
+ def set_floating_ip(self, chain_network):
+ # create and add floating ip to port
+ try:
+ self.floating_ip = self.manager.neutron_client.create_floatingip({
+ 'floatingip': {
+ 'floating_network_id': chain_network.get_uuid(),
+ 'port_id': self.port['id'],
+ 'description': 'nfvbench floating ip for port:' + self.port['name'],
+ }})['floatingip']
+ LOG.info('Floating IP %s created and associated on port %s',
+ self.floating_ip['floating_ip_address'], self.name)
+ return self.floating_ip['floating_ip_address']
+ except Exception:
+ LOG.info('Failed to created and associated floating ip on port %s (ignored)', self.name)
+ return self.port['fixed_ips'][0]['ip_address']
+
+ def delete(self):
+ """Delete this port instance."""
+ if self.reuse or not self.port:
+ return
+ for _ in range(0, self.manager.config.generic_retry_count):
+ try:
+ self.manager.neutron_client.delete_port(self.port['id'])
+ LOG.info("Deleted port %s", self.name)
+ if self.floating_ip:
+ self.manager.neutron_client.delete_floatingip(self.floating_ip['id'])
+ LOG.info("Deleted floating IP %s", self.floating_ip['description'])
+ return
+ except Exception:
+ time.sleep(self.manager.config.generic_poll_sec)
+ LOG.error('Unable to delete port: %s', self.name)
+
+
+class ChainNetwork(object):
+ """Could be a shared network across all chains or a chain private network."""
+
+ def __init__(self, manager, network_config, chain_id=None, lookup_only=False,
+ suffix=None):
+ """Create a network for given chain.
+
+ network_config: a dict containing the network properties
+ (name, segmentation_id and physical_network)
+ chain_id: to which chain the networks belong.
+ a None value will mean that these networks are shared by all chains
+ suffix: a suffix to add to the network name (if not None)
+ """
+ self.manager = manager
+ if chain_id is None:
+ self.name = network_config.name
+ else:
+ # the name itself can be either a string or a list of names indexed by chain ID
+ if isinstance(network_config.name, tuple):
+ self.name = network_config.name[chain_id]
+ else:
+ # network_config.name is a prefix string
+ self.name = network_config.name + str(chain_id)
+ if suffix:
+ self.name = self.name + suffix
+ self.segmentation_id = self._get_item(network_config.segmentation_id,
+ chain_id, auto_index=True)
+ self.subnet_name = self._get_item(network_config.subnet, chain_id)
+ self.physical_network = self._get_item(network_config.physical_network, chain_id)
+
+ self.reuse = False
+ self.network = None
+ self.vlan = None
+ self.router_name = None
+ if manager.config.l3_router and hasattr(network_config, 'router_name'):
+ self.router_name = network_config.router_name
+ try:
+ self._setup(network_config, lookup_only)
+ except Exception:
+ if lookup_only:
+ LOG.error("Cannot find network %s", self.name)
+ else:
+ LOG.error("Error creating network %s", self.name)
+ self.delete()
+ raise
+
+ def _get_item(self, item_field, index, auto_index=False):
+ """Retrieve an item from a list or a single value.
+
+ item_field: can be None, a tuple of a single value
+ index: if None is same as 0, else is the index for a chain
+ auto_index: if true will automatically get the final value by adding the
+ index to the base value (if full list not provided)
+
+ If the item_field is not a tuple, it is considered same as a tuple with same value at any
+ index.
+ If a list is provided, its length must be > index
+ """
+ if not item_field:
+ return None
+ if index is None:
+ index = 0
+ if isinstance(item_field, tuple):
+ try:
+ return item_field[index]
+ except IndexError:
+ raise ChainException("List %s is too short for chain index %d" %
+ (str(item_field), index)) from IndexError
+ # single value is configured
+ if auto_index:
+ return item_field + index
+ return item_field
+
+ def _setup(self, network_config, lookup_only):
+ # Lookup if there is a matching network with same name
+ networks = self.manager.neutron_client.list_networks(name=self.name)
+ if networks['networks']:
+ network = networks['networks'][0]
+ # a network of same name already exists, we need to verify it has the same
+ # characteristics
+ if self.segmentation_id:
+ if network['provider:segmentation_id'] != self.segmentation_id:
+ raise ChainException("Mismatch of 'segmentation_id' for reused "
+ "network '{net}'. Network has id '{seg_id1}', "
+ "configuration requires '{seg_id2}'."
+ .format(net=self.name,
+ seg_id1=network['provider:segmentation_id'],
+ seg_id2=self.segmentation_id))
+
+ if self.physical_network:
+ if network['provider:physical_network'] != self.physical_network:
+ raise ChainException("Mismatch of 'physical_network' for reused "
+ "network '{net}'. Network has '{phys1}', "
+ "configuration requires '{phys2}'."
+ .format(net=self.name,
+ phys1=network['provider:physical_network'],
+ phys2=self.physical_network))
+
+ LOG.info('Reusing existing network %s', self.name)
+ self.reuse = True
+ self.network = network
+ else:
+ if lookup_only:
+ raise ChainException('Network %s not found' % self.name)
+ body = {
+ 'network': {
+ 'name': self.name,
+ 'admin_state_up': True
+ }
+ }
+ if network_config.network_type:
+ body['network']['provider:network_type'] = network_config.network_type
+ if self.segmentation_id:
+ body['network']['provider:segmentation_id'] = self.segmentation_id
+ if self.physical_network:
+ body['network']['provider:physical_network'] = self.physical_network
+ self.network = self.manager.neutron_client.create_network(body)['network']
+ # create associated subnet, all subnets have the same name (which is ok since
+ # we do not need to address them directly by name)
+ body = {
+ 'subnet': {'name': network_config.subnet,
+ 'cidr': network_config.cidr,
+ 'network_id': self.network['id'],
+ 'enable_dhcp': False,
+ 'ip_version': 4,
+ 'dns_nameservers': []}
+ }
+ subnet = self.manager.neutron_client.create_subnet(body)['subnet']
+ # add subnet id to the network dict since it has just been added
+ self.network['subnets'] = [subnet['id']]
+ LOG.info('Created network: %s', self.name)
+
+ def get_uuid(self):
+ """
+ Extract UUID of this network.
+
+ :return: UUID of this network
+ """
+ return self.network['id']
+
+ def get_subnet_uuid(self):
+ """
+ Extract UUID of this subnet network.
+
+ :return: UUID of this subnet network
+ """
+ for subnet in self.network['subnets']:
+ if self.subnet_name == self.manager.neutron_client \
+ .show_subnet(subnet)['subnet']['name']:
+ return subnet
+ return None
+
+ def get_vlan(self):
+ """
+ Extract vlan for this network.
+
+ :return: vlan ID for this network
+ """
+ if self.network['provider:network_type'] != 'vlan':
+ raise ChainException('Trying to retrieve VLAN id for non VLAN network')
+ return self.network['provider:segmentation_id']
+
+ def get_vxlan(self):
+ """
+ Extract VNI for this network.
+
+ :return: VNI ID for this network
+ """
+
+ return self.network['provider:segmentation_id']
+
+ def get_mpls_inner_label(self):
+ """
+ Extract MPLS VPN Label for this network.
+
+ :return: MPLS VPN Label for this network
+ """
+
+ return self.network['provider:segmentation_id']
+
+ def delete(self):
+ """Delete this network."""
+ if not self.reuse and self.network:
+ for retry in range(0, self.manager.config.generic_retry_count):
+ try:
+ self.manager.neutron_client.delete_network(self.network['id'])
+ LOG.info("Deleted network: %s", self.name)
+ return
+ except Exception:
+ LOG.info('Error deleting network %s (retry %d/%d)...',
+ self.name,
+ retry + 1,
+ self.manager.config.generic_retry_count)
+ time.sleep(self.manager.config.generic_poll_sec)
+ LOG.error('Unable to delete network: %s', self.name)
+
+
+class ChainVnf(object):
+ """A class to represent a VNF in a chain."""
+
+ def __init__(self, chain, vnf_id, networks):
+ """Reuse a VNF instance with same characteristics or create a new VNF instance.
+
+ chain: the chain where this vnf belongs
+ vnf_id: indicates the index of this vnf in its chain (first vnf=0)
+ networks: the list of all networks (ChainNetwork) of the current chain
+ """
+ self.manager = chain.manager
+ self.chain = chain
+ self.vnf_id = vnf_id
+ self.name = self.manager.config.loop_vm_name + str(chain.chain_id)
+ if len(networks) > 2:
+ # we will have more than 1 VM in each chain
+ self.name += '-' + str(vnf_id)
+ # A list of ports for this chain
+ # There are normally 2 ports carrying traffic (index 0, and index 1) and
+ # potentially multiple idle ports not carrying traffic (index 2 and up)
+ # For example if 7 idle interfaces are requested, the corresp. ports will be
+ # at index 2 to 8
+ self.ports = []
+ self.management_port = None
+ self.routers = []
+ self.status = None
+ self.instance = None
+ self.reuse = False
+ self.host_ip = None
+ self.idle_networks = []
+ self.idle_ports = []
+ try:
+ # the vnf_id is conveniently also the starting index in networks
+ # for the left and right networks associated to this VNF
+ if self.manager.config.l3_router:
+ self._setup(networks[vnf_id:vnf_id + 4])
+ else:
+ self._setup(networks[vnf_id:vnf_id + 2])
+ except Exception:
+ LOG.error("Error creating VNF %s", self.name)
+ self.delete()
+ raise
+
+ def _get_vm_config(self, remote_mac_pair):
+ config = self.manager.config
+ devices = self.manager.generator_config.devices
+
+ if config.l3_router:
+ tg_gateway1_ip = self.routers[LEFT].ports[1]['fixed_ips'][0][
+ 'ip_address'] # router edge ip left
+ tg_gateway2_ip = self.routers[RIGHT].ports[1]['fixed_ips'][0][
+ 'ip_address'] # router edge ip right
+ tg_mac1 = self.routers[LEFT].ports[1]['mac_address'] # router edge mac left
+ tg_mac2 = self.routers[RIGHT].ports[1]['mac_address'] # router edge mac right
+ # edge cidr mask left
+ vnf_gateway1_cidr = \
+ self.ports[LEFT].get_ip() + self.__get_network_mask(
+ self.manager.config.edge_networks.left.cidr)
+ # edge cidr mask right
+ vnf_gateway2_cidr = \
+ self.ports[RIGHT].get_ip() + self.__get_network_mask(
+ self.manager.config.edge_networks.right.cidr)
+ if config.vm_forwarder != 'vpp':
+ raise ChainException(
+ 'L3 router mode imply to set VPP as VM forwarder.'
+ 'Please update your config file with: vm_forwarder: vpp')
+ else:
+ tg_gateway1_ip = devices[LEFT].tg_gateway_ip_addrs
+ tg_gateway2_ip = devices[RIGHT].tg_gateway_ip_addrs
+ if not config.loop_vm_arp:
+ tg_mac1 = remote_mac_pair[0]
+ tg_mac2 = remote_mac_pair[1]
+ else:
+ tg_mac1 = ""
+ tg_mac2 = ""
+
+ g1cidr = devices[LEFT].get_gw_ip(
+ self.chain.chain_id) + self.__get_network_mask(
+ self.manager.config.internal_networks.left.cidr)
+ g2cidr = devices[RIGHT].get_gw_ip(
+ self.chain.chain_id) + self.__get_network_mask(
+ self.manager.config.internal_networks.right.cidr)
+
+ vnf_gateway1_cidr = g1cidr
+ vnf_gateway2_cidr = g2cidr
+
+ with open(BOOT_SCRIPT_PATHNAME, 'r', encoding="utf-8") as boot_script:
+ content = boot_script.read()
+ vm_config = {
+ 'forwarder': config.vm_forwarder,
+ 'intf_mac1': self.ports[LEFT].get_mac(),
+ 'intf_mac2': self.ports[RIGHT].get_mac(),
+ 'tg_gateway1_ip': tg_gateway1_ip,
+ 'tg_gateway2_ip': tg_gateway2_ip,
+ 'tg_net1': devices[LEFT].ip_addrs,
+ 'tg_net2': devices[RIGHT].ip_addrs,
+ 'vnf_gateway1_cidr': vnf_gateway1_cidr,
+ 'vnf_gateway2_cidr': vnf_gateway2_cidr,
+ 'tg_mac1': tg_mac1,
+ 'tg_mac2': tg_mac2,
+ 'vif_mq_size': config.vif_multiqueue_size,
+ 'num_mbufs': config.num_mbufs
+ }
+ if self.manager.config.use_management_port:
+ mgmt_ip = self.management_port.port['fixed_ips'][0]['ip_address']
+ mgmt_mask = self.__get_network_mask(self.manager.config.management_network.cidr)
+ vm_config['intf_mgmt_cidr'] = mgmt_ip + mgmt_mask
+ vm_config['intf_mgmt_ip_gw'] = self.manager.config.management_network.gateway
+ vm_config['intf_mac_mgmt'] = self.management_port.port['mac_address']
+ else:
+ # Interface management config left empty to avoid error in VM spawn
+ # if nfvbench config has values for management network but use_management_port=false
+ vm_config['intf_mgmt_cidr'] = ''
+ vm_config['intf_mgmt_ip_gw'] = ''
+ vm_config['intf_mac_mgmt'] = ''
+ return content.format(**vm_config)
+
+ @staticmethod
+ def __get_network_mask(network):
+ return '/' + network.split('/')[1]
+
+ def _get_vnic_type(self, port_index):
+ """Get the right vnic type for given port indexself.
+
+ If SR-IOV is specified, middle ports in multi-VNF chains
+ can use vswitch or SR-IOV based on config.use_sriov_middle_net
+ """
+ if self.manager.config.sriov:
+ chain_length = self.chain.get_length()
+ if self.manager.config.use_sriov_middle_net or chain_length == 1:
+ return 'direct'
+ if self.vnf_id == 0 and port_index == 0:
+ # first VNF in chain must use sriov for left port
+ return 'direct'
+ if (self.vnf_id == chain_length - 1) and (port_index == 1):
+ # last VNF in chain must use sriov for right port
+ return 'direct'
+ return 'normal'
+
+ def _get_idle_networks_ports(self):
+ """Get the idle networks for PVP or PVVP chain (non shared net only)
+
+ For EXT packet path or shared net, returns empty list.
+ For PVP, PVVP these networks will be created if they do not exist.
+ chain_id: to which chain the networks belong.
+ a None value will mean that these networks are shared by all chains
+ """
+ networks = []
+ ports = []
+ config = self.manager.config
+ chain_id = self.chain.chain_id
+ idle_interfaces_per_vm = config.idle_interfaces_per_vm
+ if config.service_chain == ChainType.EXT or chain_id is None or \
+ idle_interfaces_per_vm == 0:
+ return
+
+ # Make a copy of the idle networks dict as we may have to modify the
+ # segmentation ID
+ idle_network_cfg = AttrDict(config.idle_networks)
+ if idle_network_cfg.segmentation_id:
+ segmentation_id = idle_network_cfg.segmentation_id + \
+ chain_id * idle_interfaces_per_vm
+ else:
+ segmentation_id = None
+ try:
+ # create as many idle networks and ports as requested
+ for idle_index in range(idle_interfaces_per_vm):
+ if config.service_chain == ChainType.PVP:
+ suffix = '.%d' % (idle_index)
+ else:
+ suffix = '.%d.%d' % (self.vnf_id, idle_index)
+ port_name = self.name + '-idle' + str(idle_index)
+ # update the segmentation id based on chain id and idle index
+ if segmentation_id:
+ idle_network_cfg.segmentation_id = segmentation_id + idle_index
+ port_name = port_name + "." + str(segmentation_id)
+
+ networks.append(ChainNetwork(self.manager,
+ idle_network_cfg,
+ chain_id,
+ suffix=suffix))
+ ports.append(ChainVnfPort(port_name,
+ self,
+ networks[idle_index],
+ 'normal'))
+ except Exception:
+ # need to cleanup all successful networks
+ for net in networks:
+ net.delete()
+ for port in ports:
+ port.delete()
+ raise
+ self.idle_networks = networks
+ self.idle_ports = ports
+
+ def _setup(self, networks):
+ flavor_id = self.manager.flavor.flavor.id
+ # Check if we can reuse an instance with same name
+ for instance in self.manager.existing_instances:
+ if instance.name == self.name:
+ instance_left = LEFT
+ instance_right = RIGHT
+ # In case of L3 traffic instance use edge networks
+ if self.manager.config.l3_router:
+ instance_left = EDGE_LEFT
+ instance_right = EDGE_RIGHT
+ # Verify that other instance characteristics match
+ if instance.flavor['id'] != flavor_id:
+ self._reuse_exception('Flavor mismatch')
+ if instance.status != "ACTIVE":
+ self._reuse_exception('Matching instance is not in ACTIVE state')
+ # The 2 networks for this instance must also be reused
+ if not networks[instance_left].reuse:
+ self._reuse_exception('network %s is new' % networks[instance_left].name)
+ if not networks[instance_right].reuse:
+ self._reuse_exception('network %s is new' % networks[instance_right].name)
+ # instance.networks have the network names as keys:
+ # {'nfvbench-rnet0': ['192.168.2.10'], 'nfvbench-lnet0': ['192.168.1.8']}
+ if networks[instance_left].name not in instance.networks:
+ self._reuse_exception('Left network mismatch')
+ if networks[instance_right].name not in instance.networks:
+ self._reuse_exception('Right network mismatch')
+
+ self.reuse = True
+ self.instance = instance
+ LOG.info('Reusing existing instance %s on %s',
+ self.name, self.get_hypervisor_name())
+ # create management port if needed
+ if self.manager.config.use_management_port:
+ self.management_port = ChainVnfPort(self.name + '-mgmt', self,
+ self.manager.management_network, 'normal')
+ ip = self.management_port.port['fixed_ips'][0]['ip_address']
+ if self.manager.config.use_floating_ip:
+ ip = self.management_port.set_floating_ip(self.manager.floating_ip_network)
+ LOG.info("Management interface will be active using IP: %s, "
+ "and you can connect over SSH with login: nfvbench and password: nfvbench", ip)
+ # create or reuse/discover 2 ports per instance
+ if self.manager.config.l3_router:
+ for index in [0, 1]:
+ self.ports.append(ChainVnfPort(self.name + '-' + str(index),
+ self,
+ networks[index + 2],
+ self._get_vnic_type(index)))
+ else:
+ for index in [0, 1]:
+ self.ports.append(ChainVnfPort(self.name + '-' + str(index),
+ self,
+ networks[index],
+ self._get_vnic_type(index)))
+
+ # create idle networks and ports only if instance is not reused
+ # if reused, we do not care about idle networks/ports
+ if not self.reuse:
+ self._get_idle_networks_ports()
+
+ # Create neutron routers for L3 traffic use case
+ if self.manager.config.l3_router and self.manager.openstack:
+ internal_nets = networks[:2]
+ if self.manager.config.service_chain == ChainType.PVP:
+ edge_nets = networks[2:]
+ else:
+ edge_nets = networks[3:]
+ subnets_left = [internal_nets[0], edge_nets[0]]
+ routes_left = [{'destination': self.manager.config.traffic_generator.ip_addrs[0],
+ 'nexthop': self.manager.config.traffic_generator.tg_gateway_ip_addrs[
+ 0]},
+ {'destination': self.manager.config.traffic_generator.ip_addrs[1],
+ 'nexthop': self.ports[0].get_ip()}]
+ self.routers.append(
+ ChainRouter(self.manager, edge_nets[0].router_name, subnets_left, routes_left))
+ subnets_right = [internal_nets[1], edge_nets[1]]
+ routes_right = [{'destination': self.manager.config.traffic_generator.ip_addrs[0],
+ 'nexthop': self.ports[1].get_ip()},
+ {'destination': self.manager.config.traffic_generator.ip_addrs[1],
+ 'nexthop': self.manager.config.traffic_generator.tg_gateway_ip_addrs[
+ 1]}]
+ self.routers.append(
+ ChainRouter(self.manager, edge_nets[1].router_name, subnets_right, routes_right))
+ # Overload gateway_ips property with router ip address for ARP and traffic calls
+ self.manager.generator_config.devices[LEFT].set_gw_ip(
+ self.routers[LEFT].ports[0]['fixed_ips'][0]['ip_address']) # router edge ip left)
+ self.manager.generator_config.devices[RIGHT].set_gw_ip(
+ self.routers[RIGHT].ports[0]['fixed_ips'][0]['ip_address']) # router edge ip right)
+
+ # if no reuse, actual vm creation is deferred after all ports in the chain are created
+ # since we need to know the next mac in a multi-vnf chain
+
+ def create_vnf(self, remote_mac_pair):
+ """Create the VNF instance if it does not already exist."""
+ if self.instance is None:
+ port_ids = []
+ if self.manager.config.use_management_port:
+ port_ids.append({'port-id': self.management_port.port['id']})
+ port_ids.extend([{'port-id': vnf_port.port['id']} for vnf_port in self.ports])
+ # add idle ports
+ for idle_port in self.idle_ports:
+ port_ids.append({'port-id': idle_port.port['id']})
+ vm_config = self._get_vm_config(remote_mac_pair)
+ az = self.manager.placer.get_required_az()
+ server = self.manager.comp.create_server(self.name,
+ self.manager.image_instance,
+ self.manager.flavor.flavor,
+ None,
+ port_ids,
+ None,
+ avail_zone=az,
+ user_data=None,
+ config_drive=True,
+ files={NFVBENCH_CFG_VM_PATHNAME: vm_config})
+ if server:
+ self.instance = server
+ if self.manager.placer.is_resolved():
+ LOG.info('Created instance %s on %s', self.name, az)
+ else:
+ # the location is undetermined at this point
+ # self.get_hypervisor_name() will return None
+ LOG.info('Created instance %s - waiting for placement resolution...', self.name)
+ # here we MUST wait until this instance is resolved otherwise subsequent
+ # VNF creation can be placed in other hypervisors!
+ config = self.manager.config
+ max_retries = int((config.check_traffic_time_sec +
+ config.generic_poll_sec - 1) / config.generic_poll_sec)
+ retry = 0
+ for retry in range(max_retries):
+ status = self.get_status()
+ if status == 'ACTIVE':
+ hyp_name = self.get_hypervisor_name()
+ LOG.info('Instance %s is active and has been placed on %s',
+ self.name, hyp_name)
+ self.manager.placer.register_full_name(hyp_name)
+ break
+ if status == 'ERROR':
+ raise ChainException('Instance %s creation error: %s' %
+ (self.name,
+ self.instance.fault['message']))
+ LOG.info('Waiting for instance %s to become active (retry %d/%d)...',
+ self.name, retry + 1, max_retries + 1)
+ time.sleep(config.generic_poll_sec)
+ else:
+ # timing out
+ LOG.error('Instance %s creation timed out', self.name)
+ raise ChainException('Instance %s creation timed out' % self.name)
+ self.reuse = False
+ else:
+ raise ChainException('Unable to create instance: %s' % (self.name))
+
+ def _reuse_exception(self, reason):
+ raise ChainException('Instance %s cannot be reused (%s)' % (self.name, reason))
+
+ def get_status(self):
+ """Get the statis of this instance."""
+ if self.instance.status != 'ACTIVE':
+ self.instance = self.manager.comp.poll_server(self.instance)
+ return self.instance.status
+
+ def get_hostname(self):
+ """Get the hypervisor host name running this VNF instance."""
+ if self.manager.is_admin:
+ hypervisor_hostname = getattr(self.instance, 'OS-EXT-SRV-ATTR:hypervisor_hostname')
+ else:
+ hypervisor_hostname = self.manager.config.hypervisor_hostname
+ if not hypervisor_hostname:
+ raise ChainException('Hypervisor hostname parameter is mandatory')
+ return hypervisor_hostname
+
+ def get_host_ip(self):
+ """Get the IP address of the host where this instance runs.
+
+ return: the IP address
+ """
+ if not self.host_ip:
+ self.host_ip = self.manager.comp.get_hypervisor(self.get_hostname()).host_ip
+ return self.host_ip
+
+ def get_hypervisor_name(self):
+ """Get hypervisor name (az:hostname) for this VNF instance."""
+ if self.instance:
+ if self.manager.is_admin:
+ az = getattr(self.instance, 'OS-EXT-AZ:availability_zone')
+ else:
+ az = self.manager.config.availability_zone
+ if not az:
+ raise ChainException('Availability zone parameter is mandatory')
+ hostname = self.get_hostname()
+ if az:
+ return az + ':' + hostname
+ return hostname
+ return None
+
+ def get_uuid(self):
+ """Get the uuid for this instance."""
+ return self.instance.id
+
+ def delete(self, forced=False):
+ """Delete this VNF instance."""
+ if self.reuse:
+ LOG.info("Instance %s not deleted (reused)", self.name)
+ else:
+ if self.instance:
+ self.manager.comp.delete_server(self.instance)
+ LOG.info("Deleted instance %s", self.name)
+ if self.manager.config.use_management_port:
+ self.management_port.delete()
+ for port in self.ports:
+ port.delete()
+ for port in self.idle_ports:
+ port.delete()
+ for network in self.idle_networks:
+ network.delete()
+
+
+class Chain(object):
+ """A class to manage a single chain.
+
+ Can handle any type of chain (EXT, PVP, PVVP)
+ """
+
+ def __init__(self, chain_id, manager):
+ """Create a new chain.
+
+ chain_id: chain index (first chain is 0)
+ manager: the chain manager that owns all chains
+ """
+ self.chain_id = chain_id
+ self.manager = manager
+ self.encaps = manager.encaps
+ self.networks = []
+ self.instances = []
+ try:
+ self.networks = manager.get_networks(chain_id)
+ # For external chain VNFs can only be discovered from their MAC addresses
+ # either from config or from ARP
+ if manager.config.service_chain != ChainType.EXT:
+ for chain_instance_index in range(self.get_length()):
+ self.instances.append(ChainVnf(self,
+ chain_instance_index,
+ self.networks))
+ # at this point new VNFs are not created yet but
+ # verify that all discovered VNFs are on the same hypervisor
+ self._check_hypervisors()
+ # now that all VNF ports are created we need to calculate the
+ # left/right remote MAC for each VNF in the chain
+ # before actually creating the VNF itself
+ rem_mac_pairs = self._get_remote_mac_pairs()
+ for instance in self.instances:
+ rem_mac_pair = rem_mac_pairs.pop(0)
+ instance.create_vnf(rem_mac_pair)
+ except Exception:
+ self.delete()
+ raise
+
+ def _check_hypervisors(self):
+ common_hypervisor = None
+ for instance in self.instances:
+ # get the full hypervizor name (az:compute)
+ hname = instance.get_hypervisor_name()
+ if hname:
+ if common_hypervisor:
+ if hname != common_hypervisor:
+ raise ChainException('Discovered instances on different hypervisors:'
+ ' %s and %s' % (hname, common_hypervisor))
+ else:
+ common_hypervisor = hname
+ if common_hypervisor:
+ # check that the common hypervisor name matchs the requested hypervisor name
+ # and set the name to be used by all future instances (if any)
+ if not self.manager.placer.register_full_name(common_hypervisor):
+ raise ChainException('Discovered hypervisor placement %s is incompatible' %
+ common_hypervisor)
+
+ def get_length(self):
+ """Get the number of VNF in the chain."""
+ # Take into account 2 edge networks for routers
+ return len(self.networks) - 3 if self.manager.config.l3_router else len(self.networks) - 1
+
+ def _get_remote_mac_pairs(self):
+ """Get the list of remote mac pairs for every VNF in the chain.
+
+ Traverse the chain from left to right and establish the
+ left/right remote MAC for each VNF in the chainself.
+
+ PVP case is simpler:
+ mac sequence: tg_src_mac, vm0-mac0, vm0-mac1, tg_dst_mac
+ must produce [[tg_src_mac, tg_dst_mac]] or looking at index in mac sequence: [[0, 3]]
+ the mac pair is what the VNF at that position (index 0) sees as next hop mac left and right
+
+ PVVP:
+ tg_src_mac, vm0-mac0, vm0-mac1, vm1-mac0, vm1-mac1, tg_dst_mac
+ Must produce the following list:
+ [[tg_src_mac, vm1-mac0], [vm0-mac1, tg_dst_mac]] or index: [[0, 3], [2, 5]]
+
+ General case with 3 VMs in chain, the list of consecutive macs (left to right):
+ tg_src_mac, vm0-mac0, vm0-mac1, vm1-mac0, vm1-mac1, vm2-mac0, vm2-mac1, tg_dst_mac
+ Must produce the following list:
+ [[tg_src_mac, vm1-mac0], [vm0-mac1, vm2-mac0], [vm1-mac1, tg_dst_mac]]
+ or index: [[0, 3], [2, 5], [4, 7]]
+
+ The series pattern is pretty clear: [[n, n+3],... ] where n is multiple of 2
+ """
+ # line up all mac from left to right
+ mac_seq = [self.manager.generator_config.devices[LEFT].mac]
+ for instance in self.instances:
+ mac_seq.append(instance.ports[0].get_mac())
+ mac_seq.append(instance.ports[1].get_mac())
+ mac_seq.append(self.manager.generator_config.devices[RIGHT].mac)
+ base = 0
+ rem_mac_pairs = []
+ for _ in self.instances:
+ rem_mac_pairs.append([mac_seq[base], mac_seq[base + 3]])
+ base += 2
+ return rem_mac_pairs
+
+ def get_instances(self):
+ """Return all instances for this chain."""
+ return self.instances
+
+ def get_vlan(self, port_index):
+ """Get the VLAN id on a given port.
+
+ port_index: left port is 0, right port is 1
+ return: the vlan_id or None if there is no vlan tagging
+ """
+ # for port 1 we need to return the VLAN of the last network in the chain
+ # The networks array contains 2 networks for PVP [left, right]
+ # and 3 networks in the case of PVVP [left.middle,right]
+ if port_index:
+ # this will pick the last item in array
+ port_index = -1
+ # This string filters networks connected to TG, in case of
+ # l3-router feature we have 4 networks instead of 2
+ networks = [x for x in self.networks if not x.router_name]
+ return networks[port_index].get_vlan()
+
+ def get_vxlan(self, port_index):
+ """Get the VXLAN id on a given port.
+
+ port_index: left port is 0, right port is 1
+ return: the vxlan_id or None if there is no vxlan
+ """
+ # for port 1 we need to return the VLAN of the last network in the chain
+ # The networks array contains 2 networks for PVP [left, right]
+ # and 3 networks in the case of PVVP [left.middle,right]
+ if port_index:
+ # this will pick the last item in array
+ port_index = -1
+ return self.networks[port_index].get_vxlan()
+
+ def get_mpls_inner_label(self, port_index):
+ """Get the MPLS VPN Label on a given port.
+
+ port_index: left port is 0, right port is 1
+ return: the mpls_label_id or None if there is no mpls
+ """
+ # for port 1 we need to return the MPLS Label of the last network in the chain
+ # The networks array contains 2 networks for PVP [left, right]
+ # and 3 networks in the case of PVVP [left.middle,right]
+ if port_index:
+ # this will pick the last item in array
+ port_index = -1
+ return self.networks[port_index].get_mpls_inner_label()
+
+ def get_dest_mac(self, port_index):
+ """Get the dest MAC on a given port.
+
+ port_index: left port is 0, right port is 1
+ return: the dest MAC
+ """
+ if port_index:
+ # for right port, use the right port MAC of the last (right most) VNF In chain
+ return self.instances[-1].ports[1].get_mac()
+ # for left port use the left port MAC of the first (left most) VNF in chain
+ return self.instances[0].ports[0].get_mac()
+
+ def get_network_uuids(self):
+ """Get UUID of networks in this chain from left to right (order is important).
+
+ :return: list of UUIDs of networks (2 or 3 elements)
+ """
+ return [net['id'] for net in self.networks]
+
+ def get_host_ips(self):
+ """Return the IP adresss(es) of the host compute nodes used for this chain.
+
+ :return: a list of 1 or 2 IP addresses
+ """
+ return [vnf.get_host_ip() for vnf in self.instances]
+
+ def get_compute_nodes(self):
+ """Return the name of the host compute nodes used for this chain.
+
+ :return: a list of 1 host name in the az:host format
+ """
+ # Since all chains go through the same compute node(s) we can just retrieve the
+ # compute node name(s) for the first chain
+ return [vnf.get_hypervisor_name() for vnf in self.instances]
+
+ def delete(self):
+ """Delete this chain."""
+ for instance in self.instances:
+ instance.delete()
+ # only delete if these are chain private networks (not shared)
+ if not self.manager.config.service_chain_shared_net:
+ for network in self.networks:
+ network.delete()
+
+
+class InstancePlacer(object):
+ """A class to manage instance placement for all VNFs in all chains.
+
+ A full az string is made of 2 parts AZ and hypervisor.
+ The placement is resolved when both parts az and hypervisor names are known.
+ """
+
+ def __init__(self, req_az, req_hyp):
+ """Create a new instance placer.
+
+ req_az: requested AZ (can be None or empty if no preference)
+ req_hyp: requested hypervisor name (can be None of empty if no preference)
+ can be any of 'nova:', 'comp1', 'nova:comp1'
+ if it is a list, only the first item is used (backward compatibility in config)
+
+ req_az is ignored if req_hyp has an az part
+ all other parts beyond the first 2 are ignored in req_hyp
+ """
+ # if passed a list just pick the first item
+ if req_hyp and isinstance(req_hyp, list):
+ req_hyp = req_hyp[0]
+ # only pick first part of az
+ if req_az and ':' in req_az:
+ req_az = req_az.split(':')[0]
+ if req_hyp:
+ # check if requested hypervisor string has an AZ part
+ split_hyp = req_hyp.split(':')
+ if len(split_hyp) > 1:
+ # override the AZ part and hypervisor part
+ req_az = split_hyp[0]
+ req_hyp = split_hyp[1]
+ self.requested_az = req_az if req_az else ''
+ self.requested_hyp = req_hyp if req_hyp else ''
+ # Nova can accept AZ only (e.g. 'nova:', use any hypervisor in that AZ)
+ # or hypervisor only (e.g. ':comp1')
+ # or both (e.g. 'nova:comp1')
+ if req_az:
+ self.required_az = req_az + ':' + self.requested_hyp
+ else:
+ # need to insert a ':' so nova knows this is the hypervisor name
+ self.required_az = ':' + self.requested_hyp if req_hyp else ''
+ # placement is resolved when both AZ and hypervisor names are known and set
+ self.resolved = self.requested_az != '' and self.requested_hyp != ''
+
+ def get_required_az(self):
+ """Return the required az (can be resolved or not)."""
+ return self.required_az
+
+ def register_full_name(self, discovered_az):
+ """Verify compatibility and register a discovered hypervisor full name.
+
+ discovered_az: a discovered AZ in az:hypervisor format
+ return: True if discovered_az is compatible and set
+ False if discovered_az is not compatible
+ """
+ if self.resolved:
+ return discovered_az == self.required_az
+
+ # must be in full az format
+ split_daz = discovered_az.split(':')
+ if len(split_daz) != 2:
+ return False
+ if self.requested_az and self.requested_az != split_daz[0]:
+ return False
+ if self.requested_hyp and self.requested_hyp != split_daz[1]:
+ return False
+ self.required_az = discovered_az
+ self.resolved = True
+ return True
+
+ def is_resolved(self):
+ """Check if the full AZ is resolved.
+
+ return: True if resolved
+ """
+ return self.resolved
+
+
+class ChainManager(object):
+ """A class for managing all chains for a given run.
+
+ Supports openstack or no openstack.
+ Supports EXT, PVP and PVVP chains.
+ """
+
+ def __init__(self, chain_runner):
+ """Create a chain manager to take care of discovering or bringing up the requested chains.
+
+ A new instance must be created every time a new config is used.
+ config: the nfvbench config to use
+ cred: openstack credentials to use of None if there is no openstack
+ """
+ self.chain_runner = chain_runner
+ self.config = chain_runner.config
+ self.generator_config = chain_runner.traffic_client.generator_config
+ self.chains = []
+ self.image_instance = None
+ self.image_name = None
+ # Left and right networks shared across all chains (only if shared)
+ self.networks = []
+ self.encaps = None
+ self.flavor = None
+ self.comp = None
+ self.nova_client = None
+ self.neutron_client = None
+ self.glance_client = None
+ self.existing_instances = []
+ # existing ports keyed by the network uuid they belong to
+ self._existing_ports = {}
+ config = self.config
+ self.openstack = (chain_runner.cred is not None) and not config.l2_loopback
+ self.chain_count = config.service_chain_count
+ self.az = None
+ if self.openstack:
+ # openstack only
+ session = chain_runner.cred.get_session()
+ self.is_admin = chain_runner.cred.is_admin
+ self.nova_client = Client(2, session=session)
+ self.neutron_client = neutronclient.Client('2.0', session=session)
+ self.glance_client = glanceclient.Client('2', session=session)
+ self.comp = compute.Compute(self.nova_client,
+ self.glance_client,
+ config)
+ try:
+ if config.service_chain != ChainType.EXT:
+ self.placer = InstancePlacer(config.availability_zone, config.compute_nodes)
+ self._setup_image()
+ self.flavor = ChainFlavor(config.flavor_type, config.flavor, self.comp)
+ # Get list of all existing instances to check if some instances can be reused
+ self.existing_instances = self.comp.get_server_list()
+ # If management port is requested for VMs, create management network (shared)
+ if self.config.use_management_port:
+ self.management_network = ChainNetwork(self, self.config.management_network,
+ None, False)
+ # If floating IP is used for management, create and share
+ # across chains the floating network
+ if self.config.use_floating_ip:
+ self.floating_ip_network = ChainNetwork(self,
+ self.config.floating_network,
+ None, False)
+ else:
+ # For EXT chains, the external_networks left and right fields in the config
+ # must be either a prefix string or a list of at least chain-count strings
+ self._check_extnet('left', config.external_networks.left)
+ self._check_extnet('right', config.external_networks.right)
+
+ # If networks are shared across chains, get the list of networks
+ if config.service_chain_shared_net:
+ self.networks = self.get_networks()
+ # Reuse/create chains
+ for chain_id in range(self.chain_count):
+ self.chains.append(Chain(chain_id, self))
+ if config.service_chain == ChainType.EXT:
+ # if EXT and no ARP or VxLAN we need to read dest MACs from config
+ if config.no_arp or config.vxlan:
+ self._get_dest_macs_from_config()
+ else:
+ # Make sure all instances are active before proceeding
+ self._ensure_instances_active()
+ # network API call do not show VLANS ID if not admin read from config
+ if not self.is_admin and config.vlan_tagging:
+ self._get_config_vlans()
+ except Exception:
+ self.delete()
+ raise
+ else:
+ # no openstack, no need to create chains
+ if not config.l2_loopback and config.no_arp:
+ self._get_dest_macs_from_config()
+ if config.vlan_tagging:
+ # make sure there at least as many entries as chains in each left/right list
+ if len(config.vlans) != 2:
+ raise ChainException('The config vlans property must be a list '
+ 'with 2 lists of VLAN IDs')
+ self._get_config_vlans()
+ if config.vxlan:
+ raise ChainException('VxLAN is only supported with OpenStack')
+
+ def _check_extnet(self, side, name):
+ if not name:
+ raise ChainException('external_networks.%s must contain a valid network'
+ ' name prefix or a list of network names' % side)
+ if isinstance(name, tuple) and len(name) < self.chain_count:
+ raise ChainException('external_networks.%s %s'
+ ' must have at least %d names' % (side, name, self.chain_count))
+
+ def _get_config_vlans(self):
+ re_vlan = "[0-9]*$"
+ try:
+ self.vlans = [self._check_list('vlans[0]', self.config.vlans[0], re_vlan),
+ self._check_list('vlans[1]', self.config.vlans[1], re_vlan)]
+ except IndexError:
+ raise ChainException(
+ 'vlans parameter is mandatory. Set valid value in config file') from IndexError
+
+ def _get_dest_macs_from_config(self):
+ re_mac = "[0-9a-fA-F]{2}([-:])[0-9a-fA-F]{2}(\\1[0-9a-fA-F]{2}){4}$"
+ tg_config = self.config.traffic_generator
+ self.dest_macs = [self._check_list("mac_addrs_left",
+ tg_config.mac_addrs_left, re_mac),
+ self._check_list("mac_addrs_right",
+ tg_config.mac_addrs_right, re_mac)]
+
+ def _check_list(self, list_name, ll, pattern):
+ # if it is a single int or mac, make it a list of 1 int
+ if isinstance(ll, (int, str)):
+ ll = [ll]
+ else:
+ ll = list(ll)
+ for item in ll:
+ if not re.match(pattern, str(item)):
+ raise ChainException("Invalid format '{item}' specified in {fname}"
+ .format(item=item, fname=list_name))
+ # must have at least 1 element
+ if not ll:
+ raise ChainException('%s cannot be empty' % (list_name))
+ # for shared network, if 1 element is passed, replicate it as many times
+ # as chains
+ if self.config.service_chain_shared_net and len(ll) == 1:
+ ll = [ll[0]] * self.chain_count
+
+ # number of elements musty be the number of chains
+ elif len(ll) < self.chain_count:
+ raise ChainException('%s=%s must be a list with %d elements per chain' %
+ (list_name, ll, self.chain_count))
+ return ll
+
+ def _setup_image(self):
+ # To avoid reuploading image in server mode, check whether image_name is set or not
+ if self.image_name:
+ self.image_instance = self.comp.find_image(self.image_name)
+ if self.image_instance:
+ LOG.info("Reusing image %s", self.image_name)
+ else:
+ image_name_search_pattern = r'(nfvbenchvm-\d+(\.\d+)*).qcow2'
+ if self.config.vm_image_file:
+ match = re.search(image_name_search_pattern, self.config.vm_image_file)
+ if match:
+ self.image_name = match.group(1)
+ LOG.info('Using provided VM image file %s', self.config.vm_image_file)
+ else:
+ raise ChainException('Provided VM image file name %s must start with '
+ '"nfvbenchvm-<version>"' % self.config.vm_image_file)
+ else:
+ pkg_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+ for f in os.listdir(pkg_root):
+ if re.search(image_name_search_pattern, f):
+ self.config.vm_image_file = pkg_root + '/' + f
+ self.image_name = f.replace('.qcow2', '')
+ LOG.info('Found built-in VM image file %s', f)
+ break
+ else:
+ raise ChainException('Cannot find any built-in VM image file.')
+ if self.image_name:
+ self.image_instance = self.comp.find_image(self.image_name)
+ if not self.image_instance:
+ LOG.info('Uploading %s', self.image_name)
+ res = self.comp.upload_image_via_url(self.image_name,
+ self.config.vm_image_file)
+
+ if not res:
+ raise ChainException('Error uploading image %s from %s. ABORTING.' %
+ (self.image_name, self.config.vm_image_file))
+ LOG.info('Image %s successfully uploaded.', self.image_name)
+ self.image_instance = self.comp.find_image(self.image_name)
+
+ # image multiqueue property must be set according to the vif_multiqueue_size
+ # config value (defaults to 1 or disabled)
+ self.comp.image_set_multiqueue(self.image_instance, self.config.vif_multiqueue_size > 1)
+
+ def _ensure_instances_active(self):
+ instances = []
+ for chain in self.chains:
+ instances.extend(chain.get_instances())
+ initial_instance_count = len(instances)
+ max_retries = (self.config.check_traffic_time_sec + (initial_instance_count - 1) * 10 +
+ self.config.generic_poll_sec - 1) / self.config.generic_poll_sec
+ retry = 0
+ while instances:
+ remaining_instances = []
+ for instance in instances:
+ status = instance.get_status()
+ if status == 'ACTIVE':
+ LOG.info('Instance %s is ACTIVE on %s',
+ instance.name, instance.get_hypervisor_name())
+ continue
+ if status == 'ERROR':
+ raise ChainException('Instance %s creation error: %s' %
+ (instance.name,
+ instance.instance.fault['message']))
+ remaining_instances.append(instance)
+ if not remaining_instances:
+ break
+ retry += 1
+ if retry >= max_retries:
+ raise ChainException('Time-out: %d/%d instances still not active' %
+ (len(remaining_instances), initial_instance_count))
+ LOG.info('Waiting for %d/%d instance to become active (retry %d/%d)...',
+ len(remaining_instances), initial_instance_count,
+ retry, max_retries)
+ instances = remaining_instances
+ time.sleep(self.config.generic_poll_sec)
+ if initial_instance_count:
+ LOG.info('All instances are active')
+
+ def get_networks(self, chain_id=None):
+ """Get the networks for given EXT, PVP or PVVP chain.
+
+ For EXT packet path, these networks must pre-exist.
+ For PVP, PVVP these networks will be created if they do not exist.
+ chain_id: to which chain the networks belong.
+ a None value will mean that these networks are shared by all chains
+ """
+ if self.networks:
+ # the only case where self.networks exists is when the networks are shared
+ # across all chains
+ return self.networks
+ if self.config.service_chain == ChainType.EXT:
+ lookup_only = True
+ ext_net = self.config.external_networks
+ net_cfg = [AttrDict({'name': name,
+ 'subnet': None,
+ 'segmentation_id': None,
+ 'physical_network': None})
+ for name in [ext_net.left, ext_net.right]]
+ # segmentation id and subnet should be discovered from neutron
+ else:
+ lookup_only = False
+ int_nets = self.config.internal_networks
+ # VLAN and VxLAN
+ if self.config.service_chain == ChainType.PVP:
+ net_cfg = [int_nets.left, int_nets.right]
+ else:
+ net_cfg = [int_nets.left, int_nets.middle, int_nets.right]
+ if self.config.l3_router:
+ edge_nets = self.config.edge_networks
+ net_cfg.append(edge_nets.left)
+ net_cfg.append(edge_nets.right)
+ networks = []
+ try:
+ for cfg in net_cfg:
+ networks.append(ChainNetwork(self, cfg, chain_id, lookup_only=lookup_only))
+ except Exception:
+ # need to cleanup all successful networks prior to bailing out
+ for net in networks:
+ net.delete()
+ raise
+ return networks
+
+ def get_existing_ports(self):
+ """Get the list of existing ports.
+
+ Lazy retrieval of ports as this can be costly if there are lots of ports and
+ is only needed when VM and network are being reused.
+
+ return: a dict of list of neutron ports indexed by the network uuid they are attached to
+
+ Each port is a dict with fields such as below:
+ {'allowed_address_pairs': [], 'extra_dhcp_opts': [],
+ 'updated_at': '2018-10-06T07:15:35Z', 'device_owner': 'compute:nova',
+ 'revision_number': 10, 'port_security_enabled': False, 'binding:profile': {},
+ 'fixed_ips': [{'subnet_id': '6903a3b3-49a1-4ba4-8259-4a90e7a44b21',
+ 'ip_address': '192.168.1.4'}], 'id': '3dcb9cfa-d82a-4dd1-85a1-fd8284b52d72',
+ 'security_groups': [],
+ 'binding:vif_details': {'vhostuser_socket': '/tmp/3dcb9cfa-d82a-4dd1-85a1-fd8284b52d72',
+ 'vhostuser_mode': 'server'},
+ 'binding:vif_type': 'vhostuser',
+ 'mac_address': 'fa:16:3e:3c:63:04',
+ 'project_id': '977ac76a63d7492f927fa80e86baff4c',
+ 'status': 'ACTIVE',
+ 'binding:host_id': 'a20-champagne-compute-1',
+ 'description': '',
+ 'device_id': 'a98e2ad2-5371-4aa5-a356-8264a970ce4b',
+ 'name': 'nfvbench-loop-vm0-0', 'admin_state_up': True,
+ 'network_id': '3ea5fd88-278f-4d9d-b24d-1e443791a055',
+ 'tenant_id': '977ac76a63d7492f927fa80e86baff4c',
+ 'created_at': '2018-10-06T07:15:10Z',
+ 'binding:vnic_type': 'normal'}
+ """
+ if not self._existing_ports:
+ LOG.info('Loading list of all ports...')
+ existing_ports = self.neutron_client.list_ports()['ports']
+ # place all ports in the dict keyed by the port network uuid
+ for port in existing_ports:
+ port_list = self._existing_ports.setdefault(port['network_id'], [])
+ port_list.append(port)
+ LOG.info("Loaded %d ports attached to %d networks",
+ len(existing_ports), len(self._existing_ports))
+ return self._existing_ports
+
+ def get_ports_from_network(self, chain_network):
+ """Get the list of existing ports that belong to a network.
+
+ Lazy retrieval of ports as this can be costly if there are lots of ports and
+ is only needed when VM and network are being reused.
+
+ chain_network: a ChainNetwork instance for which attached ports neeed to be retrieved
+ return: list of neutron ports attached to requested network
+ """
+ return self.get_existing_ports().get(chain_network.get_uuid(), None)
+
+ def get_hypervisor_from_mac(self, mac):
+ """Get the hypervisor that hosts a VM MAC.
+
+ mac: MAC address to look for
+ return: the hypervisor where the matching port runs or None if not found
+ """
+ # _existing_ports is a dict of list of ports indexed by network id
+ for port_list in list(self.get_existing_ports().values()):
+ for port in port_list:
+ try:
+ if port['mac_address'] == mac:
+ host_id = port['binding:host_id']
+ return self.comp.get_hypervisor(host_id)
+ except KeyError:
+ pass
+ return None
+
+ def get_host_ip_from_mac(self, mac):
+ """Get the host IP address matching a MAC.
+
+ mac: MAC address to look for
+ return: the IP address of the host where the matching port runs or None if not found
+ """
+ hypervisor = self.get_hypervisor_from_mac(mac)
+ if hypervisor:
+ return hypervisor.host_ip
+ return None
+
+ def get_chain_vlans(self, port_index):
+ """Get the list of per chain VLAN id on a given port.
+
+ port_index: left port is 0, right port is 1
+ return: a VLAN ID list indexed by the chain index or None if no vlan tagging
+ """
+ if self.chains and self.is_admin:
+ return [self.chains[chain_index].get_vlan(port_index)
+ for chain_index in range(self.chain_count)]
+ # no openstack
+ return self.vlans[port_index]
+
+ def get_chain_vxlans(self, port_index):
+ """Get the list of per chain VNIs id on a given port.
+
+ port_index: left port is 0, right port is 1
+ return: a VNIs ID list indexed by the chain index or None if no vlan tagging
+ """
+ if self.chains and self.is_admin:
+ return [self.chains[chain_index].get_vxlan(port_index)
+ for chain_index in range(self.chain_count)]
+ # no openstack
+ raise ChainException('VxLAN is only supported with OpenStack and with admin user')
+
+ def get_chain_mpls_inner_labels(self, port_index):
+ """Get the list of per chain MPLS VPN Labels on a given port.
+
+ port_index: left port is 0, right port is 1
+ return: a MPLSs ID list indexed by the chain index or None if no mpls
+ """
+ if self.chains and self.is_admin:
+ return [self.chains[chain_index].get_mpls_inner_label(port_index)
+ for chain_index in range(self.chain_count)]
+ # no openstack
+ raise ChainException('MPLS is only supported with OpenStack and with admin user')
+
+ def get_dest_macs(self, port_index):
+ """Get the list of per chain dest MACs on a given port.
+
+ Should not be called if EXT+ARP is used (in that case the traffic gen will
+ have the ARP responses back from VNFs with the dest MAC to use).
+
+ port_index: left port is 0, right port is 1
+ return: a list of dest MACs indexed by the chain index
+ """
+ if self.chains and self.config.service_chain != ChainType.EXT:
+ return [self.chains[chain_index].get_dest_mac(port_index)
+ for chain_index in range(self.chain_count)]
+ # no openstack or EXT+no-arp
+ return self.dest_macs[port_index]
+
+ def get_host_ips(self):
+ """Return the IP adresss(es) of the host compute nodes used for this run.
+
+ :return: a list of 1 IP address
+ """
+ # Since all chains go through the same compute node(s) we can just retrieve the
+ # compute node(s) for the first chain
+ if self.chains:
+ if self.config.service_chain != ChainType.EXT:
+ return self.chains[0].get_host_ips()
+ # in the case of EXT, the compute node must be retrieved from the port
+ # associated to any of the dest MACs
+ dst_macs = self.generator_config.get_dest_macs()
+ # dest MAC on port 0, chain 0
+ dst_mac = dst_macs[0][0]
+ host_ip = self.get_host_ip_from_mac(dst_mac)
+ if host_ip:
+ LOG.info('Found compute node IP for EXT chain: %s', host_ip)
+ return [host_ip]
+ return []
+
+ def get_compute_nodes(self):
+ """Return the name of the host compute nodes used for this run.
+
+ :return: a list of 0 or 1 host name in the az:host format
+ """
+ # Since all chains go through the same compute node(s) we can just retrieve the
+ # compute node name(s) for the first chain
+ if self.chains:
+ # in the case of EXT, the compute node must be retrieved from the port
+ # associated to any of the dest MACs
+ if self.config.service_chain != ChainType.EXT:
+ return self.chains[0].get_compute_nodes()
+ # in the case of EXT, the compute node must be retrieved from the port
+ # associated to any of the dest MACs
+ dst_macs = self.generator_config.get_dest_macs()
+ # dest MAC on port 0, chain 0
+ dst_mac = dst_macs[0][0]
+ hypervisor = self.get_hypervisor_from_mac(dst_mac)
+ if hypervisor:
+ LOG.info('Found hypervisor for EXT chain: %s', hypervisor.hypervisor_hostname)
+ return [':' + hypervisor.hypervisor_hostname]
+ # no openstack = no chains
+ return []
+
+ def delete(self):
+ """Delete resources for all chains."""
+ for chain in self.chains:
+ chain.delete()
+ for network in self.networks:
+ network.delete()
+ if self.config.use_management_port and hasattr(self, 'management_network'):
+ self.management_network.delete()
+ if self.config.use_floating_ip and hasattr(self, 'floating_ip_network'):
+ self.floating_ip_network.delete()
+ if self.flavor:
+ self.flavor.delete()
diff --git a/nfvbench/cleanup.py b/nfvbench/cleanup.py
new file mode 100644
index 0000000..cefdcfa
--- /dev/null
+++ b/nfvbench/cleanup.py
@@ -0,0 +1,305 @@
+#!/usr/bin/env python
+# Copyright 2017 Cisco Systems, Inc. All rights reserved.
+#
+# 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 sys
+
+from neutronclient.neutron import client as nclient
+from novaclient.client import Client
+from novaclient.exceptions import NotFound
+from tabulate import tabulate
+
+from . import credentials
+from .log import LOG
+from . import utils
+
+
+class ComputeCleaner(object):
+ """A cleaner for compute resources."""
+
+ def __init__(self, nova_client, instance_prefix):
+ self.nova_client = nova_client
+ LOG.info('Discovering instances %s...', instance_prefix)
+ all_servers = self.nova_client.servers.list()
+ self.servers = [server for server in all_servers
+ if server.name.startswith(instance_prefix)]
+
+ def get_resource_list(self):
+ return [["Instance", server.name, server.id] for server in self.servers]
+
+ def get_cleaner_code(self):
+ return "instances"
+
+ def clean_needed(self, clean_options):
+ if clean_options is None:
+ return True
+ code = self.get_cleaner_code()
+ return code[0] in clean_options
+
+ def clean(self, clean_options):
+ if self.clean_needed(clean_options):
+ if self.servers:
+ for server in self.servers:
+ utils.delete_server(self.nova_client, server)
+ utils.waiting_servers_deletion(self.nova_client, self.servers)
+
+
+class NetworkCleaner(object):
+ """A cleaner for network resources."""
+
+ def __init__(self, neutron_client, network_name_prefixes):
+ self.neutron_client = neutron_client
+ LOG.info('Discovering networks...')
+ all_networks = self.neutron_client.list_networks()['networks']
+ self.networks = []
+ net_ids = []
+ for net in all_networks:
+ netname = net['name']
+ for prefix in network_name_prefixes:
+ if prefix and netname.startswith(prefix):
+ self.networks.append(net)
+ net_ids.append(net['id'])
+ break
+ if net_ids:
+ LOG.info('Discovering ports...')
+ all_ports = self.neutron_client.list_ports()['ports']
+ self.ports = [port for port in all_ports if port['network_id'] in net_ids]
+ LOG.info('Discovering floating ips...')
+ all_floating_ips = self.neutron_client.list_floatingips()['floatingips']
+ self.floating_ips = [floating_ip for floating_ip in all_floating_ips if
+ floating_ip['floating_network_id'] in net_ids and "nfvbench" in
+ floating_ip['description']]
+ else:
+ self.ports = []
+ self.floating_ips = []
+
+ def get_resource_list(self):
+ res_list = [["Network", net['name'], net['id']] for net in self.networks]
+ res_list.extend([["Port", port['name'], port['id']] for port in self.ports])
+ res_list.extend(
+ [["Floating IP", floating_ip['description'], floating_ip['id']] for floating_ip in
+ self.floating_ips])
+ return res_list
+
+ def get_cleaner_code(self):
+ return "networks, ports and floating ips"
+
+ def clean_needed(self, clean_options):
+ if clean_options is None:
+ return True
+ code = self.get_cleaner_code()
+ return code[0] in clean_options
+
+ def clean(self, clean_options):
+ if self.clean_needed(clean_options):
+ for port in self.ports:
+ LOG.info("Deleting port %s...", port['id'])
+ try:
+ self.neutron_client.delete_port(port['id'])
+ except Exception:
+ LOG.exception("Port deletion failed")
+ for floating_ip in self.floating_ips:
+ LOG.info("Deleting floating ip %s...", floating_ip['id'])
+ try:
+ self.neutron_client.delete_floatingip(floating_ip['id'])
+ except Exception:
+ LOG.exception("Floating IP deletion failed")
+ # associated subnets are automatically deleted by neutron
+ for net in self.networks:
+ LOG.info("Deleting network %s...", net['name'])
+ try:
+ self.neutron_client.delete_network(net['id'])
+ except Exception:
+ LOG.exception("Network deletion failed")
+
+
+class RouterCleaner(object):
+ """A cleaner for router resources."""
+
+ def __init__(self, neutron_client, router_names):
+ self.neutron_client = neutron_client
+ LOG.info('Discovering routers...')
+ all_routers = self.neutron_client.list_routers()['routers']
+ self.routers = []
+ self.ports = []
+ self.routes = []
+ rtr_ids = []
+ for rtr in all_routers:
+ rtrname = rtr['name']
+ for name in router_names:
+ if rtrname == name:
+ self.routers.append(rtr)
+ rtr_ids.append(rtr['id'])
+
+ LOG.info('Discovering router routes for router %s...', rtr['name'])
+ all_routes = rtr['routes']
+ for route in all_routes:
+ LOG.info("destination: %s, nexthop: %s", route['destination'],
+ route['nexthop'])
+
+ LOG.info('Discovering router ports for router %s...', rtr['name'])
+ self.ports.extend(self.neutron_client.list_ports(device_id=rtr['id'])['ports'])
+ break
+
+ def get_resource_list(self):
+ res_list = [["Router", rtr['name'], rtr['id']] for rtr in self.routers]
+ return res_list
+
+ def get_cleaner_code(self):
+ return "router"
+
+ def clean_needed(self, clean_options):
+ if clean_options is None:
+ return True
+ code = self.get_cleaner_code()
+ return code[0] in clean_options
+
+ def clean(self, clean_options):
+ if self.clean_needed(clean_options):
+ # associated routes needs to be deleted before deleting routers
+ for rtr in self.routers:
+ LOG.info("Deleting routes for %s...", rtr['name'])
+ try:
+ body = {
+ 'router': {
+ 'routes': []
+ }
+ }
+ self.neutron_client.update_router(rtr['id'], body)
+ except Exception:
+ LOG.exception("Router routes deletion failed")
+ LOG.info("Deleting ports for %s...", rtr['name'])
+ try:
+ for port in self.ports:
+ body = {
+ 'port_id': port['id']
+ }
+ self.neutron_client.remove_interface_router(rtr['id'], body)
+ except Exception:
+ LOG.exception("Router ports deletion failed")
+ LOG.info("Deleting router %s...", rtr['name'])
+ try:
+ self.neutron_client.delete_router(rtr['id'])
+ except Exception:
+ LOG.exception("Router deletion failed")
+
+
+class FlavorCleaner(object):
+ """Cleaner for NFVbench flavor."""
+
+ def __init__(self, nova_client, name):
+ self.name = name
+ LOG.info('Discovering flavor %s...', name)
+ try:
+ self.flavor = nova_client.flavors.find(name=name)
+ except NotFound:
+ self.flavor = None
+
+ def get_resource_list(self):
+ if self.flavor:
+ return [['Flavor', self.name, self.flavor.id]]
+ return None
+
+ def get_cleaner_code(self):
+ return "flavor"
+
+ def clean_needed(self, clean_options):
+ if clean_options is None:
+ return True
+ code = self.get_cleaner_code()
+ return code[0] in clean_options
+
+ def clean(self, clean_options):
+ if self.clean_needed(clean_options):
+ if self.flavor:
+ LOG.info("Deleting flavor %s...", self.flavor.name)
+ try:
+ self.flavor.delete()
+ except Exception:
+ LOG.exception("Flavor deletion failed")
+
+
+class Cleaner(object):
+ """Cleaner for all NFVbench resources."""
+
+ def __init__(self, config):
+ cred = credentials.Credentials(config.openrc_file, config.clouds_detail, None, False)
+ session = cred.get_session()
+ self.neutron_client = nclient.Client('2.0', session=session)
+ self.nova_client = Client(2, session=session)
+ network_names = [inet['name'] for inet in config.internal_networks.values()]
+ network_names.extend([inet['name'] for inet in config.edge_networks.values()])
+ network_names.append(config.management_network['name'])
+ network_names.append(config.floating_network['name'])
+ router_names = [rtr['router_name'] for rtr in config.edge_networks.values()]
+ # add idle networks as well
+ if config.idle_networks.name:
+ network_names.append(config.idle_networks.name)
+ self.cleaners = [ComputeCleaner(self.nova_client, config.loop_vm_name),
+ FlavorCleaner(self.nova_client, config.flavor_type),
+ NetworkCleaner(self.neutron_client, network_names),
+ RouterCleaner(self.neutron_client, router_names)]
+
+ def show_resources(self):
+ """Show all NFVbench resources."""
+ table = [["Type", "Name", "UUID"]]
+ for cleaner in self.cleaners:
+ res_list = cleaner.get_resource_list()
+ if res_list:
+ table.extend(res_list)
+ count = len(table) - 1
+ if count:
+ LOG.info('Discovered %d NFVbench resources:\n%s', count,
+ tabulate(table, headers="firstrow", tablefmt="psql"))
+ else:
+ LOG.info('No matching NFVbench resources found')
+ return count
+
+ def clean(self, prompt):
+ """Clean all resources."""
+ LOG.info("NFVbench will delete resources shown...")
+ clean_options = None
+ if prompt:
+ answer = input("Do you want to delete all ressources? (y/n) ")
+ if answer.lower() != 'y':
+ print("What kind of resources do you want to delete?")
+ all_option = ""
+ all_option_codes = []
+ for cleaner in self.cleaners:
+ code = cleaner.get_cleaner_code()
+ print(("%s: %s" % (code[0], code)))
+ all_option += code[0]
+ all_option_codes.append(code)
+ print(("a: all resources - a shortcut for '%s'" % all_option))
+ all_option_codes.append("all resources")
+ print("q: quit")
+ answer_res = input(":").lower()
+ # Check only first character because answer_res can be "flavor" and it is != all
+ if answer_res[0] == "a":
+ clean_options = all_option
+ elif answer_res[0] != 'q':
+ # if user write complete code instead of shortcuts
+ # Get only first character of clean code to avoid false clean request
+ # i.e "networks and ports" and "router" have 1 letter in common and router clean
+ # will be called even if user ask for networks and ports
+ if answer_res in all_option_codes:
+ clean_options = answer_res[0]
+ else:
+ clean_options = answer_res
+ else:
+ LOG.info("Exiting without deleting any resource")
+ sys.exit(0)
+ for cleaner in self.cleaners:
+ cleaner.clean(clean_options)
diff --git a/nfvbench/compute.py b/nfvbench/compute.py
index af1a0d6..883dc28 100644
--- a/nfvbench/compute.py
+++ b/nfvbench/compute.py
@@ -11,8 +11,8 @@
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
-"""Module for Openstack compute operations"""
-import os
+"""Module to interface with nova and glance."""
+
import time
import traceback
@@ -23,18 +23,23 @@ except ImportError:
from glanceclient.v1.apiclient.exceptions import NotFound as GlanceImageNotFound
import keystoneauth1
import novaclient
+from novaclient.exceptions import NotFound
-from log import LOG
+from .log import LOG
+from . import utils
class Compute(object):
- def __init__(self, nova_client, glance_client, neutron_client, config):
+ """Class to interface with nova and glance."""
+
+ def __init__(self, nova_client, glance_client, config):
+ """Create a new compute instance to interact with nova and glance."""
self.novaclient = nova_client
self.glance_client = glance_client
- self.neutronclient = neutron_client
self.config = config
def find_image(self, image_name):
+ """Find an image by name."""
try:
return next(self.glance_client.images.list(filters={'name': image_name}), None)
except (novaclient.exceptions.NotFound, keystoneauth1.exceptions.http.NotFound,
@@ -43,13 +48,11 @@ class Compute(object):
return None
def upload_image_via_url(self, final_image_name, image_file, retry_count=60):
- '''
- Directly uploads image to Nova via URL if image is not present
- '''
+ """Directly upload image to Nova via URL if image is not present."""
retry = 0
try:
# check image is file/url based.
- with open(image_file) as f_image:
+ with open(image_file, 'rb') as f_image:
img = self.glance_client.images.create(name=str(final_image_name),
disk_format="qcow2",
container_format="bare",
@@ -83,6 +86,7 @@ class Compute(object):
return True
def delete_image(self, img_name):
+ """Delete an image by name."""
try:
LOG.log("Deleting image %s...", img_name)
img = self.find_image(image_name=img_name)
@@ -93,68 +97,37 @@ class Compute(object):
return True
- # Remove keypair name from openstack if exists
- def remove_public_key(self, name):
- keypair_list = self.novaclient.keypairs.list()
- for key in keypair_list:
- if key.name == name:
- self.novaclient.keypairs.delete(name)
- LOG.info('Removed public key %s', name)
- break
-
- # Test if keypair file is present if not create it
- def create_keypair(self, name, private_key_pair_file):
- self.remove_public_key(name)
- keypair = self.novaclient.keypairs.create(name)
- # Now write the keypair to the file if requested
- if private_key_pair_file:
- kpf = os.open(private_key_pair_file,
- os.O_WRONLY | os.O_CREAT, 0o600)
- with os.fdopen(kpf, 'w') as kpf:
- kpf.write(keypair.private_key)
- return keypair
-
- # Add an existing public key to openstack
- def add_public_key(self, name, public_key_file):
- self.remove_public_key(name)
- # extract the public key from the file
- public_key = None
+ def image_multiqueue_enabled(self, img):
+ """Check if multiqueue property is enabled on given image."""
try:
- with open(os.path.expanduser(public_key_file)) as pkf:
- public_key = pkf.read()
- except IOError as exc:
- LOG.error('Cannot open public key file %s: %s', public_key_file, exc)
- return None
- keypair = self.novaclient.keypairs.create(name, public_key)
- return keypair
-
- def init_key_pair(self, kp_name, ssh_access):
- '''Initialize the key pair for all test VMs
- if a key pair is specified in access, use that key pair else
- create a temporary key pair
- '''
- if ssh_access.public_key_file:
- return self.add_public_key(kp_name, ssh_access.public_key_file)
- keypair = self.create_keypair(kp_name, None)
- ssh_access.private_key = keypair.private_key
- return keypair
+ return img['hw_vif_multiqueue_enabled'] == 'true'
+ except KeyError:
+ return False
- def find_network(self, label):
- net = self.novaclient.networks.find(label=label)
- return net
+ def image_set_multiqueue(self, img, enabled):
+ """Set multiqueue property as enabled or disabled on given image."""
+ cur_mqe = self.image_multiqueue_enabled(img)
+ LOG.info('Image %s hw_vif_multiqueue_enabled property is "%s"',
+ img.name, str(cur_mqe).lower())
+ if cur_mqe != enabled:
+ mqe = str(enabled).lower()
+ self.glance_client.images.update(img.id, hw_vif_multiqueue_enabled=mqe)
+ img['hw_vif_multiqueue_enabled'] = mqe
+ LOG.info('Image %s hw_vif_multiqueue_enabled property changed to "%s"', img.name, mqe)
# Create a server instance with name vmname
# and check that it gets into the ACTIVE state
def create_server(self, vmname, image, flavor, key_name,
nic, sec_group, avail_zone=None, user_data=None,
config_drive=None, files=None):
-
+ """Create a new server."""
if sec_group:
security_groups = [sec_group['id']]
else:
security_groups = None
# Also attach the created security group for the test
+ LOG.info('Creating instance %s with AZ: "%s"', vmname, avail_zone)
instance = self.novaclient.servers.create(name=vmname,
image=image,
flavor=flavor,
@@ -168,306 +141,45 @@ class Compute(object):
return instance
def poll_server(self, instance):
+ """Poll a server from its reference."""
return self.novaclient.servers.get(instance.id)
def get_server_list(self):
+ """Get the list of all servers."""
servers_list = self.novaclient.servers.list()
return servers_list
- def find_floating_ips(self):
- floating_ip = self.novaclient.floating_ips.list()
- return floating_ip
-
- def create_floating_ips(self, pool):
- return self.novaclient.floating_ips.create(pool)
-
- # Return the server network for a server
- def find_server_network(self, vmname):
- servers_list = self.get_server_list()
- for server in servers_list:
- if server.name == vmname and server.status == "ACTIVE":
- return server.networks
- return None
-
- # Returns True if server is present false if not.
- # Retry for a few seconds since after VM creation sometimes
- # it takes a while to show up
- def find_server(self, vmname, retry_count):
- for retry_attempt in range(retry_count):
- servers_list = self.get_server_list()
- for server in servers_list:
- if server.name == vmname and server.status == "ACTIVE":
- return True
- # Sleep between retries
- LOG.debug("[%s] VM not yet found, retrying %s of %s...",
- vmname, (retry_attempt + 1), retry_count)
- time.sleep(self.config.generic_poll_sec)
- LOG.error("[%s] VM not found, after %s attempts", vmname, retry_count)
- return False
-
- # Returns True if server is found and deleted/False if not,
- # retry the delete if there is a delay
- def delete_server_by_name(self, vmname):
- servers_list = self.get_server_list()
- for server in servers_list:
- if server.name == vmname:
- LOG.info('Deleting server %s', server)
- self.novaclient.servers.delete(server)
- return True
- return False
+ def instance_exists(self, server):
+ try:
+ self.novaclient.servers.get(server)
+ except NotFound:
+ return False
+ return True
def delete_server(self, server):
- self.novaclient.servers.delete(server)
+ """Delete a server from its object reference."""
+ utils.delete_server(self.novaclient, server)
+ utils.waiting_servers_deletion(self.novaclient, [server])
def find_flavor(self, flavor_type):
+ """Find a flavor by name."""
try:
flavor = self.novaclient.flavors.find(name=flavor_type)
return flavor
except Exception:
return None
- def create_flavor(self, name, ram, vcpus, disk, ephemeral=0, override=False):
- if override:
- self.delete_flavor(name)
+ def create_flavor(self, name, ram, vcpus, disk, ephemeral=0):
+ """Create a flavor."""
return self.novaclient.flavors.create(name=name, ram=ram, vcpus=vcpus, disk=disk,
ephemeral=ephemeral)
- def delete_flavor(self, flavor=None, name=None):
- try:
- if not flavor:
- flavor = self.find_flavor(name)
- flavor.delete()
- return True
- except Exception:
- return False
-
- def normalize_az_host(self, az, host):
- if not az:
- az = self.config.availability_zone
- return az + ':' + host
-
- def auto_fill_az(self, host_list, host):
- '''
- no az provided, if there is a host list we can auto-fill the az
- else we use the configured az if available
- else we return an error
- '''
- if host_list:
- for hyp in host_list:
- if hyp.host == host:
- return self.normalize_az_host(hyp.zone, host)
- # no match on host
- LOG.error('Passed host name does not exist: %s', host)
- return None
- if self.config.availability_zone:
- return self.normalize_az_host(None, host)
- LOG.error('--hypervisor passed without an az and no az configured')
- return None
-
- def sanitize_az_host(self, host_list, az_host):
- '''
- host_list: list of hosts as retrieved from openstack (can be empty)
- az_host: either a host or a az:host string
- if a host, will check host is in the list, find the corresponding az and
- return az:host
- if az:host is passed will check the host is in the list and az matches
- if host_list is empty, will return the configured az if there is no
- az passed
- '''
- if ':' in az_host:
- # no host_list, return as is (no check)
- if not host_list:
- return az_host
- # if there is a host_list, extract and verify the az and host
- az_host_list = az_host.split(':')
- zone = az_host_list[0]
- host = az_host_list[1]
- for hyp in host_list:
- if hyp.host == host:
- if hyp.zone == zone:
- # matches
- return az_host
- # else continue - another zone with same host name?
- # no match
- LOG.error('No match for availability zone and host %s', az_host)
- return None
- else:
- return self.auto_fill_az(host_list, az_host)
-
- #
- # Return a list of 0, 1 or 2 az:host
- #
- # The list is computed as follows:
- # The list of all hosts is retrieved first from openstack
- # if this fails, checks and az auto-fill are disabled
- #
- # If the user provides a list of hypervisors (--hypervisor)
- # that list is checked and returned
- #
- # If the user provides a configured az name (config.availability_zone)
- # up to the first 2 hosts from the list that match the az are returned
- #
- # If the user did not configure an az name
- # up to the first 2 hosts from the list are returned
- # Possible return values:
- # [ az ]
- # [ az:hyp ]
- # [ az1:hyp1, az2:hyp2 ]
- # [] if an error occurred (error message printed to console)
- #
- def get_az_host_list(self):
- avail_list = []
- host_list = []
-
- try:
- host_list = self.novaclient.services.list()
- except novaclient.exceptions.Forbidden:
- LOG.warning('Operation Forbidden: could not retrieve list of hosts'
- ' (likely no permission)')
-
- for host in host_list:
- # this host must be a compute node
- if host.binary != 'nova-compute' or host.state != 'up':
- continue
- candidate = None
- if self.config.availability_zone:
- if host.zone == self.config.availability_zone:
- candidate = self.normalize_az_host(None, host.host)
- else:
- candidate = self.normalize_az_host(host.zone, host.host)
- if candidate:
- avail_list.append(candidate)
- # pick first 2 matches at most
- if len(avail_list) == 2:
- break
-
- # if empty we insert the configured az
- if not avail_list:
-
- if not self.config.availability_zone:
- LOG.error('Availability_zone must be configured')
- elif host_list:
- LOG.error('No host matching the selection for availability zone: %s',
- self.config.availability_zone)
- avail_list = []
- else:
- avail_list = [self.config.availability_zone]
- return avail_list
-
- def get_enabled_az_host_list(self, required_count=1):
- """
- Check which hypervisors are enabled and on which compute nodes they are running.
- Pick required count of hosts.
+ def get_hypervisor(self, hyper_name):
+ """Get the hypervisor from its name.
- :param required_count: count of compute-nodes to return
- :return: list of enabled available compute nodes
+ Can raise novaclient.exceptions.NotFound
"""
- host_list = []
- hypervisor_list = []
-
- try:
- hypervisor_list = self.novaclient.hypervisors.list()
- host_list = self.novaclient.services.list()
- except novaclient.exceptions.Forbidden:
- LOG.warning('Operation Forbidden: could not retrieve list of hypervisors'
- ' (likely no permission)')
-
- hypervisor_list = [h for h in hypervisor_list if h.status == 'enabled' and h.state == 'up']
- if self.config.availability_zone:
- host_list = [h for h in host_list if h.zone == self.config.availability_zone]
-
- if self.config.compute_nodes:
- host_list = [h for h in host_list if h.host in self.config.compute_nodes]
-
- hosts = [h.hypervisor_hostname for h in hypervisor_list]
- host_list = [h for h in host_list if h.host in hosts]
-
- avail_list = []
- for host in host_list:
- candidate = self.normalize_az_host(host.zone, host.host)
- if candidate:
- avail_list.append(candidate)
- if len(avail_list) == required_count:
- return avail_list
-
- return avail_list
-
- def get_hypervisor(self, hyper_name):
- # can raise novaclient.exceptions.NotFound
# first get the id from name
hyper = self.novaclient.hypervisors.search(hyper_name)[0]
# get full hypervisor object
return self.novaclient.hypervisors.get(hyper.id)
-
- # Given 2 VMs test if they are running on same Host or not
- def check_vm_placement(self, vm_instance1, vm_instance2):
- try:
- server_instance_1 = self.novaclient.servers.get(vm_instance1)
- server_instance_2 = self.novaclient.servers.get(vm_instance2)
- return bool(server_instance_1.hostId == server_instance_2.hostId)
- except novaclient.exceptions:
- LOG.warning("Exception in retrieving the hostId of servers")
-
- # Create a new security group with appropriate rules
- def security_group_create(self):
- # check first the security group exists
- sec_groups = self.neutronclient.list_security_groups()['security_groups']
- group = [x for x in sec_groups if x['name'] == self.config.security_group_name]
- if group:
- return group[0]
-
- body = {
- 'security_group': {
- 'name': self.config.security_group_name,
- 'description': 'PNS Security Group'
- }
- }
- group = self.neutronclient.create_security_group(body)['security_group']
- self.security_group_add_rules(group)
-
- return group
-
- # Delete a security group
- def security_group_delete(self, group):
- if group:
- LOG.info("Deleting security group")
- self.neutronclient.delete_security_group(group['id'])
-
- # Add rules to the security group
- def security_group_add_rules(self, group):
- body = {
- 'security_group_rule': {
- 'direction': 'ingress',
- 'security_group_id': group['id'],
- 'remote_group_id': None
- }
- }
- if self.config.ipv6_mode:
- body['security_group_rule']['ethertype'] = 'IPv6'
- body['security_group_rule']['remote_ip_prefix'] = '::/0'
- else:
- body['security_group_rule']['ethertype'] = 'IPv4'
- body['security_group_rule']['remote_ip_prefix'] = '0.0.0.0/0'
-
- # Allow ping traffic
- body['security_group_rule']['protocol'] = 'icmp'
- body['security_group_rule']['port_range_min'] = None
- body['security_group_rule']['port_range_max'] = None
- self.neutronclient.create_security_group_rule(body)
-
- # Allow SSH traffic
- body['security_group_rule']['protocol'] = 'tcp'
- body['security_group_rule']['port_range_min'] = 22
- body['security_group_rule']['port_range_max'] = 22
- self.neutronclient.create_security_group_rule(body)
-
- # Allow TCP/UDP traffic for perf tools like iperf/nuttcp
- # 5001: Data traffic (standard iperf data port)
- # 5002: Control traffic (non standard)
- # note that 5000/tcp is already picked by openstack keystone
- body['security_group_rule']['protocol'] = 'tcp'
- body['security_group_rule']['port_range_min'] = 5001
- body['security_group_rule']['port_range_max'] = 5002
- self.neutronclient.create_security_group_rule(body)
- body['security_group_rule']['protocol'] = 'udp'
- self.neutronclient.create_security_group_rule(body)
diff --git a/nfvbench/config.py b/nfvbench/config.py
index 5feeda5..8e77127 100644
--- a/nfvbench/config.py
+++ b/nfvbench/config.py
@@ -16,19 +16,19 @@
from attrdict import AttrDict
import yaml
-from log import LOG
+from .log import LOG
def config_load(file_name, from_cfg=None, whitelist_keys=None):
"""Load a yaml file into a config dict, merge with from_cfg if not None
The config file content taking precedence in case of duplicate
"""
try:
- with open(file_name) as fileobj:
+ with open(file_name, encoding="utf-8") as fileobj:
cfg = AttrDict(yaml.safe_load(fileobj))
except IOError:
raise Exception("Configuration file at '{}' was not found. Please use correct path "
"and verify it is visible to container if you run nfvbench in container."
- .format(file_name))
+ .format(file_name)) from IOError
if from_cfg:
if not whitelist_keys:
@@ -43,10 +43,16 @@ def config_loads(cfg_text, from_cfg=None, whitelist_keys=None):
"""Same as config_load but load from a string
"""
try:
- cfg = AttrDict(yaml.load(cfg_text))
+ cfg = AttrDict(yaml.safe_load(cfg_text))
except TypeError:
# empty string
cfg = AttrDict()
+ except ValueError as e:
+ # In case of wrong path or file not readable or string not well formatted
+ LOG.error("String %s is not well formatted. Please verify your yaml/json string. "
+ "If string is a file path, file was not found. Please use correct path and "
+ "verify it is visible to container if you run nfvbench in container.", cfg_text)
+ raise Exception(e) from e
if from_cfg:
if not whitelist_keys:
whitelist_keys = []
@@ -58,7 +64,7 @@ def config_loads(cfg_text, from_cfg=None, whitelist_keys=None):
def _validate_config(subset, superset, whitelist_keys):
def get_err_config(subset, superset):
result = {}
- for k, v in subset.items():
+ for k, v in list(subset.items()):
if k not in whitelist_keys:
if k not in superset:
result.update({k: v})
diff --git a/nfvbench/config_plugin.py b/nfvbench/config_plugin.py
index 78c2ebb..86e5505 100644
--- a/nfvbench/config_plugin.py
+++ b/nfvbench/config_plugin.py
@@ -13,44 +13,47 @@
# License for the specific language governing permissions and limitations
# under the License.
#
+"""Configuration Plugin.
+This module is used to override the configuration with platform specific constraints and extensions
+"""
import abc
-import specs
+from . import specs
-class ConfigPluginBase(object):
- """Base class for config plugins. Need to implement public interfaces."""
- __metaclass__ = abc.ABCMeta
+class ConfigPluginBase(object, metaclass=abc.ABCMeta):
+ """Base class for config plugins."""
class InitializationFailure(Exception):
- pass
+ """Used in case of any init failure."""
def __init__(self, config):
+ """Save configuration."""
if not config:
raise ConfigPluginBase.InitializationFailure(
'Initialization parameters need to be assigned.')
-
self.config = config
@abc.abstractmethod
def get_config(self):
- """Returns updated default configuration file."""
+ """Return updated default configuration file."""
def set_config(self, config):
- """This method is called when the config has changed after this instance was initialized.
+ """Set a new configuration.
- This is needed in teh frequent case where the main config is changed in a copy and to
+ This method is called when the config has changed after this instance was initialized.
+ This is needed in the frequent case where the main config is changed in a copy and to
prevent this instance to keep pointing to the old copy of the config
"""
self.config = config
@abc.abstractmethod
def get_openstack_spec(self):
- """Returns OpenStack specs for host."""
+ """Return OpenStack specs for host."""
@abc.abstractmethod
- def get_run_spec(self, openstack_spec):
- """Returns RunSpec for given platform."""
+ def get_run_spec(self, config, openstack_spec):
+ """Return RunSpec for given platform."""
@abc.abstractmethod
def validate_config(self, cfg, openstack_spec):
@@ -58,19 +61,22 @@ class ConfigPluginBase(object):
@abc.abstractmethod
def prepare_results_config(self, cfg):
- """This function is called before running configuration is copied.
+ """Insert any plugin specific information to the results.
+
+ This function is called before running configuration is copied.
Example usage is to remove sensitive information like switch credentials.
"""
@abc.abstractmethod
def get_version(self):
- """Returns platform version."""
+ """Return platform version."""
class ConfigPlugin(ConfigPluginBase):
"""No-op config plugin class. Does not change anything."""
def __init__(self, config):
+ """Invoke the base class constructor."""
ConfigPluginBase.__init__(self, config)
def get_config(self):
@@ -78,18 +84,20 @@ class ConfigPlugin(ConfigPluginBase):
return self.config
def get_openstack_spec(self):
- """Returns OpenStack specs for host."""
+ """Return OpenStack specs for host."""
return specs.OpenStackSpec()
- def get_run_spec(self, openstack_spec):
- """Returns RunSpec for given platform."""
- return specs.RunSpec(self.config.no_vswitch_access, openstack_spec)
+ def get_run_spec(self, config, openstack_spec):
+ """Return RunSpec for given platform."""
+ return specs.RunSpec(config.no_vswitch_access, openstack_spec)
- def validate_config(self, config, openstack_spec):
- pass
+ def validate_config(self, cfg, openstack_spec):
+ """Nothing to validate by default."""
def prepare_results_config(self, cfg):
+ """Nothing to add the results by default."""
return cfg
def get_version(self):
+ """Return an empty version."""
return {}
diff --git a/nfvbench/credentials.py b/nfvbench/credentials.py
index 530ad69..7c48879 100644
--- a/nfvbench/credentials.py
+++ b/nfvbench/credentials.py
@@ -21,32 +21,40 @@ import getpass
from keystoneauth1.identity import v2
from keystoneauth1.identity import v3
from keystoneauth1 import session
-from log import LOG
+import openstack
+from keystoneclient.exceptions import HTTPClientError
+
+from .log import LOG
class Credentials(object):
def get_session(self):
- dct = {
- 'username': self.rc_username,
- 'password': self.rc_password,
- 'auth_url': self.rc_auth_url
- }
- auth = None
-
- if self.rc_identity_api_version == 3:
- dct.update({
- 'project_name': self.rc_project_name,
- 'project_domain_name': self.rc_project_domain_name,
- 'user_domain_name': self.rc_user_domain_name
- })
- auth = v3.Password(**dct)
+
+ if self.clouds_detail:
+ connection = openstack.connect(cloud=self.clouds_detail)
+ cred_session = connection.session
else:
- dct.update({
- 'tenant_name': self.rc_tenant_name
- })
- auth = v2.Password(**dct)
- return session.Session(auth=auth, verify=self.rc_cacert)
+ dct = {
+ 'username': self.rc_username,
+ 'password': self.rc_password,
+ 'auth_url': self.rc_auth_url
+ }
+
+ if self.rc_identity_api_version == 3:
+ dct.update({
+ 'project_name': self.rc_project_name,
+ 'project_domain_name': self.rc_project_domain_name,
+ 'user_domain_name': self.rc_user_domain_name
+ })
+ auth = v3.Password(**dct)
+ else:
+ dct.update({
+ 'tenant_name': self.rc_tenant_name
+ })
+ auth = v2.Password(**dct)
+ cred_session = session.Session(auth=auth, verify=self.rc_cacert)
+ return cred_session
def __parse_openrc(self, file):
export_re = re.compile('export OS_([A-Z_]*)="?(.*)')
@@ -91,11 +99,28 @@ class Credentials(object):
elif name == "PROJECT_DOMAIN_NAME":
self.rc_project_domain_name = value
+ # /users URL returns exception (HTTP 403) if user is not admin.
+ # try first without the version in case session already has it in
+ # Return HTTP 200 if user is admin
+ def __user_is_admin(self, url):
+ is_admin = False
+ try:
+ # check if user has admin role in OpenStack project
+ filter = {'service_type': 'identity',
+ 'interface': 'public'}
+ self.get_session().get(url, endpoint_filter=filter)
+ is_admin = True
+ except HTTPClientError as exc:
+ if exc.http_status == 403:
+ LOG.warning(
+ "User is not admin, no permission to list user roles. Exception: %s", exc)
+ return is_admin
+
#
# Read a openrc file and take care of the password
# The 2 args are passed from the command line and can be None
#
- def __init__(self, openrc_file, pwd=None, no_env=False):
+ def __init__(self, openrc_file, clouds_detail, pwd=None, no_env=False):
self.rc_password = None
self.rc_username = None
self.rc_tenant_name = None
@@ -105,19 +130,22 @@ class Credentials(object):
self.rc_user_domain_name = None
self.rc_project_domain_name = None
self.rc_project_name = None
- self.rc_identity_api_version = 2
+ self.rc_identity_api_version = 3
+ self.is_admin = False
+ self.clouds_detail = clouds_detail
success = True
if openrc_file:
if isinstance(openrc_file, str):
if os.path.exists(openrc_file):
- self.__parse_openrc(open(openrc_file))
+ with open(openrc_file, encoding="utf-8") as rc_file:
+ self.__parse_openrc(rc_file)
else:
LOG.error('Error: rc file does not exist %s', openrc_file)
success = False
else:
self.__parse_openrc(openrc_file)
- elif not no_env:
+ elif not clouds_detail and not no_env:
# no openrc file passed - we assume the variables have been
# sourced by the calling shell
# just check that they are present
@@ -152,15 +180,27 @@ class Credentials(object):
# always override with CLI argument if provided
- if pwd:
- self.rc_password = pwd
- # if password not know, check from env variable
- elif self.rc_auth_url and not self.rc_password and success:
- if 'OS_PASSWORD' in os.environ and not no_env:
- self.rc_password = os.environ['OS_PASSWORD']
- else:
- # interactively ask for password
- self.rc_password = getpass.getpass(
- 'Please enter your OpenStack Password: ')
- if not self.rc_password:
- self.rc_password = ""
+ if not clouds_detail:
+ if pwd:
+ self.rc_password = pwd
+ # if password not know, check from env variable
+ elif self.rc_auth_url and not self.rc_password and success:
+ if 'OS_PASSWORD' in os.environ and not no_env:
+ self.rc_password = os.environ['OS_PASSWORD']
+ else:
+ # interactively ask for password
+ self.rc_password = getpass.getpass(
+ 'Please enter your OpenStack Password: ')
+ if not self.rc_password:
+ self.rc_password = ""
+
+
+ try:
+ # /users URL returns exception (HTTP 403) if user is not admin.
+ # try first without the version in case session already has it in
+ # Return HTTP 200 if user is admin
+ self.is_admin = self.__user_is_admin('/users') or self.__user_is_admin(
+ '/v2/users') or self.__user_is_admin('/v3/users')
+ except Exception as e:
+ LOG.warning("Error occurred during Openstack API access. "
+ "Unable to check user is admin. Exception: %s", e)
diff --git a/nfvbench/factory.py b/nfvbench/factory.py
index 1461036..0d4b042 100644
--- a/nfvbench/factory.py
+++ b/nfvbench/factory.py
@@ -13,57 +13,19 @@
# License for the specific language governing permissions and limitations
# under the License.
#
+"""Factory for creating worker and config plugin instances."""
-from chain_clients import EXTStageClient
-from chain_clients import PVPStageClient
-from chain_clients import PVVPStageClient
-from chain_managers import EXTStatsManager
-from chain_managers import PVPStatsManager
-from chain_managers import PVVPStatsManager
-import chain_workers as workers
-from config_plugin import ConfigPlugin
-from specs import ChainType
-import tor_client
+from . import chain_workers as workers
+from .config_plugin import ConfigPlugin
class BasicFactory(object):
- chain_classes = [ChainType.EXT, ChainType.PVP, ChainType.PVVP]
-
- chain_stats_classes = {
- ChainType.EXT: EXTStatsManager,
- ChainType.PVP: PVPStatsManager,
- ChainType.PVVP: PVVPStatsManager,
- }
-
- stage_clients_classes = {
- ChainType.EXT: EXTStageClient,
- ChainType.PVP: PVPStageClient,
- ChainType.PVVP: PVVPStageClient,
- }
-
- def get_stats_class(self, service_chain):
- CLASS = self.chain_stats_classes.get(service_chain, None)
- if CLASS is None:
- raise Exception("Service chain '{}' not supported.".format(service_chain))
-
- return CLASS
-
- def get_stage_class(self, service_chain):
- CLASS = self.stage_clients_classes.get(service_chain, None)
- if CLASS is None:
- raise Exception("VM Client for chain '{}' not supported.".format(service_chain))
-
- return CLASS
+ """Basic factory class to be overridden for advanced customization."""
def get_chain_worker(self, encaps, service_chain):
+ """Get a chain worker based on encaps and service chain type."""
return workers.BasicWorker
- def get_tor_class(self, tor_type, no_tor_access):
- if no_tor_access or not tor_type:
- # if no TOR access is required, use basic no-op client
- tor_type = 'BasicTORClient'
-
- return getattr(tor_client, tor_type)
-
def get_config_plugin_class(self):
+ """Get a config plugin."""
return ConfigPlugin
diff --git a/nfvbench/fluentd.py b/nfvbench/fluentd.py
index 628b968..535d640 100644
--- a/nfvbench/fluentd.py
+++ b/nfvbench/fluentd.py
@@ -35,7 +35,7 @@ class FluentLogHandler(logging.Handler):
logging.Handler.__init__(self)
self.log_senders = []
self.result_senders = []
- self.runlogdate = 0
+ self.runlogdate = "1970-01-01T00:00:00.000000+0000"
self.formatter = logging.Formatter('%(message)s')
for fluentd_config in fluentd_configs:
if fluentd_config.logging_tag:
@@ -65,8 +65,9 @@ class FluentLogHandler(logging.Handler):
"message": self.formatter.format(record),
"@timestamp": self.__get_timestamp()
}
- # if runlogdate is 0, it's a log from server (not an nfvbench run) so do not send runlogdate
- if self.runlogdate != 0:
+ # if runlogdate is Jan 1st 1970, it's a log from server (not an nfvbench run)
+ # so do not send runlogdate
+ if self.runlogdate != "1970-01-01T00:00:00.000000+0000":
data["runlogdate"] = self.runlogdate
self.__update_stats(record.levelno)
@@ -103,9 +104,9 @@ class FluentLogHandler(logging.Handler):
"numwarnings": self.__warning_counter,
"@timestamp": self.__get_timestamp()
}
- # if runlogdate is 0, it's a log from server (not an nfvbench run)
+ # if runlogdate is Jan 1st 1970, it's a log from server (not an nfvbench run)
# so don't send runlogdate
- if self.runlogdate != 0:
+ if self.runlogdate != "1970-01-01T00:00:00.000000+0000":
data["runlogdate"] = self.runlogdate
for log_sender in self.log_senders:
log_sender.emit(None, data)
@@ -113,7 +114,7 @@ class FluentLogHandler(logging.Handler):
def __get_highest_level(self):
if self.__error_counter > 0:
return logging.ERROR
- elif self.__warning_counter > 0:
+ if self.__warning_counter > 0:
return logging.WARNING
return logging.INFO
@@ -121,7 +122,7 @@ class FluentLogHandler(logging.Handler):
highest_level = self.__get_highest_level()
if highest_level == logging.INFO:
return "GOOD RUN"
- elif highest_level == logging.WARNING:
+ if highest_level == logging.WARNING:
return "RUN WITH WARNINGS"
return "RUN WITH ERRORS"
diff --git a/nfvbench/network.py b/nfvbench/network.py
deleted file mode 100644
index e097c2b..0000000
--- a/nfvbench/network.py
+++ /dev/null
@@ -1,62 +0,0 @@
-# Copyright 2016 Cisco Systems, Inc. All rights reserved.
-#
-# 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 Interface(object):
-
- def __init__(self, name, device, tx_packets, rx_packets):
- self.name = name
- self.device = device
- self.packets = {
- 'tx': tx_packets,
- 'rx': rx_packets
- }
-
- def set_packets(self, tx, rx):
- self.packets = {
- 'tx': tx,
- 'rx': rx
- }
-
- def set_packets_diff(self, tx, rx):
- self.packets = {
- 'tx': tx - self.packets['tx'],
- 'rx': rx - self.packets['rx'],
- }
-
- def is_no_op(self):
- return self.name is None
-
- def get_packet_count(self, traffic_type):
- return self.packets.get(traffic_type, 0)
-
- @staticmethod
- def no_op():
- return Interface(None, None, 0, 0)
-
-
-class Network(object):
-
- def __init__(self, interfaces=None, reverse=False):
- if interfaces is None:
- interfaces = []
- self.interfaces = interfaces
- self.reverse = reverse
-
- def add_interface(self, interface):
- self.interfaces.append(interface)
-
- def get_interfaces(self):
- return self.interfaces[::-1] if self.reverse else self.interfaces
diff --git a/nfvbench/nfvbench.py b/nfvbench/nfvbench.py
index 8c88248..891b2bb 100644
--- a/nfvbench/nfvbench.py
+++ b/nfvbench/nfvbench.py
@@ -15,7 +15,6 @@
#
import argparse
-from collections import defaultdict
import copy
import datetime
import importlib
@@ -25,61 +24,60 @@ import sys
import traceback
from attrdict import AttrDict
+from logging import FileHandler
import pbr.version
from pkg_resources import resource_string
-from __init__ import __version__
-from chain_runner import ChainRunner
-from config import config_load
-from config import config_loads
-import credentials as credentials
-from factory import BasicFactory
-from fluentd import FluentLogHandler
-import log
-from log import LOG
-from nfvbenchd import WebSocketIoServer
-from specs import ChainType
-from specs import Specs
-from summarizer import NFVBenchSummarizer
-from traffic_client import TrafficGeneratorFactory
-import utils
+from .__init__ import __version__
+from .chain_runner import ChainRunner
+from .cleanup import Cleaner
+from .config import config_load
+from .config import config_loads
+from . import credentials
+from .fluentd import FluentLogHandler
+from . import log
+from .log import LOG
+from .nfvbenchd import WebServer
+from .specs import ChainType
+from .specs import Specs
+from .summarizer import NFVBenchSummarizer
+from . import utils
fluent_logger = None
class NFVBench(object):
"""Main class of NFV benchmarking tool."""
+
STATUS_OK = 'OK'
STATUS_ERROR = 'ERROR'
def __init__(self, config, openstack_spec, config_plugin, factory, notifier=None):
+ # the base config never changes for a given NFVbench instance
self.base_config = config
+ # this is the running config, updated at every run()
self.config = None
self.config_plugin = config_plugin
self.factory = factory
self.notifier = notifier
- self.cred = credentials.Credentials(config.openrc_file, None, False) \
- if config.openrc_file else None
+ self.cred = credentials.Credentials(config.openrc_file, config.clouds_detail, None, False) \
+ if config.openrc_file or config.clouds_detail else None
self.chain_runner = None
self.specs = Specs()
self.specs.set_openstack_spec(openstack_spec)
- self.clients = defaultdict(lambda: None)
self.vni_ports = []
sys.stdout.flush()
- def setup(self):
- self.specs.set_run_spec(self.config_plugin.get_run_spec(self.specs.openstack))
- self.chain_runner = ChainRunner(self.config,
- self.clients,
- self.cred,
- self.specs,
- self.factory,
- self.notifier)
-
def set_notifier(self, notifier):
self.notifier = notifier
- def run(self, opts, args):
+ def run(self, opts, args, dry_run=False):
+ """This run() method is called for every NFVbench benchmark request.
+
+ In CLI mode, this method is called only once per invocation.
+ In REST server mode, this is called once per REST POST request
+ On dry_run, show the running config in json format then exit
+ """
status = NFVBench.STATUS_OK
result = None
message = ''
@@ -89,9 +87,41 @@ class NFVBench(object):
fluent_logger.start_new_run()
LOG.info(args)
try:
- self.update_config(opts)
- self.setup()
-
+ # recalc the running config based on the base config and options for this run
+ self._update_config(opts)
+
+ if dry_run:
+ print((json.dumps(self.config, sort_keys=True, indent=4)))
+ sys.exit(0)
+
+ # check that an empty openrc file (no OpenStack) is only allowed
+ # with EXT chain
+ if (not self.config.openrc_file and not self.config.clouds_detail) and \
+ self.config.service_chain != ChainType.EXT:
+ raise Exception("openrc_file or clouds_detail in the configuration is required"
+ " for PVP/PVVP chains")
+
+ self.specs.set_run_spec(self.config_plugin.get_run_spec(self.config,
+ self.specs.openstack))
+ self.chain_runner = ChainRunner(self.config,
+ self.cred,
+ self.specs,
+ self.factory,
+ self.notifier)
+ new_frame_sizes = []
+ # make sure that the min frame size is 64
+ min_packet_size = 64
+ for frame_size in self.config.frame_sizes:
+ try:
+ if int(frame_size) < min_packet_size:
+ frame_size = str(min_packet_size)
+ LOG.info("Adjusting frame size %s bytes to minimum size %s bytes",
+ frame_size, min_packet_size)
+ if frame_size not in new_frame_sizes:
+ new_frame_sizes.append(frame_size)
+ except ValueError:
+ new_frame_sizes.append(frame_size.upper())
+ self.config.frame_sizes = new_frame_sizes
result = {
"date": datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
"nfvbench_version": __version__,
@@ -118,7 +148,7 @@ class NFVBench(object):
self.chain_runner.close()
if status == NFVBench.STATUS_OK:
- result = utils.dict_to_json_dict(result)
+ # result2 = utils.dict_to_json_dict(result)
return {
'status': status,
'result': result
@@ -129,7 +159,7 @@ class NFVBench(object):
}
def prepare_summary(self, result):
- """Prepares summary of the result to print and send it to logger (eg: fluentd)"""
+ """Prepare summary of the result to print and send it to logger (eg: fluentd)."""
global fluent_logger
summary = NFVBenchSummarizer(result, fluent_logger)
LOG.info(str(summary))
@@ -142,85 +172,159 @@ class NFVBench(object):
self.config.service_chain,
self.config.service_chain_count,
self.config.flow_count,
- self.config.frame_sizes)
+ self.config.frame_sizes,
+ self.config.user_id,
+ self.config.group_id)
+
+ def _update_config(self, opts):
+ """Recalculate the running config based on the base config and opts.
- def update_config(self, opts):
+ Sanity check on the config is done here as well.
+ """
self.config = AttrDict(dict(self.base_config))
+ # Update log file handler if needed after a config update (REST mode)
+ if 'log_file' in opts:
+ if opts['log_file']:
+ (path, _filename) = os.path.split(opts['log_file'])
+ if not os.path.exists(path):
+ LOG.warning(
+ 'Path %s does not exist. Please verify root path is shared with host. Path '
+ 'will be created.', path)
+ os.makedirs(path)
+ LOG.info('%s is created.', path)
+ if not any(isinstance(h, FileHandler) for h in log.getLogger().handlers):
+ log.add_file_logger(opts['log_file'])
+ else:
+ for h in log.getLogger().handlers:
+ if isinstance(h, FileHandler) and h.baseFilename != opts['log_file']:
+ # clean log file handler
+ log.getLogger().removeHandler(h)
+ log.add_file_logger(opts['log_file'])
+
self.config.update(opts)
+ config = self.config
+
+ config.service_chain = config.service_chain.upper()
+ config.service_chain_count = int(config.service_chain_count)
+ if config.l2_loopback:
+ # force the number of chains to be 1 in case of untagged l2 loopback
+ # (on the other hand, multiple L2 vlan tagged service chains are allowed)
+ if not config.vlan_tagging:
+ config.service_chain_count = 1
+ config.service_chain = ChainType.EXT
+ config.no_arp = True
+ LOG.info('Running L2 loopback: using EXT chain/no ARP')
+
+ # allow oversized vlan lists, just clip them
+ try:
+ vlans = [list(v) for v in config.vlans]
+ for v in vlans:
+ del v[config.service_chain_count:]
+ config.vlans = vlans
+ except Exception:
+ pass
- self.config.service_chain = self.config.service_chain.upper()
- self.config.service_chain_count = int(self.config.service_chain_count)
- self.config.flow_count = utils.parse_flow_count(self.config.flow_count)
- required_flow_count = self.config.service_chain_count * 2
- if self.config.flow_count < required_flow_count:
+ # traffic profile override options
+ if 'frame_sizes' in opts:
+ unidir = False
+ if 'unidir' in opts:
+ unidir = opts['unidir']
+ override_custom_traffic(config, opts['frame_sizes'], unidir)
+ LOG.info("Frame size has been set to %s for current configuration", opts['frame_sizes'])
+
+ config.flow_count = utils.parse_flow_count(config.flow_count)
+ required_flow_count = config.service_chain_count * 2
+ if config.flow_count < required_flow_count:
LOG.info("Flow count %d has been set to minimum value of '%d' "
- "for current configuration", self.config.flow_count,
+ "for current configuration", config.flow_count,
required_flow_count)
- self.config.flow_count = required_flow_count
-
- if self.config.flow_count % 2 != 0:
- self.config.flow_count += 1
+ config.flow_count = required_flow_count
- self.config.duration_sec = float(self.config.duration_sec)
- self.config.interval_sec = float(self.config.interval_sec)
+ if config.flow_count % 2:
+ config.flow_count += 1
- # Get traffic generator profile config
- if not self.config.generator_profile:
- self.config.generator_profile = self.config.traffic_generator.default_profile
+ # Possibly adjust the cache size
+ if config.cache_size < 0:
+ config.cache_size = config.flow_count
- generator_factory = TrafficGeneratorFactory(self.config)
- self.config.generator_config = \
- generator_factory.get_generator_config(self.config.generator_profile)
+ # The size must be capped to 10000 (where does this limit come from?)
+ config.cache_size = min(config.cache_size, 10000)
- if not any(self.config.generator_config.pcis):
- raise Exception("PCI addresses configuration for selected traffic generator profile "
- "({tg_profile}) are missing. Please specify them in configuration file."
- .format(tg_profile=self.config.generator_profile))
+ config.duration_sec = float(config.duration_sec)
+ config.interval_sec = float(config.interval_sec)
+ config.pause_sec = float(config.pause_sec)
- if self.config.traffic is None or not self.config.traffic:
- raise Exception("No traffic profile found in traffic configuration, "
- "please fill 'traffic' section in configuration file.")
+ if config.traffic is None or not config.traffic:
+ raise Exception("Missing traffic property in configuration")
- if isinstance(self.config.traffic, tuple):
- self.config.traffic = self.config.traffic[0]
+ if config.openrc_file:
+ config.openrc_file = os.path.expanduser(config.openrc_file)
+ if config.flavor.vcpus < 2:
+ raise Exception("Flavor vcpus must be >= 2")
- self.config.frame_sizes = generator_factory.get_frame_sizes(self.config.traffic.profile)
+ config.ndr_run = (not config.no_traffic and
+ 'ndr' in config.rate.strip().lower().split('_'))
+ config.pdr_run = (not config.no_traffic and
+ 'pdr' in config.rate.strip().lower().split('_'))
+ config.single_run = (not config.no_traffic and
+ not (config.ndr_run or config.pdr_run))
- self.config.ipv6_mode = False
- self.config.no_dhcp = True
- self.config.same_network_only = True
- if self.config.openrc_file:
- self.config.openrc_file = os.path.expanduser(self.config.openrc_file)
-
- self.config.ndr_run = (not self.config.no_traffic
- and 'ndr' in self.config.rate.strip().lower().split('_'))
- self.config.pdr_run = (not self.config.no_traffic
- and 'pdr' in self.config.rate.strip().lower().split('_'))
- self.config.single_run = (not self.config.no_traffic
- and not (self.config.ndr_run or self.config.pdr_run))
-
- if self.config.vlans and len(self.config.vlans) != 2:
- raise Exception('Number of configured VLAN IDs for VLAN tagging must be exactly 2.')
-
- self.config.json_file = self.config.json if self.config.json else None
- if self.config.json_file:
- (path, _filename) = os.path.split(self.config.json)
+ config.json_file = config.json if config.json else None
+ if config.json_file:
+ (path, _filename) = os.path.split(config.json)
if not os.path.exists(path):
raise Exception('Please provide existing path for storing results in JSON file. '
'Path used: {path}'.format(path=path))
- self.config.std_json_path = self.config.std_json if self.config.std_json else None
- if self.config.std_json_path:
- if not os.path.exists(self.config.std_json):
+ config.std_json_path = config.std_json if config.std_json else None
+ if config.std_json_path:
+ if not os.path.exists(config.std_json):
raise Exception('Please provide existing path for storing results in JSON file. '
- 'Path used: {path}'.format(path=self.config.std_json_path))
+ 'Path used: {path}'.format(path=config.std_json_path))
+
+ # Check that multiqueue is between 1 and 8 (8 is the max allowed by libvirt/qemu)
+ if config.vif_multiqueue_size < 1 or config.vif_multiqueue_size > 8:
+ raise Exception('vif_multiqueue_size (%d) must be in [1..8]' %
+ config.vif_multiqueue_size)
- self.config_plugin.validate_config(self.config, self.specs.openstack)
+ # VxLAN and MPLS sanity checks
+ if config.vxlan or config.mpls:
+ if config.vlan_tagging:
+ config.vlan_tagging = False
+ config.no_latency_streams = True
+ config.no_latency_stats = True
+ config.no_flow_stats = True
+ LOG.info('VxLAN or MPLS: vlan_tagging forced to False '
+ '(inner VLAN tagging must be disabled)')
+ self.config_plugin.validate_config(config, self.specs.openstack)
-def parse_opts_from_cli():
+
+def bool_arg(x):
+ """Argument type to be used in parser.add_argument()
+ When a boolean like value is expected to be given
+ """
+ return (str(x).lower() != 'false') \
+ and (str(x).lower() != 'no') \
+ and (str(x).lower() != '0')
+
+
+def int_arg(x):
+ """Argument type to be used in parser.add_argument()
+ When an integer type value is expected to be given
+ (returns 0 if argument is invalid, hexa accepted)
+ """
+ return int(x, 0)
+
+
+def _parse_opts_from_cli():
parser = argparse.ArgumentParser()
+ parser.add_argument('--status', dest='status',
+ action='store_true',
+ default=None,
+ help='Provide NFVbench status')
+
parser.add_argument('-c', '--config', dest='config',
action='store',
help='Override default values with a config file or '
@@ -229,10 +333,8 @@ def parse_opts_from_cli():
parser.add_argument('--server', dest='server',
default=None,
- action='store',
- metavar='<http_root_pathname>',
- help='Run nfvbench in server mode and pass'
- ' the HTTP root folder full pathname')
+ action='store_true',
+ help='Run nfvbench in server mode')
parser.add_argument('--host', dest='host',
action='store',
@@ -245,7 +347,7 @@ def parse_opts_from_cli():
help='Port on which server will be listening (default 7555)')
parser.add_argument('-sc', '--service-chain', dest='service_chain',
- choices=BasicFactory.chain_classes,
+ choices=ChainType.names,
action='store',
help='Service chain to run')
@@ -277,7 +379,7 @@ def parse_opts_from_cli():
parser.add_argument('--inter-node', dest='inter_node',
default=None,
action='store_true',
- help='run VMs in different compute nodes (PVVP only)')
+ help='(deprecated)')
parser.add_argument('--sriov', dest='sriov',
default=None,
@@ -299,6 +401,17 @@ def parse_opts_from_cli():
action='store',
help='Traffic generator profile to use')
+ parser.add_argument('-l3', '--l3-router', dest='l3_router',
+ default=None,
+ action='store_true',
+ help='Use L3 neutron routers to handle traffic')
+
+ parser.add_argument('-garp', '--gratuitous-arp', dest='periodic_gratuitous_arp',
+ default=None,
+ action='store_true',
+ help='Use gratuitous ARP to maintain session between TG '
+ 'and L3 routers to handle traffic')
+
parser.add_argument('-0', '--no-traffic', dest='no_traffic',
default=None,
action='store_true',
@@ -310,31 +423,47 @@ def parse_opts_from_cli():
help='Do not use ARP to find MAC addresses, '
'instead use values in config file')
- parser.add_argument('--no-reset', dest='no_reset',
+ parser.add_argument('--loop-vm-arp', dest='loop_vm_arp',
default=None,
action='store_true',
- help='Do not reset counters prior to running')
+ help='Use ARP to find MAC addresses '
+ 'instead of using values from TRex ports (VPP forwarder only)')
- parser.add_argument('--no-int-config', dest='no_int_config',
+ parser.add_argument('--no-vswitch-access', dest='no_vswitch_access',
default=None,
action='store_true',
- help='Skip interfaces config on EXT service chain')
+ help='Skip vswitch configuration and retrieving of stats')
- parser.add_argument('--no-tor-access', dest='no_tor_access',
+ parser.add_argument('--vxlan', dest='vxlan',
default=None,
action='store_true',
- help='Skip TOR switch configuration and retrieving of stats')
+ help='Enable VxLan encapsulation')
- parser.add_argument('--no-vswitch-access', dest='no_vswitch_access',
+ parser.add_argument('--mpls', dest='mpls',
default=None,
action='store_true',
- help='Skip vswitch configuration and retrieving of stats')
+ help='Enable MPLS encapsulation')
parser.add_argument('--no-cleanup', dest='no_cleanup',
default=None,
action='store_true',
help='no cleanup after run')
+ parser.add_argument('--cleanup', dest='cleanup',
+ default=None,
+ action='store_true',
+ help='Cleanup NFVbench resources (prompt to confirm)')
+
+ parser.add_argument('--force-cleanup', dest='force_cleanup',
+ default=None,
+ action='store_true',
+ help='Cleanup NFVbench resources (do not prompt)')
+
+ parser.add_argument('--restart', dest='restart',
+ default=None,
+ action='store_true',
+ help='Restart TRex server')
+
parser.add_argument('--json', dest='json',
action='store',
help='store results in json format file',
@@ -352,10 +481,15 @@ def parse_opts_from_cli():
action='store_true',
help='print the default config in yaml format (unedited)')
+ parser.add_argument('--show-pre-config', dest='show_pre_config',
+ default=None,
+ action='store_true',
+ help='print the config in json format (cfg file applied)')
+
parser.add_argument('--show-config', dest='show_config',
default=None,
action='store_true',
- help='print the running config in json format')
+ help='print the running config in json format (final)')
parser.add_argument('-ss', '--show-summary', dest='summary',
action='store',
@@ -386,6 +520,117 @@ def parse_opts_from_cli():
action='store',
help='Custom label for performance records')
+ parser.add_argument('--hypervisor', dest='hypervisor',
+ action='store',
+ metavar='<hypervisor name>',
+ help='Where chains must run ("compute", "az:", "az:compute")')
+
+ parser.add_argument('--l2-loopback', '--l2loopback', dest='l2_loopback',
+ action='store',
+ metavar='<vlan(s)|no-tag|true|false>',
+ help='Port to port or port to switch to port L2 loopback '
+ 'tagged with given VLAN id(s) or not (given \'no-tag\') '
+ '\'true\': use current vlans; \'false\': disable this mode.')
+
+ parser.add_argument('--i40e-mixed', dest='i40e_mixed',
+ action='store',
+ default=None,
+ metavar='<ignore,check,unbind>',
+ help='TRex behavior when dealing with a i40e network card driver'
+ ' [ https://trex-tgn.cisco.com/youtrack/issue/trex-528 ]')
+
+ parser.add_argument('--user-info', dest='user_info',
+ action='append',
+ metavar='<data>',
+ help='Custom data to be included as is '
+ 'in the json report config branch - '
+ ' example, pay attention! no space: '
+ '--user-info=\'{"status":"explore","description":'
+ '{"target":"lab","ok":true,"version":2020}}\' - '
+ 'this option may be repeated; given data will be merged.')
+
+ parser.add_argument('--vlan-tagging', dest='vlan_tagging',
+ type=bool_arg,
+ metavar='<boolean>',
+ action='store',
+ default=None,
+ help='Override the NFVbench \'vlan_tagging\' parameter')
+
+ parser.add_argument('--intf-speed', dest='intf_speed',
+ metavar='<speed>',
+ action='store',
+ default=None,
+ help='Override the NFVbench \'intf_speed\' '
+ 'parameter (e.g. 10Gbps, auto, 16.72Gbps)')
+
+ parser.add_argument('--cores', dest='cores',
+ type=int_arg,
+ metavar='<number>',
+ action='store',
+ default=None,
+ help='Override the T-Rex \'cores\' parameter')
+
+ parser.add_argument('--cache-size', dest='cache_size',
+ type=int_arg,
+ metavar='<size>',
+ action='store',
+ default=None,
+ help='Specify the FE cache size (default: 0, flow-count if < 0)')
+
+ parser.add_argument('--service-mode', dest='service_mode',
+ action='store_true',
+ default=None,
+ help='Enable T-Rex service mode (for debugging purpose)')
+
+ parser.add_argument('--no-e2e-check', dest='no_e2e_check',
+ action='store_true',
+ default=None,
+ help='Skip "end to end" connectivity check (on test purpose)')
+
+ parser.add_argument('--no-flow-stats', dest='no_flow_stats',
+ action='store_true',
+ default=None,
+ help='Disable additional flow stats (on high load traffic)')
+
+ parser.add_argument('--no-latency-stats', dest='no_latency_stats',
+ action='store_true',
+ default=None,
+ help='Disable flow stats for latency traffic')
+
+ parser.add_argument('--no-latency-streams', dest='no_latency_streams',
+ action='store_true',
+ default=None,
+ help='Disable latency measurements (no streams)')
+
+ parser.add_argument('--user-id', dest='user_id',
+ type=int_arg,
+ metavar='<uid>',
+ action='store',
+ default=None,
+ help='Change json/log files ownership with this user (int)')
+
+ parser.add_argument('--group-id', dest='group_id',
+ type=int_arg,
+ metavar='<gid>',
+ action='store',
+ default=None,
+ help='Change json/log files ownership with this group (int)')
+
+ parser.add_argument('--show-trex-log', dest='show_trex_log',
+ default=None,
+ action='store_true',
+ help='Show the current TRex local server log file contents'
+ ' => diagnostic/help in case of configuration problems')
+
+ parser.add_argument('--debug-mask', dest='debug_mask',
+ type=int_arg,
+ metavar='<mask>',
+ action='store',
+ default=None,
+ help='General purpose register (debugging flags), '
+ 'the hexadecimal notation (0x...) is accepted.'
+ 'Designed for development needs (default: 0).')
+
opts, unknown_opts = parser.parse_known_args()
return opts, unknown_opts
@@ -398,8 +643,7 @@ def load_default_config():
def override_custom_traffic(config, frame_sizes, unidir):
- """Override the traffic profiles with a custom one
- """
+ """Override the traffic profiles with a custom one."""
if frame_sizes is not None:
traffic_profile_name = "custom_traffic_profile"
config.traffic_profile = [
@@ -426,6 +670,23 @@ def check_physnet(name, netattrs):
raise Exception("SRIOV requires segmentation_id to be specified for the {n} network"
.format(n=name))
+def status_cleanup(config, cleanup, force_cleanup):
+ LOG.info('Version: %s', pbr.version.VersionInfo('nfvbench').version_string_with_vcs())
+ # check if another run is pending
+ ret_code = 0
+ try:
+ with utils.RunLock():
+ LOG.info('Status: idle')
+ except Exception:
+ LOG.info('Status: busy (run pending)')
+ ret_code = 1
+ # check nfvbench resources
+ if config.openrc_file and config.service_chain != ChainType.EXT:
+ cleaner = Cleaner(config)
+ count = cleaner.show_resources()
+ if count and (cleanup or force_cleanup):
+ cleaner.clean(not force_cleanup)
+ sys.exit(ret_code)
def main():
global fluent_logger
@@ -434,49 +695,62 @@ def main():
log.setup()
# load default config file
config, default_cfg = load_default_config()
+ # possibly override the default user_id & group_id values
+ if 'USER_ID' in os.environ:
+ config.user_id = int(os.environ['USER_ID'])
+ if 'GROUP_ID' in os.environ:
+ config.group_id = int(os.environ['GROUP_ID'])
+
# create factory for platform specific classes
try:
factory_module = importlib.import_module(config['factory_module'])
factory = getattr(factory_module, config['factory_class'])()
except AttributeError:
raise Exception("Requested factory module '{m}' or class '{c}' was not found."
- .format(m=config['factory_module'], c=config['factory_class']))
+ .format(m=config['factory_module'],
+ c=config['factory_class'])) from AttributeError
# create config plugin for this platform
config_plugin = factory.get_config_plugin_class()(config)
config = config_plugin.get_config()
- opts, unknown_opts = parse_opts_from_cli()
+ opts, unknown_opts = _parse_opts_from_cli()
log.set_level(debug=opts.debug)
- # setup the fluent logger as soon as possible right after the config plugin is called,
- # if there is any logging or result tag is set then initialize the fluent logger
- for fluentd in config.fluentd:
- if fluentd.logging_tag or fluentd.result_tag:
- fluent_logger = FluentLogHandler(config.fluentd)
- LOG.addHandler(fluent_logger)
- break
-
if opts.version:
- print pbr.version.VersionInfo('nfvbench').version_string_with_vcs()
+ print((pbr.version.VersionInfo('nfvbench').version_string_with_vcs()))
sys.exit(0)
if opts.summary:
- with open(opts.summary) as json_data:
+ with open(opts.summary, encoding="utf-8") as json_data:
result = json.load(json_data)
if opts.user_label:
result['config']['user_label'] = opts.user_label
- print NFVBenchSummarizer(result, fluent_logger)
+ print((NFVBenchSummarizer(result, fluent_logger)))
sys.exit(0)
# show default config in text/yaml format
if opts.show_default_config:
- print default_cfg
+ print((default_cfg.decode("utf-8")))
+ sys.exit(0)
+
+ # dump the contents of the trex log file
+ if opts.show_trex_log:
+ try:
+ with open('/tmp/trex.log', encoding="utf-8") as trex_log_file:
+ print(trex_log_file.read(), end="")
+ except FileNotFoundError:
+ print("No TRex log file found!")
sys.exit(0)
+ # mask info logging in case of further config dump
+ if opts.show_config or opts.show_pre_config:
+ LOG.setLevel(log.logging.WARNING)
+
config.name = ''
if opts.config:
# do not check extra_specs in flavor as it can contain any key/value pairs
- whitelist_keys = ['extra_specs']
+ # the same principle applies also to the optional user_info open property
+ whitelist_keys = ['extra_specs', 'user_info']
# override default config options with start config at path parsed from CLI
# check if it is an inline yaml/json config or a file name
if os.path.isfile(opts.config):
@@ -487,24 +761,140 @@ def main():
LOG.info('Loading configuration string: %s', opts.config)
config = config_loads(opts.config, config, whitelist_keys)
+ # show current config in json format (before CLI overriding)
+ if opts.show_pre_config:
+ print((json.dumps(config, sort_keys=True, indent=4)))
+ sys.exit(0)
+
+ # setup the fluent logger as soon as possible right after the config plugin is called,
+ # if there is any logging or result tag is set then initialize the fluent logger
+ for fluentd in config.fluentd:
+ if fluentd.logging_tag or fluentd.result_tag:
+ fluent_logger = FluentLogHandler(config.fluentd)
+ LOG.addHandler(fluent_logger)
+ break
+
# traffic profile override options
override_custom_traffic(config, opts.frame_sizes, opts.unidir)
- # copy over cli options that are used in config
+ # Copy over some of the cli options that are used in config.
+ # This explicit copy is sometimes necessary
+ # because some early evaluation depends on them
+ # and cannot wait for _update_config() coming further.
+ # It is good practice then to set them to None (<=> done)
+ # and even required if a specific conversion is performed here
+ # that would be corrupted by a default update (simple copy).
+ # On the other hand, some excessive assignments have been removed
+ # from here, since the _update_config() procedure does them well.
+
config.generator_profile = opts.generator_profile
- if opts.sriov:
+ if opts.sriov is not None:
config.sriov = True
- if opts.log_file:
+ opts.sriov = None
+ if opts.log_file is not None:
config.log_file = opts.log_file
- if opts.service_chain:
+ opts.log_file = None
+ if opts.user_id is not None:
+ config.user_id = opts.user_id
+ opts.user_id = None
+ if opts.group_id is not None:
+ config.group_id = opts.group_id
+ opts.group_id = None
+ if opts.service_chain is not None:
config.service_chain = opts.service_chain
- if opts.service_chain_count:
- config.service_chain_count = opts.service_chain_count
-
- if opts.use_sriov_middle_net:
- if (not config.sriov) or (not config.service_chain == ChainType.PVVP):
- raise Exception("--use-sriov-middle-net is only valid for PVVP with SRIOV")
- config.use_sriov_middle_net = True
+ opts.service_chain = None
+ if opts.hypervisor is not None:
+ # can be any of 'comp1', 'nova:', 'nova:comp1'
+ config.compute_nodes = opts.hypervisor
+ opts.hypervisor = None
+ if opts.debug_mask is not None:
+ config.debug_mask = opts.debug_mask
+ opts.debug_mask = None
+
+ # convert 'user_info' opt from json string to dictionnary
+ # and merge the result with the current config dictionnary
+ if opts.user_info is not None:
+ for user_info_json in opts.user_info:
+ user_info_dict = json.loads(user_info_json)
+ if config.user_info:
+ config.user_info = config.user_info + user_info_dict
+ else:
+ config.user_info = user_info_dict
+ opts.user_info = None
+
+ # port to port loopback (direct or through switch)
+ # we accept the following syntaxes for the CLI argument
+ # 'false' : mode not enabled
+ # 'true' : mode enabled with currently defined vlan IDs
+ # 'no-tag' : mode enabled with no vlan tagging
+ # <vlan IDs>: mode enabled using the given (pair of) vlan ID lists
+ # - If present, a '_' char will separate left an right ports lists
+ # e.g. 'a_x' => vlans: [[a],[x]]
+ # 'a,b,c_x,y,z' => [[a,b,c],[x,y,z]]
+ # - Otherwise the given vlan ID list applies to both sides
+ # e.g. 'a' => vlans: [[a],[a]]
+ # 'a,b' => [[a,b],[a,b]]
+ # - Vlan lists size needs to be at least the actual SCC value
+ # - Unless overriden in CLI opts, config.service_chain_count
+ # is adjusted to the size of the VLAN ID lists given here.
+
+ if opts.l2_loopback is not None:
+ arg_pair = opts.l2_loopback.lower().split('_')
+ if arg_pair[0] == 'false':
+ config.l2_loopback = False
+ else:
+ config.l2_loopback = True
+ if config.service_chain != ChainType.EXT:
+ LOG.info('Changing service chain type to EXT')
+ config.service_chain = ChainType.EXT
+ if not config.no_arp:
+ LOG.info('Disabling ARP')
+ config.no_arp = True
+ if arg_pair[0] == 'true':
+ pass
+ else:
+ # here explicit (not)tagging is not CLI overridable
+ opts.vlan_tagging = None
+ if arg_pair[0] == 'no-tag':
+ config.vlan_tagging = False
+ else:
+ config.vlan_tagging = True
+ if len(arg_pair) == 1 or not arg_pair[1]:
+ arg_pair = [arg_pair[0], arg_pair[0]]
+ vlans = [[], []]
+
+ def append_vlan(port, vlan_id):
+ # a vlan tag value must be in [0..4095]
+ if vlan_id not in range(0, 4096):
+ raise ValueError
+ vlans[port].append(vlan_id)
+ try:
+ for port in [0, 1]:
+ vlan_ids = arg_pair[port].split(',')
+ for vlan_id in vlan_ids:
+ append_vlan(port, int(vlan_id))
+ if len(vlans[0]) != len(vlans[1]):
+ raise ValueError
+ except ValueError:
+ # at least one invalid tag => no tagging
+ config.vlan_tagging = False
+ if config.vlan_tagging:
+ config.vlans = vlans
+ # force service chain count if not CLI overriden
+ if opts.service_chain_count is None:
+ config.service_chain_count = len(vlans[0])
+ opts.l2_loopback = None
+
+ if config.i40e_mixed is None:
+ config.i40e_mixed = 'ignore'
+ if config.use_sriov_middle_net is None:
+ config.use_sriov_middle_net = False
+ if opts.use_sriov_middle_net is not None:
+ config.use_sriov_middle_net = opts.use_sriov_middle_net
+ opts.use_sriov_middle_net = None
+ if (config.use_sriov_middle_net and (
+ (not config.sriov) or (config.service_chain != ChainType.PVVP))):
+ raise Exception("--use-sriov-middle-net is only valid for PVVP with SRIOV")
if config.sriov and config.service_chain != ChainType.EXT:
# if sriov is requested (does not apply to ext chains)
@@ -514,26 +904,23 @@ def main():
if config.service_chain == ChainType.PVVP and config.use_sriov_middle_net:
check_physnet("middle", config.internal_networks.middle)
- # show running config in json format
- if opts.show_config:
- print json.dumps(config, sort_keys=True, indent=4)
- sys.exit(0)
-
- # check that an empty openrc file (no OpenStack) is only allowed
- # with EXT chain
- if not config.openrc_file:
- if config.service_chain == ChainType.EXT:
- LOG.info('EXT chain with OpenStack mode disabled')
- else:
- raise Exception("openrc_file is empty in the configuration and is required")
-
# update the config in the config plugin as it might have changed
# in a copy of the dict (config plugin still holds the original dict)
config_plugin.set_config(config)
+ if opts.status or opts.cleanup or opts.force_cleanup:
+ status_cleanup(config, opts.cleanup, opts.force_cleanup)
+
# add file log if requested
if config.log_file:
log.add_file_logger(config.log_file)
+ # possibly change file ownership
+ uid = config.user_id
+ gid = config.group_id
+ if gid is None:
+ gid = uid
+ if uid is not None:
+ os.chown(config.log_file, uid, gid)
openstack_spec = config_plugin.get_openstack_spec() if config.openrc_file \
else None
@@ -541,19 +928,16 @@ def main():
nfvbench_instance = NFVBench(config, openstack_spec, config_plugin, factory)
if opts.server:
- if os.path.isdir(opts.server):
- server = WebSocketIoServer(opts.server, nfvbench_instance, fluent_logger)
- nfvbench_instance.set_notifier(server)
- try:
- port = int(opts.port)
- except ValueError:
- server.run(host=opts.host)
- else:
- server.run(host=opts.host, port=port)
+ server = WebServer(nfvbench_instance, fluent_logger)
+ try:
+ port = int(opts.port)
+ except ValueError:
+ server.run(host=opts.host)
else:
- print 'Invalid HTTP root directory: ' + opts.server
- sys.exit(1)
+ server.run(host=opts.host, port=port)
+ # server.run() should never return
else:
+ dry_run = opts.show_config
with utils.RunLock():
run_summary_required = True
if unknown_opts:
@@ -562,10 +946,10 @@ def main():
raise Exception(err_msg)
# remove unfilled values
- opts = {k: v for k, v in vars(opts).iteritems() if v is not None}
+ opts = {k: v for k, v in list(vars(opts).items()) if v is not None}
# get CLI args
params = ' '.join(str(e) for e in sys.argv[1:])
- result = nfvbench_instance.run(opts, params)
+ result = nfvbench_instance.run(opts, params, dry_run=dry_run)
if 'error_message' in result:
raise Exception(result['error_message'])
@@ -578,7 +962,7 @@ def main():
'status': NFVBench.STATUS_ERROR,
'error_message': traceback.format_exc()
})
- print str(exc)
+ print((str(exc)))
finally:
if fluent_logger:
# only send a summary record if there was an actual nfvbench run or
diff --git a/nfvbench/nfvbenchd.py b/nfvbench/nfvbenchd.py
index 76906c5..07f1eea 100644
--- a/nfvbench/nfvbenchd.py
+++ b/nfvbench/nfvbenchd.py
@@ -15,38 +15,31 @@
#
import json
-import Queue
+import queue
+from threading import Thread
import uuid
from flask import Flask
from flask import jsonify
-from flask import render_template
from flask import request
-from flask_socketio import emit
-from flask_socketio import SocketIO
-from summarizer import NFVBenchSummarizer
+from .summarizer import NFVBenchSummarizer
-from log import LOG
-from utils import byteify
-from utils import RunLock
+from .log import LOG
+from .utils import RunLock
-# this global cannot reside in Ctx because of the @app and @socketio decorators
-app = None
-socketio = None
+from .__init__ import __version__
STATUS_OK = 'OK'
STATUS_ERROR = 'ERROR'
STATUS_PENDING = 'PENDING'
STATUS_NOT_FOUND = 'NOT_FOUND'
-
def result_json(status, message, request_id=None):
body = {
'status': status,
'error_message': message
}
-
if request_id is not None:
body['request_id'] = request_id
@@ -54,7 +47,7 @@ def result_json(status, message, request_id=None):
def load_json(data):
- return json.loads(json.dumps(data), object_hook=byteify)
+ return json.loads(json.dumps(data))
def get_uuid():
@@ -63,18 +56,16 @@ def get_uuid():
class Ctx(object):
MAXLEN = 5
- run_queue = Queue.Queue()
+ run_queue = queue.Queue()
busy = False
result = None
- request_from_socketio = False
results = {}
ids = []
current_id = None
@staticmethod
- def enqueue(config, request_id, from_socketio=False):
+ def enqueue(config, request_id):
Ctx.busy = True
- Ctx.request_from_socketio = from_socketio
config['request_id'] = request_id
Ctx.run_queue.put(config)
@@ -109,16 +100,15 @@ class Ctx(object):
res = Ctx.results[request_id]
except KeyError:
return None
-
+ # pylint: disable=unsubscriptable-object
if Ctx.result and request_id == Ctx.result['request_id']:
Ctx.result = None
-
- return res
- else:
- res = Ctx.result
- if res:
- Ctx.result = None
return res
+ # pylint: enable=unsubscriptable-object
+ res = Ctx.result
+ if res:
+ Ctx.result = None
+ return res
@staticmethod
def is_busy():
@@ -129,40 +119,18 @@ class Ctx(object):
return Ctx.current_id
-def setup_flask(root_path):
- global socketio
- global app
+def setup_flask():
app = Flask(__name__)
- app.root_path = root_path
- socketio = SocketIO(app, async_mode='threading')
busy_json = result_json(STATUS_ERROR, 'there is already an NFVbench request running')
not_busy_json = result_json(STATUS_ERROR, 'no pending NFVbench run')
not_found_msg = 'results not found'
pending_msg = 'NFVbench run still pending'
- # --------- socketio requests ------------
-
- @socketio.on('start_run')
- def _socketio_start_run(config):
- if not Ctx.is_busy():
- Ctx.enqueue(config, get_uuid(), from_socketio=True)
- else:
- emit('error', {'reason': 'there is already an NFVbench request running'})
-
- @socketio.on('echo')
- def _socketio_echo(config):
- emit('echo', config)
-
# --------- HTTP requests ------------
- @app.route('/')
- def _index():
- return render_template('index.html')
-
- @app.route('/echo', methods=['GET'])
- def _echo():
- config = request.json
- return jsonify(config)
+ @app.route('/version', methods=['GET'])
+ def _version():
+ return __version__
@app.route('/start_run', methods=['POST'])
def _start_run():
@@ -189,35 +157,34 @@ def setup_flask(root_path):
return jsonify(res)
# result for given request_id not found
return jsonify(result_json(STATUS_NOT_FOUND, not_found_msg, request_id))
- else:
- if Ctx.is_busy():
- # task still pending, return with request_id
- return jsonify(result_json(STATUS_PENDING,
- pending_msg,
- Ctx.get_current_request_id()))
-
- res = Ctx.get_result()
- if res:
- return jsonify(res)
- return jsonify(not_busy_json)
+ if Ctx.is_busy():
+ # task still pending, return with request_id
+ return jsonify(result_json(STATUS_PENDING,
+ pending_msg,
+ Ctx.get_current_request_id()))
+
+ res = Ctx.get_result()
+ if res:
+ return jsonify(res)
+ return jsonify(not_busy_json)
+ return app
-class WebSocketIoServer(object):
- """This class takes care of the web socketio server, accepts websocket events, and sends back
- notifications using websocket events (send_ methods). Caller should simply create an instance
+class WebServer(object):
+ """This class takes care of the web server. Caller should simply create an instance
of this class and pass a runner object then invoke the run method
"""
- def __init__(self, http_root, runner, fluent_logger):
+ def __init__(self, runner, fluent_logger):
self.nfvbench_runner = runner
- setup_flask(http_root)
+ self.app = setup_flask()
self.fluent_logger = fluent_logger
- def run(self, host='127.0.0.1', port=7556):
+ def run(self, host, port):
- # socketio.run will not return so we need to run it in a background thread so that
+ # app.run will not return so we need to run it in a background thread so that
# the calling thread (main thread) can keep doing work
- socketio.start_background_task(target=socketio.run, app=app, host=host, port=port)
+ Thread(target=self.app.run, args=(host, port)).start()
# wait for run requests
# the runner must be executed from the main thread (Trex client library requirement)
@@ -226,10 +193,10 @@ class WebSocketIoServer(object):
# print 'main thread waiting for requests...'
config = Ctx.dequeue()
# print 'main thread processing request...'
- print config
+ # print config
try:
# remove unfilled values as we do not want them to override default values with None
- config = {k: v for k, v in config.items() if v is not None}
+ config = {k: v for k, v in list(config.items()) if v is not None}
with RunLock():
if self.fluent_logger:
self.fluent_logger.start_new_run()
@@ -238,23 +205,19 @@ class WebSocketIoServer(object):
results = result_json(STATUS_ERROR, str(exc))
LOG.exception('NFVbench runner exception:')
- if Ctx.request_from_socketio:
- socketio.emit('run_end', results)
- else:
- # this might overwrite a previously unfetched result
- Ctx.set_result(results)
- summary = NFVBenchSummarizer(results['result'], self.fluent_logger)
- LOG.info(str(summary))
+ # this might overwrite a previously unfetched result
+ Ctx.set_result(results)
+ try:
+ summary = NFVBenchSummarizer(results['result'], self.fluent_logger)
+ LOG.info(str(summary))
+ if 'json' in config and 'result' in results and results['status']:
+ self.nfvbench_runner.save(results['result'])
+ except KeyError:
+ # in case of error, 'result' might be missing
+ if 'error_message' in results:
+ LOG.error(results['error_message'])
+ else:
+ LOG.error('REST request completed without results or error message')
Ctx.release()
if self.fluent_logger:
self.fluent_logger.send_run_summary(True)
-
- def send_interval_stats(self, time_ms, tx_pps, rx_pps, drop_pct):
- stats = {'time_ms': time_ms, 'tx_pps': tx_pps, 'rx_pps': rx_pps, 'drop_pct': drop_pct}
- socketio.emit('run_interval_stats', stats)
-
- def send_ndr_found(self, ndr_pps):
- socketio.emit('ndr_found', {'rate_pps': ndr_pps})
-
- def send_pdr_found(self, pdr_pps):
- socketio.emit('pdr_found', {'rate_pps': pdr_pps})
diff --git a/nfvbench/nfvbenchvm/nfvbenchvm.conf b/nfvbench/nfvbenchvm/nfvbenchvm.conf
index 3bc6ace..8f5e7e9 100644
--- a/nfvbench/nfvbenchvm/nfvbenchvm.conf
+++ b/nfvbench/nfvbenchvm/nfvbenchvm.conf
@@ -9,3 +9,8 @@ TG_NET1={tg_net1}
TG_NET2={tg_net2}
TG_GATEWAY1_IP={tg_gateway1_ip}
TG_GATEWAY2_IP={tg_gateway2_ip}
+VIF_MQ_SIZE={vif_mq_size}
+NUM_MBUFS={num_mbufs}
+INTF_MGMT_CIDR={intf_mgmt_cidr}
+INTF_MGMT_IP_GW={intf_mgmt_ip_gw}
+INTF_MAC_MGMT={intf_mac_mgmt} \ No newline at end of file
diff --git a/nfvbench/packet_analyzer.py b/nfvbench/packet_analyzer.py
deleted file mode 100644
index 5d72bc9..0000000
--- a/nfvbench/packet_analyzer.py
+++ /dev/null
@@ -1,64 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 Cisco Systems, Inc. All rights reserved.
-#
-# 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 collections import OrderedDict
-from log import LOG
-
-
-class PacketAnalyzer(object):
- """Analyze packet drop counter in a chain"""
-
- def __init__(self):
- self.last_packet_count = 0
- self.chain = []
-
- def record(self, interface, traffic_type):
- """Records the counter of the next interface with the corresponding traffic type"""
- if interface.is_no_op():
- return
- packet_count = interface.get_packet_count(traffic_type)
- packet_drop_count = self.last_packet_count - packet_count
- path_data = OrderedDict()
- path_data['interface'] = interface.name
- path_data['device'] = interface.device
- path_data['packet_count'] = packet_count
-
- if self.chain:
- path_data['packet_drop_count'] = packet_drop_count
-
- self.chain.append(path_data)
- self.last_packet_count = packet_count
-
- def get_analysis(self):
- """Gets the analysis of packet drops"""
- transmitted_packets = self.chain[0]['packet_count']
-
- for (index, path_data) in enumerate(self.chain):
- LOG.info('[Packet Analyze] Interface: %s', path_data['interface'])
- LOG.info('[Packet Analyze] > Count: %d', path_data['packet_count'])
-
- if index:
- if transmitted_packets:
- self.chain[index]['packet_drop_percentage'] = \
- 100.0 * path_data['packet_drop_count'] / transmitted_packets
- else:
- self.chain[index]['packet_drop_percentage'] = float('nan')
- LOG.info('[Packet Analyze] > Packet Drops: %d',
- path_data['packet_drop_count'])
- LOG.info('[Packet Analyze] > Percentage: %s',
- path_data['packet_drop_percentage'])
-
- return self.chain
diff --git a/nfvbench/packet_stats.py b/nfvbench/packet_stats.py
new file mode 100644
index 0000000..d3ec78a
--- /dev/null
+++ b/nfvbench/packet_stats.py
@@ -0,0 +1,341 @@
+# Copyright 2018 Cisco Systems, Inc. All rights reserved.
+#
+# 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.
+#
+"""Manage all classes related to counting packet stats.
+
+InterfaceStats counts RX/TX packet counters for one interface.
+PacketPathStats manages all InterfaceStats instances for a given chain.
+PacketPathStatsManager manages all packet path stats for all chains.
+"""
+
+import copy
+
+from hdrh.histogram import HdrHistogram
+from .traffic_gen.traffic_base import Latency
+
+class InterfaceStats(object):
+ """A class to hold the RX and TX counters for a virtual or physical interface.
+
+ An interface stats instance can represent a real interface (e.g. traffic gen port or
+ vhost interface) or can represent an aggegation of multiple interfaces when packets
+ are faned out (e.g. one vlan subinterface can fan out to multiple vhost interfaces
+ in the case of multi-chaining and when the network is shared across chains).
+ """
+
+ TX = 0
+ RX = 1
+
+ def __init__(self, name, device, shared=False):
+ """Create a new interface instance.
+
+ name: interface name specific to each chain (e.g. "trex port 0 chain 0")
+ device: on which device this interface resides (e.g. "trex server")
+ fetch_tx_rx: a fetch method that takes name, chain_index and returns a (tx, rx) tuple
+ shared: if true this interface stats is shared across all chains
+ """
+ self.name = name
+ self.device = device
+ self.shared = shared
+ # RX and TX counters for this interface
+ # A None value can be set to mean that the data is not available
+ self.tx = 0
+ self.rx = 0
+ # This is a special field to hold an optional total rx count that is only
+ # used for column aggregation to compute a total intertface stats
+ # Set to non zero to be picked by the add interface stats method for rx total
+ self.rx_total = None
+
+ def get_packet_count(self, direction):
+ """Get packet count for given direction.
+
+ direction: InterfaceStats.TX or InterfaceStats.RX
+ """
+ return self.tx if direction == InterfaceStats.TX else self.rx
+
+ @staticmethod
+ def get_reverse_direction(direction):
+ """Get the reverse direction of a given direction.
+
+ direction: InterfaceStats.TX or InterfaceStats.RX
+ return: RX if TX given, or TX is RX given
+ """
+ return 1 - direction
+
+ @staticmethod
+ def get_direction_name(direction):
+ """Get the rdisplay name of a given direction.
+
+ direction: InterfaceStats.TX or InterfaceStats.RX
+ return: "TX" or "RX"
+ """
+ if direction == InterfaceStats.TX:
+ return 'TX'
+ return 'RX'
+
+ def add_if_stats(self, if_stats):
+ """Add another ifstats to this instance."""
+ def added_counter(old_value, new_value_to_add):
+ if new_value_to_add:
+ if old_value is None:
+ return new_value_to_add
+ return old_value + new_value_to_add
+ return old_value
+
+ self.tx = added_counter(self.tx, if_stats.tx)
+ self.rx = added_counter(self.rx, if_stats.rx)
+ # Add special rx total value if set
+ self.rx = added_counter(self.rx, if_stats.rx_total)
+
+ def update_stats(self, tx, rx, diff):
+ """Update stats for this interface.
+
+ tx: new TX packet count
+ rx: new RX packet count
+ diff: if True, perform a diff of new value with previous baselined value,
+ otherwise store the new value
+ """
+ if diff:
+ self.tx = tx - self.tx
+ self.rx = rx - self.rx
+ else:
+ self.tx = tx
+ self.rx = rx
+
+ def get_display_name(self, dir, name=None, aggregate=False):
+ """Get the name to use to display stats for this interface stats.
+
+ dir: direction InterfaceStats.TX or InterfaceStats.RX
+ name: override self.name
+ aggregate: true if this is for an aggregate of multiple chains
+ """
+ if name is None:
+ name = self.name
+ return self.device + '.' + InterfaceStats.get_direction_name(dir) + '.' + name
+
+
+class PacketPathStats(object):
+ """Manage the packet path stats for 1 chain in both directions.
+
+ A packet path stats instance manages an ordered list of InterfaceStats objects
+ that can be traversed in the forward and reverse direction to display packet
+ counters in each direction.
+ The requirement is that RX and TX counters must always alternate as we travel
+ along one direction. For example with 4 interfaces per chain:
+ [ifstat0, ifstat1, ifstat2, ifstat3]
+ Packet counters in the forward direction are:
+ [ifstat0.TX, ifstat1.RX, ifstat2.TX, ifstat3.RX]
+ Packet counters in the reverse direction are:
+ [ifstat3.TX, ifstat2.RX, ifstat1.TX, ifstat0.RX]
+
+ A packet path stats also carries the latency data for each direction of the
+ chain.
+ """
+
+ def __init__(self, config, if_stats, aggregate=False):
+ """Create a packet path stats intance with the list of associated if stats.
+
+ if_stats: a list of interface stats that compose this packet path stats
+ aggregate: True if this is an aggregate packet path stats
+
+ Aggregate packet path stats are the only one that should show counters for shared
+ interface stats
+ """
+ self.config = config
+ self.if_stats = if_stats
+ # latency for packets sent from port 0 and 1
+ self.latencies = [Latency(), Latency()]
+ self.aggregate = aggregate
+
+
+ def add_packet_path_stats(self, pps):
+ """Add another packet path stat to this instance.
+
+ pps: the other packet path stats to add to this instance
+
+ This is used only for aggregating/collapsing multiple pps into 1
+ to form a "total" pps
+ """
+ for index, ifstats in enumerate(self.if_stats):
+ # shared interface stats must not be self added
+ if not ifstats.shared:
+ ifstats.add_if_stats(pps.if_stats[index])
+
+ @staticmethod
+ def get_agg_packet_path_stats(config, pps_list):
+ """Get the aggregated packet path stats from a list of packet path stats.
+
+ Interface counters are added, latency stats are updated.
+ """
+ agg_pps = None
+ for pps in pps_list:
+ if agg_pps is None:
+ # Get a clone of the first in the list
+ agg_pps = PacketPathStats(config, pps.get_cloned_if_stats(), aggregate=True)
+ else:
+ agg_pps.add_packet_path_stats(pps)
+ # aggregate all latencies
+ agg_pps.latencies = [Latency([pps.latencies[port] for pps in pps_list])
+ for port in [0, 1]]
+ return agg_pps
+
+ def get_if_stats(self, reverse=False):
+ """Get interface stats for given direction.
+
+ reverse: if True, get the list of interface stats in the reverse direction
+ else (default) gets the ist in the forward direction.
+ return: the list of interface stats indexed by the chain index
+ """
+ return self.if_stats[::-1] if reverse else self.if_stats
+
+ def get_cloned_if_stats(self):
+ """Get a clone copy of the interface stats list."""
+ return [copy.copy(ifstat) for ifstat in self.if_stats]
+
+
+ def get_header_labels(self, reverse=False, aggregate=False):
+ """Get the list of header labels for this packet path stats."""
+ labels = []
+ dir = InterfaceStats.TX
+ for ifstat in self.get_if_stats(reverse):
+ # starts at TX then RX then TX again etc...
+ labels.append(ifstat.get_display_name(dir, aggregate=aggregate))
+ dir = InterfaceStats.get_reverse_direction(dir)
+ return labels
+
+ def get_stats(self, reverse=False):
+ """Get the list of packet counters and latency data for this packet path stats.
+
+ return: a dict of packet counters and latency stats
+
+ {'packets': [2000054, 1999996, 1999996],
+ 'min_usec': 10, 'max_usec': 187, 'avg_usec': 45},
+ """
+ counters = []
+ dir = InterfaceStats.TX
+ for ifstat in self.get_if_stats(reverse):
+ # starts at TX then RX then TX again etc...
+ if ifstat.shared and not self.aggregate:
+ # shared if stats countesr are only shown in aggregate pps
+ counters.append('')
+ else:
+ counters.append(ifstat.get_packet_count(dir))
+ dir = InterfaceStats.get_reverse_direction(dir)
+
+ # latency: use port 0 latency for forward, port 1 latency for reverse
+ latency = self.latencies[1] if reverse else self.latencies[0]
+
+ if latency.available():
+ results = {'lat_min_usec': latency.min_usec,
+ 'lat_max_usec': latency.max_usec,
+ 'lat_avg_usec': latency.avg_usec}
+ if latency.hdrh_available():
+ results['hdrh'] = latency.hdrh
+ decoded_histogram = HdrHistogram.decode(latency.hdrh)
+ results['lat_percentile'] = {}
+ # override min max and avg from hdrh (only if histogram is valid)
+ if decoded_histogram.get_total_count() != 0:
+ results['lat_min_usec'] = decoded_histogram.get_min_value()
+ results['lat_max_usec'] = decoded_histogram.get_max_value()
+ results['lat_avg_usec'] = decoded_histogram.get_mean_value()
+ for percentile in self.config.lat_percentiles:
+ results['lat_percentile'][percentile] = decoded_histogram.\
+ get_value_at_percentile(percentile)
+ else:
+ for percentile in self.config.lat_percentiles:
+ results['lat_percentile'][percentile] = 'n/a'
+ else:
+ results = {}
+ results['packets'] = counters
+ return results
+
+
+class PacketPathStatsManager(object):
+ """Manages all the packet path stats for all chains.
+
+ Each run will generate packet path stats for 1 or more chains.
+ """
+
+ def __init__(self, config, pps_list):
+ """Create a packet path stats intance with the list of associated if stats.
+
+ pps_list: a list of packet path stats indexed by the chain id.
+ All packet path stats must have the same length.
+ """
+ self.config = config
+ self.pps_list = pps_list
+
+ def insert_pps_list(self, chain_index, if_stats):
+ """Insert a list of interface stats for given chain right after the first in the list.
+
+ chain_index: index of chain where to insert
+ if_stats: list of interface stats to insert
+ """
+ # use slicing to insert the list
+ self.pps_list[chain_index].if_stats[1:1] = if_stats
+
+ def _get_if_agg_name(self, reverse):
+ """Get the aggegated name for all interface stats across all pps.
+
+ return: a list of aggregated names for each position of the chain for all chains
+
+ The agregated name is the interface stats name if there is only 1 chain.
+ Otherwise it is the common prefix for all interface stats names at same position in the
+ chain.
+ """
+ # if there is only one chain, use the if_stats names directly
+ return self.pps_list[0].get_header_labels(reverse, aggregate=(len(self.pps_list) > 1))
+
+ def _get_results(self, reverse=False):
+ """Get the digested stats for the forward or reverse directions.
+
+ return: a dict with all the labels, total and per chain counters
+ """
+ chains = {}
+ # insert the aggregated row if applicable
+ if len(self.pps_list) > 1:
+ agg_pps = PacketPathStats.get_agg_packet_path_stats(self.config, self.pps_list)
+ chains['total'] = agg_pps.get_stats(reverse)
+
+ for index, pps in enumerate(self.pps_list):
+ chains[str(index)] = pps.get_stats(reverse)
+ return {'interfaces': self._get_if_agg_name(reverse),
+ 'chains': chains}
+
+ def get_results(self):
+ """Get the digested stats for the forward and reverse directions.
+
+ return: a dictionary of results for each direction and each chain
+
+ Example:
+
+ {
+ 'Forward': {
+ 'interfaces': ['Port0', 'vhost0', 'Port1'],
+ 'chains': {
+ '0': {'packets': [2000054, 1999996, 1999996],
+ 'min_usec': 10,
+ 'max_usec': 187,
+ 'avg_usec': 45},
+ '1': {...},
+ 'total': {...}
+ }
+ },
+ 'Reverse': {...
+ }
+ }
+
+ """
+ results = {'Forward': self._get_results(),
+ 'Reverse': self._get_results(reverse=True)}
+ return results
diff --git a/nfvbench/service_chain.py b/nfvbench/service_chain.py
deleted file mode 100644
index 216cc92..0000000
--- a/nfvbench/service_chain.py
+++ /dev/null
@@ -1,141 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 Cisco Systems, Inc. All rights reserved.
-#
-# 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 collections import OrderedDict
-import time
-
-from chain_managers import StageManager
-from log import LOG
-from specs import ChainType
-
-
-class ServiceChain(object):
-
- def __init__(self, config, clients, cred, specs, factory, notifier=None):
- self.config = config
- self.clients = clients
- self.cred = cred
- self.specs = specs
- self.factory = factory
- self.notifier = notifier
- self.chain_name = self.config.service_chain
- self.vlans = None
- self.stage_manager = None
- self.stats_manager = None
- LOG.info('ServiceChain initialized.')
-
- def __set_helpers(self):
- self.stage_manager = StageManager(self.config, self.cred, self.factory)
- self.clients['vm'] = self.stage_manager
- self.vlans = self.stage_manager.get_vlans()
-
- STATS_CLASS = self.factory.get_stats_class(self.config.service_chain)
- self.stats_manager = STATS_CLASS(self.config,
- self.clients,
- self.specs,
- self.factory,
- self.vlans,
- self.notifier)
-
- def __set_vlan_tags(self):
- if self.config.vlan_tagging:
- # override with user-specified vlans if configured
- vlans = self.config.vlans if self.config.vlans else self.vlans[:2]
- for vlan, device in zip(vlans, self.config.generator_config.devices):
- self.stats_manager.set_vlan_tag(device, vlan)
-
- def __get_result_per_frame_size(self, frame_size, bidirectional):
- start_time = time.time()
- traffic_result = {
- frame_size: {}
- }
- result = {}
- if not self.config.no_traffic:
- self.clients['traffic'].set_traffic(frame_size, bidirectional)
-
- if self.config.single_run:
- result = self.stats_manager.run()
- else:
- results = self.clients['traffic'].get_ndr_and_pdr()
-
- for dr in ['pdr', 'ndr']:
- if dr in results:
- traffic_result[frame_size][dr] = results[dr]
- if 'warning' in results[dr]['stats'] and results[dr]['stats']['warning']:
- traffic_result['warning'] = results[dr]['stats']['warning']
- traffic_result[frame_size]['iteration_stats'] = results['iteration_stats']
-
- result['analysis_duration_sec'] = time.time() - start_time
- if self.config.single_run:
- result['run_config'] = self.clients['traffic'].get_run_config(result)
- required = result['run_config']['direction-total']['orig']['rate_pps']
- actual = result['stats']['total_tx_rate']
- warning = self.clients['traffic'].compare_tx_rates(required, actual)
- if warning is not None:
- result['run_config']['warning'] = warning
-
- traffic_result[frame_size].update(result)
- return traffic_result
-
- def __get_chain_result(self):
- result = OrderedDict()
- for fs in self.config.frame_sizes:
- result.update(self.__get_result_per_frame_size(fs, self.config.traffic.bidirectional))
-
- chain_result = {
- 'flow_count': self.config.flow_count,
- 'service_chain_count': self.config.service_chain_count,
- 'bidirectional': self.config.traffic.bidirectional,
- 'profile': self.config.traffic.profile,
- 'compute_nodes': self.stats_manager.get_compute_nodes_bios(),
- 'result': result
- }
-
- return chain_result
-
- def __setup_traffic(self):
- self.clients['traffic'].setup()
- if not self.config.no_traffic:
- if self.config.service_chain == ChainType.EXT and not self.config.no_arp:
- self.clients['traffic'].ensure_arp_successful()
- self.clients['traffic'].ensure_end_to_end()
-
- def run(self):
- LOG.info('Starting %s chain...', self.chain_name)
- LOG.info('Dry run: %s', self.config.no_traffic)
- results = {}
-
- self.__set_helpers()
- self.__set_vlan_tags()
- self.stage_manager.set_vm_macs()
- self.__setup_traffic()
- results[self.chain_name] = {'result': self.__get_chain_result()}
-
- if self.config.service_chain == ChainType.PVVP:
- results[self.chain_name]['mode'] = 'inter-node' \
- if self.config.inter_node else 'intra-node'
-
- LOG.info("Service chain '%s' run completed.", self.chain_name)
- return results
-
- def get_version(self):
- return self.stats_manager.get_version()
-
- def close(self):
- if self.stage_manager:
- self.stage_manager.close()
- if self.stats_manager:
- self.stats_manager.close()
diff --git a/nfvbench/specs.py b/nfvbench/specs.py
index a84a55f..ec5e24e 100644
--- a/nfvbench/specs.py
+++ b/nfvbench/specs.py
@@ -17,11 +17,14 @@
class Encaps(object):
VLAN = "VLAN"
VxLAN = "VxLAN"
- BASIC = "BASIC"
+ MPLS = "MPLS"
+ NO_ENCAPS = "NONE"
encaps_mapping = {
'VLAN': VLAN,
- 'VXLAN': VxLAN
+ 'VXLAN': VxLAN,
+ 'MPLS': MPLS,
+ 'NONE': NO_ENCAPS
}
@classmethod
@@ -33,22 +36,13 @@ class ChainType(object):
PVP = "PVP"
PVVP = "PVVP"
EXT = "EXT"
-
- chain_mapping = {
- 'PVP': PVP,
- 'PVVP': PVVP,
- 'EXT': EXT
- }
-
- @classmethod
- def get_chain_type(cls, chain):
- return cls.chain_mapping.get(chain.upper(), None)
+ names = [EXT, PVP, PVVP]
class OpenStackSpec(object):
def __init__(self):
self.__vswitch = "BASIC"
- self.__encaps = Encaps.BASIC
+ self.__encaps = Encaps.NO_ENCAPS
@property
def vswitch(self):
diff --git a/nfvbench/stats_collector.py b/nfvbench/stats_collector.py
index 964d704..dc750db 100644
--- a/nfvbench/stats_collector.py
+++ b/nfvbench/stats_collector.py
@@ -56,9 +56,7 @@ class IntervalCollector(StatsCollector):
self.notifier = notifier
def add(self, stats):
- if self.notifier:
- current_stats = self.__compute_tx_rx_diff(stats)
- self.notifier.send_interval_stats(**current_stats)
+ pass
def reset(self):
# don't reset time!
@@ -66,52 +64,7 @@ class IntervalCollector(StatsCollector):
self.last_tx_pkts = 0
def add_ndr_pdr(self, tag, stats):
- if self.notifier:
-
- current_time = self._get_current_time_diff()
- rx_pps = self._get_rx_pps(stats['tx_pps'], stats['drop_percentage'])
-
- self.last_tx_pkts = stats['tx_pps'] / 1000 * (current_time - self.last_time)
- self.last_rx_pkts = rx_pps / 1000 * (current_time - self.last_time)
- self.last_time = current_time
-
- # 'drop_pct' key is an unfortunate name, since in iteration stats it means
- # number of the packets. More suitable would be 'drop_percentage'.
- # FDS frontend depends on this key
- current_stats = {
- '{}_pps'.format(tag): stats['tx_pps'],
- 'tx_pps': stats['tx_pps'],
- 'rx_pps': rx_pps,
- 'drop_pct': stats['drop_percentage'],
- 'time_ms': current_time
- }
-
- self.notifier.send_interval_stats(time_ms=current_stats['time_ms'],
- tx_pps=current_stats['tx_pps'],
- rx_pps=current_stats['rx_pps'],
- drop_pct=current_stats['drop_pct'])
- if tag == 'ndr':
- self.notifier.send_ndr_found(stats['tx_pps'])
- else:
- self.notifier.send_pdr_found(stats['tx_pps'])
-
- def __compute_tx_rx_diff(self, stats):
- current_time = self._get_current_time_diff()
- tx_diff = stats['overall']['tx']['total_pkts'] - self.last_tx_pkts
- tx_pps = (tx_diff * 1000) / (current_time - self.last_time)
- rx_diff = stats['overall']['rx']['total_pkts'] - self.last_rx_pkts
- rx_pps = (rx_diff * 1000) / (current_time - self.last_time)
-
- self.last_rx_pkts = stats['overall']['rx']['total_pkts']
- self.last_tx_pkts = stats['overall']['tx']['total_pkts']
- self.last_time = current_time
-
- return {
- 'tx_pps': tx_pps,
- 'rx_pps': rx_pps,
- 'drop_pct': max(0.0, (1 - (float(rx_pps) / tx_pps)) * 100),
- 'time_ms': current_time
- }
+ pass
class IterationCollector(StatsCollector):
diff --git a/nfvbench/stats_manager.py b/nfvbench/stats_manager.py
new file mode 100644
index 0000000..6fa98bd
--- /dev/null
+++ b/nfvbench/stats_manager.py
@@ -0,0 +1,101 @@
+#!/usr/bin/env python
+# Copyright 2016 Cisco Systems, Inc. All rights reserved.
+#
+# 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 time
+
+from .log import LOG
+from .packet_stats import PacketPathStatsManager
+from .stats_collector import IntervalCollector
+
+
+class StatsManager(object):
+ """A class to collect detailed stats and handle fixed rate runs for all chain types."""
+
+ def __init__(self, chain_runner):
+ self.chain_runner = chain_runner
+ self.config = chain_runner.config
+ self.traffic_client = chain_runner.traffic_client
+ self.specs = chain_runner.specs
+ self.notifier = chain_runner.notifier
+ self.interval_collector = None
+ self.factory = chain_runner.factory
+ # create a packet path stats manager for fixed rate runs only
+ if self.config.single_run:
+ pps_list = []
+ self.traffic_client.insert_interface_stats(pps_list)
+ self.pps_mgr = PacketPathStatsManager(self.config, pps_list)
+ else:
+ self.pps_mgr = None
+ self.worker = None
+
+ def create_worker(self):
+ """Create a worker to fetch custom data.
+
+ This is done late as we need to know the dest MAC for all VNFs, which can happen
+ as late as after ARP discovery.
+ """
+ if not self.worker and self.specs.openstack:
+ WORKER_CLASS = self.factory.get_chain_worker(self.specs.openstack.encaps,
+ self.config.service_chain)
+ self.worker = WORKER_CLASS(self)
+
+ def _generate_traffic(self):
+ if self.config.no_traffic:
+ return {}
+
+ self.interval_collector = IntervalCollector(time.time())
+ self.interval_collector.attach_notifier(self.notifier)
+ LOG.info('Starting to generate traffic...')
+ stats = {}
+ for stats in self.traffic_client.run_traffic():
+ self.interval_collector.add(stats)
+
+ LOG.info('...traffic generating ended.')
+ return stats
+
+ def get_stats(self):
+ return self.interval_collector.get() if self.interval_collector else []
+
+ def get_version(self):
+ return self.worker.get_version() if self.worker else {}
+
+ def _update_interface_stats(self, diff=False):
+ """Update interface stats for both the traffic generator and the worker."""
+ self.traffic_client.update_interface_stats(diff)
+ if self.worker:
+ self.worker.update_interface_stats(diff)
+
+ def run_fixed_rate(self):
+ """Run a fixed rate and analyze results."""
+ # Baseline the packet path stats
+ self._update_interface_stats()
+
+ in_flight_stats = self._generate_traffic()
+ result = {
+ 'stats': in_flight_stats
+ }
+ # New analysis code with packet path stats
+ # Diff all interface stats and return packet path stats analysis
+ # Diff the packet path stats
+ self._update_interface_stats(diff=True)
+ result['packet_path_stats'] = self.pps_mgr.get_results()
+ return result
+
+ def get_compute_nodes_bios(self):
+ return self.worker.get_compute_nodes_bios() if self.worker else {}
+
+ def close(self):
+ if self.worker:
+ self.worker.close()
diff --git a/nfvbench/summarizer.py b/nfvbench/summarizer.py
index 0ff9c48..7c69f52 100644
--- a/nfvbench/summarizer.py
+++ b/nfvbench/summarizer.py
@@ -22,11 +22,64 @@ import bitmath
import pytz
from tabulate import tabulate
-from specs import ChainType
-
+def _annotate_chain_stats(chain_stats, nodrop_marker='=>'):
+ """Transform a plain chain stats into an annotated one.
+
+ Example:
+ {
+ 0: {'packets': [2000054, 1999996, 1999996, 1999996],
+ 'lat_min_usec': 10,
+ 'lat_max_usec': 187,
+ 'lat_avg_usec': 45},
+ 1: {...},
+ 'total': {...}
+ }
+ should become:
+ {
+ 0: {'packets': [2000054, -58 (-0.034%), '=>', 1999996],
+ 'lat_min_usec': 10,
+ 'lat_max_usec': 187,
+ 'lat_avg_usec': 45},
+ 1: {...},
+ 'total': {...}
+ }
+
+ In the case of shared net, some columns in packets array can have ''.
+ Some columns cab also be None which means the data is not available.
+ """
+ for stats in list(chain_stats.values()):
+ packets = stats['packets']
+ count = len(packets)
+ if count > 1:
+ # keep the first counter
+ annotated_packets = [packets[0]]
+ # modify all remaining counters
+ prev_count = packets[0]
+ for index in range(1, count):
+ cur_count = packets[index]
+ if cur_count == '':
+ # an empty string indicates an unknown counter for a shared interface
+ # do not annotate those
+ annotated_value = ''
+ elif cur_count is None:
+ # Not available
+ annotated_value = 'n/a'
+ else:
+ drop = cur_count - prev_count
+ if drop:
+ dr = (drop * 100.0) / prev_count if prev_count else 0
+ annotated_value = '{:+,} ({:+.4f}%)'.format(drop, dr)
+ else:
+ # no drop
+ # if last column we display the value
+ annotated_value = cur_count if index == count - 1 else nodrop_marker
+ prev_count = cur_count
+ annotated_packets.append(annotated_value)
+
+ stats['packets'] = annotated_packets
class Formatter(object):
- """Collection of string formatter methods"""
+ """Collection of string formatter methods."""
@staticmethod
def fixed(data):
@@ -44,7 +97,7 @@ class Formatter(object):
def standard(data):
if isinstance(data, int):
return Formatter.int(data)
- elif isinstance(data, float):
+ if isinstance(data, float):
return Formatter.float(4)(data)
return Formatter.fixed(data)
@@ -77,16 +130,16 @@ class Formatter(object):
def percentage(data):
if data is None:
return ''
- elif math.isnan(data):
+ if math.isnan(data):
return '-'
return Formatter.suffix('%')(Formatter.float(4)(data))
class Table(object):
- """ASCII readable table class"""
+ """ASCII readable table class."""
def __init__(self, header):
- header_row, self.formatters = zip(*header)
+ header_row, self.formatters = list(zip(*header))
self.data = [header_row]
self.columns = len(header_row)
@@ -108,7 +161,7 @@ class Table(object):
class Summarizer(object):
- """Generic summarizer class"""
+ """Generic summarizer class."""
indent_per_level = 2
@@ -142,7 +195,7 @@ class Summarizer(object):
def _put_dict(self, data):
with self._create_block(False):
- for key, value in data.iteritems():
+ for key, value in list(data.items()):
if isinstance(value, dict):
self._put(key + ':')
self._put_dict(value)
@@ -164,58 +217,60 @@ class Summarizer(object):
class NFVBenchSummarizer(Summarizer):
- """Summarize nfvbench json result"""
-
- ndr_pdr_header = [
- ('-', Formatter.fixed),
- ('L2 Frame Size', Formatter.standard),
- ('Rate (fwd+rev)', Formatter.bits),
- ('Rate (fwd+rev)', Formatter.suffix(' pps')),
- ('Avg Drop Rate', Formatter.suffix('%')),
- ('Avg Latency (usec)', Formatter.standard),
- ('Min Latency (usec)', Formatter.standard),
- ('Max Latency (usec)', Formatter.standard)
- ]
-
- single_run_header = [
- ('L2 Frame Size', Formatter.standard),
- ('Drop Rate', Formatter.suffix('%')),
- ('Avg Latency (usec)', Formatter.standard),
- ('Min Latency (usec)', Formatter.standard),
- ('Max Latency (usec)', Formatter.standard)
- ]
-
- config_header = [
- ('Direction', Formatter.standard),
- ('Requested TX Rate (bps)', Formatter.bits),
- ('Actual TX Rate (bps)', Formatter.bits),
- ('RX Rate (bps)', Formatter.bits),
- ('Requested TX Rate (pps)', Formatter.suffix(' pps')),
- ('Actual TX Rate (pps)', Formatter.suffix(' pps')),
- ('RX Rate (pps)', Formatter.suffix(' pps'))
- ]
-
- chain_analysis_header = [
- ('Interface', Formatter.standard),
- ('Device', Formatter.standard),
- ('Packets (fwd)', Formatter.standard),
- ('Drops (fwd)', Formatter.standard),
- ('Drop% (fwd)', Formatter.percentage),
- ('Packets (rev)', Formatter.standard),
- ('Drops (rev)', Formatter.standard),
- ('Drop% (rev)', Formatter.percentage)
- ]
+ """Summarize nfvbench json result."""
direction_keys = ['direction-forward', 'direction-reverse', 'direction-total']
direction_names = ['Forward', 'Reverse', 'Total']
def __init__(self, result, sender):
+ """Create a summarizer instance."""
Summarizer.__init__(self)
self.result = result
self.config = self.result['config']
self.record_header = None
self.record_data = None
self.sender = sender
+
+ self.ndr_pdr_header = [
+ ('-', Formatter.fixed),
+ ('L2 Frame Size', Formatter.standard),
+ ('Rate (fwd+rev)', Formatter.bits),
+ ('Rate (fwd+rev)', Formatter.suffix(' pps')),
+ ('Avg Drop Rate', Formatter.suffix('%')),
+ ('Avg Latency (usec)', Formatter.standard),
+ ('Min Latency (usec)', Formatter.standard),
+ ('Max Latency (usec)', Formatter.standard)
+ ]
+
+ self.single_run_header = [
+ ('L2 Frame Size', Formatter.standard),
+ ('Drop Rate', Formatter.suffix('%')),
+ ('Avg Latency (usec)', Formatter.standard),
+ ('Min Latency (usec)', Formatter.standard),
+ ('Max Latency (usec)', Formatter.standard)
+ ]
+
+ self.config_header = [
+ ('Direction', Formatter.standard),
+ ('Requested TX Rate (bps)', Formatter.bits),
+ ('Actual TX Rate (bps)', Formatter.bits),
+ ('RX Rate (bps)', Formatter.bits),
+ ('Requested TX Rate (pps)', Formatter.suffix(' pps')),
+ ('Actual TX Rate (pps)', Formatter.suffix(' pps')),
+ ('RX Rate (pps)', Formatter.suffix(' pps'))
+ ]
+
+ # add percentiles headers if hdrh enabled
+ if not self.config.disable_hdrh:
+ for percentile in self.config.lat_percentiles:
+ # 'append' expects a single parameter => double parentheses
+ self.ndr_pdr_header.append((str(percentile) + ' %ile lat.', Formatter.standard))
+ self.single_run_header.append((str(percentile) + ' %ile lat.', Formatter.standard))
+
+ if self.config.periodic_gratuitous_arp:
+ self.direction_keys.insert(2, 'garp-direction-total')
+ self.direction_names.insert(2, 'Gratuitous ARP')
+
# if sender is available initialize record
if self.sender:
self.__record_init()
@@ -247,17 +302,14 @@ class NFVBenchSummarizer(Summarizer):
self._put('Components:')
with self._create_block():
- self._put('TOR:')
- with self._create_block(False):
- self._put('Type:', self.config['tor']['type'])
self._put('Traffic Generator:')
with self._create_block(False):
- self._put('Profile:', self.config['generator_config']['name'])
- self._put('Tool:', self.config['generator_config']['tool'])
+ self._put('Profile:', self.config['tg-name'])
+ self._put('Tool:', self.config['tg-tool'])
if network_benchmark['versions']:
self._put('Versions:')
with self._create_block():
- for component, version in network_benchmark['versions'].iteritems():
+ for component, version in list(network_benchmark['versions'].items()):
self._put(component + ':', version)
if self.config['ndr_run'] or self.config['pdr_run']:
@@ -268,15 +320,12 @@ class NFVBenchSummarizer(Summarizer):
if self.config['pdr_run']:
self._put('PDR:', self.config['measurement']['PDR'])
self._put('Service chain:')
- for result in network_benchmark['service_chain'].iteritems():
+ for result in list(network_benchmark['service_chain'].items()):
with self._create_block():
self.__chain_summarize(*result)
def __chain_summarize(self, chain_name, chain_benchmark):
self._put(chain_name + ':')
- if chain_name == ChainType.PVVP:
- self._put('Mode:', chain_benchmark.get('mode'))
- chain_name += "-" + chain_benchmark.get('mode')
self.__record_header_put('service_chain', chain_name)
with self._create_block():
self._put('Traffic:')
@@ -288,13 +337,13 @@ class NFVBenchSummarizer(Summarizer):
self._put('Bidirectional:', traffic_benchmark['bidirectional'])
self._put('Flow count:', traffic_benchmark['flow_count'])
self._put('Service chains count:', traffic_benchmark['service_chain_count'])
- self._put('Compute nodes:', traffic_benchmark['compute_nodes'].keys())
+ self._put('Compute nodes:', list(traffic_benchmark['compute_nodes'].keys()))
self.__record_header_put('profile', traffic_benchmark['profile'])
self.__record_header_put('bidirectional', traffic_benchmark['bidirectional'])
self.__record_header_put('flow_count', traffic_benchmark['flow_count'])
self.__record_header_put('sc_count', traffic_benchmark['service_chain_count'])
- self.__record_header_put('compute_nodes', traffic_benchmark['compute_nodes'].keys())
+ self.__record_header_put('compute_nodes', list(traffic_benchmark['compute_nodes'].keys()))
with self._create_block(False):
self._put()
if not self.config['no_traffic']:
@@ -308,20 +357,15 @@ class NFVBenchSummarizer(Summarizer):
except KeyError:
pass
- for entry in traffic_benchmark['result'].iteritems():
+ for entry in list(traffic_benchmark['result'].items()):
if 'warning' in entry:
continue
self.__chain_analysis_summarize(*entry)
- self.__record_send()
+ self.__record_send()
def __chain_analysis_summarize(self, frame_size, analysis):
self._put()
self._put('L2 frame size:', frame_size)
- if 'analysis_duration_sec' in analysis:
- self._put('Chain analysis duration:',
- Formatter.float(3)(analysis['analysis_duration_sec']), 'seconds')
- self.__record_data_put(frame_size, {'chain_analysis_duration': Formatter.float(3)(
- analysis['analysis_duration_sec'])})
if self.config['ndr_run']:
self._put('NDR search duration:', Formatter.float(0)(analysis['ndr']['time_taken_sec']),
'seconds')
@@ -344,12 +388,13 @@ class NFVBenchSummarizer(Summarizer):
self._put(analysis['run_config']['warning'])
self._put()
- if 'packet_analysis' in analysis:
- self._put('Chain Analysis:')
- self._put()
- with self._create_block(False):
- self._put_table(self.__get_chain_analysis_table(analysis['packet_analysis']))
+ if 'packet_path_stats' in analysis:
+ for dir in ['Forward', 'Reverse']:
+ self._put(dir + ' Chain Packet Counters and Latency:')
self._put()
+ with self._create_block(False):
+ self._put_table(self._get_chain_table(analysis['packet_path_stats'][dir]))
+ self._put()
def __get_summary_table(self, traffic_result):
if self.config['single_run']:
@@ -358,10 +403,11 @@ class NFVBenchSummarizer(Summarizer):
summary_table = Table(self.ndr_pdr_header)
if self.config['ndr_run']:
- for frame_size, analysis in traffic_result.iteritems():
+ for frame_size, analysis in list(traffic_result.items()):
if frame_size == 'warning':
continue
- summary_table.add_row([
+
+ row_data = [
'NDR',
frame_size,
analysis['ndr']['rate_bps'],
@@ -370,21 +416,34 @@ class NFVBenchSummarizer(Summarizer):
analysis['ndr']['stats']['overall']['avg_delay_usec'],
analysis['ndr']['stats']['overall']['min_delay_usec'],
analysis['ndr']['stats']['overall']['max_delay_usec']
- ])
- self.__record_data_put(frame_size, {'ndr': {
+ ]
+ if not self.config.disable_hdrh:
+ self.extract_hdrh_percentiles(
+ analysis['ndr']['stats']['overall']['lat_percentile'], row_data)
+ summary_table.add_row(row_data)
+
+ ndr_data = {
'type': 'NDR',
'rate_bps': analysis['ndr']['rate_bps'],
'rate_pps': analysis['ndr']['rate_pps'],
+ 'offered_tx_rate_bps': analysis['ndr']['stats']['offered_tx_rate_bps'],
+ 'theoretical_tx_rate_pps': analysis['ndr']['stats']['theoretical_tx_rate_pps'],
+ 'theoretical_tx_rate_bps': analysis['ndr']['stats']['theoretical_tx_rate_bps'],
'drop_percentage': analysis['ndr']['stats']['overall']['drop_percentage'],
'avg_delay_usec': analysis['ndr']['stats']['overall']['avg_delay_usec'],
'min_delay_usec': analysis['ndr']['stats']['overall']['min_delay_usec'],
'max_delay_usec': analysis['ndr']['stats']['overall']['max_delay_usec']
- }})
+ }
+ if not self.config.disable_hdrh:
+ self.extract_hdrh_percentiles(
+ analysis['ndr']['stats']['overall']['lat_percentile'], ndr_data, True)
+ self.__record_data_put(frame_size, {'ndr': ndr_data})
if self.config['pdr_run']:
- for frame_size, analysis in traffic_result.iteritems():
+ for frame_size, analysis in list(traffic_result.items()):
if frame_size == 'warning':
continue
- summary_table.add_row([
+
+ row_data = [
'PDR',
frame_size,
analysis['pdr']['rate_bps'],
@@ -393,34 +452,73 @@ class NFVBenchSummarizer(Summarizer):
analysis['pdr']['stats']['overall']['avg_delay_usec'],
analysis['pdr']['stats']['overall']['min_delay_usec'],
analysis['pdr']['stats']['overall']['max_delay_usec']
- ])
- self.__record_data_put(frame_size, {'pdr': {
+ ]
+ if not self.config.disable_hdrh:
+ self.extract_hdrh_percentiles(
+ analysis['pdr']['stats']['overall']['lat_percentile'], row_data)
+ summary_table.add_row(row_data)
+
+ pdr_data = {
'type': 'PDR',
'rate_bps': analysis['pdr']['rate_bps'],
'rate_pps': analysis['pdr']['rate_pps'],
+ 'offered_tx_rate_bps': analysis['pdr']['stats']['offered_tx_rate_bps'],
+ 'theoretical_tx_rate_pps': analysis['pdr']['stats']['theoretical_tx_rate_pps'],
+ 'theoretical_tx_rate_bps': analysis['pdr']['stats']['theoretical_tx_rate_bps'],
'drop_percentage': analysis['pdr']['stats']['overall']['drop_percentage'],
'avg_delay_usec': analysis['pdr']['stats']['overall']['avg_delay_usec'],
'min_delay_usec': analysis['pdr']['stats']['overall']['min_delay_usec'],
'max_delay_usec': analysis['pdr']['stats']['overall']['max_delay_usec']
- }})
+ }
+ if not self.config.disable_hdrh:
+ self.extract_hdrh_percentiles(
+ analysis['pdr']['stats']['overall']['lat_percentile'], pdr_data, True)
+ self.__record_data_put(frame_size, {'pdr': pdr_data})
if self.config['single_run']:
- for frame_size, analysis in traffic_result.iteritems():
- summary_table.add_row([
+ for frame_size, analysis in list(traffic_result.items()):
+ row_data = [
frame_size,
analysis['stats']['overall']['drop_rate_percent'],
analysis['stats']['overall']['rx']['avg_delay_usec'],
analysis['stats']['overall']['rx']['min_delay_usec'],
analysis['stats']['overall']['rx']['max_delay_usec']
- ])
- self.__record_data_put(frame_size, {'single_run': {
+ ]
+ if not self.config.disable_hdrh:
+ self.extract_hdrh_percentiles(
+ analysis['stats']['overall']['rx']['lat_percentile'], row_data)
+ summary_table.add_row(row_data)
+
+ single_run_data = {
'type': 'single_run',
+ 'offered_tx_rate_bps': analysis['stats']['offered_tx_rate_bps'],
+ 'theoretical_tx_rate_pps': analysis['stats']['theoretical_tx_rate_pps'],
+ 'theoretical_tx_rate_bps': analysis['stats']['theoretical_tx_rate_bps'],
'drop_rate_percent': analysis['stats']['overall']['drop_rate_percent'],
'avg_delay_usec': analysis['stats']['overall']['rx']['avg_delay_usec'],
'min_delay_usec': analysis['stats']['overall']['rx']['min_delay_usec'],
'max_delay_usec': analysis['stats']['overall']['rx']['max_delay_usec']
- }})
+ }
+ if not self.config.disable_hdrh:
+ self.extract_hdrh_percentiles(
+ analysis['stats']['overall']['rx']['lat_percentile'], single_run_data, True)
+ self.__record_data_put(frame_size, {'single_run': single_run_data})
return summary_table
+ def extract_hdrh_percentiles(self, lat_percentile, data, add_key=False):
+ if add_key:
+ data['lat_percentile'] = {}
+ for percentile in self.config.lat_percentiles:
+ if add_key:
+ try:
+ data['lat_percentile_' + str(percentile)] = lat_percentile[percentile]
+ except TypeError:
+ data['lat_percentile_' + str(percentile)] = "n/a"
+ else:
+ try:
+ data.append(lat_percentile[percentile])
+ except TypeError:
+ data.append("n/a")
+
def __get_config_table(self, run_config, frame_size):
config_table = Table(self.config_header)
for key, name in zip(self.direction_keys, self.direction_names):
@@ -446,23 +544,64 @@ class NFVBenchSummarizer(Summarizer):
})
return config_table
- def __get_chain_analysis_table(self, packet_analysis):
- chain_analysis_table = Table(self.chain_analysis_header)
- forward_analysis = packet_analysis['direction-forward']
- reverse_analysis = packet_analysis['direction-reverse']
- reverse_analysis.reverse()
- for fwd, rev in zip(forward_analysis, reverse_analysis):
- chain_analysis_table.add_row([
- fwd['interface'],
- fwd['device'],
- fwd['packet_count'],
- fwd.get('packet_drop_count', None),
- fwd.get('packet_drop_percentage', None),
- rev['packet_count'],
- rev.get('packet_drop_count', None),
- rev.get('packet_drop_percentage', None),
- ])
- return chain_analysis_table
+ def _get_chain_table(self, chain_stats):
+ """Retrieve the table for a direction.
+
+ chain_stats: {
+ 'interfaces': ['Port0', 'drop %'', 'vhost0', 'Port1'],
+ 'chains': {
+ '0': {'packets': [2000054, '-0.023%', 1999996, 1999996],
+ 'lat_min_usec': 10,
+ 'lat_max_usec': 187,
+ 'lat_avg_usec': 45},
+ '1': {...},
+ 'total': {...}
+ }
+ }
+ """
+ chains = chain_stats['chains']
+ _annotate_chain_stats(chains)
+ header = [('Chain', Formatter.standard)] + \
+ [(ifname, Formatter.standard) for ifname in chain_stats['interfaces']]
+ # add latency columns if available Avg, Min, Max and percentiles
+ lat_keys = []
+ lat_map = {'lat_avg_usec': 'Avg lat.',
+ 'lat_min_usec': 'Min lat.',
+ 'lat_max_usec': 'Max lat.'}
+ if 'lat_avg_usec' in chains['0']:
+ lat_keys = ['lat_avg_usec', 'lat_min_usec', 'lat_max_usec']
+
+ if not self.config.disable_hdrh:
+ lat_keys.append('lat_percentile')
+ for percentile in self.config.lat_percentiles:
+ lat_map['lat_' + str(percentile) + '_percentile'] = \
+ str(percentile) + ' %ile lat.'
+
+ for lat_value in lat_map.values():
+ # 'append' expects a single parameter => double parentheses
+ header.append((lat_value, Formatter.standard))
+
+ table = Table(header)
+ for chain in sorted(list(chains.keys()), key=str):
+ row = [chain] + chains[chain]['packets']
+ for lat_key in lat_keys:
+
+ if lat_key != 'lat_percentile':
+ if chains[chain].get(lat_key, None):
+ row.append(Formatter.standard(chains[chain][lat_key]))
+ else:
+ row.append('n/a')
+ else:
+ if not self.config.disable_hdrh:
+ if chains[chain].get(lat_key, None):
+ for percentile in chains[chain][lat_key]:
+ row.append(Formatter.standard(
+ chains[chain][lat_key][percentile]))
+ else:
+ for _ in self.config.lat_percentiles:
+ row.append('n/a')
+ table.add_row(row)
+ return table
def __record_header_put(self, key, value):
if self.sender:
@@ -494,9 +633,9 @@ class NFVBenchSummarizer(Summarizer):
run_specific_data['pdr'] = data['pdr']
run_specific_data['pdr']['drop_limit'] = self.config['measurement']['PDR']
del data['pdr']
- for key in run_specific_data:
+ for data_value in run_specific_data.values():
data_to_send = data.copy()
- data_to_send.update(run_specific_data[key])
+ data_to_send.update(data_value)
self.sender.record_send(data_to_send)
self.__record_init()
diff --git a/nfvbench/tor_client.py b/nfvbench/tor_client.py
deleted file mode 100644
index c8214c8..0000000
--- a/nfvbench/tor_client.py
+++ /dev/null
@@ -1,52 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 Cisco Systems, Inc. All rights reserved.
-#
-# 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 TORClientException(Exception):
- pass
-
-
-class BasicTORClient(object):
-
- def __init__(self, config):
- pass
-
- def get_int_counters(self):
- return {}
-
- def get_vni_counters(self, vni):
- return {}
-
- def get_vni_interface(self, vni, counters):
- return None
-
- def get_vni_for_vlan(self, vlans):
- return []
-
- def attach_tg_interfaces(self, network_vlans, switch_ports):
- pass
-
- def clear_nve(self):
- pass
-
- def clear_interface(self, vni):
- pass
-
- def close(self):
- pass
-
- def get_version(self):
- return {}
diff --git a/nfvbench/traffic_client.py b/nfvbench/traffic_client.py
index 8959cab..47af265 100644..100755
--- a/nfvbench/traffic_client.py
+++ b/nfvbench/traffic_client.py
@@ -12,62 +12,88 @@
# License for the specific language governing permissions and limitations
# under the License.
-from datetime import datetime
+"""Interface to the traffic generator clients including NDR/PDR binary search."""
import socket
import struct
import time
+import sys
from attrdict import AttrDict
import bitmath
+from hdrh.histogram import HdrHistogram
from netaddr import IPNetwork
# pylint: disable=import-error
-from trex_stl_lib.api import STLError
+from trex.stl.api import Ether
+from trex.stl.api import STLError
+from trex.stl.api import UDP
+# pylint: disable=wrong-import-order
+from scapy.contrib.mpls import MPLS # flake8: noqa
+# pylint: enable=wrong-import-order
# pylint: enable=import-error
-from log import LOG
-from network import Interface
-from specs import ChainType
-from stats_collector import IntervalCollector
-from stats_collector import IterationCollector
-import traffic_gen.traffic_utils as utils
-from utils import cast_integer
-
+from .log import LOG
+from .packet_stats import InterfaceStats
+from .packet_stats import PacketPathStats
+from .stats_collector import IntervalCollector
+from .stats_collector import IterationCollector
+from .traffic_gen import traffic_utils as utils
+from .utils import cast_integer, find_max_size, find_tuples_equal_to_lcm_value, get_divisors, lcm
class TrafficClientException(Exception):
- pass
-
+ """Generic traffic client exception."""
class TrafficRunner(object):
- def __init__(self, client, duration_sec, interval_sec=0):
+ """Serialize various steps required to run traffic."""
+
+ def __init__(self, client, duration_sec, interval_sec=0, service_mode=False):
+ """Create a traffic runner."""
self.client = client
self.start_time = None
self.duration_sec = duration_sec
self.interval_sec = interval_sec
+ self.service_mode = service_mode
def run(self):
+ """Clear stats and instruct the traffic generator to start generating traffic."""
+ if self.is_running():
+ return None
LOG.info('Running traffic generator')
self.client.gen.clear_stats()
+ # Debug use only: the service_mode flag may have been set in
+ # the configuration, in order to enable the 'service' mode
+ # in the trex generator, before starting the traffic (run).
+ # From this point, a T-rex console (launched in readonly mode) would
+ # then be able to capture the transmitted and/or received traffic.
+ self.client.gen.set_service_mode(enabled=self.service_mode)
+ LOG.info('Service mode is %sabled', 'en' if self.service_mode else 'dis')
self.client.gen.start_traffic()
self.start_time = time.time()
return self.poll_stats()
def stop(self):
+ """Stop the current run and instruct the traffic generator to stop traffic."""
if self.is_running():
self.start_time = None
self.client.gen.stop_traffic()
def is_running(self):
+ """Check if a run is still pending."""
return self.start_time is not None
def time_elapsed(self):
+ """Return time elapsed since start of run."""
if self.is_running():
return time.time() - self.start_time
return self.duration_sec
def poll_stats(self):
+ """Poll latest stats from the traffic generator at fixed interval - sleeps if necessary.
+
+ return: latest stats or None if traffic is stopped
+ """
if not self.is_running():
return None
- if self.client.skip_sleep:
+ if self.client.skip_sleep():
self.stop()
return self.client.get_stats()
time_elapsed = self.time_elapsed()
@@ -88,22 +114,32 @@ class TrafficRunner(object):
class IpBlock(object):
+ """Manage a block of IP addresses."""
+
def __init__(self, base_ip, step_ip, count_ip):
+ """Create an IP block."""
self.base_ip_int = Device.ip_to_int(base_ip)
+ if step_ip == 'random':
+ step_ip = '0.0.0.1'
self.step = Device.ip_to_int(step_ip)
self.max_available = count_ip
self.next_free = 0
def get_ip(self, index=0):
- '''Return the IP address at given index
- '''
+ """Return the IP address at given index."""
if index < 0 or index >= self.max_available:
- raise IndexError('Index out of bounds')
+ raise IndexError('Index out of bounds: %d (max=%d)' % (index, self.max_available))
return Device.int_to_ip(self.base_ip_int + index * self.step)
+ def get_ip_from_chain_first_ip(self, first_ip, index=0):
+ """Return the IP address at given index starting from chain first ip."""
+ if index < 0 or index >= self.max_available:
+ raise IndexError('Index out of bounds: %d (max=%d)' % (index, self.max_available))
+ return Device.int_to_ip(first_ip + index * self.step)
+
def reserve_ip_range(self, count):
- '''Reserve a range of count consecutive IP addresses spaced by step
- '''
+ """Reserve a range of count consecutive IP addresses spaced by step.
+ """
if self.next_free + count > self.max_available:
raise IndexError('No more IP addresses next free=%d max_available=%d requested=%d' %
(self.next_free,
@@ -115,299 +151,652 @@ class IpBlock(object):
return (first_ip, last_ip)
def reset_reservation(self):
+ """Reset all reservations and restart with a completely unused IP block."""
self.next_free = 0
+class UdpPorts(object):
+
+ def __init__(self, src_min, src_max, dst_min, dst_max, udp_src_size, udp_dst_size, step):
+
+ self.src_min = int(src_min)
+ self.src_max = int(src_max)
+ self.dst_min = int(dst_min)
+ self.dst_max = int(dst_max)
+ self.udp_src_size = udp_src_size
+ self.udp_dst_size = udp_dst_size
+ self.step = step
+
+ def get_src_max(self, index=0):
+ """Return the UDP src port at given index."""
+ return int(self.src_min) + index * int(self.step)
+
+ def get_dst_max(self, index=0):
+ """Return the UDP dst port at given index."""
+ return int(self.dst_min) + index * int(self.step)
+
+
class Device(object):
- def __init__(self, port, pci, switch_port=None, vtep_vlan=None, ip=None, tg_gateway_ip=None,
- gateway_ip=None, ip_addrs_step=None, tg_gateway_ip_addrs_step=None,
- gateway_ip_addrs_step=None, udp_src_port=None, udp_dst_port=None,
- chain_count=1, flow_count=1, vlan_tagging=False):
- self.chain_count = chain_count
- self.flow_count = flow_count
- self.dst = None
+ """Represent a port device and all information associated to it.
+
+ In the curent version we only support 2 port devices for the traffic generator
+ identified as port 0 or port 1.
+ """
+
+ def __init__(self, port, generator_config):
+ """Create a new device for a given port."""
+ self.generator_config = generator_config
+ self.chain_count = generator_config.service_chain_count
+ if generator_config.bidirectional:
+ self.flow_count = generator_config.flow_count / 2
+ else:
+ self.flow_count = generator_config.flow_count
+
self.port = port
- self.switch_port = switch_port
- self.vtep_vlan = vtep_vlan
- self.vlan_tag = None
- self.vlan_tagging = vlan_tagging
- self.pci = pci
+ self.switch_port = generator_config.interfaces[port].get('switch_port', None)
+ self.vtep_vlan = None
+ self.vtep_src_mac = None
+ self.vxlan = False
+ self.mpls = False
+ self.inner_labels = None
+ self.outer_labels = None
+ self.pci = generator_config.interfaces[port].pci
self.mac = None
- self.vm_mac_list = None
- subnet = IPNetwork(ip)
- self.ip = subnet.ip.format()
- self.ip_prefixlen = subnet.prefixlen
- self.ip_addrs_step = ip_addrs_step
- self.tg_gateway_ip_addrs_step = tg_gateway_ip_addrs_step
- self.gateway_ip_addrs_step = gateway_ip_addrs_step
- self.gateway_ip = gateway_ip
- self.tg_gateway_ip = tg_gateway_ip
- self.ip_block = IpBlock(self.ip, ip_addrs_step, flow_count)
- self.gw_ip_block = IpBlock(gateway_ip,
- gateway_ip_addrs_step,
- chain_count)
- self.tg_gw_ip_block = IpBlock(tg_gateway_ip,
- tg_gateway_ip_addrs_step,
- chain_count)
- self.udp_src_port = udp_src_port
- self.udp_dst_port = udp_dst_port
+ self.dest_macs = None
+ self.vtep_dst_mac = None
+ self.vtep_dst_ip = None
+ if generator_config.vteps is None:
+ self.vtep_src_ip = None
+ else:
+ self.vtep_src_ip = generator_config.vteps[port]
+ self.vnis = None
+ self.vlans = None
+ self.ip_addrs = generator_config.ip_addrs[port]
+ self.ip_src_static = generator_config.ip_src_static
+ self.ip_addrs_step = generator_config.ip_addrs_step
+ if self.ip_addrs_step == 'random':
+ # Set step to 1 to calculate the IP range size (see check_range_size below)
+ step = '0.0.0.1'
+ else:
+ step = self.ip_addrs_step
+ self.ip_size = self.check_range_size(IPNetwork(self.ip_addrs).size, Device.ip_to_int(step))
+ self.ip = str(IPNetwork(self.ip_addrs).network)
+ ip_addrs_left = generator_config.ip_addrs[0]
+ ip_addrs_right = generator_config.ip_addrs[1]
+ self.ip_addrs_size = {
+ 'left': self.check_range_size(IPNetwork(ip_addrs_left).size, Device.ip_to_int(step)),
+ 'right': self.check_range_size(IPNetwork(ip_addrs_right).size, Device.ip_to_int(step))}
+ udp_src_port = generator_config.gen_config.udp_src_port
+ if udp_src_port is None:
+ udp_src_port = 53
+ udp_dst_port = generator_config.gen_config.udp_dst_port
+ if udp_dst_port is None:
+ udp_dst_port = 53
+ src_max, src_min = self.define_udp_range(udp_src_port, 'udp_src_port')
+ dst_max, dst_min = self.define_udp_range(udp_dst_port, 'udp_dst_port')
+ if generator_config.gen_config.udp_port_step == 'random':
+ # Set step to 1 to calculate the UDP range size
+ udp_step = 1
+ else:
+ udp_step = int(generator_config.gen_config.udp_port_step)
+ udp_src_size = self.check_range_size(int(src_max) - int(src_min) + 1, udp_step)
+ udp_dst_size = self.check_range_size(int(dst_max) - int(dst_min) + 1, udp_step)
+ lcm_port = lcm(udp_src_size, udp_dst_size)
+ if self.ip_src_static is True:
+ lcm_ip = lcm(1, min(self.ip_addrs_size['left'], self.ip_addrs_size['right']))
+ else:
+ lcm_ip = lcm(self.ip_addrs_size['left'], self.ip_addrs_size['right'])
+ flow_max = lcm(lcm_port, lcm_ip)
+ if self.flow_count > flow_max:
+ raise TrafficClientException('Trying to set unachievable traffic (%d > %d)' %
+ (self.flow_count, flow_max))
+
+ self.udp_ports = UdpPorts(src_min, src_max, dst_min, dst_max, udp_src_size, udp_dst_size,
+ generator_config.gen_config.udp_port_step)
+
+ self.ip_block = IpBlock(self.ip, step, self.ip_size)
+
+ self.gw_ip_block = IpBlock(generator_config.gateway_ips[port],
+ generator_config.gateway_ip_addrs_step,
+ self.chain_count)
+ self.tg_gateway_ip_addrs = generator_config.tg_gateway_ip_addrs[port]
+ self.tg_gw_ip_block = IpBlock(self.tg_gateway_ip_addrs,
+ generator_config.tg_gateway_ip_addrs_step,
+ self.chain_count)
+
+ def limit_ip_udp_ranges(self, peer_ip_size, cur_chain_flow_count):
+ # init to min value in case of no matching values found with lcm calculation
+ new_src_ip_size = 1
+ new_peer_ip_size = 1
+ new_src_udp_size = 1
+ new_dst_udp_size = 1
+
+ if self.ip_src_static is True:
+ src_ip_size = 1
+ else:
+ src_ip_size = self.ip_size
+ ip_src_divisors = list(get_divisors(src_ip_size))
+ ip_dst_divisors = list(get_divisors(peer_ip_size))
+ udp_src_divisors = list(get_divisors(self.udp_ports.udp_src_size))
+ udp_dst_divisors = list(get_divisors(self.udp_ports.udp_dst_size))
+ fc = int(cur_chain_flow_count)
+ tuples_ip = list(find_tuples_equal_to_lcm_value(ip_src_divisors, ip_dst_divisors, fc))
+ tuples_udp = list(find_tuples_equal_to_lcm_value(udp_src_divisors, udp_dst_divisors, fc))
+
+ if tuples_ip:
+ new_src_ip_size = tuples_ip[-1][0]
+ new_peer_ip_size = tuples_ip[-1][1]
+
+ if tuples_udp:
+ new_src_udp_size = tuples_udp[-1][0]
+ new_dst_udp_size = tuples_udp[-1][1]
+
+ tuples_src = []
+ tuples_dst = []
+ if not tuples_ip and not tuples_udp:
+ # in case of not divisors in common matching LCM value (i.e. requested flow count)
+ # try to find an accurate UDP range to fit requested flow count
+ udp_src_int = range(self.udp_ports.src_min, self.udp_ports.src_max)
+ udp_dst_int = range(self.udp_ports.dst_min, self.udp_ports.dst_max)
+ tuples_src = list(find_tuples_equal_to_lcm_value(ip_src_divisors, udp_src_int, fc))
+ tuples_dst = list(find_tuples_equal_to_lcm_value(ip_dst_divisors, udp_dst_int, fc))
+
+ if not tuples_src and not tuples_dst:
+ # iterate IP and UDP ranges to find a tuple that match flow count values
+ src_ip_range = range(1,src_ip_size)
+ dst_ip_range = range(1, peer_ip_size)
+ tuples_src = list(find_tuples_equal_to_lcm_value(src_ip_range, udp_src_int, fc))
+ tuples_dst = list(find_tuples_equal_to_lcm_value(dst_ip_range, udp_dst_int, fc))
+
+ if tuples_src or tuples_dst:
+ if tuples_src:
+ new_src_ip_size = tuples_src[-1][0]
+ new_src_udp_size = tuples_src[-1][1]
+ if tuples_dst:
+ new_peer_ip_size = tuples_dst[-1][0]
+ new_dst_udp_size = tuples_dst[-1][1]
+ else:
+ if not tuples_ip:
+ if src_ip_size != 1:
+ if src_ip_size > fc:
+ new_src_ip_size = fc
+ else:
+ new_src_ip_size = find_max_size(src_ip_size, tuples_udp, fc)
+ if peer_ip_size != 1:
+ if peer_ip_size > fc:
+ new_peer_ip_size = fc
+ else:
+ new_peer_ip_size = find_max_size(peer_ip_size, tuples_udp, fc)
+
+ if not tuples_udp:
+ if self.udp_ports.udp_src_size != 1:
+ if self.udp_ports.udp_src_size > fc:
+ new_src_udp_size = fc
+ else:
+ new_src_udp_size = find_max_size(self.udp_ports.udp_src_size,
+ tuples_ip, fc)
+ if self.udp_ports.udp_dst_size != 1:
+ if self.udp_ports.udp_dst_size > fc:
+ new_dst_udp_size = fc
+ else:
+ new_dst_udp_size = find_max_size(self.udp_ports.udp_dst_size,
+ tuples_ip, fc)
+ max_possible_flows = lcm(lcm(new_src_ip_size, new_peer_ip_size),
+ lcm(new_src_udp_size, new_dst_udp_size))
+
+ LOG.debug("IP dst size: %d", new_peer_ip_size)
+ LOG.debug("LCM IP: %d", lcm(new_src_ip_size, new_peer_ip_size))
+ LOG.debug("LCM UDP: %d", lcm(new_src_udp_size, new_dst_udp_size))
+ LOG.debug("Global LCM: %d", max_possible_flows)
+ LOG.debug("IP src size: %d, IP dst size: %d, UDP src size: %d, UDP dst size: %d",
+ new_src_ip_size, new_peer_ip_size, self.udp_ports.udp_src_size,
+ self.udp_ports.udp_dst_size)
+ if not max_possible_flows == cur_chain_flow_count:
+ if (self.ip_addrs_step != '0.0.0.1' or self.udp_ports.step != '1') and not (
+ self.ip_addrs_step == 'random' and self.udp_ports.step == 'random'):
+ LOG.warning("Current values of ip_addrs_step and/or udp_port_step properties "
+ "do not allow to control an accurate flow count. "
+ "Values will be overridden as follows:")
+ if self.ip_addrs_step != '0.0.0.1':
+ LOG.info("ip_addrs_step='0.0.0.1' (previous value: ip_addrs_step='%s')",
+ self.ip_addrs_step)
+ self.ip_addrs_step = '0.0.0.1'
+
+ if self.udp_ports.step != '1':
+ LOG.info("udp_port_step='1' (previous value: udp_port_step='%s')",
+ self.udp_ports.step)
+ self.udp_ports.step = '1'
+ # override config for not logging random step warning message in trex_gen.py
+ self.generator_config.gen_config.udp_port_step = self.udp_ports.step
+ else:
+ LOG.error("Current values of ip_addrs_step and udp_port_step properties "
+ "do not allow to control an accurate flow count.")
+ else:
+ src_ip_size = new_src_ip_size
+ peer_ip_size = new_peer_ip_size
+ self.udp_ports.udp_src_size = new_src_udp_size
+ self.udp_ports.udp_dst_size = new_dst_udp_size
+ return src_ip_size, peer_ip_size
+
+ @staticmethod
+ def define_udp_range(udp_port, property_name):
+ if isinstance(udp_port, int):
+ min = udp_port
+ max = min
+ elif isinstance(udp_port, tuple):
+ min = udp_port[0]
+ max = udp_port[1]
+ else:
+ raise TrafficClientException('Invalid %s property value (53 or [\'53\',\'1024\'])'
+ % property_name)
+ return max, min
+
+
+ @staticmethod
+ def check_range_size(range_size, step):
+ """Check and set the available IPs or UDP ports, considering the step."""
+ try:
+ if range_size % step == 0:
+ value = range_size // step
+ else:
+ value = range_size // step + 1
+ return value
+ except ZeroDivisionError:
+ raise ZeroDivisionError("step can't be zero !") from ZeroDivisionError
def set_mac(self, mac):
+ """Set the local MAC for this port device."""
if mac is None:
raise TrafficClientException('Trying to set traffic generator MAC address as None')
self.mac = mac
- def set_destination(self, dst):
- self.dst = dst
+ def get_peer_device(self):
+ """Get the peer device (device 0 -> device 1, or device 1 -> device 0)."""
+ return self.generator_config.devices[1 - self.port]
- def set_vm_mac_list(self, vm_mac_list):
- self.vm_mac_list = map(str, vm_mac_list)
+ def set_vtep_dst_mac(self, dest_macs):
+ """Set the list of dest MACs indexed by the chain id.
- def set_vlan_tag(self, vlan_tag):
- if self.vlan_tagging and vlan_tag is None:
- raise TrafficClientException('Trying to set VLAN tag as None')
- self.vlan_tag = vlan_tag
+ This is only called in 2 cases:
+ - VM macs discovered using openstack API
+ - dest MACs provisioned in config file
+ """
+ self.vtep_dst_mac = list(map(str, dest_macs))
+
+ def set_dest_macs(self, dest_macs):
+ """Set the list of dest MACs indexed by the chain id.
+
+ This is only called in 2 cases:
+ - VM macs discovered using openstack API
+ - dest MACs provisioned in config file
+ """
+ self.dest_macs = list(map(str, dest_macs))
+
+ def get_dest_macs(self):
+ """Get the list of dest macs for this device.
+
+ If set_dest_macs was never called, assumes l2-loopback and return
+ a list of peer mac (as many as chains but normally only 1 chain)
+ """
+ if self.dest_macs:
+ return self.dest_macs
+ # assume this is l2-loopback
+ return [self.get_peer_device().mac] * self.chain_count
+
+ def set_vlans(self, vlans):
+ """Set the list of vlans to use indexed by the chain id."""
+ self.vlans = vlans
+ LOG.info("Port %d: VLANs %s", self.port, self.vlans)
+
+ def set_vtep_vlan(self, vlan):
+ """Set the vtep vlan to use indexed by specific port."""
+ self.vtep_vlan = vlan
+ self.vxlan = True
+ self.vlan_tagging = None
+ LOG.info("Port %d: VTEP VLANs %s", self.port, self.vtep_vlan)
+
+ def set_vxlan_endpoints(self, src_ip, dst_ip):
+ self.vtep_dst_ip = dst_ip
+ self.vtep_src_ip = src_ip
+ LOG.info("Port %d: src_vtep %s, dst_vtep %s", self.port,
+ self.vtep_src_ip, self.vtep_dst_ip)
+
+ def set_mpls_peers(self, src_ip, dst_ip):
+ self.mpls = True
+ self.vtep_dst_ip = dst_ip
+ self.vtep_src_ip = src_ip
+ LOG.info("Port %d: src_mpls_vtep %s, mpls_peer_ip %s", self.port,
+ self.vtep_src_ip, self.vtep_dst_ip)
+
+ def set_vxlans(self, vnis):
+ self.vnis = vnis
+ LOG.info("Port %d: VNIs %s", self.port, self.vnis)
+
+ def set_mpls_inner_labels(self, labels):
+ self.inner_labels = labels
+ LOG.info("Port %d: MPLS Inner Labels %s", self.port, self.inner_labels)
+
+ def set_mpls_outer_labels(self, labels):
+ self.outer_labels = labels
+ LOG.info("Port %d: MPLS Outer Labels %s", self.port, self.outer_labels)
+
+ def set_gw_ip(self, gateway_ip):
+ self.gw_ip_block = IpBlock(gateway_ip,
+ self.generator_config.gateway_ip_addrs_step,
+ self.chain_count)
def get_gw_ip(self, chain_index):
- '''Retrieve the IP address assigned for the gateway of a given chain
- '''
+ """Retrieve the IP address assigned for the gateway of a given chain."""
return self.gw_ip_block.get_ip(chain_index)
- def get_stream_configs(self, service_chain):
+ def get_stream_configs(self):
+ """Get the stream config for a given chain on this device.
+
+ Called by the traffic generator driver to program the traffic generator properly
+ before generating traffic
+ """
configs = []
# exact flow count for each chain is calculated as follows:
# - all chains except the first will have the same flow count
# calculated as (total_flows + chain_count - 1) / chain_count
# - the first chain will have the remainder
# example 11 flows and 3 chains => 3, 4, 4
- flows_per_chain = (self.flow_count + self.chain_count - 1) / self.chain_count
- cur_chain_flow_count = self.flow_count - flows_per_chain * (self.chain_count - 1)
+ flows_per_chain = int((self.flow_count + self.chain_count - 1) / self.chain_count)
+ cur_chain_flow_count = int(self.flow_count - flows_per_chain * (self.chain_count - 1))
+ peer = self.get_peer_device()
self.ip_block.reset_reservation()
- self.dst.ip_block.reset_reservation()
+ peer.ip_block.reset_reservation()
+ dest_macs = self.get_dest_macs()
+
+ # limit ranges of UDP ports and IP to avoid overflow of the number of flows
+ peer_size = peer.ip_size // self.chain_count
+
+ for chain_idx in range(self.chain_count):
+ src_ip_size, peer_ip_size = self.limit_ip_udp_ranges(peer_size, cur_chain_flow_count)
+
+ src_ip_first, src_ip_last = self.ip_block.reserve_ip_range \
+ (src_ip_size)
+ dst_ip_first, dst_ip_last = peer.ip_block.reserve_ip_range \
+ (peer_ip_size)
+
+ if self.ip_addrs_step != 'random':
+ src_ip_last = self.ip_block.get_ip_from_chain_first_ip(
+ Device.ip_to_int(src_ip_first), src_ip_size - 1)
+ dst_ip_last = peer.ip_block.get_ip_from_chain_first_ip(
+ Device.ip_to_int(dst_ip_first), peer_ip_size - 1)
+ if self.udp_ports.step != 'random':
+ self.udp_ports.src_max = self.udp_ports.get_src_max(self.udp_ports.udp_src_size - 1)
+ self.udp_ports.dst_max = self.udp_ports.get_dst_max(self.udp_ports.udp_dst_size - 1)
+ if self.ip_src_static:
+ src_ip_last = src_ip_first
+
+ LOG.info("Port %d, chain %d: IP src range [%s,%s]", self.port, chain_idx,
+ src_ip_first, src_ip_last)
+ LOG.info("Port %d, chain %d: IP dst range [%s,%s]", self.port, chain_idx,
+ dst_ip_first, dst_ip_last)
+ LOG.info("Port %d, chain %d: UDP src range [%s,%s]", self.port, chain_idx,
+ self.udp_ports.src_min, self.udp_ports.src_max)
+ LOG.info("Port %d, chain %d: UDP dst range [%s,%s]", self.port, chain_idx,
+ self.udp_ports.dst_min, self.udp_ports.dst_max)
- for chain_idx in xrange(self.chain_count):
- src_ip_first, src_ip_last = self.ip_block.reserve_ip_range(cur_chain_flow_count)
- dst_ip_first, dst_ip_last = self.dst.ip_block.reserve_ip_range(cur_chain_flow_count)
configs.append({
'count': cur_chain_flow_count,
'mac_src': self.mac,
- 'mac_dst': self.dst.mac if service_chain == ChainType.EXT else self.vm_mac_list[
- chain_idx],
+ 'mac_dst': dest_macs[chain_idx],
'ip_src_addr': src_ip_first,
'ip_src_addr_max': src_ip_last,
- 'ip_src_count': cur_chain_flow_count,
+ 'ip_src_count': src_ip_size,
'ip_dst_addr': dst_ip_first,
'ip_dst_addr_max': dst_ip_last,
- 'ip_dst_count': cur_chain_flow_count,
+ 'ip_dst_count': peer_ip_size,
'ip_addrs_step': self.ip_addrs_step,
- 'udp_src_port': self.udp_src_port,
- 'udp_dst_port': self.udp_dst_port,
+ 'ip_src_static': self.ip_src_static,
+ 'udp_src_port': self.udp_ports.src_min,
+ 'udp_src_port_max': self.udp_ports.src_max,
+ 'udp_src_count': self.udp_ports.udp_src_size,
+ 'udp_dst_port': self.udp_ports.dst_min,
+ 'udp_dst_port_max': self.udp_ports.dst_max,
+ 'udp_dst_count': self.udp_ports.udp_dst_size,
+ 'udp_port_step': self.udp_ports.step,
'mac_discovery_gw': self.get_gw_ip(chain_idx),
'ip_src_tg_gw': self.tg_gw_ip_block.get_ip(chain_idx),
- 'ip_dst_tg_gw': self.dst.tg_gw_ip_block.get_ip(chain_idx),
- 'vlan_tag': self.vlan_tag if self.vlan_tagging else None
+ 'ip_dst_tg_gw': peer.tg_gw_ip_block.get_ip(chain_idx),
+ 'vlan_tag': self.vlans[chain_idx] if self.vlans else None,
+ 'vxlan': self.vxlan,
+ 'vtep_vlan': self.vtep_vlan if self.vtep_vlan else None,
+ 'vtep_src_mac': self.mac if (self.vxlan or self.mpls) else None,
+ 'vtep_dst_mac': self.vtep_dst_mac if (self.vxlan or self.mpls) else None,
+ 'vtep_dst_ip': self.vtep_dst_ip if self.vxlan is True else None,
+ 'vtep_src_ip': self.vtep_src_ip if self.vxlan is True else None,
+ 'net_vni': self.vnis[chain_idx] if self.vxlan is True else None,
+ 'mpls': self.mpls,
+ 'mpls_outer_label': self.outer_labels[chain_idx] if self.mpls is True else None,
+ 'mpls_inner_label': self.inner_labels[chain_idx] if self.mpls is True else None
+
})
# after first chain, fall back to the flow count for all other chains
cur_chain_flow_count = flows_per_chain
-
return configs
- def ip_range_overlaps(self):
- '''Check if this device ip range is overlapping with the dst device ip range
- '''
- src_base_ip = Device.ip_to_int(self.ip)
- dst_base_ip = Device.ip_to_int(self.dst.ip)
- src_last_ip = src_base_ip + self.flow_count - 1
- dst_last_ip = dst_base_ip + self.flow_count - 1
- return dst_last_ip >= src_base_ip and src_last_ip >= dst_base_ip
-
- @staticmethod
- def mac_to_int(mac):
- return int(mac.translate(None, ":.- "), 16)
-
- @staticmethod
- def int_to_mac(i):
- mac = format(i, 'x').zfill(12)
- blocks = [mac[x:x + 2] for x in xrange(0, len(mac), 2)]
- return ':'.join(blocks)
-
@staticmethod
def ip_to_int(addr):
+ """Convert an IP address from string to numeric."""
return struct.unpack("!I", socket.inet_aton(addr))[0]
@staticmethod
def int_to_ip(nvalue):
- return socket.inet_ntoa(struct.pack("!I", nvalue))
+ """Convert an IP address from numeric to string."""
+ return socket.inet_ntoa(struct.pack("!I", int(nvalue)))
-class RunningTrafficProfile(object):
+class GeneratorConfig(object):
"""Represents traffic configuration for currently running traffic profile."""
DEFAULT_IP_STEP = '0.0.0.1'
DEFAULT_SRC_DST_IP_STEP = '0.0.0.1'
- def __init__(self, config, generator_profile):
- generator_config = self.__match_generator_profile(config.traffic_generator,
- generator_profile)
- self.generator_config = generator_config
+ def __init__(self, config):
+ """Create a generator config."""
+ self.config = config
+ # name of the generator profile (normally trex or dummy)
+ # pick the default one if not specified explicitly from cli options
+ if not config.generator_profile:
+ config.generator_profile = config.traffic_generator.default_profile
+ # pick up the profile dict based on the name
+ gen_config = self.__match_generator_profile(config.traffic_generator,
+ config.generator_profile)
+ self.gen_config = gen_config
+ # copy over fields from the dict
+ self.tool = gen_config.tool
+ self.ip = gen_config.ip
+ # overrides on config.cores and config.mbuf_factor
+ if config.cores:
+ self.cores = config.cores
+ else:
+ self.cores = gen_config.get('cores', 1)
+ # let's report the value actually used in the end
+ config.cores_used = self.cores
+ self.mbuf_factor = config.mbuf_factor
+ self.mbuf_64 = config.mbuf_64
+ self.hdrh = not config.disable_hdrh
+ if config.intf_speed:
+ # interface speed is overriden from the command line
+ self.intf_speed = config.intf_speed
+ elif gen_config.intf_speed:
+ # interface speed is overriden from the generator config
+ self.intf_speed = gen_config.intf_speed
+ else:
+ self.intf_speed = "auto"
+ if self.intf_speed in ("auto", "0"):
+ # interface speed is discovered/provided by the traffic generator
+ self.intf_speed = 0
+ else:
+ self.intf_speed = bitmath.parse_string(self.intf_speed.replace('ps', '')).bits
+ self.name = gen_config.name
+ self.zmq_pub_port = gen_config.get('zmq_pub_port', 4500)
+ self.zmq_rpc_port = gen_config.get('zmq_rpc_port', 4501)
+ self.limit_memory = gen_config.get('limit_memory', 1024)
+ self.software_mode = gen_config.get('software_mode', False)
+ self.interfaces = gen_config.interfaces
+ if self.interfaces[0].port != 0 or self.interfaces[1].port != 1:
+ raise TrafficClientException('Invalid port order/id in generator_profile.interfaces')
self.service_chain = config.service_chain
self.service_chain_count = config.service_chain_count
self.flow_count = config.flow_count
- self.host_name = generator_config.host_name
- self.name = generator_config.name
- self.tool = generator_config.tool
- self.cores = generator_config.get('cores', 1)
- self.ip_addrs_step = generator_config.ip_addrs_step or self.DEFAULT_SRC_DST_IP_STEP
+ self.host_name = gen_config.host_name
+ self.bidirectional = config.traffic.bidirectional
+ self.tg_gateway_ip_addrs = gen_config.tg_gateway_ip_addrs
+ self.ip_addrs = gen_config.ip_addrs
+ self.ip_addrs_step = gen_config.ip_addrs_step or self.DEFAULT_SRC_DST_IP_STEP
self.tg_gateway_ip_addrs_step = \
- generator_config.tg_gateway_ip_addrs_step or self.DEFAULT_IP_STEP
- self.gateway_ip_addrs_step = generator_config.gateway_ip_addrs_step or self.DEFAULT_IP_STEP
- self.gateway_ips = generator_config.gateway_ip_addrs
- self.ip = generator_config.ip
- self.intf_speed = bitmath.parse_string(generator_config.intf_speed.replace('ps', '')).bits
+ gen_config.tg_gateway_ip_addrs_step or self.DEFAULT_IP_STEP
+ self.gateway_ip_addrs_step = gen_config.gateway_ip_addrs_step or self.DEFAULT_IP_STEP
+ self.gateway_ips = gen_config.gateway_ip_addrs
+ self.ip_src_static = gen_config.ip_src_static
+ self.vteps = gen_config.get('vteps')
+ self.devices = [Device(port, self) for port in [0, 1]]
+ # This should normally always be [0, 1]
+ self.ports = [device.port for device in self.devices]
+
+ # check that pci is not empty
+ if not gen_config.interfaces[0].get('pci', None) or \
+ not gen_config.interfaces[1].get('pci', None):
+ raise TrafficClientException("configuration interfaces pci fields cannot be empty")
+
+ self.pcis = [tgif['pci'] for tgif in gen_config.interfaces]
self.vlan_tagging = config.vlan_tagging
- self.no_arp = config.no_arp
- self.src_device = None
- self.dst_device = None
- self.vm_mac_list = None
- self.__prep_interfaces(generator_config)
-
- def to_json(self):
- return dict(self.generator_config)
- def set_vm_mac_list(self, vm_mac_list):
- self.src_device.set_vm_mac_list(vm_mac_list[0])
- self.dst_device.set_vm_mac_list(vm_mac_list[1])
+ # needed for result/summarizer
+ config['tg-name'] = gen_config.name
+ config['tg-tool'] = self.tool
- @staticmethod
- def __match_generator_profile(traffic_generator, generator_profile):
- generator_config = AttrDict(traffic_generator)
- generator_config.pop('default_profile')
- generator_config.pop('generator_profile')
- matching_profile = [profile for profile in traffic_generator.generator_profile if
- profile.name == generator_profile]
- if len(matching_profile) != 1:
- raise Exception('Traffic generator profile not found: ' + generator_profile)
+ def to_json(self):
+ """Get json form to display the content into the overall result dict."""
+ return dict(self.gen_config)
- generator_config.update(matching_profile[0])
-
- return generator_config
-
- def __prep_interfaces(self, generator_config):
- src_config = {
- 'chain_count': self.service_chain_count,
- 'flow_count': self.flow_count / 2,
- 'ip': generator_config.ip_addrs[0],
- 'ip_addrs_step': self.ip_addrs_step,
- 'gateway_ip': self.gateway_ips[0],
- 'gateway_ip_addrs_step': self.gateway_ip_addrs_step,
- 'tg_gateway_ip': generator_config.tg_gateway_ip_addrs[0],
- 'tg_gateway_ip_addrs_step': self.tg_gateway_ip_addrs_step,
- 'udp_src_port': generator_config.udp_src_port,
- 'udp_dst_port': generator_config.udp_dst_port,
- 'vlan_tagging': self.vlan_tagging
- }
- dst_config = {
- 'chain_count': self.service_chain_count,
- 'flow_count': self.flow_count / 2,
- 'ip': generator_config.ip_addrs[1],
- 'ip_addrs_step': self.ip_addrs_step,
- 'gateway_ip': self.gateway_ips[1],
- 'gateway_ip_addrs_step': self.gateway_ip_addrs_step,
- 'tg_gateway_ip': generator_config.tg_gateway_ip_addrs[1],
- 'tg_gateway_ip_addrs_step': self.tg_gateway_ip_addrs_step,
- 'udp_src_port': generator_config.udp_src_port,
- 'udp_dst_port': generator_config.udp_dst_port,
- 'vlan_tagging': self.vlan_tagging
- }
+ def set_dest_macs(self, port_index, dest_macs):
+ """Set the list of dest MACs indexed by the chain id on given port.
- self.src_device = Device(**dict(src_config, **generator_config.interfaces[0]))
- self.dst_device = Device(**dict(dst_config, **generator_config.interfaces[1]))
- self.src_device.set_destination(self.dst_device)
- self.dst_device.set_destination(self.src_device)
+ port_index: the port for which dest macs must be set
+ dest_macs: a list of dest MACs indexed by chain id
+ """
+ if len(dest_macs) < self.config.service_chain_count:
+ raise TrafficClientException('Dest MAC list %s must have %d entries' %
+ (dest_macs, self.config.service_chain_count))
+ # only pass the first scc dest MACs
+ self.devices[port_index].set_dest_macs(dest_macs[:self.config.service_chain_count])
+ LOG.info('Port %d: dst MAC %s', port_index, [str(mac) for mac in dest_macs])
+
+ def set_vtep_dest_macs(self, port_index, dest_macs):
+ """Set the list of dest MACs indexed by the chain id on given port.
+
+ port_index: the port for which dest macs must be set
+ dest_macs: a list of dest MACs indexed by chain id
+ """
+ if len(dest_macs) != self.config.service_chain_count:
+ raise TrafficClientException('Dest MAC list %s must have %d entries' %
+ (dest_macs, self.config.service_chain_count))
+ self.devices[port_index].set_vtep_dst_mac(dest_macs)
+ LOG.info('Port %d: vtep dst MAC %s', port_index, {str(mac) for mac in dest_macs})
- if self.service_chain == ChainType.EXT and not self.no_arp \
- and self.src_device.ip_range_overlaps():
- raise Exception('Overlapping IP address ranges src=%s dst=%d flows=%d' %
- self.src_device.ip,
- self.dst_device.ip,
- self.flow_count)
+ def get_dest_macs(self):
+ """Return the list of dest macs indexed by port."""
+ return [dev.get_dest_macs() for dev in self.devices]
- @property
- def devices(self):
- return [self.src_device, self.dst_device]
+ def set_vlans(self, port_index, vlans):
+ """Set the list of vlans to use indexed by the chain id on given port.
- @property
- def vlans(self):
- return [self.src_device.vtep_vlan, self.dst_device.vtep_vlan]
+ port_index: the port for which VLANs must be set
+ vlans: a list of vlan lists indexed by chain id
+ """
+ if len(vlans) != self.config.service_chain_count:
+ raise TrafficClientException('VLAN list %s must have %d entries' %
+ (vlans, self.config.service_chain_count))
+ self.devices[port_index].set_vlans(vlans)
- @property
- def ports(self):
- return [self.src_device.port, self.dst_device.port]
+ def set_vxlans(self, port_index, vxlans):
+ """Set the list of vxlans (VNIs) to use indexed by the chain id on given port.
- @property
- def switch_ports(self):
- return [self.src_device.switch_port, self.dst_device.switch_port]
+ port_index: the port for which VXLANs must be set
+ VXLANs: a list of VNIs lists indexed by chain id
+ """
+ if len(vxlans) != self.config.service_chain_count:
+ raise TrafficClientException('VXLAN list %s must have %d entries' %
+ (vxlans, self.config.service_chain_count))
+ self.devices[port_index].set_vxlans(vxlans)
- @property
- def pcis(self):
- return [self.src_device.pci, self.dst_device.pci]
+ def set_mpls_inner_labels(self, port_index, labels):
+ """Set the list of MPLS Labels to use indexed by the chain id on given port.
+ port_index: the port for which Labels must be set
+ Labels: a list of Labels lists indexed by chain id
+ """
+ if len(labels) != self.config.service_chain_count:
+ raise TrafficClientException('Inner MPLS list %s must have %d entries' %
+ (labels, self.config.service_chain_count))
+ self.devices[port_index].set_mpls_inner_labels(labels)
-class TrafficGeneratorFactory(object):
- def __init__(self, config):
- self.config = config
+ def set_mpls_outer_labels(self, port_index, labels):
+ """Set the list of MPLS Labels to use indexed by the chain id on given port.
- def get_tool(self):
- return self.config.generator_config.tool
+ port_index: the port for which Labels must be set
+ Labels: a list of Labels lists indexed by chain id
+ """
+ if len(labels) != self.config.service_chain_count:
+ raise TrafficClientException('Outer MPLS list %s must have %d entries' %
+ (labels, self.config.service_chain_count))
+ self.devices[port_index].set_mpls_outer_labels(labels)
+
+ def set_vtep_vlan(self, port_index, vlan):
+ """Set the vtep vlan to use indexed by the chain id on given port.
+ port_index: the port for which VLAN must be set
+ """
+ self.devices[port_index].set_vtep_vlan(vlan)
- def get_generator_client(self):
- tool = self.get_tool().lower()
- if tool == 'trex':
- from traffic_gen import trex
- return trex.TRex(self.config)
- elif tool == 'dummy':
- from traffic_gen import dummy
- return dummy.DummyTG(self.config)
- return None
+ def set_vxlan_endpoints(self, port_index, src_ip, dst_ip):
+ self.devices[port_index].set_vxlan_endpoints(src_ip, dst_ip)
- def list_generator_profile(self):
- return [profile.name for profile in self.config.traffic_generator.generator_profile]
+ def set_mpls_peers(self, port_index, src_ip, dst_ip):
+ self.devices[port_index].set_mpls_peers(src_ip, dst_ip)
- def get_generator_config(self, generator_profile):
- return RunningTrafficProfile(self.config, generator_profile)
+ @staticmethod
+ def __match_generator_profile(traffic_generator, generator_profile):
+ gen_config = AttrDict(traffic_generator)
+ gen_config.pop('default_profile')
+ gen_config.pop('generator_profile')
+ matching_profile = [profile for profile in traffic_generator.generator_profile if
+ profile.name == generator_profile]
+ if len(matching_profile) != 1:
+ raise Exception('Traffic generator profile not found: ' + generator_profile)
- def get_matching_profile(self, traffic_profile_name):
- matching_profile = [profile for profile in self.config.traffic_profile if
- profile.name == traffic_profile_name]
+ gen_config.update(matching_profile[0])
+ return gen_config
- if len(matching_profile) > 1:
- raise Exception('Multiple traffic profiles with the same name found.')
- elif not matching_profile:
- raise Exception('No traffic profile found.')
- return matching_profile[0]
+class TrafficClient(object):
+ """Traffic generator client with NDR/PDR binary seearch."""
- def get_frame_sizes(self, traffic_profile):
- matching_profile = self.get_matching_profile(traffic_profile)
- return matching_profile.l2frame_size
+ PORTS = [0, 1]
+ def __init__(self, config, notifier=None):
+ """Create a new TrafficClient instance.
-class TrafficClient(object):
- PORTS = [0, 1]
+ config: nfvbench config
+ notifier: notifier (optional)
- def __init__(self, config, notifier=None, skip_sleep=False):
- generator_factory = TrafficGeneratorFactory(config)
- self.gen = generator_factory.get_generator_client()
- self.tool = generator_factory.get_tool()
+ A new instance is created everytime the nfvbench config may have changed.
+ """
self.config = config
+ self.generator_config = GeneratorConfig(config)
+ self.tool = self.generator_config.tool
+ self.gen = self._get_generator()
self.notifier = notifier
self.interval_collector = None
self.iteration_collector = None
- self.runner = TrafficRunner(self, self.config.duration_sec, self.config.interval_sec)
- if self.gen is None:
- raise TrafficClientException('%s is not a supported traffic generator' % self.tool)
-
+ self.runner = TrafficRunner(self, self.config.duration_sec, self.config.interval_sec,
+ self.config.service_mode)
+ self.config.frame_sizes = self._get_frame_sizes()
self.run_config = {
'l2frame_size': None,
'duration_sec': self.config.duration_sec,
@@ -417,86 +806,185 @@ class TrafficClient(object):
self.current_total_rate = {'rate_percent': '10'}
if self.config.single_run:
self.current_total_rate = utils.parse_rate_str(self.config.rate)
- # UT with dummy TG can bypass all sleeps
- self.skip_sleep = skip_sleep
+ self.ifstats = None
+ # Speed is either discovered when connecting to TG or set from config
+ # This variable is 0 if not yet discovered from TG or must be the speed of
+ # each interface in bits per second
+ self.intf_speed = self.generator_config.intf_speed
+
+ def _get_generator(self):
+ tool = self.tool.lower()
+ if tool == 'trex':
+ from .traffic_gen import trex_gen
+ return trex_gen.TRex(self)
+ if tool == 'dummy':
+ from .traffic_gen import dummy
+ return dummy.DummyTG(self)
+ raise TrafficClientException('Unsupported generator tool name:' + self.tool)
- def set_macs(self):
- for mac, device in zip(self.gen.get_macs(), self.config.generator_config.devices):
- device.set_mac(mac)
+ def skip_sleep(self):
+ """Skip all sleeps when doing unit testing with dummy TG.
+
+ Must be overriden using mock.patch
+ """
+ return False
+
+ def _get_frame_sizes(self):
+ traffic_profile_name = self.config.traffic.profile
+ matching_profiles = [profile for profile in self.config.traffic_profile if
+ profile.name == traffic_profile_name]
+ if len(matching_profiles) > 1:
+ raise TrafficClientException('Multiple traffic profiles with name: ' +
+ traffic_profile_name)
+ if not matching_profiles:
+ raise TrafficClientException('Cannot find traffic profile: ' + traffic_profile_name)
+ return matching_profiles[0].l2frame_size
def start_traffic_generator(self):
- self.gen.init()
+ """Start the traffic generator process (traffic not started yet)."""
self.gen.connect()
+ # pick up the interface speed if it is not set from config
+ intf_speeds = self.gen.get_port_speed_gbps()
+ # convert Gbps unit into bps
+ tg_if_speed = bitmath.parse_string(str(intf_speeds[0]) + 'Gb').bits
+ if self.intf_speed:
+ # interface speed is overriden from config
+ if self.intf_speed != tg_if_speed:
+ # Warn the user if the speed in the config is different
+ LOG.warning(
+ 'Interface speed provided (%g Gbps) is different from actual speed (%d Gbps)',
+ self.intf_speed / 1000000000.0, intf_speeds[0])
+ else:
+ # interface speed not provisioned by config
+ self.intf_speed = tg_if_speed
+ # also update the speed in the tg config
+ self.generator_config.intf_speed = tg_if_speed
+ # let's report detected and actually used interface speed
+ self.config.intf_speed_detected = tg_if_speed
+ self.config.intf_speed_used = self.intf_speed
+
+ # Save the traffic generator local MAC
+ for mac, device in zip(self.gen.get_macs(), self.generator_config.devices):
+ device.set_mac(mac)
def setup(self):
- self.gen.set_mode()
- self.gen.config_interface()
+ """Set up the traffic client."""
self.gen.clear_stats()
def get_version(self):
+ """Get the traffic generator version."""
return self.gen.get_version()
def ensure_end_to_end(self):
- """
- Ensure traffic generator receives packets it has transmitted.
+ """Ensure traffic generator receives packets it has transmitted.
+
This ensures end to end connectivity and also waits until VMs are ready to forward packets.
- At this point all VMs are in active state, but forwarding does not have to work.
- Small amount of traffic is sent to every chain. Then total of sent and received packets
- is compared. If ratio between received and transmitted packets is higher than (N-1)/N,
- N being number of chains, traffic flows through every chain and real measurements can be
- performed.
+ VMs that are started and in active state may not pass traffic yet. It is imperative to make
+ sure that all VMs are passing traffic in both directions before starting any benchmarking.
+ To verify this, we need to send at a low frequency bi-directional packets and make sure
+ that we receive all packets back from all VMs. The number of flows is equal to 2 times
+ the number of chains (1 per direction) and we need to make sure we receive packets coming
+ from exactly 2 x chain count different source MAC addresses.
Example:
PVP chain (1 VM per chain)
N = 10 (number of chains)
- threshold = (N-1)/N = 9/10 = 0.9 (acceptable ratio ensuring working conditions)
- if total_received/total_sent > 0.9, traffic is flowing to more than 9 VMs meaning
- all 10 VMs are in operational state.
+ Flow count = 20 (number of flows)
+ If the number of unique source MAC addresses from received packets is 20 then
+ all 10 VMs 10 VMs are in operational state.
"""
LOG.info('Starting traffic generator to ensure end-to-end connectivity')
- rate_pps = {'rate_pps': str(self.config.service_chain_count * 100)}
- self.gen.create_traffic('64', [rate_pps, rate_pps], bidirectional=True, latency=False)
-
+ # send 2pps on each chain and each direction
+ rate_pps = {'rate_pps': str(self.config.service_chain_count * 2)}
+ self.gen.create_traffic('64', [rate_pps, rate_pps], bidirectional=True, latency=False,
+ e2e=True)
# ensures enough traffic is coming back
- threshold = (self.config.service_chain_count - 1) / float(self.config.service_chain_count)
- retry_count = (self.config.check_traffic_time_sec +
- self.config.generic_poll_sec - 1) / self.config.generic_poll_sec
- for it in xrange(retry_count):
+ retry_count = int((self.config.check_traffic_time_sec +
+ self.config.generic_poll_sec - 1) / self.config.generic_poll_sec)
+
+ # we expect to see packets coming from 2 unique MAC per chain
+ # because there can be flooding in the case of shared net
+ # we must verify that packets from the right VMs are received
+ # and not just count unique src MAC
+ # create a dict of (port, chain) tuples indexed by dest mac
+ mac_map = {}
+ for port, dest_macs in enumerate(self.generator_config.get_dest_macs()):
+ for chain, mac in enumerate(dest_macs):
+ mac_map[mac] = (port, chain)
+ unique_src_mac_count = len(mac_map)
+ if self.config.vxlan and self.config.traffic_generator.vtep_vlan:
+ get_mac_id = lambda packet: packet['binary'][60:66]
+ elif self.config.vxlan:
+ get_mac_id = lambda packet: packet['binary'][56:62]
+ elif self.config.mpls:
+ get_mac_id = lambda packet: packet['binary'][24:30]
+ # mpls_transport_label = lambda packet: packet['binary'][14:18]
+ else:
+ get_mac_id = lambda packet: packet['binary'][6:12]
+ for it in range(retry_count):
self.gen.clear_stats()
self.gen.start_traffic()
- LOG.info('Waiting for packets to be received back... (%d / %d)', it + 1, retry_count)
- if not self.skip_sleep:
+ self.gen.start_capture()
+ LOG.info('Captured unique src mac %d/%d, capturing return packets (retry %d/%d)...',
+ unique_src_mac_count - len(mac_map), unique_src_mac_count,
+ it + 1, retry_count)
+ if not self.skip_sleep():
time.sleep(self.config.generic_poll_sec)
self.gen.stop_traffic()
- stats = self.gen.get_stats()
-
- # compute total sent and received traffic on both ports
- total_rx = 0
- total_tx = 0
- for port in self.PORTS:
- total_rx += float(stats[port]['rx'].get('total_pkts', 0))
- total_tx += float(stats[port]['tx'].get('total_pkts', 0))
-
- # how much of traffic came back
- ratio = total_rx / total_tx if total_tx else 0
-
- if ratio > threshold:
- self.gen.clear_stats()
- self.gen.clear_streamblock()
- LOG.info('End-to-end connectivity ensured')
- return
+ self.gen.fetch_capture_packets()
+ self.gen.stop_capture()
+ for packet in self.gen.packet_list:
+ mac_id = get_mac_id(packet).decode('latin-1')
+ src_mac = ':'.join(["%02x" % ord(x) for x in mac_id])
+ if self.config.mpls:
+ if src_mac in mac_map and self.is_mpls(packet):
+ port, chain = mac_map[src_mac]
+ LOG.info('Received mpls packet from mac: %s (chain=%d, port=%d)',
+ src_mac, chain, port)
+ mac_map.pop(src_mac, None)
+ else:
+ if src_mac in mac_map and self.is_udp(packet):
+ port, chain = mac_map[src_mac]
+ LOG.info('Received udp packet from mac: %s (chain=%d, port=%d)',
+ src_mac, chain, port)
+ mac_map.pop(src_mac, None)
+
+ if not mac_map:
+ LOG.info('End-to-end connectivity established')
+ return
+ if self.config.l3_router and not self.config.no_arp:
+ # In case of L3 traffic mode, routers are not able to route traffic
+ # until VM interfaces are up and ARP requests are done
+ LOG.info('Waiting for loopback service completely started...')
+ LOG.info('Sending ARP request to assure end-to-end connectivity established')
+ self.ensure_arp_successful()
+ raise TrafficClientException('End-to-end connectivity cannot be ensured')
- if not self.skip_sleep:
- time.sleep(self.config.generic_poll_sec)
+ def is_udp(self, packet):
+ pkt = Ether(packet['binary'])
+ return UDP in pkt
- raise TrafficClientException('End-to-end connectivity cannot be ensured')
+ def is_mpls(self, packet):
+ pkt = Ether(packet['binary'])
+ return MPLS in pkt
def ensure_arp_successful(self):
- if not self.gen.resolve_arp():
+ """Resolve all IP using ARP and throw an exception in case of failure."""
+ dest_macs = self.gen.resolve_arp()
+ if dest_macs:
+ # all dest macs are discovered, saved them into the generator config
+ if self.config.vxlan or self.config.mpls:
+ self.generator_config.set_vtep_dest_macs(0, dest_macs[0])
+ self.generator_config.set_vtep_dest_macs(1, dest_macs[1])
+ else:
+ self.generator_config.set_dest_macs(0, dest_macs[0])
+ self.generator_config.set_dest_macs(1, dest_macs[1])
+ else:
raise TrafficClientException('ARP cannot be resolved')
def set_traffic(self, frame_size, bidirectional):
+ """Reconfigure the traffic generator for a new frame size."""
self.run_config['bidirectional'] = bidirectional
self.run_config['l2frame_size'] = frame_size
self.run_config['rates'] = [self.get_per_direction_rate()]
@@ -506,11 +994,21 @@ class TrafficClient(object):
unidir_reverse_pps = int(self.config.unidir_reverse_traffic_pps)
if unidir_reverse_pps > 0:
self.run_config['rates'].append({'rate_pps': str(unidir_reverse_pps)})
+ # Fix for [NFVBENCH-67], convert the rate string to PPS
+ for idx, rate in enumerate(self.run_config['rates']):
+ if 'rate_pps' not in rate:
+ self.run_config['rates'][idx] = {'rate_pps': self.__convert_rates(rate)['rate_pps']}
self.gen.clear_streamblock()
- self.gen.create_traffic(frame_size, self.run_config['rates'], bidirectional, latency=True)
- def modify_load(self, load):
+ if self.config.no_latency_streams:
+ LOG.info("Latency streams are disabled")
+ # in service mode, we must disable flow stats (e2e=True)
+ self.gen.create_traffic(frame_size, self.run_config['rates'], bidirectional,
+ latency=not self.config.no_latency_streams,
+ e2e=self.runner.service_mode)
+
+ def _modify_load(self, load):
self.current_total_rate = {'rate_percent': str(load)}
rate_per_direction = self.get_per_direction_rate()
@@ -521,6 +1019,7 @@ class TrafficClient(object):
self.run_config['rates'][1] = rate_per_direction
def get_ndr_and_pdr(self):
+ """Start the NDR/PDR iteration and return the results."""
dst = 'Bidirectional' if self.run_config['bidirectional'] else 'Unidirectional'
targets = {}
if self.config.ndr_run:
@@ -563,31 +1062,38 @@ class TrafficClient(object):
return float(dropped_pkts) / total_pkts * 100
def get_stats(self):
- stats = self.gen.get_stats()
- retDict = {'total_tx_rate': stats['total_tx_rate']}
- for port in self.PORTS:
- retDict[port] = {'tx': {}, 'rx': {}}
+ """Collect final stats for previous run."""
+ stats = self.gen.get_stats(self.ifstats)
+ retDict = {'total_tx_rate': stats['total_tx_rate'],
+ 'offered_tx_rate_bps': stats['offered_tx_rate_bps'],
+ 'theoretical_tx_rate_bps': stats['theoretical_tx_rate_bps'],
+ 'theoretical_tx_rate_pps': stats['theoretical_tx_rate_pps']}
+
+ if self.config.periodic_gratuitous_arp:
+ retDict['garp_total_tx_rate'] = stats['garp_total_tx_rate']
tx_keys = ['total_pkts', 'total_pkt_bytes', 'pkt_rate', 'pkt_bit_rate']
rx_keys = tx_keys + ['dropped_pkts']
for port in self.PORTS:
+ port_stats = {'tx': {}, 'rx': {}}
for key in tx_keys:
- retDict[port]['tx'][key] = int(stats[port]['tx'][key])
+ port_stats['tx'][key] = int(stats[port]['tx'][key])
for key in rx_keys:
try:
- retDict[port]['rx'][key] = int(stats[port]['rx'][key])
+ port_stats['rx'][key] = int(stats[port]['rx'][key])
except ValueError:
- retDict[port]['rx'][key] = 0
- retDict[port]['rx']['avg_delay_usec'] = cast_integer(
+ port_stats['rx'][key] = 0
+ port_stats['rx']['avg_delay_usec'] = cast_integer(
stats[port]['rx']['avg_delay_usec'])
- retDict[port]['rx']['min_delay_usec'] = cast_integer(
+ port_stats['rx']['min_delay_usec'] = cast_integer(
stats[port]['rx']['min_delay_usec'])
- retDict[port]['rx']['max_delay_usec'] = cast_integer(
+ port_stats['rx']['max_delay_usec'] = cast_integer(
stats[port]['rx']['max_delay_usec'])
- retDict[port]['drop_rate_percent'] = self.__get_dropped_rate(retDict[port])
+ port_stats['drop_rate_percent'] = self.__get_dropped_rate(port_stats)
+ retDict[str(port)] = port_stats
- ports = sorted(retDict.keys())
+ ports = sorted(list(retDict.keys()), key=str)
if self.run_config['bidirectional']:
retDict['overall'] = {'tx': {}, 'rx': {}}
for key in tx_keys:
@@ -613,12 +1119,28 @@ class TrafficClient(object):
else:
retDict['overall'] = retDict[ports[0]]
retDict['overall']['drop_rate_percent'] = self.__get_dropped_rate(retDict['overall'])
+
+ if 'overall_hdrh' in stats:
+ retDict['overall']['hdrh'] = stats.get('overall_hdrh', None)
+ decoded_histogram = HdrHistogram.decode(retDict['overall']['hdrh'])
+ retDict['overall']['rx']['lat_percentile'] = {}
+ # override min max and avg from hdrh (only if histogram is valid)
+ if decoded_histogram.get_total_count() != 0:
+ retDict['overall']['rx']['min_delay_usec'] = decoded_histogram.get_min_value()
+ retDict['overall']['rx']['max_delay_usec'] = decoded_histogram.get_max_value()
+ retDict['overall']['rx']['avg_delay_usec'] = decoded_histogram.get_mean_value()
+ for percentile in self.config.lat_percentiles:
+ retDict['overall']['rx']['lat_percentile'][percentile] = \
+ decoded_histogram.get_value_at_percentile(percentile)
+ else:
+ for percentile in self.config.lat_percentiles:
+ retDict['overall']['rx']['lat_percentile'][percentile] = 'n/a'
return retDict
def __convert_rates(self, rate):
return utils.convert_rates(self.run_config['l2frame_size'],
rate,
- self.config.generator_config.intf_speed)
+ self.intf_speed)
def __ndr_pdr_found(self, tag, load):
rates = self.__convert_rates({'rate_percent': load})
@@ -628,6 +1150,7 @@ class TrafficClient(object):
def __format_output_stats(self, stats):
for key in self.PORTS + ['overall']:
+ key = str(key)
interface = stats[key]
stats[key] = {
'tx_pkts': interface['tx']['total_pkts'],
@@ -639,16 +1162,32 @@ class TrafficClient(object):
'min_delay_usec': interface['rx']['min_delay_usec'],
}
+ if key == 'overall':
+ if 'hdrh' in interface:
+ stats[key]['hdrh'] = interface.get('hdrh', None)
+ decoded_histogram = HdrHistogram.decode(stats[key]['hdrh'])
+ stats[key]['lat_percentile'] = {}
+ # override min max and avg from hdrh (only if histogram is valid)
+ if decoded_histogram.get_total_count() != 0:
+ stats[key]['min_delay_usec'] = decoded_histogram.get_min_value()
+ stats[key]['max_delay_usec'] = decoded_histogram.get_max_value()
+ stats[key]['avg_delay_usec'] = decoded_histogram.get_mean_value()
+ for percentile in self.config.lat_percentiles:
+ stats[key]['lat_percentile'][percentile] = decoded_histogram.\
+ get_value_at_percentile(percentile)
+ else:
+ for percentile in self.config.lat_percentiles:
+ stats[key]['lat_percentile'][percentile] = 'n/a'
return stats
def __targets_found(self, rate, targets, results):
- for tag, target in targets.iteritems():
+ for tag, target in list(targets.items()):
LOG.info('Found %s (%s) load: %s', tag, target, rate)
self.__ndr_pdr_found(tag, rate)
results[tag]['timestamp_sec'] = time.time()
def __range_search(self, left, right, targets, results):
- '''Perform a binary search for a list of targets inside a [left..right] range or rate
+ """Perform a binary search for a list of targets inside a [left..right] range or rate.
left the left side of the range to search as a % the line rate (100 = 100% line rate)
indicating the rate to send on each interface
@@ -657,7 +1196,7 @@ class TrafficClient(object):
targets a dict of drop rates to search (0.1 = 0.1%), indexed by the DR name or "tag"
('ndr', 'pdr')
results a dict to store results
- '''
+ """
if not targets:
return
LOG.info('Range search [%s .. %s] targets: %s', left, right, targets)
@@ -678,7 +1217,7 @@ class TrafficClient(object):
# Split target dicts based on the avg drop rate
left_targets = {}
right_targets = {}
- for tag, target in targets.iteritems():
+ for tag, target in list(targets.items()):
if stats['overall']['drop_rate_percent'] <= target:
# record the best possible rate found for this target
results[tag] = rates
@@ -718,8 +1257,22 @@ class TrafficClient(object):
self.__range_search(middle, right, right_targets, results)
def __run_search_iteration(self, rate):
- # set load
- self.modify_load(rate)
+ """Run one iteration at the given rate level.
+
+ rate: the rate to send on each port in percent (0 to 100)
+ """
+ self._modify_load(rate)
+
+ # There used to be a inconsistency in case of interface speed override.
+ # The emulated 'intf_speed' value is unknown to the T-Rex generator which
+ # refers to the detected line rate for converting relative traffic loads.
+ # Therefore, we need to convert actual rates here, in terms of packets/s.
+
+ for idx, str_rate in enumerate(self.gen.rates):
+ if str_rate.endswith('%'):
+ float_rate = float(str_rate.replace('%', '').strip())
+ pps_rate = self.__convert_rates({'rate_percent': float_rate})['rate_pps']
+ self.gen.rates[idx] = str(pps_rate) + 'pps'
# poll interval stats and collect them
for stats in self.run_traffic():
@@ -727,11 +1280,13 @@ class TrafficClient(object):
time_elapsed_ratio = self.runner.time_elapsed() / self.run_config['duration_sec']
if time_elapsed_ratio >= 1:
self.cancel_traffic()
+ if not self.skip_sleep():
+ time.sleep(self.config.pause_sec)
self.interval_collector.reset()
# get stats from the run
stats = self.runner.client.get_stats()
- current_traffic_config = self.get_traffic_config()
+ current_traffic_config = self._get_traffic_config()
warning = self.compare_tx_rates(current_traffic_config['direction-total']['rate_pps'],
stats['total_tx_rate'])
if warning is not None:
@@ -740,26 +1295,34 @@ class TrafficClient(object):
# save reliable stats from whole iteration
self.iteration_collector.add(stats, current_traffic_config['direction-total']['rate_pps'])
LOG.info('Average drop rate: %f', stats['overall']['drop_rate_percent'])
-
return stats, current_traffic_config['direction-total']
- @staticmethod
- def log_stats(stats):
- report = {
- 'datetime': str(datetime.now()),
- 'tx_packets': stats['overall']['tx']['total_pkts'],
- 'rx_packets': stats['overall']['rx']['total_pkts'],
- 'drop_packets': stats['overall']['rx']['dropped_pkts'],
- 'drop_rate_percent': stats['overall']['drop_rate_percent']
- }
- LOG.info('TX: %(tx_packets)d; '
- 'RX: %(rx_packets)d; '
- 'Dropped: %(drop_packets)d; '
- 'Drop rate: %(drop_rate_percent).4f%%',
- report)
+ def log_stats(self, stats):
+ """Log estimated stats during run."""
+ # Calculate a rolling drop rate based on differential to
+ # the previous reading
+ cur_tx = stats['overall']['tx']['total_pkts']
+ cur_rx = stats['overall']['rx']['total_pkts']
+ delta_tx = cur_tx - self.prev_tx
+ delta_rx = cur_rx - self.prev_rx
+ drops = delta_tx - delta_rx
+ if delta_tx == 0:
+ LOG.info("\x1b[1mConfiguration issue!\x1b[0m (no transmission)")
+ sys.exit(0)
+ drop_rate_pct = 100 * (delta_tx - delta_rx)/delta_tx
+ self.prev_tx = cur_tx
+ self.prev_rx = cur_rx
+ LOG.info('TX: %15s; RX: %15s; (Est.) Dropped: %12s; Drop rate: %8.4f%%',
+ format(cur_tx, ',d'),
+ format(cur_rx, ',d'),
+ format(drops, ',d'),
+ drop_rate_pct)
def run_traffic(self):
+ """Start traffic and return intermediate stats for each interval."""
stats = self.runner.run()
+ self.prev_tx = 0
+ self.prev_rx = 0
while self.runner.is_running:
self.log_stats(stats)
yield stats
@@ -771,18 +1334,10 @@ class TrafficClient(object):
yield stats
def cancel_traffic(self):
+ """Stop traffic."""
self.runner.stop()
- def get_interface(self, port_index):
- port = self.gen.port_handle[port_index]
- tx, rx = 0, 0
- if not self.config.no_traffic:
- stats = self.get_stats()
- if port in stats:
- tx, rx = int(stats[port]['tx']['total_pkts']), int(stats[port]['rx']['total_pkts'])
- return Interface('traffic-generator', self.tool.lower(), tx, rx)
-
- def get_traffic_config(self):
+ def _get_traffic_config(self):
config = {}
load_total = 0.0
bps_total = 0.0
@@ -808,29 +1363,121 @@ class TrafficClient(object):
return config
def get_run_config(self, results):
- """Returns configuration which was used for the last run."""
+ """Return configuration which was used for the last run."""
r = {}
+ # because we want each direction to have the far end RX rates,
+ # use the far end index (1-idx) to retrieve the RX rates
for idx, key in enumerate(["direction-forward", "direction-reverse"]):
- tx_rate = results["stats"][idx]["tx"]["total_pkts"] / self.config.duration_sec
- rx_rate = results["stats"][idx]["rx"]["total_pkts"] / self.config.duration_sec
+ tx_rate = results["stats"][str(idx)]["tx"]["total_pkts"] / self.config.duration_sec
+ rx_rate = results["stats"][str(1 - idx)]["rx"]["total_pkts"] / self.config.duration_sec
+
+ orig_rate = self.run_config['rates'][idx]
+ if self.config.periodic_gratuitous_arp:
+ orig_rate['rate_pps'] = float(
+ orig_rate['rate_pps']) - self.config.gratuitous_arp_pps
+
r[key] = {
- "orig": self.__convert_rates(self.run_config['rates'][idx]),
+ "orig": self.__convert_rates(orig_rate),
"tx": self.__convert_rates({'rate_pps': tx_rate}),
"rx": self.__convert_rates({'rate_pps': rx_rate})
}
+ if self.config.periodic_gratuitous_arp:
+ r['garp-direction-total'] = {
+ "orig": self.__convert_rates({'rate_pps': self.config.gratuitous_arp_pps * 2}),
+ "tx": self.__convert_rates({'rate_pps': results["stats"]["garp_total_tx_rate"]}),
+ "rx": self.__convert_rates({'rate_pps': 0})
+ }
+
total = {}
for direction in ['orig', 'tx', 'rx']:
total[direction] = {}
for unit in ['rate_percent', 'rate_bps', 'rate_pps']:
-
- total[direction][unit] = sum([float(x[direction][unit]) for x in r.values()])
+ total[direction][unit] = sum([float(x[direction][unit]) for x in list(r.values())])
r['direction-total'] = total
+
return r
+ def insert_interface_stats(self, pps_list):
+ """Insert interface stats to a list of packet path stats.
+
+ pps_list: a list of packet path stats instances indexed by chain index
+
+ This function will insert the packet path stats for the traffic gen ports 0 and 1
+ with itemized per chain tx/rx counters.
+ There will be as many packet path stats as chains.
+ Each packet path stats will have exactly 2 InterfaceStats for port 0 and port 1
+ self.pps_list:
+ [
+ PacketPathStats(InterfaceStats(chain 0, port 0), InterfaceStats(chain 0, port 1)),
+ PacketPathStats(InterfaceStats(chain 1, port 0), InterfaceStats(chain 1, port 1)),
+ ...
+ ]
+ """
+ def get_if_stats(chain_idx):
+ return [InterfaceStats('p' + str(port), self.tool)
+ for port in range(2)]
+ # keep the list of list of interface stats indexed by the chain id
+ self.ifstats = [get_if_stats(chain_idx)
+ for chain_idx in range(self.config.service_chain_count)]
+ # note that we need to make a copy of the ifs list so that any modification in the
+ # list from pps will not change the list saved in self.ifstats
+ self.pps_list = [PacketPathStats(self.config, list(ifs)) for ifs in self.ifstats]
+ # insert the corresponding pps in the passed list
+ pps_list.extend(self.pps_list)
+
+ def update_interface_stats(self, diff=False):
+ """Update all interface stats.
+
+ diff: if False, simply refresh the interface stats values with latest values
+ if True, diff the interface stats with the latest values
+ Make sure that the interface stats inserted in insert_interface_stats() are updated
+ with proper values.
+ self.ifstats:
+ [
+ [InterfaceStats(chain 0, port 0), InterfaceStats(chain 0, port 1)],
+ [InterfaceStats(chain 1, port 0), InterfaceStats(chain 1, port 1)],
+ ...
+ ]
+ """
+ if diff:
+ stats = self.gen.get_stats(self.ifstats)
+ for chain_idx, ifs in enumerate(self.ifstats):
+ # each ifs has exactly 2 InterfaceStats and 2 Latency instances
+ # corresponding to the
+ # port 0 and port 1 for the given chain_idx
+ # Note that we cannot use self.pps_list[chain_idx].if_stats to pick the
+ # interface stats for the pps because it could have been modified to contain
+ # additional interface stats
+ self.gen.get_stream_stats(stats, ifs, self.pps_list[chain_idx].latencies, chain_idx)
+ # special handling for vxlan
+ # in case of vxlan, flow stats are not available so all rx counters will be
+ # zeros when the total rx port counter is non zero.
+ # in that case,
+ for port in range(2):
+ total_rx = 0
+ for ifs in self.ifstats:
+ total_rx += ifs[port].rx
+ if total_rx == 0:
+ # check if the total port rx from Trex is also zero
+ port_rx = stats[port]['rx']['total_pkts']
+ if port_rx:
+ # the total rx for all chains from port level stats is non zero
+ # which means that the per-chain stats are not available
+ if len(self.ifstats) == 1:
+ # only one chain, simply report the port level rx to the chain rx stats
+ self.ifstats[0][port].rx = port_rx
+ else:
+ for ifs in self.ifstats:
+ # mark this data as unavailable
+ ifs[port].rx = None
+ # pitch in the total rx only in the last chain pps
+ self.ifstats[-1][port].rx_total = port_rx
+
@staticmethod
def compare_tx_rates(required, actual):
+ """Compare the actual TX rate to the required TX rate."""
threshold = 0.9
are_different = False
try:
@@ -849,6 +1496,7 @@ class TrafficClient(object):
return None
def get_per_direction_rate(self):
+ """Get the rate for each direction."""
divisor = 2 if self.run_config['bidirectional'] else 1
if 'rate_percent' in self.current_total_rate:
# don't split rate if it's percentage
@@ -857,6 +1505,7 @@ class TrafficClient(object):
return utils.divide_rate(self.current_total_rate, divisor)
def close(self):
+ """Close this instance."""
try:
self.gen.stop_traffic()
except Exception:
diff --git a/nfvbench/traffic_gen/dummy.py b/nfvbench/traffic_gen/dummy.py
index 6f57f4d..95147ab 100644
--- a/nfvbench/traffic_gen/dummy.py
+++ b/nfvbench/traffic_gen/dummy.py
@@ -12,8 +12,9 @@
# License for the specific language governing permissions and limitations
# under the License.
-from traffic_base import AbstractTrafficGenerator
-import traffic_utils as utils
+from nfvbench.log import LOG
+from .traffic_base import AbstractTrafficGenerator
+from . import traffic_utils as utils
class DummyTG(AbstractTrafficGenerator):
@@ -23,28 +24,26 @@ class DummyTG(AbstractTrafficGenerator):
Useful for unit testing without actually generating any traffic.
"""
- def __init__(self, config):
- AbstractTrafficGenerator.__init__(self, config)
+ def __init__(self, traffic_client):
+ AbstractTrafficGenerator.__init__(self, traffic_client)
self.port_handle = []
self.rates = []
self.l2_frame_size = 0
- self.duration_sec = self.config.duration_sec
- self.intf_speed = config.generator_config.intf_speed
+ self.duration_sec = traffic_client.config.duration_sec
+ self.intf_speed = traffic_client.generator_config.intf_speed
self.set_response_curve()
+ self.packet_list = None
def get_version(self):
return "0.1"
- def init(self):
- pass
-
def get_tx_pps_dropped_pps(self, tx_rate):
- '''Get actual tx packets based on requested tx rate
+ """Get actual tx packets based on requested tx rate.
:param tx_rate: requested TX rate with unit ('40%', '1Mbps', '1000pps')
:return: the actual TX pps and the dropped pps corresponding to the requested TX rate
- '''
+ """
dr, tx = self.__get_dr_actual_tx(tx_rate)
actual_tx_bps = utils.load_to_bps(tx, self.intf_speed)
avg_packet_size = utils.get_average_packet_size(self.l2_frame_size)
@@ -56,14 +55,14 @@ class DummyTG(AbstractTrafficGenerator):
return int(tx_packets), int(dropped)
def set_response_curve(self, lr_dr=0, ndr=100, max_actual_tx=100, max_11_tx=100):
- '''Set traffic gen response characteristics
+ """Set traffic gen response characteristics.
Specifies the drop rate curve and the actual TX curve
:param float lr_dr: The actual drop rate at TX line rate (in %, 0..100)
:param float ndr: The true NDR (0 packet drop) in % (0..100) of line rate"
:param float max_actual_tx: highest actual TX when requested TX is 100%
:param float max_11_tx: highest requested TX that results in same actual TX
- '''
+ """
self.target_ndr = ndr
if ndr < 100:
self.dr_slope = float(lr_dr) / (100 - ndr)
@@ -77,10 +76,11 @@ class DummyTG(AbstractTrafficGenerator):
self.tx_slope = 0
def __get_dr_actual_tx(self, requested_tx_rate):
- '''Get drop rate at given requested tx rate
+ """Get drop rate at given requested tx rate.
+
:param float requested_tx_rate: requested tx rate in % (0..100)
:return: the drop rate and actual tx rate at that requested_tx_rate in % (0..100)
- '''
+ """
if requested_tx_rate <= self.max_11_tx:
actual_tx = requested_tx_rate
else:
@@ -92,24 +92,18 @@ class DummyTG(AbstractTrafficGenerator):
return dr, actual_tx
def connect(self):
- ports = list(self.config.generator_config.ports)
+ ports = list(self.traffic_client.generator_config.ports)
self.port_handle = ports
- def is_arp_successful(self):
- return True
-
- def config_interface(self):
- pass
-
- def create_traffic(self, l2frame_size, rates, bidirectional, latency=True):
+ def create_traffic(self, l2frame_size, rates, bidirectional, latency=True, e2e=False):
self.rates = [utils.to_rate_str(rate) for rate in rates]
self.l2_frame_size = l2frame_size
def clear_streamblock(self):
pass
- def get_stats(self):
- '''Get stats from current run.
+ def get_stats(self, ifstats=None):
+ """Get stats from current run.
The binary search mainly looks at 2 results to make the decision:
actual tx packets
@@ -117,7 +111,7 @@ class DummyTG(AbstractTrafficGenerator):
From the Requested TX rate - we get the Actual TX rate and the RX drop rate
From the Run duration and actual TX rate - we get the actual total tx packets
From the Actual tx packets and RX drop rate - we get the RX dropped packets
- '''
+ """
result = {}
total_tx_pps = 0
@@ -153,10 +147,31 @@ class DummyTG(AbstractTrafficGenerator):
total_tx_pps += tx_pps
# actual total tx rate in pps
result['total_tx_rate'] = total_tx_pps
+ # actual offered tx rate in bps
+ avg_packet_size = utils.get_average_packet_size(self.l2_frame_size)
+ total_tx_bps = utils.pps_to_bps(total_tx_pps, avg_packet_size)
+ result['offered_tx_rate_bps'] = total_tx_bps
+
+ result.update(self.get_theoretical_rates(avg_packet_size))
return result
+ def get_stream_stats(self, tg_stats, if_stats, latencies, chain_idx):
+ for port in range(2):
+ if_stats[port].tx = 1000
+ if_stats[port].rx = 1000
+ latencies[port].min_usec = 10
+ latencies[port].max_usec = 100
+ latencies[port].avg_usec = 50
+
def get_macs(self):
- return ['00.00.00.00.00.01', '00.00.00.00.00.02']
+ return ['00:00:00:00:00:01', '00:00:00:00:00:02']
+
+ def get_port_speed_gbps(self):
+ """Return the local port speeds.
+
+ return: a list of speed in Gbps indexed by the port#
+ """
+ return [10, 10]
def clear_stats(self):
pass
@@ -164,14 +179,42 @@ class DummyTG(AbstractTrafficGenerator):
def start_traffic(self):
pass
+ def fetch_capture_packets(self):
+ def _get_packet_capture(mac):
+ # convert text to binary
+ src_mac = bytearray.fromhex(mac.replace(':', '')).decode()
+ return {'binary': bytes('SSSSSS' + src_mac, 'ascii')}
+
+ # for packet capture, generate 2*scc random packets
+ # normally we should generate packets coming from the right dest macs
+ self.packet_list = []
+ for dest_macs in self.traffic_client.generator_config.get_dest_macs():
+ for mac in dest_macs:
+ self.packet_list.append(_get_packet_capture(mac))
+
def stop_traffic(self):
pass
+ def start_capture(self):
+ pass
+
+ def stop_capture(self):
+ pass
+
def cleanup(self):
pass
def set_mode(self):
pass
+ def set_service_mode(self, enabled=True):
+ pass
+
def resolve_arp(self):
- return True
+ """Resolve ARP sucessfully."""
+ def get_macs(port, scc):
+ return ['00:00:00:00:%02x:%02x' % (port, chain) for chain in range(scc)]
+ scc = self.traffic_client.generator_config.service_chain_count
+ res = [get_macs(port, scc) for port in range(2)]
+ LOG.info('Dummy TG ARP: %s', str(res))
+ return res
diff --git a/nfvbench/traffic_gen/traffic_base.py b/nfvbench/traffic_gen/traffic_base.py
index 817ecc8..30aec6e 100644
--- a/nfvbench/traffic_gen/traffic_base.py
+++ b/nfvbench/traffic_gen/traffic_base.py
@@ -13,29 +13,64 @@
# under the License.
import abc
+import sys
from nfvbench.log import LOG
-import traffic_utils
-
+from . import traffic_utils
+from hdrh.histogram import HdrHistogram
+from functools import reduce
+
+
+class Latency(object):
+ """A class to hold latency data."""
+
+ def __init__(self, latency_list=None):
+ """Create a latency instance.
+
+ latency_list: aggregate all latency values from list if not None
+ """
+ self.min_usec = sys.maxsize
+ self.max_usec = 0
+ self.avg_usec = 0
+ self.hdrh = None
+ if latency_list:
+ hdrh_list = []
+ for lat in latency_list:
+ if lat.available():
+ self.min_usec = min(self.min_usec, lat.min_usec)
+ self.max_usec = max(self.max_usec, lat.max_usec)
+ self.avg_usec += lat.avg_usec
+ if lat.hdrh_available():
+ hdrh_list.append(HdrHistogram.decode(lat.hdrh))
+
+ # aggregate histograms if any
+ if hdrh_list:
+ def add_hdrh(x, y):
+ x.add(y)
+ return x
+ decoded_hdrh = reduce(add_hdrh, hdrh_list)
+ self.hdrh = HdrHistogram.encode(decoded_hdrh).decode('utf-8')
+
+ # round to nearest usec
+ self.avg_usec = int(round(float(self.avg_usec) / len(latency_list)))
+
+ def available(self):
+ """Return True if latency information is available."""
+ return self.min_usec != sys.maxsize
+
+ def hdrh_available(self):
+ """Return True if latency histogram information is available."""
+ return self.hdrh is not None
class TrafficGeneratorException(Exception):
- pass
-
+ """Exception for traffic generator."""
class AbstractTrafficGenerator(object):
- # src_mac (6) + dst_mac (6) + mac_type (2) + frame_check (4) = 18
- l2_header_size = 18
-
- imix_l2_sizes = [64, 594, 1518]
- imix_l3_sizes = [size - l2_header_size for size in imix_l2_sizes]
- imix_ratios = [7, 4, 1]
- imix_avg_l2_size = sum(
- [1.0 * imix[0] * imix[1] for imix in zip(imix_l2_sizes, imix_ratios)]) / sum(imix_ratios)
-
- traffic_utils.imix_avg_l2_size = imix_avg_l2_size
- def __init__(self, config):
- self.config = config
+ def __init__(self, traffic_client):
+ self.traffic_client = traffic_client
+ self.generator_config = traffic_client.generator_config
+ self.config = traffic_client.config
@abc.abstractmethod
def get_version(self):
@@ -43,42 +78,28 @@ class AbstractTrafficGenerator(object):
return None
@abc.abstractmethod
- def init(self):
- # Must be implemented by sub classes
- return None
-
- @abc.abstractmethod
def connect(self):
# Must be implemented by sub classes
return None
@abc.abstractmethod
- def config_interface(self):
- # Must be implemented by sub classes
- return None
-
- @abc.abstractmethod
- def create_traffic(self):
+ def create_traffic(self, l2frame_size, rates, bidirectional, latency=True, e2e=False):
# Must be implemented by sub classes
return None
def modify_rate(self, rate, reverse):
+ """Change the rate per port.
+
+ rate: new rate in % (0 to 100)
+ reverse: 0 for port 0, 1 for port 1
+ """
port_index = int(reverse)
port = self.port_handle[port_index]
self.rates[port_index] = traffic_utils.to_rate_str(rate)
- LOG.info('Modified traffic stream for %s, new rate=%s.', port,
- traffic_utils.to_rate_str(rate))
-
- def modify_traffic(self):
- # Must be implemented by sub classes
- return None
+ LOG.info('Modified traffic stream for port %s, new rate=%s.', port, self.rates[port_index])
@abc.abstractmethod
- def get_stats(self):
- # Must be implemented by sub classes
- return None
-
- def clear_traffic(self):
+ def get_stats(self, ifstats):
# Must be implemented by sub classes
return None
@@ -94,5 +115,53 @@ class AbstractTrafficGenerator(object):
@abc.abstractmethod
def cleanup(self):
- # Must be implemented by sub classes
+ """Cleanup the traffic generator."""
return None
+
+ def clear_streamblock(self):
+ """Clear all streams from the traffic generator."""
+
+ @abc.abstractmethod
+ def resolve_arp(self):
+ """Resolve all configured remote IP addresses.
+
+ return: None if ARP failed to resolve for all IP addresses
+ else a dict of list of dest macs indexed by port#
+ the dest macs in the list are indexed by the chain id
+ """
+
+ @abc.abstractmethod
+ def get_macs(self):
+ """Return the local port MAC addresses.
+
+ return: a list of MAC addresses indexed by the port#
+ """
+
+ @abc.abstractmethod
+ def get_port_speed_gbps(self):
+ """Return the local port speeds.
+
+ return: a list of speed in Gbps indexed by the port#
+ """
+
+ def get_theoretical_rates(self, avg_packet_size):
+
+ result = {}
+
+ # actual interface speed? (may be a virtual override)
+ intf_speed = self.config.intf_speed_used
+
+ if hasattr(self.config, 'user_info') and self.config.user_info is not None:
+ if "extra_encapsulation_bytes" in self.config.user_info:
+ frame_size_full_encapsulation = avg_packet_size + self.config.user_info[
+ "extra_encapsulation_bytes"]
+ result['theoretical_tx_rate_pps'] = traffic_utils.bps_to_pps(
+ intf_speed, frame_size_full_encapsulation) * 2
+ result['theoretical_tx_rate_bps'] = traffic_utils.pps_to_bps(
+ result['theoretical_tx_rate_pps'], avg_packet_size)
+ else:
+ result['theoretical_tx_rate_pps'] = traffic_utils.bps_to_pps(intf_speed,
+ avg_packet_size) * 2
+ result['theoretical_tx_rate_bps'] = traffic_utils.pps_to_bps(
+ result['theoretical_tx_rate_pps'], avg_packet_size)
+ return result
diff --git a/nfvbench/traffic_gen/traffic_utils.py b/nfvbench/traffic_gen/traffic_utils.py
index 4a7f855..4366a6c 100644
--- a/nfvbench/traffic_gen/traffic_utils.py
+++ b/nfvbench/traffic_gen/traffic_utils.py
@@ -14,42 +14,66 @@
import bitmath
-from nfvbench.utils import multiplier_map
-imix_avg_l2_size = None
+# IMIX frame size including the 4-byte FCS field
+IMIX_L2_SIZES = [64, 594, 1518]
+IMIX_RATIOS = [7, 4, 1]
+# weighted average l2 frame size includng the 4-byte FCS
+IMIX_AVG_L2_FRAME_SIZE = sum(
+ [1.0 * imix[0] * imix[1] for imix in zip(IMIX_L2_SIZES, IMIX_RATIOS)]) / sum(IMIX_RATIOS)
+multiplier_map = {
+ 'K': 1000,
+ 'M': 1000000,
+ 'G': 1000000000
+}
def convert_rates(l2frame_size, rate, intf_speed):
+ """Convert a given rate unit into the other rate units.
+
+ l2frame_size: size of the L2 frame in bytes (includes 32-bit FCS) or 'IMIX'
+ rate: a dict that has at least one of the following key:
+ 'rate_pps', 'rate_bps', 'rate_percent'
+ with the corresponding input value
+ intf_speed: the line rate speed in bits per second
+ """
avg_packet_size = get_average_packet_size(l2frame_size)
if 'rate_pps' in rate:
+ # input = packets/sec
initial_rate_type = 'rate_pps'
pps = rate['rate_pps']
bps = pps_to_bps(pps, avg_packet_size)
load = bps_to_load(bps, intf_speed)
elif 'rate_bps' in rate:
+ # input = bits per second
initial_rate_type = 'rate_bps'
bps = rate['rate_bps']
load = bps_to_load(bps, intf_speed)
pps = bps_to_pps(bps, avg_packet_size)
elif 'rate_percent' in rate:
+ # input = percentage of the line rate (between 0.0 and 100.0)
initial_rate_type = 'rate_percent'
load = rate['rate_percent']
bps = load_to_bps(load, intf_speed)
pps = bps_to_pps(bps, avg_packet_size)
else:
raise Exception('Traffic config needs to have a rate type key')
-
return {
'initial_rate_type': initial_rate_type,
- 'rate_pps': int(pps),
+ 'rate_pps': int(float(pps)),
'rate_percent': load,
- 'rate_bps': int(bps)
+ 'rate_bps': int(float(bps))
}
def get_average_packet_size(l2frame_size):
+ """Retrieve the average L2 frame size
+
+ l2frame_size: an L2 frame size in bytes (including FCS) or 'IMIX'
+ return: average l2 frame size inlcuding the 32-bit FCS
+ """
if l2frame_size.upper() == 'IMIX':
- return imix_avg_l2_size
+ return IMIX_AVG_L2_FRAME_SIZE
return float(l2frame_size)
@@ -92,23 +116,22 @@ def parse_rate_str(rate_str):
rate_pps = rate_pps[:-1]
except KeyError:
multiplier = 1
- rate_pps = int(rate_pps.strip()) * multiplier
+ rate_pps = int(float(rate_pps.strip()) * multiplier)
if rate_pps <= 0:
raise Exception('%s is out of valid range' % rate_str)
return {'rate_pps': str(rate_pps)}
- elif rate_str.endswith('ps'):
+ if rate_str.endswith('ps'):
rate = rate_str.replace('ps', '').strip()
bit_rate = bitmath.parse_string(rate).bits
if bit_rate <= 0:
raise Exception('%s is out of valid range' % rate_str)
return {'rate_bps': str(int(bit_rate))}
- elif rate_str.endswith('%'):
+ if rate_str.endswith('%'):
rate_percent = float(rate_str.replace('%', '').strip())
if rate_percent <= 0 or rate_percent > 100.0:
raise Exception('%s is out of valid range (must be 1-100%%)' % rate_str)
return {'rate_percent': str(rate_percent)}
- else:
- raise Exception('Unknown rate string format %s' % rate_str)
+ raise Exception('Unknown rate string format %s' % rate_str)
def get_load_from_rate(rate_str, avg_frame_size=64, line_rate='10Gbps'):
'''From any rate string (with unit) return the corresponding load (in % unit)
@@ -151,10 +174,10 @@ def to_rate_str(rate):
if 'rate_pps' in rate:
pps = rate['rate_pps']
return '{}pps'.format(pps)
- elif 'rate_bps' in rate:
+ if 'rate_bps' in rate:
bps = rate['rate_bps']
return '{}bps'.format(bps)
- elif 'rate_percent' in rate:
+ if 'rate_percent' in rate:
load = rate['rate_percent']
return '{}%'.format(load)
assert False
@@ -164,7 +187,7 @@ def to_rate_str(rate):
def nan_replace(d):
"""Replaces every occurence of 'N/A' with float nan."""
- for k, v in d.iteritems():
+ for k, v in d.items():
if isinstance(v, dict):
nan_replace(v)
elif v == 'N/A':
@@ -179,5 +202,5 @@ def mac_to_int(mac):
def int_to_mac(i):
"""Converts integer representation of MAC address to hex string."""
mac = format(i, 'x').zfill(12)
- blocks = [mac[x:x + 2] for x in xrange(0, len(mac), 2)]
+ blocks = [mac[x:x + 2] for x in range(0, len(mac), 2)]
return ':'.join(blocks)
diff --git a/nfvbench/traffic_gen/trex.py b/nfvbench/traffic_gen/trex.py
deleted file mode 100644
index 23faebc..0000000
--- a/nfvbench/traffic_gen/trex.py
+++ /dev/null
@@ -1,460 +0,0 @@
-# Copyright 2016 Cisco Systems, Inc. All rights reserved.
-#
-# 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 os
-import random
-import time
-import traceback
-
-from collections import defaultdict
-from itertools import count
-from nfvbench.log import LOG
-from nfvbench.specs import ChainType
-from nfvbench.traffic_server import TRexTrafficServer
-from nfvbench.utils import cast_integer
-from nfvbench.utils import timeout
-from nfvbench.utils import TimeoutError
-from traffic_base import AbstractTrafficGenerator
-from traffic_base import TrafficGeneratorException
-import traffic_utils as utils
-
-# pylint: disable=import-error
-from trex_stl_lib.api import CTRexVmInsFixHwCs
-from trex_stl_lib.api import Dot1Q
-from trex_stl_lib.api import Ether
-from trex_stl_lib.api import IP
-from trex_stl_lib.api import STLClient
-from trex_stl_lib.api import STLError
-from trex_stl_lib.api import STLFlowLatencyStats
-from trex_stl_lib.api import STLFlowStats
-from trex_stl_lib.api import STLPktBuilder
-from trex_stl_lib.api import STLScVmRaw
-from trex_stl_lib.api import STLStream
-from trex_stl_lib.api import STLTXCont
-from trex_stl_lib.api import STLVmFixChecksumHw
-from trex_stl_lib.api import STLVmFlowVar
-from trex_stl_lib.api import STLVmFlowVarRepetableRandom
-from trex_stl_lib.api import STLVmWrFlowVar
-from trex_stl_lib.api import UDP
-from trex_stl_lib.services.trex_stl_service_arp import STLServiceARP
-# pylint: enable=import-error
-
-
-class TRex(AbstractTrafficGenerator):
- LATENCY_PPS = 1000
-
- def __init__(self, runner):
- AbstractTrafficGenerator.__init__(self, runner)
- self.client = None
- self.id = count()
- self.latencies = defaultdict(list)
- self.stream_ids = defaultdict(list)
- self.port_handle = []
- self.streamblock = defaultdict(list)
- self.rates = []
- self.arps = {}
-
- def get_version(self):
- return self.client.get_server_version()
-
- def extract_stats(self, in_stats):
- utils.nan_replace(in_stats)
- LOG.debug(in_stats)
-
- result = {}
- for ph in self.port_handle:
- stats = self.__combine_stats(in_stats, ph)
- result[ph] = {
- 'tx': {
- 'total_pkts': cast_integer(stats['tx_pkts']['total']),
- 'total_pkt_bytes': cast_integer(stats['tx_bytes']['total']),
- 'pkt_rate': cast_integer(stats['tx_pps']['total']),
- 'pkt_bit_rate': cast_integer(stats['tx_bps']['total'])
- },
- 'rx': {
- 'total_pkts': cast_integer(stats['rx_pkts']['total']),
- 'total_pkt_bytes': cast_integer(stats['rx_bytes']['total']),
- 'pkt_rate': cast_integer(stats['rx_pps']['total']),
- 'pkt_bit_rate': cast_integer(stats['rx_bps']['total']),
- 'dropped_pkts': cast_integer(
- stats['tx_pkts']['total'] - stats['rx_pkts']['total'])
- }
- }
-
- lat = self.__combine_latencies(in_stats, ph)
- result[ph]['rx']['max_delay_usec'] = cast_integer(
- lat['total_max']) if 'total_max' in lat else float('nan')
- result[ph]['rx']['min_delay_usec'] = cast_integer(
- lat['total_min']) if 'total_min' in lat else float('nan')
- result[ph]['rx']['avg_delay_usec'] = cast_integer(
- lat['average']) if 'average' in lat else float('nan')
- total_tx_pkts = result[0]['tx']['total_pkts'] + result[1]['tx']['total_pkts']
- result["total_tx_rate"] = cast_integer(total_tx_pkts / self.config.duration_sec)
- return result
-
- def __combine_stats(self, in_stats, port_handle):
- """Traverses TRex result dictionary and combines stream stats. Used for combining latency
- and regular streams together.
- """
- result = defaultdict(lambda: defaultdict(float))
-
- for pg_id in [self.stream_ids[port_handle]] + self.latencies[port_handle]:
- record = in_stats['flow_stats'][pg_id]
- for stat_type, stat_type_values in record.iteritems():
- for ph, value in stat_type_values.iteritems():
- result[stat_type][ph] += value
-
- return result
-
- def __combine_latencies(self, in_stats, port_handle):
- """Traverses TRex result dictionary and combines chosen latency stats."""
- if not self.latencies[port_handle]:
- return {}
-
- result = defaultdict(float)
- result['total_min'] = float("inf")
- for lat_id in self.latencies[port_handle]:
- lat = in_stats['latency'][lat_id]
- result['dropped_pkts'] += lat['err_cntrs']['dropped']
- result['total_max'] = max(lat['latency']['total_max'], result['total_max'])
- result['total_min'] = min(lat['latency']['total_min'], result['total_min'])
- result['average'] += lat['latency']['average']
-
- result['average'] /= len(self.latencies[port_handle])
-
- return result
-
- def create_pkt(self, stream_cfg, l2frame_size):
- # 46 = 14 (Ethernet II) + 4 (CRC Checksum) + 20 (IPv4) + 8 (UDP)
- payload = 'x' * (max(64, int(l2frame_size)) - 46)
-
- pkt_base = Ether(src=stream_cfg['mac_src'], dst=stream_cfg['mac_dst'])
-
- if stream_cfg['vlan_tag'] is not None:
- pkt_base /= Dot1Q(vlan=stream_cfg['vlan_tag'])
-
- udp_args = {}
- if stream_cfg['udp_src_port']:
- udp_args['sport'] = int(stream_cfg['udp_src_port'])
- if stream_cfg['udp_dst_port']:
- udp_args['dport'] = int(stream_cfg['udp_dst_port'])
- pkt_base /= IP() / UDP(**udp_args)
-
- if stream_cfg['ip_addrs_step'] == 'random':
- src_fv = STLVmFlowVarRepetableRandom(
- name="ip_src",
- min_value=stream_cfg['ip_src_addr'],
- max_value=stream_cfg['ip_src_addr_max'],
- size=4,
- seed=random.randint(0, 32767),
- limit=stream_cfg['ip_src_count'])
- dst_fv = STLVmFlowVarRepetableRandom(
- name="ip_dst",
- min_value=stream_cfg['ip_dst_addr'],
- max_value=stream_cfg['ip_dst_addr_max'],
- size=4,
- seed=random.randint(0, 32767),
- limit=stream_cfg['ip_dst_count'])
- else:
- src_fv = STLVmFlowVar(
- name="ip_src",
- min_value=stream_cfg['ip_src_addr'],
- max_value=stream_cfg['ip_src_addr'],
- size=4,
- op="inc",
- step=stream_cfg['ip_addrs_step'])
- dst_fv = STLVmFlowVar(
- name="ip_dst",
- min_value=stream_cfg['ip_dst_addr'],
- max_value=stream_cfg['ip_dst_addr_max'],
- size=4,
- op="inc",
- step=stream_cfg['ip_addrs_step'])
-
- vm_param = [
- src_fv,
- STLVmWrFlowVar(fv_name="ip_src", pkt_offset="IP.src"),
- dst_fv,
- STLVmWrFlowVar(fv_name="ip_dst", pkt_offset="IP.dst"),
- STLVmFixChecksumHw(l3_offset="IP",
- l4_offset="UDP",
- l4_type=CTRexVmInsFixHwCs.L4_TYPE_UDP)
- ]
-
- return STLPktBuilder(pkt=pkt_base / payload, vm=STLScVmRaw(vm_param))
-
- def generate_streams(self, port_handle, stream_cfg, l2frame, isg=0.0, latency=True):
- idx_lat = None
- streams = []
- if l2frame == 'IMIX':
- for t, (ratio, l2_frame_size) in enumerate(zip(self.imix_ratios, self.imix_l2_sizes)):
- pkt = self.create_pkt(stream_cfg, l2_frame_size)
- streams.append(STLStream(packet=pkt,
- isg=0.1 * t,
- flow_stats=STLFlowStats(
- pg_id=self.stream_ids[port_handle]),
- mode=STLTXCont(pps=ratio)))
-
- if latency:
- idx_lat = self.id.next()
- sl = STLStream(packet=pkt,
- isg=isg,
- flow_stats=STLFlowLatencyStats(pg_id=idx_lat),
- mode=STLTXCont(pps=self.LATENCY_PPS))
- streams.append(sl)
- else:
- pkt = self.create_pkt(stream_cfg, l2frame)
- streams.append(STLStream(packet=pkt,
- flow_stats=STLFlowStats(pg_id=self.stream_ids[port_handle]),
- mode=STLTXCont()))
-
- if latency:
- idx_lat = self.id.next()
- streams.append(STLStream(packet=pkt,
- flow_stats=STLFlowLatencyStats(pg_id=idx_lat),
- mode=STLTXCont(pps=self.LATENCY_PPS)))
-
- if latency:
- self.latencies[port_handle].append(idx_lat)
-
- return streams
-
- def init(self):
- pass
-
- @timeout(5)
- def __connect(self, client):
- client.connect()
-
- def __connect_after_start(self):
- # after start, Trex may take a bit of time to initialize
- # so we need to retry a few times
- for it in xrange(self.config.generic_retry_count):
- try:
- time.sleep(1)
- self.client.connect()
- break
- except Exception as ex:
- if it == (self.config.generic_retry_count - 1):
- raise ex
- LOG.info("Retrying connection to TRex (%s)...", ex.message)
-
- def connect(self):
- LOG.info("Connecting to TRex...")
- server_ip = self.config.generator_config.ip
-
- # Connect to TRex server
- self.client = STLClient(server=server_ip)
- try:
- self.__connect(self.client)
- except (TimeoutError, STLError) as e:
- if server_ip == '127.0.0.1':
- try:
- self.__start_server()
- self.__connect_after_start()
- except (TimeoutError, STLError) as e:
- LOG.error('Cannot connect to TRex')
- LOG.error(traceback.format_exc())
- logpath = '/tmp/trex.log'
- if os.path.isfile(logpath):
- # Wait for TRex to finish writing error message
- last_size = 0
- for _ in xrange(self.config.generic_retry_count):
- size = os.path.getsize(logpath)
- if size == last_size:
- # probably not writing anymore
- break
- last_size = size
- time.sleep(1)
- with open(logpath, 'r') as f:
- message = f.read()
- else:
- message = e.message
- raise TrafficGeneratorException(message)
- else:
- raise TrafficGeneratorException(e.message)
-
- ports = list(self.config.generator_config.ports)
- self.port_handle = ports
- # Prepare the ports
- self.client.reset(ports)
-
- def set_mode(self):
- if self.config.service_chain == ChainType.EXT and not self.config.no_arp:
- self.__set_l3_mode()
- else:
- self.__set_l2_mode()
-
- def __set_l3_mode(self):
- self.client.set_service_mode(ports=self.port_handle, enabled=True)
- for port, device in zip(self.port_handle, self.config.generator_config.devices):
- try:
- self.client.set_l3_mode(port=port,
- src_ipv4=device.tg_gateway_ip,
- dst_ipv4=device.dst.gateway_ip,
- vlan=device.vlan_tag if device.vlan_tagging else None)
- except STLError:
- # TRex tries to resolve ARP already, doesn't have to be successful yet
- continue
- self.client.set_service_mode(ports=self.port_handle, enabled=False)
-
- def __set_l2_mode(self):
- self.client.set_service_mode(ports=self.port_handle, enabled=True)
- for port, device in zip(self.port_handle, self.config.generator_config.devices):
- for cfg in device.get_stream_configs(self.config.generator_config.service_chain):
- self.client.set_l2_mode(port=port, dst_mac=cfg['mac_dst'])
- self.client.set_service_mode(ports=self.port_handle, enabled=False)
-
- def __start_server(self):
- server = TRexTrafficServer()
- server.run_server(self.config.generator_config)
-
- def resolve_arp(self):
- self.client.set_service_mode(ports=self.port_handle)
- LOG.info('Polling ARP until successful')
- resolved = 0
- attempt = 0
- for port, device in zip(self.port_handle, self.config.generator_config.devices):
- ctx = self.client.create_service_ctx(port=port)
-
- arps = [
- STLServiceARP(ctx,
- src_ip=cfg['ip_src_tg_gw'],
- dst_ip=cfg['mac_discovery_gw'],
- vlan=device.vlan_tag if device.vlan_tagging else None)
- for cfg in device.get_stream_configs(self.config.generator_config.service_chain)
- ]
-
- for _ in xrange(self.config.generic_retry_count):
- attempt += 1
- try:
- ctx.run(arps)
- except STLError:
- LOG.error(traceback.format_exc())
- continue
-
- self.arps[port] = [arp.get_record().dst_mac for arp in arps
- if arp.get_record().dst_mac is not None]
-
- if len(self.arps[port]) == self.config.service_chain_count:
- resolved += 1
- LOG.info('ARP resolved successfully for port %s', port)
- break
- else:
- failed = [arp.get_record().dst_ip for arp in arps
- if arp.get_record().dst_mac is None]
- LOG.info('Retrying ARP for: %d (%d / %d)',
- failed, attempt, self.config.generic_retry_count)
- time.sleep(self.config.generic_poll_sec)
-
- self.client.set_service_mode(ports=self.port_handle, enabled=False)
- return resolved == len(self.port_handle)
-
- def config_interface(self):
- pass
-
- def __is_rate_enough(self, l2frame_size, rates, bidirectional, latency):
- """Check if rate provided by user is above requirements. Applies only if latency is True."""
- intf_speed = self.config.generator_config.intf_speed
- if latency:
- if bidirectional:
- mult = 2
- total_rate = 0
- for rate in rates:
- r = utils.convert_rates(l2frame_size, rate, intf_speed)
- total_rate += int(r['rate_pps'])
- else:
- mult = 1
- total_rate = utils.convert_rates(l2frame_size, rates[0], intf_speed)
- # rate must be enough for latency stream and at least 1 pps for base stream per chain
- required_rate = (self.LATENCY_PPS + 1) * self.config.service_chain_count * mult
- result = utils.convert_rates(l2frame_size,
- {'rate_pps': required_rate},
- intf_speed * mult)
- result['result'] = total_rate >= required_rate
- return result
-
- return {'result': True}
-
- def create_traffic(self, l2frame_size, rates, bidirectional, latency=True):
- r = self.__is_rate_enough(l2frame_size, rates, bidirectional, latency)
- if not r['result']:
- raise TrafficGeneratorException(
- 'Required rate in total is at least one of: \n{pps}pps \n{bps}bps \n{load}%.'
- .format(pps=r['rate_pps'],
- bps=r['rate_bps'],
- load=r['rate_percent']))
-
- stream_cfgs = [d.get_stream_configs(self.config.generator_config.service_chain)
- for d in self.config.generator_config.devices]
- self.rates = [utils.to_rate_str(rate) for rate in rates]
-
- for ph in self.port_handle:
- # generate one pg_id for each direction
- self.stream_ids[ph] = self.id.next()
-
- for i, (fwd_stream_cfg, rev_stream_cfg) in enumerate(zip(*stream_cfgs)):
- if self.config.service_chain == ChainType.EXT and not self.config.no_arp:
- fwd_stream_cfg['mac_dst'] = self.arps[self.port_handle[0]][i]
- rev_stream_cfg['mac_dst'] = self.arps[self.port_handle[1]][i]
-
- self.streamblock[0].extend(self.generate_streams(self.port_handle[0],
- fwd_stream_cfg,
- l2frame_size,
- latency=latency))
- if len(self.rates) > 1:
- self.streamblock[1].extend(self.generate_streams(self.port_handle[1],
- rev_stream_cfg,
- l2frame_size,
- isg=10.0,
- latency=bidirectional and latency))
-
- for ph in self.port_handle:
- self.client.add_streams(self.streamblock[ph], ports=ph)
- LOG.info('Created traffic stream for port %s.', ph)
-
- def clear_streamblock(self):
- self.streamblock = defaultdict(list)
- self.latencies = defaultdict(list)
- self.stream_ids = defaultdict(list)
- self.rates = []
- self.client.reset(self.port_handle)
- LOG.info('Cleared all existing streams.')
-
- def get_stats(self):
- stats = self.client.get_pgid_stats()
- return self.extract_stats(stats)
-
- def get_macs(self):
- return [self.client.get_port_attr(port=port)['src_mac'] for port in self.port_handle]
-
- def clear_stats(self):
- if self.port_handle:
- self.client.clear_stats()
-
- def start_traffic(self):
- for port, rate in zip(self.port_handle, self.rates):
- self.client.start(ports=port, mult=rate, duration=self.config.duration_sec, force=True)
-
- def stop_traffic(self):
- self.client.stop(ports=self.port_handle)
-
- def cleanup(self):
- if self.client:
- try:
- self.client.reset(self.port_handle)
- self.client.disconnect()
- except STLError:
- # TRex does not like a reset while in disconnected state
- pass
diff --git a/nfvbench/traffic_gen/trex_gen.py b/nfvbench/traffic_gen/trex_gen.py
new file mode 100644
index 0000000..dff72ac
--- /dev/null
+++ b/nfvbench/traffic_gen/trex_gen.py
@@ -0,0 +1,1208 @@
+# Copyright 2016 Cisco Systems, Inc. All rights reserved.
+#
+# 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.
+"""Driver module for TRex traffic generator."""
+
+import math
+import os
+import sys
+import random
+import time
+import traceback
+from functools import reduce
+
+from itertools import count
+# pylint: disable=import-error
+from scapy.contrib.mpls import MPLS # flake8: noqa
+# pylint: enable=import-error
+from nfvbench.log import LOG
+from nfvbench.specs import ChainType
+from nfvbench.traffic_server import TRexTrafficServer
+from nfvbench.utils import cast_integer
+from nfvbench.utils import timeout
+from nfvbench.utils import TimeoutError
+
+from hdrh.histogram import HdrHistogram
+
+# pylint: disable=import-error
+from trex.common.services.trex_service_arp import ServiceARP
+from trex.stl.api import ARP
+from trex.stl.api import bind_layers
+from trex.stl.api import CTRexVmInsFixHwCs
+from trex.stl.api import Dot1Q
+from trex.stl.api import Ether
+from trex.stl.api import FlagsField
+from trex.stl.api import IP
+from trex.stl.api import Packet
+from trex.stl.api import STLClient
+from trex.stl.api import STLError
+from trex.stl.api import STLFlowLatencyStats
+from trex.stl.api import STLFlowStats
+from trex.stl.api import STLPktBuilder
+from trex.stl.api import STLScVmRaw
+from trex.stl.api import STLStream
+from trex.stl.api import STLTXCont
+from trex.stl.api import STLTXMultiBurst
+from trex.stl.api import STLVmFixChecksumHw
+from trex.stl.api import STLVmFixIpv4
+from trex.stl.api import STLVmFlowVar
+from trex.stl.api import STLVmFlowVarRepeatableRandom
+from trex.stl.api import STLVmTupleGen
+from trex.stl.api import STLVmWrFlowVar
+from trex.stl.api import ThreeBytesField
+from trex.stl.api import UDP
+from trex.stl.api import XByteField
+
+# pylint: enable=import-error
+
+from .traffic_base import AbstractTrafficGenerator
+from .traffic_base import TrafficGeneratorException
+from . import traffic_utils as utils
+from .traffic_utils import IMIX_AVG_L2_FRAME_SIZE
+from .traffic_utils import IMIX_L2_SIZES
+from .traffic_utils import IMIX_RATIOS
+
+class VXLAN(Packet):
+ """VxLAN class."""
+
+ _VXLAN_FLAGS = ['R' * 27] + ['I'] + ['R' * 5]
+ name = "VXLAN"
+ fields_desc = [FlagsField("flags", 0x08000000, 32, _VXLAN_FLAGS),
+ ThreeBytesField("vni", 0),
+ XByteField("reserved", 0x00)]
+
+ def mysummary(self):
+ """Summary."""
+ return self.sprintf("VXLAN (vni=%VXLAN.vni%)")
+
+class TRex(AbstractTrafficGenerator):
+ """TRex traffic generator driver."""
+
+ LATENCY_PPS = 1000
+ CHAIN_PG_ID_MASK = 0x007F
+ PORT_PG_ID_MASK = 0x0080
+ LATENCY_PG_ID_MASK = 0x0100
+
+ def __init__(self, traffic_client):
+ """Trex driver."""
+ AbstractTrafficGenerator.__init__(self, traffic_client)
+ self.client = None
+ self.id = count()
+ self.port_handle = []
+ self.chain_count = self.generator_config.service_chain_count
+ self.rates = []
+ self.capture_id = None
+ self.packet_list = []
+ self.l2_frame_size = 0
+
+ def get_version(self):
+ """Get the Trex version."""
+ return self.client.get_server_version() if self.client else ''
+
+ def get_pg_id(self, port, chain_id):
+ """Calculate the packet group IDs to use for a given port/stream type/chain_id.
+
+ port: 0 or 1
+ chain_id: identifies to which chain the pg_id is associated (0 to 255)
+ return: pg_id, lat_pg_id
+
+ We use a bit mask to set up the 3 fields:
+ 0x007F: chain ID (8 bits for a max of 128 chains)
+ 0x0080: port bit
+ 0x0100: latency bit
+ """
+ pg_id = port * TRex.PORT_PG_ID_MASK | chain_id
+ return pg_id, pg_id | TRex.LATENCY_PG_ID_MASK
+
+ def extract_stats(self, in_stats, ifstats):
+ """Extract stats from dict returned by Trex API.
+
+ :param in_stats: dict as returned by TRex api
+ """
+ utils.nan_replace(in_stats)
+ # LOG.debug(in_stats)
+
+ result = {}
+ # port_handles should have only 2 elements: [0, 1]
+ # so (1 - ph) will be the index for the far end port
+ for ph in self.port_handle:
+ stats = in_stats[ph]
+ far_end_stats = in_stats[1 - ph]
+ result[ph] = {
+ 'tx': {
+ 'total_pkts': cast_integer(stats['opackets']),
+ 'total_pkt_bytes': cast_integer(stats['obytes']),
+ 'pkt_rate': cast_integer(stats['tx_pps']),
+ 'pkt_bit_rate': cast_integer(stats['tx_bps'])
+ },
+ 'rx': {
+ 'total_pkts': cast_integer(stats['ipackets']),
+ 'total_pkt_bytes': cast_integer(stats['ibytes']),
+ 'pkt_rate': cast_integer(stats['rx_pps']),
+ 'pkt_bit_rate': cast_integer(stats['rx_bps']),
+ # how many pkts were dropped in RX direction
+ # need to take the tx counter on the far end port
+ 'dropped_pkts': cast_integer(
+ far_end_stats['opackets'] - stats['ipackets'])
+ }
+ }
+ self.__combine_latencies(in_stats, result[ph]['rx'], ph)
+
+ total_tx_pkts = result[0]['tx']['total_pkts'] + result[1]['tx']['total_pkts']
+
+ # in case of GARP packets we need to base total_tx_pkts value using flow_stats
+ # as no GARP packets have no flow stats and will not be received on the other port
+ if self.config.periodic_gratuitous_arp:
+ if not self.config.no_flow_stats and not self.config.no_latency_stats:
+ global_total_tx_pkts = total_tx_pkts
+ total_tx_pkts = 0
+ if ifstats:
+ for chain_id, _ in enumerate(ifstats):
+ for ph in self.port_handle:
+ pg_id, lat_pg_id = self.get_pg_id(ph, chain_id)
+ flows_tx_pkts = in_stats['flow_stats'][pg_id]['tx_pkts']['total'] + \
+ in_stats['flow_stats'][lat_pg_id]['tx_pkts']['total']
+ result[ph]['tx']['total_pkts'] = flows_tx_pkts
+ total_tx_pkts += flows_tx_pkts
+ else:
+ for pg_id in in_stats['flow_stats']:
+ if pg_id != 'global':
+ total_tx_pkts += in_stats['flow_stats'][pg_id]['tx_pkts']['total']
+ result["garp_total_tx_rate"] = cast_integer(
+ (global_total_tx_pkts - total_tx_pkts) / self.config.duration_sec)
+ else:
+ LOG.warning("Gratuitous ARP are not received by the other port so TRex and NFVbench"
+ " see these packets as dropped. Please do not activate no_flow_stats"
+ " and no_latency_stats properties to have a better drop rate.")
+
+ result["total_tx_rate"] = cast_integer(total_tx_pkts / self.config.duration_sec)
+ # actual offered tx rate in bps
+ avg_packet_size = utils.get_average_packet_size(self.l2_frame_size)
+ total_tx_bps = utils.pps_to_bps(result["total_tx_rate"], avg_packet_size)
+ result['offered_tx_rate_bps'] = total_tx_bps
+
+ result.update(self.get_theoretical_rates(avg_packet_size))
+
+ result["flow_stats"] = in_stats["flow_stats"]
+ result["latency"] = in_stats["latency"]
+
+ # Merge HDRHistogram to have an overall value for all chains and ports
+ # (provided that the histogram exists in the stats returned by T-Rex)
+ # Of course, empty histograms will produce an empty (invalid) histogram.
+ try:
+ hdrh_list = []
+ if ifstats:
+ for chain_id, _ in enumerate(ifstats):
+ for ph in self.port_handle:
+ _, lat_pg_id = self.get_pg_id(ph, chain_id)
+ hdrh_list.append(
+ HdrHistogram.decode(in_stats['latency'][lat_pg_id]['latency']['hdrh']))
+ else:
+ for pg_id in in_stats['latency']:
+ if pg_id != 'global':
+ hdrh_list.append(
+ HdrHistogram.decode(in_stats['latency'][pg_id]['latency']['hdrh']))
+
+ def add_hdrh(x, y):
+ x.add(y)
+ return x
+ decoded_hdrh = reduce(add_hdrh, hdrh_list)
+ result["overall_hdrh"] = HdrHistogram.encode(decoded_hdrh).decode('utf-8')
+ except KeyError:
+ pass
+
+ return result
+
+ def get_stream_stats(self, trex_stats, if_stats, latencies, chain_idx):
+ """Extract the aggregated stats for a given chain.
+
+ trex_stats: stats as returned by get_stats()
+ if_stats: a list of 2 interface stats to update (port 0 and 1)
+ latencies: a list of 2 Latency instances to update for this chain (port 0 and 1)
+ latencies[p] is the latency for packets sent on port p
+ if there are no latency streams, the Latency instances are not modified
+ chain_idx: chain index of the interface stats
+
+ The packet counts include normal and latency streams.
+
+ Trex returns flows stats as follows:
+
+ 'flow_stats': {0: {'rx_bps': {0: 0, 1: 0, 'total': 0},
+ 'rx_bps_l1': {0: 0.0, 1: 0.0, 'total': 0.0},
+ 'rx_bytes': {0: nan, 1: nan, 'total': nan},
+ 'rx_pkts': {0: 0, 1: 15001, 'total': 15001},
+ 'rx_pps': {0: 0, 1: 0, 'total': 0},
+ 'tx_bps': {0: 0, 1: 0, 'total': 0},
+ 'tx_bps_l1': {0: 0.0, 1: 0.0, 'total': 0.0},
+ 'tx_bytes': {0: 1020068, 1: 0, 'total': 1020068},
+ 'tx_pkts': {0: 15001, 1: 0, 'total': 15001},
+ 'tx_pps': {0: 0, 1: 0, 'total': 0}},
+ 1: {'rx_bps': {0: 0, 1: 0, 'total': 0},
+ 'rx_bps_l1': {0: 0.0, 1: 0.0, 'total': 0.0},
+ 'rx_bytes': {0: nan, 1: nan, 'total': nan},
+ 'rx_pkts': {0: 0, 1: 15001, 'total': 15001},
+ 'rx_pps': {0: 0, 1: 0, 'total': 0},
+ 'tx_bps': {0: 0, 1: 0, 'total': 0},
+ 'tx_bps_l1': {0: 0.0, 1: 0.0, 'total': 0.0},
+ 'tx_bytes': {0: 1020068, 1: 0, 'total': 1020068},
+ 'tx_pkts': {0: 15001, 1: 0, 'total': 15001},
+ 'tx_pps': {0: 0, 1: 0, 'total': 0}},
+ 128: {'rx_bps': {0: 0, 1: 0, 'total': 0},
+ 'rx_bps_l1': {0: 0.0, 1: 0.0, 'total': 0.0},
+ 'rx_bytes': {0: nan, 1: nan, 'total': nan},
+ 'rx_pkts': {0: 15001, 1: 0, 'total': 15001},
+ 'rx_pps': {0: 0, 1: 0, 'total': 0},
+ 'tx_bps': {0: 0, 1: 0, 'total': 0},
+ 'tx_bps_l1': {0: 0.0, 1: 0.0, 'total': 0.0},
+ 'tx_bytes': {0: 0, 1: 1020068, 'total': 1020068},
+ 'tx_pkts': {0: 0, 1: 15001, 'total': 15001},
+ 'tx_pps': {0: 0, 1: 0, 'total': 0}},etc...
+
+ the pg_id (0, 1, 128,...) is the key of the dict and is obtained using the
+ get_pg_id() method.
+ packet counters for a given stream sent on port p are reported as:
+ - tx_pkts[p] on port p
+ - rx_pkts[1-p] on the far end port
+
+ This is a tricky/critical counter transposition operation because
+ the results are grouped by port (not by stream):
+ tx_pkts_port(p=0) comes from pg_id(port=0, chain_idx)['tx_pkts'][0]
+ rx_pkts_port(p=0) comes from pg_id(port=1, chain_idx)['rx_pkts'][0]
+ tx_pkts_port(p=1) comes from pg_id(port=1, chain_idx)['tx_pkts'][1]
+ rx_pkts_port(p=1) comes from pg_id(port=0, chain_idx)['rx_pkts'][1]
+
+ or using a more generic formula:
+ tx_pkts_port(p) comes from pg_id(port=p, chain_idx)['tx_pkts'][p]
+ rx_pkts_port(p) comes from pg_id(port=1-p, chain_idx)['rx_pkts'][p]
+
+ the second formula is equivalent to
+ rx_pkts_port(1-p) comes from pg_id(port=p, chain_idx)['rx_pkts'][1-p]
+
+ If there are latency streams, those same counters need to be added in the same way
+ """
+ def get_latency(lval):
+ try:
+ return int(round(lval))
+ except ValueError:
+ return 0
+
+ for ifs in if_stats:
+ ifs.tx = ifs.rx = 0
+ for port in range(2):
+ pg_id, lat_pg_id = self.get_pg_id(port, chain_idx)
+ for pid in [pg_id, lat_pg_id]:
+ try:
+ pg_stats = trex_stats['flow_stats'][pid]
+ if_stats[port].tx += pg_stats['tx_pkts'][port]
+ if_stats[1 - port].rx += pg_stats['rx_pkts'][1 - port]
+ except KeyError:
+ pass
+ try:
+ lat = trex_stats['latency'][lat_pg_id]['latency']
+ # dropped_pkts += lat['err_cntrs']['dropped']
+ latencies[port].max_usec = get_latency(lat['total_max'])
+ if math.isnan(lat['total_min']):
+ latencies[port].min_usec = 0
+ latencies[port].avg_usec = 0
+ else:
+ latencies[port].min_usec = get_latency(lat['total_min'])
+ latencies[port].avg_usec = get_latency(lat['average'])
+ # pick up the HDR histogram if present (otherwise will raise KeyError)
+ latencies[port].hdrh = lat['hdrh']
+ except KeyError:
+ pass
+
+ def __combine_latencies(self, in_stats, results, port_handle):
+ """Traverse TRex result dictionary and combines chosen latency stats.
+
+ example of latency dict returned by trex (2 chains):
+ 'latency': {256: {'err_cntrs': {'dropped': 0,
+ 'dup': 0,
+ 'out_of_order': 0,
+ 'seq_too_high': 0,
+ 'seq_too_low': 0},
+ 'latency': {'average': 26.5,
+ 'hdrh': u'HISTFAAAAEx4nJNpmSgz...bFRgxi',
+ 'histogram': {20: 303,
+ 30: 320,
+ 40: 300,
+ 50: 73,
+ 60: 4,
+ 70: 1},
+ 'jitter': 14,
+ 'last_max': 63,
+ 'total_max': 63,
+ 'total_min': 20}},
+ 257: {'err_cntrs': {'dropped': 0,
+ 'dup': 0,
+ 'out_of_order': 0,
+ 'seq_too_high': 0,
+ 'seq_too_low': 0},
+ 'latency': {'average': 29.75,
+ 'hdrh': u'HISTFAAAAEV4nJN...CALilDG0=',
+ 'histogram': {20: 261,
+ 30: 431,
+ 40: 3,
+ 50: 80,
+ 60: 225},
+ 'jitter': 23,
+ 'last_max': 67,
+ 'total_max': 67,
+ 'total_min': 20}},
+ 384: {'err_cntrs': {'dropped': 0,
+ 'dup': 0,
+ 'out_of_order': 0,
+ 'seq_too_high': 0,
+ 'seq_too_low': 0},
+ 'latency': {'average': 18.0,
+ 'hdrh': u'HISTFAAAADR4nJNpm...MjCwDDxAZG',
+ 'histogram': {20: 987, 30: 14},
+ 'jitter': 0,
+ 'last_max': 34,
+ 'total_max': 34,
+ 'total_min': 20}},
+ 385: {'err_cntrs': {'dropped': 0,
+ 'dup': 0,
+ 'out_of_order': 0,
+ 'seq_too_high': 0,
+ 'seq_too_low': 0},
+ 'latency': {'average': 19.0,
+ 'hdrh': u'HISTFAAAADR4nJNpm...NkYmJgDdagfK',
+ 'histogram': {20: 989, 30: 11},
+ 'jitter': 0,
+ 'last_max': 38,
+ 'total_max': 38,
+ 'total_min': 20}},
+ 'global': {'bad_hdr': 0, 'old_flow': 0}},
+ """
+ total_max = 0
+ average = 0
+ total_min = float("inf")
+ for chain_id in range(self.chain_count):
+ try:
+ _, lat_pg_id = self.get_pg_id(port_handle, chain_id)
+ lat = in_stats['latency'][lat_pg_id]['latency']
+ # dropped_pkts += lat['err_cntrs']['dropped']
+ total_max = max(lat['total_max'], total_max)
+ total_min = min(lat['total_min'], total_min)
+ average += lat['average']
+ except KeyError:
+ pass
+ if total_min == float("inf"):
+ total_min = 0
+ results['min_delay_usec'] = total_min
+ results['max_delay_usec'] = total_max
+ results['avg_delay_usec'] = int(average / self.chain_count)
+
+ def _bind_vxlan(self):
+ bind_layers(UDP, VXLAN, dport=4789)
+ bind_layers(VXLAN, Ether)
+
+ def _create_pkt(self, stream_cfg, l2frame_size, disable_random_latency_flow=False):
+ """Create a packet of given size.
+
+ l2frame_size: size of the L2 frame in bytes (including the 32-bit FCS)
+ """
+ # Trex will add the FCS field, so we need to remove 4 bytes from the l2 frame size
+ frame_size = int(l2frame_size) - 4
+ vm_param = []
+ if stream_cfg['vxlan'] is True:
+ self._bind_vxlan()
+ encap_level = '1'
+ pkt_base = Ether(src=stream_cfg['vtep_src_mac'], dst=stream_cfg['vtep_dst_mac'])
+ if stream_cfg['vtep_vlan'] is not None:
+ pkt_base /= Dot1Q(vlan=stream_cfg['vtep_vlan'])
+ pkt_base /= IP(src=stream_cfg['vtep_src_ip'], dst=stream_cfg['vtep_dst_ip'])
+ pkt_base /= UDP(sport=random.randint(1337, 32767), dport=4789)
+ pkt_base /= VXLAN(vni=stream_cfg['net_vni'])
+ pkt_base /= Ether(src=stream_cfg['mac_src'], dst=stream_cfg['mac_dst'])
+ # need to randomize the outer header UDP src port based on flow
+ vxlan_udp_src_fv = STLVmFlowVar(
+ name="vxlan_udp_src",
+ min_value=1337,
+ max_value=32767,
+ size=2,
+ op="random")
+ vm_param = [vxlan_udp_src_fv,
+ STLVmWrFlowVar(fv_name="vxlan_udp_src", pkt_offset="UDP.sport")]
+ elif stream_cfg['mpls'] is True:
+ encap_level = '0'
+ pkt_base = Ether(src=stream_cfg['vtep_src_mac'], dst=stream_cfg['vtep_dst_mac'])
+ if stream_cfg['vtep_vlan'] is not None:
+ pkt_base /= Dot1Q(vlan=stream_cfg['vtep_vlan'])
+ if stream_cfg['mpls_outer_label'] is not None:
+ pkt_base /= MPLS(label=stream_cfg['mpls_outer_label'], cos=1, s=0, ttl=255)
+ if stream_cfg['mpls_inner_label'] is not None:
+ pkt_base /= MPLS(label=stream_cfg['mpls_inner_label'], cos=1, s=1, ttl=255)
+ # Flow stats and MPLS labels randomization TBD
+ pkt_base /= Ether(src=stream_cfg['mac_src'], dst=stream_cfg['mac_dst'])
+ else:
+ encap_level = '0'
+ pkt_base = Ether(src=stream_cfg['mac_src'], dst=stream_cfg['mac_dst'])
+
+ if stream_cfg['vlan_tag'] is not None:
+ pkt_base /= Dot1Q(vlan=stream_cfg['vlan_tag'])
+
+ udp_args = {}
+ if stream_cfg['udp_src_port']:
+ udp_args['sport'] = int(stream_cfg['udp_src_port'])
+ if stream_cfg['udp_port_step'] == 'random':
+ step = 1
+ else:
+ step = stream_cfg['udp_port_step']
+ udp_args['sport_step'] = int(step)
+ udp_args['sport_max'] = int(stream_cfg['udp_src_port_max'])
+ if stream_cfg['udp_dst_port']:
+ udp_args['dport'] = int(stream_cfg['udp_dst_port'])
+ if stream_cfg['udp_port_step'] == 'random':
+ step = 1
+ else:
+ step = stream_cfg['udp_port_step']
+ udp_args['dport_step'] = int(step)
+ udp_args['dport_max'] = int(stream_cfg['udp_dst_port_max'])
+
+ pkt_base /= IP(src=stream_cfg['ip_src_addr'], dst=stream_cfg['ip_dst_addr']) / \
+ UDP(dport=udp_args['dport'], sport=udp_args['sport'])
+
+ # STLVmTupleGen need flow count >= cores used by TRex, if FC < cores we used STLVmFlowVar
+ if stream_cfg['ip_addrs_step'] == '0.0.0.1' and stream_cfg['udp_port_step'] == '1' and \
+ stream_cfg['count'] >= self.generator_config.cores:
+ src_fv = STLVmTupleGen(ip_min=stream_cfg['ip_src_addr'],
+ ip_max=stream_cfg['ip_src_addr_max'],
+ port_min=udp_args['sport'],
+ port_max=udp_args['sport_max'],
+ name="tuple_src",
+ limit_flows=stream_cfg['count'])
+ dst_fv = STLVmTupleGen(ip_min=stream_cfg['ip_dst_addr'],
+ ip_max=stream_cfg['ip_dst_addr_max'],
+ port_min=udp_args['dport'],
+ port_max=udp_args['dport_max'],
+ name="tuple_dst",
+ limit_flows=stream_cfg['count'])
+ vm_param = [
+ src_fv,
+ STLVmWrFlowVar(fv_name="tuple_src.ip",
+ pkt_offset="IP:{}.src".format(encap_level)),
+ STLVmWrFlowVar(fv_name="tuple_src.port",
+ pkt_offset="UDP:{}.sport".format(encap_level)),
+ dst_fv,
+ STLVmWrFlowVar(fv_name="tuple_dst.ip",
+ pkt_offset="IP:{}.dst".format(encap_level)),
+ STLVmWrFlowVar(fv_name="tuple_dst.port",
+ pkt_offset="UDP:{}.dport".format(encap_level)),
+ ]
+ else:
+ if disable_random_latency_flow:
+ src_fv_ip = STLVmFlowVar(
+ name="ip_src",
+ min_value=stream_cfg['ip_src_addr'],
+ max_value=stream_cfg['ip_src_addr'],
+ size=4)
+ dst_fv_ip = STLVmFlowVar(
+ name="ip_dst",
+ min_value=stream_cfg['ip_dst_addr'],
+ max_value=stream_cfg['ip_dst_addr'],
+ size=4)
+ elif stream_cfg['ip_addrs_step'] == 'random':
+ src_fv_ip = STLVmFlowVarRepeatableRandom(
+ name="ip_src",
+ min_value=stream_cfg['ip_src_addr'],
+ max_value=stream_cfg['ip_src_addr_max'],
+ size=4,
+ seed=random.randint(0, 32767),
+ limit=stream_cfg['ip_src_count'])
+ dst_fv_ip = STLVmFlowVarRepeatableRandom(
+ name="ip_dst",
+ min_value=stream_cfg['ip_dst_addr'],
+ max_value=stream_cfg['ip_dst_addr_max'],
+ size=4,
+ seed=random.randint(0, 32767),
+ limit=stream_cfg['ip_dst_count'])
+ else:
+ src_fv_ip = STLVmFlowVar(
+ name="ip_src",
+ min_value=stream_cfg['ip_src_addr'],
+ max_value=stream_cfg['ip_src_addr_max'],
+ size=4,
+ op="inc",
+ step=stream_cfg['ip_addrs_step'])
+ dst_fv_ip = STLVmFlowVar(
+ name="ip_dst",
+ min_value=stream_cfg['ip_dst_addr'],
+ max_value=stream_cfg['ip_dst_addr_max'],
+ size=4,
+ op="inc",
+ step=stream_cfg['ip_addrs_step'])
+
+ if disable_random_latency_flow:
+ src_fv_port = STLVmFlowVar(
+ name="p_src",
+ min_value=udp_args['sport'],
+ max_value=udp_args['sport'],
+ size=2)
+ dst_fv_port = STLVmFlowVar(
+ name="p_dst",
+ min_value=udp_args['dport'],
+ max_value=udp_args['dport'],
+ size=2)
+ elif stream_cfg['udp_port_step'] == 'random':
+ src_fv_port = STLVmFlowVarRepeatableRandom(
+ name="p_src",
+ min_value=udp_args['sport'],
+ max_value=udp_args['sport_max'],
+ size=2,
+ seed=random.randint(0, 32767),
+ limit=stream_cfg['udp_src_count'])
+ dst_fv_port = STLVmFlowVarRepeatableRandom(
+ name="p_dst",
+ min_value=udp_args['dport'],
+ max_value=udp_args['dport_max'],
+ size=2,
+ seed=random.randint(0, 32767),
+ limit=stream_cfg['udp_dst_count'])
+ else:
+ src_fv_port = STLVmFlowVar(
+ name="p_src",
+ min_value=udp_args['sport'],
+ max_value=udp_args['sport_max'],
+ size=2,
+ op="inc",
+ step=udp_args['sport_step'])
+ dst_fv_port = STLVmFlowVar(
+ name="p_dst",
+ min_value=udp_args['dport'],
+ max_value=udp_args['dport_max'],
+ size=2,
+ op="inc",
+ step=udp_args['dport_step'])
+ vm_param = [
+ src_fv_ip,
+ STLVmWrFlowVar(fv_name="ip_src", pkt_offset="IP:{}.src".format(encap_level)),
+ src_fv_port,
+ STLVmWrFlowVar(fv_name="p_src", pkt_offset="UDP:{}.sport".format(encap_level)),
+ dst_fv_ip,
+ STLVmWrFlowVar(fv_name="ip_dst", pkt_offset="IP:{}.dst".format(encap_level)),
+ dst_fv_port,
+ STLVmWrFlowVar(fv_name="p_dst", pkt_offset="UDP:{}.dport".format(encap_level)),
+ ]
+ # Use HW Offload to calculate the outter IP/UDP packet
+ vm_param.append(STLVmFixChecksumHw(l3_offset="IP:0",
+ l4_offset="UDP:0",
+ l4_type=CTRexVmInsFixHwCs.L4_TYPE_UDP))
+ # Use software to fix the inner IP/UDP payload for VxLAN packets
+ if int(encap_level):
+ vm_param.append(STLVmFixIpv4(offset="IP:1"))
+ pad = max(0, frame_size - len(pkt_base)) * 'x'
+
+ return STLPktBuilder(pkt=pkt_base / pad,
+ vm=STLScVmRaw(vm_param, cache_size=int(self.config.cache_size)))
+
+ def _create_gratuitous_arp_pkt(self, stream_cfg):
+ """Create a GARP packet.
+
+ """
+ pkt_base = Ether(src=stream_cfg['mac_src'], dst="ff:ff:ff:ff:ff:ff")
+
+ if self.config.vxlan or self.config.mpls:
+ pkt_base /= Dot1Q(vlan=stream_cfg['vtep_vlan'])
+ elif stream_cfg['vlan_tag'] is not None:
+ pkt_base /= Dot1Q(vlan=stream_cfg['vlan_tag'])
+
+ pkt_base /= ARP(psrc=stream_cfg['ip_src_tg_gw'], hwsrc=stream_cfg['mac_src'],
+ hwdst=stream_cfg['mac_src'], pdst=stream_cfg['ip_src_tg_gw'])
+
+ return STLPktBuilder(pkt=pkt_base)
+
+ def generate_streams(self, port, chain_id, stream_cfg, l2frame, latency=True,
+ e2e=False):
+ """Create a list of streams corresponding to a given chain and stream config.
+
+ port: port where the streams originate (0 or 1)
+ chain_id: the chain to which the streams are associated to
+ stream_cfg: stream configuration
+ l2frame: L2 frame size (including 4-byte FCS) or 'IMIX'
+ latency: if True also create a latency stream
+ e2e: True if performing "end to end" connectivity check
+ """
+ streams = []
+ pg_id, lat_pg_id = self.get_pg_id(port, chain_id)
+ if l2frame == 'IMIX':
+ for ratio, l2_frame_size in zip(IMIX_RATIOS, IMIX_L2_SIZES):
+ pkt = self._create_pkt(stream_cfg, l2_frame_size)
+ if e2e or stream_cfg['mpls']:
+ streams.append(STLStream(packet=pkt,
+ mode=STLTXCont(pps=ratio)))
+ else:
+ if stream_cfg['vxlan'] is True:
+ streams.append(STLStream(packet=pkt,
+ flow_stats=STLFlowStats(pg_id=pg_id,
+ vxlan=True)
+ if not self.config.no_flow_stats else None,
+ mode=STLTXCont(pps=ratio)))
+ else:
+ streams.append(STLStream(packet=pkt,
+ flow_stats=STLFlowStats(pg_id=pg_id)
+ if not self.config.no_flow_stats else None,
+ mode=STLTXCont(pps=ratio)))
+
+ if latency:
+ # for IMIX, the latency packets have the average IMIX packet size
+ if stream_cfg['ip_addrs_step'] == 'random' or \
+ stream_cfg['udp_port_step'] == 'random':
+ # Force latency flow to only one flow to avoid creating flows
+ # over requested flow count
+ pkt = self._create_pkt(stream_cfg, IMIX_AVG_L2_FRAME_SIZE, True)
+ else:
+ pkt = self._create_pkt(stream_cfg, IMIX_AVG_L2_FRAME_SIZE)
+
+ else:
+ l2frame_size = int(l2frame)
+ pkt = self._create_pkt(stream_cfg, l2frame_size)
+ if self.config.periodic_gratuitous_arp:
+ requested_pps = int(utils.parse_rate_str(self.rates[0])[
+ 'rate_pps']) - self.config.gratuitous_arp_pps
+ if latency:
+ requested_pps -= self.LATENCY_PPS
+ stltx_cont = STLTXCont(pps=requested_pps)
+ else:
+ stltx_cont = STLTXCont()
+ if e2e or stream_cfg['mpls']:
+ streams.append(STLStream(packet=pkt,
+ # Flow stats is disabled for MPLS now
+ # flow_stats=STLFlowStats(pg_id=pg_id),
+ mode=stltx_cont))
+ else:
+ if stream_cfg['vxlan'] is True:
+ streams.append(STLStream(packet=pkt,
+ flow_stats=STLFlowStats(pg_id=pg_id,
+ vxlan=True)
+ if not self.config.no_flow_stats else None,
+ mode=stltx_cont))
+ else:
+ streams.append(STLStream(packet=pkt,
+ flow_stats=STLFlowStats(pg_id=pg_id)
+ if not self.config.no_flow_stats else None,
+ mode=stltx_cont))
+ # for the latency stream, the minimum payload is 16 bytes even in case of vlan tagging
+ # without vlan, the min l2 frame size is 64
+ # with vlan it is 68
+ # This only applies to the latency stream
+ if latency:
+ if stream_cfg['vlan_tag'] and l2frame_size < 68:
+ l2frame_size = 68
+ if stream_cfg['ip_addrs_step'] == 'random' or \
+ stream_cfg['udp_port_step'] == 'random':
+ # Force latency flow to only one flow to avoid creating flows
+ # over requested flow count
+ pkt = self._create_pkt(stream_cfg, l2frame_size, True)
+ else:
+ pkt = self._create_pkt(stream_cfg, l2frame_size)
+
+ if latency:
+ if self.config.no_latency_stats:
+ LOG.info("Latency flow statistics are disabled.")
+ if stream_cfg['vxlan'] is True:
+ streams.append(STLStream(packet=pkt,
+ flow_stats=STLFlowLatencyStats(pg_id=lat_pg_id,
+ vxlan=True)
+ if not self.config.no_latency_stats else None,
+ mode=STLTXCont(pps=self.LATENCY_PPS)))
+ else:
+ streams.append(STLStream(packet=pkt,
+ flow_stats=STLFlowLatencyStats(pg_id=lat_pg_id)
+ if not self.config.no_latency_stats else None,
+ mode=STLTXCont(pps=self.LATENCY_PPS)))
+
+ if self.config.periodic_gratuitous_arp and (
+ self.config.l3_router or self.config.service_chain == ChainType.EXT):
+ # In case of L3 router feature or EXT chain with router
+ # and depending on ARP stale time SUT configuration
+ # Gratuitous ARP from TG port to the router is needed to keep traffic up
+ garp_pkt = self._create_gratuitous_arp_pkt(stream_cfg)
+ ibg = self.config.gratuitous_arp_pps * 1000000.0
+ packets_count = int(self.config.duration_sec / self.config.gratuitous_arp_pps)
+ streams.append(
+ STLStream(packet=garp_pkt,
+ mode=STLTXMultiBurst(pkts_per_burst=1, count=packets_count, ibg=ibg)))
+ return streams
+
+ @timeout(5)
+ def __connect(self, client):
+ client.connect()
+
+ def __local_server_status(self):
+ """ The TRex server may have started but failed initializing... and stopped.
+ This piece of code is especially designed to address
+ the case when a fatal failure occurs on a DPDK init call.
+ The TRex algorihm should be revised to include some missing timeouts (?)
+ status returned:
+ 0: no error detected
+ 1: fatal error detected - should lead to exiting the run
+ 2: error detected that could be solved by starting again
+ The diagnostic is based on parsing the local trex log file (improvable)
+ """
+ status = 0
+ message = None
+ failure = None
+ exited = None
+ cause = None
+ error = None
+ before = None
+ after = None
+ last = None
+ try:
+ with open('/tmp/trex.log', 'r', encoding="utf-8") as trex_log:
+ for _line in trex_log:
+ line = _line.strip()
+ if line.startswith('Usage:'):
+ break
+ if 'ports are bound' in line:
+ continue
+ if 'please wait' in line:
+ continue
+ if 'exit' in line.lower():
+ exited = line
+ elif 'cause' in line.lower():
+ cause = line
+ elif 'fail' in line.lower():
+ failure = line
+ elif 'msg' in line.lower():
+ message = line
+ elif (error is not None) and line:
+ after = line
+ elif line.startswith('Error:') or line.startswith('ERROR'):
+ error = line
+ before = last
+ last = line
+ except FileNotFoundError:
+ pass
+ if exited is not None:
+ status = 1
+ LOG.info("\x1b[1m%s\x1b[0m %s", 'TRex failed initializing:', exited)
+ if cause is not None:
+ LOG.info("TRex [cont'd] %s", cause)
+ if failure is not None:
+ LOG.info("TRex [cont'd] %s", failure)
+ if message is not None:
+ LOG.info("TRex [cont'd] %s", message)
+ if 'not supported yet' in message.lower():
+ LOG.info("TRex [cont'd] Try starting again!")
+ status = 2
+ elif error is not None:
+ status = 1
+ LOG.info("\x1b[1m%s\x1b[0m %s", 'TRex failed initializing:', error)
+ if after is not None:
+ LOG.info("TRex [cont'd] %s", after)
+ elif before is not None:
+ LOG.info("TRex [cont'd] %s", before)
+ return status
+
+ def __connect_after_start(self):
+ # after start, Trex may take a bit of time to initialize
+ # so we need to retry a few times
+ # we try to capture recoverable error cases (checking status)
+ status = 0
+ for it in range(self.config.generic_retry_count):
+ try:
+ time.sleep(1)
+ self.client.connect()
+ break
+ except Exception as ex:
+ if it == (self.config.generic_retry_count - 1):
+ raise
+ status = self.__local_server_status()
+ if status > 0:
+ # No need to wait anymore, something went wrong and TRex exited
+ if status == 1:
+ LOG.info("\x1b[1m%s\x1b[0m", 'TRex failed starting!')
+ print("More information? Try the command: "
+ + "\x1b[1mnfvbench --show-trex-log\x1b[0m")
+ sys.exit(0)
+ if status == 2:
+ # a new start will follow
+ return status
+ LOG.info("Retrying connection to TRex (%s)...", ex.msg)
+ return status
+
+ def connect(self):
+ """Connect to the TRex server."""
+ status = 0
+ server_ip = self.generator_config.ip
+ LOG.info("Connecting to TRex (%s)...", server_ip)
+
+ # Connect to TRex server
+ self.client = STLClient(server=server_ip, sync_port=self.generator_config.zmq_rpc_port,
+ async_port=self.generator_config.zmq_pub_port)
+ try:
+ self.__connect(self.client)
+ if server_ip == '127.0.0.1':
+ config_updated = self.__check_config()
+ if config_updated or self.config.restart:
+ status = self.__restart()
+ except (TimeoutError, STLError) as e:
+ if server_ip == '127.0.0.1':
+ status = self.__start_local_server()
+ else:
+ raise TrafficGeneratorException(e.message) from e
+
+ if status == 2:
+ # Workaround in case of a failed TRex server initialization
+ # we try to start it again (twice maximum)
+ # which may allow low level initialization to complete.
+ if self.__start_local_server() == 2:
+ self.__start_local_server()
+
+ ports = list(self.generator_config.ports)
+ self.port_handle = ports
+ # Prepare the ports
+ self.client.reset(ports)
+ # Read HW information from each port
+ # this returns an array of dict (1 per port)
+ """
+ Example of output for Intel XL710
+ [{'arp': '-', 'src_ipv4': '-', u'supp_speeds': [40000], u'is_link_supported': True,
+ 'grat_arp': 'off', 'speed': 40, u'index': 0, 'link_change_supported': 'yes',
+ u'rx': {u'counters': 127, u'caps': [u'flow_stats', u'latency']},
+ u'is_virtual': 'no', 'prom': 'off', 'src_mac': u'3c:fd:fe:a8:24:48', 'status': 'IDLE',
+ u'description': u'Ethernet Controller XL710 for 40GbE QSFP+',
+ 'dest': u'fa:16:3e:3c:63:04', u'is_fc_supported': False, 'vlan': '-',
+ u'driver': u'net_i40e', 'led_change_supported': 'yes', 'rx_filter_mode': 'hardware match',
+ 'fc': 'none', 'link': 'UP', u'hw_mac': u'3c:fd:fe:a8:24:48', u'pci_addr': u'0000:5e:00.0',
+ 'mult': 'off', 'fc_supported': 'no', u'is_led_supported': True, 'rx_queue': 'off',
+ 'layer_mode': 'Ethernet', u'numa': 0}, ...]
+ """
+ self.port_info = self.client.get_port_info(ports)
+ LOG.info('Connected to TRex')
+ for id, port in enumerate(self.port_info):
+ LOG.info(' Port %d: %s speed=%dGbps mac=%s pci=%s driver=%s',
+ id, port['description'], port['speed'], port['src_mac'],
+ port['pci_addr'], port['driver'])
+ # Make sure the 2 ports have the same speed
+ if self.port_info[0]['speed'] != self.port_info[1]['speed']:
+ raise TrafficGeneratorException('Traffic generator ports speed mismatch: %d/%d Gbps' %
+ (self.port_info[0]['speed'],
+ self.port_info[1]['speed']))
+
+ def __start_local_server(self):
+ try:
+ LOG.info("Starting TRex ...")
+ self.__start_server()
+ status = self.__connect_after_start()
+ except (TimeoutError, STLError) as e:
+ LOG.error('Cannot connect to TRex')
+ LOG.error(traceback.format_exc())
+ logpath = '/tmp/trex.log'
+ if os.path.isfile(logpath):
+ # Wait for TRex to finish writing error message
+ last_size = 0
+ for _ in range(self.config.generic_retry_count):
+ size = os.path.getsize(logpath)
+ if size == last_size:
+ # probably not writing anymore
+ break
+ last_size = size
+ time.sleep(1)
+ with open(logpath, 'r', encoding="utf-8") as f:
+ message = f.read()
+ else:
+ message = e.message
+ raise TrafficGeneratorException(message) from e
+ return status
+
+ def __start_server(self):
+ server = TRexTrafficServer()
+ server.run_server(self.generator_config)
+
+ def __check_config(self):
+ server = TRexTrafficServer()
+ return server.check_config_updated(self.generator_config)
+
+ def __restart(self):
+ LOG.info("Restarting TRex ...")
+ self.__stop_server()
+ # Wait for server stopped
+ for _ in range(self.config.generic_retry_count):
+ time.sleep(1)
+ if not self.client.is_connected():
+ LOG.info("TRex is stopped...")
+ break
+ # Start and report a possible failure
+ return self.__start_local_server()
+
+ def __stop_server(self):
+ if self.generator_config.ip == '127.0.0.1':
+ ports = self.client.get_acquired_ports()
+ LOG.info('Release ports %s and stopping TRex...', ports)
+ try:
+ if ports:
+ self.client.release(ports=ports)
+ self.client.server_shutdown()
+ except STLError as e:
+ LOG.warning('Unable to stop TRex. Error: %s', e)
+ else:
+ LOG.info('Using remote TRex. Unable to stop TRex')
+
+ def resolve_arp(self):
+ """Resolve all configured remote IP addresses.
+
+ return: None if ARP failed to resolve for all IP addresses
+ else a dict of list of dest macs indexed by port#
+ the dest macs in the list are indexed by the chain id
+ """
+ self.client.set_service_mode(ports=self.port_handle)
+ LOG.info('Polling ARP until successful...')
+ arp_dest_macs = {}
+ for port, device in zip(self.port_handle, self.generator_config.devices):
+ # there should be 1 stream config per chain
+ stream_configs = device.get_stream_configs()
+ chain_count = len(stream_configs)
+ ctx = self.client.create_service_ctx(port=port)
+ # all dest macs on this port indexed by chain ID
+ dst_macs = [None] * chain_count
+ dst_macs_count = 0
+ # the index in the list is the chain id
+ if self.config.vxlan or self.config.mpls:
+ arps = [
+ ServiceARP(ctx,
+ src_ip=device.vtep_src_ip,
+ dst_ip=device.vtep_dst_ip,
+ vlan=device.vtep_vlan)
+ for cfg in stream_configs
+ ]
+ else:
+ arps = [
+ ServiceARP(ctx,
+ src_ip=cfg['ip_src_tg_gw'],
+ dst_ip=cfg['mac_discovery_gw'],
+ # will be None if no vlan tagging
+ vlan=cfg['vlan_tag'])
+ for cfg in stream_configs
+ ]
+
+ for attempt in range(self.config.generic_retry_count):
+ try:
+ ctx.run(arps)
+ except STLError:
+ LOG.error(traceback.format_exc())
+ continue
+
+ unresolved = []
+ for chain_id, mac in enumerate(dst_macs):
+ if not mac:
+ arp_record = arps[chain_id].get_record()
+ if arp_record.dst_mac:
+ dst_macs[chain_id] = arp_record.dst_mac
+ dst_macs_count += 1
+ LOG.info(' ARP: port=%d chain=%d src IP=%s dst IP=%s -> MAC=%s',
+ port, chain_id,
+ arp_record.src_ip,
+ arp_record.dst_ip, arp_record.dst_mac)
+ else:
+ unresolved.append(arp_record.dst_ip)
+ if dst_macs_count == chain_count:
+ arp_dest_macs[port] = dst_macs
+ LOG.info('ARP resolved successfully for port %s', port)
+ break
+
+ retry = attempt + 1
+ LOG.info('Retrying ARP for: %s (retry %d/%d)',
+ unresolved, retry, self.config.generic_retry_count)
+ if retry < self.config.generic_retry_count:
+ time.sleep(self.config.generic_poll_sec)
+ else:
+ LOG.error('ARP timed out for port %s (resolved %d out of %d)',
+ port,
+ dst_macs_count,
+ chain_count)
+ break
+
+ # A traffic capture may have been started (from a T-Rex console) at this time.
+ # If asked so, we keep the service mode enabled here, and disable it otherwise.
+ # | Disabling the service mode while a capture is in progress
+ # | would cause the application to stop/crash with an error.
+ if not self.config.service_mode:
+ self.client.set_service_mode(ports=self.port_handle, enabled=False)
+ if len(arp_dest_macs) == len(self.port_handle):
+ return arp_dest_macs
+ return None
+
+ def __is_rate_enough(self, l2frame_size, rates, bidirectional, latency):
+ """Check if rate provided by user is above requirements. Applies only if latency is True."""
+ intf_speed = self.generator_config.intf_speed
+ if latency:
+ if bidirectional:
+ mult = 2
+ total_rate = 0
+ for rate in rates:
+ r = utils.convert_rates(l2frame_size, rate, intf_speed)
+ total_rate += int(r['rate_pps'])
+ else:
+ mult = 1
+ r = utils.convert_rates(l2frame_size, rates[0], intf_speed)
+ total_rate = int(r['rate_pps'])
+ # rate must be enough for latency stream and at least 1 pps for base stream per chain
+ if self.config.periodic_gratuitous_arp:
+ required_rate = (self.LATENCY_PPS + 1 + self.config.gratuitous_arp_pps) \
+ * self.config.service_chain_count * mult
+ else:
+ required_rate = (self.LATENCY_PPS + 1) * self.config.service_chain_count * mult
+ result = utils.convert_rates(l2frame_size,
+ {'rate_pps': required_rate},
+ intf_speed * mult)
+ result['result'] = total_rate >= required_rate
+ return result
+
+ return {'result': True}
+
+ def create_traffic(self, l2frame_size, rates, bidirectional, latency=True, e2e=False):
+ """Program all the streams in Trex server.
+
+ l2frame_size: L2 frame size or IMIX
+ rates: a list of 2 rates to run each direction
+ each rate is a dict like {'rate_pps': '10kpps'}
+ bidirectional: True if bidirectional
+ latency: True if latency measurement is needed
+ e2e: True if performing "end to end" connectivity check
+ """
+ if self.config.no_flow_stats:
+ LOG.info("Traffic flow statistics are disabled.")
+ r = self.__is_rate_enough(l2frame_size, rates, bidirectional, latency)
+ if not r['result']:
+ raise TrafficGeneratorException(
+ 'Required rate in total is at least one of: \n{pps}pps \n{bps}bps \n{load}%.'
+ .format(pps=r['rate_pps'],
+ bps=r['rate_bps'],
+ load=r['rate_percent']))
+ self.l2_frame_size = l2frame_size
+ # a dict of list of streams indexed by port#
+ # in case of fixed size, has self.chain_count * 2 * 2 streams
+ # (1 normal + 1 latency stream per direction per chain)
+ # for IMIX, has self.chain_count * 2 * 4 streams
+ # (3 normal + 1 latency stream per direction per chain)
+ streamblock = {}
+ for port in self.port_handle:
+ streamblock[port] = []
+ stream_cfgs = [d.get_stream_configs() for d in self.generator_config.devices]
+ if self.generator_config.ip_addrs_step == 'random' \
+ or self.generator_config.gen_config.udp_port_step == 'random':
+ LOG.warning("Using random step, the number of flows can be less than "
+ "the requested number of flows due to repeatable multivariate random "
+ "generation which can reproduce the same pattern of values")
+ self.rates = [utils.to_rate_str(rate) for rate in rates]
+ for chain_id, (fwd_stream_cfg, rev_stream_cfg) in enumerate(zip(*stream_cfgs)):
+ streamblock[0].extend(self.generate_streams(self.port_handle[0],
+ chain_id,
+ fwd_stream_cfg,
+ l2frame_size,
+ latency=latency,
+ e2e=e2e))
+ if len(self.rates) > 1:
+ streamblock[1].extend(self.generate_streams(self.port_handle[1],
+ chain_id,
+ rev_stream_cfg,
+ l2frame_size,
+ latency=bidirectional and latency,
+ e2e=e2e))
+
+ for port in self.port_handle:
+ if self.config.vxlan:
+ self.client.set_port_attr(ports=port, vxlan_fs=[4789])
+ else:
+ self.client.set_port_attr(ports=port, vxlan_fs=None)
+ self.client.add_streams(streamblock[port], ports=port)
+ LOG.info('Created %d traffic streams for port %s.', len(streamblock[port]), port)
+
+ def clear_streamblock(self):
+ """Clear all streams from TRex."""
+ self.rates = []
+ self.client.reset(self.port_handle)
+ LOG.info('Cleared all existing streams')
+
+ def get_stats(self, ifstats=None):
+ """Get stats from Trex."""
+ stats = self.client.get_stats()
+ return self.extract_stats(stats, ifstats)
+
+ def get_macs(self):
+ """Return the Trex local port MAC addresses.
+
+ return: a list of MAC addresses indexed by the port#
+ """
+ return [port['src_mac'] for port in self.port_info]
+
+ def get_port_speed_gbps(self):
+ """Return the Trex local port MAC addresses.
+
+ return: a list of speed in Gbps indexed by the port#
+ """
+ return [port['speed'] for port in self.port_info]
+
+ def clear_stats(self):
+ """Clear all stats in the traffic gneerator."""
+ if self.port_handle:
+ self.client.clear_stats()
+
+ def start_traffic(self):
+ """Start generating traffic in all ports."""
+ for port, rate in zip(self.port_handle, self.rates):
+ self.client.start(ports=port, mult=rate, duration=self.config.duration_sec, force=True)
+
+ def stop_traffic(self):
+ """Stop generating traffic."""
+ self.client.stop(ports=self.port_handle)
+
+ def start_capture(self):
+ """Capture all packets on both ports that are unicast to us."""
+ if self.capture_id:
+ self.stop_capture()
+ # Need to filter out unwanted packets so we do not end up counting
+ # src MACs of frames that are not unicast to us
+ src_mac_list = self.get_macs()
+ bpf_filter = "ether dst %s or ether dst %s" % (src_mac_list[0], src_mac_list[1])
+ # ports must be set in service in order to enable capture
+ self.client.set_service_mode(ports=self.port_handle)
+ self.capture_id = self.client.start_capture \
+ (rx_ports=self.port_handle, bpf_filter=bpf_filter)
+
+ def fetch_capture_packets(self):
+ """Fetch capture packets in capture mode."""
+ if self.capture_id:
+ self.packet_list = []
+ self.client.fetch_capture_packets(capture_id=self.capture_id['id'],
+ output=self.packet_list)
+
+ def stop_capture(self):
+ """Stop capturing packets."""
+ if self.capture_id:
+ self.client.stop_capture(capture_id=self.capture_id['id'])
+ self.capture_id = None
+ # A traffic capture may have been started (from a T-Rex console) at this time.
+ # If asked so, we keep the service mode enabled here, and disable it otherwise.
+ # | Disabling the service mode while a capture is in progress
+ # | would cause the application to stop/crash with an error.
+ if not self.config.service_mode:
+ self.client.set_service_mode(ports=self.port_handle, enabled=False)
+
+ def cleanup(self):
+ """Cleanup Trex driver."""
+ if self.client:
+ try:
+ self.client.reset(self.port_handle)
+ self.client.disconnect()
+ except STLError:
+ # TRex does not like a reset while in disconnected state
+ pass
+
+ def set_service_mode(self, enabled=True):
+ """Enable/disable the 'service' mode."""
+ self.client.set_service_mode(ports=self.port_handle, enabled=enabled)
diff --git a/nfvbench/traffic_server.py b/nfvbench/traffic_server.py
index fe9edd2..5111b32 100644
--- a/nfvbench/traffic_server.py
+++ b/nfvbench/traffic_server.py
@@ -16,7 +16,7 @@ import os
import subprocess
import yaml
-from log import LOG
+from .log import LOG
class TrafficServerException(Exception):
@@ -34,34 +34,149 @@ class TRexTrafficServer(TrafficServer):
assert len(contents) == 1
self.trex_dir = os.path.join(trex_base_dir, contents[0])
- def run_server(self, traffic_profile, filename='/etc/trex_cfg.yaml'):
- """
- Runs TRex server for specified traffic profile.
+ def run_server(self, generator_config, filename='/etc/trex_cfg.yaml'):
+ """Run TRex server for specified traffic profile.
:param traffic_profile: traffic profile object based on config file
:param filename: path where to save TRex config file
"""
- cfg = self.__save_config(traffic_profile, filename)
- cores = traffic_profile.cores
- sw_mode = "--software" if traffic_profile.software_mode else ""
- subprocess.Popen(['nohup', '/bin/bash', '-c',
- './t-rex-64 -i -c {} --iom 0 --no-scapy-server --close-at-end {} '
- '--vlan --cfg {} &> /tmp/trex.log & disown'.format(cores, sw_mode, cfg)],
- cwd=self.trex_dir)
- LOG.info('TRex server is running...')
-
- def __save_config(self, traffic_profile, filename):
- ifs = ",".join([repr(pci) for pci in traffic_profile.pcis])
-
- result = """# Config generated by NFVBench tool
- - port_limit : 2
- version : 2
- interfaces : [{ifs}]""".format(ifs=ifs)
+ cfg = self.__save_config(generator_config, filename)
+ cores = generator_config.cores
+ vtep_vlan = generator_config.gen_config.get('vtep_vlan')
+ sw_mode = "--software" if generator_config.software_mode else ""
+ vlan_opt = "--vlan" if (generator_config.vlan_tagging or vtep_vlan) else ""
+ if generator_config.mbuf_factor:
+ mbuf_opt = "--mbuf-factor " + str(generator_config.mbuf_factor)
+ else:
+ mbuf_opt = ""
+ hdrh_opt = "--hdrh" if generator_config.hdrh else ""
+ # --unbind-unused-ports: for NIC that have more than 2 ports such as Intel X710
+ # this will instruct trex to unbind all ports that are unused instead of
+ # erroring out with an exception (i40e only)
+ # Try: --ignore-528-issue -> neither unbind nor exit with error,
+ # just proceed cause it might work!
+ # Note that force unbinding is probably a bad choice:
+ # we can't assume for sure that other ports are "unused".
+ # The default TRex behaviour - exit - is indeed a safer option;
+ # a message informs about the ports that should be unbound.
+ i40e_opt = ("--ignore-528-issue" if
+ generator_config.config.i40e_mixed == 'ignore' else
+ "--unbind-unused-ports" if
+ generator_config.config.i40e_mixed == 'unbind' else "")
+ cmd = ['nohup', '/bin/bash', '-c',
+ './t-rex-64 -i -c {} --iom 0 --no-scapy-server '
+ '--close-at-end {} {} {} '
+ '{} {} --cfg {} &> /tmp/trex.log & disown'.format(cores, sw_mode,
+ i40e_opt,
+ vlan_opt,
+ hdrh_opt,
+ mbuf_opt, cfg)]
+ LOG.info(' '.join(cmd))
+ with subprocess.Popen(cmd, cwd=self.trex_dir) as trex_process:
+ LOG.info('TRex server is running (PID: %s)...', trex_process.pid)
+
+ def __load_config(self, filename):
+ result = {}
+ if os.path.exists(filename):
+ with open(filename, 'r', encoding="utf-8") as stream:
+ try:
+ result = yaml.safe_load(stream)
+ except yaml.YAMLError as exc:
+ print(exc)
+ return result
+ def __save_config(self, generator_config, filename):
+ result = self.__prepare_config(generator_config)
yaml.safe_load(result)
if os.path.exists(filename):
os.remove(filename)
- with open(filename, 'w') as f:
+ with open(filename, 'w', encoding="utf-8") as f:
f.write(result)
-
return filename
+
+ def __prepare_config(self, generator_config):
+ ifs = ",".join([repr(pci) for pci in generator_config.pcis])
+
+ # For consistency and stability reasons, the T-Rex server
+ # should be forciby restarted each time the value of a
+ # parameter, specified as one of the starting command line
+ # arguments, has been modified since the last launch.
+ # Hence we add some extra fields to the config file
+ # (nb_cores, use_vlan, mbuf_factor, i40e_mixed, hdrh)
+ # which will serve as a memory between runs -
+ # while being actually ignored by the T-Rex server.
+
+ result = """# Config generated by NFVbench
+ - port_limit : 2
+ version : 2
+ zmq_pub_port : {zmq_pub_port}
+ zmq_rpc_port : {zmq_rpc_port}
+ prefix : {prefix}
+ limit_memory : {limit_memory}
+ command_line :
+ sw_mode : {sw_mode}
+ mbuf_factor: {mbuf_factor}
+ hdrh : {hdrh}
+ nb_cores : {nb_cores}
+ use_vlan : {use_vlan}
+ i40e_mixed : {i40e_mixed}
+ interfaces : [{ifs}]""".format(
+ zmq_pub_port=generator_config.zmq_pub_port,
+ zmq_rpc_port=generator_config.zmq_rpc_port,
+ prefix=generator_config.name,
+ limit_memory=generator_config.limit_memory,
+ sw_mode=generator_config.software_mode,
+ mbuf_factor=generator_config.mbuf_factor,
+ hdrh=generator_config.hdrh,
+ nb_cores=generator_config.cores,
+ use_vlan=generator_config.gen_config.get('vtep_vlan') or
+ generator_config.vlan_tagging,
+ i40e_mixed=generator_config.config.i40e_mixed,
+ ifs=ifs)
+
+ if hasattr(generator_config, 'mbuf_64') and generator_config.mbuf_64:
+ result += """
+ memory :
+ mbuf_64 : {mbuf_64}""".format(mbuf_64=generator_config.mbuf_64)
+
+ if self.__check_platform_config(generator_config):
+ try:
+ platform = """
+ platform :
+ master_thread_id : {master_thread_id}
+ latency_thread_id : {latency_thread_id}
+ dual_if:""".format(master_thread_id=generator_config.gen_config.platform.
+ master_thread_id,
+ latency_thread_id=generator_config.gen_config.platform.
+ latency_thread_id)
+ result += platform
+
+ for core in generator_config.gen_config.platform.dual_if:
+ threads = ""
+ try:
+ threads = ",".join([repr(thread) for thread in core.threads])
+ except TypeError:
+ LOG.warning("No threads defined for socket %s", core.socket)
+ core_result = """
+ - socket : {socket}
+ threads : [{threads}]""".format(socket=core.socket, threads=threads)
+ result += core_result
+ except (KeyError, AttributeError):
+ pass
+ return result + "\n"
+
+ def __check_platform_config(self, generator_config):
+ return hasattr(generator_config.gen_config, 'platform') \
+ and hasattr(generator_config.gen_config.platform, "master_thread_id") \
+ and generator_config.gen_config.platform.master_thread_id is not None \
+ and hasattr(generator_config.gen_config.platform, "latency_thread_id") \
+ and generator_config.gen_config.platform.latency_thread_id is not None
+
+ def check_config_updated(self, generator_config):
+ existing_config = self.__load_config(filename='/etc/trex_cfg.yaml')
+ new_config = yaml.safe_load(self.__prepare_config(generator_config))
+ LOG.debug("Existing config: %s", existing_config)
+ LOG.debug("New config: %s", new_config)
+ if existing_config == new_config:
+ return False
+ return True
diff --git a/nfvbench/utils.py b/nfvbench/utils.py
index 20dc588..07a38cb 100644
--- a/nfvbench/utils.py
+++ b/nfvbench/utils.py
@@ -12,6 +12,9 @@
# License for the specific language governing permissions and limitations
# under the License.
+import glob
+import time
+from math import gcd
from math import isnan
import os
import re
@@ -22,8 +25,9 @@ import errno
import fcntl
from functools import wraps
import json
-from log import LOG
-
+from .log import LOG
+from nfvbench.traffic_gen.traffic_utils import multiplier_map
+from novaclient.exceptions import NotFound
class TimeoutError(Exception):
pass
@@ -49,7 +53,7 @@ def timeout(seconds=10, error_message=os.strerror(errno.ETIME)):
def save_json_result(result, json_file, std_json_path, service_chain, service_chain_count,
- flow_count, frame_sizes):
+ flow_count, frame_sizes, user_id=None, group_id=None):
"""Save results in json format file."""
filepaths = []
if json_file:
@@ -62,69 +66,100 @@ def save_json_result(result, json_file, std_json_path, service_chain, service_ch
if filepaths:
for file_path in filepaths:
LOG.info('Saving results in json file: %s...', file_path)
- with open(file_path, 'w') as jfp:
+ with open(file_path, 'w', encoding="utf-8") as jfp:
json.dump(result,
jfp,
indent=4,
sort_keys=True,
separators=(',', ': '),
default=lambda obj: obj.to_json())
-
-
-def byteify(data, ignore_dicts=False):
- # if this is a unicode string, return its string representation
- if isinstance(data, unicode):
- return data.encode('utf-8')
- # if this is a list of values, return list of byteified values
- if isinstance(data, list):
- return [byteify(item, ignore_dicts=ignore_dicts) for item in data]
- # if this is a dictionary, return dictionary of byteified keys and values
- # but only if we haven't already byteified it
- if isinstance(data, dict) and not ignore_dicts:
- return {byteify(key, ignore_dicts=ignore_dicts): byteify(value, ignore_dicts=ignore_dicts)
- for key, value in data.iteritems()}
- # if it's anything else, return it in its original form
- return data
+ # possibly change file ownership
+ if group_id is None:
+ group_id = user_id
+ if user_id is not None:
+ os.chown(file_path, user_id, group_id)
def dict_to_json_dict(record):
return json.loads(json.dumps(record, default=lambda obj: obj.to_json()))
-def get_intel_pci(nic_ports):
- """Returns the first two PCI addresses of sorted PCI list for Intel NIC (i40e, ixgbe)"""
- hx = r'[0-9a-fA-F]'
- regex = r'{hx}{{4}}:({hx}{{2}}:{hx}{{2}}\.{hx}{{1}}).*(drv={driver}|.*unused=.*{driver})'
+def get_intel_pci(nic_slot=None, nic_ports=None):
+ """Returns two PCI address that will be used for NFVbench
+
+ @param nic_slot: The physical PCIe slot number in motherboard
+ @param nic_ports: Array of two integers indicating the ports to use on the NIC
+
+ When nic_slot and nic_ports are both supplied, the function will just return
+ the PCI addresses for them. The logic used is:
+ (1) Run "dmidecode -t slot"
+ (2) Grep for "SlotID:" with given nic_slot, and derive the bus address;
+ (3) Based on given nic_ports, generate the pci addresses based on above
+ base address;
+
+ When either nic_slot or nic_ports is not supplied, the function will
+ traverse all Intel NICs which use i40e or ixgbe driver, sorted by PCI
+ address, and return first two available ports which are not bonded
+ (802.11ad).
+ """
+
+ if nic_slot and nic_ports:
+ dmidecode = subprocess.check_output(['dmidecode', '-t', 'slot'])
+ regex = r"(?<=SlotID:{}).*?(....:..:..\..)".format(nic_slot)
+ match = re.search(regex, dmidecode.decode('utf-8'), flags=re.DOTALL)
+ if not match:
+ return None
+ pcis = []
+ # On some servers, the "Bus Address" returned by dmidecode is not the
+ # base pci address of the NIC. So only keeping the bus part of the
+ # address for better compability.
+ bus = match.group(1)[:match.group(1).rindex(':') + 1] + "00."
+ for port in nic_ports:
+ pcis.append(bus + str(port))
+
+ return pcis
+
+ hx = r'[0-9a-fA-F]'
+ regex = r'({hx}{{4}}:({hx}{{2}}:{hx}{{2}}\.{hx}{{1}})).*(drv={driver}|.*unused=.*{driver})'
+ pcis = []
try:
trex_base_dir = '/opt/trex'
contents = os.listdir(trex_base_dir)
trex_dir = os.path.join(trex_base_dir, contents[0])
- process = subprocess.Popen(['python', 'dpdk_setup_ports.py', '-s'],
- cwd=trex_dir,
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- devices, _ = process.communicate()
+ with subprocess.Popen(['python', 'dpdk_setup_ports.py', '-s'],
+ cwd=trex_dir,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE) as process:
+ devices, _ = process.communicate()
except Exception:
devices = ''
for driver in ['i40e', 'ixgbe']:
- matches = re.findall(regex.format(hx=hx, driver=driver), devices)
- if matches:
- pcis = [x[0] for x in matches]
- if len(pcis) < 2:
- continue
- pcis.sort()
- return [pcis[port_index] for port_index in nic_ports]
-
- return []
-
-
-multiplier_map = {
- 'K': 1000,
- 'M': 1000000,
- 'G': 1000000000
-}
+ matches = re.findall(regex.format(hx=hx, driver=driver), devices.decode("utf-8"))
+ if not matches:
+ continue
+
+ matches.sort()
+ device_list = list(x[0].split('.')[0] for x in matches)
+ device_ports_list = {i: {'ports': device_list.count(i)} for i in device_list}
+ for port in matches:
+ intf_name = glob.glob("/sys/bus/pci/devices/%s/net/*" % port[0])
+ if intf_name:
+ intf_name = intf_name[0][intf_name[0].rfind('/') + 1:]
+ with subprocess.Popen(['ip', '-o', '-d', 'link', 'show', intf_name],
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE) as process:
+ intf_info, _ = process.communicate()
+ if re.search('team_slave|bond_slave', intf_info.decode("utf-8")):
+ device_ports_list[port[0].split('.')[0]]['busy'] = True
+ for port in matches:
+ if not device_ports_list[port[0].split('.')[0]].get('busy'):
+ pcis.append(port[1])
+ if len(pcis) == 2:
+ break
+
+ return pcis
def parse_flow_count(flow_count):
@@ -138,13 +173,14 @@ def parse_flow_count(flow_count):
try:
flow_count = int(flow_count)
except ValueError:
- raise Exception("Unknown flow count format '{}'".format(input_fc))
+ raise Exception("Unknown flow count format '{}'".format(input_fc)) from ValueError
return flow_count * multiplier
def cast_integer(value):
- return int(value) if not isnan(value) else value
+ # force 0 value if NaN value from TRex to avoid error in JSON result parsing
+ return int(value) if not isnan(value) else 0
class RunLock(object):
@@ -161,8 +197,8 @@ class RunLock(object):
try:
self._fd = os.open(self._path, os.O_CREAT)
fcntl.flock(self._fd, fcntl.LOCK_EX | fcntl.LOCK_NB)
- except (OSError, IOError):
- raise Exception('Other NFVbench process is running. Please wait')
+ except (OSError, IOError) as e:
+ raise Exception('Other NFVbench process is running. Please wait') from e
def __exit__(self, *args):
fcntl.flock(self._fd, fcntl.LOCK_UN)
@@ -174,3 +210,82 @@ class RunLock(object):
os.unlink(self._path)
except (OSError, IOError):
pass
+
+
+def get_divisors(n):
+ for i in range(1, int(n / 2) + 1):
+ if n % i == 0:
+ yield i
+ yield n
+
+
+def lcm(a, b):
+ """
+ Calculate the maximum possible value for both IP and ports,
+ eventually for maximum possible flow.
+ """
+ if a != 0 and b != 0:
+ lcm_value = a * b // gcd(a, b)
+ return lcm_value
+ raise TypeError(" IP size or port range can't be zero !")
+
+
+def find_tuples_equal_to_lcm_value(a, b, lcm_value):
+ """
+ Find numbers from two list matching a LCM value.
+ """
+ for x in a:
+ for y in b:
+ if lcm(x, y) == lcm_value:
+ yield (x, y)
+
+
+def find_max_size(max_size, tuples, flow):
+ if tuples:
+ if max_size > tuples[-1][0]:
+ max_size = tuples[-1][0]
+ return int(max_size)
+ if max_size > tuples[-1][1]:
+ max_size = tuples[-1][1]
+ return int(max_size)
+
+ for i in range(max_size, 1, -1):
+ if flow % i == 0:
+ return int(i)
+ return 1
+
+
+def delete_server(nova_client, server):
+ try:
+ LOG.info('Deleting instance %s...', server.name)
+ nova_client.servers.delete(server.id)
+ except Exception:
+ LOG.exception("Instance %s deletion failed", server.name)
+
+
+def instance_exists(nova_client, server):
+ try:
+ nova_client.servers.get(server.id)
+ except NotFound:
+ return False
+ return True
+
+
+def waiting_servers_deletion(nova_client, servers):
+ LOG.info(' Waiting for %d instances to be fully deleted...', len(servers))
+ retry_count = 15 + len(servers) * 5
+ while True:
+ retry_count -= 1
+ servers = [server for server in servers if instance_exists(nova_client, server)]
+ if not servers:
+ break
+
+ if retry_count:
+ LOG.info(' %d yet to be deleted by Nova, retries left=%d...',
+ len(servers), retry_count)
+ time.sleep(2)
+ else:
+ LOG.warning(
+ ' instance deletion verification time-out: %d still not deleted',
+ len(servers))
+ break
diff --git a/nfvbenchvm/README.rst b/nfvbenchvm/README.rst
deleted file mode 100644
index 1bf0bbf..0000000
--- a/nfvbenchvm/README.rst
+++ /dev/null
@@ -1,86 +0,0 @@
-NFVBENCH VM IMAGE FOR OPENSTACK
-+++++++++++++++++++++++++++++++
-
-This repo will build a centos 7 image with testpmd and VPP installed.
-The VM will come with a pre-canned user/password: nfvbench/nfvbench
-
-BUILD INSTRUCTIONS
-==================
-
-Pre-requisites
---------------
-- must run on Linux
-- the following packages must be installed prior to using this script:
- - git
- - qemu-utils
- - kpartx
-
-Build the image
----------------
-- cd dib
-- update the version number for the image (if needed) by modifying __version__ in build-image.sh
-- setup your http_proxy if needed
-- bash build-image.sh
-
-IMAGE INSTANCE AND CONFIG
-=========================
-
-Interface Requirements
-----------------------
-The instance must be launched using OpenStack with 2 network interfaces.
-For best performance, it should use a flavor with:
-
-- 2 vCPU
-- 4 GB RAM
-- cpu pinning set to exclusive
-
-Auto-configuration
-------------------
-nfvbench VM will automatically find the two virtual interfaces to use, and use the forwarder specifed in the config file.
-
-In the case testpmd is used, testpmd will be launched with mac forwarding mode where the destination macs rewritten according to the config file.
-
-In the case VPP is used, VPP will set up a L3 router, and forwarding traffic from one port to the other.
-
-nfvbenchvm Config
------------------
-nfvbenchvm config file is located at ``/etc/nfvbenchvm.conf``.
-
-.. code-block:: bash
-
- FORWARDER=testpmd
- INTF_MAC1=FA:16:3E:A2:30:41
- INTF_MAC2=FA:16:3E:10:DA:10
- TG_MAC1=00:10:94:00:0A:00
- TG_MAC2=00:11:94:00:0A:00
- VNF_GATEWAY1_CIDR=1.1.0.2/8
- VNF_GATEWAY2_CIDR=2.2.0.2/8
- TG_NET1=10.0.0.0/8
- TG_NET2=20.0.0.0/8
- TG_GATEWAY1_IP=1.1.0.100
- TG_GATEWAY2_IP=2.2.0.100
-
-
-Launching nfvbenchvm VM
------------------------
-
-Normally this image will be used together with NFVBench, and the required configurations will be automatically generated and pushed to VM by NFVBench. If launched manually, no forwarder will be run. Users will have the full control to run either testpmd or VPP via VNC console.
-
-To check if testpmd is running, you can run this command in VNC console:
-
-.. code-block:: bash
-
- sudo screen -r testpmd
-
-To check if VPP is running, you can run this command in VNC console:
-
-.. code-block:: bash
-
- service vpp status
-
-
-Hardcoded Username and Password
---------------------------------
-- Username: nfvbench
-- Password: nfvbench
-
diff --git a/nfvbenchvm/dib/build-image.sh b/nfvbenchvm/dib/build-image.sh
index 88cf2e5..c320192 100755
--- a/nfvbenchvm/dib/build-image.sh
+++ b/nfvbenchvm/dib/build-image.sh
@@ -1,63 +1,247 @@
#!/bin/bash
#
-# A shell script to build the VPP VM image using diskinage-builder
+# A shell script to build the VPP VM image or NFVbench+TRex VM image using diskinage-builder
#
# The following packages must be installed prior to using this script:
-# sudo apt-get -y install python-virtualenv qemu-utils kpartx
+# Ubuntu: sudo apt-get -y install python3 python3-venv qemu-utils kpartx
+# CentOS: sudo yum install -y python3 qemu-img kpartx
-set -e
+# Stop on error (see https://wizardzines.com/comics/bash-errors/)
+set -euo pipefail
+
+DEBUG=no
+verify_only=0
+build_generator=0
+build_loopvm=0
+__prefix__=""
# Artifact URL
gs_url=artifacts.opnfv.org/nfvbench/images
# image version number
-__version__=0.5
-image_name=nfvbenchvm_centos-$__version__
-
-# if image exists skip building
-if command -v gsutil >/dev/null; then
- if gsutil -q stat gs://$gs_url/$image_name.qcow2; then
- echo "Image already exists at http://$gs_url/$image_name.qcow2"
- exit 0
- fi
-else
- echo "Cannot check image availability in OPNFV artifact repository (gsutil not available)"
+__loopvm_version__=0.16
+__generator_version__=0.15
+loopvm_image_name=nfvbenchvm_centos-$__loopvm_version__
+generator_image_name=nfvbenchvm_centos-generator-$__generator_version__
+
+# Default values for nfvbenchvm dib element variables
+export DIB_NFVBENCH_CODE_ORIGIN=opnfv-gerrit
+
+
+# ----------------------------------------------------------------------------
+# Parse command line options and configure the script
+# ----------------------------------------------------------------------------
+
+usage() {
+ cat <<EOF
+$(basename $0) - build NFVbench VM images
+Usage:
+ $(basename $0) [OPTIONS]
+
+OPTIONS
+ -l: build NFVbench loop VM image
+ -g: build NFVbench generator image
+ -v: verify only (build but do not push to google storage)
+ -s: use local nfvbench code instead of cloning from OPNFV gerrit
+ (only relevant for NFVbench generator image)
+
+ -t: enable debug trace (set -x + DIB_DEBUG_TRACE=1)
+ -d: start debug shell in image chroot in case of build error
+ -h: show this help message
+EOF
+ exit 1
+}
+
+while getopts ":lgvstdh" opt; do
+ case $opt in
+ l)
+ build_loopvm=1
+ ;;
+ g)
+ build_generator=1
+ ;;
+ v)
+ verify_only=1
+ ;;
+ s)
+ export DIB_NFVBENCH_CODE_ORIGIN=static
+ ;;
+ t)
+ set -x
+ export DIB_DEBUG_TRACE=1
+ ;;
+ d)
+ DEBUG=yes
+ ;;
+ h)
+ usage
+ exit 0
+ ;;
+ ?)
+ usage
+ exit 1
+ ;;
+ esac
+done
+
+
+# Build all VM images if the image to build is not specified on the CLI
+if [[ $build_generator -eq 0 ]] && [[ $build_loopvm -eq 0 ]]; then
+ build_generator=1
+ build_loopvm=1
fi
-# install diskimage-builder
-if [ -d dib-venv ]; then
- . dib-venv/bin/activate
-else
- virtualenv dib-venv
- . dib-venv/bin/activate
- pip install diskimage-builder
+if [[ "${DIB_NFVBENCH_CODE_ORIGIN}" == "static" ]] && [[ $build_generator -eq 0 ]]; then
+ echo "Error: option -s is only relevant to the build of the generator image"
+ exit 1
fi
-# Add nfvbenchvm_centos elements directory to the DIB elements path
-export ELEMENTS_PATH=`pwd`/elements
-# canned user/password for direct login
-export DIB_DEV_USER_USERNAME=nfvbench
-export DIB_DEV_USER_PASSWORD=nfvbench
-export DIB_DEV_USER_PWDLESS_SUDO=Y
+# ----------------------------------------------------------------------------
+# Copy local nfvbench code to elements/nfvbenchvm/static/opt/nfvbench
+# ----------------------------------------------------------------------------
+
+function copy_local_nfvbench_code_to_static_dir {
+ echo "Copy local nfvbench code to elements/nfvbenchvm/static/opt"
+ # Create elements/nfvbenchvm/static/opt/ directory if it does not exist and
+ # move there
+ pushd $(dirname $0)/elements/nfvbenchvm/static
+ [ -d opt ] || mkdir opt
+ cd opt
+
+ # Remove nfvbench code if it is already there
+ [ -d nfvbench ] && rm -rf nfvbench
+
+ # Use git to "copy" the local nfvbench code.
+ # This will include all the committed changes of the current branch.
+ git clone ../../../../../.. nfvbench
+
+ # Go back to the current directory when this function was called
+ popd
+}
+
+
+# ----------------------------------------------------------------------------
+# Configure and start the nfvbenchvm image build
+# ----------------------------------------------------------------------------
+
+function build_image {
+ # if image exists skip building
+ echo "Checking if image exists in google storage..."
+ if command -v gsutil >/dev/null; then
+ if gsutil -q stat gs://$gs_url/$1.qcow2; then
+ echo "Image already exists at https://$gs_url/$1.qcow2"
+ echo "Build is skipped"
+ exit 0
+ fi
+ echo "Image does not exist in google storage, starting build..."
+ echo
+ else
+ echo "Cannot check image availability in OPNFV artifact repository (gsutil not available)"
+ fi
+
+ # check if image is already built locally
+ if [ -f $1.qcow2 ]; then
+ echo "Image $1.qcow2 already exists locally"
+ else
+ # install diskimage-builder
+ if [ -d dib-venv ]; then
+ . dib-venv/bin/activate
+ else
+ python3 -m venv dib-venv
+ . dib-venv/bin/activate
+ pip install diskimage-builder==3.16.0
+ fi
+
+ # Add nfvbenchvm_centos elements directory to the DIB elements path
+ export ELEMENTS_PATH=`pwd`/elements
+
+ # canned user/password for direct login
+ export DIB_DEV_USER_USERNAME=nfvbench
+ export DIB_DEV_USER_PASSWORD=nfvbench
+ export DIB_DEV_USER_PWDLESS_SUDO=Y
+
+ # Set the data sources to have ConfigDrive only
+ export DIB_CLOUD_INIT_DATASOURCES="ConfigDrive"
+
+ # Configure VPP REPO
+ export DIB_YUM_REPO_CONF=$ELEMENTS_PATH/nfvbenchvm/fdio-release.repo
+
+ # Use ELRepo to have latest kernel
+ # only for loop vm image
+ if [ $1 = $loopvm_image_name ]; then
+ export DIB_USE_ELREPO_KERNEL=True
+ export DIB_DEV_IMAGE=loopvm
+ else
+ export DIB_USE_ELREPO_KERNEL=False
+ export DIB_DEV_IMAGE=generator
+ # get current git branch to build image with current code
+ export GIT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
+ # retrieve TREX_VER from Dockerfile
+ export TREX_VER=$(awk '/ENV TREX_VER/ {print $3}' ../../docker/Dockerfile | sed 's/"//g' | sed 's/\r//g')
+ fi
+
+ # Specify CentOS version
+ export DIB_RELEASE=7
+
+ # Debug on error: if an error occurs during the build, disk-image-create
+ # will drop us in a Bash inside the chroot, and we will be able to inspect
+ # the current state of the image.
+ if [[ "${DEBUG}" == "yes" ]]; then
+ export break=after-error
+ fi
-# Set the data sources to have ConfigDrive only
-export DIB_CLOUD_INIT_DATASOURCES="ConfigDrive"
+ echo "Building $1.qcow2..."
+ time disk-image-create -o $1 centos nfvbenchvm
+ fi
+
+ ls -l $1.qcow2
-# Configure VPP REPO
-export DIB_YUM_REPO_CONF=$ELEMENTS_PATH/nfvbenchvm/fdio-release.repo
+ if [ $verify_only -eq 1 ]; then
+ echo "Image verification SUCCESS"
+ echo "NO upload to google storage (-v)"
+ else
+ if command -v gsutil >/dev/null; then
+ echo "Uploading $1.qcow2..."
+ gsutil cp $1.qcow2 gs://$gs_url/$1.qcow2
+ echo "You can access to image at https://$gs_url/$1.qcow2"
+ else
+ echo "Cannot upload new image to the OPNFV artifact repository (gsutil not available)"
+ exit 1
+ fi
+ fi
+}
-# Use ELRepo to have latest kernel
-export DIB_USE_ELREPO_KERNEL=True
-echo "Building $image_name.qcow2..."
-time disk-image-create -o $image_name centos7 nfvbenchvm
-ls -l $image_name.qcow2
+# ----------------------------------------------------------------------------
+# Main program
+# ----------------------------------------------------------------------------
+
+if [ $build_loopvm -eq 1 ]; then
+ echo "Build loop VM image"
+ build_image $loopvm_image_name
+fi
+
+if [ $build_generator -eq 1 ]; then
+ echo "Build generator image"
+
+ if [[ "${DIB_NFVBENCH_CODE_ORIGIN}" == "static" ]]; then
+ echo "Use local nfvbench code"
+ copy_local_nfvbench_code_to_static_dir
+
+ # Append nfvbench version number to the image name:
+ # during development, this is useful to distinguish the development
+ # images from the latest published image.
+ #
+ # To avoid confusion, we use the same versioning as nfvbench (see
+ # nfvbench/__init__.py), although "git describe" would give us a better
+ # number with respect to uniqueness. So we will typically get something
+ # like "5.0.4.dev31" where "5.0.4" is the latest annotated tag ("5.0.3")
+ # plus one and where dev31 indicates the number of commits (31) since
+ # that tag.
+ nfvbench_version=$(python -c 'import pbr.version; print(pbr.version.VersionInfo("nfvbench").version_string_with_vcs())')
+ generator_image_name="${generator_image_name}-${nfvbench_version}"
+ fi
-if command -v gsutil >/dev/null; then
- echo "Uploading $image_name.qcow2..."
- gsutil cp $image_name.qcow2 gs://$gs_url/$image_name.qcow2
- echo "You can access to image at http://$gs_url/$image_name.qcow2"
-else
- echo "Cannot upload new image to the OPNFV artifact repository (gsutil not available)"
+ build_image $generator_image_name
fi
diff --git a/nfvbenchvm/dib/elements/nfvbenchvm/element-deps b/nfvbenchvm/dib/elements/nfvbenchvm/element-deps
index c6be0aa..7fd8e5b 100644
--- a/nfvbenchvm/dib/elements/nfvbenchvm/element-deps
+++ b/nfvbenchvm/dib/elements/nfvbenchvm/element-deps
@@ -1,4 +1,5 @@
vm
+block-device-mbr
cloud-init-datasources
install-static
package-installs
diff --git a/nfvbenchvm/dib/elements/nfvbenchvm/fdio-release.repo b/nfvbenchvm/dib/elements/nfvbenchvm/fdio-release.repo
index 3ad12fb..6b980c1 100644
--- a/nfvbenchvm/dib/elements/nfvbenchvm/fdio-release.repo
+++ b/nfvbenchvm/dib/elements/nfvbenchvm/fdio-release.repo
@@ -1,5 +1,11 @@
[fdio-release]
-name=fd.io release branch latest merge
-baseurl=https://nexus.fd.io/content/repositories/fd.io.stable.1710.centos7/
-enabled=1
+name=FD.io release 17.10 binary RPM package repository for CentOS 7
+baseurl=https://packagecloud.io/fdio/1710/el/7/$basearch
+repo_gpgcheck=1
gpgcheck=0
+enabled=1
+gpgkey=https://packagecloud.io/fdio/1710/gpgkey
+sslverify=1
+sslcacert=/etc/pki/tls/certs/ca-bundle.crt
+metadata_expire=300
+
diff --git a/nfvbenchvm/dib/elements/nfvbenchvm/finalise.d/51-add-cpu-isolation b/nfvbenchvm/dib/elements/nfvbenchvm/finalise.d/51-add-cpu-isolation
index eab5817..e9cf3c5 100755
--- a/nfvbenchvm/dib/elements/nfvbenchvm/finalise.d/51-add-cpu-isolation
+++ b/nfvbenchvm/dib/elements/nfvbenchvm/finalise.d/51-add-cpu-isolation
@@ -1,4 +1,12 @@
#!/bin/bash
-grubby --update-kernel=ALL --args="isolcpus=1 rcu_nocbs=1 nohz=on nohz_full=1 nmi_watchdog=0"
-grubby --update-kernel=ALL --args="default_hugepagesz=1G hugepagesz=1G hugepages=1"
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+ set -x
+fi
+
+# Stop on error
+set -euo pipefail
+
+grubby --update-kernel=ALL --args="isolcpus=1-7 rcu_nocbs=1 nohz=on nohz_full=1 nmi_watchdog=0"
+grubby --update-kernel=ALL --args="default_hugepagesz=1G hugepagesz=1G hugepages=4"
+grubby --update-kernel=ALL --args="intel_iommu=on iommu=pt"
diff --git a/nfvbenchvm/dib/elements/nfvbenchvm/finalise.d/52-change-resolution b/nfvbenchvm/dib/elements/nfvbenchvm/finalise.d/52-change-resolution
index 26f2f6a..d01b907 100755
--- a/nfvbenchvm/dib/elements/nfvbenchvm/finalise.d/52-change-resolution
+++ b/nfvbenchvm/dib/elements/nfvbenchvm/finalise.d/52-change-resolution
@@ -1,3 +1,10 @@
#!/bin/bash
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+ set -x
+fi
+
+# Stop on error
+set -euo pipefail
+
grubby --update-kernel=ALL --args="vga=792"
diff --git a/nfvbenchvm/dib/elements/nfvbenchvm/finalise.d/53-boot-from-new-kernel b/nfvbenchvm/dib/elements/nfvbenchvm/finalise.d/53-boot-from-new-kernel
index 6607b0b..e461801 100755
--- a/nfvbenchvm/dib/elements/nfvbenchvm/finalise.d/53-boot-from-new-kernel
+++ b/nfvbenchvm/dib/elements/nfvbenchvm/finalise.d/53-boot-from-new-kernel
@@ -1,3 +1,10 @@
#!/bin/bash
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+ set -x
+fi
+
+# Stop on error
+set -euo pipefail
+
grubby --set-default-index=0
diff --git a/nfvbenchvm/dib/elements/nfvbenchvm/package-installs.yaml b/nfvbenchvm/dib/elements/nfvbenchvm/package-installs.yaml
index e3184c7..6f86027 100644
--- a/nfvbenchvm/dib/elements/nfvbenchvm/package-installs.yaml
+++ b/nfvbenchvm/dib/elements/nfvbenchvm/package-installs.yaml
@@ -4,12 +4,18 @@ tuna:
wget:
screen:
telnet:
-python-devel:
libyaml-devel:
numactl-libs:
numactl-devel:
vpp:
vpp-plugins:
+vpp-config:
kernel-firmware:
kernel-headers:
kernel-devel:
+openssh-server:
+dpdk-tools:
+git:
+python3-dev:
+libpython3.6-dev:
+python3-pip:
diff --git a/nfvbenchvm/dib/elements/nfvbenchvm/post-install.d/01-update-kernel b/nfvbenchvm/dib/elements/nfvbenchvm/post-install.d/01-update-kernel
index 8094006..0c32b5f 100755
--- a/nfvbenchvm/dib/elements/nfvbenchvm/post-install.d/01-update-kernel
+++ b/nfvbenchvm/dib/elements/nfvbenchvm/post-install.d/01-update-kernel
@@ -1,5 +1,12 @@
#!/bin/bash
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+ set -x
+fi
+
+# Stop on error
+set -euo pipefail
+
if [ $DIB_USE_ELREPO_KERNEL != "True" ]; then
exit 0
fi
diff --git a/nfvbenchvm/dib/elements/nfvbenchvm/post-install.d/02-pip-package b/nfvbenchvm/dib/elements/nfvbenchvm/post-install.d/02-pip-package
new file mode 100755
index 0000000..ee7c5f2
--- /dev/null
+++ b/nfvbenchvm/dib/elements/nfvbenchvm/post-install.d/02-pip-package
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+ set -x
+fi
+
+# Stop on error
+set -euo pipefail
+
+python3 -m pip install --upgrade pip
+python3 -m pip install setuptools wheel pbr
+python3 -m pip install pyyaml
diff --git a/nfvbenchvm/dib/elements/nfvbenchvm/post-install.d/02-testpmd-script b/nfvbenchvm/dib/elements/nfvbenchvm/post-install.d/02-testpmd-script
deleted file mode 100755
index 2136c3a..0000000
--- a/nfvbenchvm/dib/elements/nfvbenchvm/post-install.d/02-testpmd-script
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/bin/bash
-
-DPDK=dpdk-17.08
-DPDK_UNTAR=dpdk-17.08
-
-# pick up the kernel version for the target image
-kernel_version=`ls -t /lib/modules | awk 'NR==1 {print}'`
-
-mkdir dpdk
-wget http://fast.dpdk.org/rel/$DPDK.tar.xz
-tar xfJ $DPDK.tar.xz
-cd $DPDK_UNTAR
-
-export RTE_KERNELDIR=/lib/modules/$kernel_version/build
-export ARCH=x86
-make -j4 install T=x86_64-native-linuxapp-gcc
-
-cp usertools/dpdk-devbind.py ../dpdk
-# cp tools/dpdk_nic_bind.py ../dpdk/dpdk-devbind.py
-cp x86_64-native-linuxapp-gcc/app/testpmd ../dpdk
-cp x86_64-native-linuxapp-gcc/kmod/igb_uio.ko ../dpdk
-echo "set promisc all off" > /dpdk/testpmd_cmd.txt
-
-cd ..
-rm -f $DPDK.tar.xz
-rm -rf $DPDK_UNTAR
diff --git a/nfvbenchvm/dib/elements/nfvbenchvm/post-install.d/03-add-execute-attribute b/nfvbenchvm/dib/elements/nfvbenchvm/post-install.d/03-add-execute-attribute
deleted file mode 100755
index a13ab95..0000000
--- a/nfvbenchvm/dib/elements/nfvbenchvm/post-install.d/03-add-execute-attribute
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/bash
-
-chmod +x /etc/rc.d/rc.local
-chmod +x /etc/sysconfig/network-scripts/ifcfg-eth0
diff --git a/nfvbenchvm/dib/elements/nfvbenchvm/post-install.d/03-copy-rc-local b/nfvbenchvm/dib/elements/nfvbenchvm/post-install.d/03-copy-rc-local
new file mode 100755
index 0000000..4a8e66b
--- /dev/null
+++ b/nfvbenchvm/dib/elements/nfvbenchvm/post-install.d/03-copy-rc-local
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+ set -x
+fi
+
+# Stop on error
+set -euo pipefail
+
+# set accurate rc.local file corresponding to current image built
+if [ $DIB_DEV_IMAGE = "loopvm" ]; then
+ mv /etc/rc.d/rc.local.loopvm /etc/rc.d/rc.local
+else
+ mv /etc/rc.d/rc.local.generator /etc/rc.d/rc.local
+fi
diff --git a/nfvbenchvm/dib/elements/nfvbenchvm/post-install.d/04-add-execute-attribute b/nfvbenchvm/dib/elements/nfvbenchvm/post-install.d/04-add-execute-attribute
new file mode 100755
index 0000000..52aed8a
--- /dev/null
+++ b/nfvbenchvm/dib/elements/nfvbenchvm/post-install.d/04-add-execute-attribute
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+ set -x
+fi
+
+# Stop on error
+set -euo pipefail
+
+chmod +x /etc/rc.d/rc.local
+chmod +x /etc/sysconfig/network-scripts/ifcfg-eth0
+chmod +x /etc/profile.d/nfvbench.sh
+chmod +x /nfvbench/configure-nfvbench.sh
+chmod +x /nfvbench/start-nfvbench.sh
diff --git a/nfvbenchvm/dib/elements/nfvbenchvm/post-install.d/50-pip-package b/nfvbenchvm/dib/elements/nfvbenchvm/post-install.d/50-pip-package
deleted file mode 100755
index 2d74ff5..0000000
--- a/nfvbenchvm/dib/elements/nfvbenchvm/post-install.d/50-pip-package
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/bash
-
-cd /tmp
-wget https://bootstrap.pypa.io/get-pip.py
-python get-pip.py
-
-pip install setuptools wheel
-pip install pyyaml
diff --git a/nfvbenchvm/dib/elements/nfvbenchvm/post-install.d/51-cloudcfg-edit b/nfvbenchvm/dib/elements/nfvbenchvm/post-install.d/51-cloudcfg-edit
index 3e4647a..1a0dec9 100755
--- a/nfvbenchvm/dib/elements/nfvbenchvm/post-install.d/51-cloudcfg-edit
+++ b/nfvbenchvm/dib/elements/nfvbenchvm/post-install.d/51-cloudcfg-edit
@@ -5,7 +5,10 @@ cloudcfg = "/etc/cloud/cloud.cfg"
user = "cloud-user"
with open(cloudcfg) as f:
- cfg = yaml.load(f)
+ cfg = yaml.safe_load(f)
+
+# allow SSH password auth
+cfg['ssh_pwauth'] = "1"
try:
if cfg['system_info']['default_user']['name']:
diff --git a/nfvbenchvm/dib/elements/nfvbenchvm/post-install.d/52-nfvbench-script b/nfvbenchvm/dib/elements/nfvbenchvm/post-install.d/52-nfvbench-script
new file mode 100755
index 0000000..4edc493
--- /dev/null
+++ b/nfvbenchvm/dib/elements/nfvbenchvm/post-install.d/52-nfvbench-script
@@ -0,0 +1,56 @@
+#!/bin/bash
+
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+ set -x
+fi
+
+# Make sure the disk image build fails if nfvbench installation fails
+set -euo pipefail
+
+if [ $DIB_DEV_IMAGE != "generator" ]; then
+ exit 0
+fi
+
+# TRex installation
+mkdir -p /opt/trex
+mkdir /var/log/nfvbench
+
+wget --no-cache --no-check-certificate https://trex-tgn.cisco.com/trex/release/$TREX_VER.tar.gz
+tar xzf $TREX_VER.tar.gz -C /opt/trex
+rm -f /$TREX_VER.tar.gz
+rm -f /opt/trex/$TREX_VER/trex_client_$TREX_VER.tar.gz
+cp -a /opt/trex/$TREX_VER/automation/trex_control_plane/interactive/trex /usr/local/lib/python3.6/site-packages/
+rm -rf /opt/trex/$TREX_VER/automation/trex_control_plane/interactive/trex
+
+# NFVbench installation
+cd /opt
+if [[ "${DIB_NFVBENCH_CODE_ORIGIN}" == "static" ]]; then
+ # nfvbench code has been copied by the install-static element to
+ # /opt/nfvbench without the .git/ directory. But pip will need that .git/
+ # directory to compute nfvbench version, so will now finish the incomplete
+ # job of install-static:
+ STATIC_NFVBENCH_CODE="$(dirname $0)/../static/opt/nfvbench"
+ [ -d "${STATIC_NFVBENCH_CODE}" ] || {
+ echo "Error: directory ${STATIC_NFVBENCH_CODE} missing."
+ echo " You requested a build from local nfvbench code with"
+ echo " DIB_NFVBENCH_CODE_ORIGIN=static, but you likely forgot"
+ echo " to clone nfvbench code in elements/nfvbenchvm/static/opt/nfvbench"
+ exit 1
+ }
+ rsync -lr "${STATIC_NFVBENCH_CODE}"/ /opt/nfvbench/
+else
+ git clone https://gerrit.opnfv.org/gerrit/nfvbench
+fi
+cd nfvbench/
+python3 -m pip install . --use-deprecated=legacy-resolver
+cp xtesting/testcases.yaml /usr/local/lib/python3.6/site-packages/xtesting/ci/testcases.yaml
+python3 ./docker/cleanup_generators.py
+rm -rf /opt/nfvbench/.git
+rm -rf /opt/nfvbench/nfvbench
+rm -rf /opt/nfvbench/behave_tests
+# symlink to NFVbench sources
+ln -s /usr/local/lib/python3.6/site-packages/nfvbench /opt/nfvbench/nfvbench
+ln -s /usr/local/lib/python3.6/site-packages/behave_tests /opt/nfvbench/behave_tests
+# persist env variables
+echo "export TREX_VER=\"$TREX_VER\"" >> /etc/profile.d/nfvbench.sh
+echo "export TREX_EXT_LIBS=\"/opt/trex/$TREX_VER/external_libs\"" >> /etc/profile.d/nfvbench.sh
diff --git a/nfvbenchvm/dib/elements/nfvbenchvm/post-install.d/53-sshd-script b/nfvbenchvm/dib/elements/nfvbenchvm/post-install.d/53-sshd-script
new file mode 100755
index 0000000..0c7dfd5
--- /dev/null
+++ b/nfvbenchvm/dib/elements/nfvbenchvm/post-install.d/53-sshd-script
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+ set -x
+fi
+
+# Stop on error
+set -euo pipefail
+
+# Set UseDNS no value in sshd_config to reduce time to connect
+echo "UseDNS no" >> /etc/ssh/sshd_config
diff --git a/nfvbenchvm/dib/elements/nfvbenchvm/post-install.d/99-cleanup b/nfvbenchvm/dib/elements/nfvbenchvm/post-install.d/99-cleanup
index 14e9f27..dbb7342 100755
--- a/nfvbenchvm/dib/elements/nfvbenchvm/post-install.d/99-cleanup
+++ b/nfvbenchvm/dib/elements/nfvbenchvm/post-install.d/99-cleanup
@@ -1,3 +1,10 @@
#!/bin/bash
-yum erase -y python-devel libyaml-devel numactl-devel kernel-devel kernel-headers kernel-lt-headers kernel-lt-devel gcc
+if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
+ set -x
+fi
+
+# Stop on error
+set -euo pipefail
+
+yum erase -y python-devel libyaml-devel numactl-devel kernel-devel kernel-headers kernel-lt-headers kernel-lt-devel gcc git python3-dev libpython3.6-dev
diff --git a/nfvbenchvm/dib/elements/nfvbenchvm/static/etc/modprobe.d/vfio.conf b/nfvbenchvm/dib/elements/nfvbenchvm/static/etc/modprobe.d/vfio.conf
new file mode 100644
index 0000000..f32633f
--- /dev/null
+++ b/nfvbenchvm/dib/elements/nfvbenchvm/static/etc/modprobe.d/vfio.conf
@@ -0,0 +1 @@
+options vfio enable_unsafe_noiommu_mode=1
diff --git a/nfvbenchvm/dib/elements/nfvbenchvm/static/etc/modules-load.d/vfio-pci.conf b/nfvbenchvm/dib/elements/nfvbenchvm/static/etc/modules-load.d/vfio-pci.conf
new file mode 100644
index 0000000..7ce4214
--- /dev/null
+++ b/nfvbenchvm/dib/elements/nfvbenchvm/static/etc/modules-load.d/vfio-pci.conf
@@ -0,0 +1 @@
+vfio-pci
diff --git a/nfvbenchvm/dib/elements/nfvbenchvm/static/etc/openstack/clouds.yaml b/nfvbenchvm/dib/elements/nfvbenchvm/static/etc/openstack/clouds.yaml
new file mode 100644
index 0000000..cb1130f
--- /dev/null
+++ b/nfvbenchvm/dib/elements/nfvbenchvm/static/etc/openstack/clouds.yaml
@@ -0,0 +1 @@
+# clouds.yaml file \ No newline at end of file
diff --git a/nfvbenchvm/dib/elements/nfvbenchvm/static/etc/profile.d/nfvbench.sh b/nfvbenchvm/dib/elements/nfvbenchvm/static/etc/profile.d/nfvbench.sh
new file mode 100644
index 0000000..a9bf588
--- /dev/null
+++ b/nfvbenchvm/dib/elements/nfvbenchvm/static/etc/profile.d/nfvbench.sh
@@ -0,0 +1 @@
+#!/bin/bash
diff --git a/nfvbenchvm/dib/elements/nfvbenchvm/static/etc/rc.d/rc.local b/nfvbenchvm/dib/elements/nfvbenchvm/static/etc/rc.d/rc.local
deleted file mode 100644
index dddc787..0000000
--- a/nfvbenchvm/dib/elements/nfvbenchvm/static/etc/rc.d/rc.local
+++ /dev/null
@@ -1,112 +0,0 @@
-#!/bin/bash
-
-touch /var/lock/subsys/local
-
-# Waiting for cloud-init to generate $TESTPMD_CONF, retry 60 seconds
-NFVBENCH_CONF=/etc/nfvbenchvm.conf
-retry=30
-until [ $retry -eq 0 ]; do
- if [ -f $NFVBENCH_CONF ]; then break; fi
- retry=$[$retry-1]
- sleep 2
-done
-if [ ! -f $NFVBENCH_CONF ]; then
- exit 0
-fi
-
-# Parse and obtain all configurations
-echo "Generating configurations for forwarder..."
-eval $(cat $NFVBENCH_CONF)
-touch /nfvbench_configured.flag
-NICS=`lspci -D | grep Ethernet | cut -d' ' -f1 | xargs`
-PCI_ADDRESS_1=`echo $NICS | awk '{ print $1 }'`
-PCI_ADDRESS_2=`echo $NICS | awk '{ print $2 }'`
-CPU_CORES=`grep -c ^processor /proc/cpuinfo`
-CPU_MASKS=0x`echo "obase=16; 2 ^ $CPU_CORES - 1" | bc`
-WORKER_CORES=`expr $CPU_CORES - 1`
-
-# CPU isolation optimizations
-echo 1 > /sys/bus/workqueue/devices/writeback/cpumask
-echo 1 > /sys/devices/virtual/workqueue/cpumask
-echo 1 > /proc/irq/default_smp_affinity
-for irq in `ls /proc/irq/`; do
- echo 1 > /proc/irq/$irq/smp_affinity
-done
-tuna -c $(seq -s, 1 1 $WORKER_CORES) --isolate
-
-# Sometimes the interfaces on the loopback VM will use different drivers, e.g.
-# one from vswitch which is virtio based, one is from SRIOV VF. In this case,
-# we have to make sure the forwarder uses them in the right order, which is
-# especially important if the VM is in a PVVP chain.
-SWAP_FLAG=0
-if [ $INTF_MAC1 ] && [ $INTF_MAC2 ]; then
- NET_PATH=/sys/class/net
- EXP_INTF_1=$(for f in $(ls $NET_PATH/); do if grep -q "$INTF_MAC1" $NET_PATH/$f/address; then echo $f; break; fi; done)
- EXP_PCI_ADDRESS_1=$(ethtool -i $EXP_INTF_1 | grep "bus-info" | awk -F' ' '{ print $2 }')
- EXP_INTF_2=$(for f in $(ls $NET_PATH/); do if grep -q "$INTF_MAC2" $NET_PATH/$f/address; then echo $f; break; fi; done)
- EXP_PCI_ADDRESS_2=$(ethtool -i $EXP_INTF_2 | grep "bus-info" | awk -F' ' '{ print $2 }')
- if [ "$PCI_ADDRESS_1" == "$EXP_PCI_ADDRESS_2" ] && [ "$PCI_ADDRESS_2" == "$EXP_PCI_ADDRESS_1" ]; then
- # Interfaces are not coming in the expected order:
- # (1) Swap the traffic generator MAC in the case of testpmd;
- # (2) Swap the interface configs in the case of VPP;
- SWAP_FLAG=1
- fi
-fi
-
-# Configure the forwarder
-if [ -z "`lsmod | grep igb_uio`" ]; then
- modprobe uio
- insmod /dpdk/igb_uio.ko
-fi
-if [ "$FORWARDER" == "testpmd" ]; then
- echo "Configuring testpmd..."
- if [ $SWAP_FLAG -eq 1 ]; then
- TEMP=$TG_MAC1; TG_MAC1=$TG_MAC2; TG_MAC2=$TEMP
- fi
- # Binding ports to DPDK
- /dpdk/dpdk-devbind.py -b igb_uio $PCI_ADDRESS_1
- /dpdk/dpdk-devbind.py -b igb_uio $PCI_ADDRESS_2
- screen -dmSL testpmd /dpdk/testpmd \
- -c $CPU_MASKS \
- -n 4 \
- -- \
- --burst=32 \
- --txd=2048 \
- --rxd=2048 \
- --txqflags=0xf00 \
- --disable-hw-vlan \
- --eth-peer=0,$TG_MAC1 \
- --eth-peer=1,$TG_MAC2 \
- --forward-mode=mac \
- --nb-cores=$WORKER_CORES \
- --max-pkt-len=9000 \
- --cmdline-file=/dpdk/testpmd_cmd.txt
-else
- echo "Configuring vpp..."
- cp /vpp/startup.conf /etc/vpp/startup.conf
- cp /vpp/vm.conf /etc/vpp/vm.conf
-
- sed -i "s/{{PCI_ADDRESS_1}}/$PCI_ADDRESS_1/g" /etc/vpp/startup.conf
- sed -i "s/{{PCI_ADDRESS_2}}/$PCI_ADDRESS_2/g" /etc/vpp/startup.conf
- sed -i "s/{{WORKER_CORES}}/$WORKER_CORES/g" /etc/vpp/startup.conf
- service vpp start
- sleep 10
-
- INTFS=`vppctl show int | grep Ethernet | xargs`
- INTF_1=`echo $INTFS | awk '{ print $1 }'`
- INTF_2=`echo $INTFS | awk '{ print $4 }'`
- if [ $SWAP_FLAG -eq 1 ]; then
- TEMP=$INTF_1; INTF_1=$INTF_2; INTF_2=$TEMP
- fi
- sed -i "s/{{INTF_1}}/${INTF_1//\//\/}/g" /etc/vpp/vm.conf
- sed -i "s/{{INTF_2}}/${INTF_2//\//\/}/g" /etc/vpp/vm.conf
- sed -i "s/{{VNF_GATEWAY1_CIDR}}/${VNF_GATEWAY1_CIDR//\//\/}/g" /etc/vpp/vm.conf
- sed -i "s/{{VNF_GATEWAY2_CIDR}}/${VNF_GATEWAY2_CIDR//\//\/}/g" /etc/vpp/vm.conf
- sed -i "s/{{TG_MAC1}}/${TG_MAC1}/g" /etc/vpp/vm.conf
- sed -i "s/{{TG_MAC2}}/${TG_MAC2}/g" /etc/vpp/vm.conf
- sed -i "s/{{TG_NET1}}/${TG_NET1//\//\/}/g" /etc/vpp/vm.conf
- sed -i "s/{{TG_NET2}}/${TG_NET2//\//\/}/g" /etc/vpp/vm.conf
- sed -i "s/{{TG_GATEWAY1_IP}}/${TG_GATEWAY1_IP}/g" /etc/vpp/vm.conf
- sed -i "s/{{TG_GATEWAY2_IP}}/${TG_GATEWAY2_IP}/g" /etc/vpp/vm.conf
- service vpp restart
-fi
diff --git a/nfvbenchvm/dib/elements/nfvbenchvm/static/etc/rc.d/rc.local.generator b/nfvbenchvm/dib/elements/nfvbenchvm/static/etc/rc.d/rc.local.generator
new file mode 100644
index 0000000..9ac23a3
--- /dev/null
+++ b/nfvbenchvm/dib/elements/nfvbenchvm/static/etc/rc.d/rc.local.generator
@@ -0,0 +1,122 @@
+#!/bin/bash
+
+touch /var/lock/subsys/local
+
+# Waiting for cloud-init to generate $NFVBENCH_CONF, retry 60 seconds
+NFVBENCH_CONF=/etc/nfvbenchvm.conf
+retry=30
+until [ $retry -eq 0 ]; do
+ if [ -f $NFVBENCH_CONF ]; then break; fi
+ retry=$[$retry-1]
+ sleep 2
+done
+if [ ! -f $NFVBENCH_CONF ]; then
+ exit 0
+fi
+
+# Parse and obtain all configurations
+echo "Generating configurations for NFVbench and TRex..."
+eval $(cat $NFVBENCH_CONF)
+touch /nfvbench_configured.flag
+
+# Add DNS entry
+if [ $DNS_SERVERS ]; then
+ IFS="," read -a dns <<< $DNS_SERVERS
+ for d in "${dns[@]}"; do
+ echo "nameserver $d" >> /etc/resolv.conf
+ done
+fi
+
+# CPU isolation optimizations
+echo 1 > /sys/bus/workqueue/devices/writeback/cpumask
+echo 1 > /sys/devices/virtual/workqueue/cpumask
+echo 1 > /proc/irq/default_smp_affinity
+for irq in `ls /proc/irq/`; do
+ if [ -f /proc/irq/$irq/smp_affinity ]; then
+ echo 1 > /proc/irq/$irq/smp_affinity
+ fi
+done
+
+NET_PATH=/sys/class/net
+
+get_eth_port() {
+ # device mapping for CentOS Linux 7:
+ # lspci:
+ # 00.03.0 Ethernet controller: Red Hat, Inc. Virtio network device
+ # 00.04.0 Ethernet controller: Red Hat, Inc. Virtio network device
+ # /sys/class/net:
+ # /sys/class/net/eth0 -> ../../devices/pci0000:00/0000:00:03.0/virtio0/net/eth0
+ # /sys/class/net/eth1 -> ../../devices/pci0000:00/0000:00:04.0/virtio1/net/eth1
+
+ mac=$1
+ for f in $(ls $NET_PATH/); do
+ if grep -q "$mac" $NET_PATH/$f/address; then
+ eth_port=$(readlink $NET_PATH/$f | cut -d "/" -f8)
+ # some virtual interfaces match on MAC and do not have a PCI address
+ if [ "$eth_port" -a "$eth_port" != "N/A" ]; then
+ # Found matching interface
+ logger "NFVBENCHVM: found interface $f ($eth_port) matching $mac"
+ break
+ else
+ eth_port=""
+ fi
+ fi;
+ done
+ if [ -z "$eth_port" ]; then
+ echo "ERROR: Cannot find eth port for MAC $mac" >&2
+ logger "NFVBENCHVM ERROR: Cannot find eth port for MAC $mac"
+ return 1
+ fi
+ echo $eth_port
+ return 0
+}
+
+# Set VM MANAGEMENT port up and running
+if [ $INTF_MGMT_CIDR ] && [ $INTF_MGMT_IP_GW ]; then
+ if [ $INTF_MAC_MGMT ]; then
+ ETH_PORT=$(get_eth_port $INTF_MAC_MGMT)
+ elif [ "$CLOUD_DETAIL" ] && [ "$PORT_MGMT_NAME" ]; then
+ $INTF_MAC_MGMT=$(openstack --os-cloud $CLOUD_DETAIL port list | grep $PORT_MGMT_NAME | grep -o -Ei '([a-fA-F0-9:]{17}|[a-fA-F0-9]{12}$)' | head -1)
+ ETH_PORT=$(get_eth_port $INTF_MAC_MGMT)
+ else
+ ETH_PORT=""
+ fi
+ if [ -z "$ETH_PORT" ]; then
+ echo "ERROR: Cannot find eth port for management port" >&2
+ logger "NFVBENCHVM ERROR: Cannot find eth port for management port"
+ return 1
+ fi
+
+ # By default, configure the MTU of the management interface to the
+ # conservative value of 1500: this will reduce the risk to get an
+ # unmanageable VM in some setups.
+ #
+ # To set the MTU to a different value, configure the INTF_MGMT_MTU variable
+ # in /etc/nfvbenchvm.conf. If INTF_MGMT_MTU is set to the special value
+ # "auto", the MTU will not be configured and it will keep the value set by
+ # the hypervisor ("legacy" nfvbenchvm behavior). If INTF_MGMT_MTU is unset,
+ # the MTU will be set to 1500. In other cases, the MTU will be set to the
+ # value of INTF_MGMT_MTU.
+ #
+ if [[ -z "$INTF_MGMT_MTU" ]]; then
+ ip link set $ETH_PORT mtu 1500
+ elif [[ "$INTF_MGMT_MTU" != "auto" ]]; then
+ ip link set $ETH_PORT mtu $INTF_MGMT_MTU
+ fi
+
+ ip addr add $INTF_MGMT_CIDR dev $ETH_PORT
+ ip link set $ETH_PORT up
+ ip route add default via $INTF_MGMT_IP_GW dev $ETH_PORT
+else
+ echo "INFO: VM management IP Addresses missing in $NFVBENCH_CONF"
+fi
+
+/nfvbench/configure-nfvbench.sh
+
+if [ $ACTION ]; then
+ /nfvbench/start-nfvbench.sh $ACTION
+else
+ /nfvbench/start-nfvbench.sh
+fi
+
+exit 0
diff --git a/nfvbenchvm/dib/elements/nfvbenchvm/static/etc/rc.d/rc.local.loopvm b/nfvbenchvm/dib/elements/nfvbenchvm/static/etc/rc.d/rc.local.loopvm
new file mode 100644
index 0000000..181ff2a
--- /dev/null
+++ b/nfvbenchvm/dib/elements/nfvbenchvm/static/etc/rc.d/rc.local.loopvm
@@ -0,0 +1,298 @@
+#!/bin/bash
+
+touch /var/lock/subsys/local
+
+# Waiting for cloud-init to generate $NFVBENCH_CONF, retry 60 seconds
+NFVBENCH_CONF=/etc/nfvbenchvm.conf
+retry=30
+until [ $retry -eq 0 ]; do
+ if [ -f $NFVBENCH_CONF ]; then break; fi
+ retry=$[$retry-1]
+ sleep 2
+done
+if [ ! -f $NFVBENCH_CONF ]; then
+ exit 0
+fi
+
+# Parse and obtain all configurations
+echo "Generating configurations for forwarder..."
+eval $(cat $NFVBENCH_CONF)
+touch /nfvbench_configured.flag
+
+# WE assume there are at least 2 cores available for the VM
+CPU_CORES=$(grep -c ^processor /proc/cpuinfo)
+
+# We need at least 1 admin core.
+if [ $CPU_CORES -le 2 ]; then
+ ADMIN_CORES=1
+else
+ # If the number of cores is even we
+ # reserve 2 cores for admin (second being idle) so the number of
+ # workers is either 1 (if CPU_CORES is 2) or always even
+ if (( $CPU_CORES % 2 )); then
+ ADMIN_CORES=1
+ else
+ ADMIN_CORES=2
+ fi
+fi
+# 2 vcpus: AW (core 0: Admin, core 1: Worker)
+# 3 vcpus: AWW (core 0: Admin, core 1,2: Worker)
+# 4 vcpus: AWWU (core 0: Admin, core 1,2: Worker, core 3: Unused)
+# 5 vcpus: AWWWW
+# 6 vcpus: AWWWWU
+WORKER_CORES=$(expr $CPU_CORES - $ADMIN_CORES)
+# worker cores are all cores except the admin core (core 0) and the eventual unused core
+# AW -> 1
+# AWW -> 1,2
+# AWWU -> 1,2
+WORKER_CORE_LIST=$(seq -s, $ADMIN_CORES $WORKER_CORES)
+# always use all cores
+CORE_MASK=0x$(echo "obase=16; 2 ^ $CPU_CORES - 1" | bc)
+
+logger "NFVBENCHVM: CPU_CORES=$CPU_CORES, ADMIN_CORES=$ADMIN_CORES, WORKER_CORES=$WORKER_CORES ($WORKER_CORE_LIST)"
+
+# CPU isolation optimizations
+echo 1 > /sys/bus/workqueue/devices/writeback/cpumask
+echo 1 > /sys/devices/virtual/workqueue/cpumask
+echo 1 > /proc/irq/default_smp_affinity
+for irq in `ls /proc/irq/`; do
+ if [ -f /proc/irq/$irq/smp_affinity ]; then
+ echo 1 > /proc/irq/$irq/smp_affinity
+ fi
+done
+
+# Isolate all cores that are reserved for workers
+tuna -c $WORKER_CORE_LIST --isolate
+
+NET_PATH=/sys/class/net
+
+get_pci_address() {
+ # device mapping for CentOS Linux 7:
+ # lspci:
+ # 00.03.0 Ethernet controller: Red Hat, Inc. Virtio network device
+ # 00.04.0 Ethernet controller: Red Hat, Inc. Virtio network device
+ # /sys/class/net:
+ # /sys/class/net/eth0 -> ../../devices/pci0000:00/0000:00:03.0/virtio0/net/eth0
+ # /sys/class/net/eth1 -> ../../devices/pci0000:00/0000:00:04.0/virtio1/net/eth1
+
+ mac=$1
+ for f in $(ls $NET_PATH/); do
+ if grep -q "$mac" $NET_PATH/$f/address; then
+ pci_addr=$(readlink $NET_PATH/$f | cut -d "/" -f5)
+ # some virtual interfaces match on MAC and do not have a PCI address
+ if [ "$pci_addr" -a "$pci_addr" != "N/A" ]; then
+ # Found matching interface
+ logger "NFVBENCHVM: found interface $f ($pci_addr) matching $mac"
+ break
+ else
+ pci_addr=""
+ fi
+ fi;
+ done
+ if [ -z "$pci_addr" ]; then
+ echo "ERROR: Cannot find pci address for MAC $mac" >&2
+ logger "NFVBENCHVM ERROR: Cannot find pci address for MAC $mac"
+ return 1
+ fi
+ echo $pci_addr
+ return 0
+}
+
+get_eth_port() {
+ # device mapping for CentOS Linux 7:
+ # lspci:
+ # 00.03.0 Ethernet controller: Red Hat, Inc. Virtio network device
+ # 00.04.0 Ethernet controller: Red Hat, Inc. Virtio network device
+ # /sys/class/net:
+ # /sys/class/net/eth0 -> ../../devices/pci0000:00/0000:00:03.0/virtio0/net/eth0
+ # /sys/class/net/eth1 -> ../../devices/pci0000:00/0000:00:04.0/virtio1/net/eth1
+
+ mac=$1
+ for f in $(ls $NET_PATH/); do
+ if grep -q "$mac" $NET_PATH/$f/address; then
+ eth_port=$(readlink $NET_PATH/$f | cut -d "/" -f8)
+ # some virtual interfaces match on MAC and do not have a PCI address
+ if [ "$eth_port" -a "$eth_port" != "N/A" ]; then
+ # Found matching interface
+ logger "NFVBENCHVM: found interface $f ($eth_port) matching $mac"
+ break
+ else
+ eth_port=""
+ fi
+ fi;
+ done
+ if [ -z "$eth_port" ]; then
+ echo "ERROR: Cannot find eth port for MAC $mac" >&2
+ logger "NFVBENCHVM ERROR: Cannot find eth port for MAC $mac"
+ return 1
+ fi
+ echo $eth_port
+ return 0
+}
+
+# Set VM MANAGEMENT port up and running
+if [ $INTF_MGMT_CIDR ] && [ $INTF_MGMT_IP_GW ]; then
+ if [ $INTF_MAC_MGMT ]; then
+ ETH_PORT=$(get_eth_port $INTF_MAC_MGMT)
+ else
+ ETH_PORT="eth0"
+ fi
+
+ # By default, configure the MTU of the management interface to the
+ # conservative value of 1500: this will reduce the risk to get an
+ # unmanageable VM in some setups.
+ #
+ # To set the MTU to a different value, configure the INTF_MGMT_MTU variable
+ # in /etc/nfvbenchvm.conf. If INTF_MGMT_MTU is set to the special value
+ # "auto", the MTU will not be configured and it will keep the value set by
+ # the hypervisor ("legacy" nfvbenchvm behavior). If INTF_MGMT_MTU is unset,
+ # the MTU will be set to 1500. In other cases, the MTU will be set to the
+ # value of INTF_MGMT_MTU.
+ #
+ if [[ -z "$INTF_MGMT_MTU" ]]; then
+ ip link set $ETH_PORT mtu 1500
+ elif [[ "$INTF_MGMT_MTU" != "auto" ]]; then
+ ip link set $ETH_PORT mtu $INTF_MGMT_MTU
+ fi
+
+ ip addr add $INTF_MGMT_CIDR dev $ETH_PORT
+ ip link set $ETH_PORT up
+ ip route add default via $INTF_MGMT_IP_GW dev $ETH_PORT
+else
+ echo "INFO: VM management IP Addresses missing in $NFVBENCH_CONF"
+fi
+
+# Set dynamically interfaces mac values, if VM is spawn without using NFVBench
+# and management interface is used on eth0
+if [ -z "$INTF_MAC1" ] && [ -z "$INTF_MAC2" ]; then
+ INTF_MAC1=$(ip l show eth1 | grep -o -Ei '([a-fA-F0-9:]{17}|[a-fA-F0-9]{12}$)' | head -1)
+ INTF_MAC2=$(ip l show eth2 | grep -o -Ei '([a-fA-F0-9:]{17}|[a-fA-F0-9]{12}$)' | head -1)
+fi
+
+
+# Sometimes the interfaces on the loopback VM will use different drivers, e.g.
+# one from vswitch which is virtio based, one is from SRIOV VF. In this case,
+# we have to make sure the forwarder uses them in the right order, which is
+# especially important if the VM is in a PVVP chain.
+if [ $INTF_MAC1 ] && [ $INTF_MAC2 ]; then
+ PCI_ADDRESS_1=$(get_pci_address $INTF_MAC1)
+ PCI_ADDRESS_2=$(get_pci_address $INTF_MAC2)
+else
+ echo "ERROR: VM MAC Addresses missing in $NFVBENCH_CONF"
+ logger "NFVBENCHVM ERROR: VM MAC Addresses missing in $NFVBENCH_CONF"
+fi
+
+wait_vpp_service() {
+ # Wait for at most wait_max=$1 seconds until VPP service is ready. Exit
+ # with code 1 if timeout is reached.
+ #
+ # Because VPP systemd unit has Type=simple, systemctl will report the
+ # service to be active has soon as it is forked. This does not mean that
+ # the service is ready, and actually it takes some times before vppctl can
+ # succesfully connect to VPP client socket /run/vpp/cli.sock.
+ local wait_max=$1
+
+ local wait_time=0
+ while ! vppctl show int; do
+ if [[ $wait_time -ge $wait_max ]]; then
+ # Log error to both system log and standard error output
+ logger -s "NFVBENCHVM ERROR: VPP service still not ready after $wait_max seconds." \
+ "Exiting $(basename $0)."
+ exit 1
+ fi
+ sleep 1
+ wait_time=$(( wait_time + 1 ))
+ done
+}
+
+if [ $PCI_ADDRESS_1 ] && [ $PCI_ADDRESS_2 ]; then
+ logger "NFVBENCHVM: Using pci $PCI_ADDRESS_1 ($INTF_MAC1)"
+ logger "NFVBENCHVM: Using pci $PCI_ADDRESS_2 ($INTF_MAC2)"
+ # active uio_pci_generic driver
+ modprobe uio_pci_generic
+ # Configure the forwarder
+ if [ "$FORWARDER" == "testpmd" ]; then
+ echo "Configuring testpmd..."
+ mkdir /dpdk
+ echo "set promisc all off" > /dpdk/testpmd_cmd.txt
+ # Binding ports to DPDK VFIO or UIO
+ dpdk-devbind -b vfio-pci $PCI_ADDRESS_1 || dpdk-devbind -b uio_pci_generic $PCI_ADDRESS_1
+ dpdk-devbind -b vfio-pci $PCI_ADDRESS_2 || dpdk-devbind -b uio_pci_generic $PCI_ADDRESS_2
+ screen -dmSL testpmd testpmd \
+ -c $CORE_MASK \
+ -n 4 \
+ -- \
+ --nb-ports=2 \
+ --burst=32 \
+ --txd=256 \
+ --rxd=1024 \
+ --eth-peer=0,$TG_MAC1 \
+ --eth-peer=1,$TG_MAC2 \
+ --forward-mode=mac \
+ --nb-cores=$WORKER_CORES \
+ --txq=$VIF_MQ_SIZE \
+ --rxq=$VIF_MQ_SIZE \
+ --max-pkt-len=9000 \
+ --cmdline-file=/dpdk/testpmd_cmd.txt
+ echo "testpmd running in screen 'testpmd'"
+ logger "NFVBENCHVM: testpmd running in screen 'testpmd'"
+ elif [ "$FORWARDER" == "vpp" ]; then
+ echo "Configuring vpp..."
+ cp /vpp/startup.conf /etc/vpp/startup.conf
+ cp /vpp/vm.conf /etc/vpp/vm.conf
+
+ sed -i "s/{{PCI_ADDRESS_1}}/$PCI_ADDRESS_1/g" /etc/vpp/startup.conf
+ sed -i "s/{{PCI_ADDRESS_2}}/$PCI_ADDRESS_2/g" /etc/vpp/startup.conf
+ sed -i "s/{{WORKER_CORES}}/$WORKER_CORES/g" /etc/vpp/startup.conf
+ sed -i "s/{{VIF_MQ_SIZE}}/${VIF_MQ_SIZE}/g" /etc/vpp/startup.conf
+ sed -i "s/{{NUM_MBUFS}}/${NUM_MBUFS}/g" /etc/vpp/startup.conf
+ systemctl start vpp
+ # Wait until VPP service is ready for at most 30 seconds
+ wait_vpp_service 30
+
+ VPPCTL_OUTPUT=$(vppctl show int)
+ INTFS=$(echo "$VPPCTL_OUTPUT" | grep Ethernet | xargs)
+ INTF_1=$(echo $INTFS | awk '{ print $1 }')
+ INTF_2=$(echo $INTFS | awk '{ print $4 }')
+ if [[ -z "$INTF_1" ]] || [[ -z "$INTF_2" ]]; then
+ # Log error to both system log and standard error output
+ logger -s "NFVBENCHVM DEBUG: \"vppctl show int\" output:"
+ logger -s "NFVBENCHVM DEBUG: $VPPCTL_OUTPUT"
+ logger -s "NFVBENCHVM ERROR: vppctl does not show the two Ethernet interfaces we expect." \
+ "Exiting $(basename $0)."
+ exit 1
+ fi
+ if [ -z "${TG_MAC1}" ]; then
+ # vm.conf does not support lines commented with #, so
+ # we need to remove the line to set the static ARP entry.
+ sed -i "/{{TG_MAC1}}/d" /etc/vpp/vm.conf
+ else
+ sed -i "s/{{TG_MAC1}}/${TG_MAC1}/g" /etc/vpp/vm.conf
+ fi
+ if [ -z "${TG_MAC2}" ]; then
+ sed -i "/{{TG_MAC2}}/d" /etc/vpp/vm.conf
+ else
+ sed -i "s/{{TG_MAC2}}/${TG_MAC2}/g" /etc/vpp/vm.conf
+ fi
+ sed -i "s/{{INTF_1}}/${INTF_1//\//\/}/g" /etc/vpp/vm.conf
+ sed -i "s/{{INTF_2}}/${INTF_2//\//\/}/g" /etc/vpp/vm.conf
+ sed -i "s/{{VNF_GATEWAY1_CIDR}}/${VNF_GATEWAY1_CIDR//\//\/}/g" /etc/vpp/vm.conf
+ sed -i "s/{{VNF_GATEWAY2_CIDR}}/${VNF_GATEWAY2_CIDR//\//\/}/g" /etc/vpp/vm.conf
+ sed -i "s/{{TG_NET1}}/${TG_NET1//\//\/}/g" /etc/vpp/vm.conf
+ sed -i "s/{{TG_NET2}}/${TG_NET2//\//\/}/g" /etc/vpp/vm.conf
+ sed -i "s/{{TG_GATEWAY1_IP}}/${TG_GATEWAY1_IP}/g" /etc/vpp/vm.conf
+ sed -i "s/{{TG_GATEWAY2_IP}}/${TG_GATEWAY2_IP}/g" /etc/vpp/vm.conf
+ systemctl restart vpp
+ logger "NFVBENCHVM: vpp service restarted"
+ else
+ echo "ERROR: Unknown forwarder value. Accepted values: testpmd or vpp"
+ exit 1
+ fi
+else
+ echo "ERROR: Cannot find PCI Address from MAC"
+ echo "$INTF_MAC1: $PCI_ADDRESS_1"
+ echo "$INTF_MAC2: $PCI_ADDRESS_2"
+ logger "NFVBENCHVM ERROR: Cannot find PCI Address from MAC"
+fi
+
+exit 0
diff --git a/nfvbenchvm/dib/elements/nfvbenchvm/static/etc/systemd/system/nfvbench.service b/nfvbenchvm/dib/elements/nfvbenchvm/static/etc/systemd/system/nfvbench.service
new file mode 100644
index 0000000..e952070
--- /dev/null
+++ b/nfvbenchvm/dib/elements/nfvbenchvm/static/etc/systemd/system/nfvbench.service
@@ -0,0 +1,12 @@
+[Unit]
+Description=nfvbench service
+After=network.target
+
+[Service]
+Type=forking
+User=root
+RemainAfterExit=yes
+ExecStart=/bin/bash -a -c "source /etc/profile.d/nfvbench.sh && /usr/bin/screen -dmSL nfvbench /usr/local/bin/nfvbench -c /etc/nfvbench/nfvbench.conf --server"
+
+[Install]
+WantedBy=multi-user.target
diff --git a/nfvbenchvm/dib/elements/nfvbenchvm/static/nfvbench/configure-nfvbench.sh b/nfvbenchvm/dib/elements/nfvbenchvm/static/nfvbench/configure-nfvbench.sh
new file mode 100644
index 0000000..3bf1d8d
--- /dev/null
+++ b/nfvbenchvm/dib/elements/nfvbenchvm/static/nfvbench/configure-nfvbench.sh
@@ -0,0 +1,258 @@
+#!/bin/bash
+
+set -e
+
+NFVBENCH_CONF=/etc/nfvbenchvm.conf
+E2E_CFG=/etc/nfvbench/e2e.cfg
+LOOPBACK_CFG=/etc/nfvbench/loopback.cfg
+NFVBENCH_CFG=/etc/nfvbench/nfvbench.cfg
+
+# Parse and obtain all configurations
+eval $(cat $NFVBENCH_CONF)
+
+# WE assume there are at least 2 cores available for the VM
+CPU_CORES=$(grep -c ^processor /proc/cpuinfo)
+
+# We need at least 2 admin cores (one master and another latency).
+if [ $CPU_CORES -le 3 ]; then
+ ADMIN_CORES=2
+else
+ # If the number of cores is even we
+ # reserve 3 cores for admin (third being idle) so the number of
+ # workers is either 1 (if CPU_CORES is 4) or always even
+ if (( $CPU_CORES % 2 )); then
+ ADMIN_CORES=2
+ else
+ ADMIN_CORES=3
+ fi
+fi
+# 2 vcpus: AW (core 0: Admin, core 1: Worker)
+# 3 vcpus: AWW (core 0: Admin, core 1,2: Worker)
+# 4 vcpus: AWWU (core 0: Admin, core 1,2: Worker, core 3: Unused)
+# 5 vcpus: AWWWW
+# 6 vcpus: AWWWWU
+WORKER_CORES=$(expr $CPU_CORES - $ADMIN_CORES)
+# worker cores are all cores except the admin core (core 0) and the eventual unused core
+# AW -> 1
+# AWW -> 1,2
+# AWWU -> 1,2
+WORKER_CORE_LIST=$(seq -s, $ADMIN_CORES $WORKER_CORES)
+# always use all cores
+CORE_MASK=0x$(echo "obase=16; 2 ^ $CPU_CORES - 1" | bc)
+
+logger "NFVBENCHVM: CPU_CORES=$CPU_CORES, ADMIN_CORES=$ADMIN_CORES, WORKER_CORES=$WORKER_CORES ($WORKER_CORE_LIST)"
+
+# Isolate all cores that are reserved for workers
+tuna -c $WORKER_CORE_LIST --isolate
+
+NET_PATH=/sys/class/net
+
+get_pci_address() {
+ # device mapping for CentOS Linux 7:
+ # lspci:
+ # 00.03.0 Ethernet controller: Red Hat, Inc. Virtio network device
+ # 00.04.0 Ethernet controller: Red Hat, Inc. Virtio network device
+ # /sys/class/net:
+ # /sys/class/net/eth0 -> ../../devices/pci0000:00/0000:00:03.0/virtio0/net/eth0
+ # /sys/class/net/eth1 -> ../../devices/pci0000:00/0000:00:04.0/virtio1/net/eth1
+
+ mac=$1
+ for f in $(ls $NET_PATH/); do
+ if grep -q "$mac" $NET_PATH/$f/address; then
+ pci_addr=$(readlink $NET_PATH/$f | cut -d "/" -f5)
+ # some virtual interfaces match on MAC and do not have a PCI address
+ if [ "$pci_addr" -a "$pci_addr" != "N/A" ]; then
+ # Found matching interface
+ logger "NFVBENCHVM: found interface $f ($pci_addr) matching $mac"
+ break
+ else
+ pci_addr=""
+ fi
+ fi;
+ done
+ if [ -z "$pci_addr" ]; then
+ echo "ERROR: Cannot find pci address for MAC $mac" >&2
+ logger "NFVBENCHVM ERROR: Cannot find pci address for MAC $mac"
+ return 1
+ fi
+ echo $pci_addr
+ return 0
+}
+
+get_interfaces_mac_values(){
+ # Set dynamically interfaces mac values, if VM is spawn with SRIOV PF ports
+ # and openstack API are accessible
+ if [ -z "$LOOPBACK_INTF_MAC1" ] && [ -z "$LOOPBACK_INTF_MAC2" ]; then
+ if [ "$CLOUD_DETAIL" ] && [ "$LOOPBACK_PORT_NAME1" ] && [ "$LOOPBACK_PORT_NAME2" ]; then
+ LOOPBACK_INTF_MAC1=$(openstack --os-cloud $CLOUD_DETAIL port list | grep $LOOPBACK_PORT_NAME1 | grep -o -Ei '([a-fA-F0-9:]{17}|[a-fA-F0-9]{12}$)' | head -1)
+ LOOPBACK_INTF_MAC2=$(openstack --os-cloud $CLOUD_DETAIL port list | grep $LOOPBACK_PORT_NAME2 | grep -o -Ei '([a-fA-F0-9:]{17}|[a-fA-F0-9]{12}$)' | head -1)
+ fi
+ fi
+ if [ -z "$E2E_INTF_MAC1" ] && [ -z "$E2E_INTF_MAC2" ]; then
+ if [ "$CLOUD_DETAIL" ] && [ "$E2E_PORT_NAME1" ] && [ "$E2E_PORT_NAME2" ]; then
+ E2E_INTF_MAC1=$(openstack --os-cloud $CLOUD_DETAIL port list | grep $E2E_PORT_NAME1 | grep -o -Ei '([a-fA-F0-9:]{17}|[a-fA-F0-9]{12}$)' | head -1)
+ E2E_INTF_MAC2=$(openstack --os-cloud $CLOUD_DETAIL port list | grep $E2E_PORT_NAME2 | grep -o -Ei '([a-fA-F0-9:]{17}|[a-fA-F0-9]{12}$)' | head -1)
+ fi
+ fi
+ if [ -z "$INTF_MAC1" ] && [ -z "$INTF_MAC2" ]; then
+ if [ "$CLOUD_DETAIL" ] && [ "$PORT_NAME1" ] && [ "$PORT_NAME2" ]; then
+ INTF_MAC1=$(openstack --os-cloud $CLOUD_DETAIL port list | grep $PORT_NAME1 | grep -o -Ei '([a-fA-F0-9:]{17}|[a-fA-F0-9]{12}$)' | head -1)
+ INTF_MAC2=$(openstack --os-cloud $CLOUD_DETAIL port list | grep $PORT_NAME2 | grep -o -Ei '([a-fA-F0-9:]{17}|[a-fA-F0-9]{12}$)' | head -1)
+ fi
+ fi
+}
+
+get_interfaces_pci_address(){
+ # Sometimes the interfaces on the generator VM will use different physical networks. In this case,
+ # we have to make sure the generator uses them in the right order.
+ if [ $LOOPBACK_INTF_MAC1 ] && [ $LOOPBACK_INTF_MAC2 ]; then
+ LOOPBACK_PCI_ADDRESS_1=$(get_pci_address $LOOPBACK_INTF_MAC1)
+ LOOPBACK_PCI_ADDRESS_2=$(get_pci_address $LOOPBACK_INTF_MAC2)
+
+ echo LOOPBACK_PCI_ADDRESS_1=$LOOPBACK_PCI_ADDRESS_1 >> $NFVBENCH_CONF
+ echo LOOPBACK_PCI_ADDRESS_2=$LOOPBACK_PCI_ADDRESS_2 >> $NFVBENCH_CONF
+ fi
+ if [ $E2E_INTF_MAC1 ] && [ $E2E_INTF_MAC2 ]; then
+ E2E_PCI_ADDRESS_1=$(get_pci_address $E2E_INTF_MAC1)
+ E2E_PCI_ADDRESS_2=$(get_pci_address $E2E_INTF_MAC2)
+
+ echo E2E_PCI_ADDRESS_1=$E2E_PCI_ADDRESS_1 >> $NFVBENCH_CONF
+ echo E2E_PCI_ADDRESS_2=$E2E_PCI_ADDRESS_2 >> $NFVBENCH_CONF
+ fi
+ if [ $INTF_MAC1 ] && [ $INTF_MAC2 ]; then
+ PCI_ADDRESS_1=$(get_pci_address $INTF_MAC1)
+ PCI_ADDRESS_2=$(get_pci_address $INTF_MAC2)
+
+ echo PCI_ADDRESS_1=$PCI_ADDRESS_1 >> $NFVBENCH_CONF
+ echo PCI_ADDRESS_2=$PCI_ADDRESS_2 >> $NFVBENCH_CONF
+ fi
+}
+
+bind_interfaces(){
+ if [ $LOOPBACK_PCI_ADDRESS_1 ]; then
+ dpdk-devbind -b vfio-pci $LOOPBACK_PCI_ADDRESS_1
+ fi
+ if [ $LOOPBACK_PCI_ADDRESS_2 ]; then
+ dpdk-devbind -b vfio-pci $LOOPBACK_PCI_ADDRESS_2
+ fi
+ if [ $E2E_PCI_ADDRESS_1 ]; then
+ dpdk-devbind -b vfio-pci $E2E_PCI_ADDRESS_1
+ fi
+ if [ $E2E_PCI_ADDRESS_2 ]; then
+ dpdk-devbind -b vfio-pci $E2E_PCI_ADDRESS_2
+ fi
+ if [ $PCI_ADDRESS_1 ]; then
+ dpdk-devbind -b vfio-pci $PCI_ADDRESS_1
+ fi
+ if [ $PCI_ADDRESS_2 ]; then
+ dpdk-devbind -b vfio-pci $PCI_ADDRESS_2
+ fi
+}
+
+configure_loopback_mode(){
+ if [ $LOOPBACK_PCI_ADDRESS_1 ] && [ $LOOPBACK_PCI_ADDRESS_2 ]; then
+ logger "NFVBENCHVM: loopback - Using pci $LOOPBACK_PCI_ADDRESS_1 ($LOOPBACK_INTF_MAC1)"
+ logger "NFVBENCHVM: loopback - Using pci $LOOPBACK_PCI_ADDRESS_2 ($LOOPBACK_INTF_MAC2)"
+
+ echo "Configuring nfvbench and TRex for loopback mode..."
+ # execute env script to avoid no ENV in screen and a nfvbench error
+ source /etc/profile.d/nfvbench.sh
+ sed -i "s/{{PCI_ADDRESS_1}}/$LOOPBACK_PCI_ADDRESS_1/g" /etc/nfvbench/loopback.cfg
+ sed -i "s/{{PCI_ADDRESS_2}}/$LOOPBACK_PCI_ADDRESS_2/g" /etc/nfvbench/loopback.cfg
+ sed -i "s/{{CORES}}/$WORKER_CORES/g" /etc/nfvbench/loopback.cfg
+ CORE_THREADS=$(seq -s, 2 $((2+$WORKER_CORES)))
+ sed -i "s/{{CORE_THREADS}}/$CORE_THREADS/g" /etc/nfvbench/loopback.cfg
+ else
+ echo "ERROR: Cannot find PCI Address from MAC"
+ echo "$LOOPBACK_INTF_MAC1: $LOOPBACK_PCI_ADDRESS_1"
+ echo "$LOOPBACK_INTF_MAC2: $LOOPBACK_PCI_ADDRESS_2"
+ logger "NFVBENCHVM ERROR: Cannot find PCI Address from MAC (loopback mode)"
+ fi
+
+}
+
+configure_e2e_mode(){
+ if [ $E2E_PCI_ADDRESS_1 ] && [ $E2E_PCI_ADDRESS_2 ]; then
+ logger "NFVBENCHVM: e2e - Using pci $E2E_PCI_ADDRESS_1 ($E2E_INTF_MAC1)"
+ logger "NFVBENCHVM: e2e - Using pci $E2E_PCI_ADDRESS_2 ($E2E_INTF_MAC2)"
+
+ echo "Configuring nfvbench and TRex for e2e mode..."
+ # execute env script to avoid no ENV in screen and a nfvbench error
+ source /etc/profile.d/nfvbench.sh
+ sed -i "s/{{PCI_ADDRESS_1}}/$E2E_PCI_ADDRESS_1/g" /etc/nfvbench/e2e.cfg
+ sed -i "s/{{PCI_ADDRESS_2}}/$E2E_PCI_ADDRESS_2/g" /etc/nfvbench/e2e.cfg
+ sed -i "s/{{CORES}}/$WORKER_CORES/g" /etc/nfvbench/e2e.cfg
+ CORE_THREADS=$(seq -s, 2 $((2+$WORKER_CORES)))
+ sed -i "s/{{CORE_THREADS}}/$CORE_THREADS/g" /etc/nfvbench/e2e.cfg
+ else
+ echo "ERROR: Cannot find PCI Address from MAC"
+ echo "$E2E_INTF_MAC1: $E2E_PCI_ADDRESS_1"
+ echo "$E2E_INTF_MAC2: $E2E_PCI_ADDRESS_2"
+ logger "NFVBENCHVM ERROR: Cannot find PCI Address from MAC (e2e mode)"
+ fi
+}
+
+configure_nfvbench(){
+ if [ $PCI_ADDRESS_1 ] && [ $PCI_ADDRESS_2 ]; then
+ logger "NFVBENCHVM: Using pci $PCI_ADDRESS_1 ($INTF_MAC1)"
+ logger "NFVBENCHVM: Using pci $PCI_ADDRESS_2 ($INTF_MAC2)"
+
+ echo "Configuring nfvbench and TRex..."
+ # execute env script to avoid no ENV in screen and a nfvbench error
+ source /etc/profile.d/nfvbench.sh
+
+ if [ $DEFAULT ]; then
+ cp /nfvbench/nfvbench.conf /etc/nfvbench/nfvbench.cfg
+ fi
+ sed -i "s/{{PCI_ADDRESS_1}}/$PCI_ADDRESS_1/g" /etc/nfvbench/nfvbench.cfg
+ sed -i "s/{{PCI_ADDRESS_2}}/$PCI_ADDRESS_2/g" /etc/nfvbench/nfvbench.cfg
+ sed -i "s/{{CORES}}/$WORKER_CORES/g" /etc/nfvbench/nfvbench.cfg
+ CORE_THREADS=$(seq -s, 2 $((2+$WORKER_CORES)))
+ sed -i "s/{{CORE_THREADS}}/$CORE_THREADS/g" /etc/nfvbench/nfvbench.cfg
+
+ else
+ echo "ERROR: Cannot find PCI Address from MAC"
+ echo "$INTF_MAC1: $PCI_ADDRESS_1"
+ echo "$INTF_MAC2: $PCI_ADDRESS_2"
+ logger "NFVBENCHVM ERROR: Cannot find PCI Address from MAC"
+ fi
+}
+
+# Check if config files are provided by config drive (CLI command) or Ansible script
+# and configure NFVbench accordingly to these files
+if [ -f $E2E_CFG ]; then
+ if [ -z $E2E_PCI_ADDRESS_1 ] && [ -z $E2E_PCI_ADDRESS_2 ]; then
+ get_interfaces_mac_values
+ get_interfaces_pci_address
+ bind_interfaces
+ fi
+ configure_e2e_mode
+fi
+if [ -f $LOOPBACK_CFG ]; then
+ if [ -z $LOOPBACK_PCI_ADDRESS_1 ] && [ -z $LOOPBACK_PCI_ADDRESS_2 ]; then
+ get_interfaces_mac_values
+ get_interfaces_pci_address
+ bind_interfaces
+ fi
+ configure_loopback_mode
+fi
+# if nfvbench.cfg is provided by config drive (CLI command) or Ansible script
+# configure nfvbench using this file otherwise untemplate default config if no file exists
+if [ -f $NFVBENCH_CFG ]; then
+ if [ -z $PCI_ADDRESS_1 ] && [ -z $PCI_ADDRESS_2 ]; then
+ get_interfaces_mac_values
+ get_interfaces_pci_address
+ bind_interfaces
+ fi
+ configure_nfvbench
+elif [ ! -f $E2E_CFG ] && [ ! -f $LOOPBACK_CFG ]; then
+ if [ -z $PCI_ADDRESS_1 ] && [ -z $PCI_ADDRESS_2 ]; then
+ get_interfaces_mac_values
+ get_interfaces_pci_address
+ bind_interfaces
+ fi
+ DEFAULT=true
+ configure_nfvbench
+fi
+
+exit 0 \ No newline at end of file
diff --git a/nfvbenchvm/dib/elements/nfvbenchvm/static/nfvbench/nfvbench.conf b/nfvbenchvm/dib/elements/nfvbenchvm/static/nfvbench/nfvbench.conf
new file mode 100644
index 0000000..c1ca23e
--- /dev/null
+++ b/nfvbenchvm/dib/elements/nfvbenchvm/static/nfvbench/nfvbench.conf
@@ -0,0 +1,25 @@
+traffic_generator:
+ generator_profile:
+ - name: trex-local
+ tool: TRex
+ ip: 127.0.0.1
+ zmq_pub_port: 4500
+ zmq_rpc_port: 4501
+ software_mode: false
+
+ cores: {{CORES}}
+ platform:
+ master_thread_id: '0'
+ latency_thread_id: '1'
+ dual_if:
+ - socket: 0
+ threads: [{{CORE_THREADS}}]
+
+ interfaces:
+ - port: 0
+ pci: "{{PCI_ADDRESS_1}}"
+ switch:
+ - port: 1
+ pci: "{{PCI_ADDRESS_2}}"
+ switch:
+ intf_speed: \ No newline at end of file
diff --git a/nfvbenchvm/dib/elements/nfvbenchvm/static/nfvbench/start-nfvbench.sh b/nfvbenchvm/dib/elements/nfvbenchvm/static/nfvbench/start-nfvbench.sh
new file mode 100644
index 0000000..1f6fa28
--- /dev/null
+++ b/nfvbenchvm/dib/elements/nfvbenchvm/static/nfvbench/start-nfvbench.sh
@@ -0,0 +1,51 @@
+#!/bin/bash
+
+
+restart_nfvbench_service(){
+ service nfvbench restart
+ echo "NFVbench running in screen 'nfvbench'"
+ logger "NFVBENCHVM: NFVbench running in screen 'nfvbench'"
+}
+
+start_nfvbench(){
+ ln -sfn /etc/nfvbench/nfvbench.cfg /etc/nfvbench/nfvbench.conf
+ restart_nfvbench_service
+}
+
+start_nfvbench_e2e_mode(){
+ ln -sfn /etc/nfvbench/e2e.cfg /etc/nfvbench/nfvbench.conf
+ restart_nfvbench_service
+}
+
+start_nfvbench_loopback_mode(){
+ ln -sfn /etc/nfvbench/loopback.cfg /etc/nfvbench/nfvbench.conf
+ restart_nfvbench_service
+}
+
+usage() {
+ echo "Usage: $0 action"
+ echo "action (optional):"
+ echo "e2e start NFVbench with E2E config file"
+ echo "loopback start NFVbench with loopback config file"
+ echo ""
+ echo "If no action is given NFVbench will start with default config file"
+ exit 1
+}
+
+# ----------------------------------------------------------------------------
+# Parse command line options and configure the script
+# ----------------------------------------------------------------------------
+if [ "$#" -lt 1 ]; then
+ start_nfvbench
+ exit 0
+else
+ if [ $1 = "e2e" ]; then
+ start_nfvbench_e2e_mode
+ exit 0
+ elif [ $1 = "loopback" ]; then
+ start_nfvbench_loopback_mode
+ exit 0
+ else
+ usage
+ fi
+fi
diff --git a/nfvbenchvm/dib/elements/nfvbenchvm/static/vpp/startup.conf b/nfvbenchvm/dib/elements/nfvbenchvm/static/vpp/startup.conf
index e3f1486..874f6cb 100644
--- a/nfvbenchvm/dib/elements/nfvbenchvm/static/vpp/startup.conf
+++ b/nfvbenchvm/dib/elements/nfvbenchvm/static/vpp/startup.conf
@@ -14,11 +14,13 @@ dpdk {
dev default {
num-rx-desc 1024
num-tx-desc 1024
+ num-rx-queues {{VIF_MQ_SIZE}}
}
socket-mem 1024
dev {{PCI_ADDRESS_1}}
dev {{PCI_ADDRESS_2}}
- uio-driver igb_uio
+ uio-driver uio_pci_generic
+ num-mbufs {{NUM_MBUFS}}
}
api-segment {
diff --git a/nfvbenchvm/dib/verify-image.sh b/nfvbenchvm/dib/verify-image.sh
new file mode 100644
index 0000000..0a2090d
--- /dev/null
+++ b/nfvbenchvm/dib/verify-image.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+#
+# A shell script to verify that a VM image is present in google storage
+# If not present in google storage, verify it is present locally
+# If not present locally, build it but do not uplaod to google storage
+
+bash build-image.sh -v
diff --git a/pylint.rc b/pylint.rc
index adcd2b3..f31b894 100644
--- a/pylint.rc
+++ b/pylint.rc
@@ -50,7 +50,7 @@ confidence=
# --enable=similarities". If you want to run only the classes checker, but have
# no Warning level messages displayed, use"--disable=all --enable=classes
# --disable=W"
-disable=unused-argument,global-statement,too-many-statements,too-many-arguments,too-many-branches,catching-non-exception,relative-import,too-many-locals,invalid-name,broad-except,print-statement,parameter-unpacking,unpacking-in-except,old-raise-syntax,backtick,long-suffix,old-ne-operator,import-star-module-level,raw-checker-failed,locally-disabled,locally-enabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,apply-builtin,basestring-builtin,buffer-builtin,cmp-builtin,coerce-builtin,execfile-builtin,file-builtin,long-builtin,raw_input-builtin,reduce-builtin,standarderror-builtin,unicode-builtin,xrange-builtin,coerce-method,delslice-method,getslice-method,setslice-method,no-absolute-import,old-division,dict-iter-method,dict-view-method,next-method-called,metaclass-assignment,indexing-exception,raising-string,reload-builtin,oct-method,hex-method,nonzero-method,cmp-method,input-builtin,round-builtin,intern-builtin,unichr-builtin,map-builtin-not-iterating,zip-builtin-not-iterating,range-builtin-not-iterating,filter-builtin-not-iterating,using-cmp-argument,eq-without-hash,div-method,idiv-method,rdiv-method,exception-message-attribute,invalid-str-codec,sys-max-int,bad-python3-import,deprecated-string-function,deprecated-str-translate-call,missing-docstring,redefined-builtin,no-name-in-module,no-self-use,no-member,arguments-differ,attribute-defined-outside-init,non-iterator-returned,eval-used,unexpected-keyword-arg
+disable=unused-argument,global-statement,too-many-statements,too-many-arguments,too-many-branches,catching-non-exception,too-many-locals,invalid-name,broad-except,raw-checker-failed,locally-disabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,missing-docstring,redefined-builtin,no-name-in-module,no-member,arguments-differ,attribute-defined-outside-init,non-iterator-returned,eval-used,unexpected-keyword-arg,pointless-string-statement,no-value-for-parameter,useless-object-inheritance,import-outside-toplevel,wrong-import-order,consider-using-f-string,consider-using-generator,unnecessary-lambda-assignment,implicit-str-concat,global-variable-not-assigned
# Enable the message, report, category or checker with the given id(s). You can
# either give multiple identifier separated by comma (,) or put this option
@@ -92,36 +92,21 @@ max-nested-blocks=5
[BASIC]
-# Naming hint for argument names
-argument-name-hint=(([a-z][a-z0-9_]{2,50})|(_[a-z0-9_]*))$
-
# Regular expression matching correct argument names
argument-rgx=(([a-z][a-z0-9_]{2,50})|(_[a-z0-9_]*))$
-# Naming hint for attribute names
-attr-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
-
# Regular expression matching correct attribute names
attr-rgx=(([a-z][a-z0-9_]{2,50})|(_[a-z0-9_]*))$
# Bad variable names which should always be refused, separated by a comma
bad-names=foo,bar,baz,toto,tutu,tata
-# Naming hint for class attribute names
-class-attribute-name-hint=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$
-
# Regular expression matching correct class attribute names
class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,50}|(__.*__))$
-# Naming hint for class names
-class-name-hint=[A-Z_][a-zA-Z0-9]+$
-
# Regular expression matching correct class names
class-rgx=[A-Z_][a-zA-Z0-9]+$
-# Naming hint for constant names
-const-name-hint=(([A-Za-z_][A-Za-z0-9_]*)|(__.*__))$
-
# Regular expression matching correct constant names
const-rgx=(([A-Za-z_][A-Za-z0-9_]*)|(__.*__))$
@@ -129,9 +114,6 @@ const-rgx=(([A-Za-z_][A-Za-z0-9_]*)|(__.*__))$
# ones are exempt.
docstring-min-length=-1
-# Naming hint for function names
-function-name-hint=(([a-z][a-zA-Z0-9_]{2,50})|(_[a-z0-9_]*))$
-
# Regular expression matching correct function names
function-rgx=(([a-z][a-zA-Z0-9_]{2,50})|(_[a-z0-9_]*))$
@@ -141,21 +123,12 @@ good-names=i,j,k,ex,Run,_
# Include a hint for the correct naming format with invalid-name
include-naming-hint=no
-# Naming hint for inline iteration names
-inlinevar-name-hint=[A-Za-z_][A-Za-z0-9_]*$
-
# Regular expression matching correct inline iteration names
inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$
-# Naming hint for method names
-method-name-hint=(([a-z][a-z0-9_]{2,50})|(_[a-z0-9_]*))$
-
# Regular expression matching correct method names
method-rgx=(([a-z][a-z0-9_]{2,50})|(_[a-z0-9_]*))$
-# Naming hint for module names
-module-name-hint=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
-
# Regular expression matching correct module names
module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
@@ -171,9 +144,6 @@ no-docstring-rgx=^_
# to this list to register other decorators that produce valid properties.
property-classes=abc.abstractproperty
-# Naming hint for variable names
-variable-name-hint=(([a-z][a-z0-9_]{2,50})|(_[a-z0-9_]*))$
-
# Regular expression matching correct variable names
variable-rgx=(([a-z][a-z0-9_]{2,50})|(_[a-z0-9_]*))$
@@ -197,13 +167,7 @@ indent-string=' '
max-line-length=100
# Maximum number of lines in a module
-max-module-lines=1000
-
-# List of optional constructs for which whitespace checking is disabled. `dict-
-# separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}.
-# `trailing-comma` allows a space between comma and closing bracket: (a, ).
-# `empty-line` allows space-only lines.
-no-space-check=trailing-comma,dict-separator
+max-module-lines=1600
# Allow the body of a class to be on the same line as the declaration if body
# contains single statement.
@@ -361,7 +325,7 @@ max-args=12
max-attributes=32
# Maximum number of boolean expressions in a if statement
-max-bool-expr=5
+max-bool-expr=6
# Maximum number of branch for function / method body
max-branches=30
@@ -384,6 +348,8 @@ max-statements=50
# Minimum number of public methods for a class (see R0903).
min-public-methods=0
+[ELIF]
+max-nested-blocks=6
[IMPORTS]
diff --git a/requirements-dev.txt b/requirements-dev.txt
index 8c1bf66..5522a05 100644
--- a/requirements-dev.txt
+++ b/requirements-dev.txt
@@ -1,8 +1,11 @@
+# Python requirements to setup a development environment to be able to do
+# anything directly or with tox: run unit tests, run code quality checks, build
+# the docs, ...
+
+-c https://opendev.org/openstack/requirements/raw/branch/stable/yoga/upper-constraints.txt
-r requirements.txt
-docutils==0.14.0
-flake8>=2.3.0
-pylint>=1.3
-pep8>=1.5.7
-sphinx>=1.4.0
-sphinx_rtd_theme>=0.2.4
-tox>=2.3.0
+-r test-requirements.txt
+-r docs/requirements.txt
+
+# Install tox with the same version as on OPNFV build servers
+tox==3.21.4
diff --git a/requirements.txt b/requirements.txt
index 0a67060..488aa5f 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,27 +1,28 @@
+# Python dependencies required to run nfvbench and behave_tests
+#
# The order of packages is significant, because pip processes them in the order
# of appearance. Changing the order has an impact on the overall integration
# process, which may cause wedges in the gate later.
-pbr>=3.1.1
+pbr!=2.1.0 # Apache-2.0
attrdict>=2.0.0
bitmath>=1.3.1.1
-paramiko>=1.14.0
-prettytable>=0.7.2
-pytz>=2016.4
-six>=1.10.0
-python-glanceclient==2.6.0
-python-neutronclient<3,>=2.3.6
-python-novaclient>=2.18.1
-python-openstackclient>=0.4.1
-python-keystoneclient>=1.0.0
-pyyaml>=3.11
-pyzmq>=15.3.0
-requests>=2.13.0
-tabulate>=0.7.5
-flask>=0.12
-flask_socketio>=2.8.3
-backports.ssl-match-hostname==3.5.0.1 # via websocket-client
-socketIO-client==0.7.2
-websocket-client==0.40.0 # via socketio-client
+pytz # MIT
+python-glanceclient # Apache-2.0
+python-neutronclient # Apache-2.0
+python-novaclient # Apache-2.0
+python-openstackclient # Apache-2.0
+python-keystoneclient!=2.1.0 # Apache-2.0
+PyYAML # MIT
+tabulate # MIT
+Flask!=0.11 # BSD
fluent-logger>=0.5.3
+netaddr # BSD
+hdrhistogram>=0.8.0
+
+# Extra requirements for behave_tests:
+requests!=2.20.0,!=2.24.0 # Apache-2.0
+retry>=0.9.2
+xtesting>=0.92.0
+behave>=1.2.6
diff --git a/setup.cfg b/setup.cfg
index 0938968..d570851 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -29,18 +29,20 @@ classifier =
Operating System :: POSIX :: Linux
Operating System :: MacOS
Programming Language :: Python
- Programming Language :: Python :: 2
- Programming Language :: Python :: 2.7
+ Programming Language :: Python :: 3
+ Programming Language :: Python :: 3.8
[files]
packages =
nfvbench
+ behave_tests
[entry_points]
console_scripts =
nfvbench = nfvbench.nfvbench:main
nfvbench_client = client.nfvbench_client:main
- nfvbench_cleanup = cleanup.nfvbench_cleanup:main
+xtesting.testcase =
+ nfvbench_behaveframework = behave_tests.behavedriver:BehaveDriver
[compile_catalog]
directory = nfvbench/locale
diff --git a/setup.py b/setup.py
index bf772f3..f63cc23 100644
--- a/setup.py
+++ b/setup.py
@@ -13,27 +13,9 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-from setuptools.command.test import test
-from setuptools import setup
-import sys
+# THIS FILE IS MANAGED BY THE GLOBAL REQUIREMENTS REPO - DO NOT EDIT
+import setuptools
-
-class Tox(test):
- def initialize_options(self):
- test.initialize_options(self)
- self.tox_args = None
-
- def finalize_options(self):
- test.finalize_options(self)
- self.test_args = []
- self.test_suite = True
-
- def run_tests(self):
- import tox
- sys.exit(tox.cmdline())
-
-
-if __name__ == '__main__':
- setup(setup_requires=['pbr'], pbr=True,
- tests_require=['tox'],
- cmdclass={'test': Tox})
+setuptools.setup(
+ setup_requires=['pbr>=2.0.0'],
+ pbr=True)
diff --git a/test-requirements.txt b/test-requirements.txt
index 18f4952..4fa57c3 100644
--- a/test-requirements.txt
+++ b/test-requirements.txt
@@ -1,18 +1,21 @@
+# Python dependencies required by tox to run unit tests and code quality checks
+#
+# (dependencies required to build and check the docs can be found in
+# docs/requirements.txt)
+#
# The order of packages is significant, because pip processes them in the order
# of appearance. Changing the order has an impact on the overall integration
# process, which may cause wedges in the gate later.
-hacking<0.11,>=0.10.0
+# Requirements for nfvbench unit tests:
+pytest # MIT
+scapy>=2.3.1
+# Extra requirements for behave_tests unit tests:
+pytest-subtests
-coverage>=3.6
-discover
-python-subunit>=0.0.18
-sphinx>=1.4.0
-sphinx_rtd_theme>=0.1.9
-oslosphinx>=2.5.0 # Apache-2.0
-oslotest>=1.10.0 # Apache-2.0
-testrepository>=0.0.18
-testscenarios>=0.4
-testtools>=1.4.0
-pytest>=3.2.2
-pylint>=1.7.1
+# Requirements for pep8 test:
+hacking==5.0.0
+flake8>=3.3.0
+
+# Requirements for linter test:
+pylint==2.15.9
diff --git a/test/mock_trex.py b/test/mock_trex.py
new file mode 100644
index 0000000..cb8a081
--- /dev/null
+++ b/test/mock_trex.py
@@ -0,0 +1,82 @@
+# Copyright 2018 Cisco Systems, Inc. All rights reserved.
+#
+# 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.
+"""This module creates the missing Trex library classes when they are not installed."""
+
+import sys
+
+# Because trex_stl_lib may not be installed when running unit test
+# nfvbench.traffic_client will try to import STLError:
+# from trex.stl.api import STLError
+# will raise ImportError: No module named trex.stl.api
+# trex_gen.py will also try to import a number of trex.stl.api classes
+try:
+ import trex.stl.api
+ assert trex.stl.api
+except ImportError:
+ from types import ModuleType
+
+ # Make up a trex.stl.api.STLError class
+ class STLDummy(Exception):
+ """Dummy class."""
+
+ trex_lib_mod = ModuleType('trex')
+ sys.modules['trex'] = trex_lib_mod
+ stl_lib_mod = ModuleType('trex.stl')
+ trex_lib_mod.stl = stl_lib_mod
+ sys.modules['trex.stl'] = stl_lib_mod
+ api_mod = ModuleType('trex.stl.api')
+ stl_lib_mod.api = api_mod
+ sys.modules['trex.stl.api'] = api_mod
+ api_mod.STLError = STLDummy
+ api_mod.STLxyz = STLDummy
+ api_mod.CTRexVmInsFixHwCs = STLDummy
+ api_mod.Dot1Q = STLDummy
+ api_mod.Ether = STLDummy
+ api_mod.ARP = STLDummy
+ api_mod.IP = STLDummy
+ api_mod.ARP = STLDummy
+ api_mod.STLClient = STLDummy
+ api_mod.STLFlowLatencyStats = STLDummy
+ api_mod.STLFlowStats = STLDummy
+ api_mod.STLPktBuilder = STLDummy
+ api_mod.STLScVmRaw = STLDummy
+ api_mod.STLStream = STLDummy
+ api_mod.STLTXCont = STLDummy
+ api_mod.STLTXMultiBurst = STLDummy
+ api_mod.STLVmFixChecksumHw = STLDummy
+ api_mod.STLVmFixIpv4 = STLDummy
+ api_mod.STLVmFlowVar = STLDummy
+ api_mod.STLVmFlowVarRepeatableRandom = STLDummy
+ api_mod.STLVmTupleGen = STLDummy
+ api_mod.STLVmWrFlowVar = STLDummy
+ api_mod.UDP = STLDummy
+ api_mod.bind_layers = STLDummy
+ api_mod.FlagsField = STLDummy
+ api_mod.Packet = STLDummy
+ api_mod.ThreeBytesField = STLDummy
+ api_mod.XByteField = STLDummy
+
+ common_mod = ModuleType('trex.common')
+ trex_lib_mod.common = common_mod
+ sys.modules['trex.common'] = common_mod
+ services_mod = ModuleType('trex.common.services')
+ common_mod.services = services_mod
+ sys.modules['trex.common.services'] = services_mod
+ arp_mod = ModuleType('trex.common.services.trex_service_arp')
+ services_mod.trex_stl_service_arp = arp_mod
+ sys.modules['trex.common.services.trex_service_arp'] = arp_mod
+ arp_mod.ServiceARP = STLDummy
+
+def no_op():
+ """Empty function."""
diff --git a/test/test_chains.py b/test/test_chains.py
new file mode 100644
index 0000000..d6f32c7
--- /dev/null
+++ b/test/test_chains.py
@@ -0,0 +1,505 @@
+#!/usr/bin/env python
+# Copyright 2016 Cisco Systems, Inc. All rights reserved.
+#
+# 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.
+#
+"""Test Chaining functions."""
+
+from mock import MagicMock
+from mock import patch
+import pytest
+
+from .mock_trex import no_op
+
+from nfvbench.chain_runner import ChainRunner
+from nfvbench.chaining import ChainException
+from nfvbench.chaining import ChainVnfPort
+from nfvbench.chaining import InstancePlacer
+from nfvbench.compute import Compute
+import nfvbench.credentials
+from nfvbench.factory import BasicFactory
+import nfvbench.log
+from nfvbench.nfvbench import load_default_config
+from nfvbench.nfvbench import NFVBench
+from nfvbench.packet_stats import InterfaceStats
+from nfvbench.specs import ChainType
+from nfvbench.specs import OpenStackSpec
+from nfvbench.specs import Specs
+from nfvbench.summarizer import _annotate_chain_stats
+from nfvbench.traffic_client import TrafficClient
+from nfvbench.traffic_gen.traffic_base import Latency
+from nfvbench.traffic_gen.trex_gen import TRex
+from nfvbench import utils
+
+# just to get rid of the unused function warning
+no_op()
+
+
+def setup_module(module):
+ """Enable log."""
+ nfvbench.log.setup(mute_stdout=False)
+ nfvbench.log.set_level(debug=True)
+
+def _get_chain_config(sc=ChainType.PVP, scc=1, shared_net=True, rate='1Mpps'):
+ config, _ = load_default_config()
+ config.vm_image_file = 'nfvbenchvm-0.0.qcow2'
+ config.service_chain_count = scc
+ config.service_chain = sc
+ config.service_chain_shared_net = shared_net
+ config.rate = rate
+ config['traffic_generator']['generator_profile'] = [{'name': 'dummy',
+ 'tool': 'dummy',
+ 'ip': '127.0.0.1',
+ 'intf_speed': '10Gbps',
+ 'interfaces': [{'port': 0, 'pci': '0.0'},
+ {'port': 1, 'pci': '0.0'}]}]
+ config.ndr_run = False
+ config.pdr_run = False
+ config.single_run = True
+ config.generator_profile = 'dummy'
+ config.duration_sec = 2
+ config.interval_sec = 1
+ config.openrc_file = "dummy.rc"
+ config.no_flow_stats = False
+ config.no_latency_stats = False
+ config.no_latency_streams = False
+ config.loop_vm_arp = True
+ return config
+
+def test_chain_runner_ext_no_openstack():
+ """Test ChainRunner EXT no openstack."""
+ config = _get_chain_config(sc=ChainType.EXT)
+ specs = Specs()
+ config.vlans = [100, 200]
+ config['traffic_generator']['mac_addrs_left'] = ['00:00:00:00:00:00']
+ config['traffic_generator']['mac_addrs_right'] = ['00:00:00:00:01:00']
+
+ for shared_net in [True, False]:
+ for no_arp in [False, True]:
+ for vlan_tag in [False, True]:
+ for scc in [1, 2]:
+ config = _get_chain_config(ChainType.EXT, scc, shared_net)
+ config.no_arp = no_arp
+ if no_arp:
+ # If EXT and no arp, the config must provide mac (1 pair per chain)
+ config['traffic_generator']['mac_addrs_left'] = ['00:00:00:00:00:00'] * scc
+ config['traffic_generator']['mac_addrs_right'] = ['00:00:00:00:01:00'] * scc
+ config['vlan_tagging'] = vlan_tag
+ if vlan_tag:
+ # these are the 2 valid forms of vlan ranges
+ if scc == 1:
+ config.vlans = [100, 200]
+ else:
+ config.vlans = [[port * 100 + index for index in range(scc)]
+ for port in range(2)]
+ runner = ChainRunner(config, None, specs, BasicFactory())
+ runner.close()
+
+
+def _mock_find_image(self, image_name):
+ return MagicMock()
+
+def _mock_waiting_servers_deletion(nova_client, servers):
+ return MagicMock()
+
+@patch.object(Compute, 'find_image', _mock_find_image)
+@patch.object(utils, 'waiting_servers_deletion', _mock_waiting_servers_deletion)
+@patch('nfvbench.chaining.Client')
+@patch('nfvbench.chaining.neutronclient')
+@patch('nfvbench.chaining.glanceclient')
+def _test_pvp_chain(config, cred, mock_glance, mock_neutron, mock_client):
+ # instance = self.novaclient.servers.create(name=vmname,...)
+ # instance.status == 'ACTIVE'
+ mock_client.return_value.servers.create.return_value.status = 'ACTIVE'
+ netw = {'id': 0, 'provider:network_type': 'vlan', 'provider:segmentation_id': 1000}
+ mock_neutron.Client.return_value.create_network.return_value = {'network': netw}
+ mock_neutron.Client.return_value.list_networks.return_value = {'networks': None}
+ specs = Specs()
+ openstack_spec = OpenStackSpec()
+ specs.set_openstack_spec(openstack_spec)
+ cred = MagicMock(spec=nfvbench.credentials.Credentials)
+ cred.is_admin = True
+ runner = ChainRunner(config, cred, specs, BasicFactory())
+ runner.close()
+
+def test_pvp_chain_runner():
+ """Test PVP chain runner."""
+ cred = MagicMock(spec=nfvbench.credentials.Credentials)
+ cred.is_admin = True
+ for shared_net in [True, False]:
+ for sc in [ChainType.PVP]:
+ for scc in [1, 2]:
+ config = _get_chain_config(sc, scc, shared_net)
+ _test_pvp_chain(config, cred)
+
+
+# Test not admin exception with empty value is raised
+@patch.object(Compute, 'find_image', _mock_find_image)
+@patch.object(utils, 'waiting_servers_deletion', _mock_waiting_servers_deletion)
+@patch('nfvbench.chaining.Client')
+@patch('nfvbench.chaining.neutronclient')
+@patch('nfvbench.chaining.glanceclient')
+def _test_pvp_chain_no_admin_no_config_values(config, cred, mock_glance, mock_neutron, mock_client):
+ # instance = self.novaclient.servers.create(name=vmname,...)
+ # instance.status == 'ACTIVE'
+ mock_client.return_value.servers.create.return_value.status = 'ACTIVE'
+ netw = {'id': 0, 'provider:network_type': 'vlan', 'provider:segmentation_id': 1000}
+ mock_neutron.Client.return_value.create_network.return_value = {'network': netw}
+ mock_neutron.Client.return_value.list_networks.return_value = {'networks': None}
+ specs = Specs()
+ openstack_spec = OpenStackSpec()
+ specs.set_openstack_spec(openstack_spec)
+ runner = ChainRunner(config, cred, specs, BasicFactory())
+ runner.close()
+
+def test_pvp_chain_runner_no_admin_no_config_values():
+ """Test PVP/mock chain runner."""
+ cred = MagicMock(spec=nfvbench.credentials.Credentials)
+ cred.is_admin = False
+ for shared_net in [True, False]:
+ for sc in [ChainType.PVP]:
+ for scc in [1, 2]:
+ config = _get_chain_config(sc, scc, shared_net)
+ with pytest.raises(ChainException):
+ _test_pvp_chain_no_admin_no_config_values(config, cred)
+
+# Test not admin with mandatory parameters values in config file
+@patch.object(Compute, 'find_image', _mock_find_image)
+@patch.object(utils, 'waiting_servers_deletion', _mock_waiting_servers_deletion)
+@patch('nfvbench.chaining.Client')
+@patch('nfvbench.chaining.neutronclient')
+@patch('nfvbench.chaining.glanceclient')
+def _test_pvp_chain_no_admin_config_values(config, cred, mock_glance, mock_neutron, mock_client):
+ # instance = self.novaclient.servers.create(name=vmname,...)
+ # instance.status == 'ACTIVE'
+ mock_client.return_value.servers.create.return_value.status = 'ACTIVE'
+ netw = {'id': 0, 'provider:network_type': 'vlan', 'provider:segmentation_id': 1000}
+ mock_neutron.Client.return_value.create_network.return_value = {'network': netw}
+ mock_neutron.Client.return_value.list_networks.return_value = {'networks': None}
+ specs = Specs()
+ openstack_spec = OpenStackSpec()
+ specs.set_openstack_spec(openstack_spec)
+ runner = ChainRunner(config, cred, specs, BasicFactory())
+ runner.close()
+
+def test_pvp_chain_runner_no_admin_config_values():
+ """Test PVP chain runner."""
+ cred = MagicMock(spec=nfvbench.credentials.Credentials)
+ cred.is_admin = False
+ for shared_net in [True, False]:
+ for sc in [ChainType.PVP]:
+ for scc in [1, 2]:
+ config = _get_chain_config(sc, scc, shared_net)
+ config.availability_zone = "az"
+ config.hypervisor_hostname = "server"
+ # these are the 2 valid forms of vlan ranges
+ if scc == 1:
+ config.vlans = [100, 200]
+ else:
+ config.vlans = [[port * 100 + index for index in range(scc)]
+ for port in range(2)]
+ _test_pvp_chain_no_admin_config_values(config, cred)
+
+
+@patch.object(Compute, 'find_image', _mock_find_image)
+@patch('nfvbench.chaining.Client')
+@patch('nfvbench.chaining.neutronclient')
+@patch('nfvbench.chaining.glanceclient')
+def _test_ext_chain(config, cred, mock_glance, mock_neutron, mock_client):
+ # instance = self.novaclient.servers.create(name=vmname,...)
+ # instance.status == 'ACTIVE'
+ mock_client.return_value.servers.create.return_value.status = 'ACTIVE'
+ netw = {'id': 0, 'provider:network_type': 'vlan', 'provider:segmentation_id': 1000}
+ mock_neutron.Client.return_value.list_networks.return_value = {'networks': [netw]}
+ specs = Specs()
+ openstack_spec = OpenStackSpec()
+ specs.set_openstack_spec(openstack_spec)
+ cred = MagicMock(spec=nfvbench.credentials.Credentials)
+ cred.is_admin = True
+ runner = ChainRunner(config, cred, specs, BasicFactory())
+ runner.close()
+
+def test_ext_chain_runner():
+ """Test openstack+EXT chain runner.
+
+ Test 8 combinations of configs:
+ shared/not shared net x arp/no_arp x scc 1 or 2
+ """
+ cred = MagicMock(spec=nfvbench.credentials.Credentials)
+ cred.is_admin = True
+ for shared_net in [True, False]:
+ for no_arp in [False, True]:
+ for scc in [1, 2]:
+ config = _get_chain_config(ChainType.EXT, scc, shared_net)
+ config.no_arp = no_arp
+ # this time use a tuple of network names
+ config['external_networks']['left'] = ('ext-lnet00', 'ext-lnet01')
+ config['external_networks']['right'] = ('ext-rnet00', 'ext-rnet01')
+ if no_arp:
+ # If EXT and no arp, the config must provide mac addresses (1 pair per chain)
+ config['traffic_generator']['mac_addrs_left'] = ['00:00:00:00:00:00'] * scc
+ config['traffic_generator']['mac_addrs_right'] = ['00:00:00:00:01:00'] * scc
+ _test_ext_chain(config, cred)
+
+def _check_nfvbench_openstack(sc=ChainType.PVP, l2_loopback=False):
+ for scc in range(1, 3):
+ config = _get_chain_config(sc, scc=scc, shared_net=True)
+ if l2_loopback:
+ config.l2_loopback = True
+ config.vlans = [[100], [200]]
+ if sc == ChainType.EXT:
+ config['external_networks']['left'] = 'ext-lnet'
+ config['external_networks']['right'] = 'ext-rnet'
+ factory = BasicFactory()
+ config_plugin = factory.get_config_plugin_class()(config)
+ config = config_plugin.get_config()
+ openstack_spec = config_plugin.get_openstack_spec()
+ nfvb = NFVBench(config, openstack_spec, config_plugin, factory)
+ res = nfvb.run({}, 'pytest')
+ if res['status'] != 'OK':
+ print(res)
+ assert res['status'] == 'OK'
+
+
+mac_seq = 0
+
+def _mock_get_mac(dummy):
+ global mac_seq
+ mac_seq += 1
+ return '01:00:00:00:00:%02x' % mac_seq
+
+@patch.object(Compute, 'find_image', _mock_find_image)
+@patch.object(TrafficClient, 'skip_sleep', lambda x: True)
+@patch.object(ChainVnfPort, 'get_mac', _mock_get_mac)
+@patch.object(TrafficClient, 'is_udp', lambda x, y: True)
+@patch.object(utils, 'waiting_servers_deletion', _mock_waiting_servers_deletion)
+@patch('nfvbench.chaining.Client')
+@patch('nfvbench.chaining.neutronclient')
+@patch('nfvbench.chaining.glanceclient')
+@patch('nfvbench.nfvbench.credentials')
+def test_nfvbench_run(mock_cred, mock_glance, mock_neutron, mock_client):
+ """Test NFVbench class with openstack+PVP."""
+ # instance = self.novaclient.servers.create(name=vmname,...)
+ # instance.status == 'ACTIVE'
+ mock_client.return_value.servers.create.return_value.status = 'ACTIVE'
+ netw = {'id': 0, 'provider:network_type': 'vlan', 'provider:segmentation_id': 1000}
+ mock_neutron.Client.return_value.create_network.return_value = {'network': netw}
+ mock_neutron.Client.return_value.list_networks.return_value = {'networks': None}
+ _check_nfvbench_openstack()
+
+@patch.object(Compute, 'find_image', _mock_find_image)
+@patch.object(TrafficClient, 'skip_sleep', lambda x: True)
+@patch.object(TrafficClient, 'is_udp', lambda x, y: True)
+@patch('nfvbench.chaining.Client')
+@patch('nfvbench.chaining.neutronclient')
+@patch('nfvbench.chaining.glanceclient')
+@patch('nfvbench.nfvbench.credentials')
+def test_nfvbench_ext_arp(mock_cred, mock_glance, mock_neutron, mock_client):
+ """Test NFVbench class with openstack+EXT+ARP."""
+ # instance = self.novaclient.servers.create(name=vmname,...)
+ # instance.status == 'ACTIVE'
+ mock_client.return_value.servers.create.return_value.status = 'ACTIVE'
+ netw = {'id': 0, 'provider:network_type': 'vlan', 'provider:segmentation_id': 1000}
+ mock_neutron.Client.return_value.list_networks.return_value = {'networks': [netw]}
+ _check_nfvbench_openstack(sc=ChainType.EXT)
+
+@patch.object(Compute, 'find_image', _mock_find_image)
+@patch.object(TrafficClient, 'skip_sleep', lambda x: True)
+@patch.object(TrafficClient, 'is_udp', lambda x, y: True)
+@patch('nfvbench.chaining.Client')
+@patch('nfvbench.chaining.neutronclient')
+@patch('nfvbench.chaining.glanceclient')
+@patch('nfvbench.nfvbench.credentials')
+def test_nfvbench_l2_loopback(mock_cred, mock_glance, mock_neutron, mock_client):
+ """Test NFVbench class with l2-loopback."""
+ # instance = self.novaclient.servers.create(name=vmname,...)
+ # instance.status == 'ACTIVE'
+ mock_client.return_value.servers.create.return_value.status = 'ACTIVE'
+ _check_nfvbench_openstack(l2_loopback=True)
+
+
+# This is a reduced version of flow stats coming from Trex
+# with 2 chains and latency for a total of 8 packet groups
+# Random numbers with random losses
+CH0_P0_TX = 1234
+CH0_P1_RX = 1200
+CH0_P1_TX = 28900
+CH0_P0_RX = 28000
+LCH0_P0_TX = 167
+LCH0_P1_RX = 130
+LCH0_P1_TX = 523
+LCH0_P0_RX = 490
+CH1_P0_TX = 132344
+CH1_P1_RX = 132004
+CH1_P1_TX = 1289300
+CH1_P0_RX = 1280400
+LCH1_P0_TX = 51367
+LCH1_P1_RX = 5730
+LCH1_P1_TX = 35623
+LCH1_P0_RX = 67
+
+TREX_STATS = {
+ 'flow_stats': {
+ # chain 0 port 0 normal stream
+ 0: {'rx_pkts': {0: 0, 1: CH0_P1_RX, 'total': CH0_P1_RX},
+ 'tx_pkts': {0: CH0_P0_TX, 1: 0, 'total': CH0_P0_TX}},
+ # chain 1 port 0 normal stream
+ 1: {'rx_pkts': {0: 0, 1: CH1_P1_RX, 'total': CH1_P1_RX},
+ 'tx_pkts': {0: CH1_P0_TX, 1: 0, 'total': CH1_P0_TX}},
+ # chain 0 port 1 normal stream
+ 128: {'rx_pkts': {0: CH0_P0_RX, 1: 0, 'total': CH0_P0_RX},
+ 'tx_pkts': {0: 0, 1: CH0_P1_TX, 'total': CH0_P1_TX}},
+ # chain 1 port 1 normal stream
+ 129: {'rx_pkts': {0: CH1_P0_RX, 1: 0, 'total': CH1_P0_RX},
+ 'tx_pkts': {0: 0, 1: CH1_P1_TX, 'total': CH1_P1_TX}},
+ # chain 0 port 0 latency stream
+ 256: {'rx_pkts': {0: 0, 1: LCH0_P1_RX, 'total': LCH0_P1_RX},
+ 'tx_pkts': {0: LCH0_P0_TX, 1: 0, 'total': LCH0_P0_TX}},
+ # chain 1 port 0 latency stream
+ 257: {'rx_pkts': {0: 0, 1: LCH1_P1_RX, 'total': LCH1_P1_RX},
+ 'tx_pkts': {0: LCH1_P0_TX, 1: 0, 'total': LCH1_P0_TX}},
+ # chain 0 port 1 latency stream
+ 384: {'rx_pkts': {0: LCH0_P0_RX, 1: 0, 'total': LCH0_P0_RX},
+ 'tx_pkts': {0: 0, 1: LCH0_P1_TX, 'total': LCH0_P1_TX}},
+ # chain 1 port 1 latency stream
+ 385: {'rx_pkts': {0: LCH1_P0_RX, 1: 0, 'total': LCH1_P0_RX},
+ 'tx_pkts': {0: 0, 1: LCH1_P1_TX, 'total': LCH1_P1_TX}}}}
+
+def test_trex_streams_stats():
+ """Test TRex stats for chains 0 and 1."""
+ traffic_client = MagicMock()
+ trex = TRex(traffic_client)
+ if_stats = [InterfaceStats("p0", "dev0"), InterfaceStats("p1", "dev1")]
+ latencies = [Latency()] * 2
+ trex.get_stream_stats(TREX_STATS, if_stats, latencies, 0)
+ assert if_stats[0].tx == CH0_P0_TX + LCH0_P0_TX
+ assert if_stats[0].rx == CH0_P0_RX + LCH0_P0_RX
+ assert if_stats[1].tx == CH0_P1_TX + LCH0_P1_TX
+ assert if_stats[1].rx == CH0_P1_RX + LCH0_P1_RX
+
+ trex.get_stream_stats(TREX_STATS, if_stats, latencies, 1)
+ assert if_stats[0].tx == CH1_P0_TX + LCH1_P0_TX
+ assert if_stats[0].rx == CH1_P0_RX + LCH1_P0_RX
+ assert if_stats[1].tx == CH1_P1_TX + LCH1_P1_TX
+ assert if_stats[1].rx == CH1_P1_RX + LCH1_P1_RX
+
+def check_placer(az, hyp, req_az, resolved=False):
+ """Combine multiple combinatoons of placer tests."""
+ placer = InstancePlacer(az, hyp)
+ assert placer.is_resolved() == resolved
+ assert placer.get_required_az() == req_az
+ assert placer.register_full_name('nova:comp1')
+ assert placer.is_resolved()
+ assert placer.get_required_az() == 'nova:comp1'
+
+def test_placer_no_user_pref():
+ """Test placement when user does not provide any preference."""
+ check_placer(None, None, '')
+
+def test_placer_user_az():
+ """Test placement when user only provides an az."""
+ check_placer('nova', None, 'nova:')
+ check_placer(None, 'nova:', 'nova:')
+ check_placer('nebula', 'nova:', 'nova:')
+
+def test_placer_user_hyp():
+ """Test placement when user provides a hypervisor."""
+ check_placer(None, 'comp1', ':comp1')
+ check_placer('nova', 'comp1', 'nova:comp1', resolved=True)
+ check_placer(None, 'nova:comp1', 'nova:comp1', resolved=True)
+ # hyp overrides az
+ check_placer('nebula', 'nova:comp1', 'nova:comp1', resolved=True)
+ # also check for cases of extra parts (more than 1 ':')
+ check_placer('nova:nebula', 'comp1', 'nova:comp1', resolved=True)
+
+
+def test_placer_negative():
+ """Run negative tests on placer."""
+ # AZ mismatch
+ with pytest.raises(Exception):
+ placer = InstancePlacer('nova', None)
+ placer.register('nebula:comp1')
+ # comp mismatch
+ with pytest.raises(Exception):
+ placer = InstancePlacer(None, 'comp1')
+ placer.register('nebula:comp2')
+
+
+# without total, with total and only 2 col
+CHAIN_STATS = [{0: {'packets': [2000054, 1999996, 1999996]}},
+ {0: {'packets': [2000054, 1999996, 1999996]},
+ 1: {'packets': [2000054, 2000054, 2000054]},
+ 'total': {'packets': [4000108, 4000050, 4000050]}},
+ {0: {'packets': [2000054, 2000054]}},
+ {0: {'packets': [2000054, 1999996]}},
+ # shared networks no drops, shared nets will have empty strings
+ {0: {'packets': [15000002, '', 15000002, 15000002, '', 15000002]},
+ 1: {'packets': [15000002, '', 15000002, 15000002, '', 15000002]},
+ 'total': {'packets': [30000004, 30000004, 30000004, 30000004, 30000004, 30000004]}},
+ {0: {'packets': [15000002, '', 14000002, 14000002, '', 13000002]},
+ 1: {'packets': [15000002, '', 15000002, 15000002, '', 15000002]},
+ 'total': {'packets': [30000004, 29000004, 29000004, 29000004, 29000004, 28000004]}},
+ # example with non-available rx count in last position
+ {0: {'packets': [2000054, 1999996, None]},
+ 1: {'packets': [2000054, 2000054, None]},
+ 'total': {'packets': [4000108, 4000050, 4000050]}}]
+XP_CHAIN_STATS = [{0: {'packets': [2000054, '-58 (-0.0029%)', 1999996]}},
+ {0: {'packets': [2000054, '-58 (-0.0029%)', 1999996]},
+ 1: {'packets': [2000054, '=>', 2000054]},
+ 'total': {'packets': [4000108, '-58 (-0.0014%)', 4000050]}},
+ {0: {'packets': [2000054, 2000054]}},
+ {0: {'packets': [2000054, '-58 (-0.0029%)']}},
+ # shared net, leave spaces alone
+ {0: {'packets': [15000002, '', '=>', '=>', '', 15000002]},
+ 1: {'packets': [15000002, '', '=>', '=>', '', 15000002]},
+ 'total': {'packets': [30000004, '=>', '=>', '=>', '=>', 30000004]}},
+ {0: {'packets': [15000002, '', '-1,000,000 (-6.6667%)', '=>', '',
+ '-1,000,000 (-7.1429%)']},
+ 1: {'packets': [15000002, '', '=>', '=>', '', 15000002]},
+ 'total': {'packets': [30000004, '-1,000,000 (-3.3333%)', '=>', '=>', '=>',
+ '-1,000,000 (-3.4483%)']}},
+ {0: {'packets': [2000054, '-58 (-0.0029%)', 'n/a']},
+ 1: {'packets': [2000054, '=>', 'n/a']},
+ 'total': {'packets': [4000108, '-58 (-0.0014%)', 4000050]}}]
+
+
+def test_summarizer():
+ """Test Summarizer class."""
+ for stats, exp_stats in zip(CHAIN_STATS, XP_CHAIN_STATS):
+ _annotate_chain_stats(stats)
+ assert stats == exp_stats
+
+@patch.object(TrafficClient, 'skip_sleep', lambda x: True)
+@patch.object(TrafficClient, 'is_udp', lambda x, y: True)
+def test_fixed_rate_no_openstack():
+ """Test FIxed Rate run - no openstack."""
+ config = _get_chain_config(ChainType.EXT, 1, True, rate='100%')
+ specs = Specs()
+ config.vlans = [100, 200]
+ config['traffic_generator']['mac_addrs_left'] = ['00:00:00:00:00:00']
+ config['traffic_generator']['mac_addrs_right'] = ['00:00:00:00:01:00']
+ config.no_arp = True
+ config['vlan_tagging'] = True
+ config['traffic'] = {'profile': 'profile_64',
+ 'bidirectional': True}
+ config['traffic_profile'] = [{'name': 'profile_64', 'l2frame_size': ['64']}]
+
+ runner = ChainRunner(config, None, specs, BasicFactory())
+ tg = runner.traffic_client.gen
+
+ tg.set_response_curve(lr_dr=0, ndr=100, max_actual_tx=50, max_11_tx=50)
+ # tx packets should be 50% at requested 50% line rate or higher for 64B and no drops...
+ results = runner.run()
+ assert results
+ # pprint.pprint(results['EXT']['result']['result']['64'])
+ runner.close()
diff --git a/test/test_nfvbench.py b/test/test_nfvbench.py
index 113ecfd..e48fbda 100644
--- a/test/test_nfvbench.py
+++ b/test/test_nfvbench.py
@@ -13,259 +13,36 @@
# License for the specific language governing permissions and limitations
# under the License.
#
+import openstack
+from keystoneauth1.exceptions import HTTPClientError
+from mock import patch
+import pytest
+
+from .mock_trex import no_op
+
import json
import logging
-import os
import sys
-
-import pytest
-
from attrdict import AttrDict
from nfvbench.config import config_loads
from nfvbench.credentials import Credentials
from nfvbench.fluentd import FluentLogHandler
import nfvbench.log
-from nfvbench.network import Interface
-from nfvbench.network import Network
-from nfvbench.specs import ChainType
-from nfvbench.specs import Encaps
-import nfvbench.traffic_gen.traffic_utils as traffic_utils
-
-__location__ = os.path.realpath(os.path.join(os.getcwd(),
- os.path.dirname(__file__)))
-
-
-@pytest.fixture
-def openstack_vxlan_spec():
- return AttrDict(
- {
- 'openstack': AttrDict({
- 'vswitch': "VTS",
- 'encaps': Encaps.VxLAN}),
- 'run_spec': AttrDict({
- 'use_vpp': True
- })
- }
- )
-
-
-# =========================================================================
-# PVP Chain tests
-# =========================================================================
-
-def test_chain_interface():
- iface = Interface('testname', 'vpp', tx_packets=1234, rx_packets=4321)
- assert iface.name == 'testname'
- assert iface.device == 'vpp'
- assert iface.get_packet_count('tx') == 1234
- assert iface.get_packet_count('rx') == 4321
- assert iface.get_packet_count('wrong_key') == 0
-
-
-# pylint: disable=redefined-outer-name
-@pytest.fixture(scope='session')
-def iface1():
- return Interface('iface1', 'trex', tx_packets=10000, rx_packets=1234)
-
-
-@pytest.fixture(scope='session')
-def iface2():
- return Interface('iface2', 'n9k', tx_packets=1234, rx_packets=9901)
-
-
-@pytest.fixture(scope='session')
-def iface3():
- return Interface('iface3', 'n9k', tx_packets=9900, rx_packets=1234)
-
-
-@pytest.fixture(scope='session')
-def iface4():
- return Interface('iface4', 'vpp', tx_packets=1234, rx_packets=9801)
-
-
-@pytest.fixture(scope='session')
-def net1(iface1, iface2, iface3, iface4):
- return Network([iface1, iface2, iface3, iface4], reverse=False)
-
-
-@pytest.fixture(scope='session')
-def net2(iface1, iface2, iface3):
- return Network([iface1, iface2, iface3], reverse=True)
-
-
-def test_chain_network(net1, net2, iface1, iface2, iface3, iface4):
- assert [iface1, iface2, iface3, iface4] == net1.get_interfaces()
- assert [iface3, iface2, iface1] == net2.get_interfaces()
- net2.add_interface(iface4)
- assert [iface4, iface3, iface2, iface1] == net2.get_interfaces()
-
-
-# pylint: enable=redefined-outer-name
-
-# pylint: disable=pointless-string-statement
-"""
-def test_chain_analysis(net1, monkeypatch, openstack_vxlan_spec):
- def mock_empty(self, *args, **kwargs):
- pass
-
- monkeypatch.setattr(ServiceChain, '_setup', mock_empty)
-
- f = ServiceChain(AttrDict({'service_chain': 'DUMMY'}), [], {'tor': {}}, openstack_vxlan_spec,
- lambda x, y, z: None)
- result = f.get_analysis([net1])
- assert result[1]['packet_drop_count'] == 99
- assert result[1]['packet_drop_percentage'] == 0.99
- assert result[2]['packet_drop_count'] == 1
- assert result[2]['packet_drop_percentage'] == 0.01
- assert result[3]['packet_drop_count'] == 99
- assert result[3]['packet_drop_percentage'] == 0.99
-
- net1.reverse = True
- result = f.get_analysis([net1])
- assert result[1]['packet_drop_count'] == 0
- assert result[1]['packet_drop_percentage'] == 0.0
- assert result[2]['packet_drop_count'] == 0
- assert result[2]['packet_drop_percentage'] == 0.0
- assert result[3]['packet_drop_count'] == 0
- assert result[3]['packet_drop_percentage'] == 0.0
-
-
-@pytest.fixture
-def pvp_chain(monkeypatch, openstack_vxlan_spec):
- tor_vni1 = Interface('vni-4097', 'n9k', 50, 77)
- vsw_vni1 = Interface('vxlan_tunnel0', 'vpp', 77, 48)
- vsw_vif1 = Interface('VirtualEthernet0/0/2', 'vpp', 48, 77)
- vsw_vif2 = Interface('VirtualEthernet0/0/3', 'vpp', 77, 47)
- vsw_vni2 = Interface('vxlan_tunnel1', 'vpp', 43, 77)
- tor_vni2 = Interface('vni-4098', 'n9k', 77, 40)
-
- def mock_init(self, *args, **kwargs):
- self.vni_ports = [4097, 4098]
- self.specs = openstack_vxlan_spec
- self.clients = {
- 'vpp': AttrDict({
- 'set_interface_counters': lambda: None,
- })
- }
- self.worker = AttrDict({
- 'run': lambda: None,
- })
+import nfvbench.nfvbench
+from nfvbench.traffic_client import Device
+from nfvbench.traffic_client import GeneratorConfig
+from nfvbench.traffic_client import IpBlock
+from nfvbench.traffic_client import TrafficClient
+from nfvbench.traffic_client import TrafficClientException
+from nfvbench.traffic_gen import traffic_utils
+from nfvbench import utils
- def mock_empty(self, *args, **kwargs):
- pass
+# just to get rid of the unused function warning
+no_op()
- def mock_get_network(self, traffic_port, vni_id, reverse=False):
- if vni_id == 0:
- return Network([tor_vni1, vsw_vni1, vsw_vif1], reverse)
- else:
- return Network([tor_vni2, vsw_vni2, vsw_vif2], reverse)
-
- def mock_get_data(self):
- return {}
-
- monkeypatch.setattr(PVPChain, '_get_network', mock_get_network)
- monkeypatch.setattr(PVPChain, '_get_data', mock_get_data)
- monkeypatch.setattr(PVPChain, '_setup', mock_empty)
- monkeypatch.setattr(VxLANWorker, '_clear_interfaces', mock_empty)
- monkeypatch.setattr(PVPChain, '_generate_traffic', mock_empty)
- monkeypatch.setattr(PVPChain, '__init__', mock_init)
- return PVPChain(None, None, {'vm': None, 'vpp': None, 'tor': None, 'traffic': None}, None)
-
-
-def test_pvp_chain_run(pvp_chain):
- result = pvp_chain.run()
- expected_result = {
- 'raw_data': {},
- 'stats': None,
- 'packet_analysis': {
- 'direction-forward': [
- OrderedDict([
- ('interface', 'vni-4097'),
- ('device', 'n9k'),
- ('packet_count', 50)
- ]),
- OrderedDict([
- ('interface', 'vxlan_tunnel0'),
- ('device', 'vpp'),
- ('packet_count', 48),
- ('packet_drop_count', 2),
- ('packet_drop_percentage', 4.0)
- ]),
- OrderedDict([
- ('interface', 'VirtualEthernet0/0/2'),
- ('device', 'vpp'),
- ('packet_count', 48),
- ('packet_drop_count', 0),
- ('packet_drop_percentage', 0.0)
- ]),
- OrderedDict([
- ('interface', 'VirtualEthernet0/0/3'),
- ('device', 'vpp'),
- ('packet_count', 47),
- ('packet_drop_count', 1),
- ('packet_drop_percentage', 2.0)
- ]),
- OrderedDict([
- ('interface', 'vxlan_tunnel1'),
- ('device', 'vpp'),
- ('packet_count', 43),
- ('packet_drop_count', 4),
- ('packet_drop_percentage', 8.0)
- ]),
- OrderedDict([
- ('interface', 'vni-4098'),
- ('device', 'n9k'),
- ('packet_count', 40),
- ('packet_drop_count', 3),
- ('packet_drop_percentage', 6.0)
- ])
- ],
- 'direction-reverse': [
- OrderedDict([
- ('interface', 'vni-4098'),
- ('device', 'n9k'),
- ('packet_count', 77)
- ]),
- OrderedDict([
- ('interface', 'vxlan_tunnel1'),
- ('device', 'vpp'),
- ('packet_count', 77),
- ('packet_drop_count', 0),
- ('packet_drop_percentage', 0.0)
- ]),
- OrderedDict([
- ('interface', 'VirtualEthernet0/0/3'),
- ('device', 'vpp'),
- ('packet_count', 77),
- ('packet_drop_count', 0),
- ('packet_drop_percentage', 0.0)
- ]),
- OrderedDict([
- ('interface', 'VirtualEthernet0/0/2'),
- ('device', 'vpp'),
- ('packet_count', 77),
- ('packet_drop_count', 0),
- ('packet_drop_percentage', 0.0)
- ]),
- OrderedDict([
- ('interface', 'vxlan_tunnel0'),
- ('device', 'vpp'),
- ('packet_count', 77),
- ('packet_drop_count', 0),
- ('packet_drop_percentage', 0.0)
- ]),
- OrderedDict([
- ('interface', 'vni-4097'),
- ('device', 'n9k'),
- ('packet_count', 77),
- ('packet_drop_count', 0),
- ('packet_drop_percentage', 0.0)
- ])
- ]
- }
- }
- assert result == expected_result
-"""
+def setup_module(module):
+ """Enable log."""
+ nfvbench.log.setup(mute_stdout=True)
# =========================================================================
# Traffic client tests
@@ -298,7 +75,6 @@ def test_parse_rate_str():
return True
else:
return False
-
return False
assert should_raise_error('101')
@@ -326,12 +102,13 @@ def test_rate_conversion():
assert traffic_utils.pps_to_bps(31.6066319896, 1518) == pytest.approx(388888)
assert traffic_utils.pps_to_bps(3225895.85831, 340.3) == pytest.approx(9298322222)
+
# pps at 10Gbps line rate for 64 byte frames
LR_64B_PPS = 14880952
LR_1518B_PPS = 812743
def assert_equivalence(reference, value, allowance_pct=1):
- '''Asserts if a value is equivalent to a reference value with given margin
+ """Assert if a value is equivalent to a reference value with given margin.
:param float reference: reference value to compare to
:param float value: value to compare to reference
@@ -340,7 +117,7 @@ def assert_equivalence(reference, value, allowance_pct=1):
1 : must be equal within 1% of the reference value
...
100: always true
- '''
+ """
if reference == 0:
assert value == 0
else:
@@ -359,75 +136,45 @@ def test_load_from_rate():
avg_frame_size=1518,
line_rate='20Gbps'))
-"""
-@pytest.fixture
-def traffic_client(monkeypatch):
-
- def mock_init(self, *args, **kwargs):
- self.run_config = {
- 'bidirectional': False,
- 'l2frame_size': '64',
- 'duration_sec': 30,
- 'rates': [{'rate_percent': '10'}, {'rate_pps': '1'}]
- }
-
- def mock_modify_load(self, load):
- self.run_config['rates'][0] = {'rate_percent': str(load)}
- self.current_load = load
-
- monkeypatch.setattr(TrafficClient, '__init__', mock_init)
- monkeypatch.setattr(TrafficClient, 'modify_load', mock_modify_load)
-
- return TrafficClient()
-"""
-
-
-# pylint: enable=pointless-string-statement
-
# =========================================================================
# Other tests
# =========================================================================
-def setup_module(module):
- nfvbench.log.setup(mute_stdout=True)
-
def test_no_credentials():
- cred = Credentials('/completely/wrong/path/openrc', None, False)
- if cred.rc_auth_url:
- # shouldn't get valid data unless user set environment variables
- assert False
- else:
- assert True
+ with patch.object(openstack, 'connect') as mock:
+ cred = Credentials('/completely/wrong/path/openrc', None, None, False)
+ if cred.rc_auth_url:
+ # shouldn't get valid data unless user set environment variables
+ assert False
+ else:
+ assert True
+ mock.assert_not_called()
-# Because trex_stl_lib may not be installed when running unit test
-# nfvbench.traffic_client will try to import STLError:
-# from trex_stl_lib.api import STLError
-# will raise ImportError: No module named trex_stl_lib.api
-try:
- import trex_stl_lib.api
+def test_clouds_file_credentials():
+ with patch.object(openstack, 'connect') as mock:
+ Credentials(None, 'openstack', None, False)
+ mock.assert_called_once()
- assert trex_stl_lib.api
-except ImportError:
- # Make up a trex_stl_lib.api.STLError class
- class STLError(Exception):
- pass
+@patch('nfvbench.nfvbench.credentials')
+def test_is_not_admin(mock_session):
+ mock_session.Session.return_value.get.return_value.raiseError.side_effect = HTTPClientError
+ cred = Credentials(None, 'openstack', None, False)
+ if cred.is_admin:
+ assert False
+ else:
+ assert True
- from types import ModuleType
- stl_lib_mod = ModuleType('trex_stl_lib')
- sys.modules['trex_stl_lib'] = stl_lib_mod
- api_mod = ModuleType('trex_stl_lib.api')
- stl_lib_mod.api = api_mod
- sys.modules['trex_stl_lib.api'] = api_mod
- api_mod.STLError = STLError
+def test_is_admin():
+ with patch.object(openstack, 'connect'):
+ cred = Credentials(None, 'openstack', None, False)
+ if cred.is_admin:
+ assert True
+ else:
+ assert False
-# pylint: disable=wrong-import-position,ungrouped-imports
-from nfvbench.traffic_client import Device
-from nfvbench.traffic_client import IpBlock
-from nfvbench.traffic_client import TrafficClient
-from nfvbench.traffic_client import TrafficGeneratorFactory
def test_ip_block():
ipb = IpBlock('10.0.0.0', '0.0.0.1', 256)
@@ -435,6 +182,19 @@ def test_ip_block():
assert ipb.get_ip(255) == '10.0.0.255'
with pytest.raises(IndexError):
ipb.get_ip(256)
+ ipb = IpBlock('10.0.0.0', '0.0.0.1', 1)
+ assert ipb.get_ip() == '10.0.0.0'
+ with pytest.raises(IndexError):
+ ipb.get_ip(1)
+
+ ipb = IpBlock('10.0.0.0', '0.0.0.2', 256)
+ assert ipb.get_ip() == '10.0.0.0'
+ assert ipb.get_ip(1) == '10.0.0.2'
+ assert ipb.get_ip(127) == '10.0.0.254'
+ assert ipb.get_ip(128) == '10.0.1.0'
+ with pytest.raises(IndexError):
+ ipb.get_ip(256)
+
# verify with step larger than 1
ipb = IpBlock('10.0.0.0', '0.0.0.2', 256)
assert ipb.get_ip() == '10.0.0.0'
@@ -444,66 +204,764 @@ def test_ip_block():
with pytest.raises(IndexError):
ipb.get_ip(256)
+ ipb = IpBlock('10.0.0.0', '0.0.0.2', 128)
+ assert ipb.get_ip() == '10.0.0.0'
+ assert ipb.get_ip(1) == '10.0.0.2'
+ assert ipb.get_ip(127) == '10.0.0.254'
+ with pytest.raises(IndexError):
+ ipb.get_ip(128)
-def check_config(configs, cc, fc, src_ip, dst_ip, step_ip):
- '''Verify that the range configs for each chain have adjacent IP ranges
- of the right size and without holes between chains
- '''
- step = Device.ip_to_int(step_ip)
- cfc = 0
- sip = Device.ip_to_int(src_ip)
- dip = Device.ip_to_int(dst_ip)
- for index in range(cc):
- config = configs[index]
- assert config['ip_src_count'] == config['ip_dst_count']
- assert Device.ip_to_int(config['ip_src_addr']) == sip
- assert Device.ip_to_int(config['ip_dst_addr']) == dip
- count = config['ip_src_count']
- cfc += count
- sip += count * step
- dip += count * step
- assert cfc == fc
-
+ ipb = IpBlock('10.0.0.0', '0.0.0.4', 64)
+ assert ipb.get_ip() == '10.0.0.0'
+ assert ipb.get_ip(1) == '10.0.0.4'
+ assert ipb.get_ip(63) == '10.0.0.252'
+ with pytest.raises(IndexError):
+ ipb.get_ip(64)
-def create_device(fc, cc, ip, gip, tggip, step_ip):
- return Device(0, 0, flow_count=fc, chain_count=cc, ip=ip, gateway_ip=gip, tg_gateway_ip=tggip,
- ip_addrs_step=step_ip,
- tg_gateway_ip_addrs_step=step_ip,
- gateway_ip_addrs_step=step_ip)
+ ipb = IpBlock('10.0.0.0', '0.0.0.10', 1)
+ assert ipb.get_ip() == '10.0.0.0'
+ with pytest.raises(IndexError):
+ ipb.get_ip(1)
+
+
+def test_lcm():
+ assert utils.lcm(10, 2) == 10
+ assert utils.lcm(1, 256) == 256
+ assert utils.lcm(10, 256) == 1280
+ assert utils.lcm(utils.lcm(10, 2), utils.lcm(1, 256))
+ with pytest.raises(TypeError):
+ utils.lcm(0, 0)
+
+
+def test_flow_count_limit():
+ # lcm ip src and dst /32
+ lcm_ip = utils.lcm(1, 1) == 1
+ # port udp src = 1 port udp dst [1,29]
+ src_min = 1
+ src_max = 1
+ dst_min = 1
+ dst_max = 29
+ udp_step = 3
+ udp_src_size = Device.check_range_size(int(src_max) - int(src_min) + 1,
+ udp_step)
+ udp_dst_size = Device.check_range_size(int(dst_max) - int(dst_min) + 1,
+ udp_step)
+ lcm_port = utils.lcm(udp_src_size, udp_dst_size)
+ assert utils.lcm(lcm_ip, lcm_port) < 29
+
+
+def test_check_range_size():
+ assert Device.check_range_size(256, 1) == 256
+ assert Device.check_range_size(256, 3) == 86
+ assert Device.check_range_size(256, 4) == 64
+ assert Device.check_range_size(16, 10) == 2
+ assert Device.check_range_size(1, 10) == 1
+ with pytest.raises(ZeroDivisionError):
+ Device.check_range_size(256, 0)
+
+
+def test_reserve_ip_range():
+ ipb = IpBlock('10.0.0.0', '0.0.0.1', 256)
+ src_ip_first, src_ip_last = ipb.reserve_ip_range(256)
+ assert src_ip_first == "10.0.0.0"
+ assert src_ip_last == "10.0.0.255"
+ ipb = IpBlock('20.0.0.0', '0.0.0.1', 2)
+ src_ip_first, src_ip_last = ipb.reserve_ip_range(2)
+ assert src_ip_first == "20.0.0.0"
+ assert src_ip_last == "20.0.0.1"
+ ipb = IpBlock('30.0.0.0', '0.0.0.1', 2)
+ with pytest.raises(IndexError):
+ ipb.reserve_ip_range(256)
-def check_device_flow_config(step_ip):
- fc = 99999
- cc = 10
- ip0 = '10.0.0.0'
- ip1 = '20.0.0.0'
- tggip = '50.0.0.0'
- gip = '60.0.0.0'
- dev0 = create_device(fc, cc, ip0, gip, tggip, step_ip)
- dev1 = create_device(fc, cc, ip1, gip, tggip, step_ip)
- dev0.set_destination(dev1)
- configs = dev0.get_stream_configs(ChainType.EXT)
- check_config(configs, cc, fc, ip0, ip1, step_ip)
+def check_stream_configs(gen_config):
+ """Verify that the range for each chain have adjacent IP ranges without holes between chains."""
+ config = gen_config.config
+ tgc = config['traffic_generator']
+ step = Device.ip_to_int(tgc['ip_addrs_step'])
+ cfc = 0
+ sip = Device.ip_to_int(tgc['ip_addrs'][0].split('/')[0])
+ dip = Device.ip_to_int(tgc['ip_addrs'][1].split('/')[0])
+ stream_configs = gen_config.devices[0].get_stream_configs()
+ for index in range(config['service_chain_count']):
+ stream_cfg = stream_configs[index]
+ # ip_src_static == True
+ assert stream_cfg['ip_src_count'] == 1
+ if index == 0:
+ assert stream_cfg['ip_dst_count'] == 4999
+ else:
+ assert stream_cfg['ip_dst_count'] == 5000
+ assert stream_cfg['ip_src_addr'] == Device.int_to_ip(sip)
+ assert Device.ip_to_int(stream_cfg['ip_src_addr']) == sip
+ assert Device.ip_to_int(stream_cfg['ip_dst_addr']) == dip
+ count = stream_cfg['ip_dst_count']
+ cfc += count
+ sip += step
+ dip += count * step
+ assert cfc == int(config['flow_count'] / 2)
+def _check_device_flow_config(step_ip):
+ config = _get_dummy_tg_config('PVP', '1Mpps', scc=10, fc=99999, step_ip=step_ip)
+ gen_config = GeneratorConfig(config)
+ check_stream_configs(gen_config)
def test_device_flow_config():
- check_device_flow_config('0.0.0.1')
- check_device_flow_config('0.0.0.2')
-
-
-def test_device_ip_range():
- def ip_range_overlaps(ip0, ip1, flows):
- tggip = '50.0.0.0'
- gip = '60.0.0.0'
- dev0 = create_device(flows, 10, ip0, gip, tggip, '0.0.0.1')
- dev1 = create_device(flows, 10, ip1, gip, tggip, '0.0.0.1')
- dev0.set_destination(dev1)
- return dev0.ip_range_overlaps()
-
- assert not ip_range_overlaps('10.0.0.0', '20.0.0.0', 10000)
- assert ip_range_overlaps('10.0.0.0', '10.0.1.0', 10000)
- assert ip_range_overlaps('10.0.0.0', '10.0.1.0', 257)
- assert ip_range_overlaps('10.0.1.0', '10.0.0.0', 257)
+ _check_device_flow_config('0.0.0.1')
+ _check_device_flow_config('0.0.0.2')
+
+
+def check_udp_stream_configs(gen_config, expected_cfg):
+ """Verify that the range for each chain have adjacent UDP ports without holes between chains."""
+ config = gen_config.config
+ stream_configs = gen_config.devices[0].get_stream_configs()
+ for index in range(config['service_chain_count']):
+ stream_cfg = stream_configs[index]
+ expected = expected_cfg[index]
+ assert stream_cfg['ip_src_addr'] == expected['ip_src_addr']
+ assert stream_cfg['ip_src_addr_max'] == expected['ip_src_addr_max']
+ assert stream_cfg['ip_src_count'] == expected['ip_src_count']
+
+ assert stream_cfg['ip_dst_addr'] == expected['ip_dst_addr']
+ assert stream_cfg['ip_dst_addr_max'] == expected['ip_dst_addr_max']
+ assert stream_cfg['ip_dst_count'] == expected['ip_dst_count']
+
+ assert stream_cfg['udp_src_port'] == expected['udp_src_port']
+ assert stream_cfg['udp_src_port_max'] == expected['udp_src_port_max']
+ assert stream_cfg['udp_src_count'] == expected['udp_src_count']
+
+ assert stream_cfg['udp_dst_port'] == expected['udp_dst_port']
+ assert stream_cfg['udp_dst_port_max'] == expected['udp_dst_port_max']
+ assert stream_cfg['udp_dst_count'] == expected['udp_dst_count']
+
+ lcm_ip = utils.lcm(stream_cfg['ip_src_count'], stream_cfg['ip_dst_count'])
+ udp_src_size = int(stream_cfg['udp_src_port_max']) - int(stream_cfg['udp_src_port']) + 1
+ udp_dst_size = int(stream_cfg['udp_dst_port_max']) - int(stream_cfg['udp_dst_port']) + 1
+ lcm_udp = utils.lcm(udp_src_size, udp_dst_size)
+ assert utils.lcm(lcm_ip, lcm_udp) >= stream_cfg['count']
+
+
+def _check_device_udp_flow_config(param, expected_cfg):
+ config = _get_dummy_tg_config('PVP', '1Mpps',
+ scc=param['scc'],
+ ip_src_static=param['ip_src_static'],
+ fc=param['flow_count'],
+ ip0=param['ip_src_addr'],
+ ip1=param['ip_dst_addr'],
+ step_ip=param['ip_addrs_step'],
+ src_udp=param['udp_src_port'],
+ dst_udp=param['udp_dst_port'],
+ step_udp=param['udp_port_step'])
+ gen_config = GeneratorConfig(config)
+ check_udp_stream_configs(gen_config, expected_cfg)
+
+
+def __get_udp_params():
+ param = {'ip_src_static': True,
+ 'ip_src_addr': '110.0.0.0/32',
+ 'ip_dst_addr': '120.0.0.0/32',
+ 'ip_addrs_step': '0.0.0.1',
+ 'udp_src_port': 53,
+ 'udp_dst_port': 53,
+ 'flow_count': 2,
+ 'scc': 1,
+ 'udp_port_step': '1'}
+ return param
+
+
+def __get_udp_expected_list():
+ expected = {'ip_src_addr': '110.0.0.0',
+ 'ip_src_addr_max': '110.0.0.0',
+ 'ip_src_count': 1,
+ 'ip_dst_addr': '120.0.0.0',
+ 'ip_dst_addr_max': '120.0.0.0',
+ 'ip_dst_count': 1,
+ 'udp_src_port': 53,
+ 'udp_src_port_max': 53,
+ 'udp_src_count': 1,
+ 'udp_dst_port': 53,
+ 'udp_dst_port_max': 53,
+ 'udp_dst_count': 1}
+ return expected
+
+
+def test_device_udp_flow_config_single_ip_single_port():
+ param = __get_udp_params()
+ expected = __get_udp_expected_list()
+ _check_device_udp_flow_config(param, [expected])
+
+
+def test_device_udp_flow_config_single_ip_multiple_src_ports():
+ param = __get_udp_params()
+ expected = __get_udp_expected_list()
+ # Overwrite the udp_src_port value to define a large range of ports
+ # instead of a single port, in order to check if the imposed
+ # flow count is respected. Notice that udp range >> flow count.
+ param['udp_src_port'] = [53, 1024]
+ param['flow_count'] = 10
+ expected['udp_src_port_max'] = 57
+ expected['udp_src_count'] = 5
+ _check_device_udp_flow_config(param, [expected])
+
+
+def test_device_udp_flow_config_multiple_ip_src_single_port():
+ param = __get_udp_params()
+ expected = __get_udp_expected_list()
+ # Re affect the default udp_src_port values and
+ # overwrite the ip_dst_addr value to define a large range of addresses
+ # instead of a single one, in order to check if the imposed
+ # flow count is respected. Notice that the netmask allows a very larger
+ # range of possible addresses than the flow count value.
+ param['udp_src_port'] = 53
+ param['flow_count'] = 10
+ param['ip_src_static'] = False
+ param['ip_dst_addr'] = '120.0.0.0/24'
+
+ expected['udp_src_port_max'] = 53
+ expected['udp_src_count'] = 1
+ expected['ip_dst_addr'] = '120.0.0.0'
+ expected['ip_dst_addr_max'] = '120.0.0.4'
+ expected['ip_dst_count'] = 5
+ _check_device_udp_flow_config(param, [expected])
+
+
+def test_device_udp_flow_config_multiple_ip_src_dst_multiple_src_dst_ports():
+ param = __get_udp_params()
+ expected = __get_udp_expected_list()
+
+ param['udp_src_port'] = [49000, 49031]
+ param['udp_dst_port'] = [50000, 50033]
+ param['ip_src_static'] = False
+ param['flow_count'] = 1000
+ param['ip_src_addr'] = '110.0.0.0/16'
+ param['ip_dst_addr'] = '120.0.0.0/16'
+
+ expected['udp_src_port'] = 49000
+ expected['udp_src_port_max'] = 49024
+ expected['udp_dst_port'] = 50000
+ expected['udp_dst_port_max'] = 50024
+ expected['udp_src_count'] = 25
+ expected['udp_dst_count'] = 25
+ expected['ip_src_addr_max'] = '110.0.1.243'
+ expected['ip_src_count'] = 500
+ expected['ip_dst_addr'] = '120.0.0.0'
+ expected['ip_dst_addr_max'] = '120.0.1.243'
+ expected['ip_dst_count'] = 500
+ _check_device_udp_flow_config(param, [expected])
+
+
+
+
+def test_device_udp_flow_config_random_multiple_ip_src_dst_multiple_src_dst_ports():
+ param = __get_udp_params()
+ expected = __get_udp_expected_list()
+
+ param['udp_src_port'] = [1025, 65000]
+ param['udp_dst_port'] = [1024, 65000]
+ param['ip_src_static'] = False
+ param['ip_addrs_step'] = 'random'
+ param['udp_port_step'] = 'random'
+ param['flow_count'] = 1000000
+ param['ip_src_addr'] = '110.0.0.0/16'
+ param['ip_dst_addr'] = '120.0.0.0/16'
+
+ expected['udp_src_port'] = 1025
+ expected['udp_src_port_max'] = 65000
+ expected['udp_dst_port'] = 1024
+ expected['udp_dst_port_max'] = 65000
+ expected['udp_src_count'] = 62500
+ expected['udp_dst_count'] = 62500
+ expected['ip_src_addr_max'] = '110.0.0.31'
+ expected['ip_src_count'] = 32
+ expected['ip_dst_addr'] = '120.0.0.0'
+ expected['ip_dst_addr_max'] = '120.0.0.31'
+ expected['ip_dst_count'] = 32
+ _check_device_udp_flow_config(param, [expected])
+
+def test_device_udp_flow_config_random_multiple_ip_srcstatic_dst_multiple_src_dst_ports():
+ param = __get_udp_params()
+ expected = __get_udp_expected_list()
+
+ param['udp_src_port'] = [1025, 65000]
+ param['udp_dst_port'] = [1024, 65000]
+ param['ip_src_static'] = True
+ param['ip_addrs_step'] = 'random'
+ param['udp_port_step'] = 'random'
+ param['flow_count'] = 1000000
+ param['ip_src_addr'] = '110.0.0.0/16'
+ param['ip_dst_addr'] = '120.0.0.0/16'
+
+ expected['udp_src_port'] = 1025
+ expected['udp_src_port_max'] = 65000
+ expected['udp_dst_port'] = 1024
+ expected['udp_dst_port_max'] = 65000
+ expected['udp_src_count'] = 1
+ expected['udp_dst_count'] = 62500
+ expected['ip_src_addr_max'] = '110.0.0.0'
+ expected['ip_src_count'] = 1
+ expected['ip_dst_addr'] = '120.0.0.0'
+ expected['ip_dst_addr_max'] = '120.0.0.31'
+ expected['ip_dst_count'] = 32
+ _check_device_udp_flow_config(param, [expected])
+
+
+
+def test_device_udp_flow_config_single_ip_src_dst_multiple_src_dst_ports():
+ param = __get_udp_params()
+ expected = __get_udp_expected_list()
+
+ param['udp_src_port'] = [49152, 49154]
+ param['udp_dst_port'] = [50001, 50005]
+ param['ip_src_static'] = False
+ param['flow_count'] = 10
+ param['ip_src_addr'] = '110.0.0.0/32'
+ param['ip_dst_addr'] = '120.0.0.0/32'
+
+ expected['udp_src_port'] = 49152
+ expected['udp_src_port_max'] = 49152
+ expected['udp_dst_port'] = 50001
+ expected['udp_dst_port_max'] = 50005
+ expected['udp_src_count'] = 1
+ expected['udp_dst_count'] = 5
+ expected['ip_src_addr_max'] = '110.0.0.0'
+ expected['ip_src_count'] = 1
+ expected['ip_dst_addr'] = '120.0.0.0'
+ expected['ip_dst_addr_max'] = '120.0.0.0'
+ expected['ip_dst_count'] = 1
+ _check_device_udp_flow_config(param, [expected])
+
+
+def test_device_udp_flow_config_single_ip_src_dst_single_src_multiple_dst_ports():
+ param = __get_udp_params()
+ expected = __get_udp_expected_list()
+
+ param['udp_src_port'] = 49152
+ param['udp_dst_port'] = [50001, 50029]
+ param['udp_port_step'] = '3'
+ param['flow_count'] = 58
+ param['ip_src_addr'] = '110.0.0.0/32'
+ param['ip_dst_addr'] = '120.0.0.0/32'
+
+ expected['udp_src_port'] = 49152
+ expected['udp_src_port_max'] = 49152
+ expected['udp_dst_port'] = 50001
+ expected['udp_dst_port_max'] = 50029
+ expected['udp_src_count'] = 1
+ expected['udp_dst_count'] = 29
+ expected['ip_src_addr_max'] = '110.0.0.0'
+ expected['ip_src_count'] = 1
+ expected['ip_dst_addr'] = '120.0.0.0'
+ expected['ip_dst_addr_max'] = '120.0.0.0'
+ expected['ip_dst_count'] = 1
+ with pytest.raises(TrafficClientException):
+ _check_device_udp_flow_config(param, [expected])
+
+
+def test_device_udp_flow_config_scc3():
+ param = __get_udp_params()
+ expected = __get_udp_expected_list()
+
+ param['scc'] = 3
+ param['udp_src_port'] = [49000, 49031]
+ param['udp_dst_port'] = [50000, 50033]
+ param['ip_src_static'] = False
+ param['flow_count'] = 10000
+ param['ip_src_addr'] = '110.0.0.0/16'
+ param['ip_dst_addr'] = '120.0.0.0/16'
+
+ expected_cfg = []
+ # chain 0
+ expected_scc0 = dict(expected)
+ expected_scc0['udp_src_port'] = 49000
+ expected_scc0['udp_src_port_max'] = 49016
+ expected_scc0['udp_dst_port'] = 50000
+ expected_scc0['udp_dst_port_max'] = 50033
+ expected_scc0['udp_src_count'] = 17
+ expected_scc0['udp_dst_count'] = 34
+ expected_scc0['ip_src_addr_max'] = '110.0.6.129'
+ expected_scc0['ip_src_count'] = 1666
+ expected_scc0['ip_dst_addr'] = '120.0.0.0'
+ expected_scc0['ip_dst_addr_max'] = '120.0.6.129'
+ expected_scc0['ip_dst_count'] = 1666
+ expected_cfg.append(expected_scc0)
+
+ # chain 1
+ expected_scc1 = dict(expected)
+ expected_scc1['udp_src_port'] = 49000
+ expected_scc1['udp_src_port_max'] = 49000
+ expected_scc1['udp_dst_port'] = 50000
+ expected_scc1['udp_dst_port_max'] = 50000
+ expected_scc1['udp_src_count'] = 1
+ expected_scc1['udp_dst_count'] = 1
+ expected_scc1['ip_src_addr'] = '110.0.6.130'
+ expected_scc1['ip_src_addr_max'] = '110.0.13.4'
+ expected_scc1['ip_src_count'] = 1667
+ expected_scc1['ip_dst_addr'] = '120.0.6.130'
+ expected_scc1['ip_dst_addr_max'] = '120.0.13.4'
+ expected_scc1['ip_dst_count'] = 1667
+ expected_cfg.append(expected_scc1)
+
+ # chain 2
+ expected_scc2 = dict(expected)
+ expected_scc2['udp_src_port'] = 49000
+ expected_scc2['udp_src_port_max'] = 49000
+ expected_scc2['udp_dst_port'] = 50000
+ expected_scc2['udp_dst_port_max'] = 50000
+ expected_scc2['udp_src_count'] = 1
+ expected_scc2['udp_dst_count'] = 1
+ expected_scc2['ip_src_addr'] = '110.0.13.5'
+ expected_scc2['ip_src_addr_max'] = '110.0.19.135'
+ expected_scc2['ip_src_count'] = 1667
+ expected_scc2['ip_dst_addr'] = '120.0.13.5'
+ expected_scc2['ip_dst_addr_max'] = '120.0.19.135'
+ expected_scc2['ip_dst_count'] = 1667
+ expected_cfg.append(expected_scc2)
+
+ _check_device_udp_flow_config(param, expected_cfg)
+
+
+def test_device_udp_flow_config_doc_example1(caplog):
+ caplog.clear()
+ caplog.set_level(logging.INFO)
+ param = __get_udp_params()
+ expected = __get_udp_expected_list()
+
+ # Multiflow unitary test corresponding to first example in documentation
+ param['scc'] = 3
+ param['udp_src_port'] = 53
+ param['udp_dst_port'] = 53
+ param['ip_src_static'] = True
+ param['flow_count'] = 100
+ param['ip_src_addr'] = '110.0.0.0/8'
+ param['ip_dst_addr'] = '120.0.0.0/8'
+
+ expected_cfg = []
+ # chain 0
+ expected_scc0 = dict(expected)
+ expected_scc0['udp_src_port'] = 53
+ expected_scc0['udp_src_port_max'] = 53
+ expected_scc0['udp_dst_port'] = 53
+ expected_scc0['udp_dst_port_max'] = 53
+ expected_scc0['udp_src_count'] = 1
+ expected_scc0['udp_dst_count'] = 1
+ expected_scc0['ip_src_addr'] = '110.0.0.0'
+ expected_scc0['ip_src_addr_max'] = '110.0.0.0'
+ expected_scc0['ip_src_count'] = 1
+ expected_scc0['ip_dst_addr'] = '120.0.0.0'
+ expected_scc0['ip_dst_addr_max'] = '120.0.0.15'
+ expected_scc0['ip_dst_count'] = 16
+ expected_cfg.append(expected_scc0)
+
+ # chain 1
+ expected_scc1 = dict(expected)
+ expected_scc1['udp_src_port'] = 53
+ expected_scc1['udp_src_port_max'] = 53
+ expected_scc1['udp_dst_port'] = 53
+ expected_scc1['udp_dst_port_max'] = 53
+ expected_scc1['udp_src_count'] = 1
+ expected_scc1['udp_dst_count'] = 1
+ expected_scc1['ip_src_addr'] = '110.0.0.1'
+ expected_scc1['ip_src_addr_max'] = '110.0.0.1'
+ expected_scc1['ip_src_count'] = 1
+ expected_scc1['ip_dst_addr'] = '120.0.0.16'
+ expected_scc1['ip_dst_addr_max'] = '120.0.0.32'
+ expected_scc1['ip_dst_count'] = 17
+ expected_cfg.append(expected_scc1)
+
+ # chain 2
+ expected_scc2 = dict(expected)
+ expected_scc2['udp_src_port'] = 53
+ expected_scc2['udp_src_port_max'] = 53
+ expected_scc2['udp_dst_port'] = 53
+ expected_scc2['udp_dst_port_max'] = 53
+ expected_scc2['udp_src_count'] = 1
+ expected_scc2['udp_dst_count'] = 1
+ expected_scc2['ip_src_addr'] = '110.0.0.2'
+ expected_scc2['ip_src_addr_max'] = '110.0.0.2'
+ expected_scc2['ip_src_count'] = 1
+ expected_scc2['ip_dst_addr'] = '120.0.0.33'
+ expected_scc2['ip_dst_addr_max'] = '120.0.0.49'
+ expected_scc2['ip_dst_count'] = 17
+ expected_cfg.append(expected_scc2)
+
+ _check_device_udp_flow_config(param, expected_cfg)
+ assert "Current values of ip_addrs_step and/or udp_port_step properties" not in caplog.text
+
+
+def test_device_udp_flow_config_doc_example2(caplog):
+ caplog.clear()
+ caplog.set_level(logging.INFO)
+ param = __get_udp_params()
+ expected = __get_udp_expected_list()
+
+ # Multiflow unitary test corresponding to second example in documentation
+ param['scc'] = 3
+ param['udp_src_port'] = 53
+ param['udp_dst_port'] = 53
+ param['ip_src_static'] = True
+ param['ip_addrs_step'] = 'random'
+ param['flow_count'] = 100
+ param['ip_src_addr'] = '110.0.0.0/8'
+ param['ip_dst_addr'] = '120.0.0.0/8'
+
+ expected_cfg = []
+ # chain 0
+ expected_scc0 = dict(expected)
+ expected_scc0['udp_src_port'] = 53
+ expected_scc0['udp_src_port_max'] = 53
+ expected_scc0['udp_dst_port'] = 53
+ expected_scc0['udp_dst_port_max'] = 53
+ expected_scc0['udp_src_count'] = 1
+ expected_scc0['udp_dst_count'] = 1
+ expected_scc0['ip_src_addr'] = '110.0.0.0'
+ expected_scc0['ip_src_addr_max'] = '110.0.0.0'
+ expected_scc0['ip_src_count'] = 1
+ expected_scc0['ip_dst_addr'] = '120.0.0.0'
+ expected_scc0['ip_dst_addr_max'] = '120.0.0.15'
+ expected_scc0['ip_dst_count'] = 16
+ expected_cfg.append(expected_scc0)
+
+ # chain 1
+ expected_scc1 = dict(expected)
+ expected_scc1['udp_src_port'] = 53
+ expected_scc1['udp_src_port_max'] = 53
+ expected_scc1['udp_dst_port'] = 53
+ expected_scc1['udp_dst_port_max'] = 53
+ expected_scc1['udp_src_count'] = 1
+ expected_scc1['udp_dst_count'] = 1
+ expected_scc1['ip_src_addr'] = '110.0.0.1'
+ expected_scc1['ip_src_addr_max'] = '110.0.0.1'
+ expected_scc1['ip_src_count'] = 1
+ expected_scc1['ip_dst_addr'] = '120.0.0.16'
+ expected_scc1['ip_dst_addr_max'] = '120.0.0.32'
+ expected_scc1['ip_dst_count'] = 17
+ expected_cfg.append(expected_scc1)
+
+ # chain 2
+ expected_scc2 = dict(expected)
+ expected_scc2['udp_src_port'] = 53
+ expected_scc2['udp_src_port_max'] = 53
+ expected_scc2['udp_dst_port'] = 53
+ expected_scc2['udp_dst_port_max'] = 53
+ expected_scc2['udp_src_count'] = 1
+ expected_scc2['udp_dst_count'] = 1
+ expected_scc2['ip_src_addr'] = '110.0.0.2'
+ expected_scc2['ip_src_addr_max'] = '110.0.0.2'
+ expected_scc2['ip_src_count'] = 1
+ expected_scc2['ip_dst_addr'] = '120.0.0.33'
+ expected_scc2['ip_dst_addr_max'] = '120.0.0.49'
+ expected_scc2['ip_dst_count'] = 17
+ expected_cfg.append(expected_scc2)
+
+ _check_device_udp_flow_config(param, expected_cfg)
+ assert "Current values of ip_addrs_step and/or udp_port_step properties" not in caplog.text
+
+
+def test_device_udp_flow_config_doc_example3(caplog):
+ caplog.clear()
+ param = __get_udp_params()
+ expected = __get_udp_expected_list()
+
+ # Multiflow unitary test corresponding to third example in documentation
+ param['scc'] = 3
+ param['udp_src_port'] = 53
+ param['udp_dst_port'] = 53
+ param['ip_src_static'] = True
+ param['ip_addrs_step'] = '0.0.0.5'
+ param['flow_count'] = 100
+ param['ip_src_addr'] = '110.0.0.0/8'
+ param['ip_dst_addr'] = '120.0.0.0/8'
+
+ expected_cfg = []
+ # chain 0
+ expected_scc0 = dict(expected)
+ expected_scc0['udp_src_port'] = 53
+ expected_scc0['udp_src_port_max'] = 53
+ expected_scc0['udp_dst_port'] = 53
+ expected_scc0['udp_dst_port_max'] = 53
+ expected_scc0['udp_src_count'] = 1
+ expected_scc0['udp_dst_count'] = 1
+ expected_scc0['ip_src_addr'] = '110.0.0.0'
+ expected_scc0['ip_src_addr_max'] = '110.0.0.0'
+ expected_scc0['ip_src_count'] = 1
+ expected_scc0['ip_dst_addr'] = '120.0.0.0'
+ expected_scc0['ip_dst_addr_max'] = '120.0.0.75'
+ expected_scc0['ip_dst_count'] = 16
+ expected_cfg.append(expected_scc0)
+
+ # chain 1
+ expected_scc1 = dict(expected)
+ expected_scc1['udp_src_port'] = 53
+ expected_scc1['udp_src_port_max'] = 53
+ expected_scc1['udp_dst_port'] = 53
+ expected_scc1['udp_dst_port_max'] = 53
+ expected_scc1['udp_src_count'] = 1
+ expected_scc1['udp_dst_count'] = 1
+ expected_scc1['ip_src_addr'] = '110.0.0.5'
+ expected_scc1['ip_src_addr_max'] = '110.0.0.5'
+ expected_scc1['ip_src_count'] = 1
+ expected_scc1['ip_dst_addr'] = '120.0.0.80'
+ expected_scc1['ip_dst_addr_max'] = '120.0.0.160'
+ expected_scc1['ip_dst_count'] = 17
+ expected_cfg.append(expected_scc1)
+
+ # chain 2
+ expected_scc2 = dict(expected)
+ expected_scc2['udp_src_port'] = 53
+ expected_scc2['udp_src_port_max'] = 53
+ expected_scc2['udp_dst_port'] = 53
+ expected_scc2['udp_dst_port_max'] = 53
+ expected_scc2['udp_src_count'] = 1
+ expected_scc2['udp_dst_count'] = 1
+ expected_scc2['ip_src_addr'] = '110.0.0.10'
+ expected_scc2['ip_src_addr_max'] = '110.0.0.10'
+ expected_scc2['ip_src_count'] = 1
+ expected_scc2['ip_dst_addr'] = '120.0.0.165'
+ expected_scc2['ip_dst_addr_max'] = '120.0.0.245'
+ expected_scc2['ip_dst_count'] = 17
+ expected_cfg.append(expected_scc2)
+
+ caplog.set_level(logging.INFO)
+ _check_device_udp_flow_config(param, expected_cfg)
+ assert "Current values of ip_addrs_step and/or udp_port_step properties" not in caplog.text
+
+
+def test_device_udp_flow_config_doc_example4(caplog):
+ caplog.clear()
+ param = __get_udp_params()
+ expected = __get_udp_expected_list()
+
+ # Multiflow unitary test corresponding to fourth example in documentation
+ param['scc'] = 3
+ param['udp_src_port'] = [10, 14]
+ param['udp_dst_port'] = [20, 25]
+ param['ip_src_static'] = True
+ param['ip_addrs_step'] = '0.0.0.1'
+ param['udp_port_step'] = 'random'
+ param['flow_count'] = 100
+ param['ip_src_addr'] = '110.0.0.0/29'
+ param['ip_dst_addr'] = '120.0.0.0/30'
+
+ expected_cfg = []
+ # chain 0
+ expected_scc0 = dict(expected)
+ expected_scc0['udp_src_port'] = 10
+ expected_scc0['udp_src_port_max'] = 14
+ expected_scc0['udp_dst_port'] = 20
+ expected_scc0['udp_dst_port_max'] = 25
+ expected_scc0['udp_src_count'] = 5
+ expected_scc0['udp_dst_count'] = 6
+ expected_scc0['ip_src_addr'] = '110.0.0.0'
+ expected_scc0['ip_src_addr_max'] = '110.0.0.0'
+ expected_scc0['ip_src_count'] = 1
+ expected_scc0['ip_dst_addr'] = '120.0.0.0'
+ expected_scc0['ip_dst_addr_max'] = '120.0.0.0'
+ expected_scc0['ip_dst_count'] = 1
+ expected_cfg.append(expected_scc0)
+
+ # chain 1
+ expected_scc1 = dict(expected)
+ expected_scc1['udp_src_port'] = 10
+ expected_scc1['udp_src_port_max'] = 14
+ expected_scc1['udp_dst_port'] = 20
+ expected_scc1['udp_dst_port_max'] = 25
+ expected_scc1['udp_src_count'] = 5
+ expected_scc1['udp_dst_count'] = 6
+ expected_scc1['ip_src_addr'] = '110.0.0.1'
+ expected_scc1['ip_src_addr_max'] = '110.0.0.1'
+ expected_scc1['ip_src_count'] = 1
+ expected_scc1['ip_dst_addr'] = '120.0.0.1'
+ expected_scc1['ip_dst_addr_max'] = '120.0.0.1'
+ expected_scc1['ip_dst_count'] = 1
+ expected_cfg.append(expected_scc1)
+
+ # chain 2
+ expected_scc2 = dict(expected)
+ expected_scc2['udp_src_port'] = 10
+ expected_scc2['udp_src_port_max'] = 14
+ expected_scc2['udp_dst_port'] = 20
+ expected_scc2['udp_dst_port_max'] = 25
+ expected_scc2['udp_src_count'] = 5
+ expected_scc2['udp_dst_count'] = 6
+ expected_scc2['ip_src_addr'] = '110.0.0.2'
+ expected_scc2['ip_src_addr_max'] = '110.0.0.2'
+ expected_scc2['ip_src_count'] = 1
+ expected_scc2['ip_dst_addr'] = '120.0.0.2'
+ expected_scc2['ip_dst_addr_max'] = '120.0.0.2'
+ expected_scc2['ip_dst_count'] = 1
+ expected_cfg.append(expected_scc2)
+ caplog.set_level(logging.INFO)
+ _check_device_udp_flow_config(param, expected_cfg)
+ assert "Current values of ip_addrs_step and/or udp_port_step properties" in caplog.text
+ assert "udp_port_step='1' (previous value: udp_port_step='random'" in caplog.text
+
+
+def test_device_udp_flow_config_no_random_steps_overridden(caplog):
+ caplog.clear()
+ param = __get_udp_params()
+ expected = __get_udp_expected_list()
+
+ # Multiflow unitary test corresponding to fifth example in documentation
+ param['scc'] = 3
+ param['udp_src_port'] = [10, 14]
+ param['udp_dst_port'] = [20, 25]
+ param['ip_src_static'] = True
+ param['ip_addrs_step'] = 'random'
+ param['udp_port_step'] = 'random'
+ param['flow_count'] = 100
+ param['ip_src_addr'] = '110.0.0.0/29'
+ param['ip_dst_addr'] = '120.0.0.0/30'
+
+ expected_cfg = []
+ # chain 0
+ expected_scc0 = dict(expected)
+ expected_scc0['udp_src_port'] = 10
+ expected_scc0['udp_src_port_max'] = 14
+ expected_scc0['udp_dst_port'] = 20
+ expected_scc0['udp_dst_port_max'] = 25
+ expected_scc0['udp_src_count'] = 5
+ expected_scc0['udp_dst_count'] = 6
+ expected_scc0['ip_src_addr'] = '110.0.0.0'
+ expected_scc0['ip_src_addr_max'] = '110.0.0.0'
+ expected_scc0['ip_src_count'] = 1
+ expected_scc0['ip_dst_addr'] = '120.0.0.0'
+ expected_scc0['ip_dst_addr_max'] = '120.0.0.0'
+ expected_scc0['ip_dst_count'] = 1
+ expected_cfg.append(expected_scc0)
+
+ # chain 1
+ expected_scc1 = dict(expected)
+ expected_scc1['udp_src_port'] = 10
+ expected_scc1['udp_src_port_max'] = 14
+ expected_scc1['udp_dst_port'] = 20
+ expected_scc1['udp_dst_port_max'] = 25
+ expected_scc1['udp_src_count'] = 5
+ expected_scc1['udp_dst_count'] = 6
+ expected_scc1['ip_src_addr'] = '110.0.0.1'
+ expected_scc1['ip_src_addr_max'] = '110.0.0.1'
+ expected_scc1['ip_src_count'] = 1
+ expected_scc1['ip_dst_addr'] = '120.0.0.1'
+ expected_scc1['ip_dst_addr_max'] = '120.0.0.1'
+ expected_scc1['ip_dst_count'] = 1
+ expected_cfg.append(expected_scc1)
+
+ # chain 2
+ expected_scc2 = dict(expected)
+ expected_scc2['udp_src_port'] = 10
+ expected_scc2['udp_src_port_max'] = 14
+ expected_scc2['udp_dst_port'] = 20
+ expected_scc2['udp_dst_port_max'] = 25
+ expected_scc2['udp_src_count'] = 5
+ expected_scc2['udp_dst_count'] = 6
+ expected_scc2['ip_src_addr'] = '110.0.0.2'
+ expected_scc2['ip_src_addr_max'] = '110.0.0.2'
+ expected_scc2['ip_src_count'] = 1
+ expected_scc2['ip_dst_addr'] = '120.0.0.2'
+ expected_scc2['ip_dst_addr_max'] = '120.0.0.2'
+ expected_scc2['ip_dst_count'] = 1
+ expected_cfg.append(expected_scc2)
+ caplog.set_level(logging.INFO)
+ _check_device_udp_flow_config(param, expected_cfg)
+ assert "Current values of ip_addrs_step and/or udp_port_step properties" not in caplog.text
def test_config():
@@ -531,7 +989,7 @@ def test_config():
expected = fail_pair[1]
if expected is None:
expected = fail_pair[0]
- assert expected in e_info.value.message
+ assert expected in str(e_info)
# whitelist keys
flavor = {'flavor': {'vcpus': 2, 'ram': 8192, 'disk': 0,
@@ -593,7 +1051,9 @@ def assert_ndr_pdr(stats, ndr, ndr_dr, pdr, pdr_dr):
assert_equivalence(pdr, stats['pdr']['rate_percent'])
assert_equivalence(pdr_dr, stats['pdr']['stats']['overall']['drop_percentage'])
-def get_dummy_tg_config(chain_type, rate):
+def _get_dummy_tg_config(chain_type, rate, scc=1, fc=10, step_ip='0.0.0.1',
+ ip0='10.0.0.0/8', ip1='20.0.0.0/8',
+ step_udp='1', src_udp=None, dst_udp=None, ip_src_static=True):
return AttrDict({
'traffic_generator': {'host_name': 'nfvbench_tg',
'default_profile': 'dummy',
@@ -603,61 +1063,89 @@ def get_dummy_tg_config(chain_type, rate):
'intf_speed': '10Gbps',
'interfaces': [{'port': 0, 'pci': '0.0'},
{'port': 1, 'pci': '0.0'}]}],
- 'ip_addrs_step': '0.0.0.1',
- 'ip_addrs': ['10.0.0.0/8', '20.0.0.0/8'],
+ 'ip_addrs_step': step_ip,
+ 'ip_addrs': [ip0, ip1],
+ 'ip_src_static': ip_src_static,
'tg_gateway_ip_addrs': ['1.1.0.100', '2.2.0.100'],
- 'tg_gateway_ip_addrs_step': '0.0.0.1',
+ 'tg_gateway_ip_addrs_step': step_ip,
'gateway_ip_addrs': ['1.1.0.2', '2.2.0.2'],
- 'gateway_ip_addrs_step': '0.0.0.1',
- 'udp_src_port': None,
- 'udp_dst_port': None},
+ 'gateway_ip_addrs_step': step_ip,
+ 'mac_addrs_left': None,
+ 'mac_addrs_right': None,
+ 'udp_src_port': src_udp,
+ 'udp_dst_port': dst_udp,
+ 'udp_port_step': step_udp},
+ 'traffic': {'profile': 'profile_64',
+ 'bidirectional': True},
+ 'traffic_profile': [{'name': 'profile_64', 'l2frame_size': ['64']}],
+ 'generator_profile': None,
'service_chain': chain_type,
- 'service_chain_count': 1,
- 'flow_count': 10,
+ 'service_chain_count': scc,
+ 'flow_count': fc,
'vlan_tagging': True,
'no_arp': False,
'duration_sec': 1,
'interval_sec': 1,
+ 'pause_sec': 1,
'rate': rate,
'check_traffic_time_sec': 200,
'generic_poll_sec': 2,
'measurement': {'NDR': 0.001, 'PDR': 0.1, 'load_epsilon': 0.1},
+ 'l2_loopback': False,
+ 'cores': None,
+ 'mbuf_factor': None,
+ 'disable_hdrh': None,
+ 'mbuf_64': None,
+ 'service_mode': False,
+ 'no_flow_stats': False,
+ 'no_latency_stats': False,
+ 'no_latency_streams': False,
+ 'intf_speed': '10Gbps',
+ 'periodic_gratuitous_arp': False,
+ 'gratuitous_arp_pps': 1
})
-def get_traffic_client():
- config = get_dummy_tg_config('PVP', 'ndr_pdr')
+def _get_traffic_client(user_info=None):
+ config = _get_dummy_tg_config('PVP', 'ndr_pdr')
+ config['vxlan'] = False
+ config['mpls'] = False
config['ndr_run'] = True
config['pdr_run'] = True
config['generator_profile'] = 'dummy'
config['single_run'] = False
- generator_factory = TrafficGeneratorFactory(config)
- config.generator_config = generator_factory.get_generator_config(config.generator_profile)
- traffic_client = TrafficClient(config, skip_sleep=True)
+ if user_info:
+ config['user_info'] = user_info
+ traffic_client = TrafficClient(config)
traffic_client.start_traffic_generator()
traffic_client.set_traffic('64', True)
return traffic_client
+@patch.object(TrafficClient, 'skip_sleep', lambda x: True)
def test_ndr_at_lr():
- traffic_client = get_traffic_client()
+ """Test NDR at line rate."""
+ traffic_client = _get_traffic_client()
tg = traffic_client.gen
-
# this is a perfect sut with no loss at LR
tg.set_response_curve(lr_dr=0, ndr=100, max_actual_tx=100, max_11_tx=100)
# tx packets should be line rate for 64B and no drops...
assert tg.get_tx_pps_dropped_pps(100) == (LR_64B_PPS, 0)
# NDR and PDR should be at 100%
- traffic_client.ensure_end_to_end()
+ # traffic_client.ensure_end_to_end()
results = traffic_client.get_ndr_and_pdr()
-
assert_ndr_pdr(results, 200.0, 0.0, 200.0, 0.0)
+@patch.object(TrafficClient, 'skip_sleep', lambda x: True)
def test_ndr_at_50():
- traffic_client = get_traffic_client()
+ """Test NDR at 50% line rate.
+
+ This is a sut with an NDR of 50% and linear drop rate after NDR up to 20% drops at LR
+ (meaning that if you send 100% TX, you will only receive 80% RX)
+ the tg requested TX/actual TX ratio is up to 50%, after 50%
+ is linear up 80% actuak TX when requesting 100%
+ """
+ traffic_client = _get_traffic_client()
tg = traffic_client.gen
- # this is a sut with an NDR of 50% and linear drop rate after NDR up to 20% drops at LR
- # (meaning that if you send 100% TX, you will only receive 80% RX)
- # the tg requested TX/actual TX ratio is 1up to 50%, after 50%
- # is linear up 80% actuak TX when requesting 100%
+
tg.set_response_curve(lr_dr=20, ndr=50, max_actual_tx=80, max_11_tx=50)
# tx packets should be half line rate for 64B and no drops...
assert tg.get_tx_pps_dropped_pps(50) == (LR_64B_PPS / 2, 0)
@@ -667,12 +1155,16 @@ def test_ndr_at_50():
results = traffic_client.get_ndr_and_pdr()
assert_ndr_pdr(results, 100.0, 0.0, 100.781, 0.09374)
+@patch.object(TrafficClient, 'skip_sleep', lambda x: True)
def test_ndr_pdr_low_cpu():
- traffic_client = get_traffic_client()
+ """Test NDR and PDR with too low cpu.
+
+ This test is for the case where the TG is underpowered and cannot send fast enough for the NDR
+ true NDR=40%, actual TX at 50% = 30%, actual measured DR is 0%
+ The ndr/pdr should bail out with a warning and a best effort measured NDR of 30%
+ """
+ traffic_client = _get_traffic_client()
tg = traffic_client.gen
- # This test is for the case where the TG is underpowered and cannot send fast enough for the NDR
- # true NDR=40%, actual TX at 50% = 30%, actual measured DR is 0%
- # The ndr/pdr should bail out with a warning and a best effort measured NDR of 30%
tg.set_response_curve(lr_dr=50, ndr=40, max_actual_tx=60, max_11_tx=0)
# tx packets should be 30% at requested half line rate for 64B and no drops...
assert tg.get_tx_pps_dropped_pps(50) == (int(LR_64B_PPS * 0.3), 0)
@@ -682,11 +1174,31 @@ def test_ndr_pdr_low_cpu():
# pp = pprint.PrettyPrinter(indent=4)
# pp.pprint(results)
-import nfvbench.nfvbench
+@patch.object(TrafficClient, 'skip_sleep', lambda x: True)
+def test_ndr_at_lr_sdn_gw_encapsulation():
+ """Test NDR at line rate with traffic gen outside SUT and connected via SDN GW."""
+ user_info = {'extra_encapsulation_bytes': 28}
+ traffic_client = _get_traffic_client(user_info)
+ tg = traffic_client.gen
+ # this is a perfect sut with no loss at LR
+ tg.set_response_curve(lr_dr=0, ndr=100, max_actual_tx=100, max_11_tx=100)
+ # tx packets should be line rate for 64B and no drops...
+ assert tg.get_tx_pps_dropped_pps(100) == (LR_64B_PPS, 0)
+ # NDR and PDR should be at 100%
+ # traffic_client.ensure_end_to_end()
+ results = traffic_client.get_ndr_and_pdr()
+ assert results['ndr']['stats']['theoretical_tx_rate_bps'] == 15000000000.0
+ assert_ndr_pdr(results, 200.0, 0.0, 200.0, 0.0)
+@patch.object(TrafficClient, 'skip_sleep', lambda x: True)
def test_no_openstack():
- config = get_dummy_tg_config('EXT', '1000pps')
+ """Test nfvbench using main."""
+ config = _get_dummy_tg_config('EXT', '1000pps')
config.openrc_file = None
+ config.vlans = [[100], [200]]
+ config['traffic_generator']['mac_addrs_left'] = ['00:00:00:00:00:00']
+ config['traffic_generator']['mac_addrs_right'] = ['00:00:00:00:01:00']
+ del config['generator_profile']
old_argv = sys.argv
sys.argv = [old_argv[0], '-c', json.dumps(config)]
nfvbench.nfvbench.main()
diff --git a/test/ut_behave_tests/__init__.py b/test/ut_behave_tests/__init__.py
new file mode 100644
index 0000000..0403bca
--- /dev/null
+++ b/test/ut_behave_tests/__init__.py
@@ -0,0 +1 @@
+"""Unit tests for the behave_tests package."""
diff --git a/test/ut_behave_tests/test_data/project=nfvbench&case=characterization&criteria=PASS&page=1.json b/test/ut_behave_tests/test_data/project=nfvbench&case=characterization&criteria=PASS&page=1.json
new file mode 100644
index 0000000..885ab04
--- /dev/null
+++ b/test/ut_behave_tests/test_data/project=nfvbench&case=characterization&criteria=PASS&page=1.json
@@ -0,0 +1,48702 @@
+{
+ "pagination": {
+ "current_page": 1,
+ "total_pages": 2
+ },
+ "results": [
+ {
+ "project_name": "nfvbench",
+ "scenario": "loopback",
+ "stop_date": "2022-04-25 02:32:44",
+ "case_name": "characterization",
+ "build_tag": "TOV5HRPLCZYW",
+ "version": "unknown",
+ "pod_name": "AMICAL",
+ "criteria": "PASS",
+ "installer": "unknown",
+ "_id": "6266084fc0d88e001ca15aaf",
+ "start_date": "2022-04-25 00:13:31",
+ "details": {
+ "tests": [
+ {
+ "status": "passed",
+ "elements": [
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.1 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00011801719665527344,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "64 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "64"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 0.00010013580322265625,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.775161743164062e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.822845458984375e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 10.036147117614746,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 58.26510310173035,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00015854835510253906,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00029850006103515625,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:17",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.2 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010204315185546875,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.870529174804688e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 0.00011563301086425781,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.417533874511719e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.00789332389831543,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 48.191978454589844,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00014138221740722656,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00026345252990722656,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:18",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.3 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.942054748535156e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "256 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "256"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.655952453613281e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.632110595703125e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.608268737792969e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007787942886352539,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 48.198084115982056,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00012063980102539062,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0002589225769042969,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:19",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.4 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010013580322265625,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "512 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "512"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.72747802734375e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.5367431640625e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.393692016601562e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.0078067779541015625,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 427.4761390686035,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00012445449829101562,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00032782554626464844,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:20",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.5 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010132789611816406,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "768 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "768"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.5367431640625e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.393692016601562e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.655952453613281e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007827281951904297,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 427.47583389282227,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00011754035949707031,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00030040740966796875,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:21",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.6 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010085105895996094,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "1024 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "1024"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.751319885253906e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.584426879882812e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.703636169433594e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.008013725280761719,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 427.47237610816956,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00011968612670898438,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00029087066650390625,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:22",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.7 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00012159347534179688,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "1280 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "1280"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.870529174804688e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.584426879882812e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 0.00011706352233886719,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007834196090698242,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 427.4668493270874,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00012111663818359375,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0003085136413574219,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:23",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.8 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010085105895996094,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "1518 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "1518"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.775161743164062e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.655952453613281e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.870529174804688e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.008010625839233398,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 427.470552444458,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.0001327991485595703,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0003223419189453125,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:24",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.9 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010228157043457031,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "IMIX frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "IMIX"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.751319885253906e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.608268737792969e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.822845458984375e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007843494415283203,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 48.19991326332092,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00011920928955078125,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0002856254577636719,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:25",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.10 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010061264038085938,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "9000 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "9000"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.72747802734375e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 0.0001125335693359375,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.822845458984375e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.0078046321868896484,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 427.4356060028076,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.000133514404296875,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0003294944763183594,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:26",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.11 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010228157043457031,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "64 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "64"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.751319885253906e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "10k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "10k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.441375732421875e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.775161743164062e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007808685302734375,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 54.21188402175903,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.0001220703125,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00028014183044433594,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:27",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.12 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.942054748535156e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.584426879882812e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "10k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "10k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 0.00011420249938964844,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.369850158691406e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.0078582763671875,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 54.213879346847534,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00014543533325195312,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00026297569274902344,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:28",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.13 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.918212890625e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "256 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "256"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.679794311523438e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "10k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "10k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.679794311523438e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.393692016601562e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007826566696166992,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 54.2158465385437,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.0001385211944580078,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0002658367156982422,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:29",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.14 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010061264038085938,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "512 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "512"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.751319885253906e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "10k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "10k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.72747802734375e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.679794311523438e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.00782465934753418,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 180.64374685287476,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00012063980102539062,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00026535987854003906,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:30",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.15 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010061264038085938,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "768 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "768"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.703636169433594e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "10k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "10k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.751319885253906e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.72747802734375e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.0077762603759765625,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 433.4992287158966,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00014448165893554688,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00032806396484375,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:31",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.16 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010180473327636719,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "1024 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "1024"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.489059448242188e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "10k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "10k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.632110595703125e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.822845458984375e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007920503616333008,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 433.49558329582214,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00011801719665527344,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00028133392333984375,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:32",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.17 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00011992454528808594,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "1280 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "1280"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.608268737792969e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "10k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "10k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.369850158691406e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 0.00012254714965820312,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007806301116943359,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 433.5018527507782,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.0001227855682373047,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0003173351287841797,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:33",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.18 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010251998901367188,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "1518 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "1518"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.72747802734375e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "10k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "10k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.489059448242188e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.679794311523438e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007884740829467773,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 433.5023431777954,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00012040138244628906,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00028133392333984375,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:34",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.19 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010061264038085938,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "IMIX frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "IMIX"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.846687316894531e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "10k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "10k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.512901306152344e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.417533874511719e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007809638977050781,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 56.228487968444824,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00013756752014160156,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00026535987854003906,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:35",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.20 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010156631469726562,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "9000 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "9000"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.870529174804688e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "10k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "10k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.965896606445312e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.703636169433594e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.00783085823059082,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 433.4738347530365,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00014972686767578125,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0002911090850830078,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:36",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.21 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010085105895996094,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "64 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "64"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 0.00011968612670898438,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.72747802734375e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.441375732421875e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.00802922248840332,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 60.2336266040802,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00011706352233886719,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0002532005310058594,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:37",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.22 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.942054748535156e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 0.00010132789611816406,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.679794311523438e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.703636169433594e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007838964462280273,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 60.23164749145508,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00012135505676269531,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00025343894958496094,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:38",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.23 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.846687316894531e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "256 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "256"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 0.00011467933654785156,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.894371032714844e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.584426879882812e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.00780177116394043,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 60.239051818847656,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00011920928955078125,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0002503395080566406,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:39",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.24 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.989738464355469e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "512 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "512"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.751319885253906e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.441375732421875e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.560585021972656e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.008019447326660156,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 309.0816767215729,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00012183189392089844,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00026702880859375,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:40",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.25 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00011706352233886719,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "768 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "768"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.679794311523438e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.441375732421875e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.369850158691406e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007838964462280273,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 433.50160241127014,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00012803077697753906,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0002942085266113281,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:41",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.26 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010156631469726562,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "1024 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "1024"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.870529174804688e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.560585021972656e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.417533874511719e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007815361022949219,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 433.4943425655365,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00011849403381347656,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0003044605255126953,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:42",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.27 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.989738464355469e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "1280 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "1280"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.703636169433594e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 0.00011754035949707031,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.560585021972656e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007854700088500977,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 433.5042459964752,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00012087821960449219,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0002963542938232422,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:43",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.28 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.965896606445312e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "1518 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "1518"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.72747802734375e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.393692016601562e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.465217590332031e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007800579071044922,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 433.4900460243225,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00011992454528808594,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0003037452697753906,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:44",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.29 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010275840759277344,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "IMIX frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "IMIX"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.560585021972656e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.560585021972656e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.72747802734375e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007885217666625977,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 60.23350286483765,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.0001304149627685547,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0002522468566894531,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:45",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.30 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010347366333007812,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "9000 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "9000"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.679794311523438e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.5367431640625e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 0.00011348724365234375,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.008048772811889648,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 433.47489833831787,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00013017654418945312,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0002841949462890625,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:46",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a latency test for a defined frame size and throughput percentage -- @1.1 Frame sizes and throughput percentages",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "latency"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:51",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010156631469726562,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "TRex is restarted",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:52",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:99"
+ },
+ "result": {
+ "duration": 9.703636169433594e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "64 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:53",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "64"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 0.0003788471221923828,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:54",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.870529174804688e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "70% rate of previous scenario",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:55",
+ "match": {
+ "arguments": [
+ {
+ "name": "percentage_rate",
+ "value": "70%"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:129"
+ },
+ "result": {
+ "duration": 0.0002548694610595703,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:56",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.00780487060546875,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "run is started and waiting for result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:57",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 36.23451280593872,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:58",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00015497207641601562,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:62",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a latency test for a defined frame size and throughput percentage -- @1.2 Frame sizes and throughput percentages",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "latency"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:51",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00011444091796875,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "TRex is restarted",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:52",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:99"
+ },
+ "result": {
+ "duration": 0.00011348724365234375,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "64 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:53",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "64"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 0.00010061264038085938,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:54",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.703636169433594e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "90% rate of previous scenario",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:55",
+ "match": {
+ "arguments": [
+ {
+ "name": "percentage_rate",
+ "value": "90%"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:129"
+ },
+ "result": {
+ "duration": 0.00025391578674316406,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:56",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.00824594497680664,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "run is started and waiting for result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:57",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 36.24914073944092,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:58",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.0001533031463623047,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:63",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a latency test for a defined frame size and throughput percentage -- @1.3 Frame sizes and throughput percentages",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "latency"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:51",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00011730194091796875,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "TRex is restarted",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:52",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:99"
+ },
+ "result": {
+ "duration": 0.00011968612670898438,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "768 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:53",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "768"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.72747802734375e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:54",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.584426879882812e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "70% rate of previous scenario",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:55",
+ "match": {
+ "arguments": [
+ {
+ "name": "percentage_rate",
+ "value": "70%"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:129"
+ },
+ "result": {
+ "duration": 0.00025177001953125,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:56",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.0079345703125,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "run is started and waiting for result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:57",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 36.221691846847534,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:58",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.0001533031463623047,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:64",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a latency test for a defined frame size and throughput percentage -- @1.4 Frame sizes and throughput percentages",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "latency"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:51",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.0001347064971923828,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "TRex is restarted",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:52",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:99"
+ },
+ "result": {
+ "duration": 9.72747802734375e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "768 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:53",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "768"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.703636169433594e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:54",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 0.00011730194091796875,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "90% rate of previous scenario",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:55",
+ "match": {
+ "arguments": [
+ {
+ "name": "percentage_rate",
+ "value": "90%"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:129"
+ },
+ "result": {
+ "duration": 0.00024175643920898438,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:56",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.0079345703125,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "run is started and waiting for result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:57",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 36.23504996299744,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:58",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00016355514526367188,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:65",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a latency test for a defined frame size and throughput percentage -- @1.5 Frame sizes and throughput percentages",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "latency"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:51",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00011444091796875,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "TRex is restarted",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:52",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:99"
+ },
+ "result": {
+ "duration": 0.00011706352233886719,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "1518 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:53",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "1518"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.632110595703125e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:54",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 0.00010013580322265625,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "70% rate of previous scenario",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:55",
+ "match": {
+ "arguments": [
+ {
+ "name": "percentage_rate",
+ "value": "70%"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:129"
+ },
+ "result": {
+ "duration": 0.0002498626708984375,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:56",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007980108261108398,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "run is started and waiting for result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:57",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 36.23746657371521,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:58",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.0001513957977294922,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:66",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a latency test for a defined frame size and throughput percentage -- @1.6 Frame sizes and throughput percentages",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "latency"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:51",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00011491775512695312,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "TRex is restarted",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:52",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:99"
+ },
+ "result": {
+ "duration": 9.775161743164062e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "1518 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:53",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "1518"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.584426879882812e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:54",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.512901306152344e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "90% rate of previous scenario",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:55",
+ "match": {
+ "arguments": [
+ {
+ "name": "percentage_rate",
+ "value": "90%"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:129"
+ },
+ "result": {
+ "duration": 0.0002338886260986328,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:56",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007954835891723633,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "run is started and waiting for result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:57",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 36.25133943557739,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:58",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00015425682067871094,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:67",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a latency test for a defined frame size and throughput percentage -- @1.7 Frame sizes and throughput percentages",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "latency"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:51",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00011301040649414062,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "TRex is restarted",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:52",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:99"
+ },
+ "result": {
+ "duration": 9.751319885253906e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "9000 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:53",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "9000"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.655952453613281e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:54",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.560585021972656e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "70% rate of previous scenario",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:55",
+ "match": {
+ "arguments": [
+ {
+ "name": "percentage_rate",
+ "value": "70%"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:129"
+ },
+ "result": {
+ "duration": 0.00024771690368652344,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:56",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.008048534393310547,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "run is started and waiting for result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:57",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 36.24317383766174,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:58",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00015354156494140625,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:68",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a latency test for a defined frame size and throughput percentage -- @1.8 Frame sizes and throughput percentages",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "latency"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:51",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00011491775512695312,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "TRex is restarted",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:52",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:99"
+ },
+ "result": {
+ "duration": 0.00011086463928222656,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "9000 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:53",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "9000"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.608268737792969e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:54",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.489059448242188e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "90% rate of previous scenario",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:55",
+ "match": {
+ "arguments": [
+ {
+ "name": "percentage_rate",
+ "value": "90%"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:129"
+ },
+ "result": {
+ "duration": 0.0002601146697998047,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:56",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007915735244750977,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "run is started and waiting for result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:57",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 36.240649700164795,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:58",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00015354156494140625,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:69",
+ "type": "scenario"
+ }
+ ],
+ "name": "characterization",
+ "keyword": "Feature",
+ "tags": [
+ "characterization"
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:2"
+ }
+ ],
+ "skip_tests": 0,
+ "links": [
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/xtesting.log",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_768-fc_100k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_128-fc_128-rate_ndr-0.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_1518-fc_100k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_512-fc_100k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_64-fc_128-rate_ndr-2.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_9000-fc_10k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_1280-fc_100k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_1024-fc_128-rate_ndr-0.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_64-fc_128-rate_ndr-1.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_64-fc_10k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_768-fc_10k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_128-fc_128-rate_ndr-2.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_IMIX-fc_10k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_256-fc_10k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_9000-fc_100k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/output.html",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_1024-fc_128-rate_ndr-1.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_512-fc_128-rate_ndr-1.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_256-fc_100k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_256-fc_128-rate_ndr-2.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_1024-fc_100k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_128-fc_10k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_9000-fc_100k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_64-fc_100k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-latency-fs_64-fc_100k-rate_70%.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_1280-fc_128-rate_ndr-2.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_256-fc_100k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_512-fc_10k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_768-fc_10k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_768-fc_128-rate_ndr-0.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_512-fc_100k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_IMIX-fc_100k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_64-fc_100k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_1024-fc_100k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_1280-fc_100k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_128-fc_128-rate_ndr-1.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_128-fc_100k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_9000-fc_128-rate_ndr-0.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_9000-fc_128-rate_ndr-1.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_IMIX-fc_128-rate_ndr-1.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_768-fc_10k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_1280-fc_10k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_IMIX-fc_100k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_IMIX-fc_128-rate_ndr-2.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_IMIX-fc_10k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_1518-fc_100k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/behave_tests.log",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_128-fc_10k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-latency-fs_9000-fc_100k-rate_70%.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_512-fc_128-rate_ndr-0.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_9000-fc_128-rate_ndr-2.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_768-fc_100k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/campaign_result.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_9000-fc_10k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_512-fc_10k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_256-fc_10k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_128-fc_100k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-latency-fs_768-fc_100k-rate_90%.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_IMIX-fc_128-rate_ndr-0.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_1280-fc_100k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_64-fc_100k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_1518-fc_128-rate_ndr-0.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/TESTS-characterization-full.xml",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-latency-fs_1518-fc_100k-rate_90%.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_1518-fc_10k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_9000-fc_100k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_256-fc_10k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_64-fc_128-rate_ndr-0.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_1024-fc_128-rate_ndr-2.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_1518-fc_100k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_9000-fc_10k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_1024-fc_10k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_1024-fc_100k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_256-fc_100k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_IMIX-fc_10k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_512-fc_100k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_1024-fc_10k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_1280-fc_128-rate_ndr-0.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_1280-fc_128-rate_ndr-1.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_768-fc_128-rate_ndr-2.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_512-fc_10k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_1518-fc_10k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_768-fc_100k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-latency-fs_64-fc_100k-rate_90%.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_256-fc_128-rate_ndr-0.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_1518-fc_128-rate_ndr-1.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-latency-fs_768-fc_100k-rate_70%.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_256-fc_128-rate_ndr-1.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench.log",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_1518-fc_128-rate_ndr-2.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_64-fc_10k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-latency-fs_9000-fc_100k-rate_90%.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_IMIX-fc_100k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_1518-fc_10k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_1280-fc_10k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_512-fc_128-rate_ndr-2.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_128-fc_10k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_768-fc_128-rate_ndr-1.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-latency-fs_1518-fc_100k-rate_70%.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_1024-fc_10k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_64-fc_10k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_128-fc_100k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/output.json",
+ "http://172.20.73.203:8181/TOV5HRPLCZYW/nfvbench-amical-loopback-_-nfvbench-launcher-latest-devel-nfvbench_loopback_only_test_characterization-run-25/characterization/nfvbench-throughput-fs_1280-fc_10k-rate_ndr-1.json"
+ ],
+ "results": {
+ "latency": [
+ {
+ "input": {
+ "rate": "70%",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_64-fc_100k-rate_70%.json",
+ "frame_sizes": [
+ "64"
+ ],
+ "duration_sec": "10",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc18_loopback",
+ "restart": "true"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-04-25 02:28:13",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:07.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "EXT",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn1ter",
+ "name": "net_nfvbench_vn1ter",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1",
+ "name": "net_nfvbench_vn1",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": "true",
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": true,
+ "request_id": "29ad1ab70db044069cca0a6862c8d563",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "11735907pps",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "64"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": false,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_64-fc_100k-rate_70%.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": true,
+ "no_arp": true,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "64"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2505,
+ 2505
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc18_loopback",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "flavor_nfvbench_dpdk",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_64-fc_100k-rate_70%.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "EXT": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "64": {
+ "run_config": {
+ "direction-forward": {
+ "rx": {
+ "rate_percent": 15.714376742399999,
+ "rate_pps": 5846122,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 3928594185
+ },
+ "tx": {
+ "rate_percent": 15.714376742399999,
+ "rate_pps": 5846122,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 3928594185
+ },
+ "orig": {
+ "rate_percent": 15.773059008,
+ "rate_pps": 5867953,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 3943264752
+ }
+ },
+ "direction-total": {
+ "rx": {
+ "rate_percent": 31.429699929599998,
+ "rate_pps": 11692596.0,
+ "rate_bps": 7857424981.0
+ },
+ "tx": {
+ "rate_percent": 31.429699929599998,
+ "rate_pps": 11692596.0,
+ "rate_bps": 7857424981.0
+ },
+ "orig": {
+ "rate_percent": 31.546118016,
+ "rate_pps": 11735906.0,
+ "rate_bps": 7886529504.0
+ }
+ },
+ "direction-reverse": {
+ "rx": {
+ "rate_percent": 15.715323187200001,
+ "rate_pps": 5846474,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 3928830796
+ },
+ "tx": {
+ "rate_percent": 15.715323187200001,
+ "rate_pps": 5846474,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 3928830796
+ },
+ "orig": {
+ "rate_percent": 15.773059008,
+ "rate_pps": 5867953,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 3943264752
+ }
+ }
+ },
+ "packet_path_stats": {
+ "Forward": {
+ "interfaces": [
+ "TRex.TX.p0",
+ "TRex.RX.p1"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 58410774,
+ "-59 (-0.0001%)"
+ ],
+ "lat_max_usec": 42,
+ "lat_avg_usec": 16,
+ "lat_min_usec": 5,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ },
+ "Reverse": {
+ "interfaces": [
+ "TRex.TX.p1",
+ "TRex.RX.p0"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 58464744,
+ 58464744
+ ],
+ "lat_max_usec": 42,
+ "lat_avg_usec": 15,
+ "lat_min_usec": 5,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ }
+ },
+ "stats": {
+ "total_tx_rate": 11692596,
+ "overall": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 3193174528.0,
+ "pkt_rate": 5869806.5,
+ "max_delay_usec": 42,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "avg_delay_usec": 15.50001505653573,
+ "total_pkt_bytes": 7950965756,
+ "total_pkts": 116925967,
+ "min_delay_usec": 5
+ },
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg=",
+ "tx": {
+ "total_pkt_bytes": 7950965756,
+ "total_pkts": 116925967,
+ "pkt_bit_rate": 3193170688.0,
+ "pkt_rate": 5869801.5
+ }
+ },
+ "1": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 3193216000,
+ "pkt_rate": 5869884,
+ "max_delay_usec": 42,
+ "total_pkt_bytes": 3975363164,
+ "avg_delay_usec": 15,
+ "total_pkts": 58461223,
+ "min_delay_usec": 5
+ },
+ "tx": {
+ "total_pkt_bytes": 3975602592,
+ "total_pkts": 58464744,
+ "pkt_bit_rate": 3193189888,
+ "pkt_rate": 5869842
+ }
+ },
+ "0": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 3193133056,
+ "pkt_rate": 5869729,
+ "max_delay_usec": 42,
+ "total_pkt_bytes": 3975602592,
+ "avg_delay_usec": 16,
+ "total_pkts": 58464744,
+ "min_delay_usec": 5
+ },
+ "tx": {
+ "total_pkt_bytes": 3975363164,
+ "total_pkts": 58461223,
+ "pkt_bit_rate": 3193151488,
+ "pkt_rate": 5869761
+ }
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 7857424512.0,
+ "theoretical_tx_rate_pps": 74404761.90476191
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "29ad1ab70db044069cca0a6862c8d563"
+ },
+ "synthesis": {
+ "avg_delay_usec": 15.50001505653573,
+ "total_tx_rate": 11692596
+ }
+ },
+ {
+ "input": {
+ "rate": "90%",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_64-fc_100k-rate_90%.json",
+ "frame_sizes": [
+ "64"
+ ],
+ "duration_sec": "10",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc18_loopback",
+ "restart": "true"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-04-25 02:28:50",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:07.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "EXT",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn1ter",
+ "name": "net_nfvbench_vn1ter",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1",
+ "name": "net_nfvbench_vn1",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": "true",
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": true,
+ "request_id": "1cc7ff91553043a19730fd45e9d5f126",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "15089023pps",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "64"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": false,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_64-fc_100k-rate_90%.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": true,
+ "no_arp": true,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "64"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2505,
+ 2505
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc18_loopback",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "flavor_nfvbench_dpdk",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_64-fc_100k-rate_90%.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "EXT": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "64": {
+ "run_config": {
+ "direction-forward": {
+ "rx": {
+ "rate_percent": 20.20257792,
+ "rate_pps": 7515840,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 5050644480
+ },
+ "tx": {
+ "rate_percent": 20.20257792,
+ "rate_pps": 7515840,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 5050644480
+ },
+ "orig": {
+ "rate_percent": 20.279646912,
+ "rate_pps": 7544511,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 5069911728
+ }
+ },
+ "direction-total": {
+ "rx": {
+ "rate_percent": 40.4063724288,
+ "rate_pps": 15032132.0,
+ "rate_bps": 10101593107.0
+ },
+ "tx": {
+ "rate_percent": 40.4063724288,
+ "rate_pps": 15032132.0,
+ "rate_bps": 10101593107.0
+ },
+ "orig": {
+ "rate_percent": 40.559293824,
+ "rate_pps": 15089022.0,
+ "rate_bps": 10139823456.0
+ }
+ },
+ "direction-reverse": {
+ "rx": {
+ "rate_percent": 20.203794508799998,
+ "rate_pps": 7516292,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 5050948627
+ },
+ "tx": {
+ "rate_percent": 20.203794508799998,
+ "rate_pps": 7516292,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 5050948627
+ },
+ "orig": {
+ "rate_percent": 20.279646912,
+ "rate_pps": 7544511,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 5069911728
+ }
+ }
+ },
+ "packet_path_stats": {
+ "Forward": {
+ "interfaces": [
+ "TRex.TX.p0",
+ "TRex.RX.p1"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 75091840,
+ "-79 (-0.0001%)"
+ ],
+ "lat_max_usec": 41,
+ "lat_avg_usec": 18,
+ "lat_min_usec": 5,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ },
+ "Reverse": {
+ "interfaces": [
+ "TRex.TX.p1",
+ "TRex.RX.p0"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 75162926,
+ 75162926
+ ],
+ "lat_max_usec": 40,
+ "lat_avg_usec": 16,
+ "lat_min_usec": 5,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ }
+ },
+ "stats": {
+ "total_tx_rate": 15032132,
+ "overall": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 4096779776.0,
+ "pkt_rate": 7530844.5,
+ "max_delay_usec": 41,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "avg_delay_usec": 17.00003010883499,
+ "total_pkt_bytes": 10221850168,
+ "total_pkts": 150321326,
+ "min_delay_usec": 5
+ },
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg=",
+ "tx": {
+ "total_pkt_bytes": 10221850168,
+ "total_pkts": 150321326,
+ "pkt_bit_rate": 4096779520.0,
+ "pkt_rate": 7530849.0
+ }
+ },
+ "1": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 4096839424,
+ "pkt_rate": 7530954,
+ "max_delay_usec": 40,
+ "total_pkt_bytes": 5110771200,
+ "avg_delay_usec": 16,
+ "total_pkts": 75158400,
+ "min_delay_usec": 5
+ },
+ "tx": {
+ "total_pkt_bytes": 5111078968,
+ "total_pkts": 75162926,
+ "pkt_bit_rate": 4096763136,
+ "pkt_rate": 7530821
+ }
+ },
+ "0": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 4096720128,
+ "pkt_rate": 7530735,
+ "max_delay_usec": 41,
+ "total_pkt_bytes": 5111078968,
+ "avg_delay_usec": 18,
+ "total_pkts": 75162926,
+ "min_delay_usec": 5
+ },
+ "tx": {
+ "total_pkt_bytes": 5110771200,
+ "total_pkts": 75158400,
+ "pkt_bit_rate": 4096795904,
+ "pkt_rate": 7530877
+ }
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 10101592704.0,
+ "theoretical_tx_rate_pps": 74404761.90476191
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "1cc7ff91553043a19730fd45e9d5f126"
+ },
+ "synthesis": {
+ "avg_delay_usec": 17.00003010883499,
+ "total_tx_rate": 15032132
+ }
+ },
+ {
+ "input": {
+ "rate": "70%",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_768-fc_100k-rate_70%.json",
+ "frame_sizes": [
+ "768"
+ ],
+ "duration_sec": "10",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc18_loopback",
+ "restart": "true"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-04-25 02:29:26",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:07.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "EXT",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn1ter",
+ "name": "net_nfvbench_vn1ter",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1",
+ "name": "net_nfvbench_vn1",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": "true",
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": true,
+ "request_id": "83c6271d2c784b99971cb644e7b35976",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "5275399pps",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "768"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": false,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_768-fc_100k-rate_70%.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": true,
+ "no_arp": true,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "768"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2505,
+ 2505
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc18_loopback",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "flavor_nfvbench_dpdk",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_768-fc_100k-rate_70%.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "EXT": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "768": {
+ "run_config": {
+ "direction-forward": {
+ "rx": {
+ "rate_percent": 66.2607564672,
+ "rate_pps": 2627726,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 16565189116
+ },
+ "tx": {
+ "rate_percent": 66.2607564672,
+ "rate_pps": 2627726,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 16565189116
+ },
+ "orig": {
+ "rate_percent": 66.512230592,
+ "rate_pps": 2637699,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 16628057648
+ }
+ },
+ "direction-total": {
+ "rx": {
+ "rate_percent": 132.52550210559997,
+ "rate_pps": 5255610.0,
+ "rate_bps": 33131375525.0
+ },
+ "tx": {
+ "rate_percent": 132.52550210559997,
+ "rate_pps": 5255610.0,
+ "rate_bps": 33131375525.0
+ },
+ "orig": {
+ "rate_percent": 133.024461184,
+ "rate_pps": 5275398.0,
+ "rate_bps": 33256115296.0
+ }
+ },
+ "direction-reverse": {
+ "rx": {
+ "rate_percent": 66.26474563839999,
+ "rate_pps": 2627884,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 16566186409
+ },
+ "tx": {
+ "rate_percent": 66.26474563839999,
+ "rate_pps": 2627884,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 16566186409
+ },
+ "orig": {
+ "rate_percent": 66.512230592,
+ "rate_pps": 2637699,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 16628057648
+ }
+ }
+ },
+ "packet_path_stats": {
+ "Forward": {
+ "interfaces": [
+ "TRex.TX.p0",
+ "TRex.RX.p1"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 26254197,
+ "+5 (+0.0000%)"
+ ],
+ "lat_max_usec": 52,
+ "lat_avg_usec": 27,
+ "lat_min_usec": 6,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ },
+ "Reverse": {
+ "interfaces": [
+ "TRex.TX.p1",
+ "TRex.RX.p0"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 26278849,
+ 26278849
+ ],
+ "lat_max_usec": 64,
+ "lat_avg_usec": 27,
+ "lat_min_usec": 8,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ }
+ },
+ "stats": {
+ "total_tx_rate": 5255611,
+ "overall": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 16250518528.0,
+ "pkt_rate": 2631236.0,
+ "max_delay_usec": 64,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "avg_delay_usec": 27.0,
+ "total_pkt_bytes": 40573321552,
+ "total_pkts": 52556116,
+ "min_delay_usec": 6
+ },
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg=",
+ "tx": {
+ "total_pkt_bytes": 40573321552,
+ "total_pkts": 52556116,
+ "pkt_bit_rate": 16250488832.0,
+ "pkt_rate": 2631232.0
+ }
+ },
+ "1": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 16250605568,
+ "pkt_rate": 2631250,
+ "max_delay_usec": 64,
+ "total_pkt_bytes": 20286050124,
+ "avg_delay_usec": 27,
+ "total_pkts": 26277267,
+ "min_delay_usec": 8
+ },
+ "tx": {
+ "total_pkt_bytes": 20287271428,
+ "total_pkts": 26278849,
+ "pkt_bit_rate": 16250417152,
+ "pkt_rate": 2631220
+ }
+ },
+ "0": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 16250431488,
+ "pkt_rate": 2631222,
+ "max_delay_usec": 52,
+ "total_pkt_bytes": 20287271428,
+ "avg_delay_usec": 27,
+ "total_pkts": 26278849,
+ "min_delay_usec": 6
+ },
+ "tx": {
+ "total_pkt_bytes": 20286050124,
+ "total_pkts": 26277267,
+ "pkt_bit_rate": 16250560512,
+ "pkt_rate": 2631244
+ }
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 33131371744.0,
+ "theoretical_tx_rate_pps": 7931472.081218274
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "83c6271d2c784b99971cb644e7b35976"
+ },
+ "synthesis": {
+ "avg_delay_usec": 27.0,
+ "total_tx_rate": 5255611
+ }
+ },
+ {
+ "input": {
+ "rate": "90%",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_768-fc_100k-rate_90%.json",
+ "frame_sizes": [
+ "768"
+ ],
+ "duration_sec": "10",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc18_loopback",
+ "restart": "true"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-04-25 02:30:02",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:07.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "EXT",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn1ter",
+ "name": "net_nfvbench_vn1ter",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1",
+ "name": "net_nfvbench_vn1",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": "true",
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": true,
+ "request_id": "2455d986fcbe4f858b57eb97a3d6cf28",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "6782656pps",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "768"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": false,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_768-fc_100k-rate_90%.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": true,
+ "no_arp": true,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "768"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2505,
+ 2505
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc18_loopback",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "flavor_nfvbench_dpdk",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_768-fc_100k-rate_90%.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "EXT": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "768": {
+ "run_config": {
+ "direction-forward": {
+ "rx": {
+ "rate_percent": 85.19754631679999,
+ "rate_pps": 3378709,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 21299386579
+ },
+ "tx": {
+ "rate_percent": 85.19754631679999,
+ "rate_pps": 3378709,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 21299386579
+ },
+ "orig": {
+ "rate_percent": 85.515726848,
+ "rate_pps": 3391328,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 21378931712
+ }
+ },
+ "direction-total": {
+ "rx": {
+ "rate_percent": 170.40022661119997,
+ "rate_pps": 6757622.0,
+ "rate_bps": 42600056652.0
+ },
+ "tx": {
+ "rate_percent": 170.40022661119997,
+ "rate_pps": 6757622.0,
+ "rate_bps": 42600056652.0
+ },
+ "orig": {
+ "rate_percent": 171.031453696,
+ "rate_pps": 6782656.0,
+ "rate_bps": 42757863424.0
+ }
+ },
+ "direction-reverse": {
+ "rx": {
+ "rate_percent": 85.2026802944,
+ "rate_pps": 3378913,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 21300670073
+ },
+ "tx": {
+ "rate_percent": 85.2026802944,
+ "rate_pps": 3378913,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 21300670073
+ },
+ "orig": {
+ "rate_percent": 85.515726848,
+ "rate_pps": 3391328,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 21378931712
+ }
+ }
+ },
+ "packet_path_stats": {
+ "Forward": {
+ "interfaces": [
+ "TRex.TX.p0",
+ "TRex.RX.p1"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 33757754,
+ "-3 (-0.0000%)"
+ ],
+ "lat_max_usec": 63,
+ "lat_avg_usec": 46,
+ "lat_min_usec": 17,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ },
+ "Reverse": {
+ "interfaces": [
+ "TRex.TX.p1",
+ "TRex.RX.p0"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 33789134,
+ 33789134
+ ],
+ "lat_max_usec": 72,
+ "lat_avg_usec": 48,
+ "lat_min_usec": 21,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ }
+ },
+ "stats": {
+ "total_tx_rate": 6757623,
+ "overall": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 20899780608.0,
+ "pkt_rate": 3384031.5,
+ "max_delay_usec": 72,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "avg_delay_usec": 46.99996987106354,
+ "total_pkt_bytes": 52168851104,
+ "total_pkts": 67576232,
+ "min_delay_usec": 17
+ },
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg=",
+ "tx": {
+ "total_pkt_bytes": 52168851104,
+ "total_pkts": 67576232,
+ "pkt_bit_rate": 20899762176.0,
+ "pkt_rate": 3384028.0
+ }
+ },
+ "1": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 20900167680,
+ "pkt_rate": 3384094,
+ "max_delay_usec": 72,
+ "total_pkt_bytes": 26083639656,
+ "avg_delay_usec": 48,
+ "total_pkts": 33787098,
+ "min_delay_usec": 21
+ },
+ "tx": {
+ "total_pkt_bytes": 26085211448,
+ "total_pkts": 33789134,
+ "pkt_bit_rate": 20899940352,
+ "pkt_rate": 3384056
+ }
+ },
+ "0": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 20899393536,
+ "pkt_rate": 3383969,
+ "max_delay_usec": 63,
+ "total_pkt_bytes": 26085211448,
+ "avg_delay_usec": 46,
+ "total_pkts": 33789134,
+ "min_delay_usec": 17
+ },
+ "tx": {
+ "total_pkt_bytes": 26083639656,
+ "total_pkts": 33787098,
+ "pkt_bit_rate": 20899584000,
+ "pkt_rate": 3384000
+ }
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 42600055392.0,
+ "theoretical_tx_rate_pps": 7931472.081218274
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "2455d986fcbe4f858b57eb97a3d6cf28"
+ },
+ "synthesis": {
+ "avg_delay_usec": 46.99996987106354,
+ "total_tx_rate": 6757623
+ }
+ },
+ {
+ "input": {
+ "rate": "70%",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_1518-fc_100k-rate_70%.json",
+ "frame_sizes": [
+ "1518"
+ ],
+ "duration_sec": "10",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc18_loopback",
+ "restart": "true"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-04-25 02:30:39",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:07.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "EXT",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn1ter",
+ "name": "net_nfvbench_vn1ter",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1",
+ "name": "net_nfvbench_vn1",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": "true",
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": true,
+ "request_id": "5c5843684c864e02b3be78bf0c27b4f4",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "2713913pps",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "1518"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": false,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_1518-fc_100k-rate_70%.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": true,
+ "no_arp": true,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "1518"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2505,
+ 2505
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc18_loopback",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "flavor_nfvbench_dpdk",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_1518-fc_100k-rate_70%.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "EXT": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "1518": {
+ "run_config": {
+ "direction-forward": {
+ "rx": {
+ "rate_percent": 66.53541553919999,
+ "rate_pps": 1351906,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 16633853884
+ },
+ "tx": {
+ "rate_percent": 66.53541553919999,
+ "rate_pps": 1351906,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 16633853884
+ },
+ "orig": {
+ "rate_percent": 66.78397110399999,
+ "rate_pps": 1356956,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 16695992776
+ }
+ },
+ "direction-total": {
+ "rx": {
+ "rate_percent": 133.07484710399999,
+ "rate_pps": 2703893.0,
+ "rate_bps": 33268711775.0
+ },
+ "tx": {
+ "rate_percent": 133.07484710399999,
+ "rate_pps": 2703893.0,
+ "rate_bps": 33268711775.0
+ },
+ "orig": {
+ "rate_percent": 133.56794220799998,
+ "rate_pps": 2713912.0,
+ "rate_bps": 33391985552.0
+ }
+ },
+ "direction-reverse": {
+ "rx": {
+ "rate_percent": 66.5394315648,
+ "rate_pps": 1351987,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 16634857891
+ },
+ "tx": {
+ "rate_percent": 66.5394315648,
+ "rate_pps": 1351987,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 16634857891
+ },
+ "orig": {
+ "rate_percent": 66.78397110399999,
+ "rate_pps": 1356956,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 16695992776
+ }
+ }
+ },
+ "packet_path_stats": {
+ "Forward": {
+ "interfaces": [
+ "TRex.TX.p0",
+ "TRex.RX.p1"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 13507087,
+ "+37 (+0.0003%)"
+ ],
+ "lat_max_usec": 76,
+ "lat_avg_usec": 33,
+ "lat_min_usec": 7,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ },
+ "Reverse": {
+ "interfaces": [
+ "TRex.TX.p1",
+ "TRex.RX.p0"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 13519878,
+ 13519878
+ ],
+ "lat_max_usec": 104,
+ "lat_avg_usec": 46,
+ "lat_min_usec": 7,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ }
+ },
+ "stats": {
+ "total_tx_rate": 2703894,
+ "overall": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 16510260736.0,
+ "pkt_rate": 1355967.5,
+ "max_delay_usec": 104,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "avg_delay_usec": 39.49980383846408,
+ "total_pkt_bytes": 41153266680,
+ "total_pkts": 27038940,
+ "min_delay_usec": 7
+ },
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg=",
+ "tx": {
+ "total_pkt_bytes": 41153266680,
+ "total_pkts": 27038940,
+ "pkt_bit_rate": 16510253568.0,
+ "pkt_rate": 1355967.5
+ }
+ },
+ "1": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 16510286848,
+ "pkt_rate": 1355970,
+ "max_delay_usec": 104,
+ "total_pkt_bytes": 20576012364,
+ "avg_delay_usec": 46,
+ "total_pkts": 13519062,
+ "min_delay_usec": 7
+ },
+ "tx": {
+ "total_pkt_bytes": 20577254316,
+ "total_pkts": 13519878,
+ "pkt_bit_rate": 16510161920,
+ "pkt_rate": 1355960
+ }
+ },
+ "0": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 16510234624,
+ "pkt_rate": 1355965,
+ "max_delay_usec": 76,
+ "total_pkt_bytes": 20577254316,
+ "avg_delay_usec": 33,
+ "total_pkts": 13519878,
+ "min_delay_usec": 7
+ },
+ "tx": {
+ "total_pkt_bytes": 20576012364,
+ "total_pkts": 13519062,
+ "pkt_bit_rate": 16510345216,
+ "pkt_rate": 1355975
+ }
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 33268711776.0,
+ "theoretical_tx_rate_pps": 4063719.1157347206
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "5c5843684c864e02b3be78bf0c27b4f4"
+ },
+ "synthesis": {
+ "avg_delay_usec": 39.49980383846408,
+ "total_tx_rate": 2703894
+ }
+ },
+ {
+ "input": {
+ "rate": "90%",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_1518-fc_100k-rate_90%.json",
+ "frame_sizes": [
+ "1518"
+ ],
+ "duration_sec": "10",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc18_loopback",
+ "restart": "true"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-04-25 02:31:15",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:07.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "EXT",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn1ter",
+ "name": "net_nfvbench_vn1ter",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1",
+ "name": "net_nfvbench_vn1",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": "true",
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": true,
+ "request_id": "2494d2b787c4476c90474945540b4645",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "3489317pps",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "1518"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": false,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_1518-fc_100k-rate_90%.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": true,
+ "no_arp": true,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "1518"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2505,
+ 2505
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc18_loopback",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "flavor_nfvbench_dpdk",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_1518-fc_100k-rate_90%.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "EXT": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "1518": {
+ "run_config": {
+ "direction-forward": {
+ "rx": {
+ "rate_percent": 85.545577856,
+ "rate_pps": 1738166,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 21386394464
+ },
+ "tx": {
+ "rate_percent": 85.545577856,
+ "rate_pps": 1738166,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 21386394464
+ },
+ "orig": {
+ "rate_percent": 85.865112736,
+ "rate_pps": 1744658,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 21466278184
+ }
+ },
+ "direction-total": {
+ "rx": {
+ "rate_percent": 171.0963135488,
+ "rate_pps": 3476436.0,
+ "rate_bps": 42774078387.0
+ },
+ "tx": {
+ "rate_percent": 171.0963135488,
+ "rate_pps": 3476436.0,
+ "rate_bps": 42774078387.0
+ },
+ "orig": {
+ "rate_percent": 171.730225472,
+ "rate_pps": 3489316.0,
+ "rate_bps": 42932556368.0
+ }
+ },
+ "direction-reverse": {
+ "rx": {
+ "rate_percent": 85.5507356928,
+ "rate_pps": 1738270,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 21387683923
+ },
+ "tx": {
+ "rate_percent": 85.5507356928,
+ "rate_pps": 1738270,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 21387683923
+ },
+ "orig": {
+ "rate_percent": 85.865112736,
+ "rate_pps": 1744658,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 21466278184
+ }
+ }
+ },
+ "packet_path_stats": {
+ "Forward": {
+ "interfaces": [
+ "TRex.TX.p0",
+ "TRex.RX.p1"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 17366577,
+ "+5 (+0.0000%)"
+ ],
+ "lat_max_usec": 84,
+ "lat_avg_usec": 34,
+ "lat_min_usec": 7,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ },
+ "Reverse": {
+ "interfaces": [
+ "TRex.TX.p1",
+ "TRex.RX.p0"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 17382708,
+ 17382708
+ ],
+ "lat_max_usec": 96,
+ "lat_avg_usec": 49,
+ "lat_min_usec": 8,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ }
+ },
+ "stats": {
+ "total_tx_rate": 3476436,
+ "overall": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 21135840256.0,
+ "pkt_rate": 1735860.5,
+ "max_delay_usec": 96,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "avg_delay_usec": 41.49977390643201,
+ "total_pkt_bytes": 52911368096,
+ "total_pkts": 34764368,
+ "min_delay_usec": 7
+ },
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg=",
+ "tx": {
+ "total_pkt_bytes": 52911368096,
+ "total_pkts": 34764368,
+ "pkt_bit_rate": 21135740928.0,
+ "pkt_rate": 1735852.0
+ }
+ },
+ "1": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 21135886336,
+ "pkt_rate": 1735864,
+ "max_delay_usec": 96,
+ "total_pkt_bytes": 26454886520,
+ "avg_delay_usec": 49,
+ "total_pkts": 17381660,
+ "min_delay_usec": 8
+ },
+ "tx": {
+ "total_pkt_bytes": 26456481576,
+ "total_pkts": 17382708,
+ "pkt_bit_rate": 21135585280,
+ "pkt_rate": 1735839
+ }
+ },
+ "0": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 21135794176,
+ "pkt_rate": 1735857,
+ "max_delay_usec": 84,
+ "total_pkt_bytes": 26456481576,
+ "avg_delay_usec": 34,
+ "total_pkts": 17382708,
+ "min_delay_usec": 7
+ },
+ "tx": {
+ "total_pkt_bytes": 26454886520,
+ "total_pkts": 17381660,
+ "pkt_bit_rate": 21135896576,
+ "pkt_rate": 1735865
+ }
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 42774068544.0,
+ "theoretical_tx_rate_pps": 4063719.1157347206
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "2494d2b787c4476c90474945540b4645"
+ },
+ "synthesis": {
+ "avg_delay_usec": 41.49977390643201,
+ "total_tx_rate": 3476436
+ }
+ },
+ {
+ "input": {
+ "rate": "70%",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_9000-fc_100k-rate_70%.json",
+ "frame_sizes": [
+ "9000"
+ ],
+ "duration_sec": "10",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc18_loopback",
+ "restart": "true"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-04-25 02:31:51",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:07.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "EXT",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn1ter",
+ "name": "net_nfvbench_vn1ter",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1",
+ "name": "net_nfvbench_vn1",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": "true",
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": true,
+ "request_id": "7c104183aa154d46944772ed88ae04c3",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "462795pps",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "9000"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": false,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_9000-fc_100k-rate_70%.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": true,
+ "no_arp": true,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "9000"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2505,
+ 2505
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc18_loopback",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "flavor_nfvbench_dpdk",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_9000-fc_100k-rate_70%.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "EXT": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "9000": {
+ "run_config": {
+ "direction-forward": {
+ "rx": {
+ "rate_percent": 66.538736,
+ "rate_pps": 230525,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 16634684000
+ },
+ "tx": {
+ "rate_percent": 66.538736,
+ "rate_pps": 230525,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 16634684000
+ },
+ "orig": {
+ "rate_percent": 66.7905744,
+ "rate_pps": 231397,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 16697643600
+ }
+ },
+ "direction-total": {
+ "rx": {
+ "rate_percent": 133.08151296,
+ "rate_pps": 461064.0,
+ "rate_bps": 33270378240.0
+ },
+ "tx": {
+ "rate_percent": 133.08151296,
+ "rate_pps": 461064.0,
+ "rate_bps": 33270378240.0
+ },
+ "orig": {
+ "rate_percent": 133.5811488,
+ "rate_pps": 462794.0,
+ "rate_bps": 33395287200.0
+ }
+ },
+ "direction-reverse": {
+ "rx": {
+ "rate_percent": 66.54277696000001,
+ "rate_pps": 230539,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 16635694240
+ },
+ "tx": {
+ "rate_percent": 66.54277696000001,
+ "rate_pps": 230539,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 16635694240
+ },
+ "orig": {
+ "rate_percent": 66.7905744,
+ "rate_pps": 231397,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 16697643600
+ }
+ }
+ },
+ "packet_path_stats": {
+ "Forward": {
+ "interfaces": [
+ "TRex.TX.p0",
+ "TRex.RX.p1"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 2303254,
+ "+55 (+0.0024%)"
+ ],
+ "lat_max_usec": 149,
+ "lat_avg_usec": 70,
+ "lat_min_usec": 14,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ },
+ "Reverse": {
+ "interfaces": [
+ "TRex.TX.p1",
+ "TRex.RX.p0"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 2305390,
+ 2305390
+ ],
+ "lat_max_usec": 195,
+ "lat_avg_usec": 73,
+ "lat_min_usec": 14,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ }
+ },
+ "stats": {
+ "total_tx_rate": 461064,
+ "overall": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 16609682432.0,
+ "pkt_rate": 230587.0,
+ "max_delay_usec": 195,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "avg_delay_usec": 71.49995445317786,
+ "total_pkt_bytes": 41514202560,
+ "total_pkts": 4610640,
+ "min_delay_usec": 14
+ },
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg=",
+ "tx": {
+ "total_pkt_bytes": 41514202560,
+ "total_pkts": 4610640,
+ "pkt_bit_rate": 16609573376.0,
+ "pkt_rate": 230585.5
+ }
+ },
+ "1": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 16609541120,
+ "pkt_rate": 230585,
+ "max_delay_usec": 195,
+ "total_pkt_bytes": 20756471000,
+ "avg_delay_usec": 73,
+ "total_pkts": 2305250,
+ "min_delay_usec": 14
+ },
+ "tx": {
+ "total_pkt_bytes": 20757731560,
+ "total_pkts": 2305390,
+ "pkt_bit_rate": 16609261568,
+ "pkt_rate": 230581
+ }
+ },
+ "0": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 16609823744,
+ "pkt_rate": 230589,
+ "max_delay_usec": 149,
+ "total_pkt_bytes": 20757731560,
+ "avg_delay_usec": 70,
+ "total_pkts": 2305390,
+ "min_delay_usec": 14
+ },
+ "tx": {
+ "total_pkt_bytes": 20756471000,
+ "total_pkts": 2305250,
+ "pkt_bit_rate": 16609885184,
+ "pkt_rate": 230590
+ }
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 33270378240.0,
+ "theoretical_tx_rate_pps": 692904.6563192905
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "7c104183aa154d46944772ed88ae04c3"
+ },
+ "synthesis": {
+ "avg_delay_usec": 71.49995445317786,
+ "total_tx_rate": 461064
+ }
+ },
+ {
+ "input": {
+ "rate": "90%",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_9000-fc_100k-rate_90%.json",
+ "frame_sizes": [
+ "9000"
+ ],
+ "duration_sec": "10",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc18_loopback",
+ "restart": "true"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-04-25 02:32:27",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:07.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "EXT",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn1ter",
+ "name": "net_nfvbench_vn1ter",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1",
+ "name": "net_nfvbench_vn1",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": "true",
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": true,
+ "request_id": "539e9bb7f81444c6a2856b249554d42a",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "595022pps",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "9000"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": false,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_9000-fc_100k-rate_90%.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": true,
+ "no_arp": true,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "9000"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2505,
+ 2505
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc18_loopback",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "flavor_nfvbench_dpdk",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_9000-fc_100k-rate_90%.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "EXT": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "9000": {
+ "run_config": {
+ "direction-forward": {
+ "rx": {
+ "rate_percent": 85.548248896,
+ "rate_pps": 296383,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 21387062224
+ },
+ "tx": {
+ "rate_percent": 85.548248896,
+ "rate_pps": 296383,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 21387062224
+ },
+ "orig": {
+ "rate_percent": 85.87357504,
+ "rate_pps": 297511,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 21468393760
+ }
+ },
+ "direction-total": {
+ "rx": {
+ "rate_percent": 171.101722176,
+ "rate_pps": 592785.0,
+ "rate_bps": 42775430544.0
+ },
+ "tx": {
+ "rate_percent": 171.101722176,
+ "rate_pps": 592785.0,
+ "rate_bps": 42775430544.0
+ },
+ "orig": {
+ "rate_percent": 171.74715008,
+ "rate_pps": 595022.0,
+ "rate_bps": 42936787520.0
+ }
+ },
+ "direction-reverse": {
+ "rx": {
+ "rate_percent": 85.55347328,
+ "rate_pps": 296402,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 21388368320
+ },
+ "tx": {
+ "rate_percent": 85.55347328,
+ "rate_pps": 296402,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 21388368320
+ },
+ "orig": {
+ "rate_percent": 85.87357504,
+ "rate_pps": 297511,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 21468393760
+ }
+ }
+ },
+ "packet_path_stats": {
+ "Forward": {
+ "interfaces": [
+ "TRex.TX.p0",
+ "TRex.RX.p1"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 2961244,
+ "+41 (+0.0014%)"
+ ],
+ "lat_max_usec": 422,
+ "lat_avg_usec": 224,
+ "lat_min_usec": 29,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ },
+ "Reverse": {
+ "interfaces": [
+ "TRex.TX.p1",
+ "TRex.RX.p0"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 2964020,
+ 2964020
+ ],
+ "lat_max_usec": 392,
+ "lat_avg_usec": 176,
+ "lat_min_usec": 16,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ }
+ },
+ "stats": {
+ "total_tx_rate": 592785,
+ "overall": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 21366905856.0,
+ "pkt_rate": 296630.0,
+ "max_delay_usec": 422,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "avg_delay_usec": 200.00073281095248,
+ "total_pkt_bytes": 53374442436,
+ "total_pkts": 5927859,
+ "min_delay_usec": 16
+ },
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg=",
+ "tx": {
+ "total_pkt_bytes": 53374442436,
+ "total_pkts": 5927859,
+ "pkt_bit_rate": 21366993920.0,
+ "pkt_rate": 296631.0
+ }
+ },
+ "1": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 21367107584,
+ "pkt_rate": 296633,
+ "max_delay_usec": 392,
+ "total_pkt_bytes": 26686406356,
+ "avg_delay_usec": 176,
+ "total_pkts": 2963839,
+ "min_delay_usec": 16
+ },
+ "tx": {
+ "total_pkt_bytes": 26688036080,
+ "total_pkts": 2964020,
+ "pkt_bit_rate": 21367209984,
+ "pkt_rate": 296634
+ }
+ },
+ "0": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 21366704128,
+ "pkt_rate": 296627,
+ "max_delay_usec": 422,
+ "total_pkt_bytes": 26688036080,
+ "avg_delay_usec": 224,
+ "total_pkts": 2964020,
+ "min_delay_usec": 29
+ },
+ "tx": {
+ "total_pkt_bytes": 26686406356,
+ "total_pkts": 2963839,
+ "pkt_bit_rate": 21366777856,
+ "pkt_rate": 296628
+ }
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 42775365600.0,
+ "theoretical_tx_rate_pps": 692904.6563192905
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "539e9bb7f81444c6a2856b249554d42a"
+ },
+ "synthesis": {
+ "avg_delay_usec": 200.00073281095248,
+ "total_tx_rate": 592785
+ }
+ }
+ ],
+ "throughput": [
+ {
+ "input": {
+ "rate": "ndr",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_64-fc_128-rate_ndr-2.json",
+ "frame_sizes": [
+ "64"
+ ],
+ "duration_sec": "10",
+ "flow_count": "128",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc18_loopback"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-04-25 00:14:08",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:07.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "EXT",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn1ter",
+ "name": "net_nfvbench_vn1ter",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1",
+ "name": "net_nfvbench_vn1",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": true,
+ "request_id": "d35b641ccf884fd6a0c371913594ab90",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "64"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 128,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_64-fc_128-rate_ndr-1.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": true,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "64"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2505,
+ 2505
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc18_loopback",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "flavor_nfvbench_dpdk",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_64-fc_128-rate_ndr-1.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "EXT": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "warning": "WARNING: There is a significant difference between requested TX rate (74404760) and actual TX rate (16701232). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "64": {
+ "ndr": {
+ "load_percent_per_direction": 100.0,
+ "timestamp_sec": 1650845663.429861,
+ "stats": {
+ "total_tx_rate": 16701232,
+ "overall": {
+ "rx_pkts": 167012327,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 97,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 167012327,
+ "avg_delay_usec": 35.48017790327537,
+ "min_delay_usec": 6,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 83760820,
+ "min_delay_usec": 6,
+ "drop_pct": 0,
+ "max_delay_usec": 97,
+ "tx_pkts": 83251507,
+ "avg_delay_usec": 29,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 83251507,
+ "min_delay_usec": 6,
+ "drop_pct": 0,
+ "max_delay_usec": 92,
+ "tx_pkts": 83760820,
+ "avg_delay_usec": 42,
+ "drop_percentage": 0.0
+ },
+ "warning": "WARNING: There is a significant difference between requested TX rate (74404760) and actual TX rate (16701232). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 11223227904.0,
+ "theoretical_tx_rate_pps": 74404761.90476191
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 200.0,
+ "duration_sec": 10.0,
+ "l2frame_size": "64",
+ "rate_pps": 74404760,
+ "rate_bps": 50000000000.0,
+ "time_taken_sec": 12.489534616470337
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 74404760.0,
+ "rx_pkts": 167012327,
+ "time_ms": 1650845663429,
+ "drop_pct": 0,
+ "total_tx_pps": 16701232,
+ "tx_pps": 74404760,
+ "tx_pkts": 167012327,
+ "ndr_pps": 37202380,
+ "warning": "WARNING: There is a significant difference between requested TX rate (74404760) and actual TX rate (16701232). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "drop_percentage": 0.0
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 128,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "d35b641ccf884fd6a0c371913594ab90"
+ },
+ "synthesis": {
+ "avg_delay_usec": 35.48017790327537,
+ "total_tx_rate": 16701232
+ }
+ },
+ {
+ "input": {
+ "rate": "ndr",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_128-fc_128-rate_ndr-2.json",
+ "frame_sizes": [
+ "128"
+ ],
+ "duration_sec": "10",
+ "flow_count": "128",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc18_loopback"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-04-25 00:14:40",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:07.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "EXT",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn1ter",
+ "name": "net_nfvbench_vn1ter",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1",
+ "name": "net_nfvbench_vn1",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": true,
+ "request_id": "7f8f5bba535643418ac4efa4d3f94823",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "128"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 128,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_128-fc_128-rate_ndr-0.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": true,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "128"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2505,
+ 2505
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc18_loopback",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "flavor_nfvbench_dpdk",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_128-fc_128-rate_ndr-0.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "EXT": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "128": {
+ "ndr": {
+ "load_percent_per_direction": 100.0,
+ "timestamp_sec": 1650845695.5087018,
+ "stats": {
+ "total_tx_rate": 18016784,
+ "overall": {
+ "rx_pkts": 180167849,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 63,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 180167849,
+ "avg_delay_usec": 18.991852847174748,
+ "min_delay_usec": 5,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 90328567,
+ "min_delay_usec": 6,
+ "drop_pct": 0,
+ "max_delay_usec": 63,
+ "tx_pkts": 89839282,
+ "avg_delay_usec": 16,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 89839282,
+ "min_delay_usec": 5,
+ "drop_pct": 0,
+ "max_delay_usec": 55,
+ "tx_pkts": 90328567,
+ "avg_delay_usec": 22,
+ "drop_percentage": 0.0
+ },
+ "warning": "WARNING: There is a significant difference between requested TX rate (42229728) and actual TX rate (18016784). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 21331872256.0,
+ "theoretical_tx_rate_pps": 42229729.72972973
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 200.0,
+ "duration_sec": 10.0,
+ "l2frame_size": "128",
+ "rate_pps": 42229728,
+ "rate_bps": 50000000000.0,
+ "time_taken_sec": 12.489280939102173
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 42229728.0,
+ "rx_pkts": 180167849,
+ "time_ms": 1650845695508,
+ "drop_pct": 0,
+ "total_tx_pps": 18016784,
+ "tx_pps": 42229728,
+ "tx_pkts": 180167849,
+ "ndr_pps": 21114864,
+ "warning": "WARNING: There is a significant difference between requested TX rate (42229728) and actual TX rate (18016784). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "drop_percentage": 0.0
+ }
+ ]
+ }
+ },
+ "warning": "WARNING: There is a significant difference between requested TX rate (42229728) and actual TX rate (18016784). The traffic generator may not have sufficient CPU to achieve the requested TX rate."
+ },
+ "flow_count": 128,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "7f8f5bba535643418ac4efa4d3f94823"
+ },
+ "synthesis": {
+ "avg_delay_usec": 18.991852847174748,
+ "total_tx_rate": 18016784
+ }
+ },
+ {
+ "input": {
+ "rate": "ndr",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_256-fc_128-rate_ndr-2.json",
+ "frame_sizes": [
+ "256"
+ ],
+ "duration_sec": "10",
+ "flow_count": "128",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc18_loopback"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-04-25 00:15:44",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:07.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "EXT",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn1ter",
+ "name": "net_nfvbench_vn1ter",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1",
+ "name": "net_nfvbench_vn1",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": true,
+ "request_id": "d0df1174e1c64fbb9b686a68ccc7e668",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "256"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 128,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_256-fc_128-rate_ndr-1.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": true,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "256"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2505,
+ 2505
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc18_loopback",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "flavor_nfvbench_dpdk",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_256-fc_128-rate_ndr-1.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "EXT": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "warning": "WARNING: There is a significant difference between requested TX rate (22644926) and actual TX rate (15754775). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "256": {
+ "ndr": {
+ "load_percent_per_direction": 100.0,
+ "timestamp_sec": 1650845759.8291821,
+ "stats": {
+ "total_tx_rate": 15754775,
+ "overall": {
+ "rx_pkts": 157547756,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 72,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 157547756,
+ "avg_delay_usec": 28.504292190616795,
+ "min_delay_usec": 7,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 78909123,
+ "min_delay_usec": 7,
+ "drop_pct": 0,
+ "max_delay_usec": 72,
+ "tx_pkts": 78638633,
+ "avg_delay_usec": 31,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 78638633,
+ "min_delay_usec": 8,
+ "drop_pct": 0,
+ "max_delay_usec": 48,
+ "tx_pkts": 78909123,
+ "avg_delay_usec": 26,
+ "drop_percentage": 0.0
+ },
+ "warning": "WARNING: There is a significant difference between requested TX rate (22644926) and actual TX rate (15754775). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 34786543200.0,
+ "theoretical_tx_rate_pps": 22644927.536231883
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 200.0,
+ "duration_sec": 10.0,
+ "l2frame_size": "256",
+ "rate_pps": 22644926,
+ "rate_bps": 50000000000.0,
+ "time_taken_sec": 12.5189950466156
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 22644926.0,
+ "rx_pkts": 157547756,
+ "time_ms": 1650845759828,
+ "drop_pct": 0,
+ "total_tx_pps": 15754775,
+ "tx_pps": 22644926,
+ "tx_pkts": 157547756,
+ "ndr_pps": 11322463,
+ "warning": "WARNING: There is a significant difference between requested TX rate (22644926) and actual TX rate (15754775). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "drop_percentage": 0.0
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 128,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "d0df1174e1c64fbb9b686a68ccc7e668"
+ },
+ "synthesis": {
+ "avg_delay_usec": 28.504292190616795,
+ "total_tx_rate": 15754775
+ }
+ },
+ {
+ "input": {
+ "rate": "ndr",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_512-fc_128-rate_ndr-2.json",
+ "frame_sizes": [
+ "512"
+ ],
+ "duration_sec": "10",
+ "flow_count": "128",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc18_loopback"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-04-25 00:16:16",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:07.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "EXT",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn1ter",
+ "name": "net_nfvbench_vn1ter",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1",
+ "name": "net_nfvbench_vn1",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": true,
+ "request_id": "64366f2a65a647cca7f0b40bfb5fab09",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "512"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 128,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_512-fc_128-rate_ndr-0.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": true,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "512"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2505,
+ 2505
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc18_loopback",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "flavor_nfvbench_dpdk",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_512-fc_128-rate_ndr-0.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "EXT": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "512": {
+ "ndr": {
+ "load_percent_per_direction": 96.97265625,
+ "timestamp_sec": 1650845917.113052,
+ "stats": {
+ "total_tx_rate": 11045806,
+ "overall": {
+ "rx_pkts": 110458069,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 659,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 110458069,
+ "avg_delay_usec": 209.00381663380335,
+ "min_delay_usec": 12,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 55226186,
+ "min_delay_usec": 12,
+ "drop_pct": 0,
+ "max_delay_usec": 547,
+ "tx_pkts": 55231883,
+ "avg_delay_usec": 135,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 55231883,
+ "min_delay_usec": 12,
+ "drop_pct": 0,
+ "max_delay_usec": 659,
+ "tx_pkts": 55226186,
+ "avg_delay_usec": 283,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 47010950336.0,
+ "theoretical_tx_rate_pps": 11748120.30075188
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 193.9453125,
+ "duration_sec": 10.0,
+ "l2frame_size": "512",
+ "rate_pps": 11392464,
+ "rate_bps": 48486328124.0,
+ "time_taken_sec": 137.6620888710022
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 11740270.58724066,
+ "rx_pkts": 111822104,
+ "time_ms": 1650845791960,
+ "drop_pct": 74763,
+ "total_tx_pps": 11189686,
+ "tx_pps": 11748120,
+ "tx_pkts": 111896867,
+ "drop_percentage": 0.06681420311794789
+ },
+ {
+ "rx_pps": 5874060.0,
+ "rx_pkts": 58379346,
+ "time_ms": 1650845804458,
+ "drop_pct": 0,
+ "total_tx_pps": 5837934,
+ "tx_pps": 5874060,
+ "tx_pkts": 58379346,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 8811090.0,
+ "rx_pkts": 87569019,
+ "time_ms": 1650845817019,
+ "drop_pct": 0,
+ "total_tx_pps": 8756901,
+ "tx_pps": 8811090,
+ "tx_pkts": 87569019,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 10279604.0,
+ "rx_pkts": 102174125,
+ "time_ms": 1650845829521,
+ "drop_pct": 0,
+ "total_tx_pps": 10217412,
+ "tx_pps": 10279604,
+ "tx_pkts": 102174125,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 11013862.0,
+ "rx_pkts": 109461268,
+ "time_ms": 1650845842017,
+ "drop_pct": 0,
+ "total_tx_pps": 10946126,
+ "tx_pps": 11013862,
+ "tx_pkts": 109461268,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 11380990.0,
+ "rx_pkts": 110849710,
+ "time_ms": 1650845854579,
+ "drop_pct": 0,
+ "total_tx_pps": 11084971,
+ "tx_pps": 11380990,
+ "tx_pkts": 110849710,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 11564015.280748308,
+ "rx_pkts": 110849157,
+ "time_ms": 1650845867092,
+ "drop_pct": 5164,
+ "total_tx_pps": 11085432,
+ "tx_pps": 11564554,
+ "tx_pkts": 110854321,
+ "drop_percentage": 0.0046583660009067215
+ },
+ {
+ "rx_pps": 11472150.680780374,
+ "rx_pkts": 110840480,
+ "time_ms": 1650845879589,
+ "drop_pct": 6003,
+ "total_tx_pps": 11084648,
+ "tx_pps": 11472772,
+ "tx_pkts": 110846483,
+ "drop_percentage": 0.005415598075403078
+ },
+ {
+ "rx_pps": 11426262.302117322,
+ "rx_pkts": 110851902,
+ "time_ms": 1650845892109,
+ "drop_pct": 6012,
+ "total_tx_pps": 11085791,
+ "tx_pps": 11426882,
+ "tx_pkts": 110857914,
+ "drop_percentage": 0.005423158151794197
+ },
+ {
+ "rx_pps": 11402964.464785693,
+ "rx_pkts": 110844769,
+ "time_ms": 1650845904604,
+ "drop_pct": 9444,
+ "total_tx_pps": 11085421,
+ "tx_pps": 11403936,
+ "tx_pkts": 110854213,
+ "drop_percentage": 0.008519297322511324
+ },
+ {
+ "rx_pps": 11392464.0,
+ "rx_pkts": 110458069,
+ "time_ms": 1650845917112,
+ "drop_pct": 0,
+ "total_tx_pps": 11045806,
+ "tx_pps": 11392464,
+ "tx_pkts": 110458069,
+ "ndr_pps": 5696232,
+ "drop_percentage": 0.0
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 128,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "64366f2a65a647cca7f0b40bfb5fab09"
+ },
+ "synthesis": {
+ "avg_delay_usec": 209.00381663380335,
+ "total_tx_rate": 11045806
+ }
+ },
+ {
+ "input": {
+ "rate": "ndr",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_768-fc_128-rate_ndr-2.json",
+ "frame_sizes": [
+ "768"
+ ],
+ "duration_sec": "10",
+ "flow_count": "128",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc18_loopback"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-04-25 00:28:09",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:07.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "EXT",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn1ter",
+ "name": "net_nfvbench_vn1ter",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1",
+ "name": "net_nfvbench_vn1",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": true,
+ "request_id": "88728d9ee6f543e1b8290c2e6e6e0d11",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "768"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 128,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_768-fc_128-rate_ndr-2.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": true,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "768"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2505,
+ 2505
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc18_loopback",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "flavor_nfvbench_dpdk",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_768-fc_128-rate_ndr-2.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "EXT": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "768": {
+ "ndr": {
+ "load_percent_per_direction": 95.60546875,
+ "timestamp_sec": 1650846629.6192143,
+ "stats": {
+ "total_tx_rate": 7537043,
+ "overall": {
+ "rx_pkts": 75370436,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 81,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 75370436,
+ "avg_delay_usec": 45.9999497150315,
+ "min_delay_usec": 9,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 37683323,
+ "min_delay_usec": 9,
+ "drop_pct": 0,
+ "max_delay_usec": 79,
+ "tx_pkts": 37687113,
+ "avg_delay_usec": 47,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 37687113,
+ "min_delay_usec": 14,
+ "drop_pct": 0,
+ "max_delay_usec": 81,
+ "tx_pkts": 37683323,
+ "avg_delay_usec": 45,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 47513519072.0,
+ "theoretical_tx_rate_pps": 7931472.081218274
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 191.2109375,
+ "duration_sec": 10.0,
+ "l2frame_size": "768",
+ "rate_pps": 7582920,
+ "rate_bps": 47802734374.0,
+ "time_taken_sec": 137.7126579284668
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 7866850.365150423,
+ "rx_pkts": 76167616,
+ "time_ms": 1650846504492,
+ "drop_pct": 625673,
+ "total_tx_pps": 7679328,
+ "tx_pps": 7931472,
+ "tx_pkts": 76793289,
+ "drop_percentage": 0.8147495805264963
+ },
+ {
+ "rx_pps": 3965736.0,
+ "rx_pkts": 39413470,
+ "time_ms": 1650846517007,
+ "drop_pct": 0,
+ "total_tx_pps": 3941347,
+ "tx_pps": 3965736,
+ "tx_pkts": 39413470,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 5948604.0,
+ "rx_pkts": 59120203,
+ "time_ms": 1650846529521,
+ "drop_pct": 0,
+ "total_tx_pps": 5912020,
+ "tx_pps": 5948604,
+ "tx_pkts": 59120203,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 6940038.0,
+ "rx_pkts": 68978427,
+ "time_ms": 1650846542024,
+ "drop_pct": 0,
+ "total_tx_pps": 6897842,
+ "tx_pps": 6940038,
+ "tx_pkts": 68978427,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 7435754.0,
+ "rx_pkts": 73900245,
+ "time_ms": 1650846554547,
+ "drop_pct": 0,
+ "total_tx_pps": 7390024,
+ "tx_pps": 7435754,
+ "tx_pkts": 73900245,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 7620933.009913207,
+ "rx_pkts": 75507422,
+ "time_ms": 1650846567096,
+ "drop_pct": 621017,
+ "total_tx_pps": 7612843,
+ "tx_pps": 7683612,
+ "tx_pkts": 76128439,
+ "drop_percentage": 0.8157490264577736
+ },
+ {
+ "rx_pps": 7559684.0,
+ "rx_pkts": 75135702,
+ "time_ms": 1650846579608,
+ "drop_pct": 0,
+ "total_tx_pps": 7513570,
+ "tx_pps": 7559684,
+ "tx_pkts": 75135702,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 7596700.373851032,
+ "rx_pkts": 75499812,
+ "time_ms": 1650846592122,
+ "drop_pct": 247942,
+ "total_tx_pps": 7574775,
+ "tx_pps": 7621648,
+ "tx_pkts": 75747754,
+ "drop_percentage": 0.32732587688342546
+ },
+ {
+ "rx_pps": 7590339.524822134,
+ "rx_pkts": 75444179,
+ "time_ms": 1650846604621,
+ "drop_pct": 3245,
+ "total_tx_pps": 7544742,
+ "tx_pps": 7590666,
+ "tx_pkts": 75447424,
+ "drop_percentage": 0.004301008341915027
+ },
+ {
+ "rx_pps": 7575174.0,
+ "rx_pkts": 75293443,
+ "time_ms": 1650846617119,
+ "drop_pct": 0,
+ "total_tx_pps": 7529344,
+ "tx_pps": 7575174,
+ "tx_pkts": 75293443,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 7582920.0,
+ "rx_pkts": 75370436,
+ "time_ms": 1650846629618,
+ "drop_pct": 0,
+ "total_tx_pps": 7537043,
+ "tx_pps": 7582920,
+ "tx_pkts": 75370436,
+ "ndr_pps": 3791460,
+ "drop_percentage": 0.0
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 128,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "88728d9ee6f543e1b8290c2e6e6e0d11"
+ },
+ "synthesis": {
+ "avg_delay_usec": 45.9999497150315,
+ "total_tx_rate": 7537043
+ }
+ },
+ {
+ "input": {
+ "rate": "ndr",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1024-fc_128-rate_ndr-2.json",
+ "frame_sizes": [
+ "1024"
+ ],
+ "duration_sec": "10",
+ "flow_count": "128",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc18_loopback"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-04-25 00:32:54",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:07.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "EXT",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn1ter",
+ "name": "net_nfvbench_vn1ter",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1",
+ "name": "net_nfvbench_vn1",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": true,
+ "request_id": "bf2b37b1fdf341adb7ee11f081d946e2",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "1024"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 128,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1024-fc_128-rate_ndr-1.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": true,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "1024"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2505,
+ 2505
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc18_loopback",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "flavor_nfvbench_dpdk",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1024-fc_128-rate_ndr-1.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "EXT": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "1024": {
+ "ndr": {
+ "load_percent_per_direction": 95.8984375,
+ "timestamp_sec": 1650846914.7221012,
+ "stats": {
+ "total_tx_rate": 5712627,
+ "overall": {
+ "rx_pkts": 57126277,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 102,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 57126277,
+ "avg_delay_usec": 49.5002764139522,
+ "min_delay_usec": 8,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 28561703,
+ "min_delay_usec": 8,
+ "drop_pct": 0,
+ "max_delay_usec": 102,
+ "tx_pkts": 28564574,
+ "avg_delay_usec": 44,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 28564574,
+ "min_delay_usec": 8,
+ "drop_pct": 0,
+ "max_delay_usec": 94,
+ "tx_pkts": 28561703,
+ "avg_delay_usec": 55,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 47711860704.0,
+ "theoretical_tx_rate_pps": 5986590.038314176
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 191.796875,
+ "duration_sec": 10.0,
+ "l2frame_size": "1024",
+ "rate_pps": 5741046,
+ "rate_bps": 47949218750.0,
+ "time_taken_sec": 137.80328631401062
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 5905471.915950395,
+ "rx_pkts": 57662777,
+ "time_ms": 1650846789487,
+ "drop_pct": 792061,
+ "total_tx_pps": 5845483,
+ "tx_pps": 5986590,
+ "tx_pkts": 58454838,
+ "drop_percentage": 1.3549964846365667
+ },
+ {
+ "rx_pps": 2993294.0,
+ "rx_pkts": 29748854,
+ "time_ms": 1650846802027,
+ "drop_pct": 0,
+ "total_tx_pps": 2974885,
+ "tx_pps": 2993294,
+ "tx_pkts": 29748854,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 4489942.0,
+ "rx_pkts": 44627778,
+ "time_ms": 1650846814534,
+ "drop_pct": 0,
+ "total_tx_pps": 4462777,
+ "tx_pps": 4489942,
+ "tx_pkts": 44627778,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 5238266.0,
+ "rx_pkts": 52060508,
+ "time_ms": 1650846827044,
+ "drop_pct": 0,
+ "total_tx_pps": 5206050,
+ "tx_pps": 5238266,
+ "tx_pkts": 52060508,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 5612428.0,
+ "rx_pkts": 55779118,
+ "time_ms": 1650846839558,
+ "drop_pct": 0,
+ "total_tx_pps": 5577911,
+ "tx_pps": 5612428,
+ "tx_pkts": 55779118,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 5751078.058987604,
+ "rx_pkts": 57157093,
+ "time_ms": 1650846852099,
+ "drop_pct": 481321,
+ "total_tx_pps": 5763841,
+ "tx_pps": 5799508,
+ "tx_pkts": 57638414,
+ "drop_percentage": 0.8350698199294658
+ },
+ {
+ "rx_pps": 5705968.0,
+ "rx_pkts": 56714474,
+ "time_ms": 1650846864604,
+ "drop_pct": 0,
+ "total_tx_pps": 5671447,
+ "tx_pps": 5705968,
+ "tx_pkts": 56714474,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 5750757.520096343,
+ "rx_pkts": 57153905,
+ "time_ms": 1650846877117,
+ "drop_pct": 19683,
+ "total_tx_pps": 5717358,
+ "tx_pps": 5752738,
+ "tx_pkts": 57173588,
+ "drop_percentage": 0.03442673564583702
+ },
+ {
+ "rx_pps": 5729352.0,
+ "rx_pkts": 56941164,
+ "time_ms": 1650846889640,
+ "drop_pct": 0,
+ "total_tx_pps": 5694116,
+ "tx_pps": 5729352,
+ "tx_pkts": 56941164,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 5741046.0,
+ "rx_pkts": 57126277,
+ "time_ms": 1650846902209,
+ "drop_pct": 0,
+ "total_tx_pps": 5712627,
+ "tx_pps": 5741046,
+ "tx_pkts": 57126277,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 5746066.120913432,
+ "rx_pkts": 57107283,
+ "time_ms": 1650846914721,
+ "drop_pct": 8208,
+ "total_tx_pps": 5711549,
+ "tx_pps": 5746892,
+ "tx_pkts": 57115491,
+ "ndr_pps": 2870523,
+ "drop_percentage": 0.014370882323326258
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 128,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "bf2b37b1fdf341adb7ee11f081d946e2"
+ },
+ "synthesis": {
+ "avg_delay_usec": 49.5002764139522,
+ "total_tx_rate": 5712627
+ }
+ },
+ {
+ "input": {
+ "rate": "ndr",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1280-fc_128-rate_ndr-2.json",
+ "frame_sizes": [
+ "1280"
+ ],
+ "duration_sec": "10",
+ "flow_count": "128",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc18_loopback"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-04-25 00:40:01",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:07.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "EXT",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn1ter",
+ "name": "net_nfvbench_vn1ter",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1",
+ "name": "net_nfvbench_vn1",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": true,
+ "request_id": "efd7195831c840da8ce6081eb537d3bb",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "1280"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 128,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1280-fc_128-rate_ndr-1.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": true,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "1280"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2505,
+ 2505
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc18_loopback",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "flavor_nfvbench_dpdk",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1280-fc_128-rate_ndr-1.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "EXT": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "1280": {
+ "ndr": {
+ "load_percent_per_direction": 96.09375,
+ "timestamp_sec": 1650847342.0063174,
+ "stats": {
+ "total_tx_rate": 4591939,
+ "overall": {
+ "rx_pkts": 45919398,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 114,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 45919398,
+ "avg_delay_usec": 76.50007539297445,
+ "min_delay_usec": 7,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 22958545,
+ "min_delay_usec": 8,
+ "drop_pct": 0,
+ "max_delay_usec": 0,
+ "tx_pkts": 22960853,
+ "avg_delay_usec": 75,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 22960853,
+ "min_delay_usec": 7,
+ "drop_pct": 0,
+ "max_delay_usec": 114,
+ "tx_pkts": 22958545,
+ "avg_delay_usec": 78,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 47756165600.0,
+ "theoretical_tx_rate_pps": 4807692.307692308
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 192.1875,
+ "duration_sec": 10.0,
+ "l2frame_size": "1280",
+ "rate_pps": 4619890,
+ "rate_bps": 48046875000.0,
+ "time_taken_sec": 137.62104272842407
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 4726361.303264256,
+ "rx_pkts": 46391573,
+ "time_ms": 1650847216874,
+ "drop_pct": 798301,
+ "total_tx_pps": 4718987,
+ "tx_pps": 4807692,
+ "tx_pkts": 47189874,
+ "drop_percentage": 1.6916786003709186
+ },
+ {
+ "rx_pps": 2403846.0,
+ "rx_pkts": 23890625,
+ "time_ms": 1650847229398,
+ "drop_pct": 0,
+ "total_tx_pps": 2389062,
+ "tx_pps": 2403846,
+ "tx_pkts": 23890625,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 3605768.0,
+ "rx_pkts": 35835928,
+ "time_ms": 1650847241898,
+ "drop_pct": 0,
+ "total_tx_pps": 3583592,
+ "tx_pps": 3605768,
+ "tx_pkts": 35835928,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 4206730.0,
+ "rx_pkts": 41812793,
+ "time_ms": 1650847254402,
+ "drop_pct": 0,
+ "total_tx_pps": 4181279,
+ "tx_pps": 4206730,
+ "tx_pkts": 41812793,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 4507210.0,
+ "rx_pkts": 44794910,
+ "time_ms": 1650847266925,
+ "drop_pct": 0,
+ "total_tx_pps": 4479491,
+ "tx_pps": 4507210,
+ "tx_pkts": 44794910,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 4626551.174328503,
+ "rx_pkts": 45980982,
+ "time_ms": 1650847279421,
+ "drop_pct": 307088,
+ "total_tx_pps": 4628807,
+ "tx_pps": 4657450,
+ "tx_pkts": 46288070,
+ "drop_percentage": 0.663427963187923
+ },
+ {
+ "rx_pps": 4582330.0,
+ "rx_pkts": 45541488,
+ "time_ms": 1650847291945,
+ "drop_pct": 0,
+ "total_tx_pps": 4554148,
+ "tx_pps": 4582330,
+ "tx_pkts": 45541488,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 4619890.0,
+ "rx_pkts": 45919398,
+ "time_ms": 1650847304448,
+ "drop_pct": 0,
+ "total_tx_pps": 4591939,
+ "tx_pps": 4619890,
+ "tx_pkts": 45919398,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 4626459.929477386,
+ "rx_pkts": 45984700,
+ "time_ms": 1650847316968,
+ "drop_pct": 121362,
+ "total_tx_pps": 4610606,
+ "tx_pps": 4638670,
+ "tx_pkts": 46106062,
+ "drop_percentage": 0.26322352145364314
+ },
+ {
+ "rx_pps": 4626470.421255804,
+ "rx_pkts": 45980179,
+ "time_ms": 1650847329472,
+ "drop_pct": 27923,
+ "total_tx_pps": 4600810,
+ "tx_pps": 4629280,
+ "tx_pkts": 46008102,
+ "drop_percentage": 0.060691484295526905
+ },
+ {
+ "rx_pps": 4624386.171056487,
+ "rx_pkts": 45959463,
+ "time_ms": 1650847342005,
+ "drop_pct": 1986,
+ "total_tx_pps": 4596144,
+ "tx_pps": 4624586,
+ "tx_pkts": 45961449,
+ "ndr_pps": 2309945,
+ "drop_percentage": 0.00432101259470736
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 128,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "efd7195831c840da8ce6081eb537d3bb"
+ },
+ "synthesis": {
+ "avg_delay_usec": 76.50007539297445,
+ "total_tx_rate": 4591939
+ }
+ },
+ {
+ "input": {
+ "rate": "ndr",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1518-fc_128-rate_ndr-2.json",
+ "frame_sizes": [
+ "1518"
+ ],
+ "duration_sec": "10",
+ "flow_count": "128",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc18_loopback"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-04-25 00:44:46",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:07.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "EXT",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn1ter",
+ "name": "net_nfvbench_vn1ter",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1",
+ "name": "net_nfvbench_vn1",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": true,
+ "request_id": "779e1d4206d7447fac094ddc44eb2c29",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "1518"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 128,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1518-fc_128-rate_ndr-0.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": true,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "1518"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2505,
+ 2505
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc18_loopback",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "flavor_nfvbench_dpdk",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1518-fc_128-rate_ndr-0.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "EXT": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "1518": {
+ "ndr": {
+ "load_percent_per_direction": 95.99609375,
+ "timestamp_sec": 1650847627.0343828,
+ "stats": {
+ "total_tx_rate": 3877409,
+ "overall": {
+ "rx_pkts": 38774090,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 127,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 38774090,
+ "avg_delay_usec": 90.0,
+ "min_delay_usec": 7,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 19386070,
+ "min_delay_usec": 8,
+ "drop_pct": 0,
+ "max_delay_usec": 122,
+ "tx_pkts": 19388020,
+ "avg_delay_usec": 90,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 19388020,
+ "min_delay_usec": 7,
+ "drop_pct": 0,
+ "max_delay_usec": 127,
+ "tx_pkts": 19386070,
+ "avg_delay_usec": 90,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 47707640336.0,
+ "theoretical_tx_rate_pps": 4063719.1157347206
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 191.9921875,
+ "duration_sec": 10.0,
+ "l2frame_size": "1518",
+ "rate_pps": 3901010,
+ "rate_bps": 47998046874.0,
+ "time_taken_sec": 137.63707971572876
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 3982058.717650659,
+ "rx_pkts": 39160327,
+ "time_ms": 1650847501905,
+ "drop_pct": 803053,
+ "total_tx_pps": 3996338,
+ "tx_pps": 4063718,
+ "tx_pkts": 39963380,
+ "drop_percentage": 2.0094721717732584
+ },
+ {
+ "rx_pps": 2031858.0,
+ "rx_pkts": 20193623,
+ "time_ms": 1650847514427,
+ "drop_pct": 0,
+ "total_tx_pps": 2019362,
+ "tx_pps": 2031858,
+ "tx_pkts": 20193623,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 3047788.0,
+ "rx_pkts": 30291967,
+ "time_ms": 1650847526954,
+ "drop_pct": 0,
+ "total_tx_pps": 3029196,
+ "tx_pps": 3047788,
+ "tx_pkts": 30291967,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 3555754.0,
+ "rx_pkts": 35338865,
+ "time_ms": 1650847539460,
+ "drop_pct": 0,
+ "total_tx_pps": 3533886,
+ "tx_pps": 3555754,
+ "tx_pkts": 35338865,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 3809736.0,
+ "rx_pkts": 37920208,
+ "time_ms": 1650847551974,
+ "drop_pct": 0,
+ "total_tx_pps": 3792020,
+ "tx_pps": 3809736,
+ "tx_pkts": 37920208,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 3905724.3403039556,
+ "rx_pkts": 38817042,
+ "time_ms": 1650847564492,
+ "drop_pct": 308110,
+ "total_tx_pps": 3912515,
+ "tx_pps": 3936726,
+ "tx_pkts": 39125152,
+ "drop_percentage": 0.787498538024849
+ },
+ {
+ "rx_pps": 3873232.0,
+ "rx_pkts": 38494117,
+ "time_ms": 1650847576998,
+ "drop_pct": 0,
+ "total_tx_pps": 3849411,
+ "tx_pps": 3873232,
+ "tx_pkts": 38494117,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 3904613.646950039,
+ "rx_pkts": 38806005,
+ "time_ms": 1650847589503,
+ "drop_pct": 3641,
+ "total_tx_pps": 3880964,
+ "tx_pps": 3904980,
+ "tx_pkts": 38809646,
+ "drop_percentage": 0.009381688253482137
+ },
+ {
+ "rx_pps": 3889106.0,
+ "rx_pkts": 38651881,
+ "time_ms": 1650847602006,
+ "drop_pct": 0,
+ "total_tx_pps": 3865188,
+ "tx_pps": 3889106,
+ "tx_pkts": 38651881,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 3897042.0,
+ "rx_pkts": 38730754,
+ "time_ms": 1650847614533,
+ "drop_pct": 0,
+ "total_tx_pps": 3873075,
+ "tx_pps": 3897042,
+ "tx_pkts": 38730754,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 3901010.0,
+ "rx_pkts": 38774090,
+ "time_ms": 1650847627033,
+ "drop_pct": 0,
+ "total_tx_pps": 3877409,
+ "tx_pps": 3901010,
+ "tx_pkts": 38774090,
+ "ndr_pps": 1950505,
+ "drop_percentage": 0.0
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 128,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "779e1d4206d7447fac094ddc44eb2c29"
+ },
+ "synthesis": {
+ "avg_delay_usec": 90.0,
+ "total_tx_rate": 3877409
+ }
+ },
+ {
+ "input": {
+ "rate": "ndr",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_IMIX-fc_128-rate_ndr-2.json",
+ "frame_sizes": [
+ "IMIX"
+ ],
+ "duration_sec": "10",
+ "flow_count": "128",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc18_loopback"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-04-25 00:51:54",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:07.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "EXT",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn1ter",
+ "name": "net_nfvbench_vn1ter",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1",
+ "name": "net_nfvbench_vn1",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": true,
+ "request_id": "b4b97675381e45d68bdac84b0319071d",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "IMIX"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 128,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_IMIX-fc_128-rate_ndr-0.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": true,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "IMIX"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2505,
+ 2505
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc18_loopback",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "flavor_nfvbench_dpdk",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_IMIX-fc_128-rate_ndr-0.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "EXT": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "warning": "WARNING: There is a significant difference between requested TX rate (16368398) and actual TX rate (14161735). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "IMIX": {
+ "ndr": {
+ "load_percent_per_direction": 100.0,
+ "timestamp_sec": 1650847929.3742573,
+ "stats": {
+ "total_tx_rate": 14161735,
+ "overall": {
+ "rx_pkts": 141617354,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 626,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 141617354,
+ "avg_delay_usec": 338.5356628538618,
+ "min_delay_usec": 7,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 70907706,
+ "min_delay_usec": 7,
+ "drop_pct": 0,
+ "max_delay_usec": 626,
+ "tx_pkts": 70709648,
+ "avg_delay_usec": 364,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 70709648,
+ "min_delay_usec": 7,
+ "drop_pct": 0,
+ "max_delay_usec": 613,
+ "tx_pkts": 70907706,
+ "avg_delay_usec": 313,
+ "drop_percentage": 0.0
+ },
+ "warning": "WARNING: There is a significant difference between requested TX rate (16368398) and actual TX rate (14161735). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 43259379846.666664,
+ "theoretical_tx_rate_pps": 16368398.079441292
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 200.0,
+ "duration_sec": 10.0,
+ "l2frame_size": "IMIX",
+ "rate_pps": 16368398,
+ "rate_bps": 50000000000.0,
+ "time_taken_sec": 12.501379013061523
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 16368398.0,
+ "rx_pkts": 141617354,
+ "time_ms": 1650847929373,
+ "drop_pct": 0,
+ "total_tx_pps": 14161735,
+ "tx_pps": 16368398,
+ "tx_pkts": 141617354,
+ "ndr_pps": 8184199,
+ "warning": "WARNING: There is a significant difference between requested TX rate (16368398) and actual TX rate (14161735). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "drop_percentage": 0.0
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 128,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "b4b97675381e45d68bdac84b0319071d"
+ },
+ "synthesis": {
+ "avg_delay_usec": 338.5356628538618,
+ "total_tx_rate": 14161735
+ }
+ },
+ {
+ "input": {
+ "rate": "ndr",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_9000-fc_128-rate_ndr-2.json",
+ "frame_sizes": [
+ "9000"
+ ],
+ "duration_sec": "10",
+ "flow_count": "128",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc18_loopback"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-04-25 00:52:42",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:07.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "EXT",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn1ter",
+ "name": "net_nfvbench_vn1ter",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1",
+ "name": "net_nfvbench_vn1",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": true,
+ "request_id": "963406d7c07b4253af12344ca0127fe4",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "9000"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 128,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_9000-fc_128-rate_ndr-0.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": true,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "9000"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2505,
+ 2505
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc18_loopback",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "flavor_nfvbench_dpdk",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_9000-fc_128-rate_ndr-0.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "EXT": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "9000": {
+ "ndr": {
+ "load_percent_per_direction": 95.99609375,
+ "timestamp_sec": 1650848102.789528,
+ "stats": {
+ "total_tx_rate": 661069,
+ "overall": {
+ "rx_pkts": 6610694,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 546,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 6610694,
+ "avg_delay_usec": 477.49957311592397,
+ "min_delay_usec": 15,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 3305181,
+ "min_delay_usec": 15,
+ "drop_pct": 0,
+ "max_delay_usec": 546,
+ "tx_pkts": 3305513,
+ "avg_delay_usec": 486,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 3305513,
+ "min_delay_usec": 16,
+ "drop_pct": 0,
+ "max_delay_usec": 524,
+ "tx_pkts": 3305181,
+ "avg_delay_usec": 469,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 47702739040.0,
+ "theoretical_tx_rate_pps": 692904.6563192905
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 191.9921875,
+ "duration_sec": 10.0,
+ "l2frame_size": "9000",
+ "rate_pps": 665160,
+ "rate_bps": 47998046874.0,
+ "time_taken_sec": 137.69506430625916
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 668576.9554345435,
+ "rx_pkts": 6669405,
+ "time_ms": 1650847977603,
+ "drop_pct": 242675,
+ "total_tx_pps": 691208,
+ "tx_pps": 692904,
+ "tx_pkts": 6912080,
+ "drop_percentage": 3.510882397194477
+ },
+ {
+ "rx_pps": 346452.0,
+ "rx_pkts": 3443214,
+ "time_ms": 1650847990100,
+ "drop_pct": 0,
+ "total_tx_pps": 344321,
+ "tx_pps": 346452,
+ "tx_pkts": 3443214,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 519678.0,
+ "rx_pkts": 5164820,
+ "time_ms": 1650848002628,
+ "drop_pct": 0,
+ "total_tx_pps": 516482,
+ "tx_pps": 519678,
+ "tx_pkts": 5164820,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 606290.0,
+ "rx_pkts": 6025615,
+ "time_ms": 1650848015147,
+ "drop_pct": 0,
+ "total_tx_pps": 602561,
+ "tx_pps": 606290,
+ "tx_pkts": 6025615,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 649598.0,
+ "rx_pkts": 6456031,
+ "time_ms": 1650848027664,
+ "drop_pct": 0,
+ "total_tx_pps": 645603,
+ "tx_pps": 649598,
+ "tx_pkts": 6456031,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 665820.941861537,
+ "rx_pkts": 6616931,
+ "time_ms": 1650848040183,
+ "drop_pct": 53954,
+ "total_tx_pps": 667088,
+ "tx_pps": 671250,
+ "tx_pkts": 6670885,
+ "drop_percentage": 0.808798232918121
+ },
+ {
+ "rx_pps": 660424.0,
+ "rx_pkts": 6563956,
+ "time_ms": 1650848052688,
+ "drop_pct": 0,
+ "total_tx_pps": 656395,
+ "tx_pps": 660424,
+ "tx_pkts": 6563956,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 665769.8810895403,
+ "rx_pkts": 6616756,
+ "time_ms": 1650848065187,
+ "drop_pct": 677,
+ "total_tx_pps": 661743,
+ "tx_pps": 665838,
+ "tx_pkts": 6617433,
+ "drop_percentage": 0.010230553146514668
+ },
+ {
+ "rx_pps": 663130.0,
+ "rx_pkts": 6590521,
+ "time_ms": 1650848077706,
+ "drop_pct": 0,
+ "total_tx_pps": 659052,
+ "tx_pps": 663130,
+ "tx_pkts": 6590521,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 664484.0,
+ "rx_pkts": 6604642,
+ "time_ms": 1650848090288,
+ "drop_pct": 0,
+ "total_tx_pps": 660464,
+ "tx_pps": 664484,
+ "tx_pkts": 6604642,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 665160.0,
+ "rx_pkts": 6610694,
+ "time_ms": 1650848102788,
+ "drop_pct": 0,
+ "total_tx_pps": 661069,
+ "tx_pps": 665160,
+ "tx_pkts": 6610694,
+ "ndr_pps": 332580,
+ "drop_percentage": 0.0
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 128,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "963406d7c07b4253af12344ca0127fe4"
+ },
+ "synthesis": {
+ "avg_delay_usec": 477.49957311592397,
+ "total_tx_rate": 661069
+ }
+ },
+ {
+ "input": {
+ "rate": "ndr",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_64-fc_10k-rate_ndr-2.json",
+ "frame_sizes": [
+ "64"
+ ],
+ "duration_sec": "10",
+ "flow_count": "10k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc18_loopback"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-04-25 00:59:49",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:07.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "EXT",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn1ter",
+ "name": "net_nfvbench_vn1ter",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1",
+ "name": "net_nfvbench_vn1",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": true,
+ "request_id": "ddbeeb16db0b4920bd33f409fee876fe",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "64"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 10000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_64-fc_10k-rate_ndr-0.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": true,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "64"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2505,
+ 2505
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc18_loopback",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "flavor_nfvbench_dpdk",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_64-fc_10k-rate_ndr-0.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "EXT": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "warning": "WARNING: There is a significant difference between requested TX rate (74404760) and actual TX rate (16548126). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "64": {
+ "ndr": {
+ "load_percent_per_direction": 100.0,
+ "timestamp_sec": 1650848407.2528977,
+ "stats": {
+ "total_tx_rate": 16548126,
+ "overall": {
+ "rx_pkts": 165481260,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 97,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 165481260,
+ "avg_delay_usec": 62.48000978479376,
+ "min_delay_usec": 5,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 82995092,
+ "min_delay_usec": 7,
+ "drop_pct": 0,
+ "max_delay_usec": 97,
+ "tx_pkts": 82486168,
+ "avg_delay_usec": 56,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 82486168,
+ "min_delay_usec": 5,
+ "drop_pct": 0,
+ "max_delay_usec": 92,
+ "tx_pkts": 82995092,
+ "avg_delay_usec": 69,
+ "drop_percentage": 0.0
+ },
+ "warning": "WARNING: There is a significant difference between requested TX rate (74404760) and actual TX rate (16548126). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 11120340672.0,
+ "theoretical_tx_rate_pps": 74404761.90476191
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 200.0,
+ "duration_sec": 10.0,
+ "l2frame_size": "64",
+ "rate_pps": 74404760,
+ "rate_bps": 50000000000.0,
+ "time_taken_sec": 12.518044471740723
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 74404760.0,
+ "rx_pkts": 165481260,
+ "time_ms": 1650848407252,
+ "drop_pct": 0,
+ "total_tx_pps": 16548126,
+ "tx_pps": 74404760,
+ "tx_pkts": 165481260,
+ "ndr_pps": 37202380,
+ "warning": "WARNING: There is a significant difference between requested TX rate (74404760) and actual TX rate (16548126). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "drop_percentage": 0.0
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 10000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "ddbeeb16db0b4920bd33f409fee876fe"
+ },
+ "synthesis": {
+ "avg_delay_usec": 62.48000978479376,
+ "total_tx_rate": 16548126
+ }
+ },
+ {
+ "input": {
+ "rate": "ndr",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_128-fc_10k-rate_ndr-2.json",
+ "frame_sizes": [
+ "128"
+ ],
+ "duration_sec": "10",
+ "flow_count": "10k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc18_loopback"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-04-25 01:00:44",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:07.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "EXT",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn1ter",
+ "name": "net_nfvbench_vn1ter",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1",
+ "name": "net_nfvbench_vn1",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": true,
+ "request_id": "a82a876e3fc54fa087802fe4f8d84f1b",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "128"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 10000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_128-fc_10k-rate_ndr-0.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": true,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "128"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2505,
+ 2505
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc18_loopback",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "flavor_nfvbench_dpdk",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_128-fc_10k-rate_ndr-0.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "EXT": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "128": {
+ "ndr": {
+ "load_percent_per_direction": 100.0,
+ "timestamp_sec": 1650848461.466436,
+ "stats": {
+ "total_tx_rate": 18007502,
+ "overall": {
+ "rx_pkts": 180075026,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 59,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 180075026,
+ "avg_delay_usec": 35.99551240381329,
+ "min_delay_usec": 5,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 90172197,
+ "min_delay_usec": 6,
+ "drop_pct": 0,
+ "max_delay_usec": 59,
+ "tx_pkts": 89902829,
+ "avg_delay_usec": 33,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 89902829,
+ "min_delay_usec": 5,
+ "drop_pct": 0,
+ "max_delay_usec": 58,
+ "tx_pkts": 90172197,
+ "avg_delay_usec": 39,
+ "drop_percentage": 0.0
+ },
+ "warning": "WARNING: There is a significant difference between requested TX rate (42229728) and actual TX rate (18007502). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 21320882368.0,
+ "theoretical_tx_rate_pps": 42229729.72972973
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 200.0,
+ "duration_sec": 10.0,
+ "l2frame_size": "128",
+ "rate_pps": 42229728,
+ "rate_bps": 50000000000.0,
+ "time_taken_sec": 12.491197109222412
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 42229728.0,
+ "rx_pkts": 180075026,
+ "time_ms": 1650848461465,
+ "drop_pct": 0,
+ "total_tx_pps": 18007502,
+ "tx_pps": 42229728,
+ "tx_pkts": 180075026,
+ "ndr_pps": 21114864,
+ "warning": "WARNING: There is a significant difference between requested TX rate (42229728) and actual TX rate (18007502). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "drop_percentage": 0.0
+ }
+ ]
+ }
+ },
+ "warning": "WARNING: There is a significant difference between requested TX rate (42229728) and actual TX rate (18007502). The traffic generator may not have sufficient CPU to achieve the requested TX rate."
+ },
+ "flow_count": 10000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "a82a876e3fc54fa087802fe4f8d84f1b"
+ },
+ "synthesis": {
+ "avg_delay_usec": 35.99551240381329,
+ "total_tx_rate": 18007502
+ }
+ },
+ {
+ "input": {
+ "rate": "ndr",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_256-fc_10k-rate_ndr-2.json",
+ "frame_sizes": [
+ "256"
+ ],
+ "duration_sec": "10",
+ "flow_count": "10k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc18_loopback"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-04-25 01:01:38",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:07.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "EXT",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn1ter",
+ "name": "net_nfvbench_vn1ter",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1",
+ "name": "net_nfvbench_vn1",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": true,
+ "request_id": "cf10f85f2df3470fb233184b92aea608",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "256"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 10000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_256-fc_10k-rate_ndr-0.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": true,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "256"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2505,
+ 2505
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc18_loopback",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "flavor_nfvbench_dpdk",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_256-fc_10k-rate_ndr-0.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "EXT": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "warning": "WARNING: There is a significant difference between requested TX rate (22644926) and actual TX rate (15836292). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "256": {
+ "ndr": {
+ "load_percent_per_direction": 100.0,
+ "timestamp_sec": 1650848515.7108045,
+ "stats": {
+ "total_tx_rate": 15836292,
+ "overall": {
+ "rx_pkts": 158362920,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 52,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 158362920,
+ "avg_delay_usec": 30.001019203232676,
+ "min_delay_usec": 7,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 79262162,
+ "min_delay_usec": 7,
+ "drop_pct": 0,
+ "max_delay_usec": 52,
+ "tx_pkts": 79100758,
+ "avg_delay_usec": 31,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 79100758,
+ "min_delay_usec": 7,
+ "drop_pct": 0,
+ "max_delay_usec": 48,
+ "tx_pkts": 79262162,
+ "avg_delay_usec": 29,
+ "drop_percentage": 0.0
+ },
+ "warning": "WARNING: There is a significant difference between requested TX rate (22644926) and actual TX rate (15836292). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 34966532736.0,
+ "theoretical_tx_rate_pps": 22644927.536231883
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 200.0,
+ "duration_sec": 10.0,
+ "l2frame_size": "256",
+ "rate_pps": 22644926,
+ "rate_bps": 50000000000.0,
+ "time_taken_sec": 12.50765085220337
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 22644926.0,
+ "rx_pkts": 158362920,
+ "time_ms": 1650848515710,
+ "drop_pct": 0,
+ "total_tx_pps": 15836292,
+ "tx_pps": 22644926,
+ "tx_pkts": 158362920,
+ "ndr_pps": 11322463,
+ "warning": "WARNING: There is a significant difference between requested TX rate (22644926) and actual TX rate (15836292). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "drop_percentage": 0.0
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 10000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "cf10f85f2df3470fb233184b92aea608"
+ },
+ "synthesis": {
+ "avg_delay_usec": 30.001019203232676,
+ "total_tx_rate": 15836292
+ }
+ },
+ {
+ "input": {
+ "rate": "ndr",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_512-fc_10k-rate_ndr-2.json",
+ "frame_sizes": [
+ "512"
+ ],
+ "duration_sec": "10",
+ "flow_count": "10k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc18_loopback"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-04-25 01:02:32",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:07.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "EXT",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn1ter",
+ "name": "net_nfvbench_vn1ter",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1",
+ "name": "net_nfvbench_vn1",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": true,
+ "request_id": "d1967af0759441ed88139b68c43d44e4",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "512"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 10000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_512-fc_10k-rate_ndr-0.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": true,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "512"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2505,
+ 2505
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc18_loopback",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "flavor_nfvbench_dpdk",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_512-fc_10k-rate_ndr-0.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "EXT": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "512": {
+ "ndr": {
+ "load_percent_per_direction": 100.0,
+ "timestamp_sec": 1650848569.8980005,
+ "stats": {
+ "total_tx_rate": 11105755,
+ "overall": {
+ "rx_pkts": 111057559,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 681,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 111057559,
+ "avg_delay_usec": 237.93781095080615,
+ "min_delay_usec": 11,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 55569890,
+ "min_delay_usec": 22,
+ "drop_pct": 0,
+ "max_delay_usec": 670,
+ "tx_pkts": 55487669,
+ "avg_delay_usec": 154,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 55487669,
+ "min_delay_usec": 11,
+ "drop_pct": 0,
+ "max_delay_usec": 681,
+ "tx_pkts": 55569890,
+ "avg_delay_usec": 322,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 47266093280.0,
+ "theoretical_tx_rate_pps": 11748120.30075188
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 200.0,
+ "duration_sec": 10.0,
+ "l2frame_size": "512",
+ "rate_pps": 11748120,
+ "rate_bps": 50000000000.0,
+ "time_taken_sec": 12.489594459533691
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 11748120.0,
+ "rx_pkts": 111057559,
+ "time_ms": 1650848569897,
+ "drop_pct": 0,
+ "total_tx_pps": 11105755,
+ "tx_pps": 11748120,
+ "tx_pkts": 111057559,
+ "ndr_pps": 5874060,
+ "drop_percentage": 0.0
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 10000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "d1967af0759441ed88139b68c43d44e4"
+ },
+ "synthesis": {
+ "avg_delay_usec": 237.93781095080615,
+ "total_tx_rate": 11105755
+ }
+ },
+ {
+ "input": {
+ "rate": "ndr",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_768-fc_10k-rate_ndr-2.json",
+ "frame_sizes": [
+ "768"
+ ],
+ "duration_sec": "10",
+ "flow_count": "10k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc18_loopback"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-04-25 01:05:33",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:07.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "EXT",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn1ter",
+ "name": "net_nfvbench_vn1ter",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1",
+ "name": "net_nfvbench_vn1",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": true,
+ "request_id": "18d99ccb52d7454da33eba941f8a8819",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "768"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 10000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_768-fc_10k-rate_ndr-0.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": true,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "768"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2505,
+ 2505
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc18_loopback",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "flavor_nfvbench_dpdk",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_768-fc_10k-rate_ndr-0.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "EXT": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "768": {
+ "ndr": {
+ "load_percent_per_direction": 95.60546875,
+ "timestamp_sec": 1650848875.7264826,
+ "stats": {
+ "total_tx_rate": 7537043,
+ "overall": {
+ "rx_pkts": 75370436,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 80,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 75370436,
+ "avg_delay_usec": 47.499673147704755,
+ "min_delay_usec": 10,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 37683323,
+ "min_delay_usec": 10,
+ "drop_pct": 0,
+ "max_delay_usec": 80,
+ "tx_pkts": 37687113,
+ "avg_delay_usec": 54,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 37687113,
+ "min_delay_usec": 12,
+ "drop_pct": 0,
+ "max_delay_usec": 79,
+ "tx_pkts": 37683323,
+ "avg_delay_usec": 41,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 47513519072.0,
+ "theoretical_tx_rate_pps": 7931472.081218274
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 191.2109375,
+ "duration_sec": 10.0,
+ "l2frame_size": "768",
+ "rate_pps": 7582920,
+ "rate_bps": 47802734374.0,
+ "time_taken_sec": 137.65466976165771
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 7867109.536873953,
+ "rx_pkts": 75914335,
+ "time_ms": 1650848750578,
+ "drop_pct": 621071,
+ "total_tx_pps": 7653540,
+ "tx_pps": 7931472,
+ "tx_pkts": 76535406,
+ "drop_percentage": 0.8114819434027697
+ },
+ {
+ "rx_pps": 3965736.0,
+ "rx_pkts": 39453125,
+ "time_ms": 1650848763085,
+ "drop_pct": 0,
+ "total_tx_pps": 3945312,
+ "tx_pps": 3965736,
+ "tx_pkts": 39453125,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 5948604.0,
+ "rx_pkts": 59120202,
+ "time_ms": 1650848775586,
+ "drop_pct": 0,
+ "total_tx_pps": 5912020,
+ "tx_pps": 5948604,
+ "tx_pkts": 59120202,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 6940038.0,
+ "rx_pkts": 68973579,
+ "time_ms": 1650848788099,
+ "drop_pct": 0,
+ "total_tx_pps": 6897357,
+ "tx_pps": 6940038,
+ "tx_pkts": 68973579,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 7435754.0,
+ "rx_pkts": 73900239,
+ "time_ms": 1650848800633,
+ "drop_pct": 0,
+ "total_tx_pps": 7390023,
+ "tx_pps": 7435754,
+ "tx_pkts": 73900239,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 7620916.349942744,
+ "rx_pkts": 75507249,
+ "time_ms": 1650848813170,
+ "drop_pct": 621182,
+ "total_tx_pps": 7612843,
+ "tx_pps": 7683612,
+ "tx_pkts": 76128431,
+ "drop_percentage": 0.8159658511811442
+ },
+ {
+ "rx_pps": 7559684.0,
+ "rx_pkts": 75131929,
+ "time_ms": 1650848825666,
+ "drop_pct": 0,
+ "total_tx_pps": 7513192,
+ "tx_pps": 7559684,
+ "tx_pkts": 75131929,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 7596717.342100184,
+ "rx_pkts": 75644305,
+ "time_ms": 1650848838182,
+ "drop_pct": 248247,
+ "total_tx_pps": 7589255,
+ "tx_pps": 7621648,
+ "tx_pkts": 75892552,
+ "drop_percentage": 0.3271032445977044
+ },
+ {
+ "rx_pps": 7590338.485813464,
+ "rx_pkts": 75436585,
+ "time_ms": 1650848850710,
+ "drop_pct": 3255,
+ "total_tx_pps": 7543984,
+ "tx_pps": 7590666,
+ "tx_pkts": 75439840,
+ "drop_percentage": 0.004314696319610434
+ },
+ {
+ "rx_pps": 7575174.0,
+ "rx_pkts": 75285867,
+ "time_ms": 1650848863217,
+ "drop_pct": 0,
+ "total_tx_pps": 7528586,
+ "tx_pps": 7575174,
+ "tx_pkts": 75285867,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 7582920.0,
+ "rx_pkts": 75370436,
+ "time_ms": 1650848875725,
+ "drop_pct": 0,
+ "total_tx_pps": 7537043,
+ "tx_pps": 7582920,
+ "tx_pkts": 75370436,
+ "ndr_pps": 3791460,
+ "drop_percentage": 0.0
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 10000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "18d99ccb52d7454da33eba941f8a8819"
+ },
+ "synthesis": {
+ "avg_delay_usec": 47.499673147704755,
+ "total_tx_rate": 7537043
+ }
+ },
+ {
+ "input": {
+ "rate": "ndr",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1024-fc_10k-rate_ndr-2.json",
+ "frame_sizes": [
+ "1024"
+ ],
+ "duration_sec": "10",
+ "flow_count": "10k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc18_loopback"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-04-25 01:17:35",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:07.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "EXT",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn1ter",
+ "name": "net_nfvbench_vn1ter",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1",
+ "name": "net_nfvbench_vn1",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": true,
+ "request_id": "f980c04f3b844edebf749e967b297a62",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "1024"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 10000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1024-fc_10k-rate_ndr-2.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": true,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "1024"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2505,
+ 2505
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc18_loopback",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "flavor_nfvbench_dpdk",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1024-fc_10k-rate_ndr-2.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "EXT": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "1024": {
+ "ndr": {
+ "load_percent_per_direction": 95.8984375,
+ "timestamp_sec": 1650849598.2220418,
+ "stats": {
+ "total_tx_rate": 5706312,
+ "overall": {
+ "rx_pkts": 57062671,
+ "drop_percentage": 0.0007973625559875567,
+ "drop_pct": 455,
+ "max_delay_usec": 96,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 57063126,
+ "avg_delay_usec": 51.4996825858362,
+ "min_delay_usec": 9,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 28530128,
+ "min_delay_usec": 9,
+ "drop_pct": 0,
+ "max_delay_usec": 96,
+ "tx_pkts": 28532998,
+ "avg_delay_usec": 59,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 28532543,
+ "min_delay_usec": 11,
+ "drop_pct": 455,
+ "max_delay_usec": 89,
+ "tx_pkts": 28530128,
+ "avg_delay_usec": 44,
+ "drop_percentage": 0.0015948053229904893
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 47659117824.0,
+ "theoretical_tx_rate_pps": 5986590.038314176
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 191.796875,
+ "duration_sec": 10.0,
+ "l2frame_size": "1024",
+ "rate_pps": 5741046,
+ "rate_bps": 47949218750.0,
+ "time_taken_sec": 137.68057537078857
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 5905784.604263414,
+ "rx_pkts": 57472018,
+ "time_ms": 1650849473030,
+ "drop_pct": 786356,
+ "total_tx_pps": 5825837,
+ "tx_pps": 5986590,
+ "tx_pkts": 58258374,
+ "drop_percentage": 1.3497733390224727
+ },
+ {
+ "rx_pps": 2993294.0,
+ "rx_pkts": 29748857,
+ "time_ms": 1650849485555,
+ "drop_pct": 0,
+ "total_tx_pps": 2974885,
+ "tx_pps": 2993294,
+ "tx_pkts": 29748857,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 4489942.0,
+ "rx_pkts": 44627778,
+ "time_ms": 1650849498054,
+ "drop_pct": 0,
+ "total_tx_pps": 4462777,
+ "tx_pps": 4489942,
+ "tx_pkts": 44627778,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 5238266.0,
+ "rx_pkts": 52065746,
+ "time_ms": 1650849510553,
+ "drop_pct": 0,
+ "total_tx_pps": 5206574,
+ "tx_pps": 5238266,
+ "tx_pkts": 52065746,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 5612428.0,
+ "rx_pkts": 55779111,
+ "time_ms": 1650849523054,
+ "drop_pct": 0,
+ "total_tx_pps": 5577911,
+ "tx_pps": 5612428,
+ "tx_pkts": 55779111,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 5751042.570625828,
+ "rx_pkts": 57271760,
+ "time_ms": 1650849535577,
+ "drop_pct": 482643,
+ "total_tx_pps": 5775440,
+ "tx_pps": 5799508,
+ "tx_pkts": 57754403,
+ "drop_percentage": 0.8356817401436909
+ },
+ {
+ "rx_pps": 5705968.0,
+ "rx_pkts": 56708762,
+ "time_ms": 1650849548099,
+ "drop_pct": 0,
+ "total_tx_pps": 5670876,
+ "tx_pps": 5705968,
+ "tx_pkts": 56708762,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 5750684.6723701265,
+ "rx_pkts": 57153189,
+ "time_ms": 1650849560600,
+ "drop_pct": 20407,
+ "total_tx_pps": 5717359,
+ "tx_pps": 5752738,
+ "tx_pkts": 57173596,
+ "drop_percentage": 0.03569304963780833
+ },
+ {
+ "rx_pps": 5729352.0,
+ "rx_pkts": 56941171,
+ "time_ms": 1650849573113,
+ "drop_pct": 0,
+ "total_tx_pps": 5694117,
+ "tx_pps": 5729352,
+ "tx_pkts": 56941171,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 5741000.223048874,
+ "rx_pkts": 57062671,
+ "time_ms": 1650849585617,
+ "drop_pct": 455,
+ "total_tx_pps": 5706312,
+ "tx_pps": 5741046,
+ "tx_pkts": 57063126,
+ "drop_percentage": 0.0007973625559875567
+ },
+ {
+ "rx_pps": 5746113.109782579,
+ "rx_pkts": 57107742,
+ "time_ms": 1650849598221,
+ "drop_pct": 7741,
+ "total_tx_pps": 5711548,
+ "tx_pps": 5746892,
+ "tx_pkts": 57115483,
+ "ndr_pps": 2870523,
+ "drop_percentage": 0.013553242647006943
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 10000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "f980c04f3b844edebf749e967b297a62"
+ },
+ "synthesis": {
+ "avg_delay_usec": 51.4996825858362,
+ "total_tx_rate": 5706312
+ }
+ },
+ {
+ "input": {
+ "rate": "ndr",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1280-fc_10k-rate_ndr-2.json",
+ "frame_sizes": [
+ "1280"
+ ],
+ "duration_sec": "10",
+ "flow_count": "10k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc18_loopback"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-04-25 01:20:00",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:07.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "EXT",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn1ter",
+ "name": "net_nfvbench_vn1ter",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1",
+ "name": "net_nfvbench_vn1",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": true,
+ "request_id": "a5da318377744c288afee82b6e83d7f4",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "1280"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 10000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1280-fc_10k-rate_ndr-0.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": true,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "1280"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2505,
+ 2505
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc18_loopback",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "flavor_nfvbench_dpdk",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1280-fc_10k-rate_ndr-0.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "EXT": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "1280": {
+ "ndr": {
+ "load_percent_per_direction": 96.09375,
+ "timestamp_sec": 1650849742.814171,
+ "stats": {
+ "total_tx_rate": 4591478,
+ "overall": {
+ "rx_pkts": 45914783,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 113,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 45914783,
+ "avg_delay_usec": 76.0,
+ "min_delay_usec": 7,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 22956236,
+ "min_delay_usec": 7,
+ "drop_pct": 0,
+ "max_delay_usec": 113,
+ "tx_pkts": 22958547,
+ "avg_delay_usec": 76,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 22958547,
+ "min_delay_usec": 7,
+ "drop_pct": 0,
+ "max_delay_usec": 103,
+ "tx_pkts": 22956236,
+ "avg_delay_usec": 76,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 47751371200.0,
+ "theoretical_tx_rate_pps": 4807692.307692308
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 192.1875,
+ "duration_sec": 10.0,
+ "l2frame_size": "1280",
+ "rate_pps": 4619890,
+ "rate_bps": 48046875000.0,
+ "time_taken_sec": 137.75093936920166
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 4726682.774538362,
+ "rx_pkts": 46236280,
+ "time_ms": 1650849617552,
+ "drop_pct": 792430,
+ "total_tx_pps": 4702871,
+ "tx_pps": 4807692,
+ "tx_pkts": 47028710,
+ "drop_percentage": 1.6849919974415628
+ },
+ {
+ "rx_pps": 2403846.0,
+ "rx_pkts": 23888220,
+ "time_ms": 1650849630057,
+ "drop_pct": 0,
+ "total_tx_pps": 2388822,
+ "tx_pps": 2403846,
+ "tx_pkts": 23888220,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 3605768.0,
+ "rx_pkts": 35835928,
+ "time_ms": 1650849642637,
+ "drop_pct": 0,
+ "total_tx_pps": 3583592,
+ "tx_pps": 3605768,
+ "tx_pkts": 35835928,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 4206730.0,
+ "rx_pkts": 41808587,
+ "time_ms": 1650849655220,
+ "drop_pct": 0,
+ "total_tx_pps": 4180858,
+ "tx_pps": 4206730,
+ "tx_pkts": 41808587,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 4507210.0,
+ "rx_pkts": 44794909,
+ "time_ms": 1650849667733,
+ "drop_pct": 0,
+ "total_tx_pps": 4479490,
+ "tx_pps": 4507210,
+ "tx_pkts": 44794909,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 4626492.009806026,
+ "rx_pkts": 45980393,
+ "time_ms": 1650849680242,
+ "drop_pct": 307676,
+ "total_tx_pps": 4628806,
+ "tx_pps": 4657450,
+ "tx_pkts": 46288069,
+ "drop_percentage": 0.6646982832660399
+ },
+ {
+ "rx_pps": 4582330.0,
+ "rx_pkts": 45541488,
+ "time_ms": 1650849692745,
+ "drop_pct": 0,
+ "total_tx_pps": 4554148,
+ "tx_pps": 4582330,
+ "tx_pkts": 45541488,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 4619890.0,
+ "rx_pkts": 45914783,
+ "time_ms": 1650849705269,
+ "drop_pct": 0,
+ "total_tx_pps": 4591478,
+ "tx_pps": 4619890,
+ "tx_pkts": 45914783,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 4626391.745988317,
+ "rx_pkts": 46071925,
+ "time_ms": 1650849717790,
+ "drop_pct": 122273,
+ "total_tx_pps": 4619419,
+ "tx_pps": 4638670,
+ "tx_pkts": 46194198,
+ "drop_percentage": 0.2646934145279457
+ },
+ {
+ "rx_pps": 4626440.83932869,
+ "rx_pkts": 45979885,
+ "time_ms": 1650849730293,
+ "drop_pct": 28217,
+ "total_tx_pps": 4600810,
+ "tx_pps": 4629280,
+ "tx_pkts": 46008102,
+ "drop_percentage": 0.06133050217981172
+ },
+ {
+ "rx_pps": 4624386.070437684,
+ "rx_pkts": 45959462,
+ "time_ms": 1650849742813,
+ "drop_pct": 1987,
+ "total_tx_pps": 4596144,
+ "tx_pps": 4624586,
+ "tx_pkts": 45961449,
+ "ndr_pps": 2309945,
+ "drop_percentage": 0.004323188331159881
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 10000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "a5da318377744c288afee82b6e83d7f4"
+ },
+ "synthesis": {
+ "avg_delay_usec": 76.0,
+ "total_tx_rate": 4591478
+ }
+ },
+ {
+ "input": {
+ "rate": "ndr",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1518-fc_10k-rate_ndr-2.json",
+ "frame_sizes": [
+ "1518"
+ ],
+ "duration_sec": "10",
+ "flow_count": "10k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc18_loopback"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-04-25 01:32:02",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:07.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "EXT",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn1ter",
+ "name": "net_nfvbench_vn1ter",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1",
+ "name": "net_nfvbench_vn1",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": true,
+ "request_id": "2a0a188162394858b0f91a93a609e85b",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "1518"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 10000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1518-fc_10k-rate_ndr-2.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": true,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "1518"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2505,
+ 2505
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc18_loopback",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "flavor_nfvbench_dpdk",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1518-fc_10k-rate_ndr-2.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "EXT": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "1518": {
+ "ndr": {
+ "load_percent_per_direction": 95.99609375,
+ "timestamp_sec": 1650850465.3741472,
+ "stats": {
+ "total_tx_rate": 3877019,
+ "overall": {
+ "rx_pkts": 38770196,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 139,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 38770196,
+ "avg_delay_usec": 99.4996727383065,
+ "min_delay_usec": 8,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 19384122,
+ "min_delay_usec": 8,
+ "drop_pct": 0,
+ "max_delay_usec": 139,
+ "tx_pkts": 19386074,
+ "avg_delay_usec": 106,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 19386074,
+ "min_delay_usec": 12,
+ "drop_pct": 0,
+ "max_delay_usec": 139,
+ "tx_pkts": 19384122,
+ "avg_delay_usec": 93,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 47702841776.0,
+ "theoretical_tx_rate_pps": 4063719.1157347206
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 191.9921875,
+ "duration_sec": 10.0,
+ "l2frame_size": "1518",
+ "rate_pps": 3901010,
+ "rate_bps": 47998046874.0,
+ "time_taken_sec": 137.7311794757843
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 3982204.741901213,
+ "rx_pkts": 39030251,
+ "time_ms": 1650850340162,
+ "drop_pct": 798925,
+ "total_tx_pps": 3982917,
+ "tx_pps": 4063718,
+ "tx_pkts": 39829176,
+ "drop_percentage": 2.0058788060290276
+ },
+ {
+ "rx_pps": 2031858.0,
+ "rx_pkts": 20193624,
+ "time_ms": 1650850352678,
+ "drop_pct": 0,
+ "total_tx_pps": 2019362,
+ "tx_pps": 2031858,
+ "tx_pkts": 20193624,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 3047788.0,
+ "rx_pkts": 30308733,
+ "time_ms": 1650850365187,
+ "drop_pct": 0,
+ "total_tx_pps": 3030873,
+ "tx_pps": 3047788,
+ "tx_pkts": 30308733,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 3555754.0,
+ "rx_pkts": 35342421,
+ "time_ms": 1650850377693,
+ "drop_pct": 0,
+ "total_tx_pps": 3534242,
+ "tx_pps": 3555754,
+ "tx_pkts": 35342421,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 3809736.0,
+ "rx_pkts": 37863066,
+ "time_ms": 1650850390212,
+ "drop_pct": 0,
+ "total_tx_pps": 3786306,
+ "tx_pps": 3809736,
+ "tx_pkts": 37863066,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 3905550.3906702464,
+ "rx_pkts": 38819222,
+ "time_ms": 1650850402727,
+ "drop_pct": 309870,
+ "total_tx_pps": 3912909,
+ "tx_pps": 3936726,
+ "tx_pkts": 39129092,
+ "drop_percentage": 0.7919171750778168
+ },
+ {
+ "rx_pps": 3873232.0,
+ "rx_pkts": 38494120,
+ "time_ms": 1650850415300,
+ "drop_pct": 0,
+ "total_tx_pps": 3849412,
+ "tx_pps": 3873232,
+ "tx_pkts": 38494120,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 3904613.0432372405,
+ "rx_pkts": 38805999,
+ "time_ms": 1650850427820,
+ "drop_pct": 3647,
+ "total_tx_pps": 3880964,
+ "tx_pps": 3904980,
+ "tx_pkts": 38809646,
+ "drop_percentage": 0.009397148327506002
+ },
+ {
+ "rx_pps": 3889106.0,
+ "rx_pkts": 38799675,
+ "time_ms": 1650850440360,
+ "drop_pct": 0,
+ "total_tx_pps": 3879967,
+ "tx_pps": 3889106,
+ "tx_pkts": 38799675,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 3897042.0,
+ "rx_pkts": 38734654,
+ "time_ms": 1650850452876,
+ "drop_pct": 0,
+ "total_tx_pps": 3873465,
+ "tx_pps": 3897042,
+ "tx_pkts": 38734654,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 3901010.0,
+ "rx_pkts": 38770196,
+ "time_ms": 1650850465373,
+ "drop_pct": 0,
+ "total_tx_pps": 3877019,
+ "tx_pps": 3901010,
+ "tx_pkts": 38770196,
+ "ndr_pps": 1950505,
+ "drop_percentage": 0.0
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 10000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "2a0a188162394858b0f91a93a609e85b"
+ },
+ "synthesis": {
+ "avg_delay_usec": 99.4996727383065,
+ "total_tx_rate": 3877019
+ }
+ },
+ {
+ "input": {
+ "rate": "ndr",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_IMIX-fc_10k-rate_ndr-2.json",
+ "frame_sizes": [
+ "IMIX"
+ ],
+ "duration_sec": "10",
+ "flow_count": "10k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc18_loopback"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-04-25 01:34:45",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:07.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "EXT",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn1ter",
+ "name": "net_nfvbench_vn1ter",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1",
+ "name": "net_nfvbench_vn1",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": true,
+ "request_id": "0983ac3addf84a478e6da408b3e21aca",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "IMIX"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 10000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_IMIX-fc_10k-rate_ndr-1.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": true,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "IMIX"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2505,
+ 2505
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc18_loopback",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "flavor_nfvbench_dpdk",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_IMIX-fc_10k-rate_ndr-1.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "EXT": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "warning": "WARNING: There is a significant difference between requested TX rate (16368398) and actual TX rate (14122958). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "IMIX": {
+ "ndr": {
+ "load_percent_per_direction": 100.0,
+ "timestamp_sec": 1650850502.7712622,
+ "stats": {
+ "total_tx_rate": 14122958,
+ "overall": {
+ "rx_pkts": 141229588,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 628,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 141229588,
+ "avg_delay_usec": 356.54005520429615,
+ "min_delay_usec": 20,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 70668670,
+ "min_delay_usec": 21,
+ "drop_pct": 0,
+ "max_delay_usec": 628,
+ "tx_pkts": 70560918,
+ "avg_delay_usec": 409,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 70560918,
+ "min_delay_usec": 20,
+ "drop_pct": 0,
+ "max_delay_usec": 603,
+ "tx_pkts": 70668670,
+ "avg_delay_usec": 304,
+ "drop_percentage": 0.0
+ },
+ "warning": "WARNING: There is a significant difference between requested TX rate (16368398) and actual TX rate (14122958). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 43140929037.33333,
+ "theoretical_tx_rate_pps": 16368398.079441292
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 200.0,
+ "duration_sec": 10.0,
+ "l2frame_size": "IMIX",
+ "rate_pps": 16368398,
+ "rate_bps": 50000000000.0,
+ "time_taken_sec": 12.55201530456543
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 16368398.0,
+ "rx_pkts": 141229588,
+ "time_ms": 1650850502770,
+ "drop_pct": 0,
+ "total_tx_pps": 14122958,
+ "tx_pps": 16368398,
+ "tx_pkts": 141229588,
+ "ndr_pps": 8184199,
+ "warning": "WARNING: There is a significant difference between requested TX rate (16368398) and actual TX rate (14122958). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "drop_percentage": 0.0
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 10000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "0983ac3addf84a478e6da408b3e21aca"
+ },
+ "synthesis": {
+ "avg_delay_usec": 356.54005520429615,
+ "total_tx_rate": 14122958
+ }
+ },
+ {
+ "input": {
+ "rate": "ndr",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_9000-fc_10k-rate_ndr-2.json",
+ "frame_sizes": [
+ "9000"
+ ],
+ "duration_sec": "10",
+ "flow_count": "10k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc18_loopback"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-04-25 01:37:47",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:07.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "EXT",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn1ter",
+ "name": "net_nfvbench_vn1ter",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1",
+ "name": "net_nfvbench_vn1",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": true,
+ "request_id": "debc5ad324ad481e9f7d2fcdbc47cb30",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "9000"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 10000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_9000-fc_10k-rate_ndr-1.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": true,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "9000"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2505,
+ 2505
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc18_loopback",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "flavor_nfvbench_dpdk",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_9000-fc_10k-rate_ndr-1.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "EXT": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "9000": {
+ "ndr": {
+ "load_percent_per_direction": 96.09375,
+ "timestamp_sec": 1650850810.5278695,
+ "stats": {
+ "total_tx_rate": 661743,
+ "overall": {
+ "rx_pkts": 6617433,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 566,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 6617433,
+ "avg_delay_usec": 490.9992497090639,
+ "min_delay_usec": 15,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 3308551,
+ "min_delay_usec": 15,
+ "drop_pct": 0,
+ "max_delay_usec": 566,
+ "tx_pkts": 3308882,
+ "avg_delay_usec": 506,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 3308882,
+ "min_delay_usec": 15,
+ "drop_pct": 0,
+ "max_delay_usec": 529,
+ "tx_pkts": 3308551,
+ "avg_delay_usec": 476,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 47751374880.0,
+ "theoretical_tx_rate_pps": 692904.6563192905
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 192.1875,
+ "duration_sec": 10.0,
+ "l2frame_size": "9000",
+ "rate_pps": 665838,
+ "rate_bps": 48046875000.0,
+ "time_taken_sec": 137.66692209243774
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 668814.8286232857,
+ "rx_pkts": 6651341,
+ "time_ms": 1650850685349,
+ "drop_pct": 239566,
+ "total_tx_pps": 689090,
+ "tx_pps": 692904,
+ "tx_pkts": 6890907,
+ "drop_percentage": 3.476552506077937
+ },
+ {
+ "rx_pps": 346452.0,
+ "rx_pkts": 3443214,
+ "time_ms": 1650850697851,
+ "drop_pct": 0,
+ "total_tx_pps": 344321,
+ "tx_pps": 346452,
+ "tx_pkts": 3443214,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 519678.0,
+ "rx_pkts": 5164821,
+ "time_ms": 1650850710355,
+ "drop_pct": 0,
+ "total_tx_pps": 516482,
+ "tx_pps": 519678,
+ "tx_pkts": 5164821,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 606290.0,
+ "rx_pkts": 6025614,
+ "time_ms": 1650850722872,
+ "drop_pct": 0,
+ "total_tx_pps": 602561,
+ "tx_pps": 606290,
+ "tx_pkts": 6025614,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 649598.0,
+ "rx_pkts": 6467074,
+ "time_ms": 1650850735425,
+ "drop_pct": 0,
+ "total_tx_pps": 646707,
+ "tx_pps": 649598,
+ "tx_pkts": 6467074,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 665952.2491003298,
+ "rx_pkts": 6619233,
+ "time_ms": 1650850747925,
+ "drop_pct": 52657,
+ "total_tx_pps": 667189,
+ "tx_pps": 671250,
+ "tx_pkts": 6671890,
+ "drop_percentage": 0.7892366330979678
+ },
+ {
+ "rx_pps": 660424.0,
+ "rx_pkts": 6563625,
+ "time_ms": 1650850760442,
+ "drop_pct": 0,
+ "total_tx_pps": 656362,
+ "tx_pps": 660424,
+ "tx_pkts": 6563625,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 665838.0,
+ "rx_pkts": 6617433,
+ "time_ms": 1650850772948,
+ "drop_pct": 0,
+ "total_tx_pps": 661743,
+ "tx_pps": 665838,
+ "tx_pkts": 6617433,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 665963.3876473027,
+ "rx_pkts": 6619344,
+ "time_ms": 1650850785467,
+ "drop_pct": 25650,
+ "total_tx_pps": 664499,
+ "tx_pps": 668544,
+ "tx_pkts": 6644994,
+ "drop_percentage": 0.38600486320980876
+ },
+ {
+ "rx_pps": 665953.6202723441,
+ "rx_pkts": 6619248,
+ "time_ms": 1650850797979,
+ "drop_pct": 12289,
+ "total_tx_pps": 663153,
+ "tx_pps": 667190,
+ "tx_pkts": 6631537,
+ "drop_percentage": 0.18531148962902566
+ },
+ {
+ "rx_pps": 665952.2454294527,
+ "rx_pkts": 6618569,
+ "time_ms": 1650850810527,
+ "drop_pct": 5583,
+ "total_tx_pps": 662415,
+ "tx_pps": 666514,
+ "tx_pkts": 6624152,
+ "ndr_pps": 332919,
+ "drop_percentage": 0.0842824862714503
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 10000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "debc5ad324ad481e9f7d2fcdbc47cb30"
+ },
+ "synthesis": {
+ "avg_delay_usec": 490.9992497090639,
+ "total_tx_rate": 661743
+ }
+ },
+ {
+ "input": {
+ "rate": "ndr",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_64-fc_100k-rate_ndr-2.json",
+ "frame_sizes": [
+ "64"
+ ],
+ "duration_sec": "10",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc18_loopback"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-04-25 01:43:17",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:07.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "EXT",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn1ter",
+ "name": "net_nfvbench_vn1ter",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1",
+ "name": "net_nfvbench_vn1",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": true,
+ "request_id": "014622aafb2c426ab9df378f15c06fef",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "64"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_64-fc_100k-rate_ndr-2.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": true,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "64"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2505,
+ 2505
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc18_loopback",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "flavor_nfvbench_dpdk",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_64-fc_100k-rate_ndr-2.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "EXT": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "warning": "WARNING: There is a significant difference between requested TX rate (74404760) and actual TX rate (16765582). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "64": {
+ "ndr": {
+ "load_percent_per_direction": 100.0,
+ "timestamp_sec": 1650851015.0206628,
+ "stats": {
+ "total_tx_rate": 16765582,
+ "overall": {
+ "rx_pkts": 167655827,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 104,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 167655827,
+ "avg_delay_usec": 24.993023892930367,
+ "min_delay_usec": 5,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 83944872,
+ "min_delay_usec": 6,
+ "drop_pct": 0,
+ "max_delay_usec": 103,
+ "tx_pkts": 83710955,
+ "avg_delay_usec": 20,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 83710955,
+ "min_delay_usec": 5,
+ "drop_pct": 0,
+ "max_delay_usec": 104,
+ "tx_pkts": 83944872,
+ "avg_delay_usec": 30,
+ "drop_percentage": 0.0
+ },
+ "warning": "WARNING: There is a significant difference between requested TX rate (74404760) and actual TX rate (16765582). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 11266471104.0,
+ "theoretical_tx_rate_pps": 74404761.90476191
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 200.0,
+ "duration_sec": 10.0,
+ "l2frame_size": "64",
+ "rate_pps": 74404760,
+ "rate_bps": 50000000000.0,
+ "time_taken_sec": 12.508348226547241
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 74404760.0,
+ "rx_pkts": 167655827,
+ "time_ms": 1650851015020,
+ "drop_pct": 0,
+ "total_tx_pps": 16765582,
+ "tx_pps": 74404760,
+ "tx_pkts": 167655827,
+ "ndr_pps": 37202380,
+ "warning": "WARNING: There is a significant difference between requested TX rate (74404760) and actual TX rate (16765582). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "drop_percentage": 0.0
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "014622aafb2c426ab9df378f15c06fef"
+ },
+ "synthesis": {
+ "avg_delay_usec": 24.993023892930367,
+ "total_tx_rate": 16765582
+ }
+ },
+ {
+ "input": {
+ "rate": "ndr",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_128-fc_100k-rate_ndr-2.json",
+ "frame_sizes": [
+ "128"
+ ],
+ "duration_sec": "10",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc18_loopback"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-04-25 01:44:17",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:07.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "EXT",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn1ter",
+ "name": "net_nfvbench_vn1ter",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1",
+ "name": "net_nfvbench_vn1",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": true,
+ "request_id": "a2341c441c5140a784a4749e86d5c19e",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "128"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_128-fc_100k-rate_ndr-2.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": true,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "128"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2505,
+ 2505
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc18_loopback",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "flavor_nfvbench_dpdk",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_128-fc_100k-rate_ndr-2.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "EXT": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "128": {
+ "ndr": {
+ "load_percent_per_direction": 100.0,
+ "timestamp_sec": 1650851075.266194,
+ "stats": {
+ "total_tx_rate": 18075556,
+ "overall": {
+ "rx_pkts": 180755561,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 61,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 180755561,
+ "avg_delay_usec": 20.503517144902666,
+ "min_delay_usec": 5,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 90468601,
+ "min_delay_usec": 6,
+ "drop_pct": 0,
+ "max_delay_usec": 61,
+ "tx_pkts": 90286960,
+ "avg_delay_usec": 24,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 90286960,
+ "min_delay_usec": 5,
+ "drop_pct": 0,
+ "max_delay_usec": 55,
+ "tx_pkts": 90468601,
+ "avg_delay_usec": 17,
+ "drop_percentage": 0.0
+ },
+ "warning": "WARNING: There is a significant difference between requested TX rate (42229728) and actual TX rate (18075556). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 21401458304.0,
+ "theoretical_tx_rate_pps": 42229729.72972973
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 200.0,
+ "duration_sec": 10.0,
+ "l2frame_size": "128",
+ "rate_pps": 42229728,
+ "rate_bps": 50000000000.0,
+ "time_taken_sec": 12.509921312332153
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 42229728.0,
+ "rx_pkts": 180755561,
+ "time_ms": 1650851075265,
+ "drop_pct": 0,
+ "total_tx_pps": 18075556,
+ "tx_pps": 42229728,
+ "tx_pkts": 180755561,
+ "ndr_pps": 21114864,
+ "warning": "WARNING: There is a significant difference between requested TX rate (42229728) and actual TX rate (18075556). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "drop_percentage": 0.0
+ }
+ ]
+ }
+ },
+ "warning": "WARNING: There is a significant difference between requested TX rate (42229728) and actual TX rate (18075556). The traffic generator may not have sufficient CPU to achieve the requested TX rate."
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "a2341c441c5140a784a4749e86d5c19e"
+ },
+ "synthesis": {
+ "avg_delay_usec": 20.503517144902666,
+ "total_tx_rate": 18075556
+ }
+ },
+ {
+ "input": {
+ "rate": "ndr",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_256-fc_100k-rate_ndr-2.json",
+ "frame_sizes": [
+ "256"
+ ],
+ "duration_sec": "10",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc18_loopback"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-04-25 01:45:17",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:07.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "EXT",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn1ter",
+ "name": "net_nfvbench_vn1ter",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1",
+ "name": "net_nfvbench_vn1",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": true,
+ "request_id": "81e85c0a6b464632850a5e5c7117f2b9",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "256"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_256-fc_100k-rate_ndr-2.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": true,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "256"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2505,
+ 2505
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc18_loopback",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "flavor_nfvbench_dpdk",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_256-fc_100k-rate_ndr-2.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "EXT": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "warning": "WARNING: There is a significant difference between requested TX rate (22644926) and actual TX rate (15904019). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "256": {
+ "ndr": {
+ "load_percent_per_direction": 100.0,
+ "timestamp_sec": 1650851135.4937232,
+ "stats": {
+ "total_tx_rate": 15904019,
+ "overall": {
+ "rx_pkts": 159040190,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 48,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 159040190,
+ "avg_delay_usec": 24.49913906667239,
+ "min_delay_usec": 6,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 79565736,
+ "min_delay_usec": 7,
+ "drop_pct": 0,
+ "max_delay_usec": 48,
+ "tx_pkts": 79474454,
+ "avg_delay_usec": 23,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 79474454,
+ "min_delay_usec": 6,
+ "drop_pct": 0,
+ "max_delay_usec": 44,
+ "tx_pkts": 79565736,
+ "avg_delay_usec": 26,
+ "drop_percentage": 0.0
+ },
+ "warning": "WARNING: There is a significant difference between requested TX rate (22644926) and actual TX rate (15904019). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 35116073952.0,
+ "theoretical_tx_rate_pps": 22644927.536231883
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 200.0,
+ "duration_sec": 10.0,
+ "l2frame_size": "256",
+ "rate_pps": 22644926,
+ "rate_bps": 50000000000.0,
+ "time_taken_sec": 12.490444898605347
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 22644926.0,
+ "rx_pkts": 159040190,
+ "time_ms": 1650851135493,
+ "drop_pct": 0,
+ "total_tx_pps": 15904019,
+ "tx_pps": 22644926,
+ "tx_pkts": 159040190,
+ "ndr_pps": 11322463,
+ "warning": "WARNING: There is a significant difference between requested TX rate (22644926) and actual TX rate (15904019). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "drop_percentage": 0.0
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "81e85c0a6b464632850a5e5c7117f2b9"
+ },
+ "synthesis": {
+ "avg_delay_usec": 24.49913906667239,
+ "total_tx_rate": 15904019
+ }
+ },
+ {
+ "input": {
+ "rate": "ndr",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_512-fc_100k-rate_ndr-2.json",
+ "frame_sizes": [
+ "512"
+ ],
+ "duration_sec": "10",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc18_loopback"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-04-25 01:45:37",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:07.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "EXT",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn1ter",
+ "name": "net_nfvbench_vn1ter",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1",
+ "name": "net_nfvbench_vn1",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": true,
+ "request_id": "d11915d33a9248cdbc7f6b1fe526c0bc",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "512"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_512-fc_100k-rate_ndr-0.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": true,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "512"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2505,
+ 2505
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc18_loopback",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "flavor_nfvbench_dpdk",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_512-fc_100k-rate_ndr-0.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "EXT": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "512": {
+ "ndr": {
+ "load_percent_per_direction": 100.0,
+ "timestamp_sec": 1650851155.6128447,
+ "stats": {
+ "total_tx_rate": 11083895,
+ "overall": {
+ "rx_pkts": 110838959,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 751,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 110838959,
+ "avg_delay_usec": 244.54752861762262,
+ "min_delay_usec": 22,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 55446495,
+ "min_delay_usec": 24,
+ "drop_pct": 0,
+ "max_delay_usec": 751,
+ "tx_pkts": 55392464,
+ "avg_delay_usec": 342,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 55392464,
+ "min_delay_usec": 22,
+ "drop_pct": 0,
+ "max_delay_usec": 604,
+ "tx_pkts": 55446495,
+ "avg_delay_usec": 147,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 47173057120.0,
+ "theoretical_tx_rate_pps": 11748120.30075188
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 200.0,
+ "duration_sec": 10.0,
+ "l2frame_size": "512",
+ "rate_pps": 11748120,
+ "rate_bps": 50000000000.0,
+ "time_taken_sec": 12.493241786956787
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 11748120.0,
+ "rx_pkts": 110838959,
+ "time_ms": 1650851155612,
+ "drop_pct": 0,
+ "total_tx_pps": 11083895,
+ "tx_pps": 11748120,
+ "tx_pkts": 110838959,
+ "ndr_pps": 5874060,
+ "drop_percentage": 0.0
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "d11915d33a9248cdbc7f6b1fe526c0bc"
+ },
+ "synthesis": {
+ "avg_delay_usec": 244.54752861762262,
+ "total_tx_rate": 11083895
+ }
+ },
+ {
+ "input": {
+ "rate": "ndr",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_768-fc_100k-rate_ndr-2.json",
+ "frame_sizes": [
+ "768"
+ ],
+ "duration_sec": "10",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc18_loopback"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-04-25 01:50:46",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:07.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "EXT",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn1ter",
+ "name": "net_nfvbench_vn1ter",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1",
+ "name": "net_nfvbench_vn1",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": true,
+ "request_id": "3dfdb6dff0ef4590ae98f24d2b98b4a7",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "768"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_768-fc_100k-rate_ndr-0.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": true,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "768"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2505,
+ 2505
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc18_loopback",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "flavor_nfvbench_dpdk",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_768-fc_100k-rate_ndr-0.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "EXT": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "768": {
+ "ndr": {
+ "load_percent_per_direction": 95.60546875,
+ "timestamp_sec": 1650851589.8598213,
+ "stats": {
+ "total_tx_rate": 7536285,
+ "overall": {
+ "rx_pkts": 75362853,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 85,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 75362853,
+ "avg_delay_usec": 48.99969802098654,
+ "min_delay_usec": 11,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 37679530,
+ "min_delay_usec": 11,
+ "drop_pct": 0,
+ "max_delay_usec": 85,
+ "tx_pkts": 37683323,
+ "avg_delay_usec": 55,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 37683323,
+ "min_delay_usec": 13,
+ "drop_pct": 0,
+ "max_delay_usec": 81,
+ "tx_pkts": 37679530,
+ "avg_delay_usec": 43,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 47508740640.0,
+ "theoretical_tx_rate_pps": 7931472.081218274
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 191.2109375,
+ "duration_sec": 10.0,
+ "l2frame_size": "768",
+ "rate_pps": 7582920,
+ "rate_bps": 47802734374.0,
+ "time_taken_sec": 137.68758368492126
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 7867019.991496668,
+ "rx_pkts": 75782125,
+ "time_ms": 1650851464683,
+ "drop_pct": 620859,
+ "total_tx_pps": 7640298,
+ "tx_pps": 7931472,
+ "tx_pkts": 76402984,
+ "drop_percentage": 0.8126109315311559
+ },
+ {
+ "rx_pps": 3965736.0,
+ "rx_pkts": 39413476,
+ "time_ms": 1650851477177,
+ "drop_pct": 0,
+ "total_tx_pps": 3941347,
+ "tx_pps": 3965736,
+ "tx_pkts": 39413476,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 5948604.0,
+ "rx_pkts": 59120203,
+ "time_ms": 1650851489700,
+ "drop_pct": 0,
+ "total_tx_pps": 5912020,
+ "tx_pps": 5948604,
+ "tx_pkts": 59120203,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 6940038.0,
+ "rx_pkts": 68973557,
+ "time_ms": 1650851502199,
+ "drop_pct": 0,
+ "total_tx_pps": 6897355,
+ "tx_pps": 6940038,
+ "tx_pkts": 68973557,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 7435754.0,
+ "rx_pkts": 73900239,
+ "time_ms": 1650851514716,
+ "drop_pct": 0,
+ "total_tx_pps": 7390023,
+ "tx_pps": 7435754,
+ "tx_pkts": 73900239,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 7620954.625306049,
+ "rx_pkts": 75507656,
+ "time_ms": 1650851527233,
+ "drop_pct": 620803,
+ "total_tx_pps": 7612845,
+ "tx_pps": 7683612,
+ "tx_pkts": 76128459,
+ "drop_percentage": 0.8154677083375614
+ },
+ {
+ "rx_pps": 7559684.0,
+ "rx_pkts": 75131929,
+ "time_ms": 1650851539732,
+ "drop_pct": 0,
+ "total_tx_pps": 7513192,
+ "tx_pps": 7559684,
+ "tx_pkts": 75131929,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 7596741.430266551,
+ "rx_pkts": 75500232,
+ "time_ms": 1650851552229,
+ "drop_pct": 247534,
+ "total_tx_pps": 7574776,
+ "tx_pps": 7621648,
+ "tx_pkts": 75747766,
+ "drop_percentage": 0.3267871952817724
+ },
+ {
+ "rx_pps": 7590337.479512263,
+ "rx_pkts": 75436549,
+ "time_ms": 1650851564806,
+ "drop_pct": 3265,
+ "total_tx_pps": 7543981,
+ "tx_pps": 7590666,
+ "tx_pkts": 75439814,
+ "drop_percentage": 0.004327953406671973
+ },
+ {
+ "rx_pps": 7575174.0,
+ "rx_pkts": 75285893,
+ "time_ms": 1650851577332,
+ "drop_pct": 0,
+ "total_tx_pps": 7528589,
+ "tx_pps": 7575174,
+ "tx_pkts": 75285893,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 7582920.0,
+ "rx_pkts": 75362853,
+ "time_ms": 1650851589858,
+ "drop_pct": 0,
+ "total_tx_pps": 7536285,
+ "tx_pps": 7582920,
+ "tx_pkts": 75362853,
+ "ndr_pps": 3791460,
+ "drop_percentage": 0.0
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "3dfdb6dff0ef4590ae98f24d2b98b4a7"
+ },
+ "synthesis": {
+ "avg_delay_usec": 48.99969802098654,
+ "total_tx_rate": 7536285
+ }
+ },
+ {
+ "input": {
+ "rate": "ndr",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1024-fc_100k-rate_ndr-2.json",
+ "frame_sizes": [
+ "1024"
+ ],
+ "duration_sec": "10",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc18_loopback"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-04-25 02:02:49",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:07.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "EXT",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn1ter",
+ "name": "net_nfvbench_vn1ter",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1",
+ "name": "net_nfvbench_vn1",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": true,
+ "request_id": "df31248f2daf41788e5aeb35599600ec",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "1024"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1024-fc_100k-rate_ndr-2.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": true,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "1024"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2505,
+ 2505
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc18_loopback",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "flavor_nfvbench_dpdk",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1024-fc_100k-rate_ndr-2.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "EXT": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "1024": {
+ "ndr": {
+ "load_percent_per_direction": 95.8984375,
+ "timestamp_sec": 1650852312.436391,
+ "stats": {
+ "total_tx_rate": 5706025,
+ "overall": {
+ "rx_pkts": 57060256,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 100,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 57060256,
+ "avg_delay_usec": 49.50055346754841,
+ "min_delay_usec": 9,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 28527257,
+ "min_delay_usec": 9,
+ "drop_pct": 0,
+ "max_delay_usec": 96,
+ "tx_pkts": 28532999,
+ "avg_delay_usec": 44,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 28532999,
+ "min_delay_usec": 10,
+ "drop_pct": 0,
+ "max_delay_usec": 100,
+ "tx_pkts": 28527257,
+ "avg_delay_usec": 55,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 47656720800.0,
+ "theoretical_tx_rate_pps": 5986590.038314176
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 191.796875,
+ "duration_sec": 10.0,
+ "l2frame_size": "1024",
+ "rate_pps": 5741046,
+ "rate_bps": 47949218750.0,
+ "time_taken_sec": 137.73684573173523
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 5905630.69286569,
+ "rx_pkts": 57462293,
+ "time_ms": 1650852187211,
+ "drop_pct": 787741,
+ "total_tx_pps": 5825003,
+ "tx_pps": 5986590,
+ "tx_pkts": 58250034,
+ "drop_percentage": 1.3523442750265176
+ },
+ {
+ "rx_pps": 2993294.0,
+ "rx_pkts": 29748852,
+ "time_ms": 1650852199712,
+ "drop_pct": 0,
+ "total_tx_pps": 2974885,
+ "tx_pps": 2993294,
+ "tx_pkts": 29748852,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 4489942.0,
+ "rx_pkts": 44623288,
+ "time_ms": 1650852212213,
+ "drop_pct": 0,
+ "total_tx_pps": 4462328,
+ "tx_pps": 4489942,
+ "tx_pkts": 44623288,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 5238266.0,
+ "rx_pkts": 52060508,
+ "time_ms": 1650852224756,
+ "drop_pct": 0,
+ "total_tx_pps": 5206050,
+ "tx_pps": 5238266,
+ "tx_pkts": 52060508,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 5612428.0,
+ "rx_pkts": 55779125,
+ "time_ms": 1650852237260,
+ "drop_pct": 0,
+ "total_tx_pps": 5577912,
+ "tx_pps": 5612428,
+ "tx_pkts": 55779125,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 5751065.368412055,
+ "rx_pkts": 57156952,
+ "time_ms": 1650852249774,
+ "drop_pct": 481447,
+ "total_tx_pps": 5763839,
+ "tx_pps": 5799508,
+ "tx_pkts": 57638399,
+ "drop_percentage": 0.8352886415183045
+ },
+ {
+ "rx_pps": 5705968.0,
+ "rx_pkts": 56868528,
+ "time_ms": 1650852262305,
+ "drop_pct": 0,
+ "total_tx_pps": 5686852,
+ "tx_pps": 5705968,
+ "tx_pkts": 56868528,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 5750731.258995378,
+ "rx_pkts": 57159387,
+ "time_ms": 1650852274851,
+ "drop_pct": 19946,
+ "total_tx_pps": 5717933,
+ "tx_pps": 5752738,
+ "tx_pkts": 57179333,
+ "drop_percentage": 0.034883233073040566
+ },
+ {
+ "rx_pps": 5729352.0,
+ "rx_pkts": 56941156,
+ "time_ms": 1650852287414,
+ "drop_pct": 0,
+ "total_tx_pps": 5694115,
+ "tx_pps": 5729352,
+ "tx_pkts": 56941156,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 5741046.0,
+ "rx_pkts": 57060256,
+ "time_ms": 1650852299929,
+ "drop_pct": 0,
+ "total_tx_pps": 5706025,
+ "tx_pps": 5741046,
+ "tx_pkts": 57060256,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 5745777.043226499,
+ "rx_pkts": 57104416,
+ "time_ms": 1650852312435,
+ "drop_pct": 11081,
+ "total_tx_pps": 5711549,
+ "tx_pps": 5746892,
+ "tx_pkts": 57115497,
+ "ndr_pps": 2870523,
+ "drop_percentage": 0.019401039266103207
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "df31248f2daf41788e5aeb35599600ec"
+ },
+ "synthesis": {
+ "avg_delay_usec": 49.50055346754841,
+ "total_tx_rate": 5706025
+ }
+ },
+ {
+ "input": {
+ "rate": "ndr",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1280-fc_100k-rate_ndr-2.json",
+ "frame_sizes": [
+ "1280"
+ ],
+ "duration_sec": "10",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc18_loopback"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-04-25 02:05:13",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:07.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "EXT",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn1ter",
+ "name": "net_nfvbench_vn1ter",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1",
+ "name": "net_nfvbench_vn1",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": true,
+ "request_id": "3483e5ac90f647c18792824df335576f",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "1280"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1280-fc_100k-rate_ndr-0.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": true,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "1280"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2505,
+ 2505
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc18_loopback",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "flavor_nfvbench_dpdk",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1280-fc_100k-rate_ndr-0.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "EXT": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "1280": {
+ "ndr": {
+ "load_percent_per_direction": 96.09375,
+ "timestamp_sec": 1650852456.8429823,
+ "stats": {
+ "total_tx_rate": 4591477,
+ "overall": {
+ "rx_pkts": 45914773,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 115,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 45914773,
+ "avg_delay_usec": 72.0000503323843,
+ "min_delay_usec": 8,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 22956231,
+ "min_delay_usec": 8,
+ "drop_pct": 0,
+ "max_delay_usec": 113,
+ "tx_pkts": 22958542,
+ "avg_delay_usec": 71,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 22958542,
+ "min_delay_usec": 8,
+ "drop_pct": 0,
+ "max_delay_usec": 115,
+ "tx_pkts": 22956231,
+ "avg_delay_usec": 73,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 47751360800.0,
+ "theoretical_tx_rate_pps": 4807692.307692308
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 192.1875,
+ "duration_sec": 10.0,
+ "l2frame_size": "1280",
+ "rate_pps": 4619890,
+ "rate_bps": 48046875000.0,
+ "time_taken_sec": 137.65410780906677
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 4726559.564871196,
+ "rx_pkts": 46152394,
+ "time_ms": 1650852331691,
+ "drop_pct": 792216,
+ "total_tx_pps": 4694461,
+ "tx_pps": 4807692,
+ "tx_pkts": 46944610,
+ "drop_percentage": 1.6875547586826263
+ },
+ {
+ "rx_pps": 2403846.0,
+ "rx_pkts": 23888223,
+ "time_ms": 1650852344191,
+ "drop_pct": 0,
+ "total_tx_pps": 2388822,
+ "tx_pps": 2403846,
+ "tx_pkts": 23888223,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 3605768.0,
+ "rx_pkts": 35835922,
+ "time_ms": 1650852356692,
+ "drop_pct": 0,
+ "total_tx_pps": 3583592,
+ "tx_pps": 3605768,
+ "tx_pkts": 35835922,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 4206730.0,
+ "rx_pkts": 41808587,
+ "time_ms": 1650852369206,
+ "drop_pct": 0,
+ "total_tx_pps": 4180858,
+ "tx_pps": 4206730,
+ "tx_pkts": 41808587,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 4507210.0,
+ "rx_pkts": 44794900,
+ "time_ms": 1650852381776,
+ "drop_pct": 0,
+ "total_tx_pps": 4479490,
+ "tx_pps": 4507210,
+ "tx_pkts": 44794900,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 4626532.86170713,
+ "rx_pkts": 45980800,
+ "time_ms": 1650852394280,
+ "drop_pct": 307270,
+ "total_tx_pps": 4628807,
+ "tx_pps": 4657450,
+ "tx_pkts": 46288070,
+ "drop_percentage": 0.6638211530530437
+ },
+ {
+ "rx_pps": 4582330.0,
+ "rx_pkts": 45541498,
+ "time_ms": 1650852406785,
+ "drop_pct": 0,
+ "total_tx_pps": 4554149,
+ "tx_pps": 4582330,
+ "tx_pkts": 45541498,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 4619890.0,
+ "rx_pkts": 45914773,
+ "time_ms": 1650852419279,
+ "drop_pct": 0,
+ "total_tx_pps": 4591477,
+ "tx_pps": 4619890,
+ "tx_pkts": 45914773,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 4626430.527562457,
+ "rx_pkts": 45979781,
+ "time_ms": 1650852431782,
+ "drop_pct": 121642,
+ "total_tx_pps": 4610142,
+ "tx_pps": 4638670,
+ "tx_pkts": 46101423,
+ "drop_percentage": 0.26385736509695157
+ },
+ {
+ "rx_pps": 4626442.952323484,
+ "rx_pkts": 45979906,
+ "time_ms": 1650852444306,
+ "drop_pct": 28196,
+ "total_tx_pps": 4600810,
+ "tx_pps": 4629280,
+ "tx_pkts": 46008102,
+ "drop_percentage": 0.06128485804521995
+ },
+ {
+ "rx_pps": 4624386.291771492,
+ "rx_pkts": 45964089,
+ "time_ms": 1650852456842,
+ "drop_pct": 1985,
+ "total_tx_pps": 4596607,
+ "tx_pps": 4624586,
+ "tx_pkts": 45966074,
+ "ndr_pps": 2309945,
+ "drop_percentage": 0.004318402306883986
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "3483e5ac90f647c18792824df335576f"
+ },
+ "synthesis": {
+ "avg_delay_usec": 72.0000503323843,
+ "total_tx_rate": 4591477
+ }
+ },
+ {
+ "input": {
+ "rate": "ndr",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1518-fc_100k-rate_ndr-2.json",
+ "frame_sizes": [
+ "1518"
+ ],
+ "duration_sec": "10",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc18_loopback"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-04-25 02:17:16",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:07.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "EXT",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn1ter",
+ "name": "net_nfvbench_vn1ter",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1",
+ "name": "net_nfvbench_vn1",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": true,
+ "request_id": "e5fdb1f38f334e048d5a301c6045cc2d",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "1518"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1518-fc_100k-rate_ndr-2.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": true,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "1518"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2505,
+ 2505
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc18_loopback",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "flavor_nfvbench_dpdk",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1518-fc_100k-rate_ndr-2.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "EXT": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "1518": {
+ "ndr": {
+ "load_percent_per_direction": 95.99609375,
+ "timestamp_sec": 1650853179.382297,
+ "stats": {
+ "total_tx_rate": 3877019,
+ "overall": {
+ "rx_pkts": 38769903,
+ "drop_percentage": 0.0007557351528478215,
+ "drop_pct": 293,
+ "max_delay_usec": 150,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 38770196,
+ "avg_delay_usec": 94.9999144181506,
+ "min_delay_usec": 7,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 19384122,
+ "min_delay_usec": 7,
+ "drop_pct": 0,
+ "max_delay_usec": 150,
+ "tx_pkts": 19386074,
+ "avg_delay_usec": 97,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 19385781,
+ "min_delay_usec": 11,
+ "drop_pct": 293,
+ "max_delay_usec": 136,
+ "tx_pkts": 19384122,
+ "avg_delay_usec": 93,
+ "drop_percentage": 0.0015115464089629645
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 47702841776.0,
+ "theoretical_tx_rate_pps": 4063719.1157347206
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 191.9921875,
+ "duration_sec": 10.0,
+ "l2frame_size": "1518",
+ "rate_pps": 3901010,
+ "rate_bps": 47998046874.0,
+ "time_taken_sec": 137.64107275009155
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 3982055.7006684523,
+ "rx_pkts": 38963118,
+ "time_ms": 1650853054249,
+ "drop_pct": 799039,
+ "total_tx_pps": 3976215,
+ "tx_pps": 4063718,
+ "tx_pkts": 39762157,
+ "drop_percentage": 2.009546413691792
+ },
+ {
+ "rx_pps": 2031858.0,
+ "rx_pkts": 20191592,
+ "time_ms": 1650853066752,
+ "drop_pct": 0,
+ "total_tx_pps": 2019159,
+ "tx_pps": 2031858,
+ "tx_pkts": 20191592,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 3047788.0,
+ "rx_pkts": 30290447,
+ "time_ms": 1650853079251,
+ "drop_pct": 0,
+ "total_tx_pps": 3029044,
+ "tx_pps": 3047788,
+ "tx_pkts": 30290447,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 3555754.0,
+ "rx_pkts": 35338864,
+ "time_ms": 1650853091784,
+ "drop_pct": 0,
+ "total_tx_pps": 3533886,
+ "tx_pps": 3555754,
+ "tx_pkts": 35338864,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 3809736.0,
+ "rx_pkts": 37863067,
+ "time_ms": 1650853104288,
+ "drop_pct": 0,
+ "total_tx_pps": 3786306,
+ "tx_pps": 3809736,
+ "tx_pkts": 37863067,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 3905544.608185896,
+ "rx_pkts": 38817602,
+ "time_ms": 1650853116791,
+ "drop_pct": 309915,
+ "total_tx_pps": 3912751,
+ "tx_pps": 3936726,
+ "tx_pkts": 39127517,
+ "drop_percentage": 0.7920640606967214
+ },
+ {
+ "rx_pps": 3873232.0,
+ "rx_pkts": 38563838,
+ "time_ms": 1650853129321,
+ "drop_pct": 0,
+ "total_tx_pps": 3856383,
+ "tx_pps": 3873232,
+ "tx_pkts": 38563838,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 3904454.7698652036,
+ "rx_pkts": 38804426,
+ "time_ms": 1650853141834,
+ "drop_pct": 5220,
+ "total_tx_pps": 3880964,
+ "tx_pps": 3904980,
+ "tx_pkts": 38809646,
+ "drop_percentage": 0.013450264400762635
+ },
+ {
+ "rx_pps": 3889106.0,
+ "rx_pkts": 38651888,
+ "time_ms": 1650853154337,
+ "drop_pct": 0,
+ "total_tx_pps": 3865188,
+ "tx_pps": 3889106,
+ "tx_pkts": 38651888,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 3897042.0,
+ "rx_pkts": 38732706,
+ "time_ms": 1650853166869,
+ "drop_pct": 0,
+ "total_tx_pps": 3873270,
+ "tx_pps": 3897042,
+ "tx_pkts": 38732706,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 3900980.518696114,
+ "rx_pkts": 38769903,
+ "time_ms": 1650853179381,
+ "drop_pct": 293,
+ "total_tx_pps": 3877019,
+ "tx_pps": 3901010,
+ "tx_pkts": 38770196,
+ "ndr_pps": 1950505,
+ "drop_percentage": 0.0007557351528478215
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "e5fdb1f38f334e048d5a301c6045cc2d"
+ },
+ "synthesis": {
+ "avg_delay_usec": 94.9999144181506,
+ "total_tx_rate": 3877019
+ }
+ },
+ {
+ "input": {
+ "rate": "ndr",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_IMIX-fc_100k-rate_ndr-2.json",
+ "frame_sizes": [
+ "IMIX"
+ ],
+ "duration_sec": "10",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc18_loopback"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-04-25 02:20:20",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:07.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "EXT",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn1ter",
+ "name": "net_nfvbench_vn1ter",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1",
+ "name": "net_nfvbench_vn1",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": true,
+ "request_id": "4b1b0ab83b55448bb34da88ed0446e02",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "IMIX"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_IMIX-fc_100k-rate_ndr-2.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": true,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "IMIX"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2505,
+ 2505
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc18_loopback",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "flavor_nfvbench_dpdk",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_IMIX-fc_100k-rate_ndr-2.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "EXT": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "warning": "WARNING: There is a significant difference between requested TX rate (16368398) and actual TX rate (14094667). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "IMIX": {
+ "ndr": {
+ "load_percent_per_direction": 100.0,
+ "timestamp_sec": 1650853238.9316306,
+ "stats": {
+ "total_tx_rate": 14094667,
+ "overall": {
+ "rx_pkts": 140946676,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 629,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 140946676,
+ "avg_delay_usec": 330.48077658816163,
+ "min_delay_usec": 13,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 70508526,
+ "min_delay_usec": 14,
+ "drop_pct": 0,
+ "max_delay_usec": 629,
+ "tx_pkts": 70438150,
+ "avg_delay_usec": 292,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 70438150,
+ "min_delay_usec": 13,
+ "drop_pct": 0,
+ "max_delay_usec": 558,
+ "tx_pkts": 70508526,
+ "avg_delay_usec": 369,
+ "drop_percentage": 0.0
+ },
+ "warning": "WARNING: There is a significant difference between requested TX rate (16368398) and actual TX rate (14094667). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 43054509462.666664,
+ "theoretical_tx_rate_pps": 16368398.079441292
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 200.0,
+ "duration_sec": 10.0,
+ "l2frame_size": "IMIX",
+ "rate_pps": 16368398,
+ "rate_bps": 50000000000.0,
+ "time_taken_sec": 12.508249044418335
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 16368398.0,
+ "rx_pkts": 140946676,
+ "time_ms": 1650853238931,
+ "drop_pct": 0,
+ "total_tx_pps": 14094667,
+ "tx_pps": 16368398,
+ "tx_pkts": 140946676,
+ "ndr_pps": 8184199,
+ "warning": "WARNING: There is a significant difference between requested TX rate (16368398) and actual TX rate (14094667). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "drop_percentage": 0.0
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "4b1b0ab83b55448bb34da88ed0446e02"
+ },
+ "synthesis": {
+ "avg_delay_usec": 330.48077658816163,
+ "total_tx_rate": 14094667
+ }
+ },
+ {
+ "input": {
+ "rate": "ndr",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_9000-fc_100k-rate_ndr-2.json",
+ "frame_sizes": [
+ "9000"
+ ],
+ "duration_sec": "10",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc18_loopback"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-04-25 02:25:30",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:07.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "EXT",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn1ter",
+ "name": "net_nfvbench_vn1ter",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1",
+ "name": "net_nfvbench_vn1",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": true,
+ "request_id": "37942b1f63cd4ab8a26e5fc2f6ace237",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "9000"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_9000-fc_100k-rate_ndr-2.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": true,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "9000"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2505,
+ 2505
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc18_loopback",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "flavor_nfvbench_dpdk",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_9000-fc_100k-rate_ndr-2.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "EXT": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "9000": {
+ "ndr": {
+ "load_percent_per_direction": 95.99609375,
+ "timestamp_sec": 1650853673.125213,
+ "stats": {
+ "total_tx_rate": 661136,
+ "overall": {
+ "rx_pkts": 6611360,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 538,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 6611360,
+ "avg_delay_usec": 477.99959584714793,
+ "min_delay_usec": 15,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 3305513,
+ "min_delay_usec": 15,
+ "drop_pct": 0,
+ "max_delay_usec": 538,
+ "tx_pkts": 3305847,
+ "avg_delay_usec": 486,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 3305847,
+ "min_delay_usec": 15,
+ "drop_pct": 0,
+ "max_delay_usec": 524,
+ "tx_pkts": 3305513,
+ "avg_delay_usec": 470,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 47707573760.0,
+ "theoretical_tx_rate_pps": 692904.6563192905
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 191.9921875,
+ "duration_sec": 10.0,
+ "l2frame_size": "9000",
+ "rate_pps": 665160,
+ "rate_bps": 47998046874.0,
+ "time_taken_sec": 137.65885472297668
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 668428.2262058704,
+ "rx_pkts": 6638764,
+ "time_ms": 1650853547957,
+ "drop_pct": 243091,
+ "total_tx_pps": 688185,
+ "tx_pps": 692904,
+ "tx_pkts": 6881855,
+ "drop_percentage": 3.532347019807886
+ },
+ {
+ "rx_pps": 346452.0,
+ "rx_pkts": 3443493,
+ "time_ms": 1650853560502,
+ "drop_pct": 0,
+ "total_tx_pps": 344349,
+ "tx_pps": 346452,
+ "tx_pkts": 3443493,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 519678.0,
+ "rx_pkts": 5165340,
+ "time_ms": 1650853573032,
+ "drop_pct": 0,
+ "total_tx_pps": 516534,
+ "tx_pps": 519678,
+ "tx_pkts": 5165340,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 606290.0,
+ "rx_pkts": 6025616,
+ "time_ms": 1650853585552,
+ "drop_pct": 0,
+ "total_tx_pps": 602561,
+ "tx_pps": 606290,
+ "tx_pkts": 6025616,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 649598.0,
+ "rx_pkts": 6456032,
+ "time_ms": 1650853598052,
+ "drop_pct": 0,
+ "total_tx_pps": 645603,
+ "tx_pps": 649598,
+ "tx_pkts": 6456032,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 665605.0071570089,
+ "rx_pkts": 6618445,
+ "time_ms": 1650853610556,
+ "drop_pct": 56131,
+ "total_tx_pps": 667457,
+ "tx_pps": 671250,
+ "tx_pkts": 6674576,
+ "drop_percentage": 0.8409672764232514
+ },
+ {
+ "rx_pps": 660424.0,
+ "rx_pkts": 6563625,
+ "time_ms": 1650853623059,
+ "drop_pct": 0,
+ "total_tx_pps": 656362,
+ "tx_pps": 660424,
+ "tx_pkts": 6563625,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 665581.9509880405,
+ "rx_pkts": 6615554,
+ "time_ms": 1650853635567,
+ "drop_pct": 2545,
+ "total_tx_pps": 661809,
+ "tx_pps": 665838,
+ "tx_pkts": 6618099,
+ "drop_percentage": 0.03845515154729477
+ },
+ {
+ "rx_pps": 663130.0,
+ "rx_pkts": 6590519,
+ "time_ms": 1650853648084,
+ "drop_pct": 0,
+ "total_tx_pps": 659051,
+ "tx_pps": 663130,
+ "tx_pkts": 6590519,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 664484.0,
+ "rx_pkts": 6604641,
+ "time_ms": 1650853660605,
+ "drop_pct": 0,
+ "total_tx_pps": 660464,
+ "tx_pps": 664484,
+ "tx_pkts": 6604641,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 665160.0,
+ "rx_pkts": 6611360,
+ "time_ms": 1650853673124,
+ "drop_pct": 0,
+ "total_tx_pps": 661136,
+ "tx_pps": 665160,
+ "tx_pkts": 6611360,
+ "ndr_pps": 332580,
+ "drop_percentage": 0.0
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "37942b1f63cd4ab8a26e5fc2f6ace237"
+ },
+ "synthesis": {
+ "avg_delay_usec": 477.99959584714793,
+ "total_tx_rate": 661136
+ }
+ }
+ ]
+ },
+ "fail_tests": 0,
+ "total_tests": 1,
+ "pass_tests": 1
+ }
+ },
+ {
+ "project_name": "nfvbench",
+ "scenario": "basic",
+ "stop_date": "2022-03-29 04:00:23",
+ "case_name": "characterization",
+ "build_tag": "I2DSIKVWY5C8",
+ "version": "unknown",
+ "pod_name": "AMICAL",
+ "criteria": "PASS",
+ "installer": "unknown",
+ "_id": "62428459c0d88e001ca15662",
+ "start_date": "2022-03-29 00:16:03",
+ "details": {
+ "tests": [
+ {
+ "status": "passed",
+ "elements": [
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.1 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.0001163482666015625,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "64 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "64"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 0.00010013580322265625,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.560585021972656e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.655952453613281e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 5.030165672302246,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 441.4675030708313,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00012564659118652344,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0002872943878173828,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:17",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.2 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.942054748535156e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 0.00011372566223144531,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.465217590332031e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.202957153320312e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.00823521614074707,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 433.396630525589,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.000118255615234375,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0002837181091308594,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:18",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.3 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.894371032714844e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "256 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "256"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.584426879882812e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.226799011230469e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 0.00010609626770019531,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007856607437133789,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 433.39697003364563,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.000118255615234375,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00032806396484375,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:19",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.4 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010061264038085938,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "512 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "512"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.560585021972656e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.417533874511719e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.489059448242188e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007916927337646484,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 433.39968848228455,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.0001201629638671875,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0003211498260498047,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:20",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.5 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010061264038085938,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "768 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "768"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.250640869140625e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.250640869140625e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.417533874511719e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007905721664428711,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 433.40395522117615,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00011658668518066406,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00028514862060546875,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:21",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.6 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.942054748535156e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "1024 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "1024"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.441375732421875e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 0.00011348724365234375,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.107589721679688e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007941484451293945,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 433.4135231971741,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00011992454528808594,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0003170967102050781,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:22",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.7 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.775161743164062e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "1280 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "1280"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.465217590332031e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.274482727050781e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.5367431640625e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007906198501586914,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 433.40963220596313,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.0001239776611328125,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00029730796813964844,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:23",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.8 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.0001232624053955078,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "1518 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "1518"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.72747802734375e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.298324584960938e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 8.988380432128906e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007907390594482422,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 433.4113304615021,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00012087821960449219,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00028133392333984375,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:24",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.9 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.822845458984375e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "IMIX frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "IMIX"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 0.00011849403381347656,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.298324584960938e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.179115295410156e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.008216381072998047,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 433.4068977832794,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00012040138244628906,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00032019615173339844,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:25",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.10 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.0001010894775390625,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "9000 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "9000"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.465217590332031e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.226799011230469e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.5367431640625e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007925271987915039,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 433.404554605484,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00011920928955078125,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0003101825714111328,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:26",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.11 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.965896606445312e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "64 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "64"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.560585021972656e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "10k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "10k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.5367431640625e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.965896606445312e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007976293563842773,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.5729796886444,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00011754035949707031,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00028586387634277344,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:27",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.12 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.584426879882812e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.441375732421875e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "10k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "10k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.5367431640625e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.202957153320312e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.008101701736450195,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.4532768726349,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00011944770812988281,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00033020973205566406,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:28",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.13 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.775161743164062e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "256 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "256"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.393692016601562e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "10k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "10k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.393692016601562e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.274482727050781e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007899761199951172,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.41574001312256,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00011801719665527344,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0003037452697753906,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:29",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.14 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.775161743164062e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "512 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "512"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.417533874511719e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "10k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "10k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.226799011230469e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.34600830078125e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.008031368255615234,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.4325096607208,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00011944770812988281,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00031256675720214844,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:30",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.15 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.870529174804688e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "768 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "768"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.560585021972656e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "10k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "10k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.322166442871094e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.512901306152344e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007970094680786133,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.82969641685486,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00012087821960449219,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00031185150146484375,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:31",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.16 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.775161743164062e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "1024 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "1024"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.655952453613281e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "10k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "10k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 0.00011396408081054688,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.274482727050781e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.008100748062133789,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.4229202270508,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.0001201629638671875,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0002961158752441406,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:32",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.17 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.655952453613281e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "1280 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "1280"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.560585021972656e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "10k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "10k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.369850158691406e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.393692016601562e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.008043766021728516,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.42792868614197,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00011777877807617188,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0003020763397216797,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:33",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.18 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.942054748535156e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "1518 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "1518"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.34600830078125e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "10k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "10k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.202957153320312e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 0.0001125335693359375,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.00787210464477539,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 443.48774886131287,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00011992454528808594,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0003151893615722656,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:34",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.19 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.894371032714844e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "IMIX frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "IMIX"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.489059448242188e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "10k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "10k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.417533874511719e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.441375732421875e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.008165359497070312,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.4371497631073,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00012183189392089844,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0002982616424560547,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:35",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.20 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00011897087097167969,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "9000 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "9000"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.679794311523438e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "10k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "10k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.441375732421875e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.34600830078125e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007880926132202148,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.4218900203705,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00012063980102539062,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00030922889709472656,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:36",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.21 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.846687316894531e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "64 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "64"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.584426879882812e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.322166442871094e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.274482727050781e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.008101463317871094,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.5446517467499,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00011968612670898438,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0002968311309814453,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:37",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.22 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.846687316894531e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.489059448242188e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 0.00011539459228515625,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.226799011230469e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007904767990112305,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 443.58557987213135,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.000118255615234375,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00030350685119628906,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:38",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.23 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.799003601074219e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "256 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "256"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.417533874511719e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.274482727050781e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.512901306152344e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.008047819137573242,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.51229333877563,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00011873245239257812,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0002970695495605469,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:39",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.24 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.965896606445312e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "512 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "512"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.584426879882812e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.465217590332031e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 0.00011205673217773438,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.008028507232666016,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.4921851158142,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00012063980102539062,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0002834796905517578,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:40",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.25 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.679794311523438e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "768 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "768"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 0.00011658668518066406,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.369850158691406e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.250640869140625e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007831335067749023,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.44814562797546,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.000118255615234375,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0002892017364501953,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:41",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.26 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010085105895996094,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "1024 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "1024"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 0.00010704994201660156,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.322166442871094e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 0.00011205673217773438,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.008156299591064453,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.425315618515,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00012135505676269531,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0002989768981933594,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:42",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.27 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00011754035949707031,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "1280 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "1280"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.703636169433594e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.369850158691406e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 0.00010848045349121094,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.008181095123291016,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.497309923172,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.000118255615234375,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0002830028533935547,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:43",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.28 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.560585021972656e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "1518 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "1518"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.608268737792969e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.417533874511719e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.1552734375e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.008019685745239258,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.43971967697144,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00012063980102539062,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0002837181091308594,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:44",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.29 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010013580322265625,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "IMIX frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "IMIX"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.560585021972656e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.393692016601562e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.822845458984375e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.008020877838134766,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.46456599235535,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00011920928955078125,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.000316619873046875,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:45",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.30 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010132789611816406,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "9000 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "9000"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.465217590332031e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.298324584960938e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 0.00011324882507324219,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007940530776977539,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.47153663635254,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00011730194091796875,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00028133392333984375,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:46",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a latency test for a defined frame size and throughput percentage -- @1.1 Frame sizes and throughput percentages",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "latency"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:51",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010395050048828125,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "TRex is restarted",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:52",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:99"
+ },
+ "result": {
+ "duration": 0.00010609626770019531,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "64 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:53",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "64"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.5367431640625e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:54",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.179115295410156e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "70% rate of previous scenario",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:55",
+ "match": {
+ "arguments": [
+ {
+ "name": "percentage_rate",
+ "value": "70%"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:129"
+ },
+ "result": {
+ "duration": 0.00024056434631347656,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:56",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007750511169433594,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "run is started and waiting for result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:57",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 40.1791934967041,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:58",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00011968612670898438,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:62",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a latency test for a defined frame size and throughput percentage -- @1.2 Frame sizes and throughput percentages",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "latency"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:51",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.72747802734375e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "TRex is restarted",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:52",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:99"
+ },
+ "result": {
+ "duration": 0.00011229515075683594,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "64 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:53",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "64"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.560585021972656e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:54",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.298324584960938e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "90% rate of previous scenario",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:55",
+ "match": {
+ "arguments": [
+ {
+ "name": "percentage_rate",
+ "value": "90%"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:129"
+ },
+ "result": {
+ "duration": 0.0002522468566894531,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:56",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.008098125457763672,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "run is started and waiting for result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:57",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 40.174768686294556,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:58",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00012159347534179688,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:63",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a latency test for a defined frame size and throughput percentage -- @1.3 Frame sizes and throughput percentages",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "latency"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:51",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010180473327636719,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "TRex is restarted",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:52",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:99"
+ },
+ "result": {
+ "duration": 9.250640869140625e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "768 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:53",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "768"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.489059448242188e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:54",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 0.0001163482666015625,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "70% rate of previous scenario",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:55",
+ "match": {
+ "arguments": [
+ {
+ "name": "percentage_rate",
+ "value": "70%"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:129"
+ },
+ "result": {
+ "duration": 0.00023174285888671875,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:56",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.008144855499267578,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "run is started and waiting for result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:57",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 38.25333619117737,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:58",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00012159347534179688,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:64",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a latency test for a defined frame size and throughput percentage -- @1.4 Frame sizes and throughput percentages",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "latency"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:51",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010204315185546875,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "TRex is restarted",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:52",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:99"
+ },
+ "result": {
+ "duration": 9.489059448242188e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "768 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:53",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "768"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.560585021972656e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:54",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 0.0001163482666015625,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "90% rate of previous scenario",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:55",
+ "match": {
+ "arguments": [
+ {
+ "name": "percentage_rate",
+ "value": "90%"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:129"
+ },
+ "result": {
+ "duration": 0.0002396106719970703,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:56",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.008252859115600586,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "run is started and waiting for result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:57",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 38.2523250579834,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:58",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00013947486877441406,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:65",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a latency test for a defined frame size and throughput percentage -- @1.5 Frame sizes and throughput percentages",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "latency"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:51",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010085105895996094,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "TRex is restarted",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:52",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:99"
+ },
+ "result": {
+ "duration": 9.107589721679688e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "1518 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:53",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "1518"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 0.00010061264038085938,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:54",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 0.00010085105895996094,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "70% rate of previous scenario",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:55",
+ "match": {
+ "arguments": [
+ {
+ "name": "percentage_rate",
+ "value": "70%"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:129"
+ },
+ "result": {
+ "duration": 0.00022912025451660156,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:56",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.00817418098449707,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "run is started and waiting for result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:57",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 40.25585341453552,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:58",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.0001220703125,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:66",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a latency test for a defined frame size and throughput percentage -- @1.6 Frame sizes and throughput percentages",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "latency"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:51",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.942054748535156e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "TRex is restarted",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:52",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:99"
+ },
+ "result": {
+ "duration": 0.00010895729064941406,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "1518 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:53",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "1518"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.512901306152344e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:54",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.322166442871094e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "90% rate of previous scenario",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:55",
+ "match": {
+ "arguments": [
+ {
+ "name": "percentage_rate",
+ "value": "90%"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:129"
+ },
+ "result": {
+ "duration": 0.0002522468566894531,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:56",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.008129119873046875,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "run is started and waiting for result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:57",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 38.25064826011658,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:58",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00012230873107910156,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:67",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a latency test for a defined frame size and throughput percentage -- @1.7 Frame sizes and throughput percentages",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "latency"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:51",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.918212890625e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "TRex is restarted",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:52",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:99"
+ },
+ "result": {
+ "duration": 9.655952453613281e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "9000 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:53",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "9000"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.5367431640625e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:54",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.465217590332031e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "70% rate of previous scenario",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:55",
+ "match": {
+ "arguments": [
+ {
+ "name": "percentage_rate",
+ "value": "70%"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:129"
+ },
+ "result": {
+ "duration": 0.00023627281188964844,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:56",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.008117198944091797,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "run is started and waiting for result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:57",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 40.175238370895386,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:58",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00011992454528808594,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:68",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a latency test for a defined frame size and throughput percentage -- @1.8 Frame sizes and throughput percentages",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "latency"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:51",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.846687316894531e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "TRex is restarted",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:52",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:99"
+ },
+ "result": {
+ "duration": 0.00011420249938964844,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "9000 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:53",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "9000"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.489059448242188e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:54",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.179115295410156e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "90% rate of previous scenario",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:55",
+ "match": {
+ "arguments": [
+ {
+ "name": "percentage_rate",
+ "value": "90%"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:129"
+ },
+ "result": {
+ "duration": 0.0002562999725341797,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:56",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.00825643539428711,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "run is started and waiting for result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:57",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 38.24060845375061,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:58",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00012087821960449219,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:69",
+ "type": "scenario"
+ }
+ ],
+ "name": "characterization",
+ "keyword": "Feature",
+ "tags": [
+ "characterization"
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:2"
+ }
+ ],
+ "skip_tests": 0,
+ "links": [
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/xtesting.log",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_768-fc_100k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_128-fc_128-rate_ndr-0.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_1518-fc_100k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_512-fc_100k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_64-fc_128-rate_ndr-2.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_9000-fc_10k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_1280-fc_100k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_1024-fc_128-rate_ndr-0.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_64-fc_128-rate_ndr-1.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_64-fc_10k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_768-fc_10k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_128-fc_128-rate_ndr-2.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_IMIX-fc_10k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_256-fc_10k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_9000-fc_100k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/output.html",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_1024-fc_128-rate_ndr-1.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_512-fc_128-rate_ndr-1.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_256-fc_100k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_256-fc_128-rate_ndr-2.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_1024-fc_100k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_128-fc_10k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_9000-fc_100k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_64-fc_100k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-latency-fs_64-fc_100k-rate_70%.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_1280-fc_128-rate_ndr-2.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_256-fc_100k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_512-fc_10k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_768-fc_10k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_768-fc_128-rate_ndr-0.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_512-fc_100k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_IMIX-fc_100k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_64-fc_100k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_1024-fc_100k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_1280-fc_100k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_128-fc_128-rate_ndr-1.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_128-fc_100k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_9000-fc_128-rate_ndr-0.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_9000-fc_128-rate_ndr-1.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_IMIX-fc_128-rate_ndr-1.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_768-fc_10k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_1280-fc_10k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_IMIX-fc_100k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_IMIX-fc_128-rate_ndr-2.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_IMIX-fc_10k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_1518-fc_100k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/behave_tests.log",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_128-fc_10k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-latency-fs_9000-fc_100k-rate_70%.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_512-fc_128-rate_ndr-0.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_9000-fc_128-rate_ndr-2.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_768-fc_100k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/campaign_result.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_9000-fc_10k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_512-fc_10k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_256-fc_10k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_128-fc_100k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-latency-fs_768-fc_100k-rate_90%.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_IMIX-fc_128-rate_ndr-0.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_1280-fc_100k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_64-fc_100k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_1518-fc_128-rate_ndr-0.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/TESTS-characterization-full.xml",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-latency-fs_1518-fc_100k-rate_90%.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_1518-fc_10k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_9000-fc_100k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_256-fc_10k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_64-fc_128-rate_ndr-0.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_1024-fc_128-rate_ndr-2.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_1518-fc_100k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_9000-fc_10k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_1024-fc_10k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_1024-fc_100k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_256-fc_100k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_IMIX-fc_10k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_512-fc_100k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_1024-fc_10k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_1280-fc_128-rate_ndr-0.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_1280-fc_128-rate_ndr-1.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_768-fc_128-rate_ndr-2.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_512-fc_10k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_1518-fc_10k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_768-fc_100k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-latency-fs_64-fc_100k-rate_90%.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_256-fc_128-rate_ndr-0.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_1518-fc_128-rate_ndr-1.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-latency-fs_768-fc_100k-rate_70%.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_256-fc_128-rate_ndr-1.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench.log",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_1518-fc_128-rate_ndr-2.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_64-fc_10k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-latency-fs_9000-fc_100k-rate_90%.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_IMIX-fc_100k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_1518-fc_10k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_1280-fc_10k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_512-fc_128-rate_ndr-2.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_128-fc_10k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_768-fc_128-rate_ndr-1.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-latency-fs_1518-fc_100k-rate_70%.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_1024-fc_10k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_64-fc_10k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_128-fc_100k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/output.json",
+ "http://172.20.73.203:8181/I2DSIKVWY5C8/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-27/characterization/nfvbench-throughput-fs_1280-fc_10k-rate_ndr-1.json"
+ ],
+ "results": {
+ "latency": [
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_64-fc_100k-rate_70%.json",
+ "frame_sizes": [
+ "64"
+ ],
+ "rate": "70%",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc12_basic",
+ "restart": "true"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-29 03:55:31",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": "true",
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "31dfef5b7f0d4cefa8f78348321335f6",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "404397pps",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "64"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": false,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_64-fc_100k-rate_70%.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": true,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "64"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2519,
+ 2504
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_64-fc_100k-rate_70%.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "64": {
+ "run_config": {
+ "direction-forward": {
+ "rx": {
+ "rate_percent": 0.5412860544,
+ "rate_pps": 201371,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 135321513
+ },
+ "tx": {
+ "rate_percent": 0.5414158848,
+ "rate_pps": 201419,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 135353971
+ },
+ "orig": {
+ "rate_percent": 0.5435095679999999,
+ "rate_pps": 202198,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 135877392
+ }
+ },
+ "direction-total": {
+ "rx": {
+ "rate_percent": 1.0825922688,
+ "rate_pps": 402749.0,
+ "rate_bps": 270648066.0
+ },
+ "tx": {
+ "rate_percent": 1.0828642944000002,
+ "rate_pps": 402850.0,
+ "rate_bps": 270716073.0
+ },
+ "orig": {
+ "rate_percent": 1.0870191359999999,
+ "rate_pps": 404396.0,
+ "rate_bps": 271754784.0
+ }
+ },
+ "direction-reverse": {
+ "rx": {
+ "rate_percent": 0.5413062144,
+ "rate_pps": 201378,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 135326553
+ },
+ "tx": {
+ "rate_percent": 0.5414484096000001,
+ "rate_pps": 201431,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 135362102
+ },
+ "orig": {
+ "rate_percent": 0.5435095679999999,
+ "rate_pps": 202198,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 135877392
+ }
+ }
+ },
+ "packet_path_stats": {
+ "Forward": {
+ "interfaces": [
+ "TRex.TX.p0",
+ "TRex.RX.p1"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 9936,
+ "-1 (-0.0101%)"
+ ],
+ "lat_max_usec": 913,
+ "lat_avg_usec": 72,
+ "lat_min_usec": 31,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ },
+ "Reverse": {
+ "interfaces": [
+ "TRex.TX.p1",
+ "TRex.RX.p0"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 9937,
+ 9937
+ ],
+ "lat_max_usec": 10880,
+ "lat_avg_usec": 72,
+ "lat_min_usec": 30,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ }
+ },
+ "stats": {
+ "total_tx_rate": 402851,
+ "overall": {
+ "drop_rate_percent": 0.02512093171847776,
+ "rx": {
+ "dropped_pkts": 1012,
+ "pkt_bit_rate": 109573400.0,
+ "pkt_rate": 201421.0,
+ "max_delay_usec": 10880,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "avg_delay_usec": 72.0,
+ "total_pkt_bytes": 273870068,
+ "total_pkts": 4027501,
+ "min_delay_usec": 30
+ },
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg=",
+ "tx": {
+ "total_pkt_bytes": 273938884,
+ "total_pkts": 4028513,
+ "pkt_bit_rate": 109576132.0,
+ "pkt_rate": 201426.5
+ }
+ },
+ "1": {
+ "drop_rate_percent": 0.023978350974548694,
+ "rx": {
+ "dropped_pkts": 483,
+ "pkt_bit_rate": 109577136,
+ "pkt_rate": 201428,
+ "max_delay_usec": 10880,
+ "total_pkt_bytes": 136932484,
+ "avg_delay_usec": 72,
+ "total_pkts": 2013713,
+ "min_delay_usec": 30
+ },
+ "tx": {
+ "total_pkt_bytes": 136973556,
+ "total_pkts": 2014317,
+ "pkt_bit_rate": 109577000,
+ "pkt_rate": 201428
+ }
+ },
+ "0": {
+ "drop_rate_percent": 0.02626358110134267,
+ "rx": {
+ "dropped_pkts": 529,
+ "pkt_bit_rate": 109569664,
+ "pkt_rate": 201414,
+ "max_delay_usec": 913,
+ "total_pkt_bytes": 136937584,
+ "avg_delay_usec": 72,
+ "total_pkts": 2013788,
+ "min_delay_usec": 31
+ },
+ "tx": {
+ "total_pkt_bytes": 136965328,
+ "total_pkts": 2014196,
+ "pkt_bit_rate": 109575264,
+ "pkt_rate": 201425
+ }
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 270715872.0,
+ "theoretical_tx_rate_pps": 74404761.90476191
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "31dfef5b7f0d4cefa8f78348321335f6"
+ },
+ "synthesis": {
+ "avg_delay_usec": 72.0,
+ "total_tx_rate": 402851
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_64-fc_100k-rate_90%.json",
+ "frame_sizes": [
+ "64"
+ ],
+ "rate": "90%",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc12_basic",
+ "restart": "true"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-29 03:56:11",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": "true",
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "4d3fa821db7a40a2bc3cab131ccc1635",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "519939pps",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "64"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": false,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_64-fc_100k-rate_90%.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": true,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "64"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2519,
+ 2504
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_64-fc_100k-rate_90%.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "64": {
+ "run_config": {
+ "direction-forward": {
+ "rx": {
+ "rate_percent": 0.6960530304,
+ "rate_pps": 258948,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 174013257
+ },
+ "tx": {
+ "rate_percent": 0.6961078655999999,
+ "rate_pps": 258968,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 174026966
+ },
+ "orig": {
+ "rate_percent": 0.698798016,
+ "rate_pps": 259969,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 174699504
+ }
+ },
+ "direction-total": {
+ "rx": {
+ "rate_percent": 1.3921789055999998,
+ "rate_pps": 517923.0,
+ "rate_bps": 348044725.0
+ },
+ "tx": {
+ "rate_percent": 1.3922579327999998,
+ "rate_pps": 517952.0,
+ "rate_bps": 348064482.0
+ },
+ "orig": {
+ "rate_percent": 1.397596032,
+ "rate_pps": 519938.0,
+ "rate_bps": 349399008.0
+ }
+ },
+ "direction-reverse": {
+ "rx": {
+ "rate_percent": 0.6961258751999999,
+ "rate_pps": 258975,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 174031468
+ },
+ "tx": {
+ "rate_percent": 0.6961500671999998,
+ "rate_pps": 258984,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 174037516
+ },
+ "orig": {
+ "rate_percent": 0.698798016,
+ "rate_pps": 259969,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 174699504
+ }
+ }
+ },
+ "packet_path_stats": {
+ "Forward": {
+ "interfaces": [
+ "TRex.TX.p0",
+ "TRex.RX.p1"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 9936,
+ 9936
+ ],
+ "lat_max_usec": 826,
+ "lat_avg_usec": 86,
+ "lat_min_usec": 32,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ },
+ "Reverse": {
+ "interfaces": [
+ "TRex.TX.p1",
+ "TRex.RX.p0"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 9938,
+ 9938
+ ],
+ "lat_max_usec": 2343,
+ "lat_avg_usec": 82,
+ "lat_min_usec": 31,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ }
+ },
+ "stats": {
+ "total_tx_rate": 517953,
+ "overall": {
+ "drop_rate_percent": 0.005676189600950356,
+ "rx": {
+ "dropped_pkts": 294,
+ "pkt_bit_rate": 141229784.0,
+ "pkt_rate": 259613.5,
+ "max_delay_usec": 2343,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "avg_delay_usec": 84.00010464861909,
+ "total_pkt_bytes": 352188116,
+ "total_pkts": 5179237,
+ "min_delay_usec": 31
+ },
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg=",
+ "tx": {
+ "total_pkt_bytes": 352208108,
+ "total_pkts": 5179531,
+ "pkt_bit_rate": 141223456.0,
+ "pkt_rate": 259601.5
+ }
+ },
+ "1": {
+ "drop_rate_percent": 0.007876922316556519,
+ "rx": {
+ "dropped_pkts": 204,
+ "pkt_bit_rate": 141232784,
+ "pkt_rate": 259619,
+ "max_delay_usec": 2343,
+ "total_pkt_bytes": 176084844,
+ "avg_delay_usec": 82,
+ "total_pkts": 2589483,
+ "min_delay_usec": 31
+ },
+ "tx": {
+ "total_pkt_bytes": 176109392,
+ "total_pkts": 2589844,
+ "pkt_bit_rate": 141216336,
+ "pkt_rate": 259588
+ }
+ },
+ "0": {
+ "drop_rate_percent": 0.0034753234657315733,
+ "rx": {
+ "dropped_pkts": 90,
+ "pkt_bit_rate": 141226784,
+ "pkt_rate": 259608,
+ "max_delay_usec": 826,
+ "total_pkt_bytes": 176103272,
+ "avg_delay_usec": 86,
+ "total_pkts": 2589754,
+ "min_delay_usec": 32
+ },
+ "tx": {
+ "total_pkt_bytes": 176098716,
+ "total_pkts": 2589687,
+ "pkt_bit_rate": 141230576,
+ "pkt_rate": 259615
+ }
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 348064416.0,
+ "theoretical_tx_rate_pps": 74404761.90476191
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "4d3fa821db7a40a2bc3cab131ccc1635"
+ },
+ "synthesis": {
+ "avg_delay_usec": 84.00010464861909,
+ "total_tx_rate": 517953
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_768-fc_100k-rate_70%.json",
+ "frame_sizes": [
+ "768"
+ ],
+ "rate": "70%",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc12_basic",
+ "restart": "true"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-29 03:56:51",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": "true",
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "d72d4f4bfee344328eab1bb6f1ad4f3d",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "323313pps",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "768"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": false,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_768-fc_100k-rate_70%.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": true,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "768"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2519,
+ 2504
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_768-fc_100k-rate_70%.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "768": {
+ "run_config": {
+ "direction-forward": {
+ "rx": {
+ "rate_percent": 4.0606182144,
+ "rate_pps": 161033,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 1015154553
+ },
+ "tx": {
+ "rate_percent": 4.0606182144,
+ "rate_pps": 161033,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 1015154553
+ },
+ "orig": {
+ "rate_percent": 4.076330304,
+ "rate_pps": 161656,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 1019082576
+ }
+ },
+ "direction-total": {
+ "rx": {
+ "rate_percent": 8.121481024,
+ "rate_pps": 322076.0,
+ "rate_bps": 2030370255.0
+ },
+ "tx": {
+ "rate_percent": 8.121481024,
+ "rate_pps": 322076.0,
+ "rate_bps": 2030370255.0
+ },
+ "orig": {
+ "rate_percent": 8.152660608,
+ "rate_pps": 323312.0,
+ "rate_bps": 2038165152.0
+ }
+ },
+ "direction-reverse": {
+ "rx": {
+ "rate_percent": 4.0608628096,
+ "rate_pps": 161043,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 1015215702
+ },
+ "tx": {
+ "rate_percent": 4.0608628096,
+ "rate_pps": 161043,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 1015215702
+ },
+ "orig": {
+ "rate_percent": 4.076330304,
+ "rate_pps": 161656,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 1019082576
+ }
+ }
+ },
+ "packet_path_stats": {
+ "Forward": {
+ "interfaces": [
+ "TRex.TX.p0",
+ "TRex.RX.p1"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 9937,
+ 9937
+ ],
+ "lat_max_usec": 319,
+ "lat_avg_usec": 127,
+ "lat_min_usec": 37,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ },
+ "Reverse": {
+ "interfaces": [
+ "TRex.TX.p1",
+ "TRex.RX.p0"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 9938,
+ 9938
+ ],
+ "lat_max_usec": 5029,
+ "lat_avg_usec": 131,
+ "lat_min_usec": 49,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ }
+ },
+ "stats": {
+ "total_tx_rate": 322076,
+ "overall": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 996376192.0,
+ "pkt_rate": 161330.0,
+ "max_delay_usec": 5029,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "avg_delay_usec": 128.99993976586308,
+ "total_pkt_bytes": 2486430580,
+ "total_pkts": 3220765,
+ "min_delay_usec": 37
+ },
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg=",
+ "tx": {
+ "total_pkt_bytes": 2486430580,
+ "total_pkts": 3220765,
+ "pkt_bit_rate": 996371424.0,
+ "pkt_rate": 161329.0
+ }
+ },
+ "1": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 996389184,
+ "pkt_rate": 161332,
+ "max_delay_usec": 5029,
+ "total_pkt_bytes": 1243177848,
+ "avg_delay_usec": 131,
+ "total_pkts": 1610334,
+ "min_delay_usec": 49
+ },
+ "tx": {
+ "total_pkt_bytes": 1243252732,
+ "total_pkts": 1610431,
+ "pkt_bit_rate": 996370048,
+ "pkt_rate": 161329
+ }
+ },
+ "0": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 996363200,
+ "pkt_rate": 161328,
+ "max_delay_usec": 319,
+ "total_pkt_bytes": 1243252732,
+ "avg_delay_usec": 127,
+ "total_pkts": 1610431,
+ "min_delay_usec": 37
+ },
+ "tx": {
+ "total_pkt_bytes": 1243177848,
+ "total_pkts": 1610334,
+ "pkt_bit_rate": 996372800,
+ "pkt_rate": 161329
+ }
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 2030367104.0,
+ "theoretical_tx_rate_pps": 7931472.081218274
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "d72d4f4bfee344328eab1bb6f1ad4f3d"
+ },
+ "synthesis": {
+ "avg_delay_usec": 128.99993976586308,
+ "total_tx_rate": 322076
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_768-fc_100k-rate_90%.json",
+ "frame_sizes": [
+ "768"
+ ],
+ "rate": "90%",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc12_basic",
+ "restart": "true"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-29 03:57:29",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": "true",
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "fe186736edcd4ccf8aef444a8035ae7a",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "415688pps",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "768"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": false,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_768-fc_100k-rate_90%.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": true,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "768"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2519,
+ 2504
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_768-fc_100k-rate_90%.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "768": {
+ "run_config": {
+ "direction-forward": {
+ "rx": {
+ "rate_percent": 5.223822208,
+ "rate_pps": 207163,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 1305955552
+ },
+ "tx": {
+ "rate_percent": 5.2242786176000005,
+ "rate_pps": 207181,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 1306069654
+ },
+ "orig": {
+ "rate_percent": 5.240994304,
+ "rate_pps": 207844,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 1310248576
+ }
+ },
+ "direction-total": {
+ "rx": {
+ "rate_percent": 10.447904140799999,
+ "rate_pps": 414336.0,
+ "rate_bps": 2611976035.0
+ },
+ "tx": {
+ "rate_percent": 10.4488699136,
+ "rate_pps": 414374.0,
+ "rate_bps": 2612217478.0
+ },
+ "orig": {
+ "rate_percent": 10.481988608,
+ "rate_pps": 415688.0,
+ "rate_bps": 2620497152.0
+ }
+ },
+ "direction-reverse": {
+ "rx": {
+ "rate_percent": 5.224081932799999,
+ "rate_pps": 207173,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 1306020483
+ },
+ "tx": {
+ "rate_percent": 5.224591296,
+ "rate_pps": 207193,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 1306147824
+ },
+ "orig": {
+ "rate_percent": 5.240994304,
+ "rate_pps": 207844,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 1310248576
+ }
+ }
+ },
+ "packet_path_stats": {
+ "Forward": {
+ "interfaces": [
+ "TRex.TX.p0",
+ "TRex.RX.p1"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 9947,
+ 9947
+ ],
+ "lat_max_usec": 5273,
+ "lat_avg_usec": 150,
+ "lat_min_usec": 38,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ },
+ "Reverse": {
+ "interfaces": [
+ "TRex.TX.p1",
+ "TRex.RX.p0"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 9948,
+ 9948
+ ],
+ "lat_max_usec": 11188,
+ "lat_avg_usec": 145,
+ "lat_min_usec": 37,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ }
+ },
+ "stats": {
+ "total_tx_rate": 414374,
+ "overall": {
+ "drop_rate_percent": 0.009242844517979626,
+ "rx": {
+ "dropped_pkts": 383,
+ "pkt_bit_rate": 1203150656.0,
+ "pkt_rate": 194810.0,
+ "max_delay_usec": 11188,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "avg_delay_usec": 147.50006214758398,
+ "total_pkt_bytes": 3198676236,
+ "total_pkts": 4143363,
+ "min_delay_usec": 37
+ },
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg=",
+ "tx": {
+ "total_pkt_bytes": 3198971912,
+ "total_pkts": 4143746,
+ "pkt_bit_rate": 1203347648.0,
+ "pkt_rate": 194842.0
+ }
+ },
+ "1": {
+ "drop_rate_percent": 0.008735795283153188,
+ "rx": {
+ "dropped_pkts": 181,
+ "pkt_bit_rate": 1195129344,
+ "pkt_rate": 193511,
+ "max_delay_usec": 11188,
+ "total_pkt_bytes": 1599298360,
+ "avg_delay_usec": 145,
+ "total_pkts": 2071630,
+ "min_delay_usec": 37
+ },
+ "tx": {
+ "total_pkt_bytes": 1599533820,
+ "total_pkts": 2071935,
+ "pkt_bit_rate": 1205016576,
+ "pkt_rate": 195112
+ }
+ },
+ "0": {
+ "drop_rate_percent": 0.009749924100219567,
+ "rx": {
+ "dropped_pkts": 202,
+ "pkt_bit_rate": 1211171968,
+ "pkt_rate": 196109,
+ "max_delay_usec": 5273,
+ "total_pkt_bytes": 1599377876,
+ "avg_delay_usec": 150,
+ "total_pkts": 2071733,
+ "min_delay_usec": 38
+ },
+ "tx": {
+ "total_pkt_bytes": 1599438092,
+ "total_pkts": 2071811,
+ "pkt_bit_rate": 1201678720,
+ "pkt_rate": 194572
+ }
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 2612213696.0,
+ "theoretical_tx_rate_pps": 7931472.081218274
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "fe186736edcd4ccf8aef444a8035ae7a"
+ },
+ "synthesis": {
+ "avg_delay_usec": 147.50006214758398,
+ "total_tx_rate": 414374
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_1518-fc_100k-rate_70%.json",
+ "frame_sizes": [
+ "1518"
+ ],
+ "rate": "70%",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc12_basic",
+ "restart": "true"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-29 03:58:09",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": "true",
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "3e05e243e2d848f58e131d186c909bc7",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "353369pps",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "1518"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": false,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_1518-fc_100k-rate_70%.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": true,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "1518"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2519,
+ 2504
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_1518-fc_100k-rate_70%.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "1518": {
+ "run_config": {
+ "direction-forward": {
+ "rx": {
+ "rate_percent": 8.6621931776,
+ "rate_pps": 176003,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 2165548294
+ },
+ "tx": {
+ "rate_percent": 8.6621931776,
+ "rate_pps": 176003,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 2165548294
+ },
+ "orig": {
+ "rate_percent": 8.695704352,
+ "rate_pps": 176684,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 2173926088
+ }
+ },
+ "direction-total": {
+ "rx": {
+ "rate_percent": 17.324908044800004,
+ "rate_pps": 352017.0,
+ "rate_bps": 4331227010.0
+ },
+ "tx": {
+ "rate_percent": 17.324908044800004,
+ "rate_pps": 352017.0,
+ "rate_bps": 4331227010.0
+ },
+ "orig": {
+ "rate_percent": 17.391408704,
+ "rate_pps": 353368.0,
+ "rate_bps": 4347852176.0
+ }
+ },
+ "direction-reverse": {
+ "rx": {
+ "rate_percent": 8.662714867200002,
+ "rate_pps": 176014,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 2165678716
+ },
+ "tx": {
+ "rate_percent": 8.662714867200002,
+ "rate_pps": 176014,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 2165678716
+ },
+ "orig": {
+ "rate_percent": 8.695704352,
+ "rate_pps": 176684,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 2173926088
+ }
+ }
+ },
+ "packet_path_stats": {
+ "Forward": {
+ "interfaces": [
+ "TRex.TX.p0",
+ "TRex.RX.p1"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 9936,
+ 9936
+ ],
+ "lat_max_usec": 327,
+ "lat_avg_usec": 135,
+ "lat_min_usec": 43,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ },
+ "Reverse": {
+ "interfaces": [
+ "TRex.TX.p1",
+ "TRex.RX.p0"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 9937,
+ 9937
+ ],
+ "lat_max_usec": 4259,
+ "lat_avg_usec": 130,
+ "lat_min_usec": 44,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ }
+ },
+ "stats": {
+ "total_tx_rate": 352017,
+ "overall": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 2147925760.0,
+ "pkt_rate": 176406.5,
+ "max_delay_usec": 4259,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "avg_delay_usec": 132.50007528028414,
+ "total_pkt_bytes": 5357710916,
+ "total_pkts": 3520178,
+ "min_delay_usec": 43
+ },
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg=",
+ "tx": {
+ "total_pkt_bytes": 5357710916,
+ "total_pkts": 3520178,
+ "pkt_bit_rate": 2148198656.0,
+ "pkt_rate": 176428.5
+ }
+ },
+ "1": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 2147965440,
+ "pkt_rate": 176410,
+ "max_delay_usec": 4259,
+ "total_pkt_bytes": 2678774792,
+ "avg_delay_usec": 130,
+ "total_pkts": 1760036,
+ "min_delay_usec": 44
+ },
+ "tx": {
+ "total_pkt_bytes": 2678936124,
+ "total_pkts": 1760142,
+ "pkt_bit_rate": 2148139008,
+ "pkt_rate": 176424
+ }
+ },
+ "0": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 2147886080,
+ "pkt_rate": 176403,
+ "max_delay_usec": 327,
+ "total_pkt_bytes": 2678936124,
+ "avg_delay_usec": 135,
+ "total_pkts": 1760142,
+ "min_delay_usec": 43
+ },
+ "tx": {
+ "total_pkt_bytes": 2678774792,
+ "total_pkts": 1760036,
+ "pkt_bit_rate": 2148258304,
+ "pkt_rate": 176433
+ }
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 4331217168.0,
+ "theoretical_tx_rate_pps": 4063719.1157347206
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "3e05e243e2d848f58e131d186c909bc7"
+ },
+ "synthesis": {
+ "avg_delay_usec": 132.50007528028414,
+ "total_tx_rate": 352017
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_1518-fc_100k-rate_90%.json",
+ "frame_sizes": [
+ "1518"
+ ],
+ "rate": "90%",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc12_basic",
+ "restart": "true"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-29 03:58:48",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": "true",
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "7910b7f29a8f4eae96799809b0c39463",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "454332pps",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "1518"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": false,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_1518-fc_100k-rate_90%.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": true,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "1518"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2519,
+ 2504
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_1518-fc_100k-rate_90%.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "1518": {
+ "run_config": {
+ "direction-forward": {
+ "rx": {
+ "rate_percent": 11.1438755264,
+ "rate_pps": 226427,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 2785968881
+ },
+ "tx": {
+ "rate_percent": 11.144554707200001,
+ "rate_pps": 226441,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 2786138676
+ },
+ "orig": {
+ "rate_percent": 11.180201856,
+ "rate_pps": 227166,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 2795050464
+ }
+ },
+ "direction-total": {
+ "rx": {
+ "rate_percent": 22.289040512,
+ "rate_pps": 452881.0,
+ "rate_bps": 5572260127.0
+ },
+ "tx": {
+ "rate_percent": 22.289778752,
+ "rate_pps": 452896.0,
+ "rate_bps": 5572444687.0
+ },
+ "orig": {
+ "rate_percent": 22.360403712,
+ "rate_pps": 454332.0,
+ "rate_bps": 5590100928.0
+ }
+ },
+ "direction-reverse": {
+ "rx": {
+ "rate_percent": 11.145164985600001,
+ "rate_pps": 226454,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 2786291246
+ },
+ "tx": {
+ "rate_percent": 11.145224044799999,
+ "rate_pps": 226455,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 2786306011
+ },
+ "orig": {
+ "rate_percent": 11.180201856,
+ "rate_pps": 227166,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 2795050464
+ }
+ }
+ },
+ "packet_path_stats": {
+ "Forward": {
+ "interfaces": [
+ "TRex.TX.p0",
+ "TRex.RX.p1"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 9948,
+ "-2 (-0.0201%)"
+ ],
+ "lat_max_usec": 205,
+ "lat_avg_usec": 100,
+ "lat_min_usec": 38,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ },
+ "Reverse": {
+ "interfaces": [
+ "TRex.TX.p1",
+ "TRex.RX.p0"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 9949,
+ 9949
+ ],
+ "lat_max_usec": 5711,
+ "lat_avg_usec": 106,
+ "lat_min_usec": 38,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ }
+ },
+ "stats": {
+ "total_tx_rate": 452897,
+ "overall": {
+ "drop_rate_percent": 0.003312011340326829,
+ "rx": {
+ "dropped_pkts": 150,
+ "pkt_bit_rate": 2634780672.0,
+ "pkt_rate": 216390.5,
+ "max_delay_usec": 5711,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "avg_delay_usec": 102.9998264448576,
+ "total_pkt_bytes": 6892864040,
+ "total_pkts": 4528820,
+ "min_delay_usec": 38
+ },
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg=",
+ "tx": {
+ "total_pkt_bytes": 6893092340,
+ "total_pkts": 4528970,
+ "pkt_bit_rate": 2645309568.0,
+ "pkt_rate": 217255.5
+ }
+ },
+ "1": {
+ "drop_rate_percent": 0.006093917872533785,
+ "rx": {
+ "dropped_pkts": 138,
+ "pkt_bit_rate": 2509765376,
+ "pkt_rate": 206123,
+ "max_delay_usec": 5711,
+ "total_pkt_bytes": 3446232638,
+ "avg_delay_usec": 106,
+ "total_pkts": 2264279,
+ "min_delay_usec": 38
+ },
+ "tx": {
+ "total_pkt_bytes": 3446649666,
+ "total_pkts": 2264553,
+ "pkt_bit_rate": 2530603776,
+ "pkt_rate": 207835
+ }
+ },
+ "0": {
+ "drop_rate_percent": 0.0005299377279008239,
+ "rx": {
+ "dropped_pkts": 12,
+ "pkt_bit_rate": 2759795968,
+ "pkt_rate": 226658,
+ "max_delay_usec": 205,
+ "total_pkt_bytes": 3446631402,
+ "avg_delay_usec": 100,
+ "total_pkts": 2264541,
+ "min_delay_usec": 38
+ },
+ "tx": {
+ "total_pkt_bytes": 3446442674,
+ "total_pkts": 2264417,
+ "pkt_bit_rate": 2760015360,
+ "pkt_rate": 226676
+ }
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 5572444688.0,
+ "theoretical_tx_rate_pps": 4063719.1157347206
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "7910b7f29a8f4eae96799809b0c39463"
+ },
+ "synthesis": {
+ "avg_delay_usec": 102.9998264448576,
+ "total_tx_rate": 452897
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_9000-fc_100k-rate_70%.json",
+ "frame_sizes": [
+ "9000"
+ ],
+ "rate": "70%",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc12_basic",
+ "restart": "true"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-29 03:59:26",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": "true",
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "422174a3acbd45169f09f61c00aee4d4",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "183573pps",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "9000"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": false,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_9000-fc_100k-rate_70%.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": true,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "9000"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2519,
+ 2504
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_9000-fc_100k-rate_70%.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "9000": {
+ "run_config": {
+ "direction-forward": {
+ "rx": {
+ "rate_percent": 26.392404543999998,
+ "rate_pps": 91437,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 6598101136
+ },
+ "tx": {
+ "rate_percent": 26.392404543999998,
+ "rate_pps": 91437,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 6598101136
+ },
+ "orig": {
+ "rate_percent": 26.49325536,
+ "rate_pps": 91786,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 6623313840
+ }
+ },
+ "direction-total": {
+ "rx": {
+ "rate_percent": 52.786425472,
+ "rate_pps": 182879.0,
+ "rate_bps": 13196606368.0
+ },
+ "tx": {
+ "rate_percent": 52.786425472,
+ "rate_pps": 182879.0,
+ "rate_bps": 13196606368.0
+ },
+ "orig": {
+ "rate_percent": 52.98651072,
+ "rate_pps": 183572.0,
+ "rate_bps": 13246627680.0
+ }
+ },
+ "direction-reverse": {
+ "rx": {
+ "rate_percent": 26.394020928,
+ "rate_pps": 91442,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 6598505232
+ },
+ "tx": {
+ "rate_percent": 26.394020928,
+ "rate_pps": 91442,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 6598505232
+ },
+ "orig": {
+ "rate_percent": 26.49325536,
+ "rate_pps": 91786,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 6623313840
+ }
+ }
+ },
+ "packet_path_stats": {
+ "Forward": {
+ "interfaces": [
+ "TRex.TX.p0",
+ "TRex.RX.p1"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 9937,
+ 9937
+ ],
+ "lat_max_usec": 7076,
+ "lat_avg_usec": 465,
+ "lat_min_usec": 117,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ },
+ "Reverse": {
+ "interfaces": [
+ "TRex.TX.p1",
+ "TRex.RX.p0"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 9938,
+ 9938
+ ],
+ "lat_max_usec": 7737,
+ "lat_avg_usec": 470,
+ "lat_min_usec": 130,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ }
+ },
+ "stats": {
+ "total_tx_rate": 182879,
+ "overall": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 6309462016.0,
+ "pkt_rate": 87592.0,
+ "max_delay_usec": 7737,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "avg_delay_usec": 467.4999234469854,
+ "total_pkt_bytes": 16466497192,
+ "total_pkts": 1828798,
+ "min_delay_usec": 117
+ },
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg=",
+ "tx": {
+ "total_pkt_bytes": 16466497192,
+ "total_pkts": 1828798,
+ "pkt_bit_rate": 6308925440.0,
+ "pkt_rate": 87584.5
+ }
+ },
+ "1": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 6276257280,
+ "pkt_rate": 87131,
+ "max_delay_usec": 7737,
+ "total_pkt_bytes": 8232996484,
+ "avg_delay_usec": 470,
+ "total_pkts": 914371,
+ "min_delay_usec": 130
+ },
+ "tx": {
+ "total_pkt_bytes": 8233500708,
+ "total_pkts": 914427,
+ "pkt_bit_rate": 6310474240,
+ "pkt_rate": 87606
+ }
+ },
+ "0": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 6342666752,
+ "pkt_rate": 88053,
+ "max_delay_usec": 7076,
+ "total_pkt_bytes": 8233500708,
+ "avg_delay_usec": 465,
+ "total_pkts": 914427,
+ "min_delay_usec": 117
+ },
+ "tx": {
+ "total_pkt_bytes": 8232996484,
+ "total_pkts": 914371,
+ "pkt_bit_rate": 6307376640,
+ "pkt_rate": 87563
+ }
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 13196548640.0,
+ "theoretical_tx_rate_pps": 692904.6563192905
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "422174a3acbd45169f09f61c00aee4d4"
+ },
+ "synthesis": {
+ "avg_delay_usec": 467.4999234469854,
+ "total_tx_rate": 182879
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_9000-fc_100k-rate_90%.json",
+ "frame_sizes": [
+ "9000"
+ ],
+ "rate": "90%",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc12_basic",
+ "restart": "true"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-29 04:00:06",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": "true",
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "f14fd151f22a41f7b5185e37d548ad45",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "236023pps",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "9000"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": false,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_9000-fc_100k-rate_90%.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": true,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "9000"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2519,
+ 2504
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_9000-fc_100k-rate_90%.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "9000": {
+ "run_config": {
+ "direction-forward": {
+ "rx": {
+ "rate_percent": 33.929862912,
+ "rate_pps": 117550,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 8482465728
+ },
+ "tx": {
+ "rate_percent": 33.93338432,
+ "rate_pps": 117563,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 8483346080
+ },
+ "orig": {
+ "rate_percent": 34.062839360000005,
+ "rate_pps": 118011,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 8515709840
+ }
+ },
+ "direction-total": {
+ "rx": {
+ "rate_percent": 67.86532543999999,
+ "rate_pps": 235120.0,
+ "rate_bps": 16966331360.0
+ },
+ "tx": {
+ "rate_percent": 67.868846848,
+ "rate_pps": 235133.0,
+ "rate_bps": 16967211712.0
+ },
+ "orig": {
+ "rate_percent": 68.12567872000001,
+ "rate_pps": 236022.0,
+ "rate_bps": 17031419680.0
+ }
+ },
+ "direction-reverse": {
+ "rx": {
+ "rate_percent": 33.935462528,
+ "rate_pps": 117570,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 8483865632
+ },
+ "tx": {
+ "rate_percent": 33.935462528,
+ "rate_pps": 117570,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 8483865632
+ },
+ "orig": {
+ "rate_percent": 34.062839360000005,
+ "rate_pps": 118011,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 8515709840
+ }
+ }
+ },
+ "packet_path_stats": {
+ "Forward": {
+ "interfaces": [
+ "TRex.TX.p0",
+ "TRex.RX.p1"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 9937,
+ 9937
+ ],
+ "lat_max_usec": 4884,
+ "lat_avg_usec": 544,
+ "lat_min_usec": 229,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ },
+ "Reverse": {
+ "interfaces": [
+ "TRex.TX.p1",
+ "TRex.RX.p0"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 9939,
+ 9939
+ ],
+ "lat_max_usec": 8447,
+ "lat_avg_usec": 520,
+ "lat_min_usec": 229,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ }
+ },
+ "stats": {
+ "total_tx_rate": 235133,
+ "overall": {
+ "drop_rate_percent": 0.005188548448283782,
+ "rx": {
+ "dropped_pkts": 122,
+ "pkt_bit_rate": 8485221632.0,
+ "pkt_rate": 117797.5,
+ "max_delay_usec": 8447,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "avg_delay_usec": 532.000990128487,
+ "total_pkt_bytes": 21170294840,
+ "total_pkts": 2351210,
+ "min_delay_usec": 229
+ },
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg=",
+ "tx": {
+ "total_pkt_bytes": 21171393328,
+ "total_pkts": 2351332,
+ "pkt_bit_rate": 8486891520.0,
+ "pkt_rate": 117820.5
+ }
+ },
+ "1": {
+ "drop_rate_percent": 0.010376779149818577,
+ "rx": {
+ "dropped_pkts": 122,
+ "pkt_bit_rate": 8483412992,
+ "pkt_rate": 117772,
+ "max_delay_usec": 8447,
+ "total_pkt_bytes": 10584274032,
+ "avg_delay_usec": 520,
+ "total_pkts": 1175508,
+ "min_delay_usec": 229
+ },
+ "tx": {
+ "total_pkt_bytes": 10586020808,
+ "total_pkts": 1175702,
+ "pkt_bit_rate": 8486368256,
+ "pkt_rate": 117813
+ }
+ },
+ "0": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 8487030272,
+ "pkt_rate": 117823,
+ "max_delay_usec": 4884,
+ "total_pkt_bytes": 10586020808,
+ "avg_delay_usec": 544,
+ "total_pkts": 1175702,
+ "min_delay_usec": 229
+ },
+ "tx": {
+ "total_pkt_bytes": 10585372520,
+ "total_pkts": 1175630,
+ "pkt_bit_rate": 8487414784,
+ "pkt_rate": 117828
+ }
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 16967197280.0,
+ "theoretical_tx_rate_pps": 692904.6563192905
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "f14fd151f22a41f7b5185e37d548ad45"
+ },
+ "synthesis": {
+ "avg_delay_usec": 532.000990128487,
+ "total_tx_rate": 235133
+ }
+ }
+ ],
+ "throughput": [
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_64-fc_128-rate_ndr-2.json",
+ "frame_sizes": [
+ "64"
+ ],
+ "rate": "ndr",
+ "flow_count": "128",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-29 00:21:09",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "2f9d3285d24c4aa38cce7d6e7e01cee8",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "64"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 128,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_64-fc_128-rate_ndr-2.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "64"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2519,
+ 2504
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_64-fc_128-rate_ndr-2.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "64": {
+ "ndr": {
+ "load_percent_per_direction": 0.48828125,
+ "timestamp_sec": 1648513409.8775496,
+ "stats": {
+ "total_tx_rate": 361069,
+ "overall": {
+ "rx_pkts": 3610699,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 1893,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 3610699,
+ "avg_delay_usec": 91.50007602406072,
+ "min_delay_usec": 28,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1805258,
+ "min_delay_usec": 28,
+ "drop_pct": 0,
+ "max_delay_usec": 990,
+ "tx_pkts": 1805441,
+ "avg_delay_usec": 90,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 1805441,
+ "min_delay_usec": 32,
+ "drop_pct": 0,
+ "max_delay_usec": 1893,
+ "tx_pkts": 1805258,
+ "avg_delay_usec": 93,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 242638368.0,
+ "theoretical_tx_rate_pps": 74404761.90476191
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 0.9765625,
+ "duration_sec": 10.0,
+ "l2frame_size": "64",
+ "rate_pps": 363304,
+ "rate_bps": 244140624.0,
+ "time_taken_sec": 137.65262913703918
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 706488.1334367159,
+ "rx_pkts": 4041557,
+ "time_ms": 1648513284731,
+ "drop_pct": 421600523,
+ "total_tx_pps": 42564208,
+ "tx_pps": 74404760,
+ "tx_pkts": 425642080,
+ "warning": "WARNING: There is a significant difference between requested TX rate (74404760) and actual TX rate (42564208). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "drop_percentage": 99.05047992435334
+ },
+ {
+ "rx_pps": 518432.56253104715,
+ "rx_pkts": 5152442,
+ "time_ms": 1648513297224,
+ "drop_pct": 364583410,
+ "total_tx_pps": 36973585,
+ "tx_pps": 37202380,
+ "tx_pkts": 369735852,
+ "drop_percentage": 98.60645323624175
+ },
+ {
+ "rx_pps": 606695.2079490544,
+ "rx_pkts": 6029034,
+ "time_ms": 1648513309723,
+ "drop_pct": 178820303,
+ "total_tx_pps": 18484933,
+ "tx_pps": 18601190,
+ "tx_pkts": 184849337,
+ "drop_percentage": 96.73840647856909
+ },
+ {
+ "rx_pps": 490524.8337800907,
+ "rx_pkts": 4874836,
+ "time_ms": 1648513322260,
+ "drop_pct": 87554471,
+ "total_tx_pps": 9242930,
+ "tx_pps": 9300594,
+ "tx_pkts": 92429307,
+ "drop_percentage": 94.72587628510512
+ },
+ {
+ "rx_pps": 1794968.8359250196,
+ "rx_pkts": 17837503,
+ "time_ms": 1648513334800,
+ "drop_pct": 28374814,
+ "total_tx_pps": 4621231,
+ "tx_pps": 4650296,
+ "tx_pkts": 46212317,
+ "drop_percentage": 61.40097671363243
+ },
+ {
+ "rx_pps": 1920709.0456904878,
+ "rx_pkts": 19088969,
+ "time_ms": 1648513347304,
+ "drop_pct": 4019517,
+ "total_tx_pps": 2310848,
+ "tx_pps": 2325148,
+ "tx_pkts": 23108486,
+ "drop_percentage": 17.394116602879134
+ },
+ {
+ "rx_pps": 1161713.5081454054,
+ "rx_pkts": 11545692,
+ "time_ms": 1648513359821,
+ "drop_pct": 8552,
+ "total_tx_pps": 1155424,
+ "tx_pps": 1162574,
+ "tx_pkts": 11554244,
+ "drop_percentage": 0.07401609313426305
+ },
+ {
+ "rx_pps": 581251.9908500996,
+ "rx_pkts": 5776774,
+ "time_ms": 1648513372321,
+ "drop_pct": 338,
+ "total_tx_pps": 577711,
+ "tx_pps": 581286,
+ "tx_pkts": 5777112,
+ "drop_percentage": 0.005850674177686014
+ },
+ {
+ "rx_pps": 290642.0,
+ "rx_pkts": 2888548,
+ "time_ms": 1648513384819,
+ "drop_pct": 0,
+ "total_tx_pps": 288854,
+ "tx_pps": 290642,
+ "tx_pkts": 2888548,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 435944.8824348059,
+ "rx_pkts": 4332640,
+ "time_ms": 1648513397325,
+ "drop_pct": 190,
+ "total_tx_pps": 433283,
+ "tx_pps": 435964,
+ "tx_pkts": 4332830,
+ "drop_percentage": 0.0043851247337190705
+ },
+ {
+ "rx_pps": 363304.0,
+ "rx_pkts": 3610699,
+ "time_ms": 1648513409876,
+ "drop_pct": 0,
+ "total_tx_pps": 361069,
+ "tx_pps": 363304,
+ "tx_pkts": 3610699,
+ "ndr_pps": 181652,
+ "drop_percentage": 0.0
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 128,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "2f9d3285d24c4aa38cce7d6e7e01cee8"
+ },
+ "synthesis": {
+ "avg_delay_usec": 91.50007602406072,
+ "total_tx_rate": 361069
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_128-fc_128-rate_ndr-2.json",
+ "frame_sizes": [
+ "128"
+ ],
+ "rate": "ndr",
+ "flow_count": "128",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-29 00:28:22",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "a2a3552c4052460aae598a9a2f15a5af",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "128"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 128,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_128-fc_128-rate_ndr-2.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "128"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2519,
+ 2504
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_128-fc_128-rate_ndr-2.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "128": {
+ "ndr": {
+ "load_percent_per_direction": 1.5625,
+ "timestamp_sec": 1648513842.6383016,
+ "stats": {
+ "total_tx_rate": 655714,
+ "overall": {
+ "rx_pkts": 6557144,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 297,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 6557144,
+ "avg_delay_usec": 144.50047810449183,
+ "min_delay_usec": 32,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 3278407,
+ "min_delay_usec": 32,
+ "drop_pct": 0,
+ "max_delay_usec": 297,
+ "tx_pkts": 3278737,
+ "avg_delay_usec": 135,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 3278737,
+ "min_delay_usec": 35,
+ "drop_pct": 0,
+ "max_delay_usec": 285,
+ "tx_pkts": 3278407,
+ "avg_delay_usec": 154,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 776365376.0,
+ "theoretical_tx_rate_pps": 42229729.72972973
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 3.125,
+ "duration_sec": 10.0,
+ "l2frame_size": "128",
+ "rate_pps": 659838,
+ "rate_bps": 781250000.0,
+ "time_taken_sec": 137.85558819770813
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 437885.75742536853,
+ "rx_pkts": 4035817,
+ "time_ms": 1648513717287,
+ "drop_pct": 385178610,
+ "total_tx_pps": 38921442,
+ "tx_pps": 42229728,
+ "tx_pkts": 389214427,
+ "drop_percentage": 98.96308648394475
+ },
+ {
+ "rx_pps": 514776.8413086158,
+ "rx_pkts": 5125891,
+ "time_ms": 1648513729860,
+ "drop_pct": 205125392,
+ "total_tx_pps": 21025128,
+ "tx_pps": 21114864,
+ "tx_pkts": 210251283,
+ "drop_percentage": 97.5620167797026
+ },
+ {
+ "rx_pps": 432863.9814335654,
+ "rx_pkts": 4301586,
+ "time_ms": 1648513742365,
+ "drop_pct": 100612899,
+ "total_tx_pps": 10491448,
+ "tx_pps": 10557432,
+ "tx_pkts": 104914485,
+ "drop_percentage": 95.89991219992167
+ },
+ {
+ "rx_pps": 464230.29844768636,
+ "rx_pkts": 4613753,
+ "time_ms": 1648513754871,
+ "drop_pct": 47848768,
+ "total_tx_pps": 5246252,
+ "tx_pps": 5278716,
+ "tx_pkts": 52462521,
+ "drop_percentage": 91.20562086598926
+ },
+ {
+ "rx_pps": 2260538.697414863,
+ "rx_pkts": 22466366,
+ "time_ms": 1648513767378,
+ "drop_pct": 3764896,
+ "total_tx_pps": 2623126,
+ "tx_pps": 2639358,
+ "tx_pkts": 26231262,
+ "drop_percentage": 14.352706324232512
+ },
+ {
+ "rx_pps": 1312938.9549736879,
+ "rx_pkts": 13048644,
+ "time_ms": 1648513780029,
+ "drop_pct": 66976,
+ "total_tx_pps": 1311562,
+ "tx_pps": 1319678,
+ "tx_pkts": 13115620,
+ "drop_percentage": 0.510658283786813
+ },
+ {
+ "rx_pps": 659838.0,
+ "rx_pkts": 6557144,
+ "time_ms": 1648513792527,
+ "drop_pct": 0,
+ "total_tx_pps": 655714,
+ "tx_pps": 659838,
+ "tx_pkts": 6557144,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 988639.1634389523,
+ "rx_pkts": 9825098,
+ "time_ms": 1648513805064,
+ "drop_pct": 11119,
+ "total_tx_pps": 983621,
+ "tx_pps": 989758,
+ "tx_pkts": 9836217,
+ "drop_percentage": 0.11304142639390734
+ },
+ {
+ "rx_pps": 824644.053266355,
+ "rx_pkts": 8195727,
+ "time_ms": 1648513817582,
+ "drop_pct": 1530,
+ "total_tx_pps": 819725,
+ "tx_pps": 824798,
+ "tx_pkts": 8197257,
+ "drop_percentage": 0.018664780181955987
+ },
+ {
+ "rx_pps": 741931.4226302601,
+ "rx_pkts": 7373687,
+ "time_ms": 1648513830132,
+ "drop_pct": 3842,
+ "total_tx_pps": 737752,
+ "tx_pps": 742318,
+ "tx_pkts": 7377529,
+ "drop_percentage": 0.05207705723691496
+ },
+ {
+ "rx_pps": 700991.5684744361,
+ "rx_pkts": 6966807,
+ "time_ms": 1648513842637,
+ "drop_pct": 859,
+ "total_tx_pps": 696766,
+ "tx_pps": 701078,
+ "tx_pkts": 6967666,
+ "ndr_pps": 329919,
+ "drop_percentage": 0.012328375097198975
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 128,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "a2a3552c4052460aae598a9a2f15a5af"
+ },
+ "synthesis": {
+ "avg_delay_usec": 144.50047810449183,
+ "total_tx_rate": 655714
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_256-fc_128-rate_ndr-2.json",
+ "frame_sizes": [
+ "256"
+ ],
+ "rate": "ndr",
+ "flow_count": "128",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-29 00:30:46",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "b5ded3ef32b240bb8264ea8b1a53b1c7",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "256"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 128,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_256-fc_128-rate_ndr-0.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "256"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2519,
+ 2504
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_256-fc_128-rate_ndr-0.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "256": {
+ "ndr": {
+ "load_percent_per_direction": 1.46484375,
+ "timestamp_sec": 1648513986.98413,
+ "stats": {
+ "total_tx_rate": 330004,
+ "overall": {
+ "rx_pkts": 3300040,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 1086,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 3300040,
+ "avg_delay_usec": 139.50062878025722,
+ "min_delay_usec": 31,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1649937,
+ "min_delay_usec": 31,
+ "drop_pct": 0,
+ "max_delay_usec": 293,
+ "tx_pkts": 1650103,
+ "avg_delay_usec": 127,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 1650103,
+ "min_delay_usec": 32,
+ "drop_pct": 0,
+ "max_delay_usec": 1086,
+ "tx_pkts": 1649937,
+ "avg_delay_usec": 152,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 728648832.0,
+ "theoretical_tx_rate_pps": 22644927.536231883
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 2.9296875,
+ "duration_sec": 10.0,
+ "l2frame_size": "256",
+ "rate_pps": 331712,
+ "rate_bps": 732421874.0,
+ "time_taken_sec": 137.723162651062
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 414547.50338899135,
+ "rx_pkts": 3772754,
+ "time_ms": 1648513861746,
+ "drop_pct": 202316378,
+ "total_tx_pps": 20608913,
+ "tx_pps": 22644926,
+ "tx_pkts": 206089132,
+ "drop_percentage": 98.16935810084347
+ },
+ {
+ "rx_pps": 483450.9476070763,
+ "rx_pkts": 4804294,
+ "time_ms": 1648513874342,
+ "drop_pct": 107712677,
+ "total_tx_pps": 11251697,
+ "tx_pps": 11322462,
+ "tx_pkts": 112516971,
+ "drop_percentage": 95.73016056395618
+ },
+ {
+ "rx_pps": 824045.7574638664,
+ "rx_pkts": 8189779,
+ "time_ms": 1648513886844,
+ "drop_pct": 48074357,
+ "total_tx_pps": 5626413,
+ "tx_pps": 5661230,
+ "tx_pkts": 56264136,
+ "drop_percentage": 85.4440508959384
+ },
+ {
+ "rx_pps": 2016586.653705108,
+ "rx_pkts": 20041847,
+ "time_ms": 1648513899359,
+ "drop_pct": 8090211,
+ "total_tx_pps": 2813205,
+ "tx_pps": 2830614,
+ "tx_pkts": 28132058,
+ "drop_percentage": 28.757977820179384
+ },
+ {
+ "rx_pps": 1392997.5749045208,
+ "rx_pkts": 13842915,
+ "time_ms": 1648513911857,
+ "drop_pct": 221690,
+ "total_tx_pps": 1406460,
+ "tx_pps": 1415306,
+ "tx_pkts": 14064605,
+ "drop_percentage": 1.5762262786619319
+ },
+ {
+ "rx_pps": 707431.7454844667,
+ "rx_pkts": 7030812,
+ "time_ms": 1648513924415,
+ "drop_pct": 2189,
+ "total_tx_pps": 703300,
+ "tx_pps": 707652,
+ "tx_pkts": 7033001,
+ "drop_percentage": 0.03112469342745721
+ },
+ {
+ "rx_pps": 353821.1698142399,
+ "rx_pkts": 3516100,
+ "time_ms": 1648513936917,
+ "drop_pct": 48,
+ "total_tx_pps": 351614,
+ "tx_pps": 353826,
+ "tx_pkts": 3516148,
+ "drop_percentage": 0.001365130250490025
+ },
+ {
+ "rx_pps": 176912.0,
+ "rx_pkts": 1758241,
+ "time_ms": 1648513949440,
+ "drop_pct": 0,
+ "total_tx_pps": 175824,
+ "tx_pps": 176912,
+ "tx_pkts": 1758241,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 265368.99381318525,
+ "rx_pkts": 2637373,
+ "time_ms": 1648513961956,
+ "drop_pct": 10,
+ "total_tx_pps": 263738,
+ "tx_pps": 265370,
+ "tx_pkts": 2637383,
+ "drop_percentage": 0.0003791637392066302
+ },
+ {
+ "rx_pps": 309598.0,
+ "rx_pkts": 3076942,
+ "time_ms": 1648513974476,
+ "drop_pct": 0,
+ "total_tx_pps": 307694,
+ "tx_pps": 309598,
+ "tx_pkts": 3076942,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 331712.0,
+ "rx_pkts": 3300040,
+ "time_ms": 1648513986983,
+ "drop_pct": 0,
+ "total_tx_pps": 330004,
+ "tx_pps": 331712,
+ "tx_pkts": 3300040,
+ "ndr_pps": 165856,
+ "drop_percentage": 0.0
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 128,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "b5ded3ef32b240bb8264ea8b1a53b1c7"
+ },
+ "synthesis": {
+ "avg_delay_usec": 139.50062878025722,
+ "total_tx_rate": 330004
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_512-fc_128-rate_ndr-2.json",
+ "frame_sizes": [
+ "512"
+ ],
+ "rate": "ndr",
+ "flow_count": "128",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-29 00:38:00",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "14a1559a15b240baba4ced0f0074e6b2",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "512"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 128,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_512-fc_128-rate_ndr-0.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "512"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2519,
+ 2504
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_512-fc_128-rate_ndr-0.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "512": {
+ "ndr": {
+ "load_percent_per_direction": 3.515625,
+ "timestamp_sec": 1648514420.241935,
+ "stats": {
+ "total_tx_rate": 410478,
+ "overall": {
+ "rx_pkts": 4104780,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 2294,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 4104780,
+ "avg_delay_usec": 102.50042657584572,
+ "min_delay_usec": 25,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 2052287,
+ "min_delay_usec": 25,
+ "drop_pct": 0,
+ "max_delay_usec": 178,
+ "tx_pkts": 2052493,
+ "avg_delay_usec": 94,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 2052493,
+ "min_delay_usec": 32,
+ "drop_pct": 0,
+ "max_delay_usec": 2294,
+ "tx_pkts": 2052287,
+ "avg_delay_usec": 111,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 1746994368.0,
+ "theoretical_tx_rate_pps": 11748120.30075188
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 7.03125,
+ "duration_sec": 10.0,
+ "l2frame_size": "512",
+ "rate_pps": 413018,
+ "rate_bps": 1757812500.0,
+ "time_taken_sec": 137.53734683990479
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 524663.0616057739,
+ "rx_pkts": 4997001,
+ "time_ms": 1648514295209,
+ "drop_pct": 106894557,
+ "total_tx_pps": 11189155,
+ "tx_pps": 11748120,
+ "tx_pkts": 111891558,
+ "drop_percentage": 95.53406790528379
+ },
+ {
+ "rx_pps": 544892.1971034479,
+ "rx_pkts": 5414866,
+ "time_ms": 1648514307703,
+ "drop_pct": 52958603,
+ "total_tx_pps": 5837346,
+ "tx_pps": 5874060,
+ "tx_pkts": 58373469,
+ "drop_percentage": 90.72375499903903
+ },
+ {
+ "rx_pps": 1890962.4682001427,
+ "rx_pkts": 18793332,
+ "time_ms": 1648514320196,
+ "drop_pct": 10396343,
+ "total_tx_pps": 2918967,
+ "tx_pps": 2937030,
+ "tx_pkts": 29189675,
+ "drop_percentage": 35.61650823450415
+ },
+ {
+ "rx_pps": 1457857.666167266,
+ "rx_pkts": 14488922,
+ "time_ms": 1648514332694,
+ "drop_pct": 105908,
+ "total_tx_pps": 1459483,
+ "tx_pps": 1468514,
+ "tx_pkts": 14594830,
+ "drop_percentage": 0.7256542213920957
+ },
+ {
+ "rx_pps": 734180.9171085032,
+ "rx_pkts": 7304369,
+ "time_ms": 1648514345200,
+ "drop_pct": 747,
+ "total_tx_pps": 730511,
+ "tx_pps": 734256,
+ "tx_pkts": 7305116,
+ "drop_percentage": 0.010225710310418069
+ },
+ {
+ "rx_pps": 367128.0,
+ "rx_pkts": 3648705,
+ "time_ms": 1648514357697,
+ "drop_pct": 0,
+ "total_tx_pps": 364870,
+ "tx_pps": 367128,
+ "tx_pkts": 3648705,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 549710.0929020192,
+ "rx_pkts": 5462911,
+ "time_ms": 1648514370202,
+ "drop_pct": 9758,
+ "total_tx_pps": 547266,
+ "tx_pps": 550692,
+ "tx_pkts": 5472669,
+ "drop_percentage": 0.17830422413634006
+ },
+ {
+ "rx_pps": 458905.1702994093,
+ "rx_pkts": 4560831,
+ "time_ms": 1648514382706,
+ "drop_pct": 48,
+ "total_tx_pps": 456087,
+ "tx_pps": 458910,
+ "tx_pkts": 4560879,
+ "drop_percentage": 0.0010524287094658728
+ },
+ {
+ "rx_pps": 413018.0,
+ "rx_pkts": 4104780,
+ "time_ms": 1648514395211,
+ "drop_pct": 0,
+ "total_tx_pps": 410478,
+ "tx_pps": 413018,
+ "tx_pkts": 4104780,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 435770.00100064784,
+ "rx_pkts": 4335260,
+ "time_ms": 1648514407739,
+ "drop_pct": 1930,
+ "total_tx_pps": 433719,
+ "tx_pps": 435964,
+ "tx_pkts": 4337190,
+ "drop_percentage": 0.04449885755523738
+ },
+ {
+ "rx_pps": 424408.48645580024,
+ "rx_pkts": 4217987,
+ "time_ms": 1648514420241,
+ "drop_pct": 830,
+ "total_tx_pps": 421881,
+ "tx_pps": 424492,
+ "tx_pkts": 4218817,
+ "ndr_pps": 206509,
+ "drop_percentage": 0.019673761625593145
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 128,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "14a1559a15b240baba4ced0f0074e6b2"
+ },
+ "synthesis": {
+ "avg_delay_usec": 102.50042657584572,
+ "total_tx_rate": 410478
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_768-fc_128-rate_ndr-2.json",
+ "frame_sizes": [
+ "768"
+ ],
+ "rate": "ndr",
+ "flow_count": "128",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-29 00:50:01",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "8dd3beb2954d49b59cfca0b597a08ad2",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "768"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 128,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_768-fc_128-rate_ndr-2.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "768"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2519,
+ 2504
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_768-fc_128-rate_ndr-2.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "768": {
+ "ndr": {
+ "load_percent_per_direction": 5.46875,
+ "timestamp_sec": 1648515142.0455678,
+ "stats": {
+ "total_tx_rate": 431865,
+ "overall": {
+ "rx_pkts": 4318624,
+ "drop_percentage": 0.0006715056754965032,
+ "drop_pct": 29,
+ "max_delay_usec": 4023,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 4318653,
+ "avg_delay_usec": 116.9997614981068,
+ "min_delay_usec": 31,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 2159209,
+ "min_delay_usec": 31,
+ "drop_pct": 9,
+ "max_delay_usec": 2684,
+ "tx_pkts": 2159435,
+ "avg_delay_usec": 122,
+ "drop_percentage": 0.0004167756843804051
+ },
+ "0": {
+ "rx_pkts": 2159415,
+ "min_delay_usec": 31,
+ "drop_pct": 20,
+ "max_delay_usec": 4023,
+ "tx_pkts": 2159218,
+ "avg_delay_usec": 112,
+ "drop_percentage": 0.0009262612668104841
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 2722476960.0,
+ "theoretical_tx_rate_pps": 7931472.081218274
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 10.9375,
+ "duration_sec": 10.0,
+ "l2frame_size": "768",
+ "rate_pps": 433752,
+ "rate_bps": 2734375000.0,
+ "time_taken_sec": 137.69723057746887
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 1902578.374437825,
+ "rx_pkts": 18430452,
+ "time_ms": 1648515016843,
+ "drop_pct": 58402448,
+ "total_tx_pps": 7683290,
+ "tx_pps": 7931472,
+ "tx_pkts": 76832900,
+ "drop_percentage": 76.01229160945377
+ },
+ {
+ "rx_pps": 1725307.3463774815,
+ "rx_pkts": 17171122,
+ "time_ms": 1648515029432,
+ "drop_pct": 22297867,
+ "total_tx_pps": 3946898,
+ "tx_pps": 3965736,
+ "tx_pkts": 39468989,
+ "drop_percentage": 56.49464950825064
+ },
+ {
+ "rx_pps": 1801127.1402490556,
+ "rx_pkts": 17898703,
+ "time_ms": 1648515041929,
+ "drop_pct": 1806050,
+ "total_tx_pps": 1970475,
+ "tx_pps": 1982868,
+ "tx_pkts": 19704753,
+ "drop_percentage": 9.16555513281491
+ },
+ {
+ "rx_pps": 988562.2393063733,
+ "rx_pkts": 9824828,
+ "time_ms": 1648515054424,
+ "drop_pct": 28541,
+ "total_tx_pps": 985336,
+ "tx_pps": 991434,
+ "tx_pkts": 9853369,
+ "drop_percentage": 0.28965727356805576
+ },
+ {
+ "rx_pps": 495697.1842930203,
+ "rx_pkts": 4926489,
+ "time_ms": 1648515066934,
+ "drop_pct": 187,
+ "total_tx_pps": 492667,
+ "tx_pps": 495716,
+ "tx_pkts": 4926676,
+ "drop_percentage": 0.00379566263338608
+ },
+ {
+ "rx_pps": 247858.0,
+ "rx_pkts": 2463092,
+ "time_ms": 1648515079432,
+ "drop_pct": 0,
+ "total_tx_pps": 246309,
+ "tx_pps": 247858,
+ "tx_pkts": 2463092,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 371783.78616389656,
+ "rx_pkts": 3694602,
+ "time_ms": 1648515091948,
+ "drop_pct": 22,
+ "total_tx_pps": 369462,
+ "tx_pps": 371786,
+ "tx_pkts": 3694624,
+ "drop_percentage": 0.0005954597815636991
+ },
+ {
+ "rx_pps": 433749.0873307024,
+ "rx_pkts": 4318624,
+ "time_ms": 1648515104463,
+ "drop_pct": 29,
+ "total_tx_pps": 431865,
+ "tx_pps": 433752,
+ "tx_pkts": 4318653,
+ "drop_percentage": 0.0006715056754965032
+ },
+ {
+ "rx_pps": 463811.53496571037,
+ "rx_pkts": 4609129,
+ "time_ms": 1648515117017,
+ "drop_pct": 9167,
+ "total_tx_pps": 461829,
+ "tx_pps": 464734,
+ "tx_pkts": 4618296,
+ "drop_percentage": 0.19849312387079562
+ },
+ {
+ "rx_pps": 449083.4088627579,
+ "rx_pkts": 4462768,
+ "time_ms": 1648515129513,
+ "drop_pct": 1576,
+ "total_tx_pps": 446434,
+ "tx_pps": 449242,
+ "tx_pkts": 4464344,
+ "drop_percentage": 0.03530193909788314
+ },
+ {
+ "rx_pps": 441182.37132601463,
+ "rx_pkts": 4384693,
+ "time_ms": 1648515142044,
+ "drop_pct": 3117,
+ "total_tx_pps": 438781,
+ "tx_pps": 441496,
+ "tx_pkts": 4387810,
+ "ndr_pps": 216876,
+ "drop_percentage": 0.07103771585369467
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 128,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "8dd3beb2954d49b59cfca0b597a08ad2"
+ },
+ "synthesis": {
+ "avg_delay_usec": 116.9997614981068,
+ "total_tx_rate": 431865
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1024-fc_128-rate_ndr-2.json",
+ "frame_sizes": [
+ "1024"
+ ],
+ "rate": "ndr",
+ "flow_count": "128",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-29 00:52:26",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "75405003766f40e9b542c75124035b57",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "1024"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 128,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1024-fc_128-rate_ndr-0.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "1024"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2519,
+ 2504
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1024-fc_128-rate_ndr-0.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "1024": {
+ "ndr": {
+ "load_percent_per_direction": 6.73828125,
+ "timestamp_sec": 1648515286.889274,
+ "stats": {
+ "total_tx_rate": 401294,
+ "overall": {
+ "rx_pkts": 4012912,
+ "drop_percentage": 0.0008472578499685767,
+ "drop_pct": 34,
+ "max_delay_usec": 328,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 4012946,
+ "avg_delay_usec": 111.00076054496087,
+ "min_delay_usec": 34,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 2006238,
+ "min_delay_usec": 34,
+ "drop_pct": 34,
+ "max_delay_usec": 326,
+ "tx_pkts": 2006674,
+ "avg_delay_usec": 104,
+ "drop_percentage": 0.001694345967506431
+ },
+ "0": {
+ "rx_pkts": 2006674,
+ "min_delay_usec": 34,
+ "drop_pct": 0,
+ "max_delay_usec": 328,
+ "tx_pkts": 2006272,
+ "avg_delay_usec": 118,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 3351607488.0,
+ "theoretical_tx_rate_pps": 5986590.038314176
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 13.4765625,
+ "duration_sec": 10.0,
+ "l2frame_size": "1024",
+ "rate_pps": 403392,
+ "rate_bps": 3369140624.0,
+ "time_taken_sec": 137.79849529266357
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 1930795.241663838,
+ "rx_pkts": 18852856,
+ "time_ms": 1648515161575,
+ "drop_pct": 39601980,
+ "total_tx_pps": 5845483,
+ "tx_pps": 5986590,
+ "tx_pkts": 58454836,
+ "drop_percentage": 67.74799607683443
+ },
+ {
+ "rx_pps": 1762189.8584894312,
+ "rx_pkts": 17511764,
+ "time_ms": 1648515174131,
+ "drop_pct": 12234099,
+ "total_tx_pps": 2974586,
+ "tx_pps": 2993294,
+ "tx_pkts": 29745863,
+ "drop_percentage": 41.12874116309888
+ },
+ {
+ "rx_pps": 1462161.4284772114,
+ "rx_pkts": 14531695,
+ "time_ms": 1648515186630,
+ "drop_pct": 342725,
+ "total_tx_pps": 1487442,
+ "tx_pps": 1496646,
+ "tx_pkts": 14874420,
+ "drop_percentage": 2.3041234548977374
+ },
+ {
+ "rx_pps": 747018.4838640236,
+ "rx_pkts": 7424246,
+ "time_ms": 1648515199145,
+ "drop_pct": 12955,
+ "total_tx_pps": 743720,
+ "tx_pps": 748322,
+ "tx_pkts": 7437201,
+ "drop_percentage": 0.17419187675578487
+ },
+ {
+ "rx_pps": 374159.8993711233,
+ "rx_pkts": 3718216,
+ "time_ms": 1648515211671,
+ "drop_pct": 1,
+ "total_tx_pps": 371821,
+ "tx_pps": 374160,
+ "tx_pkts": 3718217,
+ "drop_percentage": 2.689461104610086e-05
+ },
+ {
+ "rx_pps": 560771.4296064666,
+ "rx_pkts": 5578275,
+ "time_ms": 1648515224196,
+ "drop_pct": 4681,
+ "total_tx_pps": 558295,
+ "tx_pps": 561242,
+ "tx_pkts": 5582956,
+ "drop_percentage": 0.0838444723547884
+ },
+ {
+ "rx_pps": 467650.58381987753,
+ "rx_pkts": 4647748,
+ "time_ms": 1648515236753,
+ "drop_pct": 511,
+ "total_tx_pps": 464825,
+ "tx_pps": 467702,
+ "tx_pkts": 4648259,
+ "drop_percentage": 0.010993363321622138
+ },
+ {
+ "rx_pps": 420590.6668502663,
+ "rx_pkts": 4179622,
+ "time_ms": 1648515249317,
+ "drop_pct": 3392,
+ "total_tx_pps": 418301,
+ "tx_pps": 420932,
+ "tx_pkts": 4183014,
+ "drop_percentage": 0.08108985530528943
+ },
+ {
+ "rx_pps": 397542.8805052174,
+ "rx_pkts": 3950585,
+ "time_ms": 1648515261830,
+ "drop_pct": 31,
+ "total_tx_pps": 395061,
+ "tx_pps": 397546,
+ "tx_pkts": 3950616,
+ "drop_percentage": 0.0007846877550235204
+ },
+ {
+ "rx_pps": 409151.5902254465,
+ "rx_pkts": 4067378,
+ "time_ms": 1648515274351,
+ "drop_pct": 859,
+ "total_tx_pps": 406823,
+ "tx_pps": 409238,
+ "tx_pkts": 4068237,
+ "drop_percentage": 0.02111479739258062
+ },
+ {
+ "rx_pps": 403388.5822296139,
+ "rx_pkts": 4012912,
+ "time_ms": 1648515286888,
+ "drop_pct": 34,
+ "total_tx_pps": 401294,
+ "tx_pps": 403392,
+ "tx_pkts": 4012946,
+ "ndr_pps": 201696,
+ "drop_percentage": 0.0008472578499685767
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 128,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "75405003766f40e9b542c75124035b57"
+ },
+ "synthesis": {
+ "avg_delay_usec": 111.00076054496087,
+ "total_tx_rate": 401294
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1280-fc_128-rate_ndr-2.json",
+ "frame_sizes": [
+ "1280"
+ ],
+ "rate": "ndr",
+ "flow_count": "128",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-29 00:59:40",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "f6fbe0374ea244fabde658db4f3248c1",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "1280"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 128,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1280-fc_128-rate_ndr-0.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "1280"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2519,
+ 2504
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1280-fc_128-rate_ndr-0.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "1280": {
+ "ndr": {
+ "load_percent_per_direction": 8.3984375,
+ "timestamp_sec": 1648515720.6989858,
+ "stats": {
+ "total_tx_rate": 401408,
+ "overall": {
+ "rx_pkts": 4014082,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 1461,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 4014082,
+ "avg_delay_usec": 129.00015096851533,
+ "min_delay_usec": 33,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 2006940,
+ "min_delay_usec": 36,
+ "drop_pct": 0,
+ "max_delay_usec": 615,
+ "tx_pkts": 2007142,
+ "avg_delay_usec": 126,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 2007142,
+ "min_delay_usec": 33,
+ "drop_pct": 0,
+ "max_delay_usec": 1461,
+ "tx_pkts": 2006940,
+ "avg_delay_usec": 132,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 4174643200.0,
+ "theoretical_tx_rate_pps": 4807692.307692308
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 16.796875,
+ "duration_sec": 10.0,
+ "l2frame_size": "1280",
+ "rate_pps": 403770,
+ "rate_bps": 4199218750.0,
+ "time_taken_sec": 137.7598237991333
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 1782209.6840959138,
+ "rx_pkts": 17492199,
+ "time_ms": 1648515595424,
+ "drop_pct": 29694788,
+ "total_tx_pps": 4718698,
+ "tx_pps": 4807692,
+ "tx_pkts": 47186987,
+ "drop_percentage": 62.93003619832731
+ },
+ {
+ "rx_pps": 1746211.0920846344,
+ "rx_pkts": 17352973,
+ "time_ms": 1648515608019,
+ "drop_pct": 6535247,
+ "total_tx_pps": 2388822,
+ "tx_pps": 2403846,
+ "tx_pkts": 23888220,
+ "drop_percentage": 27.357613920166507
+ },
+ {
+ "rx_pps": 1194285.0711804812,
+ "rx_pkts": 11868211,
+ "time_ms": 1648515620524,
+ "drop_pct": 75892,
+ "total_tx_pps": 1194410,
+ "tx_pps": 1201922,
+ "tx_pkts": 11944103,
+ "drop_percentage": 0.6353930470961276
+ },
+ {
+ "rx_pps": 600176.2805216585,
+ "rx_pkts": 5964855,
+ "time_ms": 1648515633020,
+ "drop_pct": 7789,
+ "total_tx_pps": 597264,
+ "tx_pps": 600960,
+ "tx_pkts": 5972644,
+ "drop_percentage": 0.13041125504885273
+ },
+ {
+ "rx_pps": 300480.0,
+ "rx_pkts": 2986022,
+ "time_ms": 1648515645545,
+ "drop_pct": 0,
+ "total_tx_pps": 298602,
+ "tx_pps": 300480,
+ "tx_pkts": 2986022,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 450690.71758913517,
+ "rx_pkts": 4478832,
+ "time_ms": 1648515658043,
+ "drop_pct": 291,
+ "total_tx_pps": 447912,
+ "tx_pps": 450720,
+ "tx_pkts": 4479123,
+ "drop_percentage": 0.006496807522365427
+ },
+ {
+ "rx_pps": 375598.59119610087,
+ "rx_pkts": 3732514,
+ "time_ms": 1648515670558,
+ "drop_pct": 14,
+ "total_tx_pps": 373252,
+ "tx_pps": 375600,
+ "tx_pkts": 3732528,
+ "drop_percentage": 0.0003750809103106527
+ },
+ {
+ "rx_pps": 413028.79315219715,
+ "rx_pkts": 4104889,
+ "time_ms": 1648515683111,
+ "drop_pct": 1304,
+ "total_tx_pps": 410619,
+ "tx_pps": 413160,
+ "tx_pkts": 4106193,
+ "drop_percentage": 0.03175690962407271
+ },
+ {
+ "rx_pps": 394380.0,
+ "rx_pkts": 3919155,
+ "time_ms": 1648515695623,
+ "drop_pct": 0,
+ "total_tx_pps": 391915,
+ "tx_pps": 394380,
+ "tx_pkts": 3919155,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 403770.0,
+ "rx_pkts": 4014082,
+ "time_ms": 1648515708195,
+ "drop_pct": 0,
+ "total_tx_pps": 401408,
+ "tx_pps": 403770,
+ "tx_pkts": 4014082,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 408041.4893278549,
+ "rx_pkts": 4055321,
+ "time_ms": 1648515720698,
+ "drop_pct": 4219,
+ "total_tx_pps": 405954,
+ "tx_pps": 408466,
+ "tx_pkts": 4059540,
+ "ndr_pps": 201885,
+ "drop_percentage": 0.10392803125477271
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 128,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "f6fbe0374ea244fabde658db4f3248c1"
+ },
+ "synthesis": {
+ "avg_delay_usec": 129.00015096851533,
+ "total_tx_rate": 401408
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1518-fc_128-rate_ndr-2.json",
+ "frame_sizes": [
+ "1518"
+ ],
+ "rate": "ndr",
+ "flow_count": "128",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-29 01:11:42",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "aa22a77595534177821bc1ddb05bf7d5",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "1518"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 128,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1518-fc_128-rate_ndr-2.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "1518"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2519,
+ 2504
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1518-fc_128-rate_ndr-2.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "1518": {
+ "ndr": {
+ "load_percent_per_direction": 10.3515625,
+ "timestamp_sec": 1648516442.9958127,
+ "stats": {
+ "total_tx_rate": 418029,
+ "overall": {
+ "rx_pkts": 4180291,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 614,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 4180291,
+ "avg_delay_usec": 133.0,
+ "min_delay_usec": 35,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 2090041,
+ "min_delay_usec": 35,
+ "drop_pct": 0,
+ "max_delay_usec": 614,
+ "tx_pkts": 2090250,
+ "avg_delay_usec": 133,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 2090250,
+ "min_delay_usec": 35,
+ "drop_pct": 0,
+ "max_delay_usec": 256,
+ "tx_pkts": 2090041,
+ "avg_delay_usec": 133,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 5143428816.0,
+ "theoretical_tx_rate_pps": 4063719.1157347206
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 20.703125,
+ "duration_sec": 10.0,
+ "l2frame_size": "1518",
+ "rate_pps": 420658,
+ "rate_bps": 5175781250.0,
+ "time_taken_sec": 137.71833491325378
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 1525365.0868388722,
+ "rx_pkts": 15001649,
+ "time_ms": 1648516317782,
+ "drop_pct": 24964174,
+ "total_tx_pps": 3996582,
+ "tx_pps": 4063718,
+ "tx_pkts": 39965823,
+ "drop_percentage": 62.46380563713151
+ },
+ {
+ "rx_pps": 1496120.4701008687,
+ "rx_pkts": 14867698,
+ "time_ms": 1648516330341,
+ "drop_pct": 5323892,
+ "total_tx_pps": 2019159,
+ "tx_pps": 2031858,
+ "tx_pkts": 20191590,
+ "drop_percentage": 26.36687848752872
+ },
+ {
+ "rx_pps": 1014361.6676065021,
+ "rx_pkts": 10081237,
+ "time_ms": 1648516342836,
+ "drop_pct": 15567,
+ "total_tx_pps": 1009680,
+ "tx_pps": 1015928,
+ "tx_pkts": 10096804,
+ "drop_percentage": 0.1541775001277632
+ },
+ {
+ "rx_pps": 507610.12378570484,
+ "rx_pkts": 5044885,
+ "time_ms": 1648516355360,
+ "drop_pct": 3517,
+ "total_tx_pps": 504840,
+ "tx_pps": 507964,
+ "tx_pkts": 5048402,
+ "drop_percentage": 0.06966560903826596
+ },
+ {
+ "rx_pps": 253982.0,
+ "rx_pkts": 2532329,
+ "time_ms": 1648516367908,
+ "drop_pct": 0,
+ "total_tx_pps": 253232,
+ "tx_pps": 253982,
+ "tx_pkts": 2532329,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 380972.0,
+ "rx_pkts": 3786292,
+ "time_ms": 1648516380404,
+ "drop_pct": 0,
+ "total_tx_pps": 378629,
+ "tx_pps": 380972,
+ "tx_pkts": 3786292,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 444318.68175264477,
+ "rx_pkts": 4415863,
+ "time_ms": 1648516392915,
+ "drop_pct": 1484,
+ "total_tx_pps": 441734,
+ "tx_pps": 444468,
+ "tx_pkts": 4417347,
+ "drop_percentage": 0.03359482512920085
+ },
+ {
+ "rx_pps": 412715.9748437487,
+ "rx_pkts": 4101366,
+ "time_ms": 1648516405442,
+ "drop_pct": 40,
+ "total_tx_pps": 410140,
+ "tx_pps": 412720,
+ "tx_pkts": 4101406,
+ "drop_percentage": 0.0009752753080285151
+ },
+ {
+ "rx_pps": 428567.63523947,
+ "rx_pkts": 4258894,
+ "time_ms": 1648516417960,
+ "drop_pct": 262,
+ "total_tx_pps": 425915,
+ "tx_pps": 428594,
+ "tx_pkts": 4259156,
+ "drop_percentage": 0.006151453480454813
+ },
+ {
+ "rx_pps": 420658.0,
+ "rx_pkts": 4180291,
+ "time_ms": 1648516430479,
+ "drop_pct": 0,
+ "total_tx_pps": 418029,
+ "tx_pps": 420658,
+ "tx_pkts": 4180291,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 424617.3467837369,
+ "rx_pkts": 4220060,
+ "time_ms": 1648516442994,
+ "drop_pct": 86,
+ "total_tx_pps": 422014,
+ "tx_pps": 424626,
+ "tx_pkts": 4220146,
+ "ndr_pps": 210329,
+ "drop_percentage": 0.0020378441883290295
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 128,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "aa22a77595534177821bc1ddb05bf7d5"
+ },
+ "synthesis": {
+ "avg_delay_usec": 133.0,
+ "total_tx_rate": 418029
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_IMIX-fc_128-rate_ndr-2.json",
+ "frame_sizes": [
+ "IMIX"
+ ],
+ "rate": "ndr",
+ "flow_count": "128",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-29 01:14:06",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "e3cbe4a347a44a80b2c84296b1c8d3cf",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "IMIX"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 128,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_IMIX-fc_128-rate_ndr-0.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "IMIX"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2519,
+ 2504
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_IMIX-fc_128-rate_ndr-0.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "IMIX": {
+ "ndr": {
+ "load_percent_per_direction": 3.125,
+ "timestamp_sec": 1648516587.0061436,
+ "stats": {
+ "total_tx_rate": 508366,
+ "overall": {
+ "rx_pkts": 5083660,
+ "drop_percentage": 9.835423852673218e-05,
+ "drop_pct": 5,
+ "max_delay_usec": 735,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 5083665,
+ "avg_delay_usec": 99.00010228850867,
+ "min_delay_usec": 32,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 2541700,
+ "min_delay_usec": 32,
+ "drop_pct": 5,
+ "max_delay_usec": 218,
+ "tx_pkts": 2541960,
+ "avg_delay_usec": 97,
+ "drop_percentage": 0.0001966986105210153
+ },
+ "0": {
+ "rx_pkts": 2541960,
+ "min_delay_usec": 32,
+ "drop_pct": 0,
+ "max_delay_usec": 735,
+ "tx_pkts": 2541705,
+ "avg_delay_usec": 101,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 1552888674.6666665,
+ "theoretical_tx_rate_pps": 16368398.079441292
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 6.25,
+ "duration_sec": 10.0,
+ "l2frame_size": "IMIX",
+ "rate_pps": 511512,
+ "rate_bps": 1562500000.0,
+ "time_taken_sec": 137.71221041679382
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 455021.45509677904,
+ "rx_pkts": 3962322,
+ "time_ms": 1648516461799,
+ "drop_pct": 138573514,
+ "total_tx_pps": 14253583,
+ "tx_pps": 16368398,
+ "tx_pkts": 142535836,
+ "warning": "WARNING: There is a significant difference between requested TX rate (16368398) and actual TX rate (14253583). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "drop_percentage": 97.22012224350374
+ },
+ {
+ "rx_pps": 368832.99054765597,
+ "rx_pkts": 3665647,
+ "time_ms": 1648516474296,
+ "drop_pct": 77673012,
+ "total_tx_pps": 8133865,
+ "tx_pps": 8184198,
+ "tx_pkts": 81338659,
+ "drop_percentage": 95.49335206030382
+ },
+ {
+ "rx_pps": 895765.8838221595,
+ "rx_pkts": 8911528,
+ "time_ms": 1648516486861,
+ "drop_pct": 31798714,
+ "total_tx_pps": 4071024,
+ "tx_pps": 4092098,
+ "tx_pkts": 40710242,
+ "drop_percentage": 78.10986237812097
+ },
+ {
+ "rx_pps": 1927743.5317661166,
+ "rx_pkts": 19156957,
+ "time_ms": 1648516499376,
+ "drop_pct": 1175651,
+ "total_tx_pps": 2033260,
+ "tx_pps": 2046048,
+ "tx_pkts": 20332608,
+ "drop_percentage": 5.782096423636358
+ },
+ {
+ "rx_pps": 1015634.8922179102,
+ "rx_pkts": 10093386,
+ "time_ms": 1648516511872,
+ "drop_pct": 73433,
+ "total_tx_pps": 1016681,
+ "tx_pps": 1023024,
+ "tx_pkts": 10166819,
+ "drop_percentage": 0.7222809809046468
+ },
+ {
+ "rx_pps": 511511.4969062674,
+ "rx_pkts": 5083660,
+ "time_ms": 1648516524370,
+ "drop_pct": 5,
+ "total_tx_pps": 508366,
+ "tx_pps": 511512,
+ "tx_pkts": 5083665,
+ "drop_percentage": 9.83542385267322e-05
+ },
+ {
+ "rx_pps": 764384.46739517,
+ "rx_pkts": 7596838,
+ "time_ms": 1648516536965,
+ "drop_pct": 28658,
+ "total_tx_pps": 762549,
+ "tx_pps": 767268,
+ "tx_pkts": 7625496,
+ "drop_percentage": 0.37581817628649994
+ },
+ {
+ "rx_pps": 638742.7197819274,
+ "rx_pkts": 6348150,
+ "time_ms": 1648516549474,
+ "drop_pct": 6433,
+ "total_tx_pps": 635458,
+ "tx_pps": 639390,
+ "tx_pkts": 6354583,
+ "drop_percentage": 0.1012340227517683
+ },
+ {
+ "rx_pps": 575150.7598381079,
+ "rx_pkts": 5716139,
+ "time_ms": 1648516561991,
+ "drop_pct": 2974,
+ "total_tx_pps": 571911,
+ "tx_pps": 575450,
+ "tx_pkts": 5719113,
+ "drop_percentage": 0.0520010707954188
+ },
+ {
+ "rx_pps": 543090.4042744632,
+ "rx_pkts": 5397508,
+ "time_ms": 1648516574506,
+ "drop_pct": 3872,
+ "total_tx_pps": 540138,
+ "tx_pps": 543480,
+ "tx_pkts": 5401380,
+ "drop_percentage": 0.0716853841055434
+ },
+ {
+ "rx_pps": 526619.007327005,
+ "rx_pkts": 5233808,
+ "time_ms": 1648516587005,
+ "drop_pct": 8716,
+ "total_tx_pps": 524252,
+ "tx_pps": 527496,
+ "tx_pkts": 5242524,
+ "ndr_pps": 255756,
+ "drop_percentage": 0.16625579587236988
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 128,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "e3cbe4a347a44a80b2c84296b1c8d3cf"
+ },
+ "synthesis": {
+ "avg_delay_usec": 99.00010228850867,
+ "total_tx_rate": 508366
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_9000-fc_128-rate_ndr-2.json",
+ "frame_sizes": [
+ "9000"
+ ],
+ "rate": "ndr",
+ "flow_count": "128",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-29 01:23:45",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "925d13e8fb154949ba8e787ba0a1729c",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "9000"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 128,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_9000-fc_128-rate_ndr-1.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "9000"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2519,
+ 2504
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_9000-fc_128-rate_ndr-1.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "9000": {
+ "ndr": {
+ "load_percent_per_direction": 38.57421875,
+ "timestamp_sec": 1648517165.4413407,
+ "stats": {
+ "total_tx_rate": 265611,
+ "overall": {
+ "rx_pkts": 2656117,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 7688,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 2656117,
+ "avg_delay_usec": 830.5011435866718,
+ "min_delay_usec": 66,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1327991,
+ "min_delay_usec": 67,
+ "drop_pct": 0,
+ "max_delay_usec": 7688,
+ "tx_pkts": 1328126,
+ "avg_delay_usec": 808,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 1328126,
+ "min_delay_usec": 66,
+ "drop_pct": 0,
+ "max_delay_usec": 7031,
+ "tx_pkts": 1327991,
+ "avg_delay_usec": 853,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 19166489760.0,
+ "theoretical_tx_rate_pps": 692904.6563192905
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 77.1484375,
+ "duration_sec": 10.0,
+ "l2frame_size": "9000",
+ "rate_pps": 267282,
+ "rate_bps": 19287109374.0,
+ "time_taken_sec": 137.70768356323242
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 276705.98480457405,
+ "rx_pkts": 2760287,
+ "time_ms": 1648517040238,
+ "drop_pct": 4151793,
+ "total_tx_pps": 691208,
+ "tx_pps": 692904,
+ "tx_pkts": 6912080,
+ "drop_percentage": 60.06575444728649
+ },
+ {
+ "rx_pps": 276650.0833531569,
+ "rx_pkts": 2749212,
+ "time_ms": 1648517052754,
+ "drop_pct": 693657,
+ "total_tx_pps": 344286,
+ "tx_pps": 346452,
+ "tx_pkts": 3442869,
+ "drop_percentage": 20.147644304793474
+ },
+ {
+ "rx_pps": 173226.0,
+ "rx_pkts": 1721435,
+ "time_ms": 1648517065249,
+ "drop_pct": 0,
+ "total_tx_pps": 172143,
+ "tx_pps": 173226,
+ "tx_pkts": 1721435,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 259838.0,
+ "rx_pkts": 2582402,
+ "time_ms": 1648517077745,
+ "drop_pct": 0,
+ "total_tx_pps": 258240,
+ "tx_pps": 259838,
+ "tx_pkts": 2582402,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 276923.8456588822,
+ "rx_pkts": 2751933,
+ "time_ms": 1648517090242,
+ "drop_pct": 260563,
+ "total_tx_pps": 301249,
+ "tx_pps": 303144,
+ "tx_pkts": 3012496,
+ "drop_percentage": 8.649405675559404
+ },
+ {
+ "rx_pps": 276921.0901351833,
+ "rx_pkts": 2752181,
+ "time_ms": 1648517102831,
+ "drop_pct": 45428,
+ "total_tx_pps": 279760,
+ "tx_pps": 281492,
+ "tx_pkts": 2797609,
+ "drop_percentage": 1.623815193617121
+ },
+ {
+ "rx_pps": 270625.96228536376,
+ "rx_pkts": 2689347,
+ "time_ms": 1648517115325,
+ "drop_pct": 378,
+ "total_tx_pps": 268972,
+ "tx_pps": 270664,
+ "tx_pkts": 2689725,
+ "drop_percentage": 0.014053481303850765
+ },
+ {
+ "rx_pps": 265251.6987348664,
+ "rx_pkts": 2641378,
+ "time_ms": 1648517127933,
+ "drop_pct": 3,
+ "total_tx_pps": 264138,
+ "tx_pps": 265252,
+ "tx_pkts": 2641381,
+ "drop_percentage": 0.00011357695084503144
+ },
+ {
+ "rx_pps": 267950.35221095104,
+ "rx_pkts": 2662760,
+ "time_ms": 1648517140447,
+ "drop_pct": 76,
+ "total_tx_pps": 266283,
+ "tx_pps": 267958,
+ "tx_pkts": 2662836,
+ "drop_percentage": 0.0028540999145272184
+ },
+ {
+ "rx_pps": 266604.0,
+ "rx_pkts": 2649380,
+ "time_ms": 1648517152942,
+ "drop_pct": 0,
+ "total_tx_pps": 264938,
+ "tx_pps": 266604,
+ "tx_pkts": 2649380,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 267282.0,
+ "rx_pkts": 2656117,
+ "time_ms": 1648517165440,
+ "drop_pct": 0,
+ "total_tx_pps": 265611,
+ "tx_pps": 267282,
+ "tx_pkts": 2656117,
+ "ndr_pps": 133641,
+ "drop_percentage": 0.0
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 128,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "925d13e8fb154949ba8e787ba0a1729c"
+ },
+ "synthesis": {
+ "avg_delay_usec": 830.5011435866718,
+ "total_tx_rate": 265611
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_64-fc_10k-rate_ndr-2.json",
+ "frame_sizes": [
+ "64"
+ ],
+ "rate": "ndr",
+ "flow_count": "10k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-29 01:33:26",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "0b4fd1e0bc074c0aa72dfedbb7e468e7",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "64"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 10000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_64-fc_10k-rate_ndr-2.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "64"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2519,
+ 2504
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_64-fc_10k-rate_ndr-2.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "64": {
+ "ndr": {
+ "load_percent_per_direction": 0.390625,
+ "timestamp_sec": 1648517749.4090943,
+ "stats": {
+ "total_tx_rate": 288883,
+ "overall": {
+ "rx_pkts": 2888837,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 6981,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 2888837,
+ "avg_delay_usec": 137.00045173888316,
+ "min_delay_usec": 32,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1444346,
+ "min_delay_usec": 32,
+ "drop_pct": 0,
+ "max_delay_usec": 1012,
+ "tx_pkts": 1444491,
+ "avg_delay_usec": 128,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 1444491,
+ "min_delay_usec": 34,
+ "drop_pct": 0,
+ "max_delay_usec": 6981,
+ "tx_pkts": 1444346,
+ "avg_delay_usec": 146,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 194129376.0,
+ "theoretical_tx_rate_pps": 74404761.90476191
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 0.78125,
+ "duration_sec": 10.0,
+ "l2frame_size": "64",
+ "rate_pps": 290642,
+ "rate_bps": 195312500.0,
+ "time_taken_sec": 137.5828468799591
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 2047350.5854726303,
+ "rx_pkts": 11677335,
+ "time_ms": 1648517624315,
+ "drop_pct": 412700060,
+ "total_tx_pps": 42437739,
+ "tx_pps": 74404760,
+ "tx_pkts": 424377395,
+ "warning": "WARNING: There is a significant difference between requested TX rate (74404760) and actual TX rate (42437739). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "drop_percentage": 97.24836074268282
+ },
+ {
+ "rx_pps": 1881821.855161189,
+ "rx_pkts": 18700581,
+ "time_ms": 1648517636807,
+ "drop_pct": 350997602,
+ "total_tx_pps": 36969818,
+ "tx_pps": 37202380,
+ "tx_pkts": 369698183,
+ "drop_percentage": 94.94166272383329
+ },
+ {
+ "rx_pps": 1463366.1136056492,
+ "rx_pkts": 14543665,
+ "time_ms": 1648517649302,
+ "drop_pct": 170324273,
+ "total_tx_pps": 18486793,
+ "tx_pps": 18601190,
+ "tx_pkts": 184867938,
+ "drop_percentage": 92.13294357185939
+ },
+ {
+ "rx_pps": 656372.1947024872,
+ "rx_pkts": 6523357,
+ "time_ms": 1648517661819,
+ "drop_pct": 85910624,
+ "total_tx_pps": 9243398,
+ "tx_pps": 9300594,
+ "tx_pkts": 92433981,
+ "drop_percentage": 92.94268522308911
+ },
+ {
+ "rx_pps": 599368.4857455855,
+ "rx_pkts": 5963417,
+ "time_ms": 1648517674327,
+ "drop_pct": 40304705,
+ "total_tx_pps": 4626812,
+ "tx_pps": 4650296,
+ "tx_pkts": 46268122,
+ "drop_percentage": 87.11117559515382
+ },
+ {
+ "rx_pps": 1877894.057540158,
+ "rx_pkts": 18663453,
+ "time_ms": 1648517686824,
+ "drop_pct": 4445034,
+ "total_tx_pps": 2310848,
+ "tx_pps": 2325148,
+ "tx_pkts": 23108487,
+ "drop_percentage": 19.235504254346033
+ },
+ {
+ "rx_pps": 1160361.5937588983,
+ "rx_pkts": 11532254,
+ "time_ms": 1648517699350,
+ "drop_pct": 21988,
+ "total_tx_pps": 1155424,
+ "tx_pps": 1162574,
+ "tx_pkts": 11554242,
+ "drop_percentage": 0.19030240149029248
+ },
+ {
+ "rx_pps": 580852.4675486998,
+ "rx_pkts": 5778614,
+ "time_ms": 1648517711861,
+ "drop_pct": 4313,
+ "total_tx_pps": 578292,
+ "tx_pps": 581286,
+ "tx_pkts": 5782927,
+ "drop_percentage": 0.07458160893263913
+ },
+ {
+ "rx_pps": 290642.0,
+ "rx_pkts": 2888837,
+ "time_ms": 1648517724365,
+ "drop_pct": 0,
+ "total_tx_pps": 288883,
+ "tx_pps": 290642,
+ "tx_pkts": 2888837,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 435844.4649357429,
+ "rx_pkts": 4331643,
+ "time_ms": 1648517736892,
+ "drop_pct": 1188,
+ "total_tx_pps": 433283,
+ "tx_pps": 435964,
+ "tx_pkts": 4332831,
+ "drop_percentage": 0.027418563059579293
+ },
+ {
+ "rx_pps": 363213.11655764753,
+ "rx_pkts": 3616807,
+ "time_ms": 1648517749408,
+ "drop_pct": 905,
+ "total_tx_pps": 361771,
+ "tx_pps": 363304,
+ "tx_pkts": 3617712,
+ "ndr_pps": 145321,
+ "drop_percentage": 0.025015811098285327
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 10000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "0b4fd1e0bc074c0aa72dfedbb7e468e7"
+ },
+ "synthesis": {
+ "avg_delay_usec": 137.00045173888316,
+ "total_tx_rate": 288883
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_128-fc_10k-rate_ndr-2.json",
+ "frame_sizes": [
+ "128"
+ ],
+ "rate": "ndr",
+ "flow_count": "10k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-29 01:35:53",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "e4caccec03ec4be698325c5827dab2bf",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "128"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 10000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_128-fc_10k-rate_ndr-0.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "128"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2519,
+ 2504
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_128-fc_10k-rate_ndr-0.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "128": {
+ "ndr": {
+ "load_percent_per_direction": 0.87890625,
+ "timestamp_sec": 1648517895.4561322,
+ "stats": {
+ "total_tx_rate": 368857,
+ "overall": {
+ "rx_pkts": 3688572,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 1614,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 3688572,
+ "avg_delay_usec": 103.5,
+ "min_delay_usec": 30,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1844286,
+ "min_delay_usec": 32,
+ "drop_pct": 0,
+ "max_delay_usec": 1614,
+ "tx_pkts": 1844286,
+ "avg_delay_usec": 111,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 1844286,
+ "min_delay_usec": 30,
+ "drop_pct": 0,
+ "max_delay_usec": 224,
+ "tx_pkts": 1844286,
+ "avg_delay_usec": 96,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 436726688.0,
+ "theoretical_tx_rate_pps": 42229729.72972973
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 1.7578125,
+ "duration_sec": 10.0,
+ "l2frame_size": "128",
+ "rate_pps": 371158,
+ "rate_bps": 439453124.0,
+ "time_taken_sec": 137.57411217689514
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 661956.5610575142,
+ "rx_pkts": 6065560,
+ "time_ms": 1648517770397,
+ "drop_pct": 380888757,
+ "total_tx_pps": 38695431,
+ "tx_pps": 42229728,
+ "tx_pkts": 386954317,
+ "drop_percentage": 98.43248679921047
+ },
+ {
+ "rx_pps": 567627.3405718297,
+ "rx_pkts": 5641365,
+ "time_ms": 1648517782894,
+ "drop_pct": 204208736,
+ "total_tx_pps": 20985010,
+ "tx_pps": 21114864,
+ "tx_pkts": 209850101,
+ "drop_percentage": 97.31171680493973
+ },
+ {
+ "rx_pps": 513718.6314666125,
+ "rx_pkts": 5105078,
+ "time_ms": 1648517795390,
+ "drop_pct": 99809384,
+ "total_tx_pps": 10491446,
+ "tx_pps": 10557432,
+ "tx_pkts": 104914462,
+ "drop_percentage": 95.13405692343922
+ },
+ {
+ "rx_pps": 505008.19312182645,
+ "rx_pkts": 5018722,
+ "time_ms": 1648517807887,
+ "drop_pct": 47440641,
+ "total_tx_pps": 5245936,
+ "tx_pps": 5278716,
+ "tx_pkts": 52459363,
+ "drop_percentage": 90.4331243976409
+ },
+ {
+ "rx_pps": 1941280.9663658948,
+ "rx_pkts": 19293422,
+ "time_ms": 1648517820385,
+ "drop_pct": 6937839,
+ "total_tx_pps": 2623126,
+ "tx_pps": 2639358,
+ "tx_pkts": 26231261,
+ "drop_percentage": 26.448743733669534
+ },
+ {
+ "rx_pps": 1314375.0871652274,
+ "rx_pkts": 13062917,
+ "time_ms": 1648517832902,
+ "drop_pct": 52703,
+ "total_tx_pps": 1311562,
+ "tx_pps": 1319678,
+ "tx_pkts": 13115620,
+ "drop_percentage": 0.4018338439204551
+ },
+ {
+ "rx_pps": 659815.2578716066,
+ "rx_pkts": 6556917,
+ "time_ms": 1648517845416,
+ "drop_pct": 226,
+ "total_tx_pps": 655714,
+ "tx_pps": 659838,
+ "tx_pkts": 6557143,
+ "drop_percentage": 0.003446623018592091
+ },
+ {
+ "rx_pps": 329918.0,
+ "rx_pkts": 3278728,
+ "time_ms": 1648517857923,
+ "drop_pct": 0,
+ "total_tx_pps": 327872,
+ "tx_pps": 329918,
+ "tx_pkts": 3278728,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 494566.5692195298,
+ "rx_pkts": 4915004,
+ "time_ms": 1648517870430,
+ "drop_pct": 3095,
+ "total_tx_pps": 491809,
+ "tx_pps": 494878,
+ "tx_pkts": 4918099,
+ "drop_percentage": 0.06293081940806804
+ },
+ {
+ "rx_pps": 412387.6352223387,
+ "rx_pkts": 4098103,
+ "time_ms": 1648517882937,
+ "drop_pct": 103,
+ "total_tx_pps": 409820,
+ "tx_pps": 412398,
+ "tx_pkts": 4098206,
+ "drop_percentage": 0.0025132948416941464
+ },
+ {
+ "rx_pps": 371158.0,
+ "rx_pkts": 3688572,
+ "time_ms": 1648517895455,
+ "drop_pct": 0,
+ "total_tx_pps": 368857,
+ "tx_pps": 371158,
+ "tx_pkts": 3688572,
+ "ndr_pps": 185579,
+ "drop_percentage": 0.0
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 10000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "e4caccec03ec4be698325c5827dab2bf"
+ },
+ "synthesis": {
+ "avg_delay_usec": 103.5,
+ "total_tx_rate": 368857
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_256-fc_10k-rate_ndr-2.json",
+ "frame_sizes": [
+ "256"
+ ],
+ "rate": "ndr",
+ "flow_count": "10k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-29 01:48:05",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "ee681f4905724c8286ee3b3d00a51486",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "256"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 10000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_256-fc_10k-rate_ndr-2.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "256"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2519,
+ 2504
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_256-fc_10k-rate_ndr-2.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "256": {
+ "ndr": {
+ "load_percent_per_direction": 1.66015625,
+ "timestamp_sec": 1648518627.9241369,
+ "stats": {
+ "total_tx_rate": 373628,
+ "overall": {
+ "rx_pkts": 3736281,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 4593,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 3736281,
+ "avg_delay_usec": 95.50017517419059,
+ "min_delay_usec": 28,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1868047,
+ "min_delay_usec": 31,
+ "drop_pct": 0,
+ "max_delay_usec": 4593,
+ "tx_pkts": 1868234,
+ "avg_delay_usec": 92,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 1868234,
+ "min_delay_usec": 28,
+ "drop_pct": 0,
+ "max_delay_usec": 3016,
+ "tx_pkts": 1868047,
+ "avg_delay_usec": 99,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 824970624.0,
+ "theoretical_tx_rate_pps": 22644927.536231883
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 3.3203125,
+ "duration_sec": 10.0,
+ "l2frame_size": "256",
+ "rate_pps": 375940,
+ "rate_bps": 830078124.0,
+ "time_taken_sec": 137.58922338485718
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 501930.18889277824,
+ "rx_pkts": 4559930,
+ "time_ms": 1648518502852,
+ "drop_pct": 201164451,
+ "total_tx_pps": 20572438,
+ "tx_pps": 22644926,
+ "tx_pkts": 205724381,
+ "drop_percentage": 97.78347613548051
+ },
+ {
+ "rx_pps": 504259.6138228798,
+ "rx_pkts": 5011082,
+ "time_ms": 1648518515348,
+ "drop_pct": 107505931,
+ "total_tx_pps": 11251701,
+ "tx_pps": 11322462,
+ "tx_pkts": 112517013,
+ "drop_percentage": 95.54637839523878
+ },
+ {
+ "rx_pps": 508840.8943619289,
+ "rx_pkts": 5056862,
+ "time_ms": 1648518527848,
+ "drop_pct": 51204455,
+ "total_tx_pps": 5626131,
+ "tx_pps": 5661230,
+ "tx_pkts": 56261317,
+ "drop_percentage": 91.0118314507284
+ },
+ {
+ "rx_pps": 2110054.1102349525,
+ "rx_pkts": 20968663,
+ "time_ms": 1648518540374,
+ "drop_pct": 7160564,
+ "total_tx_pps": 2812922,
+ "tx_pps": 2830614,
+ "tx_pkts": 28129227,
+ "drop_percentage": 25.45595725044275
+ },
+ {
+ "rx_pps": 1401072.2638491914,
+ "rx_pkts": 13924558,
+ "time_ms": 1648518552869,
+ "drop_pct": 141462,
+ "total_tx_pps": 1406602,
+ "tx_pps": 1415306,
+ "tx_pkts": 14066020,
+ "drop_percentage": 1.0057002620499615
+ },
+ {
+ "rx_pps": 707351.0491778756,
+ "rx_pkts": 7030009,
+ "time_ms": 1648518565377,
+ "drop_pct": 2991,
+ "total_tx_pps": 703300,
+ "tx_pps": 707652,
+ "tx_pkts": 7033000,
+ "drop_percentage": 0.04252808189961609
+ },
+ {
+ "rx_pps": 353826.0,
+ "rx_pkts": 3516148,
+ "time_ms": 1648518577896,
+ "drop_pct": 0,
+ "total_tx_pps": 351614,
+ "tx_pps": 353826,
+ "tx_pkts": 3516148,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 530715.4490277573,
+ "rx_pkts": 5274519,
+ "time_ms": 1648518590390,
+ "drop_pct": 244,
+ "total_tx_pps": 527476,
+ "tx_pps": 530740,
+ "tx_pkts": 5274763,
+ "drop_percentage": 0.004625800249224468
+ },
+ {
+ "rx_pps": 442276.26473113475,
+ "rx_pkts": 4395565,
+ "time_ms": 1648518602909,
+ "drop_pct": 57,
+ "total_tx_pps": 439562,
+ "tx_pps": 442282,
+ "tx_pkts": 4395622,
+ "drop_percentage": 0.0012967448065370499
+ },
+ {
+ "rx_pps": 397842.9019229471,
+ "rx_pkts": 3953965,
+ "time_ms": 1648518615425,
+ "drop_pct": 2098,
+ "total_tx_pps": 395606,
+ "tx_pps": 398054,
+ "tx_pkts": 3956063,
+ "drop_percentage": 0.053032522485107036
+ },
+ {
+ "rx_pps": 375940.0,
+ "rx_pkts": 3736281,
+ "time_ms": 1648518627923,
+ "drop_pct": 0,
+ "total_tx_pps": 373628,
+ "tx_pps": 375940,
+ "tx_pkts": 3736281,
+ "ndr_pps": 187970,
+ "drop_percentage": 0.0
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 10000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "ee681f4905724c8286ee3b3d00a51486"
+ },
+ "synthesis": {
+ "avg_delay_usec": 95.50017517419059,
+ "total_tx_rate": 373628
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_512-fc_10k-rate_ndr-2.json",
+ "frame_sizes": [
+ "512"
+ ],
+ "rate": "ndr",
+ "flow_count": "10k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-29 01:52:58",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "b053f4a4365e4c55832ccb06c7c724b9",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "512"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 10000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_512-fc_10k-rate_ndr-1.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "512"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2519,
+ 2504
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_512-fc_10k-rate_ndr-1.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "512": {
+ "ndr": {
+ "load_percent_per_direction": 3.7109375,
+ "timestamp_sec": 1648518920.992039,
+ "stats": {
+ "total_tx_rate": 433239,
+ "overall": {
+ "rx_pkts": 4332356,
+ "drop_percentage": 0.0009232766349151833,
+ "drop_pct": 40,
+ "max_delay_usec": 1014,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 4332396,
+ "avg_delay_usec": 101.0000410861896,
+ "min_delay_usec": 32,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 2166089,
+ "min_delay_usec": 32,
+ "drop_pct": 0,
+ "max_delay_usec": 479,
+ "tx_pkts": 2166307,
+ "avg_delay_usec": 100,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 2166267,
+ "min_delay_usec": 32,
+ "drop_pct": 40,
+ "max_delay_usec": 1014,
+ "tx_pkts": 2166089,
+ "avg_delay_usec": 102,
+ "drop_percentage": 0.0018466461904381585
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 1843865184.0,
+ "theoretical_tx_rate_pps": 11748120.30075188
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 7.421875,
+ "duration_sec": 10.0,
+ "l2frame_size": "512",
+ "rate_pps": 435964,
+ "rate_bps": 1855468750.0,
+ "time_taken_sec": 137.70669722557068
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 446864.20539699425,
+ "rx_pkts": 4242076,
+ "time_ms": 1648518795780,
+ "drop_pct": 107282672,
+ "total_tx_pps": 11152474,
+ "tx_pps": 11748120,
+ "tx_pkts": 111524748,
+ "drop_percentage": 96.19629178628585
+ },
+ {
+ "rx_pps": 453288.54645233817,
+ "rx_pkts": 4513168,
+ "time_ms": 1648518808397,
+ "drop_pct": 53971918,
+ "total_tx_pps": 5848508,
+ "tx_pps": 5874060,
+ "tx_pkts": 58485086,
+ "drop_percentage": 92.28321558764571
+ },
+ {
+ "rx_pps": 1908433.4598655603,
+ "rx_pkts": 18965061,
+ "time_ms": 1648518820891,
+ "drop_pct": 10221680,
+ "total_tx_pps": 2918674,
+ "tx_pps": 2937030,
+ "tx_pkts": 29186741,
+ "drop_percentage": 35.0216558950518
+ },
+ {
+ "rx_pps": 1449595.552333988,
+ "rx_pkts": 14406806,
+ "time_ms": 1648518833387,
+ "drop_pct": 188021,
+ "total_tx_pps": 1459482,
+ "tx_pps": 1468514,
+ "tx_pkts": 14594827,
+ "drop_percentage": 1.2882715225058852
+ },
+ {
+ "rx_pps": 733549.2536779855,
+ "rx_pkts": 7290381,
+ "time_ms": 1648518845904,
+ "drop_pct": 7024,
+ "total_tx_pps": 729740,
+ "tx_pps": 734256,
+ "tx_pkts": 7297405,
+ "drop_percentage": 0.09625339418601545
+ },
+ {
+ "rx_pps": 367128.0,
+ "rx_pkts": 3648336,
+ "time_ms": 1648518858416,
+ "drop_pct": 0,
+ "total_tx_pps": 364833,
+ "tx_pps": 367128,
+ "tx_pkts": 3648336,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 550658.6029747013,
+ "rx_pkts": 5474100,
+ "time_ms": 1648518870921,
+ "drop_pct": 332,
+ "total_tx_pps": 547443,
+ "tx_pps": 550692,
+ "tx_pkts": 5474432,
+ "drop_percentage": 0.0060645561037199845
+ },
+ {
+ "rx_pps": 458889.171916203,
+ "rx_pkts": 4560672,
+ "time_ms": 1648518883444,
+ "drop_pct": 207,
+ "total_tx_pps": 456087,
+ "tx_pps": 458910,
+ "tx_pkts": 4560879,
+ "drop_percentage": 0.004538598809571576
+ },
+ {
+ "rx_pps": 413014.7801994796,
+ "rx_pkts": 4104749,
+ "time_ms": 1648518895947,
+ "drop_pct": 32,
+ "total_tx_pps": 410478,
+ "tx_pps": 413018,
+ "tx_pkts": 4104781,
+ "drop_percentage": 0.0007795787400107339
+ },
+ {
+ "rx_pps": 435959.9748462513,
+ "rx_pkts": 4332356,
+ "time_ms": 1648518908443,
+ "drop_pct": 40,
+ "total_tx_pps": 433239,
+ "tx_pps": 435964,
+ "tx_pkts": 4332396,
+ "drop_percentage": 0.0009232766349151831
+ },
+ {
+ "rx_pps": 447372.79906432977,
+ "rx_pkts": 4446218,
+ "time_ms": 1648518920991,
+ "drop_pct": 648,
+ "total_tx_pps": 444686,
+ "tx_pps": 447438,
+ "tx_pkts": 4446866,
+ "ndr_pps": 217982,
+ "drop_percentage": 0.01457206041288404
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 10000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "b053f4a4365e4c55832ccb06c7c724b9"
+ },
+ "synthesis": {
+ "avg_delay_usec": 101.0000410861896,
+ "total_tx_rate": 433239
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_768-fc_10k-rate_ndr-2.json",
+ "frame_sizes": [
+ "768"
+ ],
+ "rate": "ndr",
+ "flow_count": "10k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-29 02:00:18",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "a2cda8a229d34cc78999eccf910d02ea",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "768"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 10000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_768-fc_10k-rate_ndr-1.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "768"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2519,
+ 2504
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_768-fc_10k-rate_ndr-1.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "768": {
+ "ndr": {
+ "load_percent_per_direction": 6.25,
+ "timestamp_sec": 1648519360.7870374,
+ "stats": {
+ "total_tx_rate": 492618,
+ "overall": {
+ "rx_pkts": 4926143,
+ "drop_percentage": 0.0007510890791647889,
+ "drop_pct": 37,
+ "max_delay_usec": 1171,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 4926180,
+ "avg_delay_usec": 100.00029982889251,
+ "min_delay_usec": 31,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 2462966,
+ "min_delay_usec": 31,
+ "drop_pct": 0,
+ "max_delay_usec": 245,
+ "tx_pkts": 2463214,
+ "avg_delay_usec": 93,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 2463177,
+ "min_delay_usec": 36,
+ "drop_pct": 37,
+ "max_delay_usec": 1171,
+ "tx_pkts": 2462966,
+ "avg_delay_usec": 107,
+ "drop_percentage": 0.0015022537866945787
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 3105463872.0,
+ "theoretical_tx_rate_pps": 7931472.081218274
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 12.5,
+ "duration_sec": 10.0,
+ "l2frame_size": "768",
+ "rate_pps": 495716,
+ "rate_bps": 3125000000.0,
+ "time_taken_sec": 137.70255613327026
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 1843706.9440757327,
+ "rx_pkts": 17791743,
+ "time_ms": 1648519235591,
+ "drop_pct": 58746837,
+ "total_tx_pps": 7653858,
+ "tx_pps": 7931472,
+ "tx_pkts": 76538580,
+ "drop_percentage": 76.75454261105968
+ },
+ {
+ "rx_pps": 1698570.5446705262,
+ "rx_pkts": 16879548,
+ "time_ms": 1648519248098,
+ "drop_pct": 22529961,
+ "total_tx_pps": 3940950,
+ "tx_pps": 3965736,
+ "tx_pkts": 39409509,
+ "drop_percentage": 57.168844706996985
+ },
+ {
+ "rx_pps": 1646922.9614271468,
+ "rx_pkts": 16367945,
+ "time_ms": 1648519260593,
+ "drop_pct": 3338790,
+ "total_tx_pps": 1970673,
+ "tx_pps": 1982868,
+ "tx_pkts": 19706735,
+ "drop_percentage": 16.942380358796118
+ },
+ {
+ "rx_pps": 990847.8365151717,
+ "rx_pkts": 9846551,
+ "time_ms": 1648519273128,
+ "drop_pct": 5825,
+ "total_tx_pps": 985237,
+ "tx_pps": 991434,
+ "tx_pkts": 9852376,
+ "drop_percentage": 0.0591227943391523
+ },
+ {
+ "rx_pps": 495712.27673126035,
+ "rx_pkts": 4926143,
+ "time_ms": 1648519285633,
+ "drop_pct": 37,
+ "total_tx_pps": 492618,
+ "tx_pps": 495716,
+ "tx_pkts": 4926180,
+ "drop_percentage": 0.0007510890791647889
+ },
+ {
+ "rx_pps": 742526.9561696775,
+ "rx_pkts": 7378863,
+ "time_ms": 1648519298137,
+ "drop_pct": 10405,
+ "total_tx_pps": 738926,
+ "tx_pps": 743574,
+ "tx_pkts": 7389268,
+ "drop_percentage": 0.14081232403534424
+ },
+ {
+ "rx_pps": 619264.736291264,
+ "rx_pkts": 6154255,
+ "time_ms": 1648519310675,
+ "drop_pct": 3789,
+ "total_tx_pps": 615804,
+ "tx_pps": 619646,
+ "tx_pkts": 6158044,
+ "drop_percentage": 0.061529277803146584
+ },
+ {
+ "rx_pps": 557659.6729669784,
+ "rx_pkts": 5541746,
+ "time_ms": 1648519323177,
+ "drop_pct": 202,
+ "total_tx_pps": 554194,
+ "tx_pps": 557680,
+ "tx_pkts": 5541948,
+ "drop_percentage": 0.0036449277402097603
+ },
+ {
+ "rx_pps": 526580.6667255119,
+ "rx_pkts": 5232898,
+ "time_ms": 1648519335711,
+ "drop_pct": 1166,
+ "total_tx_pps": 523406,
+ "tx_pps": 526698,
+ "tx_pkts": 5234064,
+ "drop_percentage": 0.022277144490399813
+ },
+ {
+ "rx_pps": 511050.9183162957,
+ "rx_pkts": 5078571,
+ "time_ms": 1648519348208,
+ "drop_pct": 1561,
+ "total_tx_pps": 508013,
+ "tx_pps": 511208,
+ "tx_pkts": 5080132,
+ "drop_percentage": 0.030727548024342674
+ },
+ {
+ "rx_pps": 503409.6729808145,
+ "rx_pkts": 5002636,
+ "time_ms": 1648519360786,
+ "drop_pct": 520,
+ "total_tx_pps": 500315,
+ "tx_pps": 503462,
+ "tx_pkts": 5003156,
+ "ndr_pps": 247858,
+ "drop_percentage": 0.010393439660886048
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 10000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "a2cda8a229d34cc78999eccf910d02ea"
+ },
+ "synthesis": {
+ "avg_delay_usec": 100.00029982889251,
+ "total_tx_rate": 492618
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1024-fc_10k-rate_ndr-2.json",
+ "frame_sizes": [
+ "1024"
+ ],
+ "rate": "ndr",
+ "flow_count": "10k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-29 02:05:11",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "fc9128efed9440d785de14f69b0676de",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "1024"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 10000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1024-fc_10k-rate_ndr-0.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "1024"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2519,
+ 2504
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1024-fc_10k-rate_ndr-0.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "1024": {
+ "ndr": {
+ "load_percent_per_direction": 6.15234375,
+ "timestamp_sec": 1648519653.779957,
+ "stats": {
+ "total_tx_rate": 366012,
+ "overall": {
+ "rx_pkts": 3660123,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 2524,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 3660123,
+ "avg_delay_usec": 137.0001010894989,
+ "min_delay_usec": 33,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1829969,
+ "min_delay_usec": 39,
+ "drop_pct": 0,
+ "max_delay_usec": 968,
+ "tx_pkts": 1830154,
+ "avg_delay_usec": 135,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 1830154,
+ "min_delay_usec": 33,
+ "drop_pct": 0,
+ "max_delay_usec": 2524,
+ "tx_pkts": 1829969,
+ "avg_delay_usec": 139,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 3056932224.0,
+ "theoretical_tx_rate_pps": 5986590.038314176
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 12.3046875,
+ "duration_sec": 10.0,
+ "l2frame_size": "1024",
+ "rate_pps": 368314,
+ "rate_bps": 3076171874.0,
+ "time_taken_sec": 137.631765127182
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 1700403.2178862838,
+ "rx_pkts": 16546247,
+ "time_ms": 1648519528631,
+ "drop_pct": 41707934,
+ "total_tx_pps": 5825418,
+ "tx_pps": 5986590,
+ "tx_pkts": 58254181,
+ "drop_percentage": 71.59646446664489
+ },
+ {
+ "rx_pps": 1777997.9131810525,
+ "rx_pkts": 17668853,
+ "time_ms": 1648519541226,
+ "drop_pct": 12077004,
+ "total_tx_pps": 2974585,
+ "tx_pps": 2993294,
+ "tx_pkts": 29745857,
+ "drop_percentage": 40.60062549214837
+ },
+ {
+ "rx_pps": 1465627.2355720846,
+ "rx_pkts": 14564672,
+ "time_ms": 1648519553730,
+ "drop_pct": 308249,
+ "total_tx_pps": 1487292,
+ "tx_pps": 1496646,
+ "tx_pkts": 14872921,
+ "drop_percentage": 2.072551854474316
+ },
+ {
+ "rx_pps": 747534.5177112543,
+ "rx_pkts": 7428999,
+ "time_ms": 1648519566245,
+ "drop_pct": 7826,
+ "total_tx_pps": 743682,
+ "tx_pps": 748322,
+ "tx_pkts": 7436825,
+ "drop_percentage": 0.10523307997700632
+ },
+ {
+ "rx_pps": 374133.28379134706,
+ "rx_pkts": 3725059,
+ "time_ms": 1648519578761,
+ "drop_pct": 266,
+ "total_tx_pps": 372532,
+ "tx_pps": 374160,
+ "tx_pkts": 3725325,
+ "drop_percentage": 0.007140316616671028
+ },
+ {
+ "rx_pps": 187080.0,
+ "rx_pkts": 1859296,
+ "time_ms": 1648519591256,
+ "drop_pct": 0,
+ "total_tx_pps": 185929,
+ "tx_pps": 187080,
+ "tx_pkts": 1859296,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 280620.0,
+ "rx_pkts": 2788944,
+ "time_ms": 1648519603755,
+ "drop_pct": 0,
+ "total_tx_pps": 278894,
+ "tx_pps": 280620,
+ "tx_pkts": 2788944,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 327386.98143813567,
+ "rx_pkts": 3253738,
+ "time_ms": 1648519616247,
+ "drop_pct": 30,
+ "total_tx_pps": 325376,
+ "tx_pps": 327390,
+ "tx_pkts": 3253768,
+ "drop_percentage": 0.0009220079612314092
+ },
+ {
+ "rx_pps": 350776.0,
+ "rx_pkts": 3485838,
+ "time_ms": 1648519628760,
+ "drop_pct": 0,
+ "total_tx_pps": 348583,
+ "tx_pps": 350776,
+ "tx_pkts": 3485838,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 362468.0,
+ "rx_pkts": 3602027,
+ "time_ms": 1648519641273,
+ "drop_pct": 0,
+ "total_tx_pps": 360202,
+ "tx_pps": 362468,
+ "tx_pkts": 3602027,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 368314.0,
+ "rx_pkts": 3660123,
+ "time_ms": 1648519653779,
+ "drop_pct": 0,
+ "total_tx_pps": 366012,
+ "tx_pps": 368314,
+ "tx_pkts": 3660123,
+ "ndr_pps": 184157,
+ "drop_percentage": 0.0
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 10000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "fc9128efed9440d785de14f69b0676de"
+ },
+ "synthesis": {
+ "avg_delay_usec": 137.0001010894989,
+ "total_tx_rate": 366012
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1280-fc_10k-rate_ndr-2.json",
+ "frame_sizes": [
+ "1280"
+ ],
+ "rate": "ndr",
+ "flow_count": "10k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-29 02:17:23",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "e329e7ec82084f7186e94e7d1c71663a",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "1280"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 10000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1280-fc_10k-rate_ndr-2.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "1280"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2519,
+ 2504
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1280-fc_10k-rate_ndr-2.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "1280": {
+ "ndr": {
+ "load_percent_per_direction": 6.8359375,
+ "timestamp_sec": 1648520386.142867,
+ "stats": {
+ "total_tx_rate": 326596,
+ "overall": {
+ "rx_pkts": 3265961,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 4719,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 3265961,
+ "avg_delay_usec": 245.0000499087405,
+ "min_delay_usec": 36,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1632899,
+ "min_delay_usec": 36,
+ "drop_pct": 0,
+ "max_delay_usec": 725,
+ "tx_pkts": 1633062,
+ "avg_delay_usec": 244,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 1633062,
+ "min_delay_usec": 36,
+ "drop_pct": 0,
+ "max_delay_usec": 4719,
+ "tx_pkts": 1632899,
+ "avg_delay_usec": 246,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 3396598400.0,
+ "theoretical_tx_rate_pps": 4807692.307692308
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 13.671875,
+ "duration_sec": 10.0,
+ "l2frame_size": "1280",
+ "rate_pps": 328650,
+ "rate_bps": 3417968750.0,
+ "time_taken_sec": 137.8278579711914
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 1535106.7095401918,
+ "rx_pkts": 15014376,
+ "time_ms": 1648520260799,
+ "drop_pct": 32008085,
+ "total_tx_pps": 4702246,
+ "tx_pps": 4807692,
+ "tx_pkts": 47022461,
+ "drop_percentage": 68.06977839802983
+ },
+ {
+ "rx_pps": 1523422.5772190758,
+ "rx_pkts": 15139014,
+ "time_ms": 1648520273342,
+ "drop_pct": 8749209,
+ "total_tx_pps": 2388822,
+ "tx_pps": 2403846,
+ "tx_pkts": 23888223,
+ "drop_percentage": 36.62561673172592
+ },
+ {
+ "rx_pps": 1179882.5947820866,
+ "rx_pkts": 11736883,
+ "time_ms": 1648520285887,
+ "drop_pct": 219237,
+ "total_tx_pps": 1195612,
+ "tx_pps": 1201922,
+ "tx_pkts": 11956120,
+ "drop_percentage": 1.8336801571078243
+ },
+ {
+ "rx_pps": 600894.1953235778,
+ "rx_pkts": 5971989,
+ "time_ms": 1648520298395,
+ "drop_pct": 654,
+ "total_tx_pps": 597264,
+ "tx_pps": 600960,
+ "tx_pkts": 5972643,
+ "drop_percentage": 0.010949926188456267
+ },
+ {
+ "rx_pps": 300480.0,
+ "rx_pkts": 2986172,
+ "time_ms": 1648520310891,
+ "drop_pct": 0,
+ "total_tx_pps": 298617,
+ "tx_pps": 300480,
+ "tx_pkts": 2986172,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 450712.05910630024,
+ "rx_pkts": 4483910,
+ "time_ms": 1648520323438,
+ "drop_pct": 79,
+ "total_tx_pps": 448398,
+ "tx_pps": 450720,
+ "tx_pkts": 4483989,
+ "drop_percentage": 0.0017618241257951347
+ },
+ {
+ "rx_pps": 375548.77991538175,
+ "rx_pkts": 3732019,
+ "time_ms": 1648520335959,
+ "drop_pct": 509,
+ "total_tx_pps": 373252,
+ "tx_pps": 375600,
+ "tx_pkts": 3732528,
+ "drop_percentage": 0.013636870239151588
+ },
+ {
+ "rx_pps": 338015.5471880093,
+ "rx_pkts": 3359032,
+ "time_ms": 1648520348460,
+ "drop_pct": 243,
+ "total_tx_pps": 335927,
+ "tx_pps": 338040,
+ "tx_pkts": 3359275,
+ "drop_percentage": 0.007233703700947377
+ },
+ {
+ "rx_pps": 319260.0,
+ "rx_pkts": 3172967,
+ "time_ms": 1648520361037,
+ "drop_pct": 0,
+ "total_tx_pps": 317296,
+ "tx_pps": 319260,
+ "tx_pkts": 3172967,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 328650.0,
+ "rx_pkts": 3265961,
+ "time_ms": 1648520373554,
+ "drop_pct": 0,
+ "total_tx_pps": 326596,
+ "tx_pps": 328650,
+ "tx_pkts": 3265961,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 333339.37153865054,
+ "rx_pkts": 3312896,
+ "time_ms": 1648520386142,
+ "drop_pct": 46,
+ "total_tx_pps": 331294,
+ "tx_pps": 333344,
+ "tx_pkts": 3312942,
+ "ndr_pps": 164325,
+ "drop_percentage": 0.0013884939730306174
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 10000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "e329e7ec82084f7186e94e7d1c71663a"
+ },
+ "synthesis": {
+ "avg_delay_usec": 245.0000499087405,
+ "total_tx_rate": 326596
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1518-fc_10k-rate_ndr-2.json",
+ "frame_sizes": [
+ "1518"
+ ],
+ "rate": "ndr",
+ "flow_count": "10k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-29 02:22:16",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "1e8206de26514ff6a4931f6250fde24a",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "1518"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 10000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1518-fc_10k-rate_ndr-1.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "1518"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2519,
+ 2504
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1518-fc_10k-rate_ndr-1.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "1518": {
+ "ndr": {
+ "load_percent_per_direction": 9.375,
+ "timestamp_sec": 1648520679.0839975,
+ "stats": {
+ "total_tx_rate": 378591,
+ "overall": {
+ "rx_pkts": 3785894,
+ "drop_percentage": 0.00047544686722776435,
+ "drop_pct": 18,
+ "max_delay_usec": 3658,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 3785912,
+ "avg_delay_usec": 170.99981827277784,
+ "min_delay_usec": 34,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1892861,
+ "min_delay_usec": 34,
+ "drop_pct": 0,
+ "max_delay_usec": 3658,
+ "tx_pkts": 1893051,
+ "avg_delay_usec": 175,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 1893033,
+ "min_delay_usec": 35,
+ "drop_pct": 18,
+ "max_delay_usec": 3371,
+ "tx_pkts": 1892861,
+ "avg_delay_usec": 167,
+ "drop_percentage": 0.0009509414584589149
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 4658183664.0,
+ "theoretical_tx_rate_pps": 4063719.1157347206
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 18.75,
+ "duration_sec": 10.0,
+ "l2frame_size": "1518",
+ "rate_pps": 380972,
+ "rate_bps": 4687500000.0,
+ "time_taken_sec": 137.66561269760132
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 1541559.265878926,
+ "rx_pkts": 15109078,
+ "time_ms": 1648520553914,
+ "drop_pct": 24720096,
+ "total_tx_pps": 3982917,
+ "tx_pps": 4063718,
+ "tx_pkts": 39829174,
+ "drop_percentage": 62.06529916989993
+ },
+ {
+ "rx_pps": 1494377.2278385973,
+ "rx_pkts": 14850376,
+ "time_ms": 1648520566411,
+ "drop_pct": 5341216,
+ "total_tx_pps": 2019159,
+ "tx_pps": 2031858,
+ "tx_pkts": 20191592,
+ "drop_percentage": 26.452673964489772
+ },
+ {
+ "rx_pps": 1015244.8303578512,
+ "rx_pkts": 10088998,
+ "time_ms": 1648520578933,
+ "drop_pct": 6789,
+ "total_tx_pps": 1009578,
+ "tx_pps": 1015928,
+ "tx_pkts": 10095787,
+ "drop_percentage": 0.06724587196619738
+ },
+ {
+ "rx_pps": 507229.30857634713,
+ "rx_pkts": 5040594,
+ "time_ms": 1648520591432,
+ "drop_pct": 7301,
+ "total_tx_pps": 504789,
+ "tx_pps": 507964,
+ "tx_pkts": 5047895,
+ "drop_percentage": 0.1446345456868655
+ },
+ {
+ "rx_pps": 253982.0,
+ "rx_pkts": 2523948,
+ "time_ms": 1648520603928,
+ "drop_pct": 0,
+ "total_tx_pps": 252394,
+ "tx_pps": 253982,
+ "tx_pkts": 2523948,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 380970.18868056097,
+ "rx_pkts": 3785894,
+ "time_ms": 1648520616532,
+ "drop_pct": 18,
+ "total_tx_pps": 378591,
+ "tx_pps": 380972,
+ "tx_pkts": 3785912,
+ "drop_percentage": 0.0004754468672277644
+ },
+ {
+ "rx_pps": 444179.12352550065,
+ "rx_pkts": 4414476,
+ "time_ms": 1648520629047,
+ "drop_pct": 2871,
+ "total_tx_pps": 441734,
+ "tx_pps": 444468,
+ "tx_pkts": 4417347,
+ "drop_percentage": 0.06499376209294855
+ },
+ {
+ "rx_pps": 412677.0336150762,
+ "rx_pkts": 4101185,
+ "time_ms": 1648520641544,
+ "drop_pct": 427,
+ "total_tx_pps": 410161,
+ "tx_pps": 412720,
+ "tx_pkts": 4101612,
+ "drop_percentage": 0.01041054102630868
+ },
+ {
+ "rx_pps": 396730.1338174792,
+ "rx_pkts": 3944491,
+ "time_ms": 1648520654065,
+ "drop_pct": 1152,
+ "total_tx_pps": 394564,
+ "tx_pps": 396846,
+ "tx_pkts": 3945643,
+ "drop_percentage": 0.02919676209935871
+ },
+ {
+ "rx_pps": 388894.5031521723,
+ "rx_pkts": 3864641,
+ "time_ms": 1648520666566,
+ "drop_pct": 154,
+ "total_tx_pps": 386479,
+ "tx_pps": 388910,
+ "tx_pkts": 3864795,
+ "drop_percentage": 0.00398468741550328
+ },
+ {
+ "rx_pps": 384931.5345935888,
+ "rx_pkts": 3825258,
+ "time_ms": 1648520679083,
+ "drop_pct": 104,
+ "total_tx_pps": 382536,
+ "tx_pps": 384942,
+ "tx_pkts": 3825362,
+ "ndr_pps": 190486,
+ "drop_percentage": 0.002718696949465175
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 10000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "1e8206de26514ff6a4931f6250fde24a"
+ },
+ "synthesis": {
+ "avg_delay_usec": 170.99981827277784,
+ "total_tx_rate": 378591
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_IMIX-fc_10k-rate_ndr-2.json",
+ "frame_sizes": [
+ "IMIX"
+ ],
+ "rate": "ndr",
+ "flow_count": "10k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-29 02:27:13",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "6717811fb0a041bdae28c1780610969e",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "IMIX"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 10000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_IMIX-fc_10k-rate_ndr-0.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "IMIX"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2519,
+ 2504
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_IMIX-fc_10k-rate_ndr-0.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "IMIX": {
+ "ndr": {
+ "load_percent_per_direction": 2.05078125,
+ "timestamp_sec": 1648520976.011313,
+ "stats": {
+ "total_tx_rate": 333616,
+ "overall": {
+ "rx_pkts": 3336161,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 698,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 3336161,
+ "avg_delay_usec": 122.49997497123191,
+ "min_delay_usec": 28,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1667997,
+ "min_delay_usec": 30,
+ "drop_pct": 0,
+ "max_delay_usec": 698,
+ "tx_pkts": 1668164,
+ "avg_delay_usec": 123,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 1668164,
+ "min_delay_usec": 28,
+ "drop_pct": 0,
+ "max_delay_usec": 279,
+ "tx_pkts": 1667997,
+ "avg_delay_usec": 122,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 1019085674.6666666,
+ "theoretical_tx_rate_pps": 16368398.079441292
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 4.1015625,
+ "duration_sec": 10.0,
+ "l2frame_size": "IMIX",
+ "rate_pps": 335680,
+ "rate_bps": 1025390624.0,
+ "time_taken_sec": 137.6751914024353
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 480024.2862919867,
+ "rx_pkts": 4168384,
+ "time_ms": 1648520850833,
+ "drop_pct": 137969775,
+ "total_tx_pps": 14213815,
+ "tx_pps": 16368398,
+ "tx_pkts": 142138159,
+ "warning": "WARNING: There is a significant difference between requested TX rate (16368398) and actual TX rate (14213815). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "drop_percentage": 97.0673716127138
+ },
+ {
+ "rx_pps": 429860.8379715359,
+ "rx_pkts": 4272172,
+ "time_ms": 1648520863348,
+ "drop_pct": 77066481,
+ "total_tx_pps": 8133865,
+ "tx_pps": 8184198,
+ "tx_pkts": 81338653,
+ "drop_percentage": 94.74767304051618
+ },
+ {
+ "rx_pps": 527546.4558752577,
+ "rx_pkts": 5242915,
+ "time_ms": 1648520875895,
+ "drop_pct": 35425583,
+ "total_tx_pps": 4066849,
+ "tx_pps": 4092098,
+ "tx_pkts": 40668498,
+ "drop_percentage": 87.1081666207589
+ },
+ {
+ "rx_pps": 1892052.775002597,
+ "rx_pkts": 18802280,
+ "time_ms": 1648520888389,
+ "drop_pct": 1530328,
+ "total_tx_pps": 2033260,
+ "tx_pps": 2046048,
+ "tx_pkts": 20332608,
+ "drop_percentage": 7.526471763976367
+ },
+ {
+ "rx_pps": 1018805.8604937441,
+ "rx_pkts": 10125407,
+ "time_ms": 1648520900966,
+ "drop_pct": 41922,
+ "total_tx_pps": 1016732,
+ "tx_pps": 1023024,
+ "tx_pkts": 10167329,
+ "drop_percentage": 0.4123206793052531
+ },
+ {
+ "rx_pps": 511505.0566071885,
+ "rx_pkts": 5083084,
+ "time_ms": 1648520913485,
+ "drop_pct": 69,
+ "total_tx_pps": 508315,
+ "tx_pps": 511512,
+ "tx_pkts": 5083153,
+ "drop_percentage": 0.0013574252043957757
+ },
+ {
+ "rx_pps": 255756.0,
+ "rx_pkts": 2541833,
+ "time_ms": 1648520925981,
+ "drop_pct": 0,
+ "total_tx_pps": 254183,
+ "tx_pps": 255756,
+ "tx_pkts": 2541833,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 383623.4350406216,
+ "rx_pkts": 3812647,
+ "time_ms": 1648520938480,
+ "drop_pct": 105,
+ "total_tx_pps": 381275,
+ "tx_pps": 383634,
+ "tx_pkts": 3812752,
+ "drop_percentage": 0.0027539163313008556
+ },
+ {
+ "rx_pps": 319694.0,
+ "rx_pkts": 3182880,
+ "time_ms": 1648520951016,
+ "drop_pct": 0,
+ "total_tx_pps": 318288,
+ "tx_pps": 319694,
+ "tx_pkts": 3182880,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 351650.215240727,
+ "rx_pkts": 3494880,
+ "time_ms": 1648520963515,
+ "drop_pct": 137,
+ "total_tx_pps": 349501,
+ "tx_pps": 351664,
+ "tx_pkts": 3495017,
+ "drop_percentage": 0.003919866484197359
+ },
+ {
+ "rx_pps": 335680.0,
+ "rx_pkts": 3336161,
+ "time_ms": 1648520976010,
+ "drop_pct": 0,
+ "total_tx_pps": 333616,
+ "tx_pps": 335680,
+ "tx_pkts": 3336161,
+ "ndr_pps": 167840,
+ "drop_percentage": 0.0
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 10000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "6717811fb0a041bdae28c1780610969e"
+ },
+ "synthesis": {
+ "avg_delay_usec": 122.49997497123191,
+ "total_tx_rate": 333616
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_9000-fc_10k-rate_ndr-2.json",
+ "frame_sizes": [
+ "9000"
+ ],
+ "rate": "ndr",
+ "flow_count": "10k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-29 02:36:59",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "a76995ed43ce4a1f8ff2e21b1a4d2fd9",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "9000"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 10000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_9000-fc_10k-rate_ndr-1.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "9000"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2519,
+ 2504
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_9000-fc_10k-rate_ndr-1.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "9000": {
+ "ndr": {
+ "load_percent_per_direction": 39.0625,
+ "timestamp_sec": 1648521561.8428352,
+ "stats": {
+ "total_tx_rate": 268972,
+ "overall": {
+ "rx_pkts": 2689705,
+ "drop_percentage": 0.0007435704393571834,
+ "drop_pct": 20,
+ "max_delay_usec": 6516,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 2689725,
+ "avg_delay_usec": 1027.9918745736056,
+ "min_delay_usec": 68,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1344775,
+ "min_delay_usec": 74,
+ "drop_pct": 20,
+ "max_delay_usec": 5878,
+ "tx_pkts": 1344930,
+ "avg_delay_usec": 1169,
+ "drop_percentage": 0.0014870662413657217
+ },
+ "0": {
+ "rx_pkts": 1344930,
+ "min_delay_usec": 68,
+ "drop_pct": 0,
+ "max_delay_usec": 6516,
+ "tx_pkts": 1344795,
+ "avg_delay_usec": 887,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 19409019520.0,
+ "theoretical_tx_rate_pps": 692904.6563192905
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 78.125,
+ "duration_sec": 10.0,
+ "l2frame_size": "9000",
+ "rate_pps": 270664,
+ "rate_bps": 19531250000.0,
+ "time_taken_sec": 137.58718967437744
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 278405.0005646744,
+ "rx_pkts": 2768644,
+ "time_ms": 1648521436741,
+ "drop_pct": 4122053,
+ "total_tx_pps": 689069,
+ "tx_pps": 692904,
+ "tx_pkts": 6890697,
+ "drop_percentage": 59.8205522605333
+ },
+ {
+ "rx_pps": 276331.9562142758,
+ "rx_pkts": 2746187,
+ "time_ms": 1648521449255,
+ "drop_pct": 696853,
+ "total_tx_pps": 344304,
+ "tx_pps": 346452,
+ "tx_pkts": 3443040,
+ "drop_percentage": 20.23946860913611
+ },
+ {
+ "rx_pps": 173226.0,
+ "rx_pkts": 1721607,
+ "time_ms": 1648521461778,
+ "drop_pct": 0,
+ "total_tx_pps": 172160,
+ "tx_pps": 173226,
+ "tx_pkts": 1721607,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 259837.29559799578,
+ "rx_pkts": 2582135,
+ "time_ms": 1648521474298,
+ "drop_pct": 7,
+ "total_tx_pps": 258214,
+ "tx_pps": 259838,
+ "tx_pkts": 2582142,
+ "drop_percentage": 0.00027109275942221615
+ },
+ {
+ "rx_pps": 276937.05630908126,
+ "rx_pkts": 2752342,
+ "time_ms": 1648521486796,
+ "drop_pct": 260458,
+ "total_tx_pps": 301280,
+ "tx_pps": 303144,
+ "tx_pkts": 3012800,
+ "drop_percentage": 8.6450477960701
+ },
+ {
+ "rx_pps": 276792.8929701584,
+ "rx_pkts": 2755614,
+ "time_ms": 1648521499312,
+ "drop_pct": 46782,
+ "total_tx_pps": 280239,
+ "tx_pps": 281492,
+ "tx_pkts": 2802396,
+ "drop_percentage": 1.6693572214633479
+ },
+ {
+ "rx_pps": 270661.98742250603,
+ "rx_pkts": 2689705,
+ "time_ms": 1648521511811,
+ "drop_pct": 20,
+ "total_tx_pps": 268972,
+ "tx_pps": 270664,
+ "tx_pkts": 2689725,
+ "drop_percentage": 0.0007435704393571834
+ },
+ {
+ "rx_pps": 276052.0403556816,
+ "rx_pkts": 2743544,
+ "time_ms": 1648521524310,
+ "drop_pct": 258,
+ "total_tx_pps": 274380,
+ "tx_pps": 276078,
+ "tx_pkts": 2743802,
+ "drop_percentage": 0.009403010858655253
+ },
+ {
+ "rx_pps": 273364.7554496673,
+ "rx_pkts": 2716837,
+ "time_ms": 1648521536836,
+ "drop_pct": 72,
+ "total_tx_pps": 271690,
+ "tx_pps": 273372,
+ "tx_pkts": 2716909,
+ "drop_percentage": 0.0026500703556872904
+ },
+ {
+ "rx_pps": 271980.0648314645,
+ "rx_pkts": 2702940,
+ "time_ms": 1648521549342,
+ "drop_pct": 377,
+ "total_tx_pps": 270331,
+ "tx_pps": 272018,
+ "tx_pkts": 2703317,
+ "drop_percentage": 0.013945830252241968
+ },
+ {
+ "rx_pps": 271298.2308444215,
+ "rx_pkts": 2696299,
+ "time_ms": 1648521561842,
+ "drop_pct": 435,
+ "total_tx_pps": 269673,
+ "tx_pps": 271342,
+ "tx_pkts": 2696734,
+ "ndr_pps": 135332,
+ "drop_percentage": 0.016130623190867176
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 10000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "a76995ed43ce4a1f8ff2e21b1a4d2fd9"
+ },
+ "synthesis": {
+ "avg_delay_usec": 1027.9918745736056,
+ "total_tx_rate": 268972
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_64-fc_100k-rate_ndr-2.json",
+ "frame_sizes": [
+ "64"
+ ],
+ "rate": "ndr",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-29 02:44:19",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "859cf30e41754c5983e562fb7bf0fb6d",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "64"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_64-fc_100k-rate_ndr-1.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "64"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2519,
+ 2504
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_64-fc_100k-rate_ndr-1.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "64": {
+ "ndr": {
+ "load_percent_per_direction": 0.78125,
+ "timestamp_sec": 1648522002.495307,
+ "stats": {
+ "total_tx_rate": 577711,
+ "overall": {
+ "rx_pkts": 5777113,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 275,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 5777113,
+ "avg_delay_usec": 119.99994997501346,
+ "min_delay_usec": 30,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 2888412,
+ "min_delay_usec": 30,
+ "drop_pct": 0,
+ "max_delay_usec": 260,
+ "tx_pkts": 2888701,
+ "avg_delay_usec": 121,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 2888701,
+ "min_delay_usec": 32,
+ "drop_pct": 0,
+ "max_delay_usec": 275,
+ "tx_pkts": 2888412,
+ "avg_delay_usec": 119,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 388221792.0,
+ "theoretical_tx_rate_pps": 74404761.90476191
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 1.5625,
+ "duration_sec": 10.0,
+ "l2frame_size": "64",
+ "rate_pps": 581286,
+ "rate_bps": 390625000.0,
+ "time_taken_sec": 137.66614270210266
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 1044485.5784527424,
+ "rx_pkts": 5973011,
+ "time_ms": 1648521877346,
+ "drop_pct": 419519173,
+ "total_tx_pps": 42549218,
+ "tx_pps": 74404760,
+ "tx_pkts": 425492184,
+ "warning": "WARNING: There is a significant difference between requested TX rate (74404760) and actual TX rate (42549218). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "drop_percentage": 98.59621134662252
+ },
+ {
+ "rx_pps": 1656555.9939682153,
+ "rx_pkts": 16462060,
+ "time_ms": 1648521889844,
+ "drop_pct": 353237373,
+ "total_tx_pps": 36969943,
+ "tx_pps": 37202380,
+ "tx_pkts": 369699433,
+ "drop_percentage": 95.54717737422118
+ },
+ {
+ "rx_pps": 966647.7521170629,
+ "rx_pkts": 9607013,
+ "time_ms": 1648521902362,
+ "drop_pct": 175260612,
+ "total_tx_pps": 18486762,
+ "tx_pps": 18601190,
+ "tx_pkts": 184867625,
+ "drop_percentage": 94.80330155158319
+ },
+ {
+ "rx_pps": 1951565.285508652,
+ "rx_pkts": 19395621,
+ "time_ms": 1648521914859,
+ "drop_pct": 73038282,
+ "total_tx_pps": 9243390,
+ "tx_pps": 9300594,
+ "tx_pkts": 92433903,
+ "drop_percentage": 79.01676725692303
+ },
+ {
+ "rx_pps": 1716942.598940512,
+ "rx_pkts": 17062118,
+ "time_ms": 1648521927407,
+ "drop_pct": 29150201,
+ "total_tx_pps": 4621231,
+ "tx_pps": 4650296,
+ "tx_pkts": 46212319,
+ "drop_percentage": 63.07885349791687
+ },
+ {
+ "rx_pps": 1580289.032741088,
+ "rx_pkts": 15705705,
+ "time_ms": 1648521939922,
+ "drop_pct": 7402782,
+ "total_tx_pps": 2310848,
+ "tx_pps": 2325148,
+ "tx_pkts": 23108487,
+ "drop_percentage": 32.03490561714404
+ },
+ {
+ "rx_pps": 1161510.1511160529,
+ "rx_pkts": 11542509,
+ "time_ms": 1648521952469,
+ "drop_pct": 10572,
+ "total_tx_pps": 1155308,
+ "tx_pps": 1162574,
+ "tx_pkts": 11553081,
+ "drop_percentage": 0.09150805746103571
+ },
+ {
+ "rx_pps": 581286.0,
+ "rx_pkts": 5777113,
+ "time_ms": 1648521964985,
+ "drop_pct": 0,
+ "total_tx_pps": 577711,
+ "tx_pps": 581286,
+ "tx_pkts": 5777113,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 871909.7756240192,
+ "rx_pkts": 8665477,
+ "time_ms": 1648521977483,
+ "drop_pct": 201,
+ "total_tx_pps": 866567,
+ "tx_pps": 871930,
+ "tx_pkts": 8665678,
+ "drop_percentage": 0.0023194953701256844
+ },
+ {
+ "rx_pps": 726593.5108987914,
+ "rx_pkts": 7221253,
+ "time_ms": 1648521989998,
+ "drop_pct": 144,
+ "total_tx_pps": 722139,
+ "tx_pps": 726608,
+ "tx_pkts": 7221397,
+ "drop_percentage": 0.001994073999809178
+ },
+ {
+ "rx_pps": 653890.8427914827,
+ "rx_pkts": 6498043,
+ "time_ms": 1648522002494,
+ "drop_pct": 568,
+ "total_tx_pps": 649861,
+ "tx_pps": 653948,
+ "tx_pkts": 6498611,
+ "ndr_pps": 290643,
+ "drop_percentage": 0.008740329279595286
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "859cf30e41754c5983e562fb7bf0fb6d"
+ },
+ "synthesis": {
+ "avg_delay_usec": 119.99994997501346,
+ "total_tx_rate": 577711
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_128-fc_100k-rate_ndr-2.json",
+ "frame_sizes": [
+ "128"
+ ],
+ "rate": "ndr",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-29 02:54:07",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "d00c9abb62b94d448a46ffa181ddab5e",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "128"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_128-fc_100k-rate_ndr-2.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "128"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2519,
+ 2504
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_128-fc_100k-rate_ndr-2.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "128": {
+ "ndr": {
+ "load_percent_per_direction": 1.5625,
+ "timestamp_sec": 1648522591.145952,
+ "stats": {
+ "total_tx_rate": 655780,
+ "overall": {
+ "rx_pkts": 6557739,
+ "drop_percentage": 0.0009454388750131332,
+ "drop_pct": 62,
+ "max_delay_usec": 957,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 6557801,
+ "avg_delay_usec": 138.4995528184333,
+ "min_delay_usec": 32,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 3278674,
+ "min_delay_usec": 34,
+ "drop_pct": 62,
+ "max_delay_usec": 321,
+ "tx_pkts": 3279065,
+ "avg_delay_usec": 146,
+ "drop_percentage": 0.0018907828908545576
+ },
+ "0": {
+ "rx_pkts": 3279065,
+ "min_delay_usec": 32,
+ "drop_pct": 0,
+ "max_delay_usec": 957,
+ "tx_pkts": 3278736,
+ "avg_delay_usec": 131,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 776443520.0,
+ "theoretical_tx_rate_pps": 42229729.72972973
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 3.125,
+ "duration_sec": 10.0,
+ "l2frame_size": "128",
+ "rate_pps": 659838,
+ "rate_bps": 781250000.0,
+ "time_taken_sec": 137.81604623794556
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 575195.7927175488,
+ "rx_pkts": 5266904,
+ "time_ms": 1648522465816,
+ "drop_pct": 381418684,
+ "total_tx_pps": 38668558,
+ "tx_pps": 42229728,
+ "tx_pkts": 386685588,
+ "drop_percentage": 98.63793630705472
+ },
+ {
+ "rx_pps": 567278.3196453974,
+ "rx_pkts": 5637329,
+ "time_ms": 1648522478320,
+ "drop_pct": 204191658,
+ "total_tx_pps": 20982898,
+ "tx_pps": 21114864,
+ "tx_pkts": 209828987,
+ "drop_percentage": 97.31336976811502
+ },
+ {
+ "rx_pps": 566897.9693114288,
+ "rx_pkts": 5633553,
+ "time_ms": 1648522490823,
+ "drop_pct": 99281010,
+ "total_tx_pps": 10491456,
+ "tx_pps": 10557432,
+ "tx_pkts": 104914563,
+ "drop_percentage": 94.63034221474096
+ },
+ {
+ "rx_pps": 639383.528283698,
+ "rx_pkts": 6368581,
+ "time_ms": 1648522503423,
+ "drop_pct": 46210081,
+ "total_tx_pps": 5257866,
+ "tx_pps": 5278716,
+ "tx_pkts": 52578662,
+ "drop_percentage": 87.88751794406636
+ },
+ {
+ "rx_pps": 1855352.6709109098,
+ "rx_pkts": 18437572,
+ "time_ms": 1648522515925,
+ "drop_pct": 7791055,
+ "total_tx_pps": 2622862,
+ "tx_pps": 2639358,
+ "tx_pkts": 26228627,
+ "drop_percentage": 29.704395125219477
+ },
+ {
+ "rx_pps": 1315331.5523658819,
+ "rx_pkts": 13071766,
+ "time_ms": 1648522528443,
+ "drop_pct": 43195,
+ "total_tx_pps": 1311496,
+ "tx_pps": 1319678,
+ "tx_pkts": 13114961,
+ "drop_percentage": 0.32935667898669313
+ },
+ {
+ "rx_pps": 659831.761635036,
+ "rx_pkts": 6557739,
+ "time_ms": 1648522540951,
+ "drop_pct": 62,
+ "total_tx_pps": 655780,
+ "tx_pps": 659838,
+ "tx_pkts": 6557801,
+ "drop_percentage": 0.0009454388750131332
+ },
+ {
+ "rx_pps": 987585.841691004,
+ "rx_pkts": 9815124,
+ "time_ms": 1648522553600,
+ "drop_pct": 21588,
+ "total_tx_pps": 983671,
+ "tx_pps": 989758,
+ "tx_pkts": 9836712,
+ "drop_percentage": 0.21946357685372916
+ },
+ {
+ "rx_pps": 824593.6227131974,
+ "rx_pkts": 8194402,
+ "time_ms": 1648522566129,
+ "drop_pct": 2031,
+ "total_tx_pps": 819643,
+ "tx_pps": 824798,
+ "tx_pkts": 8196433,
+ "drop_percentage": 0.02477907157906372
+ },
+ {
+ "rx_pps": 742228.248068629,
+ "rx_pkts": 7376639,
+ "time_ms": 1648522578649,
+ "drop_pct": 892,
+ "total_tx_pps": 737753,
+ "tx_pps": 742318,
+ "tx_pkts": 7377531,
+ "drop_percentage": 0.012090765867334208
+ },
+ {
+ "rx_pps": 700873.6432437552,
+ "rx_pkts": 6965634,
+ "time_ms": 1648522591145,
+ "drop_pct": 2031,
+ "total_tx_pps": 696766,
+ "tx_pps": 701078,
+ "tx_pkts": 6967665,
+ "ndr_pps": 329919,
+ "drop_percentage": 0.029148932963912588
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "d00c9abb62b94d448a46ffa181ddab5e"
+ },
+ "synthesis": {
+ "avg_delay_usec": 138.4995528184333,
+ "total_tx_rate": 655780
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_256-fc_100k-rate_ndr-2.json",
+ "frame_sizes": [
+ "256"
+ ],
+ "rate": "ndr",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-29 03:01:28",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "00c68a9f42064b53b7e9abb957d13033",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "256"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_256-fc_100k-rate_ndr-2.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "256"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2519,
+ 2504
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_256-fc_100k-rate_ndr-2.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "256": {
+ "ndr": {
+ "load_percent_per_direction": 2.34375,
+ "timestamp_sec": 1648523031.8611252,
+ "stats": {
+ "total_tx_rate": 527476,
+ "overall": {
+ "rx_pkts": 5274760,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 2258,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 5274760,
+ "avg_delay_usec": 135.49841149170769,
+ "min_delay_usec": 30,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 2637247,
+ "min_delay_usec": 30,
+ "drop_pct": 0,
+ "max_delay_usec": 251,
+ "tx_pkts": 2637513,
+ "avg_delay_usec": 167,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 2637513,
+ "min_delay_usec": 30,
+ "drop_pct": 0,
+ "max_delay_usec": 2258,
+ "tx_pkts": 2637247,
+ "avg_delay_usec": 104,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 1164667008.0,
+ "theoretical_tx_rate_pps": 22644927.536231883
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 4.6875,
+ "duration_sec": 10.0,
+ "l2frame_size": "256",
+ "rate_pps": 530740,
+ "rate_bps": 1171875000.0,
+ "time_taken_sec": 137.57874631881714
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 632951.7633188012,
+ "rx_pkts": 5732879,
+ "time_ms": 1648522906769,
+ "drop_pct": 199370619,
+ "total_tx_pps": 20510349,
+ "tx_pps": 22644926,
+ "tx_pkts": 205103498,
+ "drop_percentage": 97.20488482356356
+ },
+ {
+ "rx_pps": 525347.9116271588,
+ "rx_pkts": 5220542,
+ "time_ms": 1648522919288,
+ "drop_pct": 107294207,
+ "total_tx_pps": 11251474,
+ "tx_pps": 11322462,
+ "tx_pkts": 112514749,
+ "drop_percentage": 95.36012651994629
+ },
+ {
+ "rx_pps": 618995.2907265456,
+ "rx_pkts": 6151267,
+ "time_ms": 1648522931785,
+ "drop_pct": 50107218,
+ "total_tx_pps": 5625848,
+ "tx_pps": 5661230,
+ "tx_pkts": 56258485,
+ "drop_percentage": 89.06606354579225
+ },
+ {
+ "rx_pps": 1708283.2963459694,
+ "rx_pkts": 16977774,
+ "time_ms": 1648522944283,
+ "drop_pct": 11154284,
+ "total_tx_pps": 2813205,
+ "tx_pps": 2830614,
+ "tx_pkts": 28132058,
+ "drop_percentage": 39.649726301573814
+ },
+ {
+ "rx_pps": 1360731.7774735298,
+ "rx_pkts": 13523635,
+ "time_ms": 1648522956800,
+ "drop_pct": 542386,
+ "total_tx_pps": 1406602,
+ "tx_pps": 1415306,
+ "tx_pkts": 14066021,
+ "drop_percentage": 3.8560016368523833
+ },
+ {
+ "rx_pps": 707523.1949731325,
+ "rx_pkts": 7031012,
+ "time_ms": 1648522969304,
+ "drop_pct": 1280,
+ "total_tx_pps": 703229,
+ "tx_pps": 707652,
+ "tx_pkts": 7032292,
+ "drop_percentage": 0.01820174702643178
+ },
+ {
+ "rx_pps": 353826.0,
+ "rx_pkts": 3522871,
+ "time_ms": 1648522981825,
+ "drop_pct": 0,
+ "total_tx_pps": 352287,
+ "tx_pps": 353826,
+ "tx_pkts": 3522871,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 530740.0,
+ "rx_pkts": 5274760,
+ "time_ms": 1648522994322,
+ "drop_pct": 0,
+ "total_tx_pps": 527476,
+ "tx_pps": 530740,
+ "tx_pkts": 5274760,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 619168.936279166,
+ "rx_pkts": 6154233,
+ "time_ms": 1648523006848,
+ "drop_pct": 269,
+ "total_tx_pps": 615450,
+ "tx_pps": 619196,
+ "tx_pkts": 6154502,
+ "drop_percentage": 0.004370784183675625
+ },
+ {
+ "rx_pps": 574945.8616487811,
+ "rx_pkts": 5713528,
+ "time_ms": 1648523019362,
+ "drop_pct": 220,
+ "total_tx_pps": 571374,
+ "tx_pps": 574968,
+ "tx_pkts": 5713748,
+ "drop_percentage": 0.0038503623190942267
+ },
+ {
+ "rx_pps": 552739.5964496398,
+ "rx_pkts": 5493404,
+ "time_ms": 1648523031860,
+ "drop_pct": 1137,
+ "total_tx_pps": 549454,
+ "tx_pps": 552854,
+ "tx_pkts": 5494541,
+ "ndr_pps": 265370,
+ "drop_percentage": 0.0206932662801133
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "00c68a9f42064b53b7e9abb957d13033"
+ },
+ "synthesis": {
+ "avg_delay_usec": 135.49841149170769,
+ "total_tx_rate": 527476
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_512-fc_100k-rate_ndr-2.json",
+ "frame_sizes": [
+ "512"
+ ],
+ "rate": "ndr",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-29 03:08:48",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "b4eddc7398da473da06f59d26481dd90",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "512"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_512-fc_100k-rate_ndr-2.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "512"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2519,
+ 2504
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_512-fc_100k-rate_ndr-2.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "512": {
+ "ndr": {
+ "load_percent_per_direction": 3.61328125,
+ "timestamp_sec": 1648523471.325121,
+ "stats": {
+ "total_tx_rate": 421839,
+ "overall": {
+ "rx_pkts": 4218391,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 964,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 4218391,
+ "avg_delay_usec": 91.49982327385015,
+ "min_delay_usec": 32,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 2109089,
+ "min_delay_usec": 32,
+ "drop_pct": 0,
+ "max_delay_usec": 964,
+ "tx_pkts": 2109302,
+ "avg_delay_usec": 95,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 2109302,
+ "min_delay_usec": 32,
+ "drop_pct": 0,
+ "max_delay_usec": 234,
+ "tx_pkts": 2109089,
+ "avg_delay_usec": 88,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 1795346784.0,
+ "theoretical_tx_rate_pps": 11748120.30075188
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 7.2265625,
+ "duration_sec": 10.0,
+ "l2frame_size": "512",
+ "rate_pps": 424492,
+ "rate_bps": 1806640624.0,
+ "time_taken_sec": 137.6849229335785
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 563084.4500570935,
+ "rx_pkts": 5335501,
+ "time_ms": 1648523346125,
+ "drop_pct": 105983691,
+ "total_tx_pps": 11131919,
+ "tx_pps": 11748120,
+ "tx_pkts": 111319192,
+ "drop_percentage": 95.20702503841386
+ },
+ {
+ "rx_pps": 637290.2801695273,
+ "rx_pkts": 6333073,
+ "time_ms": 1648523358659,
+ "drop_pct": 52040406,
+ "total_tx_pps": 5837347,
+ "tx_pps": 5874060,
+ "tx_pkts": 58373479,
+ "drop_percentage": 89.15076999265368
+ },
+ {
+ "rx_pps": 1745105.2638676804,
+ "rx_pkts": 17342859,
+ "time_ms": 1648523371158,
+ "drop_pct": 11845350,
+ "total_tx_pps": 2918820,
+ "tx_pps": 2937030,
+ "tx_pkts": 29188209,
+ "drop_percentage": 40.582654454749175
+ },
+ {
+ "rx_pps": 1410723.9011671874,
+ "rx_pkts": 14020482,
+ "time_ms": 1648523383738,
+ "drop_pct": 574347,
+ "total_tx_pps": 1459482,
+ "tx_pps": 1468514,
+ "tx_pkts": 14594829,
+ "drop_percentage": 3.935277350628774
+ },
+ {
+ "rx_pps": 734025.8600312393,
+ "rx_pkts": 7313468,
+ "time_ms": 1648523396281,
+ "drop_pct": 2293,
+ "total_tx_pps": 731576,
+ "tx_pps": 734256,
+ "tx_pkts": 7315761,
+ "drop_percentage": 0.03134328745840658
+ },
+ {
+ "rx_pps": 367128.0,
+ "rx_pkts": 3648704,
+ "time_ms": 1648523408795,
+ "drop_pct": 0,
+ "total_tx_pps": 364870,
+ "tx_pps": 367128,
+ "tx_pkts": 3648704,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 550589.7713038774,
+ "rx_pkts": 5472037,
+ "time_ms": 1648523421294,
+ "drop_pct": 1016,
+ "total_tx_pps": 547305,
+ "tx_pps": 550692,
+ "tx_pkts": 5473053,
+ "drop_percentage": 0.01856367917504179
+ },
+ {
+ "rx_pps": 458654.12648746,
+ "rx_pkts": 4558336,
+ "time_ms": 1648523433810,
+ "drop_pct": 2543,
+ "total_tx_pps": 456087,
+ "tx_pps": 458910,
+ "tx_pkts": 4560879,
+ "drop_percentage": 0.05575679600357738
+ },
+ {
+ "rx_pps": 413015.98762516497,
+ "rx_pkts": 4104762,
+ "time_ms": 1648523446308,
+ "drop_pct": 20,
+ "total_tx_pps": 410478,
+ "tx_pps": 413018,
+ "tx_pkts": 4104782,
+ "drop_percentage": 0.00048723659380693054
+ },
+ {
+ "rx_pps": 435949.3084804507,
+ "rx_pkts": 4332336,
+ "time_ms": 1648523458810,
+ "drop_pct": 146,
+ "total_tx_pps": 433248,
+ "tx_pps": 435964,
+ "tx_pkts": 4332482,
+ "drop_percentage": 0.0033698928235593364
+ },
+ {
+ "rx_pps": 424492.0,
+ "rx_pkts": 4218391,
+ "time_ms": 1648523471324,
+ "drop_pct": 0,
+ "total_tx_pps": 421839,
+ "tx_pps": 424492,
+ "tx_pkts": 4218391,
+ "ndr_pps": 212246,
+ "drop_percentage": 0.0
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "b4eddc7398da473da06f59d26481dd90"
+ },
+ "synthesis": {
+ "avg_delay_usec": 91.49982327385015,
+ "total_tx_rate": 421839
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_768-fc_100k-rate_ndr-2.json",
+ "frame_sizes": [
+ "768"
+ ],
+ "rate": "ndr",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-29 03:13:41",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "23114778f5174c1a8a3ff5e0156d0214",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "768"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_768-fc_100k-rate_ndr-1.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "768"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2519,
+ 2504
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_768-fc_100k-rate_ndr-1.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "768": {
+ "ndr": {
+ "load_percent_per_direction": 5.859375,
+ "timestamp_sec": 1648523764.1071556,
+ "stats": {
+ "total_tx_rate": 461876,
+ "overall": {
+ "rx_pkts": 4618724,
+ "drop_percentage": 0.0008227312860026129,
+ "drop_pct": 38,
+ "max_delay_usec": 4782,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 4618762,
+ "avg_delay_usec": 105.0,
+ "min_delay_usec": 33,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 2309249,
+ "min_delay_usec": 33,
+ "drop_pct": 16,
+ "max_delay_usec": 2687,
+ "tx_pkts": 2309497,
+ "avg_delay_usec": 105,
+ "drop_percentage": 0.000692791547250332
+ },
+ "0": {
+ "rx_pkts": 2309475,
+ "min_delay_usec": 33,
+ "drop_pct": 22,
+ "max_delay_usec": 4782,
+ "tx_pkts": 2309265,
+ "avg_delay_usec": 105,
+ "drop_percentage": 0.0009526840791334039
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 2911666304.0,
+ "theoretical_tx_rate_pps": 7931472.081218274
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 11.71875,
+ "duration_sec": 10.0,
+ "l2frame_size": "768",
+ "rate_pps": 464734,
+ "rate_bps": 2929687500.0,
+ "time_taken_sec": 137.67143726348877
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 955878.5749151269,
+ "rx_pkts": 9207107,
+ "time_ms": 1648523638974,
+ "drop_pct": 67189533,
+ "total_tx_pps": 7639664,
+ "tx_pps": 7931472,
+ "tx_pkts": 76396640,
+ "drop_percentage": 87.9482828040605
+ },
+ {
+ "rx_pps": 972237.1870658809,
+ "rx_pkts": 9662578,
+ "time_ms": 1648523651488,
+ "drop_pct": 29750884,
+ "total_tx_pps": 3941346,
+ "tx_pps": 3965736,
+ "tx_pkts": 39413462,
+ "drop_percentage": 75.48406683990359
+ },
+ {
+ "rx_pps": 1578290.234876225,
+ "rx_pkts": 15684261,
+ "time_ms": 1648523663985,
+ "drop_pct": 4020492,
+ "total_tx_pps": 1970475,
+ "tx_pps": 1982868,
+ "tx_pkts": 19704753,
+ "drop_percentage": 20.40366605965576
+ },
+ {
+ "rx_pps": 991198.3508095556,
+ "rx_pkts": 9851027,
+ "time_ms": 1648523676482,
+ "drop_pct": 2342,
+ "total_tx_pps": 985336,
+ "tx_pps": 991434,
+ "tx_pkts": 9853369,
+ "drop_percentage": 0.023768520188374147
+ },
+ {
+ "rx_pps": 495674.5408910233,
+ "rx_pkts": 4925767,
+ "time_ms": 1648523688978,
+ "drop_pct": 412,
+ "total_tx_pps": 492617,
+ "tx_pps": 495716,
+ "tx_pkts": 4926179,
+ "drop_percentage": 0.00836348009278591
+ },
+ {
+ "rx_pps": 247858.0,
+ "rx_pkts": 2463338,
+ "time_ms": 1648523701524,
+ "drop_pct": 0,
+ "total_tx_pps": 246333,
+ "tx_pps": 247858,
+ "tx_pkts": 2463338,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 371786.0,
+ "rx_pkts": 3698343,
+ "time_ms": 1648523714031,
+ "drop_pct": 0,
+ "total_tx_pps": 369834,
+ "tx_pps": 371786,
+ "tx_pkts": 3698343,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 433750.39284890535,
+ "rx_pkts": 4318204,
+ "time_ms": 1648523726546,
+ "drop_pct": 16,
+ "total_tx_pps": 431822,
+ "tx_pps": 433752,
+ "tx_pkts": 4318220,
+ "drop_percentage": 0.00037052303958575524
+ },
+ {
+ "rx_pps": 464730.17648798524,
+ "rx_pkts": 4618724,
+ "time_ms": 1648523739092,
+ "drop_pct": 38,
+ "total_tx_pps": 461876,
+ "tx_pps": 464734,
+ "tx_pkts": 4618762,
+ "drop_percentage": 0.0008227312860026128
+ },
+ {
+ "rx_pps": 480195.32365105936,
+ "rx_pkts": 4772423,
+ "time_ms": 1648523751589,
+ "drop_pct": 285,
+ "total_tx_pps": 477270,
+ "tx_pps": 480224,
+ "tx_pkts": 4772708,
+ "drop_percentage": 0.005971452684723222
+ },
+ {
+ "rx_pps": 472303.0115781439,
+ "rx_pkts": 4693985,
+ "time_ms": 1648523764106,
+ "drop_pct": 1759,
+ "total_tx_pps": 469574,
+ "tx_pps": 472480,
+ "tx_pkts": 4695744,
+ "ndr_pps": 232367,
+ "drop_percentage": 0.03745945264477791
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "23114778f5174c1a8a3ff5e0156d0214"
+ },
+ "synthesis": {
+ "avg_delay_usec": 105.0,
+ "total_tx_rate": 461876
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1024-fc_100k-rate_ndr-2.json",
+ "frame_sizes": [
+ "1024"
+ ],
+ "rate": "ndr",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-29 03:18:34",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "fbf5ac38628f451fa3ca8b356e8c75b2",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "1024"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1024-fc_100k-rate_ndr-0.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "1024"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2519,
+ 2504
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1024-fc_100k-rate_ndr-0.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "1024": {
+ "ndr": {
+ "load_percent_per_direction": 6.640625,
+ "timestamp_sec": 1648524057.2266753,
+ "stats": {
+ "total_tx_rate": 395081,
+ "overall": {
+ "rx_pkts": 3950815,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 5009,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 3950815,
+ "avg_delay_usec": 135.49999860788216,
+ "min_delay_usec": 32,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1975407,
+ "min_delay_usec": 32,
+ "drop_pct": 0,
+ "max_delay_usec": 1872,
+ "tx_pkts": 1975408,
+ "avg_delay_usec": 141,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 1975408,
+ "min_delay_usec": 35,
+ "drop_pct": 0,
+ "max_delay_usec": 5009,
+ "tx_pkts": 1975407,
+ "avg_delay_usec": 130,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 3299716512.0,
+ "theoretical_tx_rate_pps": 5986590.038314176
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 13.28125,
+ "duration_sec": 10.0,
+ "l2frame_size": "1024",
+ "rate_pps": 397546,
+ "rate_bps": 3320312500.0,
+ "time_taken_sec": 137.57492899894714
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 1528705.606599547,
+ "rx_pkts": 14848752,
+ "time_ms": 1648523932137,
+ "drop_pct": 43300698,
+ "total_tx_pps": 5814945,
+ "tx_pps": 5986590,
+ "tx_pkts": 58149450,
+ "drop_percentage": 74.46450138393398
+ },
+ {
+ "rx_pps": 1577883.6850487113,
+ "rx_pkts": 15680218,
+ "time_ms": 1648523944639,
+ "drop_pct": 14065639,
+ "total_tx_pps": 2974585,
+ "tx_pps": 2993294,
+ "tx_pkts": 29745857,
+ "drop_percentage": 47.286043901844884
+ },
+ {
+ "rx_pps": 1403083.656451526,
+ "rx_pkts": 13943147,
+ "time_ms": 1648523957150,
+ "drop_pct": 929776,
+ "total_tx_pps": 1487292,
+ "tx_pps": 1496646,
+ "tx_pkts": 14872923,
+ "drop_percentage": 6.25146785201537
+ },
+ {
+ "rx_pps": 748312.0377400354,
+ "rx_pkts": 7436354,
+ "time_ms": 1648523969710,
+ "drop_pct": 99,
+ "total_tx_pps": 743645,
+ "tx_pps": 748322,
+ "tx_pkts": 7436453,
+ "drop_percentage": 0.0013312798453778971
+ },
+ {
+ "rx_pps": 374160.0,
+ "rx_pkts": 3718217,
+ "time_ms": 1648523982208,
+ "drop_pct": 0,
+ "total_tx_pps": 371821,
+ "tx_pps": 374160,
+ "tx_pkts": 3718217,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 561003.6221851375,
+ "rx_pkts": 5575257,
+ "time_ms": 1648523994704,
+ "drop_pct": 2369,
+ "total_tx_pps": 557762,
+ "tx_pps": 561242,
+ "tx_pkts": 5577626,
+ "drop_percentage": 0.042473267300460804
+ },
+ {
+ "rx_pps": 467630.352253285,
+ "rx_pkts": 4647080,
+ "time_ms": 1648524007203,
+ "drop_pct": 712,
+ "total_tx_pps": 464779,
+ "tx_pps": 467702,
+ "tx_pkts": 4647792,
+ "drop_percentage": 0.015319102059644665
+ },
+ {
+ "rx_pps": 420890.9516613151,
+ "rx_pkts": 4183446,
+ "time_ms": 1648524019707,
+ "drop_pct": 408,
+ "total_tx_pps": 418385,
+ "tx_pps": 420932,
+ "tx_pkts": 4183854,
+ "drop_percentage": 0.00975177432099686
+ },
+ {
+ "rx_pps": 397546.0,
+ "rx_pkts": 3950815,
+ "time_ms": 1648524032233,
+ "drop_pct": 0,
+ "total_tx_pps": 395081,
+ "tx_pps": 397546,
+ "tx_pkts": 3950815,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 409232.9685563975,
+ "rx_pkts": 4066755,
+ "time_ms": 1648524044730,
+ "drop_pct": 50,
+ "total_tx_pps": 406680,
+ "tx_pps": 409238,
+ "tx_pkts": 4066805,
+ "drop_percentage": 0.0012294663747093849
+ },
+ {
+ "rx_pps": 403269.836569411,
+ "rx_pkts": 4007497,
+ "time_ms": 1648524057225,
+ "drop_pct": 1214,
+ "total_tx_pps": 400871,
+ "tx_pps": 403392,
+ "tx_pkts": 4008711,
+ "ndr_pps": 198773,
+ "drop_percentage": 0.030284048912480845
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "fbf5ac38628f451fa3ca8b356e8c75b2"
+ },
+ "synthesis": {
+ "avg_delay_usec": 135.49999860788216,
+ "total_tx_rate": 395081
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1280-fc_100k-rate_ndr-2.json",
+ "frame_sizes": [
+ "1280"
+ ],
+ "rate": "ndr",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-29 03:30:47",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "786f3740545f4a40a9dc01f9dffc595c",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "1280"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1280-fc_100k-rate_ndr-2.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "1280"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2519,
+ 2504
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1280-fc_100k-rate_ndr-2.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "1280": {
+ "ndr": {
+ "load_percent_per_direction": 11.5234375,
+ "timestamp_sec": 1648524790.37032,
+ "stats": {
+ "total_tx_rate": 551101,
+ "overall": {
+ "rx_pkts": 5510977,
+ "drop_percentage": 0.0007076735033975586,
+ "drop_pct": 39,
+ "max_delay_usec": 3562,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 5511016,
+ "avg_delay_usec": 147.99948230595047,
+ "min_delay_usec": 32,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 2755330,
+ "min_delay_usec": 32,
+ "drop_pct": 39,
+ "max_delay_usec": 1593,
+ "tx_pkts": 2755647,
+ "avg_delay_usec": 157,
+ "drop_percentage": 0.0014152756140390988
+ },
+ "0": {
+ "rx_pkts": 2755647,
+ "min_delay_usec": 34,
+ "drop_pct": 0,
+ "max_delay_usec": 3562,
+ "tx_pkts": 2755369,
+ "avg_delay_usec": 139,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 5731450400.0,
+ "theoretical_tx_rate_pps": 4807692.307692308
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 23.046875,
+ "duration_sec": 10.0,
+ "l2frame_size": "1280",
+ "rate_pps": 554010,
+ "rate_bps": 5761718750.0,
+ "time_taken_sec": 137.65743374824524
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 1615487.8462332233,
+ "rx_pkts": 15772944,
+ "time_ms": 1648524665199,
+ "drop_pct": 31167339,
+ "total_tx_pps": 4694028,
+ "tx_pps": 4807692,
+ "tx_pkts": 46940283,
+ "drop_percentage": 66.3978506478114
+ },
+ {
+ "rx_pps": 1489092.605554872,
+ "rx_pkts": 14797858,
+ "time_ms": 1648524677694,
+ "drop_pct": 9090362,
+ "total_tx_pps": 2388822,
+ "tx_pps": 2403846,
+ "tx_pkts": 23888220,
+ "drop_percentage": 38.05374364435693
+ },
+ {
+ "rx_pps": 1181454.0274231592,
+ "rx_pkts": 11741884,
+ "time_ms": 1648524690189,
+ "drop_pct": 203421,
+ "total_tx_pps": 1194530,
+ "tx_pps": 1201922,
+ "tx_pkts": 11945305,
+ "drop_percentage": 1.7029368442245718
+ },
+ {
+ "rx_pps": 600838.4525039338,
+ "rx_pkts": 5971434,
+ "time_ms": 1648524702817,
+ "drop_pct": 1208,
+ "total_tx_pps": 597264,
+ "tx_pps": 600960,
+ "tx_pkts": 5972642,
+ "drop_percentage": 0.020225555122841785
+ },
+ {
+ "rx_pps": 300480.0,
+ "rx_pkts": 2986322,
+ "time_ms": 1648524715333,
+ "drop_pct": 0,
+ "total_tx_pps": 298632,
+ "tx_pps": 300480,
+ "tx_pkts": 2986322,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 450719.39622668474,
+ "rx_pkts": 4479026,
+ "time_ms": 1648524727826,
+ "drop_pct": 6,
+ "total_tx_pps": 447903,
+ "tx_pps": 450720,
+ "tx_pkts": 4479032,
+ "drop_percentage": 0.00013395751582038261
+ },
+ {
+ "rx_pps": 525840.0,
+ "rx_pkts": 5225536,
+ "time_ms": 1648524740327,
+ "drop_pct": 0,
+ "total_tx_pps": 522553,
+ "tx_pps": 525840,
+ "tx_pkts": 5225536,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 562993.5002502074,
+ "rx_pkts": 5595314,
+ "time_ms": 1648524752854,
+ "drop_pct": 4040,
+ "total_tx_pps": 559935,
+ "tx_pps": 563400,
+ "tx_pkts": 5599354,
+ "drop_percentage": 0.07215118029686995
+ },
+ {
+ "rx_pps": 544616.0833552305,
+ "rx_pkts": 5423016,
+ "time_ms": 1648524765370,
+ "drop_pct": 39,
+ "total_tx_pps": 542305,
+ "tx_pps": 544620,
+ "tx_pkts": 5423055,
+ "drop_percentage": 0.0007191518433797923
+ },
+ {
+ "rx_pps": 554006.0794180238,
+ "rx_pkts": 5510977,
+ "time_ms": 1648524777872,
+ "drop_pct": 39,
+ "total_tx_pps": 551101,
+ "tx_pps": 554010,
+ "tx_pkts": 5511016,
+ "drop_percentage": 0.0007076735033975586
+ },
+ {
+ "rx_pps": 558698.1513422158,
+ "rx_pkts": 5552345,
+ "time_ms": 1648524790369,
+ "drop_pct": 78,
+ "total_tx_pps": 555242,
+ "tx_pps": 558706,
+ "tx_pkts": 5552423,
+ "ndr_pps": 277005,
+ "drop_percentage": 0.0014047921060769326
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "786f3740545f4a40a9dc01f9dffc595c"
+ },
+ "synthesis": {
+ "avg_delay_usec": 147.99948230595047,
+ "total_tx_rate": 551101
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1518-fc_100k-rate_ndr-2.json",
+ "frame_sizes": [
+ "1518"
+ ],
+ "rate": "ndr",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-29 03:38:06",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "b9b765f0842945868ef0d452b85570ed",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "1518"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1518-fc_100k-rate_ndr-2.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "1518"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2519,
+ 2504
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1518-fc_100k-rate_ndr-2.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "1518": {
+ "ndr": {
+ "load_percent_per_direction": 12.5,
+ "timestamp_sec": 1648525229.1659203,
+ "stats": {
+ "total_tx_rate": 504814,
+ "overall": {
+ "rx_pkts": 5048100,
+ "drop_percentage": 0.0009706528075934367,
+ "drop_pct": 49,
+ "max_delay_usec": 311,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 5048149,
+ "avg_delay_usec": 148.00011410233554,
+ "min_delay_usec": 35,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 2524026,
+ "min_delay_usec": 35,
+ "drop_pct": 49,
+ "max_delay_usec": 311,
+ "tx_pkts": 2524074,
+ "avg_delay_usec": 136,
+ "drop_percentage": 0.001941305999744857
+ },
+ "0": {
+ "rx_pkts": 2524074,
+ "min_delay_usec": 39,
+ "drop_pct": 0,
+ "max_delay_usec": 303,
+ "tx_pkts": 2524075,
+ "avg_delay_usec": 160,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 6211231456.0,
+ "theoretical_tx_rate_pps": 4063719.1157347206
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 25.0,
+ "duration_sec": 10.0,
+ "l2frame_size": "1518",
+ "rate_pps": 507964,
+ "rate_bps": 6250000000.0,
+ "time_taken_sec": 137.6200978755951
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 1348830.8736421221,
+ "rx_pkts": 13196248,
+ "time_ms": 1648525104030,
+ "drop_pct": 26561020,
+ "total_tx_pps": 3975726,
+ "tx_pps": 4063718,
+ "tx_pkts": 39757268,
+ "drop_percentage": 66.80796074820836
+ },
+ {
+ "rx_pps": 1451865.4390061933,
+ "rx_pkts": 14429367,
+ "time_ms": 1648525116526,
+ "drop_pct": 5764257,
+ "total_tx_pps": 2019362,
+ "tx_pps": 2031858,
+ "tx_pkts": 20193624,
+ "drop_percentage": 28.544935767844347
+ },
+ {
+ "rx_pps": 1014023.4973269543,
+ "rx_pkts": 10076861,
+ "time_ms": 1648525129050,
+ "drop_pct": 18926,
+ "total_tx_pps": 1009578,
+ "tx_pps": 1015928,
+ "tx_pkts": 10095787,
+ "drop_percentage": 0.18746433537078389
+ },
+ {
+ "rx_pps": 507959.0694331724,
+ "rx_pkts": 5048100,
+ "time_ms": 1648525141631,
+ "drop_pct": 49,
+ "total_tx_pps": 504814,
+ "tx_pps": 507964,
+ "tx_pkts": 5048149,
+ "drop_percentage": 0.0009706528075934367
+ },
+ {
+ "rx_pps": 761678.3540363008,
+ "rx_pkts": 7569942,
+ "time_ms": 1648525154127,
+ "drop_pct": 2660,
+ "total_tx_pps": 757260,
+ "tx_pps": 761946,
+ "tx_pkts": 7572602,
+ "drop_percentage": 0.03512663150658123
+ },
+ {
+ "rx_pps": 634872.7798972944,
+ "rx_pkts": 6309050,
+ "time_ms": 1648525166633,
+ "drop_pct": 827,
+ "total_tx_pps": 630987,
+ "tx_pps": 634956,
+ "tx_pkts": 6309877,
+ "drop_percentage": 0.013106436147645985
+ },
+ {
+ "rx_pps": 571211.9497838132,
+ "rx_pkts": 5676421,
+ "time_ms": 1648525179164,
+ "drop_pct": 2465,
+ "total_tx_pps": 567888,
+ "tx_pps": 571460,
+ "tx_pkts": 5678886,
+ "drop_percentage": 0.04340640048065765
+ },
+ {
+ "rx_pps": 539692.3793376087,
+ "rx_pkts": 5363734,
+ "time_ms": 1648525191676,
+ "drop_pct": 195,
+ "total_tx_pps": 536392,
+ "tx_pps": 539712,
+ "tx_pkts": 5363929,
+ "drop_percentage": 0.0036353948756592414
+ },
+ {
+ "rx_pps": 523781.9497057231,
+ "rx_pkts": 5205085,
+ "time_ms": 1648525204173,
+ "drop_pct": 557,
+ "total_tx_pps": 520564,
+ "tx_pps": 523838,
+ "tx_pkts": 5205642,
+ "drop_percentage": 0.010699929038531654
+ },
+ {
+ "rx_pps": 515844.6541285334,
+ "rx_pkts": 5126210,
+ "time_ms": 1648525216667,
+ "drop_pct": 550,
+ "total_tx_pps": 512676,
+ "tx_pps": 515900,
+ "tx_pkts": 5126760,
+ "drop_percentage": 0.010728023156925622
+ },
+ {
+ "rx_pps": 511849.2830473219,
+ "rx_pkts": 5086504,
+ "time_ms": 1648525229165,
+ "drop_pct": 822,
+ "total_tx_pps": 508732,
+ "tx_pps": 511932,
+ "tx_pkts": 5087326,
+ "ndr_pps": 253982,
+ "drop_percentage": 0.016157800777854614
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "b9b765f0842945868ef0d452b85570ed"
+ },
+ "synthesis": {
+ "avg_delay_usec": 148.00011410233554,
+ "total_tx_rate": 504814
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_IMIX-fc_100k-rate_ndr-2.json",
+ "frame_sizes": [
+ "IMIX"
+ ],
+ "rate": "ndr",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-29 03:40:32",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "14202ba37ebc4fdea8f16b0278600b2d",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "IMIX"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_IMIX-fc_100k-rate_ndr-0.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "IMIX"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2519,
+ 2504
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_IMIX-fc_100k-rate_ndr-0.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "IMIX": {
+ "ndr": {
+ "load_percent_per_direction": 2.34375,
+ "timestamp_sec": 1648525375.443067,
+ "stats": {
+ "total_tx_rate": 381275,
+ "overall": {
+ "rx_pkts": 3812745,
+ "drop_percentage": 0.0001311389417087404,
+ "drop_pct": 5,
+ "max_delay_usec": 4320,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 3812750,
+ "avg_delay_usec": 101.9999483311892,
+ "min_delay_usec": 31,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1906274,
+ "min_delay_usec": 31,
+ "drop_pct": 5,
+ "max_delay_usec": 4320,
+ "tx_pkts": 1906471,
+ "avg_delay_usec": 103,
+ "drop_percentage": 0.00026226467646242715
+ },
+ "0": {
+ "rx_pkts": 1906471,
+ "min_delay_usec": 33,
+ "drop_pct": 0,
+ "max_delay_usec": 1815,
+ "tx_pkts": 1906279,
+ "avg_delay_usec": 101,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 1164668033.3333333,
+ "theoretical_tx_rate_pps": 16368398.079441292
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 4.6875,
+ "duration_sec": 10.0,
+ "l2frame_size": "IMIX",
+ "rate_pps": 383634,
+ "rate_bps": 1171875000.0,
+ "time_taken_sec": 137.6155240535736
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 771093.2513239763,
+ "rx_pkts": 6682599,
+ "time_ms": 1648525250355,
+ "drop_pct": 135172410,
+ "total_tx_pps": 14185500,
+ "tx_pps": 16368398,
+ "tx_pkts": 141855009,
+ "warning": "WARNING: There is a significant difference between requested TX rate (16368398) and actual TX rate (14185500). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "drop_percentage": 95.28913427371465
+ },
+ {
+ "rx_pps": 680193.3374204193,
+ "rx_pkts": 6760101,
+ "time_ms": 1648525262852,
+ "drop_pct": 74578545,
+ "total_tx_pps": 8133864,
+ "tx_pps": 8184198,
+ "tx_pkts": 81338646,
+ "drop_percentage": 91.68894328533572
+ },
+ {
+ "rx_pps": 1311747.3568787286,
+ "rx_pkts": 13036804,
+ "time_ms": 1648525275367,
+ "drop_pct": 27632521,
+ "total_tx_pps": 4066932,
+ "tx_pps": 4092098,
+ "tx_pkts": 40669325,
+ "drop_percentage": 67.94438068495113
+ },
+ {
+ "rx_pps": 1590695.3692736912,
+ "rx_pkts": 15809129,
+ "time_ms": 1648525287882,
+ "drop_pct": 4525523,
+ "total_tx_pps": 2033465,
+ "tx_pps": 2046048,
+ "tx_pkts": 20334652,
+ "drop_percentage": 22.255227185594325
+ },
+ {
+ "rx_pps": 1019699.6569069418,
+ "rx_pkts": 10134290,
+ "time_ms": 1648525300401,
+ "drop_pct": 33039,
+ "total_tx_pps": 1016732,
+ "tx_pps": 1023024,
+ "tx_pkts": 10167329,
+ "drop_percentage": 0.32495260062893605
+ },
+ {
+ "rx_pps": 511492.9830606495,
+ "rx_pkts": 5083477,
+ "time_ms": 1648525312928,
+ "drop_pct": 189,
+ "total_tx_pps": 508366,
+ "tx_pps": 511512,
+ "tx_pkts": 5083666,
+ "drop_percentage": 0.0037177894849897693
+ },
+ {
+ "rx_pps": 255756.0,
+ "rx_pkts": 2541834,
+ "time_ms": 1648525325435,
+ "drop_pct": 0,
+ "total_tx_pps": 254183,
+ "tx_pps": 255756,
+ "tx_pkts": 2541834,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 383633.4969064324,
+ "rx_pkts": 3812745,
+ "time_ms": 1648525337929,
+ "drop_pct": 5,
+ "total_tx_pps": 381275,
+ "tx_pps": 383634,
+ "tx_pkts": 3812750,
+ "drop_percentage": 0.0001311389417087404
+ },
+ {
+ "rx_pps": 447538.0591777257,
+ "rx_pkts": 4456812,
+ "time_ms": 1648525350446,
+ "drop_pct": 338,
+ "total_tx_pps": 445715,
+ "tx_pps": 447572,
+ "tx_pkts": 4457150,
+ "drop_percentage": 0.007583321180575031
+ },
+ {
+ "rx_pps": 415568.9970519043,
+ "rx_pkts": 4130135,
+ "time_ms": 1648525362946,
+ "drop_pct": 328,
+ "total_tx_pps": 413046,
+ "tx_pps": 415602,
+ "tx_pkts": 4130463,
+ "drop_percentage": 0.00794099838202158
+ },
+ {
+ "rx_pps": 399576.8469448261,
+ "rx_pkts": 3971198,
+ "time_ms": 1648525375442,
+ "drop_pct": 409,
+ "total_tx_pps": 397160,
+ "tx_pps": 399618,
+ "tx_pkts": 3971607,
+ "ndr_pps": 191817,
+ "drop_percentage": 0.010298098477518043
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "14202ba37ebc4fdea8f16b0278600b2d"
+ },
+ "synthesis": {
+ "avg_delay_usec": 101.9999483311892,
+ "total_tx_rate": 381275
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_9000-fc_100k-rate_ndr-2.json",
+ "frame_sizes": [
+ "9000"
+ ],
+ "rate": "ndr",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-29 03:52:45",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "2410629fde18450796d4b2a0329b7475",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "9000"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_9000-fc_100k-rate_ndr-2.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "9000"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2519,
+ 2504
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_9000-fc_100k-rate_ndr-2.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "9000": {
+ "ndr": {
+ "load_percent_per_direction": 38.0859375,
+ "timestamp_sec": 1648526108.2238886,
+ "stats": {
+ "total_tx_rate": 262248,
+ "overall": {
+ "rx_pkts": 2622479,
+ "drop_percentage": 0.00038131713803184685,
+ "drop_pct": 10,
+ "max_delay_usec": 6043,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 2622489,
+ "avg_delay_usec": 797.498445936078,
+ "min_delay_usec": 77,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1311168,
+ "min_delay_usec": 77,
+ "drop_pct": 10,
+ "max_delay_usec": 5571,
+ "tx_pkts": 1311311,
+ "avg_delay_usec": 826,
+ "drop_percentage": 0.0007625956008910168
+ },
+ "0": {
+ "rx_pkts": 1311311,
+ "min_delay_usec": 78,
+ "drop_pct": 0,
+ "max_delay_usec": 6043,
+ "tx_pkts": 1311178,
+ "avg_delay_usec": 769,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 18923815680.0,
+ "theoretical_tx_rate_pps": 692904.6563192905
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 76.171875,
+ "duration_sec": 10.0,
+ "l2frame_size": "9000",
+ "rate_pps": 263898,
+ "rate_bps": 19042968750.0,
+ "time_taken_sec": 137.70801401138306
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 275136.87051549257,
+ "rx_pkts": 2732413,
+ "time_ms": 1648525983002,
+ "drop_pct": 4148889,
+ "total_tx_pps": 688130,
+ "tx_pps": 692904,
+ "tx_pkts": 6881302,
+ "drop_percentage": 60.2922092359847
+ },
+ {
+ "rx_pps": 276450.51010692323,
+ "rx_pkts": 2747283,
+ "time_ms": 1648525995501,
+ "drop_pct": 695654,
+ "total_tx_pps": 344293,
+ "tx_pps": 346452,
+ "tx_pkts": 3442937,
+ "drop_percentage": 20.2052491811497
+ },
+ {
+ "rx_pps": 173226.0,
+ "rx_pkts": 1721608,
+ "time_ms": 1648526007998,
+ "drop_pct": 0,
+ "total_tx_pps": 172160,
+ "tx_pps": 173226,
+ "tx_pkts": 1721608,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 259838.0,
+ "rx_pkts": 2582273,
+ "time_ms": 1648526020514,
+ "drop_pct": 0,
+ "total_tx_pps": 258227,
+ "tx_pps": 259838,
+ "tx_pkts": 2582273,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 276532.862184301,
+ "rx_pkts": 2748324,
+ "time_ms": 1648526033023,
+ "drop_pct": 264475,
+ "total_tx_pps": 301279,
+ "tx_pps": 303144,
+ "tx_pkts": 3012799,
+ "drop_percentage": 8.77838183031792
+ },
+ {
+ "rx_pps": 276802.02633522433,
+ "rx_pkts": 2750861,
+ "time_ms": 1648526045525,
+ "drop_pct": 46609,
+ "total_tx_pps": 279747,
+ "tx_pps": 281492,
+ "tx_pkts": 2797470,
+ "drop_percentage": 1.6661125945944013
+ },
+ {
+ "rx_pps": 270650.71832178126,
+ "rx_pkts": 2689863,
+ "time_ms": 1648526058023,
+ "drop_pct": 132,
+ "total_tx_pps": 268999,
+ "tx_pps": 270664,
+ "tx_pkts": 2689995,
+ "drop_percentage": 0.004907072317978286
+ },
+ {
+ "rx_pps": 265244.0511173625,
+ "rx_pkts": 2636129,
+ "time_ms": 1648526070614,
+ "drop_pct": 79,
+ "total_tx_pps": 263620,
+ "tx_pps": 265252,
+ "tx_pkts": 2636208,
+ "drop_percentage": 0.0029967286344628344
+ },
+ {
+ "rx_pps": 262543.7987422155,
+ "rx_pkts": 2609030,
+ "time_ms": 1648526083208,
+ "drop_pct": 2,
+ "total_tx_pps": 260903,
+ "tx_pps": 262544,
+ "tx_pkts": 2609032,
+ "drop_percentage": 7.665678305210515e-05
+ },
+ {
+ "rx_pps": 263896.99371169903,
+ "rx_pkts": 2622479,
+ "time_ms": 1648526095706,
+ "drop_pct": 10,
+ "total_tx_pps": 262248,
+ "tx_pps": 263898,
+ "tx_pkts": 2622489,
+ "drop_percentage": 0.00038131713803184685
+ },
+ {
+ "rx_pps": 264566.1509460084,
+ "rx_pkts": 2629127,
+ "time_ms": 1648526108223,
+ "drop_pct": 78,
+ "total_tx_pps": 262920,
+ "tx_pps": 264574,
+ "tx_pkts": 2629205,
+ "ndr_pps": 131949,
+ "drop_percentage": 0.0029666762386348724
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "2410629fde18450796d4b2a0329b7475"
+ },
+ "synthesis": {
+ "avg_delay_usec": 797.498445936078,
+ "total_tx_rate": 262248
+ }
+ }
+ ]
+ },
+ "fail_tests": 0,
+ "total_tests": 1,
+ "pass_tests": 1
+ }
+ }
+ ]
+}
diff --git a/test/ut_behave_tests/test_data/project=nfvbench&case=characterization&criteria=PASS&page=2.json b/test/ut_behave_tests/test_data/project=nfvbench&case=characterization&criteria=PASS&page=2.json
new file mode 100644
index 0000000..c0ddacf
--- /dev/null
+++ b/test/ut_behave_tests/test_data/project=nfvbench&case=characterization&criteria=PASS&page=2.json
@@ -0,0 +1,25065 @@
+{
+ "pagination": {
+ "current_page": 2,
+ "total_pages": 2
+ },
+ "results": [
+ {
+ "project_name": "nfvbench",
+ "scenario": "os-nosdn-nofeature-noha",
+ "stop_date": "2022-03-03 08:10:22",
+ "case_name": "characterization",
+ "build_tag": "GUB6K4FMHSH1",
+ "version": "unknown",
+ "pod_name": "AMICAL",
+ "criteria": "PASS",
+ "installer": "unknown",
+ "_id": "622077f1c0d88e001ce40a5e",
+ "start_date": "2022-03-03 04:25:55",
+ "details": {
+ "tests": [
+ {
+ "status": "passed",
+ "elements": [
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.1 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00011944770812988281,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "64 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "64"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.870529174804688e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.512901306152344e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.655952453613281e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 20.04898452758789,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 441.4580554962158,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.0001373291015625,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0002956390380859375,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:17",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.2 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.894371032714844e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 0.00010991096496582031,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.703636169433594e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.369850158691406e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007940292358398438,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 433.3887722492218,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00011849403381347656,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00028204917907714844,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:18",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.3 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.846687316894531e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "256 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "256"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.655952453613281e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.226799011230469e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.226799011230469e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007737398147583008,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 433.3920896053314,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00012111663818359375,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00031113624572753906,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:19",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.4 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.799003601074219e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "512 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "512"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.560585021972656e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.393692016601562e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.584426879882812e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007782936096191406,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 433.3988313674927,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00012111663818359375,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00032019615173339844,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:20",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.5 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.72747802734375e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "768 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "768"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.441375732421875e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.274482727050781e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.417533874511719e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007817983627319336,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 433.39960050582886,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00013256072998046875,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0002803802490234375,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:21",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.6 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00012063980102539062,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "1024 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "1024"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.322166442871094e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.179115295410156e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.036064147949219e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007714271545410156,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 433.40483140945435,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00014662742614746094,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0002925395965576172,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:22",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.7 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010037422180175781,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "1280 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "1280"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.393692016601562e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.322166442871094e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 0.00011348724365234375,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007891654968261719,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 433.40072679519653,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00012135505676269531,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00030994415283203125,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:23",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.8 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.965896606445312e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "1518 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "1518"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.5367431640625e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.34600830078125e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.679794311523438e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007767915725708008,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 433.39458751678467,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00013685226440429688,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00031065940856933594,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:24",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.9 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.0001201629638671875,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "IMIX frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "IMIX"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 0.00010800361633300781,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.34600830078125e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.298324584960938e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007948875427246094,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 433.39232301712036,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.0001227855682373047,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00029540061950683594,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:25",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.10 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.703636169433594e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "9000 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "9000"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.799003601074219e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.274482727050781e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.274482727050781e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.0077228546142578125,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 433.4036717414856,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00011873245239257812,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0002994537353515625,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:26",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.11 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.72747802734375e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "64 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "64"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.489059448242188e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "10k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "10k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.775161743164062e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.465217590332031e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007776737213134766,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.41271233558655,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00012230873107910156,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0002951622009277344,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:27",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.12 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.799003601074219e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.465217590332031e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "10k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "10k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.465217590332031e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.202957153320312e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007769107818603516,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.44420289993286,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00012922286987304688,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0003147125244140625,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:28",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.13 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00011992454528808594,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "256 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "256"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.632110595703125e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "10k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "10k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.417533874511719e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 0.00010967254638671875,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007972955703735352,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.41557693481445,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.0001201629638671875,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0002875328063964844,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:29",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.14 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00011610984802246094,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "512 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "512"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.489059448242188e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "10k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "10k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.202957153320312e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.131431579589844e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007865667343139648,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.4459092617035,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00013709068298339844,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0003178119659423828,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:30",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.15 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010061264038085938,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "768 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "768"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.608268737792969e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "10k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "10k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.417533874511719e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.608268737792969e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007863044738769531,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.40875816345215,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00011682510375976562,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0002982616424560547,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:31",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.16 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.751319885253906e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "1024 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "1024"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.393692016601562e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "10k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "10k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.393692016601562e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.465217590332031e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007781267166137695,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.41113471984863,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00014781951904296875,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0002956390380859375,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:32",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.17 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.655952453613281e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "1280 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "1280"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 0.00010752677917480469,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "10k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "10k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.512901306152344e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.179115295410156e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.00796818733215332,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.41015791893005,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00012063980102539062,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00030732154846191406,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:33",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.18 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.775161743164062e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "1518 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "1518"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.417533874511719e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "10k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "10k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.202957153320312e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.393692016601562e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007746458053588867,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.46103525161743,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00012159347534179688,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0002970695495605469,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:34",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.19 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.846687316894531e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "IMIX frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "IMIX"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.942054748535156e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "10k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "10k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.799003601074219e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.560585021972656e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007760763168334961,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.40750312805176,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00012063980102539062,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0003159046173095703,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:35",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.20 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010085105895996094,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "9000 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "9000"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.632110595703125e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "10k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "10k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.489059448242188e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.655952453613281e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.0077402591705322266,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.42182779312134,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00011897087097167969,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00030732154846191406,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:36",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.21 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.775161743164062e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "64 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "64"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.417533874511719e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.226799011230469e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 0.00011372566223144531,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007884979248046875,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.4939408302307,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00012111663818359375,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0003120899200439453,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:37",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.22 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010085105895996094,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "128 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "128"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.584426879882812e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 0.00011324882507324219,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.393692016601562e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007754087448120117,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.453311920166,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.0001404285430908203,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0003037452697753906,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:38",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.23 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.918212890625e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "256 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "256"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.679794311523438e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.369850158691406e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.179115295410156e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007740497589111328,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.5027401447296,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00013017654418945312,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0002994537353515625,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:39",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.24 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.751319885253906e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "512 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "512"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 0.00010919570922851562,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.369850158691406e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 0.00010466575622558594,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007869720458984375,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.4968614578247,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00012063980102539062,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0003190040588378906,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:40",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.25 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010085105895996094,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "768 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "768"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.441375732421875e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.369850158691406e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.608268737792969e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007755756378173828,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.41006350517273,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00011754035949707031,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00030159950256347656,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:41",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.26 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010013580322265625,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "1024 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "1024"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.703636169433594e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 0.00011706352233886719,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.417533874511719e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.0077631473541259766,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.4135572910309,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00011944770812988281,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00028061866760253906,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:42",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.27 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00012302398681640625,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "1280 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "1280"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.584426879882812e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.584426879882812e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 0.00011610984802246094,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007807254791259766,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.4129407405853,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00011730194091796875,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00029850006103515625,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:43",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.28 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.632110595703125e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "1518 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "1518"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.441375732421875e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.226799011230469e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.465217590332031e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007798910140991211,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.42279505729675,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.0001201629638671875,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00031757354736328125,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:44",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.29 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.870529174804688e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "IMIX frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "IMIX"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.489059448242188e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.417533874511719e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.584426879882812e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007747650146484375,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.46680998802185,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00011920928955078125,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00030684471130371094,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:45",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size and flow count -- @1.30 Frame sizes and flow counts",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.870529174804688e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "9000 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "9000"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.5367431640625e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.417533874511719e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.512901306152344e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.008136987686157227,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 441.5627624988556,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.0001380443572998047,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0003027915954589844,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:46",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a latency test for a defined frame size and throughput percentage -- @1.1 Frame sizes and throughput percentages",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "latency"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:51",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.846687316894531e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "TRex is restarted",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:52",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:99"
+ },
+ "result": {
+ "duration": 9.1552734375e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "64 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:53",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "64"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 0.00012063980102539062,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:54",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.584426879882812e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "70% rate of previous scenario",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:55",
+ "match": {
+ "arguments": [
+ {
+ "name": "percentage_rate",
+ "value": "70%"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:129"
+ },
+ "result": {
+ "duration": 0.00023174285888671875,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:56",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007772684097290039,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "run is started and waiting for result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:57",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 40.20964193344116,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:58",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.0001323223114013672,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:62",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a latency test for a defined frame size and throughput percentage -- @1.2 Frame sizes and throughput percentages",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "latency"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:51",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010061264038085938,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "TRex is restarted",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:52",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:99"
+ },
+ "result": {
+ "duration": 9.489059448242188e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "64 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:53",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "64"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 0.00010657310485839844,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:54",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.250640869140625e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "90% rate of previous scenario",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:55",
+ "match": {
+ "arguments": [
+ {
+ "name": "percentage_rate",
+ "value": "90%"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:129"
+ },
+ "result": {
+ "duration": 0.00022912025451660156,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:56",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.008083343505859375,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "run is started and waiting for result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:57",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 40.24647831916809,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:58",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00013446807861328125,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:63",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a latency test for a defined frame size and throughput percentage -- @1.3 Frame sizes and throughput percentages",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "latency"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:51",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.942054748535156e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "TRex is restarted",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:52",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:99"
+ },
+ "result": {
+ "duration": 9.393692016601562e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "768 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:53",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "768"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 0.00010704994201660156,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:54",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.441375732421875e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "70% rate of previous scenario",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:55",
+ "match": {
+ "arguments": [
+ {
+ "name": "percentage_rate",
+ "value": "70%"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:129"
+ },
+ "result": {
+ "duration": 0.000244140625,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:56",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.008151054382324219,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "run is started and waiting for result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:57",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 38.257242918014526,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:58",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.0001327991485595703,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:64",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a latency test for a defined frame size and throughput percentage -- @1.4 Frame sizes and throughput percentages",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "latency"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:51",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.846687316894531e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "TRex is restarted",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:52",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:99"
+ },
+ "result": {
+ "duration": 9.369850158691406e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "768 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:53",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "768"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 0.00010466575622558594,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:54",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.322166442871094e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "90% rate of previous scenario",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:55",
+ "match": {
+ "arguments": [
+ {
+ "name": "percentage_rate",
+ "value": "90%"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:129"
+ },
+ "result": {
+ "duration": 0.00023818016052246094,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:56",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.008000850677490234,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "run is started and waiting for result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:57",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 38.23027515411377,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:58",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00013971328735351562,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:65",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a latency test for a defined frame size and throughput percentage -- @1.5 Frame sizes and throughput percentages",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "latency"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:51",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010228157043457031,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "TRex is restarted",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:52",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:99"
+ },
+ "result": {
+ "duration": 9.799003601074219e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "1518 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:53",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "1518"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 0.00011301040649414062,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:54",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 0.00010156631469726562,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "70% rate of previous scenario",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:55",
+ "match": {
+ "arguments": [
+ {
+ "name": "percentage_rate",
+ "value": "70%"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:129"
+ },
+ "result": {
+ "duration": 0.00023365020751953125,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:56",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007997751235961914,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "run is started and waiting for result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:57",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 40.18446683883667,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:58",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00013399124145507812,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:66",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a latency test for a defined frame size and throughput percentage -- @1.6 Frame sizes and throughput percentages",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "latency"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:51",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.989738464355469e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "TRex is restarted",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:52",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:99"
+ },
+ "result": {
+ "duration": 9.489059448242188e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "1518 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:53",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "1518"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 0.00012946128845214844,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:54",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.608268737792969e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "90% rate of previous scenario",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:55",
+ "match": {
+ "arguments": [
+ {
+ "name": "percentage_rate",
+ "value": "90%"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:129"
+ },
+ "result": {
+ "duration": 0.00023436546325683594,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:56",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.007965087890625,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "run is started and waiting for result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:57",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 40.255555391311646,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:58",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00013446807861328125,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:67",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a latency test for a defined frame size and throughput percentage -- @1.7 Frame sizes and throughput percentages",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "latency"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:51",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010013580322265625,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "TRex is restarted",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:52",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:99"
+ },
+ "result": {
+ "duration": 9.608268737792969e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "9000 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:53",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "9000"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 0.00010895729064941406,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:54",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.72747802734375e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "70% rate of previous scenario",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:55",
+ "match": {
+ "arguments": [
+ {
+ "name": "percentage_rate",
+ "value": "70%"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:129"
+ },
+ "result": {
+ "duration": 0.00023174285888671875,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:56",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.008159637451171875,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "run is started and waiting for result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:57",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 38.21106767654419,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:58",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.0001327991485595703,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:68",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a latency test for a defined frame size and throughput percentage -- @1.8 Frame sizes and throughput percentages",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "latency"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:51",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010037422180175781,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "TRex is restarted",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:52",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:99"
+ },
+ "result": {
+ "duration": 0.00011754035949707031,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "9000 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:53",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "9000"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 0.00010704994201660156,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:54",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.751319885253906e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "90% rate of previous scenario",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:55",
+ "match": {
+ "arguments": [
+ {
+ "name": "percentage_rate",
+ "value": "90%"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:129"
+ },
+ "result": {
+ "duration": 0.00027060508728027344,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:56",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.008315563201904297,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "run is started and waiting for result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:57",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 38.238194704055786,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:58",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00013208389282226562,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:69",
+ "type": "scenario"
+ }
+ ],
+ "name": "characterization",
+ "keyword": "Feature",
+ "tags": [
+ "characterization"
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/characterization-full.feature:2"
+ }
+ ],
+ "skip_tests": 0,
+ "links": [
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/xtesting.log",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_768-fc_100k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_128-fc_128-rate_ndr-0.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_1518-fc_100k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_512-fc_100k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_64-fc_128-rate_ndr-2.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_9000-fc_10k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_1280-fc_100k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_1024-fc_128-rate_ndr-0.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_64-fc_128-rate_ndr-1.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_64-fc_10k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_768-fc_10k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_128-fc_128-rate_ndr-2.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_IMIX-fc_10k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_256-fc_10k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_9000-fc_100k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/output.html",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_1024-fc_128-rate_ndr-1.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_512-fc_128-rate_ndr-1.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_256-fc_100k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_256-fc_128-rate_ndr-2.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_1024-fc_100k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_128-fc_10k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_9000-fc_100k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_64-fc_100k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-latency-fs_64-fc_100k-rate_70%.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_1280-fc_128-rate_ndr-2.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_256-fc_100k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_512-fc_10k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_768-fc_10k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_768-fc_128-rate_ndr-0.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_512-fc_100k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_IMIX-fc_100k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_64-fc_100k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_1024-fc_100k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_1280-fc_100k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_128-fc_128-rate_ndr-1.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_128-fc_100k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_9000-fc_128-rate_ndr-0.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_9000-fc_128-rate_ndr-1.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_IMIX-fc_128-rate_ndr-1.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_768-fc_10k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_1280-fc_10k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_IMIX-fc_100k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_IMIX-fc_128-rate_ndr-2.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_IMIX-fc_10k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_1518-fc_100k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/behave_tests.log",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_128-fc_10k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-latency-fs_9000-fc_100k-rate_70%.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_512-fc_128-rate_ndr-0.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_9000-fc_128-rate_ndr-2.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_768-fc_100k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/campaign_result.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_9000-fc_10k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_512-fc_10k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_256-fc_10k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_128-fc_100k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-latency-fs_768-fc_100k-rate_90%.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_IMIX-fc_128-rate_ndr-0.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_1280-fc_100k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_64-fc_100k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_1518-fc_128-rate_ndr-0.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/TESTS-characterization-full.xml",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-latency-fs_1518-fc_100k-rate_90%.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_1518-fc_10k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_9000-fc_100k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_256-fc_10k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_64-fc_128-rate_ndr-0.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_1024-fc_128-rate_ndr-2.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_1518-fc_100k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_9000-fc_10k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_1024-fc_10k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_1024-fc_100k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_256-fc_100k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_IMIX-fc_10k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_512-fc_100k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_1024-fc_10k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_1280-fc_128-rate_ndr-0.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_1280-fc_128-rate_ndr-1.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_768-fc_128-rate_ndr-2.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_512-fc_10k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_1518-fc_10k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_768-fc_100k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-latency-fs_64-fc_100k-rate_90%.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_256-fc_128-rate_ndr-0.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_1518-fc_128-rate_ndr-1.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-latency-fs_768-fc_100k-rate_70%.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_256-fc_128-rate_ndr-1.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench.log",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_1518-fc_128-rate_ndr-2.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_64-fc_10k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-latency-fs_9000-fc_100k-rate_90%.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_IMIX-fc_100k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_1518-fc_10k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_1280-fc_10k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_512-fc_128-rate_ndr-2.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_128-fc_10k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_768-fc_128-rate_ndr-1.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-latency-fs_1518-fc_100k-rate_70%.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_1024-fc_10k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_64-fc_10k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_128-fc_100k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/output.json",
+ "http://172.20.73.203:8181/GUB6K4FMHSH1/nfvbench-amical-e2e-intensive-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_characterization-run-7/characterization/nfvbench-throughput-fs_1280-fc_10k-rate_ndr-1.json"
+ ],
+ "results": {
+ "latency": [
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.intensive",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_64-fc_100k-rate_70%.json",
+ "frame_sizes": [
+ "64"
+ ],
+ "rate": "70%",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc6_intensive",
+ "restart": "true"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-03 08:05:30",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": "true",
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "05da7928f54347d98272aae0eb8ccf68",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "202197pps",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "64"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": false,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_64-fc_100k-rate_70%.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": true,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "64"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2504,
+ 2515
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc6_intensive",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.intensive",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_64-fc_100k-rate_70%.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "64": {
+ "run_config": {
+ "direction-forward": {
+ "rx": {
+ "rate_percent": 0.2706993408,
+ "rate_pps": 100706,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 67674835
+ },
+ "tx": {
+ "rate_percent": 0.2707356288,
+ "rate_pps": 100720,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 67683907
+ },
+ "orig": {
+ "rate_percent": 0.271752768,
+ "rate_pps": 101098,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 67938192
+ }
+ },
+ "direction-total": {
+ "rx": {
+ "rate_percent": 0.5414347008,
+ "rate_pps": 201426.0,
+ "rate_bps": 135358675.0
+ },
+ "tx": {
+ "rate_percent": 0.5414709888,
+ "rate_pps": 201440.0,
+ "rate_bps": 135367747.0
+ },
+ "orig": {
+ "rate_percent": 0.543505536,
+ "rate_pps": 202196.0,
+ "rate_bps": 135876384.0
+ }
+ },
+ "direction-reverse": {
+ "rx": {
+ "rate_percent": 0.27073536,
+ "rate_pps": 100720,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 67683840
+ },
+ "tx": {
+ "rate_percent": 0.27073536,
+ "rate_pps": 100720,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 67683840
+ },
+ "orig": {
+ "rate_percent": 0.271752768,
+ "rate_pps": 101098,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 67938192
+ }
+ }
+ },
+ "packet_path_stats": {
+ "Forward": {
+ "interfaces": [
+ "TRex.TX.p0",
+ "TRex.RX.p1"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 1006353,
+ "-127 (-0.0126%)"
+ ],
+ "lat_max_usec": 6319,
+ "lat_avg_usec": 343,
+ "lat_min_usec": 55,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ },
+ "Reverse": {
+ "interfaces": [
+ "TRex.TX.p1",
+ "TRex.RX.p0"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 1007200,
+ 1007200
+ ],
+ "lat_max_usec": 16679,
+ "lat_avg_usec": 332,
+ "lat_min_usec": 39,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ }
+ },
+ "stats": {
+ "total_tx_rate": 201440,
+ "overall": {
+ "drop_rate_percent": 0.006701744091667946,
+ "rx": {
+ "dropped_pkts": 135,
+ "pkt_bit_rate": 54798412.0,
+ "pkt_rate": 100732.0,
+ "max_delay_usec": 16679,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "avg_delay_usec": 337.50036589010585,
+ "total_pkt_bytes": 136970088,
+ "total_pkts": 2014266,
+ "min_delay_usec": 39
+ },
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg=",
+ "tx": {
+ "total_pkt_bytes": 136979268,
+ "total_pkts": 2014401,
+ "pkt_bit_rate": 54796758.0,
+ "pkt_rate": 100728.5
+ }
+ },
+ "1": {
+ "drop_rate_percent": 0.01340349483717236,
+ "rx": {
+ "dropped_pkts": 135,
+ "pkt_bit_rate": 54797180,
+ "pkt_rate": 100730,
+ "max_delay_usec": 16679,
+ "total_pkt_bytes": 68480488,
+ "avg_delay_usec": 332,
+ "total_pkts": 1007066,
+ "min_delay_usec": 39
+ },
+ "tx": {
+ "total_pkt_bytes": 68489600,
+ "total_pkts": 1007200,
+ "pkt_bit_rate": 54796540,
+ "pkt_rate": 100728
+ }
+ },
+ "0": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 54799644,
+ "pkt_rate": 100734,
+ "max_delay_usec": 6319,
+ "total_pkt_bytes": 68489600,
+ "avg_delay_usec": 343,
+ "total_pkts": 1007200,
+ "min_delay_usec": 55
+ },
+ "tx": {
+ "total_pkt_bytes": 68489668,
+ "total_pkts": 1007201,
+ "pkt_bit_rate": 54796976,
+ "pkt_rate": 100729
+ }
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 135367680.0,
+ "theoretical_tx_rate_pps": 74404761.90476191
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "05da7928f54347d98272aae0eb8ccf68"
+ },
+ "synthesis": {
+ "avg_delay_usec": 337.50036589010585,
+ "total_tx_rate": 201440
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.intensive",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_64-fc_100k-rate_90%.json",
+ "frame_sizes": [
+ "64"
+ ],
+ "rate": "90%",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc6_intensive",
+ "restart": "true"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-03 08:06:11",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": "true",
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "2eb5c2020c5149db9e10bab584e2dbf6",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "259968pps",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "64"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": false,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_64-fc_100k-rate_90%.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": true,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "64"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2504,
+ 2515
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc6_intensive",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.intensive",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_64-fc_100k-rate_90%.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "64": {
+ "run_config": {
+ "direction-forward": {
+ "rx": {
+ "rate_percent": 0.34818819840000004,
+ "rate_pps": 129534,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 87047049
+ },
+ "tx": {
+ "rate_percent": 0.3481965312,
+ "rate_pps": 129537,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 87049132
+ },
+ "orig": {
+ "rate_percent": 0.349396992,
+ "rate_pps": 129984,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 87349248
+ }
+ },
+ "direction-total": {
+ "rx": {
+ "rate_percent": 0.696405696,
+ "rate_pps": 259079.0,
+ "rate_bps": 174101423.0
+ },
+ "tx": {
+ "rate_percent": 0.6964140288,
+ "rate_pps": 259082.0,
+ "rate_bps": 174103506.0
+ },
+ "orig": {
+ "rate_percent": 0.698793984,
+ "rate_pps": 259968.0,
+ "rate_bps": 174698496.0
+ }
+ },
+ "direction-reverse": {
+ "rx": {
+ "rate_percent": 0.3482174976,
+ "rate_pps": 129545,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 87054374
+ },
+ "tx": {
+ "rate_percent": 0.3482174976,
+ "rate_pps": 129545,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 87054374
+ },
+ "orig": {
+ "rate_percent": 0.349396992,
+ "rate_pps": 129984,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 87349248
+ }
+ }
+ },
+ "packet_path_stats": {
+ "Forward": {
+ "interfaces": [
+ "TRex.TX.p0",
+ "TRex.RX.p1"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 1294246,
+ "+14 (+0.0011%)"
+ ],
+ "lat_max_usec": 5982,
+ "lat_avg_usec": 438,
+ "lat_min_usec": 53,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ },
+ "Reverse": {
+ "interfaces": [
+ "TRex.TX.p1",
+ "TRex.RX.p0"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 1295452,
+ 1295452
+ ],
+ "lat_max_usec": 12890,
+ "lat_avg_usec": 403,
+ "lat_min_usec": 79,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ }
+ },
+ "stats": {
+ "total_tx_rate": 259082,
+ "overall": {
+ "drop_rate_percent": 0.0011965296009843964,
+ "rx": {
+ "dropped_pkts": 31,
+ "pkt_bit_rate": 70518144.0,
+ "pkt_rate": 129628.0,
+ "max_delay_usec": 12890,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "avg_delay_usec": 420.50073626049146,
+ "total_pkt_bytes": 176174060,
+ "total_pkts": 2590795,
+ "min_delay_usec": 53
+ },
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg=",
+ "tx": {
+ "total_pkt_bytes": 176176168,
+ "total_pkts": 2590826,
+ "pkt_bit_rate": 70546464.0,
+ "pkt_rate": 129680.5
+ }
+ },
+ "1": {
+ "drop_rate_percent": 0.0023929871581502052,
+ "rx": {
+ "dropped_pkts": 31,
+ "pkt_bit_rate": 70304360,
+ "pkt_rate": 129235,
+ "max_delay_usec": 12890,
+ "total_pkt_bytes": 88083324,
+ "avg_delay_usec": 403,
+ "total_pkts": 1295343,
+ "min_delay_usec": 79
+ },
+ "tx": {
+ "total_pkt_bytes": 88090736,
+ "total_pkts": 1295452,
+ "pkt_bit_rate": 70660064,
+ "pkt_rate": 129889
+ }
+ },
+ "0": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 70731928,
+ "pkt_rate": 130021,
+ "max_delay_usec": 5982,
+ "total_pkt_bytes": 88090736,
+ "avg_delay_usec": 438,
+ "total_pkts": 1295452,
+ "min_delay_usec": 53
+ },
+ "tx": {
+ "total_pkt_bytes": 88085432,
+ "total_pkts": 1295374,
+ "pkt_bit_rate": 70432864,
+ "pkt_rate": 129472
+ }
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 174103104.0,
+ "theoretical_tx_rate_pps": 74404761.90476191
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "2eb5c2020c5149db9e10bab584e2dbf6"
+ },
+ "synthesis": {
+ "avg_delay_usec": 420.50073626049146,
+ "total_tx_rate": 259082
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.intensive",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_768-fc_100k-rate_70%.json",
+ "frame_sizes": [
+ "768"
+ ],
+ "rate": "70%",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc6_intensive",
+ "restart": "true"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-03 08:06:50",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": "true",
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "694c371f3fce42c4ba547b3cc5cbc030",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "204764pps",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "768"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": false,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_768-fc_100k-rate_70%.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": true,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "768"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2504,
+ 2515
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc6_intensive",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.intensive",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_768-fc_100k-rate_70%.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "768": {
+ "run_config": {
+ "direction-forward": {
+ "rx": {
+ "rate_percent": 2.5720017408,
+ "rate_pps": 101998,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 643000435
+ },
+ "tx": {
+ "rate_percent": 2.5720017408,
+ "rate_pps": 101998,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 643000435
+ },
+ "orig": {
+ "rate_percent": 2.5816645119999997,
+ "rate_pps": 102382,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 645416128
+ }
+ },
+ "direction-total": {
+ "rx": {
+ "rate_percent": 5.14400096,
+ "rate_pps": 203996.0,
+ "rate_bps": 1286000239.0
+ },
+ "tx": {
+ "rate_percent": 5.14400096,
+ "rate_pps": 203996.0,
+ "rate_bps": 1286000239.0
+ },
+ "orig": {
+ "rate_percent": 5.163329023999999,
+ "rate_pps": 204764.0,
+ "rate_bps": 1290832256.0
+ }
+ },
+ "direction-reverse": {
+ "rx": {
+ "rate_percent": 2.5719992192,
+ "rate_pps": 101998,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 642999804
+ },
+ "tx": {
+ "rate_percent": 2.5719992192,
+ "rate_pps": 101998,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 642999804
+ },
+ "orig": {
+ "rate_percent": 2.5816645119999997,
+ "rate_pps": 102382,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 645416128
+ }
+ }
+ },
+ "packet_path_stats": {
+ "Forward": {
+ "interfaces": [
+ "TRex.TX.p0",
+ "TRex.RX.p1"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 1019120,
+ "+16 (+0.0016%)"
+ ],
+ "lat_max_usec": 6400,
+ "lat_avg_usec": 441,
+ "lat_min_usec": 34,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ },
+ "Reverse": {
+ "interfaces": [
+ "TRex.TX.p1",
+ "TRex.RX.p0"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 1019987,
+ 1019987
+ ],
+ "lat_max_usec": 12992,
+ "lat_avg_usec": 416,
+ "lat_min_usec": 39,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ }
+ },
+ "stats": {
+ "total_tx_rate": 203997,
+ "overall": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 593093792.0,
+ "pkt_rate": 96031.5,
+ "max_delay_usec": 12992,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "avg_delay_usec": 428.4999938724739,
+ "total_pkt_bytes": 1574860700,
+ "total_pkts": 2039975,
+ "min_delay_usec": 34
+ },
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg=",
+ "tx": {
+ "total_pkt_bytes": 1574860700,
+ "total_pkts": 2039975,
+ "pkt_bit_rate": 593058368.0,
+ "pkt_rate": 96025.5
+ }
+ },
+ "1": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 589896256,
+ "pkt_rate": 95514,
+ "max_delay_usec": 12992,
+ "total_pkt_bytes": 787430736,
+ "avg_delay_usec": 416,
+ "total_pkts": 1019988,
+ "min_delay_usec": 39
+ },
+ "tx": {
+ "total_pkt_bytes": 787429964,
+ "total_pkts": 1019987,
+ "pkt_bit_rate": 593190528,
+ "pkt_rate": 96047
+ }
+ },
+ "0": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 596291328,
+ "pkt_rate": 96549,
+ "max_delay_usec": 6400,
+ "total_pkt_bytes": 787429964,
+ "avg_delay_usec": 441,
+ "total_pkts": 1019987,
+ "min_delay_usec": 34
+ },
+ "tx": {
+ "total_pkt_bytes": 787430736,
+ "total_pkts": 1019988,
+ "pkt_bit_rate": 592926208,
+ "pkt_rate": 96004
+ }
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 1285997088.0,
+ "theoretical_tx_rate_pps": 7931472.081218274
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "694c371f3fce42c4ba547b3cc5cbc030"
+ },
+ "synthesis": {
+ "avg_delay_usec": 428.4999938724739,
+ "total_tx_rate": 203997
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.intensive",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_768-fc_100k-rate_90%.json",
+ "frame_sizes": [
+ "768"
+ ],
+ "rate": "90%",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc6_intensive",
+ "restart": "true"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-03 08:07:28",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": "true",
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "9d22db1a0cf34ca0874e09eb8b37c51e",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "263268pps",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "768"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": false,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_768-fc_100k-rate_90%.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": true,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "768"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2504,
+ 2515
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc6_intensive",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.intensive",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_768-fc_100k-rate_90%.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "768": {
+ "run_config": {
+ "direction-forward": {
+ "rx": {
+ "rate_percent": 3.3066320768,
+ "rate_pps": 131132,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 826658019
+ },
+ "tx": {
+ "rate_percent": 3.306674944,
+ "rate_pps": 131134,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 826668736
+ },
+ "orig": {
+ "rate_percent": 3.3192829440000002,
+ "rate_pps": 131634,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 829820736
+ }
+ },
+ "direction-total": {
+ "rx": {
+ "rate_percent": 6.613438144,
+ "rate_pps": 262271.0,
+ "rate_bps": 1653359535.0
+ },
+ "tx": {
+ "rate_percent": 6.6135490944,
+ "rate_pps": 262275.0,
+ "rate_bps": 1653387273.0
+ },
+ "orig": {
+ "rate_percent": 6.6385658880000005,
+ "rate_pps": 263268.0,
+ "rate_bps": 1659641472.0
+ }
+ },
+ "direction-reverse": {
+ "rx": {
+ "rate_percent": 3.3068060672,
+ "rate_pps": 131139,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 826701516
+ },
+ "tx": {
+ "rate_percent": 3.306874150399999,
+ "rate_pps": 131141,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 826718537
+ },
+ "orig": {
+ "rate_percent": 3.3192829440000002,
+ "rate_pps": 131634,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 829820736
+ }
+ }
+ },
+ "packet_path_stats": {
+ "Forward": {
+ "interfaces": [
+ "TRex.TX.p0",
+ "TRex.RX.p1"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 1310232,
+ "-6 (-0.0005%)"
+ ],
+ "lat_max_usec": 1676,
+ "lat_avg_usec": 349,
+ "lat_min_usec": 51,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ },
+ "Reverse": {
+ "interfaces": [
+ "TRex.TX.p1",
+ "TRex.RX.p0"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 1311419,
+ "-27 (-0.0021%)"
+ ],
+ "lat_max_usec": 17335,
+ "lat_avg_usec": 357,
+ "lat_min_usec": 74,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ }
+ },
+ "stats": {
+ "total_tx_rate": 262275,
+ "overall": {
+ "drop_rate_percent": 0.0016776226866441024,
+ "rx": {
+ "dropped_pkts": 44,
+ "pkt_bit_rate": 812587744.0,
+ "pkt_rate": 131571.5,
+ "max_delay_usec": 17335,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "avg_delay_usec": 352.9998947655388,
+ "total_pkt_bytes": 2024735980,
+ "total_pkts": 2622715,
+ "min_delay_usec": 51
+ },
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg=",
+ "tx": {
+ "total_pkt_bytes": 2024769948,
+ "total_pkts": 2622759,
+ "pkt_bit_rate": 812466528.0,
+ "pkt_rate": 131551.5
+ }
+ },
+ "1": {
+ "drop_rate_percent": 0.0012963057573513882,
+ "rx": {
+ "dropped_pkts": 17,
+ "pkt_bit_rate": 812597184,
+ "pkt_rate": 131573,
+ "max_delay_usec": 17335,
+ "total_pkt_bytes": 1012341356,
+ "avg_delay_usec": 357,
+ "total_pkts": 1311323,
+ "min_delay_usec": 74
+ },
+ "tx": {
+ "total_pkt_bytes": 1012415468,
+ "total_pkts": 1311419,
+ "pkt_bit_rate": 812396480,
+ "pkt_rate": 131540
+ }
+ },
+ "0": {
+ "drop_rate_percent": 0.002058962587887199,
+ "rx": {
+ "dropped_pkts": 27,
+ "pkt_bit_rate": 812578304,
+ "pkt_rate": 131570,
+ "max_delay_usec": 1676,
+ "total_pkt_bytes": 1012394624,
+ "avg_delay_usec": 349,
+ "total_pkts": 1311392,
+ "min_delay_usec": 51
+ },
+ "tx": {
+ "total_pkt_bytes": 1012354480,
+ "total_pkts": 1311340,
+ "pkt_bit_rate": 812536576,
+ "pkt_rate": 131563
+ }
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 1653381600.0,
+ "theoretical_tx_rate_pps": 7931472.081218274
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "9d22db1a0cf34ca0874e09eb8b37c51e"
+ },
+ "synthesis": {
+ "avg_delay_usec": 352.9998947655388,
+ "total_tx_rate": 262275
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.intensive",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_1518-fc_100k-rate_70%.json",
+ "frame_sizes": [
+ "1518"
+ ],
+ "rate": "70%",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc6_intensive",
+ "restart": "true"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-03 08:08:07",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": "true",
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "89248933cb70463792a0aa738f17d3e6",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "182233pps",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "1518"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": false,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_1518-fc_100k-rate_70%.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": true,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "1518"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2504,
+ 2515
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc6_intensive",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.intensive",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_1518-fc_100k-rate_70%.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "1518": {
+ "run_config": {
+ "direction-forward": {
+ "rx": {
+ "rate_percent": 4.4675971648,
+ "rate_pps": 90775,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 1116899291
+ },
+ "tx": {
+ "rate_percent": 4.4675971648,
+ "rate_pps": 90775,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 1116899291
+ },
+ "orig": {
+ "rate_percent": 4.484389664,
+ "rate_pps": 91116,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 1121097416
+ }
+ },
+ "direction-total": {
+ "rx": {
+ "rate_percent": 8.9354650176,
+ "rate_pps": 181555.0,
+ "rate_bps": 2233866254.0
+ },
+ "tx": {
+ "rate_percent": 8.9354650176,
+ "rate_pps": 181555.0,
+ "rate_bps": 2233866254.0
+ },
+ "orig": {
+ "rate_percent": 8.968779328,
+ "rate_pps": 182232.0,
+ "rate_bps": 2242194832.0
+ }
+ },
+ "direction-reverse": {
+ "rx": {
+ "rate_percent": 4.4678678528,
+ "rate_pps": 90780,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 1116966963
+ },
+ "tx": {
+ "rate_percent": 4.4678678528,
+ "rate_pps": 90780,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 1116966963
+ },
+ "orig": {
+ "rate_percent": 4.484389664,
+ "rate_pps": 91116,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 1121097416
+ }
+ }
+ },
+ "packet_path_stats": {
+ "Forward": {
+ "interfaces": [
+ "TRex.TX.p0",
+ "TRex.RX.p1"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 906957,
+ "+6 (+0.0007%)"
+ ],
+ "lat_max_usec": 4973,
+ "lat_avg_usec": 370,
+ "lat_min_usec": 59,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ },
+ "Reverse": {
+ "interfaces": [
+ "TRex.TX.p1",
+ "TRex.RX.p0"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 907808,
+ 907808
+ ],
+ "lat_max_usec": 6675,
+ "lat_avg_usec": 341,
+ "lat_min_usec": 92,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ }
+ },
+ "stats": {
+ "total_tx_rate": 181556,
+ "overall": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 1108165952.0,
+ "pkt_rate": 91011.5,
+ "max_delay_usec": 6675,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "avg_delay_usec": 355.5004392581687,
+ "total_pkt_bytes": 2763283842,
+ "total_pkts": 1815561,
+ "min_delay_usec": 59
+ },
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg=",
+ "tx": {
+ "total_pkt_bytes": 2763283842,
+ "total_pkts": 1815561,
+ "pkt_bit_rate": 1107904704.0,
+ "pkt_rate": 90990.0
+ }
+ },
+ "1": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 1108101888,
+ "pkt_rate": 91006,
+ "max_delay_usec": 6675,
+ "total_pkt_bytes": 1381600066,
+ "avg_delay_usec": 341,
+ "total_pkts": 907753,
+ "min_delay_usec": 92
+ },
+ "tx": {
+ "total_pkt_bytes": 1381683776,
+ "total_pkts": 907808,
+ "pkt_bit_rate": 1107890432,
+ "pkt_rate": 90989
+ }
+ },
+ "0": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 1108230016,
+ "pkt_rate": 91017,
+ "max_delay_usec": 4973,
+ "total_pkt_bytes": 1381683776,
+ "avg_delay_usec": 370,
+ "total_pkts": 907808,
+ "min_delay_usec": 59
+ },
+ "tx": {
+ "total_pkt_bytes": 1381600066,
+ "total_pkts": 907753,
+ "pkt_bit_rate": 1107918976,
+ "pkt_rate": 90991
+ }
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 2233865024.0,
+ "theoretical_tx_rate_pps": 4063719.1157347206
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "89248933cb70463792a0aa738f17d3e6"
+ },
+ "synthesis": {
+ "avg_delay_usec": 355.5004392581687,
+ "total_tx_rate": 181556
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.intensive",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_1518-fc_100k-rate_90%.json",
+ "frame_sizes": [
+ "1518"
+ ],
+ "rate": "90%",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc6_intensive",
+ "restart": "true"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-03 08:08:48",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": "true",
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "3d0cbc23b6c14f59b503bd29f8e47bf0",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "234299pps",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "1518"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": false,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_1518-fc_100k-rate_90%.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": true,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "1518"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2504,
+ 2515
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc6_intensive",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.intensive",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_1518-fc_100k-rate_90%.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "1518": {
+ "run_config": {
+ "direction-forward": {
+ "rx": {
+ "rate_percent": 5.7440633408,
+ "rate_pps": 116711,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 1436015835
+ },
+ "tx": {
+ "rate_percent": 5.7440633408,
+ "rate_pps": 116711,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 1436015835
+ },
+ "orig": {
+ "rate_percent": 5.765629792,
+ "rate_pps": 117149,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 1441407448
+ }
+ },
+ "direction-total": {
+ "rx": {
+ "rate_percent": 11.4884711936,
+ "rate_pps": 233429.0,
+ "rate_bps": 2872117798.0
+ },
+ "tx": {
+ "rate_percent": 11.4884711936,
+ "rate_pps": 233429.0,
+ "rate_bps": 2872117798.0
+ },
+ "orig": {
+ "rate_percent": 11.531259584,
+ "rate_pps": 234298.0,
+ "rate_bps": 2882814896.0
+ }
+ },
+ "direction-reverse": {
+ "rx": {
+ "rate_percent": 5.7444078528,
+ "rate_pps": 116718,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 1436101963
+ },
+ "tx": {
+ "rate_percent": 5.7444078528,
+ "rate_pps": 116718,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 1436101963
+ },
+ "orig": {
+ "rate_percent": 5.765629792,
+ "rate_pps": 117149,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 1441407448
+ }
+ }
+ },
+ "packet_path_stats": {
+ "Forward": {
+ "interfaces": [
+ "TRex.TX.p0",
+ "TRex.RX.p1"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 1166133,
+ "+27 (+0.0023%)"
+ ],
+ "lat_max_usec": 658,
+ "lat_avg_usec": 325,
+ "lat_min_usec": 69,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ },
+ "Reverse": {
+ "interfaces": [
+ "TRex.TX.p1",
+ "TRex.RX.p0"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 1167183,
+ 1167183
+ ],
+ "lat_max_usec": 11556,
+ "lat_avg_usec": 331,
+ "lat_min_usec": 66,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ }
+ },
+ "stats": {
+ "total_tx_rate": 233429,
+ "overall": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 1423834560.0,
+ "pkt_rate": 116937.0,
+ "max_delay_usec": 11556,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "avg_delay_usec": 327.99991003711614,
+ "total_pkt_bytes": 3552798512,
+ "total_pkts": 2334296,
+ "min_delay_usec": 66
+ },
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg=",
+ "tx": {
+ "total_pkt_bytes": 3552798512,
+ "total_pkts": 2334296,
+ "pkt_bit_rate": 1424474880.0,
+ "pkt_rate": 116990.0
+ }
+ },
+ "1": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 1423956992,
+ "pkt_rate": 116947,
+ "max_delay_usec": 11556,
+ "total_pkt_bytes": 1776345986,
+ "avg_delay_usec": 331,
+ "total_pkts": 1167113,
+ "min_delay_usec": 66
+ },
+ "tx": {
+ "total_pkt_bytes": 1776452526,
+ "total_pkts": 1167183,
+ "pkt_bit_rate": 1424533632,
+ "pkt_rate": 116994
+ }
+ },
+ "0": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 1423712128,
+ "pkt_rate": 116927,
+ "max_delay_usec": 658,
+ "total_pkt_bytes": 1776452526,
+ "avg_delay_usec": 325,
+ "total_pkts": 1167183,
+ "min_delay_usec": 69
+ },
+ "tx": {
+ "total_pkt_bytes": 1776345986,
+ "total_pkts": 1167113,
+ "pkt_bit_rate": 1424416128,
+ "pkt_rate": 116986
+ }
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 2872110416.0,
+ "theoretical_tx_rate_pps": 4063719.1157347206
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "3d0cbc23b6c14f59b503bd29f8e47bf0"
+ },
+ "synthesis": {
+ "avg_delay_usec": 327.99991003711614,
+ "total_tx_rate": 233429
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.intensive",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_9000-fc_100k-rate_70%.json",
+ "frame_sizes": [
+ "9000"
+ ],
+ "rate": "70%",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc6_intensive",
+ "restart": "true"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-03 08:09:28",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": "true",
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "1b492bc88b2c49cb88be084019d3b19a",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "107335pps",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "9000"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": false,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_9000-fc_100k-rate_70%.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": true,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "9000"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2504,
+ 2515
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc6_intensive",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.intensive",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_9000-fc_100k-rate_70%.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "9000": {
+ "run_config": {
+ "direction-forward": {
+ "rx": {
+ "rate_percent": 15.432253056,
+ "rate_pps": 53465,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 3858063264
+ },
+ "tx": {
+ "rate_percent": 15.432253056,
+ "rate_pps": 53465,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 3858063264
+ },
+ "orig": {
+ "rate_percent": 15.4905872,
+ "rate_pps": 53667,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 3872646800
+ }
+ },
+ "direction-total": {
+ "rx": {
+ "rate_percent": 30.865487488,
+ "rate_pps": 106933.0,
+ "rate_bps": 7716371872.0
+ },
+ "tx": {
+ "rate_percent": 30.865487488,
+ "rate_pps": 106933.0,
+ "rate_bps": 7716371872.0
+ },
+ "orig": {
+ "rate_percent": 30.9811744,
+ "rate_pps": 107334.0,
+ "rate_bps": 7745293600.0
+ }
+ },
+ "direction-reverse": {
+ "rx": {
+ "rate_percent": 15.433234432,
+ "rate_pps": 53468,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 3858308608
+ },
+ "tx": {
+ "rate_percent": 15.433234432,
+ "rate_pps": 53468,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 3858308608
+ },
+ "orig": {
+ "rate_percent": 15.4905872,
+ "rate_pps": 53667,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 3872646800
+ }
+ }
+ },
+ "packet_path_stats": {
+ "Forward": {
+ "interfaces": [
+ "TRex.TX.p0",
+ "TRex.RX.p1"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 534208,
+ "+4 (+0.0007%)"
+ ],
+ "lat_max_usec": 5196,
+ "lat_avg_usec": 342,
+ "lat_min_usec": 65,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ },
+ "Reverse": {
+ "interfaces": [
+ "TRex.TX.p1",
+ "TRex.RX.p0"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 534688,
+ 534688
+ ],
+ "lat_max_usec": 14076,
+ "lat_avg_usec": 332,
+ "lat_min_usec": 74,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ }
+ },
+ "stats": {
+ "total_tx_rate": 106934,
+ "overall": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 3860001152.0,
+ "pkt_rate": 53586.5,
+ "max_delay_usec": 14076,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "avg_delay_usec": 337.00015897626764,
+ "total_pkt_bytes": 9628355368,
+ "total_pkts": 1069342,
+ "min_delay_usec": 65
+ },
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg=",
+ "tx": {
+ "total_pkt_bytes": 9628355368,
+ "total_pkts": 1069342,
+ "pkt_bit_rate": 3860356864.0,
+ "pkt_rate": 53592.0
+ }
+ },
+ "1": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 3860253696,
+ "pkt_rate": 53590,
+ "max_delay_usec": 14076,
+ "total_pkt_bytes": 4814024616,
+ "avg_delay_usec": 332,
+ "total_pkts": 534654,
+ "min_delay_usec": 74
+ },
+ "tx": {
+ "total_pkt_bytes": 4814330752,
+ "total_pkts": 534688,
+ "pkt_bit_rate": 3860350464,
+ "pkt_rate": 53592
+ }
+ },
+ "0": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 3859748608,
+ "pkt_rate": 53583,
+ "max_delay_usec": 5196,
+ "total_pkt_bytes": 4814330752,
+ "avg_delay_usec": 342,
+ "total_pkts": 534688,
+ "min_delay_usec": 65
+ },
+ "tx": {
+ "total_pkt_bytes": 4814024616,
+ "total_pkts": 534654,
+ "pkt_bit_rate": 3860363264,
+ "pkt_rate": 53592
+ }
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 7716357440.0,
+ "theoretical_tx_rate_pps": 692904.6563192905
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "1b492bc88b2c49cb88be084019d3b19a"
+ },
+ "synthesis": {
+ "avg_delay_usec": 337.00015897626764,
+ "total_tx_rate": 106934
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.intensive",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_9000-fc_100k-rate_90%.json",
+ "frame_sizes": [
+ "9000"
+ ],
+ "rate": "90%",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc6_intensive",
+ "restart": "true"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-03 08:10:06",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": "true",
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "6f821bed4865456680f826839bab1081",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "138003pps",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "9000"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": false,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_9000-fc_100k-rate_90%.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": true,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "9000"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2504,
+ 2515
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc6_intensive",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.intensive",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-latency-fs_9000-fc_100k-rate_90%.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "9000": {
+ "run_config": {
+ "direction-forward": {
+ "rx": {
+ "rate_percent": 19.841806336,
+ "rate_pps": 68742,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 4960451584
+ },
+ "tx": {
+ "rate_percent": 19.841806336,
+ "rate_pps": 68742,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 4960451584
+ },
+ "orig": {
+ "rate_percent": 19.916592960000003,
+ "rate_pps": 69001,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 4979148240
+ }
+ },
+ "direction-total": {
+ "rx": {
+ "rate_percent": 39.684853824,
+ "rate_pps": 137488.0,
+ "rate_bps": 9921213456.0
+ },
+ "tx": {
+ "rate_percent": 39.684853824,
+ "rate_pps": 137488.0,
+ "rate_bps": 9921213456.0
+ },
+ "orig": {
+ "rate_percent": 39.833185920000005,
+ "rate_pps": 138002.0,
+ "rate_bps": 9958296480.0
+ }
+ },
+ "direction-reverse": {
+ "rx": {
+ "rate_percent": 19.843047488,
+ "rate_pps": 68746,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 4960761872
+ },
+ "tx": {
+ "rate_percent": 19.843047488,
+ "rate_pps": 68746,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 4960761872
+ },
+ "orig": {
+ "rate_percent": 19.916592960000003,
+ "rate_pps": 69001,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 4979148240
+ }
+ }
+ },
+ "packet_path_stats": {
+ "Forward": {
+ "interfaces": [
+ "TRex.TX.p0",
+ "TRex.RX.p1"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 686848,
+ "+12 (+0.0017%)"
+ ],
+ "lat_max_usec": 921,
+ "lat_avg_usec": 473,
+ "lat_min_usec": 102,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ },
+ "Reverse": {
+ "interfaces": [
+ "TRex.TX.p1",
+ "TRex.RX.p0"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 687467,
+ 687467
+ ],
+ "lat_max_usec": 23660,
+ "lat_avg_usec": 471,
+ "lat_min_usec": 82,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ }
+ },
+ "stats": {
+ "total_tx_rate": 137489,
+ "overall": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 4886032128.0,
+ "pkt_rate": 67831.0,
+ "max_delay_usec": 23660,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "avg_delay_usec": 472.00003127520654,
+ "total_pkt_bytes": 12379518564,
+ "total_pkts": 1374891,
+ "min_delay_usec": 82
+ },
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg=",
+ "tx": {
+ "total_pkt_bytes": 12379518564,
+ "total_pkts": 1374891,
+ "pkt_bit_rate": 4885754880.0,
+ "pkt_rate": 67827.0
+ }
+ },
+ "1": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 4860832768,
+ "pkt_rate": 67481,
+ "max_delay_usec": 23660,
+ "total_pkt_bytes": 6189565696,
+ "avg_delay_usec": 471,
+ "total_pkts": 687424,
+ "min_delay_usec": 82
+ },
+ "tx": {
+ "total_pkt_bytes": 6189952868,
+ "total_pkts": 687467,
+ "pkt_bit_rate": 4887348736,
+ "pkt_rate": 67849
+ }
+ },
+ "0": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 4911231488,
+ "pkt_rate": 68181,
+ "max_delay_usec": 921,
+ "total_pkt_bytes": 6189952868,
+ "avg_delay_usec": 473,
+ "total_pkts": 687467,
+ "min_delay_usec": 102
+ },
+ "tx": {
+ "total_pkt_bytes": 6189565696,
+ "total_pkts": 687424,
+ "pkt_bit_rate": 4884161024,
+ "pkt_rate": 67805
+ }
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 9921206240.0,
+ "theoretical_tx_rate_pps": 692904.6563192905
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "6f821bed4865456680f826839bab1081"
+ },
+ "synthesis": {
+ "avg_delay_usec": 472.00003127520654,
+ "total_tx_rate": 137489
+ }
+ }
+ ],
+ "throughput": [
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.intensive",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_64-fc_128-rate_ndr-2.json",
+ "frame_sizes": [
+ "64"
+ ],
+ "rate": "ndr",
+ "flow_count": "128",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc6_intensive"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-03 04:26:27",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "7dca1c234a4544fa8b4600aeca81a251",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "64"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 128,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_64-fc_128-rate_ndr-0.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "64"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2504,
+ 2515
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc6_intensive",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.intensive",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_64-fc_128-rate_ndr-0.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "64": {
+ "ndr": {
+ "load_percent_per_direction": 0.29296875,
+ "timestamp_sec": 1646281727.2934198,
+ "stats": {
+ "total_tx_rate": 216641,
+ "overall": {
+ "rx_pkts": 2166416,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 3395,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 2166416,
+ "avg_delay_usec": 345.5001269377627,
+ "min_delay_usec": 48,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1083153,
+ "min_delay_usec": 48,
+ "drop_pct": 0,
+ "max_delay_usec": 2779,
+ "tx_pkts": 1083263,
+ "avg_delay_usec": 343,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 1083263,
+ "min_delay_usec": 58,
+ "drop_pct": 0,
+ "max_delay_usec": 3395,
+ "tx_pkts": 1083153,
+ "avg_delay_usec": 348,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 145582752.0,
+ "theoretical_tx_rate_pps": 74404761.90476191
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 0.5859375,
+ "duration_sec": 10.0,
+ "l2frame_size": "64",
+ "rate_pps": 217982,
+ "rate_bps": 146484374.0,
+ "time_taken_sec": 137.62811660766602
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 1420502.8540113333,
+ "rx_pkts": 5016530,
+ "time_ms": 1646281602204,
+ "drop_pct": 257745146,
+ "total_tx_pps": 26276167,
+ "tx_pps": 74404760,
+ "tx_pkts": 262761676,
+ "warning": "WARNING: There is a significant difference between requested TX rate (74404760) and actual TX rate (26276167). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "drop_percentage": 98.09084411533438
+ },
+ {
+ "rx_pps": 672601.1499390049,
+ "rx_pkts": 4822778,
+ "time_ms": 1646281614702,
+ "drop_pct": 261930884,
+ "total_tx_pps": 26675366,
+ "tx_pps": 37202380,
+ "tx_pkts": 266753662,
+ "warning": "WARNING: There is a significant difference between requested TX rate (37202380) and actual TX rate (26675366). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "drop_percentage": 98.19204806268039
+ },
+ {
+ "rx_pps": 504874.7734901166,
+ "rx_pkts": 5017597,
+ "time_ms": 1646281627207,
+ "drop_pct": 179846611,
+ "total_tx_pps": 18486420,
+ "tx_pps": 18601190,
+ "tx_pkts": 184864208,
+ "drop_percentage": 97.28579314823344
+ },
+ {
+ "rx_pps": 526090.9624989077,
+ "rx_pkts": 5239077,
+ "time_ms": 1646281639732,
+ "drop_pct": 87380891,
+ "total_tx_pps": 9261996,
+ "tx_pps": 9300594,
+ "tx_pkts": 92619968,
+ "drop_percentage": 94.34346921821437
+ },
+ {
+ "rx_pps": 338831.07121923624,
+ "rx_pkts": 3367405,
+ "time_ms": 1646281652234,
+ "drop_pct": 42848634,
+ "total_tx_pps": 4621603,
+ "tx_pps": 4650296,
+ "tx_pkts": 46216039,
+ "drop_percentage": 92.71377410772914
+ },
+ {
+ "rx_pps": 187871.99985494502,
+ "rx_pkts": 1867166,
+ "time_ms": 1646281664732,
+ "drop_pct": 21241319,
+ "total_tx_pps": 2310848,
+ "tx_pps": 2325148,
+ "tx_pkts": 23108485,
+ "drop_percentage": 91.9199982171051
+ },
+ {
+ "rx_pps": 291240.3958426355,
+ "rx_pkts": 2894493,
+ "time_ms": 1646281677251,
+ "drop_pct": 8659750,
+ "total_tx_pps": 1155424,
+ "tx_pps": 1162574,
+ "tx_pkts": 11554243,
+ "drop_percentage": 74.94865738932442
+ },
+ {
+ "rx_pps": 534014.7450349748,
+ "rx_pkts": 5307629,
+ "time_ms": 1646281689761,
+ "drop_pct": 469834,
+ "total_tx_pps": 577746,
+ "tx_pps": 581286,
+ "tx_pkts": 5777463,
+ "drop_percentage": 8.132185355405998
+ },
+ {
+ "rx_pps": 290481.83102404187,
+ "rx_pkts": 2887245,
+ "time_ms": 1646281702271,
+ "drop_pct": 1592,
+ "total_tx_pps": 288883,
+ "tx_pps": 290642,
+ "tx_pkts": 2888837,
+ "drop_percentage": 0.05510868214440621
+ },
+ {
+ "rx_pps": 145320.0,
+ "rx_pkts": 1444265,
+ "time_ms": 1646281714791,
+ "drop_pct": 0,
+ "total_tx_pps": 144426,
+ "tx_pps": 145320,
+ "tx_pkts": 1444265,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 217982.0,
+ "rx_pkts": 2166416,
+ "time_ms": 1646281727292,
+ "drop_pct": 0,
+ "total_tx_pps": 216641,
+ "tx_pps": 217982,
+ "tx_pkts": 2166416,
+ "ndr_pps": 108991,
+ "drop_percentage": 0.0
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 128,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "7dca1c234a4544fa8b4600aeca81a251"
+ },
+ "synthesis": {
+ "avg_delay_usec": 345.5001269377627,
+ "total_tx_rate": 216641
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.intensive",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_128-fc_128-rate_ndr-2.json",
+ "frame_sizes": [
+ "128"
+ ],
+ "rate": "ndr",
+ "flow_count": "128",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc6_intensive"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-03 04:38:28",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "471b575695a34aeb896904338ee56c9e",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "128"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 128,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_128-fc_128-rate_ndr-2.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "128"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2504,
+ 2515
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc6_intensive",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.intensive",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_128-fc_128-rate_ndr-2.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "128": {
+ "ndr": {
+ "load_percent_per_direction": 0.48828125,
+ "timestamp_sec": 1646282448.6252708,
+ "stats": {
+ "total_tx_rate": 204950,
+ "overall": {
+ "rx_pkts": 2049506,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 4734,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 2049506,
+ "avg_delay_usec": 402.9975642911023,
+ "min_delay_usec": 50,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1024701,
+ "min_delay_usec": 50,
+ "drop_pct": 0,
+ "max_delay_usec": 2923,
+ "tx_pkts": 1024805,
+ "avg_delay_usec": 451,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 1024805,
+ "min_delay_usec": 70,
+ "drop_pct": 0,
+ "max_delay_usec": 4734,
+ "tx_pkts": 1024701,
+ "avg_delay_usec": 355,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 242660800.0,
+ "theoretical_tx_rate_pps": 42229729.72972973
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 0.9765625,
+ "duration_sec": 10.0,
+ "l2frame_size": "128",
+ "rate_pps": 206198,
+ "rate_bps": 244140624.0,
+ "time_taken_sec": 137.57624626159668
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 611597.2644258632,
+ "rx_pkts": 3719633,
+ "time_ms": 1646282323560,
+ "drop_pct": 253114560,
+ "total_tx_pps": 25683419,
+ "tx_pps": 42229728,
+ "tx_pkts": 256834193,
+ "warning": "WARNING: There is a significant difference between requested TX rate (42229728) and actual TX rate (25683419). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "drop_percentage": 98.55173761851873
+ },
+ {
+ "rx_pps": 386189.1189369173,
+ "rx_pkts": 3838141,
+ "time_ms": 1646282336056,
+ "drop_pct": 206011959,
+ "total_tx_pps": 20985010,
+ "tx_pps": 21114864,
+ "tx_pkts": 209850100,
+ "drop_percentage": 98.17100825779926
+ },
+ {
+ "rx_pps": 535360.03343522,
+ "rx_pkts": 5320676,
+ "time_ms": 1646282348558,
+ "drop_pct": 99604368,
+ "total_tx_pps": 10492504,
+ "tx_pps": 10557432,
+ "tx_pkts": 104925044,
+ "drop_percentage": 94.92906955559629
+ },
+ {
+ "rx_pps": 475850.8644810261,
+ "rx_pkts": 4729244,
+ "time_ms": 1646282361060,
+ "drop_pct": 47733277,
+ "total_tx_pps": 5246252,
+ "tx_pps": 5278716,
+ "tx_pkts": 52462521,
+ "drop_percentage": 90.98548085403674
+ },
+ {
+ "rx_pps": 481740.3899527563,
+ "rx_pkts": 4788259,
+ "time_ms": 1646282373570,
+ "drop_pct": 21445642,
+ "total_tx_pps": 2623390,
+ "tx_pps": 2639358,
+ "tx_pkts": 26233901,
+ "drop_percentage": 81.74781935786065
+ },
+ {
+ "rx_pps": 162404.72992262442,
+ "rx_pkts": 1614222,
+ "time_ms": 1646282386070,
+ "drop_pct": 11502719,
+ "total_tx_pps": 1311694,
+ "tx_pps": 1319678,
+ "tx_pkts": 13116941,
+ "drop_percentage": 87.69360935602288
+ },
+ {
+ "rx_pps": 528791.9306016571,
+ "rx_pkts": 5256987,
+ "time_ms": 1646282398572,
+ "drop_pct": 1302795,
+ "total_tx_pps": 655978,
+ "tx_pps": 659838,
+ "tx_pkts": 6559782,
+ "drop_percentage": 19.86033987105059
+ },
+ {
+ "rx_pps": 329883.78962649574,
+ "rx_pkts": 3278552,
+ "time_ms": 1646282411079,
+ "drop_pct": 340,
+ "total_tx_pps": 327889,
+ "tx_pps": 329918,
+ "tx_pkts": 3278892,
+ "drop_percentage": 0.010369356477736992
+ },
+ {
+ "rx_pps": 164958.0,
+ "rx_pkts": 1639603,
+ "time_ms": 1646282423587,
+ "drop_pct": 0,
+ "total_tx_pps": 163960,
+ "tx_pps": 164958,
+ "tx_pkts": 1639603,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 247433.07018056748,
+ "rx_pkts": 2459364,
+ "time_ms": 1646282436086,
+ "drop_pct": 49,
+ "total_tx_pps": 245941,
+ "tx_pps": 247438,
+ "tx_pkts": 2459413,
+ "drop_percentage": 0.001992345327929876
+ },
+ {
+ "rx_pps": 206198.0,
+ "rx_pkts": 2049506,
+ "time_ms": 1646282448624,
+ "drop_pct": 0,
+ "total_tx_pps": 204950,
+ "tx_pps": 206198,
+ "tx_pkts": 2049506,
+ "ndr_pps": 103099,
+ "drop_percentage": 0.0
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 128,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "471b575695a34aeb896904338ee56c9e"
+ },
+ "synthesis": {
+ "avg_delay_usec": 402.9975642911023,
+ "total_tx_rate": 204950
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.intensive",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_256-fc_128-rate_ndr-2.json",
+ "frame_sizes": [
+ "256"
+ ],
+ "rate": "ndr",
+ "flow_count": "128",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc6_intensive"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-03 04:43:16",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "d3d2bdbb46a848a6bd1d9fceccf3e984",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "256"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 128,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_256-fc_128-rate_ndr-1.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "256"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2504,
+ 2515
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc6_intensive",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.intensive",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_256-fc_128-rate_ndr-1.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "256": {
+ "ndr": {
+ "load_percent_per_direction": 1.171875,
+ "timestamp_sec": 1646282737.0682218,
+ "stats": {
+ "total_tx_rate": 263738,
+ "overall": {
+ "rx_pkts": 2637364,
+ "drop_percentage": 0.0006445788454531218,
+ "drop_pct": 17,
+ "max_delay_usec": 3483,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 2637381,
+ "avg_delay_usec": 391.5000284374853,
+ "min_delay_usec": 43,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1318607,
+ "min_delay_usec": 51,
+ "drop_pct": 17,
+ "max_delay_usec": 3483,
+ "tx_pkts": 1318757,
+ "avg_delay_usec": 391,
+ "drop_percentage": 0.0012890926834890734
+ },
+ "0": {
+ "rx_pkts": 1318757,
+ "min_delay_usec": 43,
+ "drop_pct": 0,
+ "max_delay_usec": 2612,
+ "tx_pkts": 1318624,
+ "avg_delay_usec": 392,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 582333504.0,
+ "theoretical_tx_rate_pps": 22644927.536231883
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 2.34375,
+ "duration_sec": 10.0,
+ "l2frame_size": "256",
+ "rate_pps": 265370,
+ "rate_bps": 585937500.0,
+ "time_taken_sec": 137.64893245697021
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 522344.1460825948,
+ "rx_pkts": 4754897,
+ "time_ms": 1646282611907,
+ "drop_pct": 201381788,
+ "total_tx_pps": 20613668,
+ "tx_pps": 22644926,
+ "tx_pkts": 206136685,
+ "drop_percentage": 97.69332809441464
+ },
+ {
+ "rx_pps": 491622.4395108708,
+ "rx_pkts": 4886235,
+ "time_ms": 1646282624425,
+ "drop_pct": 107647705,
+ "total_tx_pps": 11253394,
+ "tx_pps": 11322462,
+ "tx_pkts": 112533940,
+ "drop_percentage": 95.6579899361917
+ },
+ {
+ "rx_pps": 470777.2330404413,
+ "rx_pkts": 4678820,
+ "time_ms": 1646282636925,
+ "drop_pct": 51585320,
+ "total_tx_pps": 5626414,
+ "tx_pps": 5661230,
+ "tx_pkts": 56264140,
+ "drop_percentage": 91.68418818807147
+ },
+ {
+ "rx_pps": 414425.7781120188,
+ "rx_pkts": 4118771,
+ "time_ms": 1646282649423,
+ "drop_pct": 24013289,
+ "total_tx_pps": 2813206,
+ "tx_pps": 2830614,
+ "tx_pkts": 28132060,
+ "drop_percentage": 85.3591560660684
+ },
+ {
+ "rx_pps": 236622.81767304175,
+ "rx_pkts": 2351913,
+ "time_ms": 1646282661925,
+ "drop_pct": 11715524,
+ "total_tx_pps": 1406743,
+ "tx_pps": 1415306,
+ "tx_pkts": 14067437,
+ "drop_percentage": 83.28115491116114
+ },
+ {
+ "rx_pps": 357701.18149108754,
+ "rx_pkts": 3555014,
+ "time_ms": 1646282674452,
+ "drop_pct": 3477987,
+ "total_tx_pps": 703300,
+ "tx_pps": 707652,
+ "tx_pkts": 7033001,
+ "drop_percentage": 49.45238881666589
+ },
+ {
+ "rx_pps": 353648.52806887566,
+ "rx_pkts": 3521103,
+ "time_ms": 1646282687041,
+ "drop_pct": 1767,
+ "total_tx_pps": 352287,
+ "tx_pps": 353826,
+ "tx_pkts": 3522870,
+ "drop_percentage": 0.05015796779330489
+ },
+ {
+ "rx_pps": 176912.0,
+ "rx_pkts": 1758241,
+ "time_ms": 1646282699539,
+ "drop_pct": 0,
+ "total_tx_pps": 175824,
+ "tx_pps": 176912,
+ "tx_pkts": 1758241,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 265368.28948111786,
+ "rx_pkts": 2637364,
+ "time_ms": 1646282712038,
+ "drop_pct": 17,
+ "total_tx_pps": 263738,
+ "tx_pps": 265370,
+ "tx_pkts": 2637381,
+ "drop_percentage": 0.0006445788454531218
+ },
+ {
+ "rx_pps": 309489.6445784601,
+ "rx_pkts": 3076176,
+ "time_ms": 1646282724538,
+ "drop_pct": 1077,
+ "total_tx_pps": 307725,
+ "tx_pps": 309598,
+ "tx_pkts": 3077253,
+ "drop_percentage": 0.03499874725932512
+ },
+ {
+ "rx_pps": 287373.73295271414,
+ "rx_pkts": 2856353,
+ "time_ms": 1646282737067,
+ "drop_pct": 1096,
+ "total_tx_pps": 285744,
+ "tx_pps": 287484,
+ "tx_pkts": 2857449,
+ "ndr_pps": 132685,
+ "drop_percentage": 0.03835589016636867
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 128,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "d3d2bdbb46a848a6bd1d9fceccf3e984"
+ },
+ "synthesis": {
+ "avg_delay_usec": 391.5000284374853,
+ "total_tx_rate": 263738
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.intensive",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_512-fc_128-rate_ndr-2.json",
+ "frame_sizes": [
+ "512"
+ ],
+ "rate": "ndr",
+ "flow_count": "128",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc6_intensive"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-03 04:48:05",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "3003c1cc691e42569317eef8cabf49f4",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "512"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 128,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_512-fc_128-rate_ndr-0.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "512"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2504,
+ 2515
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc6_intensive",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.intensive",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_512-fc_128-rate_ndr-0.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "512": {
+ "ndr": {
+ "load_percent_per_direction": 1.85546875,
+ "timestamp_sec": 1646283026.276379,
+ "stats": {
+ "total_tx_rate": 216663,
+ "overall": {
+ "rx_pkts": 2166633,
+ "drop_percentage": 9.230904143983643e-05,
+ "drop_pct": 2,
+ "max_delay_usec": 3778,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 2166635,
+ "avg_delay_usec": 293.49982068952147,
+ "min_delay_usec": 38,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1083261,
+ "min_delay_usec": 38,
+ "drop_pct": 2,
+ "max_delay_usec": 2864,
+ "tx_pkts": 1083372,
+ "avg_delay_usec": 297,
+ "drop_percentage": 0.00018460879550145288
+ },
+ "0": {
+ "rx_pkts": 1083372,
+ "min_delay_usec": 43,
+ "drop_pct": 0,
+ "max_delay_usec": 3778,
+ "tx_pkts": 1083263,
+ "avg_delay_usec": 290,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 922117728.0,
+ "theoretical_tx_rate_pps": 11748120.30075188
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 3.7109375,
+ "duration_sec": 10.0,
+ "l2frame_size": "512",
+ "rate_pps": 217982,
+ "rate_bps": 927734374.0,
+ "time_taken_sec": 137.69713401794434
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 455331.51681267726,
+ "rx_pkts": 4337032,
+ "time_ms": 1646282901128,
+ "drop_pct": 107563793,
+ "total_tx_pps": 11190082,
+ "tx_pps": 11748120,
+ "tx_pkts": 111900825,
+ "drop_percentage": 96.12421802967047
+ },
+ {
+ "rx_pps": 440270.9763230637,
+ "rx_pkts": 4375633,
+ "time_ms": 1646282913629,
+ "drop_pct": 54003711,
+ "total_tx_pps": 5837934,
+ "tx_pps": 5874060,
+ "tx_pkts": 58379344,
+ "drop_percentage": 92.50482670719973
+ },
+ {
+ "rx_pps": 515017.8171997763,
+ "rx_pkts": 5119020,
+ "time_ms": 1646282926174,
+ "drop_pct": 24073592,
+ "total_tx_pps": 2919261,
+ "tx_pps": 2937030,
+ "tx_pkts": 29192612,
+ "drop_percentage": 82.46467291107764
+ },
+ {
+ "rx_pps": 328003.16112234007,
+ "rx_pkts": 3259860,
+ "time_ms": 1646282938675,
+ "drop_pct": 11334969,
+ "total_tx_pps": 1459482,
+ "tx_pps": 1468514,
+ "tx_pkts": 14594829,
+ "drop_percentage": 77.66428095868748
+ },
+ {
+ "rx_pps": 517398.77960233815,
+ "rx_pkts": 5142169,
+ "time_ms": 1646282951182,
+ "drop_pct": 2155236,
+ "total_tx_pps": 729740,
+ "tx_pps": 734256,
+ "tx_pkts": 7297405,
+ "drop_percentage": 29.534279651465145
+ },
+ {
+ "rx_pps": 366808.26589116355,
+ "rx_pkts": 3645894,
+ "time_ms": 1646282963699,
+ "drop_pct": 3178,
+ "total_tx_pps": 364907,
+ "tx_pps": 367128,
+ "tx_pkts": 3649072,
+ "drop_percentage": 0.08709063564654246
+ },
+ {
+ "rx_pps": 183564.0,
+ "rx_pkts": 1825087,
+ "time_ms": 1646282976228,
+ "drop_pct": 0,
+ "total_tx_pps": 182508,
+ "tx_pps": 183564,
+ "tx_pkts": 1825087,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 275044.7500159553,
+ "rx_pkts": 2739035,
+ "time_ms": 1646282988754,
+ "drop_pct": 3000,
+ "total_tx_pps": 274203,
+ "tx_pps": 275346,
+ "tx_pkts": 2742035,
+ "drop_percentage": 0.10940779384654098
+ },
+ {
+ "rx_pps": 229445.14599323669,
+ "rx_pkts": 2280456,
+ "time_ms": 1646283001254,
+ "drop_pct": 88,
+ "total_tx_pps": 228054,
+ "tx_pps": 229454,
+ "tx_pkts": 2280544,
+ "drop_percentage": 0.0038587284437397395
+ },
+ {
+ "rx_pps": 206508.0,
+ "rx_pkts": 2052588,
+ "time_ms": 1646283013764,
+ "drop_pct": 0,
+ "total_tx_pps": 205258,
+ "tx_pps": 206508,
+ "tx_pkts": 2052588,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 217981.7987829053,
+ "rx_pkts": 2166633,
+ "time_ms": 1646283026275,
+ "drop_pct": 2,
+ "total_tx_pps": 216663,
+ "tx_pps": 217982,
+ "tx_pkts": 2166635,
+ "ndr_pps": 108991,
+ "drop_percentage": 9.230904143983643e-05
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 128,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "3003c1cc691e42569317eef8cabf49f4"
+ },
+ "synthesis": {
+ "avg_delay_usec": 293.49982068952147,
+ "total_tx_rate": 216663
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.intensive",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_768-fc_128-rate_ndr-2.json",
+ "frame_sizes": [
+ "768"
+ ],
+ "rate": "ndr",
+ "flow_count": "128",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc6_intensive"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-03 05:00:08",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "65d6a678b0ba42a49b38c9efd82efd93",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "768"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 128,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_768-fc_128-rate_ndr-2.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "768"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2504,
+ 2515
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc6_intensive",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.intensive",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_768-fc_128-rate_ndr-2.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "768": {
+ "ndr": {
+ "load_percent_per_direction": 3.3203125,
+ "timestamp_sec": 1646283748.6846843,
+ "stats": {
+ "total_tx_rate": 261728,
+ "overall": {
+ "rx_pkts": 2617285,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 700,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 2617285,
+ "avg_delay_usec": 417.5000750778001,
+ "min_delay_usec": 47,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1308577,
+ "min_delay_usec": 57,
+ "drop_pct": 0,
+ "max_delay_usec": 658,
+ "tx_pkts": 1308708,
+ "avg_delay_usec": 416,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 1308708,
+ "min_delay_usec": 47,
+ "drop_pct": 0,
+ "max_delay_usec": 700,
+ "tx_pkts": 1308577,
+ "avg_delay_usec": 419,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 1649933312.0,
+ "theoretical_tx_rate_pps": 7931472.081218274
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 6.640625,
+ "duration_sec": 10.0,
+ "l2frame_size": "768",
+ "rate_pps": 263348,
+ "rate_bps": 1660156250.0,
+ "time_taken_sec": 137.7285816669464
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 575501.9363137981,
+ "rx_pkts": 5571778,
+ "time_ms": 1646283623454,
+ "drop_pct": 71217540,
+ "total_tx_pps": 7678931,
+ "tx_pps": 7931472,
+ "tx_pkts": 76789318,
+ "drop_percentage": 92.74407151265493
+ },
+ {
+ "rx_pps": 340865.59968071827,
+ "rx_pkts": 3387693,
+ "time_ms": 1646283635959,
+ "drop_pct": 36025777,
+ "total_tx_pps": 3941347,
+ "tx_pps": 3965736,
+ "tx_pkts": 39413470,
+ "drop_percentage": 91.40473295043547
+ },
+ {
+ "rx_pps": 249221.15639844484,
+ "rx_pkts": 2477134,
+ "time_ms": 1646283648464,
+ "drop_pct": 17231585,
+ "total_tx_pps": 1970871,
+ "tx_pps": 1982868,
+ "tx_pkts": 19708719,
+ "drop_percentage": 87.43127851180992
+ },
+ {
+ "rx_pps": 240158.13023928663,
+ "rx_pkts": 2391135,
+ "time_ms": 1646283661049,
+ "drop_pct": 7480080,
+ "total_tx_pps": 987121,
+ "tx_pps": 991434,
+ "tx_pkts": 9871215,
+ "drop_percentage": 75.7766901034979
+ },
+ {
+ "rx_pps": 459235.5137965551,
+ "rx_pkts": 4564574,
+ "time_ms": 1646283673551,
+ "drop_pct": 362598,
+ "total_tx_pps": 492717,
+ "tx_pps": 495716,
+ "tx_pkts": 4927172,
+ "drop_percentage": 7.359150441673235
+ },
+ {
+ "rx_pps": 247858.0,
+ "rx_pkts": 2463587,
+ "time_ms": 1646283686050,
+ "drop_pct": 0,
+ "total_tx_pps": 246358,
+ "tx_pps": 247858,
+ "tx_pkts": 2463587,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 371300.609486956,
+ "rx_pkts": 3691660,
+ "time_ms": 1646283698553,
+ "drop_pct": 4826,
+ "total_tx_pps": 369648,
+ "tx_pps": 371786,
+ "tx_pkts": 3696486,
+ "drop_percentage": 0.13055642575137577
+ },
+ {
+ "rx_pps": 309474.9002967386,
+ "rx_pkts": 3076028,
+ "time_ms": 1646283711054,
+ "drop_pct": 3450,
+ "total_tx_pps": 307947,
+ "tx_pps": 309822,
+ "tx_pkts": 3079478,
+ "drop_percentage": 0.11203197425018137
+ },
+ {
+ "rx_pps": 278245.10146550665,
+ "rx_pkts": 2765620,
+ "time_ms": 1646283723573,
+ "drop_pct": 5913,
+ "total_tx_pps": 277153,
+ "tx_pps": 278840,
+ "tx_pkts": 2771533,
+ "drop_percentage": 0.21334763107637542
+ },
+ {
+ "rx_pps": 263348.0,
+ "rx_pkts": 2617285,
+ "time_ms": 1646283736118,
+ "drop_pct": 0,
+ "total_tx_pps": 261728,
+ "tx_pps": 263348,
+ "tx_pkts": 2617285,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 271017.63418923074,
+ "rx_pkts": 2693645,
+ "time_ms": 1646283748683,
+ "drop_pct": 759,
+ "total_tx_pps": 269440,
+ "tx_pps": 271094,
+ "tx_pkts": 2694404,
+ "ndr_pps": 131674,
+ "drop_percentage": 0.028169494997780584
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 128,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "65d6a678b0ba42a49b38c9efd82efd93"
+ },
+ "synthesis": {
+ "avg_delay_usec": 417.5000750778001,
+ "total_tx_rate": 261728
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.intensive",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1024-fc_128-rate_ndr-2.json",
+ "frame_sizes": [
+ "1024"
+ ],
+ "rate": "ndr",
+ "flow_count": "128",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc6_intensive"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-03 05:04:57",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "f51a51cc7fba4903b86a862ccaa87b3f",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "1024"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 128,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1024-fc_128-rate_ndr-1.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "1024"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2504,
+ 2515
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc6_intensive",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.intensive",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1024-fc_128-rate_ndr-1.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "1024": {
+ "ndr": {
+ "load_percent_per_direction": 4.00390625,
+ "timestamp_sec": 1646284037.5527284,
+ "stats": {
+ "total_tx_rate": 238246,
+ "overall": {
+ "rx_pkts": 2382462,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 2280,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 2382462,
+ "avg_delay_usec": 422.00110809742193,
+ "min_delay_usec": 36,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1191171,
+ "min_delay_usec": 36,
+ "drop_pct": 0,
+ "max_delay_usec": 655,
+ "tx_pkts": 1191291,
+ "avg_delay_usec": 400,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 1191291,
+ "min_delay_usec": 37,
+ "drop_pct": 0,
+ "max_delay_usec": 2280,
+ "tx_pkts": 1191171,
+ "avg_delay_usec": 444,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 1989830592.0,
+ "theoretical_tx_rate_pps": 5986590.038314176
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 8.0078125,
+ "duration_sec": 10.0,
+ "l2frame_size": "1024",
+ "rate_pps": 239696,
+ "rate_bps": 2001953124.0,
+ "time_taken_sec": 137.72533512115479
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 385513.1486587311,
+ "rx_pkts": 3764226,
+ "time_ms": 1646283912326,
+ "drop_pct": 54690013,
+ "total_tx_pps": 5845423,
+ "tx_pps": 5986590,
+ "tx_pkts": 58454239,
+ "drop_percentage": 93.56038832359104
+ },
+ {
+ "rx_pps": 398306.9198628332,
+ "rx_pkts": 3958773,
+ "time_ms": 1646283924836,
+ "drop_pct": 25791580,
+ "total_tx_pps": 2975035,
+ "tx_pps": 2993294,
+ "tx_pkts": 29750353,
+ "drop_percentage": 86.69335789057696
+ },
+ {
+ "rx_pps": 175559.30090151777,
+ "rx_pkts": 1745323,
+ "time_ms": 1646283937398,
+ "drop_pct": 13133585,
+ "total_tx_pps": 1487890,
+ "tx_pps": 1496646,
+ "tx_pkts": 14878908,
+ "drop_percentage": 88.26981791943334
+ },
+ {
+ "rx_pps": 444333.64431527094,
+ "rx_pkts": 4424898,
+ "time_ms": 1646283949915,
+ "drop_pct": 3027269,
+ "total_tx_pps": 745216,
+ "tx_pps": 748322,
+ "tx_pkts": 7452167,
+ "drop_percentage": 40.6226672053914
+ },
+ {
+ "rx_pps": 372829.4511323847,
+ "rx_pkts": 3705741,
+ "time_ms": 1646283962433,
+ "drop_pct": 13225,
+ "total_tx_pps": 371896,
+ "tx_pps": 374160,
+ "tx_pkts": 3718966,
+ "drop_percentage": 0.35560959686106297
+ },
+ {
+ "rx_pps": 187078.39026223953,
+ "rx_pkts": 1859467,
+ "time_ms": 1646283974959,
+ "drop_pct": 16,
+ "total_tx_pps": 185948,
+ "tx_pps": 187080,
+ "tx_pkts": 1859483,
+ "drop_percentage": 0.000860454223028659
+ },
+ {
+ "rx_pps": 280547.1520142218,
+ "rx_pkts": 2788219,
+ "time_ms": 1646283987466,
+ "drop_pct": 724,
+ "total_tx_pps": 278894,
+ "tx_pps": 280620,
+ "tx_pkts": 2788943,
+ "drop_percentage": 0.025959655683174595
+ },
+ {
+ "rx_pps": 233850.0,
+ "rx_pkts": 2324354,
+ "time_ms": 1646283999977,
+ "drop_pct": 0,
+ "total_tx_pps": 232435,
+ "tx_pps": 233850,
+ "tx_pkts": 2324354,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 257205.36675450407,
+ "rx_pkts": 2560866,
+ "time_ms": 1646284012517,
+ "drop_pct": 305,
+ "total_tx_pps": 256117,
+ "tx_pps": 257236,
+ "tx_pkts": 2561171,
+ "drop_percentage": 0.011908615238888774
+ },
+ {
+ "rx_pps": 245467.66146251332,
+ "rx_pkts": 2440196,
+ "time_ms": 1646284025026,
+ "drop_pct": 739,
+ "total_tx_pps": 244093,
+ "tx_pps": 245542,
+ "tx_pkts": 2440935,
+ "drop_percentage": 0.030275283856391097
+ },
+ {
+ "rx_pps": 239696.0,
+ "rx_pkts": 2382462,
+ "time_ms": 1646284037551,
+ "drop_pct": 0,
+ "total_tx_pps": 238246,
+ "tx_pps": 239696,
+ "tx_pkts": 2382462,
+ "ndr_pps": 119848,
+ "drop_percentage": 0.0
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 128,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "f51a51cc7fba4903b86a862ccaa87b3f"
+ },
+ "synthesis": {
+ "avg_delay_usec": 422.00110809742193,
+ "total_tx_rate": 238246
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.intensive",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1280-fc_128-rate_ndr-2.json",
+ "frame_sizes": [
+ "1280"
+ ],
+ "rate": "ndr",
+ "flow_count": "128",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc6_intensive"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-03 05:12:10",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "80d26043cfdb45c3ae62d6de43f557e6",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "1280"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 128,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1280-fc_128-rate_ndr-1.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "1280"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2504,
+ 2515
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc6_intensive",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.intensive",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1280-fc_128-rate_ndr-1.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "1280": {
+ "ndr": {
+ "load_percent_per_direction": 4.39453125,
+ "timestamp_sec": 1646284470.8886955,
+ "stats": {
+ "total_tx_rate": 209995,
+ "overall": {
+ "rx_pkts": 2099959,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 7375,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 2099959,
+ "avg_delay_usec": 417.999049981452,
+ "min_delay_usec": 30,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1049927,
+ "min_delay_usec": 30,
+ "drop_pct": 0,
+ "max_delay_usec": 3319,
+ "tx_pkts": 1050032,
+ "avg_delay_usec": 437,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 1050032,
+ "min_delay_usec": 40,
+ "drop_pct": 0,
+ "max_delay_usec": 7375,
+ "tx_pkts": 1049927,
+ "avg_delay_usec": 399,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 2183948000.0,
+ "theoretical_tx_rate_pps": 4807692.307692308
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 8.7890625,
+ "duration_sec": 10.0,
+ "l2frame_size": "1280",
+ "rate_pps": 211274,
+ "rate_bps": 2197265624.0,
+ "time_taken_sec": 137.58449530601501
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 445313.368302234,
+ "rx_pkts": 4370570,
+ "time_ms": 1646284345792,
+ "drop_pct": 42814976,
+ "total_tx_pps": 4718554,
+ "tx_pps": 4807692,
+ "tx_pkts": 47185546,
+ "drop_percentage": 90.73748134651234
+ },
+ {
+ "rx_pps": 124940.5018865484,
+ "rx_pkts": 1242346,
+ "time_ms": 1646284358300,
+ "drop_pct": 22660299,
+ "total_tx_pps": 2390264,
+ "tx_pps": 2403846,
+ "tx_pkts": 23902645,
+ "drop_percentage": 94.80247478887797
+ },
+ {
+ "rx_pps": 191703.051128334,
+ "rx_pkts": 1905433,
+ "time_ms": 1646284370806,
+ "drop_pct": 10041074,
+ "total_tx_pps": 1194650,
+ "tx_pps": 1201922,
+ "tx_pkts": 11946507,
+ "drop_percentage": 84.05029185518411
+ },
+ {
+ "rx_pps": 456071.17274298525,
+ "rx_pkts": 4533121,
+ "time_ms": 1646284383305,
+ "drop_pct": 1440123,
+ "total_tx_pps": 597324,
+ "tx_pps": 600960,
+ "tx_pkts": 5973244,
+ "drop_percentage": 24.109562576047455
+ },
+ {
+ "rx_pps": 298776.8979556851,
+ "rx_pkts": 2969696,
+ "time_ms": 1646284395827,
+ "drop_pct": 16928,
+ "total_tx_pps": 298662,
+ "tx_pps": 300480,
+ "tx_pkts": 2986624,
+ "drop_percentage": 0.566793811340162
+ },
+ {
+ "rx_pps": 150240.0,
+ "rx_pkts": 1493238,
+ "time_ms": 1646284408345,
+ "drop_pct": 0,
+ "total_tx_pps": 149323,
+ "tx_pps": 150240,
+ "tx_pkts": 1493238,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 225283.22787322282,
+ "rx_pkts": 2238978,
+ "time_ms": 1646284420849,
+ "drop_pct": 763,
+ "total_tx_pps": 223974,
+ "tx_pps": 225360,
+ "tx_pkts": 2239741,
+ "drop_percentage": 0.034066438932001515
+ },
+ {
+ "rx_pps": 187800.0,
+ "rx_pkts": 1866452,
+ "time_ms": 1646284433379,
+ "drop_pct": 0,
+ "total_tx_pps": 186645,
+ "tx_pps": 187800,
+ "tx_pkts": 1866452,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 206580.0,
+ "rx_pkts": 2053097,
+ "time_ms": 1646284445878,
+ "drop_pct": 0,
+ "total_tx_pps": 205309,
+ "tx_pps": 206580,
+ "tx_pkts": 2053097,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 215836.3783602464,
+ "rx_pkts": 2145092,
+ "time_ms": 1646284458378,
+ "drop_pct": 1328,
+ "total_tx_pps": 214642,
+ "tx_pps": 215970,
+ "tx_pkts": 2146420,
+ "drop_percentage": 0.06187046337622646
+ },
+ {
+ "rx_pps": 211274.0,
+ "rx_pkts": 2099959,
+ "time_ms": 1646284470887,
+ "drop_pct": 0,
+ "total_tx_pps": 209995,
+ "tx_pps": 211274,
+ "tx_pkts": 2099959,
+ "ndr_pps": 105637,
+ "drop_percentage": 0.0
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 128,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "80d26043cfdb45c3ae62d6de43f557e6"
+ },
+ "synthesis": {
+ "avg_delay_usec": 417.999049981452,
+ "total_tx_rate": 209995
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.intensive",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1518-fc_128-rate_ndr-2.json",
+ "frame_sizes": [
+ "1518"
+ ],
+ "rate": "ndr",
+ "flow_count": "128",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc6_intensive"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-03 05:16:59",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "fab39ed6c612445784e1e24574be97e2",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "1518"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 128,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1518-fc_128-rate_ndr-0.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "1518"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2504,
+ 2515
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc6_intensive",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.intensive",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1518-fc_128-rate_ndr-0.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "1518": {
+ "ndr": {
+ "load_percent_per_direction": 6.25,
+ "timestamp_sec": 1646284759.8324285,
+ "stats": {
+ "total_tx_rate": 252445,
+ "overall": {
+ "rx_pkts": 2524456,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 13375,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 2524456,
+ "avg_delay_usec": 557.5041177188274,
+ "min_delay_usec": 43,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1262165,
+ "min_delay_usec": 43,
+ "drop_pct": 0,
+ "max_delay_usec": 657,
+ "tx_pkts": 1262291,
+ "avg_delay_usec": 475,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 1262291,
+ "min_delay_usec": 79,
+ "drop_pct": 0,
+ "max_delay_usec": 13375,
+ "tx_pkts": 1262165,
+ "avg_delay_usec": 640,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 3106083280.0,
+ "theoretical_tx_rate_pps": 4063719.1157347206
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 12.5,
+ "duration_sec": 10.0,
+ "l2frame_size": "1518",
+ "rate_pps": 253982,
+ "rate_bps": 3125000000.0,
+ "time_taken_sec": 137.6273422241211
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 348467.55522107193,
+ "rx_pkts": 3427071,
+ "time_ms": 1646284634724,
+ "drop_pct": 36538343,
+ "total_tx_pps": 3996541,
+ "tx_pps": 4063718,
+ "tx_pkts": 39965414,
+ "drop_percentage": 91.42490804674262
+ },
+ {
+ "rx_pps": 194182.29947632473,
+ "rx_pkts": 1929881,
+ "time_ms": 1646284647240,
+ "drop_pct": 18263742,
+ "total_tx_pps": 2019362,
+ "tx_pps": 2031858,
+ "tx_pkts": 20193623,
+ "drop_percentage": 90.44311662151958
+ },
+ {
+ "rx_pps": 179396.25923534992,
+ "rx_pkts": 1782930,
+ "time_ms": 1646284659752,
+ "drop_pct": 8313872,
+ "total_tx_pps": 1009680,
+ "tx_pps": 1015928,
+ "tx_pkts": 10096802,
+ "drop_percentage": 82.3416364904452
+ },
+ {
+ "rx_pps": 444172.416750406,
+ "rx_pkts": 4414410,
+ "time_ms": 1646284672259,
+ "drop_pct": 633993,
+ "total_tx_pps": 504840,
+ "tx_pps": 507964,
+ "tx_pkts": 5048403,
+ "drop_percentage": 12.5582882349131
+ },
+ {
+ "rx_pps": 253982.0,
+ "rx_pkts": 2524456,
+ "time_ms": 1646284684759,
+ "drop_pct": 0,
+ "total_tx_pps": 252445,
+ "tx_pps": 253982,
+ "tx_pkts": 2524456,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 380480.22499434196,
+ "rx_pkts": 3781785,
+ "time_ms": 1646284697283,
+ "drop_pct": 4888,
+ "total_tx_pps": 378667,
+ "tx_pps": 380972,
+ "tx_pkts": 3786673,
+ "drop_percentage": 0.12908429114423137
+ },
+ {
+ "rx_pps": 316051.2110285178,
+ "rx_pkts": 3141708,
+ "time_ms": 1646284709792,
+ "drop_pct": 14183,
+ "total_tx_pps": 315589,
+ "tx_pps": 317478,
+ "tx_pkts": 3155891,
+ "drop_percentage": 0.44941349368530153
+ },
+ {
+ "rx_pps": 285668.0250878956,
+ "rx_pkts": 2839399,
+ "time_ms": 1646284722300,
+ "drop_pct": 616,
+ "total_tx_pps": 284001,
+ "tx_pps": 285730,
+ "tx_pkts": 2840015,
+ "drop_percentage": 0.02169002628507244
+ },
+ {
+ "rx_pps": 269807.1017426643,
+ "rx_pkts": 2681614,
+ "time_ms": 1646284734800,
+ "drop_pct": 486,
+ "total_tx_pps": 268210,
+ "tx_pps": 269856,
+ "tx_pkts": 2682100,
+ "drop_percentage": 0.018120129749077216
+ },
+ {
+ "rx_pps": 261898.78374930617,
+ "rx_pkts": 2603144,
+ "time_ms": 1646284747309,
+ "drop_pct": 191,
+ "total_tx_pps": 260333,
+ "tx_pps": 261918,
+ "tx_pkts": 2603335,
+ "drop_percentage": 0.007336743062264364
+ },
+ {
+ "rx_pps": 257926.4552171562,
+ "rx_pkts": 2563404,
+ "time_ms": 1646284759831,
+ "drop_pct": 234,
+ "total_tx_pps": 256363,
+ "tx_pps": 257950,
+ "tx_pkts": 2563638,
+ "ndr_pps": 126991,
+ "drop_percentage": 0.009127653748306118
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 128,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "fab39ed6c612445784e1e24574be97e2"
+ },
+ "synthesis": {
+ "avg_delay_usec": 557.5041177188274,
+ "total_tx_rate": 252445
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.intensive",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_IMIX-fc_128-rate_ndr-2.json",
+ "frame_sizes": [
+ "IMIX"
+ ],
+ "rate": "ndr",
+ "flow_count": "128",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc6_intensive"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-03 05:24:12",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "ceb21980b7a54cfca27c2be13acbe3fd",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "IMIX"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 128,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_IMIX-fc_128-rate_ndr-0.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "IMIX"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2504,
+ 2515
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc6_intensive",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.intensive",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_IMIX-fc_128-rate_ndr-0.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "IMIX": {
+ "ndr": {
+ "load_percent_per_direction": 1.171875,
+ "timestamp_sec": 1646285193.3781986,
+ "stats": {
+ "total_tx_rate": 190656,
+ "overall": {
+ "rx_pkts": 1906560,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 3445,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 1906560,
+ "avg_delay_usec": 366.4996223564955,
+ "min_delay_usec": 49,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 953232,
+ "min_delay_usec": 54,
+ "drop_pct": 0,
+ "max_delay_usec": 3445,
+ "tx_pkts": 953328,
+ "avg_delay_usec": 374,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 953328,
+ "min_delay_usec": 49,
+ "drop_pct": 0,
+ "max_delay_usec": 3400,
+ "tx_pkts": 953232,
+ "avg_delay_usec": 359,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 582390528.0,
+ "theoretical_tx_rate_pps": 16368398.079441292
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 2.34375,
+ "duration_sec": 10.0,
+ "l2frame_size": "IMIX",
+ "rate_pps": 191816,
+ "rate_bps": 585937500.0,
+ "time_taken_sec": 137.84817028045654
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 527518.6982376295,
+ "rx_pkts": 4594899,
+ "time_ms": 1646285068098,
+ "drop_pct": 137980399,
+ "total_tx_pps": 14257529,
+ "tx_pps": 16368398,
+ "tx_pkts": 142575298,
+ "warning": "WARNING: There is a significant difference between requested TX rate (16368398) and actual TX rate (14257529). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "drop_percentage": 96.77721241725898
+ },
+ {
+ "rx_pps": 649584.5882534897,
+ "rx_pkts": 6455897,
+ "time_ms": 1646285080678,
+ "drop_pct": 74882762,
+ "total_tx_pps": 8133865,
+ "tx_pps": 8184198,
+ "tx_pkts": 81338659,
+ "drop_percentage": 92.06294143600277
+ },
+ {
+ "rx_pps": 486023.50862599886,
+ "rx_pkts": 4830345,
+ "time_ms": 1646285093199,
+ "drop_pct": 35838974,
+ "total_tx_pps": 4066931,
+ "tx_pps": 4092098,
+ "tx_pkts": 40669319,
+ "drop_percentage": 88.12287710054845
+ },
+ {
+ "rx_pps": 487117.8462164386,
+ "rx_pkts": 4841709,
+ "time_ms": 1646285105721,
+ "drop_pct": 15494990,
+ "total_tx_pps": 2033669,
+ "tx_pps": 2046048,
+ "tx_pkts": 20336699,
+ "drop_percentage": 76.19225716031889
+ },
+ {
+ "rx_pps": 365059.10021687107,
+ "rx_pkts": 3628142,
+ "time_ms": 1646285118236,
+ "drop_pct": 6539188,
+ "total_tx_pps": 1016733,
+ "tx_pps": 1023024,
+ "tx_pkts": 10167330,
+ "drop_percentage": 64.31568563231448
+ },
+ {
+ "rx_pps": 470718.585949703,
+ "rx_pkts": 4678475,
+ "time_ms": 1646285130816,
+ "drop_pct": 405446,
+ "total_tx_pps": 508392,
+ "tx_pps": 511512,
+ "tx_pkts": 5083921,
+ "drop_percentage": 7.975064915446168
+ },
+ {
+ "rx_pps": 255742.51844840997,
+ "rx_pkts": 2541955,
+ "time_ms": 1646285143320,
+ "drop_pct": 134,
+ "total_tx_pps": 254208,
+ "tx_pps": 255756,
+ "tx_pkts": 2542089,
+ "drop_percentage": 0.0052712552550284435
+ },
+ {
+ "rx_pps": 127878.0,
+ "rx_pkts": 1271047,
+ "time_ms": 1646285155820,
+ "drop_pct": 0,
+ "total_tx_pps": 127104,
+ "tx_pps": 127878,
+ "tx_pkts": 1271047,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 191816.0,
+ "rx_pkts": 1906560,
+ "time_ms": 1646285168332,
+ "drop_pct": 0,
+ "total_tx_pps": 190656,
+ "tx_pps": 191816,
+ "tx_pkts": 1906560,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 223586.05076246973,
+ "rx_pkts": 2225246,
+ "time_ms": 1646285180872,
+ "drop_pct": 1990,
+ "total_tx_pps": 222723,
+ "tx_pps": 223786,
+ "tx_pkts": 2227236,
+ "drop_percentage": 0.08934841211259158
+ },
+ {
+ "rx_pps": 207747.38173291675,
+ "rx_pkts": 2064908,
+ "time_ms": 1646285193377,
+ "drop_pct": 523,
+ "total_tx_pps": 206543,
+ "tx_pps": 207800,
+ "tx_pkts": 2065431,
+ "ndr_pps": 95908,
+ "drop_percentage": 0.02532159147412816
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 128,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "ceb21980b7a54cfca27c2be13acbe3fd"
+ },
+ "synthesis": {
+ "avg_delay_usec": 366.4996223564955,
+ "total_tx_rate": 190656
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.intensive",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_9000-fc_128-rate_ndr-2.json",
+ "frame_sizes": [
+ "9000"
+ ],
+ "rate": "ndr",
+ "flow_count": "128",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc6_intensive"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-03 05:31:26",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "7d83b94d43e942238d6c50de662d6dcf",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "9000"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 128,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_9000-fc_128-rate_ndr-0.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "9000"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2504,
+ 2515
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc6_intensive",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.intensive",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_9000-fc_128-rate_ndr-0.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "9000": {
+ "ndr": {
+ "load_percent_per_direction": 22.65625,
+ "timestamp_sec": 1646285626.5736058,
+ "stats": {
+ "total_tx_rate": 156036,
+ "overall": {
+ "rx_pkts": 1560365,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 5728,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 1560365,
+ "avg_delay_usec": 587.9997974832811,
+ "min_delay_usec": 58,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 780143,
+ "min_delay_usec": 58,
+ "drop_pct": 0,
+ "max_delay_usec": 1773,
+ "tx_pkts": 780222,
+ "avg_delay_usec": 592,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 780222,
+ "min_delay_usec": 59,
+ "drop_pct": 0,
+ "max_delay_usec": 5728,
+ "tx_pkts": 780143,
+ "avg_delay_usec": 584,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 11259557760.0,
+ "theoretical_tx_rate_pps": 692904.6563192905
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 45.3125,
+ "duration_sec": 10.0,
+ "l2frame_size": "9000",
+ "rate_pps": 156986,
+ "rate_bps": 11328125000.0,
+ "time_taken_sec": 137.71946001052856
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 81808.84100646983,
+ "rx_pkts": 816086,
+ "time_ms": 1646285501423,
+ "drop_pct": 6095994,
+ "total_tx_pps": 691208,
+ "tx_pps": 692904,
+ "tx_pkts": 6912080,
+ "drop_percentage": 88.19333688267497
+ },
+ {
+ "rx_pps": 174051.7277974219,
+ "rx_pkts": 1729814,
+ "time_ms": 1646285513938,
+ "drop_pct": 1713401,
+ "total_tx_pps": 344321,
+ "tx_pps": 346452,
+ "tx_pkts": 3443215,
+ "drop_percentage": 49.761661702798115
+ },
+ {
+ "rx_pps": 173173.57764485295,
+ "rx_pkts": 1721087,
+ "time_ms": 1646285526441,
+ "drop_pct": 521,
+ "total_tx_pps": 172160,
+ "tx_pps": 173226,
+ "tx_pkts": 1721608,
+ "drop_percentage": 0.030262405843839015
+ },
+ {
+ "rx_pps": 86612.0,
+ "rx_pkts": 860882,
+ "time_ms": 1646285539000,
+ "drop_pct": 0,
+ "total_tx_pps": 86088,
+ "tx_pps": 86612,
+ "tx_pkts": 860882,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 129918.0,
+ "rx_pkts": 1293789,
+ "time_ms": 1646285551538,
+ "drop_pct": 0,
+ "total_tx_pps": 129378,
+ "tx_pps": 129918,
+ "tx_pkts": 1293789,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 151572.0,
+ "rx_pkts": 1506400,
+ "time_ms": 1646285564049,
+ "drop_pct": 0,
+ "total_tx_pps": 150640,
+ "tx_pps": 151572,
+ "tx_pkts": 1506400,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 162238.83736784133,
+ "rx_pkts": 1612576,
+ "time_ms": 1646285576558,
+ "drop_pct": 1582,
+ "total_tx_pps": 161415,
+ "tx_pps": 162398,
+ "tx_pkts": 1614158,
+ "drop_percentage": 0.09800775388778546
+ },
+ {
+ "rx_pps": 156986.0,
+ "rx_pkts": 1560365,
+ "time_ms": 1646285589058,
+ "drop_pct": 0,
+ "total_tx_pps": 156036,
+ "tx_pps": 156986,
+ "tx_pkts": 1560365,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 159630.32079097626,
+ "rx_pkts": 1586489,
+ "time_ms": 1646285601557,
+ "drop_pct": 613,
+ "total_tx_pps": 158710,
+ "tx_pps": 159692,
+ "tx_pkts": 1587102,
+ "drop_percentage": 0.03862385656372432
+ },
+ {
+ "rx_pps": 155353.5470980394,
+ "rx_pkts": 1543982,
+ "time_ms": 1646285614056,
+ "drop_pct": 29661,
+ "total_tx_pps": 157364,
+ "tx_pps": 158338,
+ "tx_pkts": 1573643,
+ "drop_percentage": 1.8848620684615252
+ },
+ {
+ "rx_pps": 157653.74926958897,
+ "rx_pkts": 1566844,
+ "time_ms": 1646285626572,
+ "drop_pct": 82,
+ "total_tx_pps": 156692,
+ "tx_pps": 157662,
+ "tx_pkts": 1566926,
+ "ndr_pps": 78493,
+ "drop_percentage": 0.005233176295498319
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 128,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "7d83b94d43e942238d6c50de662d6dcf"
+ },
+ "synthesis": {
+ "avg_delay_usec": 587.9997974832811,
+ "total_tx_rate": 156036
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.intensive",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_64-fc_10k-rate_ndr-2.json",
+ "frame_sizes": [
+ "64"
+ ],
+ "rate": "ndr",
+ "flow_count": "10k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc6_intensive"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-03 05:38:39",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "7bffd833c7684dd6ad3c6fb4392fd892",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "64"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 10000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_64-fc_10k-rate_ndr-0.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "64"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2504,
+ 2515
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc6_intensive",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.intensive",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_64-fc_10k-rate_ndr-0.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "64": {
+ "ndr": {
+ "load_percent_per_direction": 0.390625,
+ "timestamp_sec": 1646286062.320283,
+ "stats": {
+ "total_tx_rate": 289377,
+ "overall": {
+ "rx_pkts": 2893779,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 4256,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 2893779,
+ "avg_delay_usec": 430.4998222048055,
+ "min_delay_usec": 52,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1446816,
+ "min_delay_usec": 52,
+ "drop_pct": 0,
+ "max_delay_usec": 4256,
+ "tx_pkts": 1446963,
+ "avg_delay_usec": 434,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 1446963,
+ "min_delay_usec": 57,
+ "drop_pct": 0,
+ "max_delay_usec": 948,
+ "tx_pkts": 1446816,
+ "avg_delay_usec": 427,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 194461344.0,
+ "theoretical_tx_rate_pps": 74404761.90476191
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 0.78125,
+ "duration_sec": 10.0,
+ "l2frame_size": "64",
+ "rate_pps": 290642,
+ "rate_bps": 195312500.0,
+ "time_taken_sec": 137.67585062980652
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 1060675.9533262525,
+ "rx_pkts": 3801256,
+ "time_ms": 1646285937162,
+ "drop_pct": 262850910,
+ "total_tx_pps": 26665216,
+ "tx_pps": 74404760,
+ "tx_pkts": 266652166,
+ "warning": "WARNING: There is a significant difference between requested TX rate (74404760) and actual TX rate (26665216). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "drop_percentage": 98.57445148223547
+ },
+ {
+ "rx_pps": 549084.4052686733,
+ "rx_pkts": 3959911,
+ "time_ms": 1646285949709,
+ "drop_pct": 264337845,
+ "total_tx_pps": 26829775,
+ "tx_pps": 37202380,
+ "tx_pkts": 268297756,
+ "warning": "WARNING: There is a significant difference between requested TX rate (37202380) and actual TX rate (26829775). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "drop_percentage": 98.52406108085377
+ },
+ {
+ "rx_pps": 369990.33655168186,
+ "rx_pkts": 3683809,
+ "time_ms": 1646285962227,
+ "drop_pct": 181518950,
+ "total_tx_pps": 18520275,
+ "tx_pps": 18601190,
+ "tx_pkts": 185202759,
+ "drop_percentage": 98.01093189977802
+ },
+ {
+ "rx_pps": 384612.35211511684,
+ "rx_pkts": 3822471,
+ "time_ms": 1646285974730,
+ "drop_pct": 88611510,
+ "total_tx_pps": 9243398,
+ "tx_pps": 9300594,
+ "tx_pkts": 92433981,
+ "drop_percentage": 95.86464743956013
+ },
+ {
+ "rx_pps": 168933.23502156153,
+ "rx_pkts": 1678943,
+ "time_ms": 1646285987251,
+ "drop_pct": 44538025,
+ "total_tx_pps": 4621696,
+ "tx_pps": 4650296,
+ "tx_pkts": 46216968,
+ "drop_percentage": 96.36725844932104
+ },
+ {
+ "rx_pps": 159074.18157372237,
+ "rx_pkts": 1580959,
+ "time_ms": 1646285999771,
+ "drop_pct": 21527528,
+ "total_tx_pps": 2310848,
+ "tx_pps": 2325148,
+ "tx_pkts": 23108487,
+ "drop_percentage": 93.15853521695297
+ },
+ {
+ "rx_pps": 171386.32143951976,
+ "rx_pkts": 1703323,
+ "time_ms": 1646286012283,
+ "drop_pct": 9850919,
+ "total_tx_pps": 1155424,
+ "tx_pps": 1162574,
+ "tx_pkts": 11554242,
+ "drop_percentage": 85.25802904249366
+ },
+ {
+ "rx_pps": 512810.1541521316,
+ "rx_pkts": 5097079,
+ "time_ms": 1646286024781,
+ "drop_pct": 680616,
+ "total_tx_pps": 577769,
+ "tx_pps": 581286,
+ "tx_pkts": 5777695,
+ "drop_percentage": 11.780061079721238
+ },
+ {
+ "rx_pps": 290642.0,
+ "rx_pkts": 2893779,
+ "time_ms": 1646286037314,
+ "drop_pct": 0,
+ "total_tx_pps": 289377,
+ "tx_pps": 290642,
+ "tx_pkts": 2893779,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 417277.35359887895,
+ "rx_pkts": 4147530,
+ "time_ms": 1646286049813,
+ "drop_pct": 185736,
+ "total_tx_pps": 433326,
+ "tx_pps": 435964,
+ "tx_pkts": 4333266,
+ "drop_percentage": 4.28628198684318
+ },
+ {
+ "rx_pps": 363141.5007727034,
+ "rx_pkts": 3609085,
+ "time_ms": 1646286062319,
+ "drop_pct": 1615,
+ "total_tx_pps": 361070,
+ "tx_pps": 363304,
+ "tx_pkts": 3610700,
+ "ndr_pps": 145321,
+ "drop_percentage": 0.044728169053092195
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 10000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "7bffd833c7684dd6ad3c6fb4392fd892"
+ },
+ "synthesis": {
+ "avg_delay_usec": 430.4998222048055,
+ "total_tx_rate": 289377
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.intensive",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_128-fc_10k-rate_ndr-2.json",
+ "frame_sizes": [
+ "128"
+ ],
+ "rate": "ndr",
+ "flow_count": "10k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc6_intensive"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-03 05:45:59",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "fcb4e242cc2c4c36873e6f0361cb9a5f",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "128"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 10000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_128-fc_10k-rate_ndr-0.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "128"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2504,
+ 2515
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc6_intensive",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.intensive",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_128-fc_10k-rate_ndr-0.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "128": {
+ "ndr": {
+ "load_percent_per_direction": 0.78125,
+ "timestamp_sec": 1646286501.6585698,
+ "stats": {
+ "total_tx_rate": 328252,
+ "overall": {
+ "rx_pkts": 3282523,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 5743,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 3282523,
+ "avg_delay_usec": 504.00045239591617,
+ "min_delay_usec": 59,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1641179,
+ "min_delay_usec": 60,
+ "drop_pct": 0,
+ "max_delay_usec": 5743,
+ "tx_pkts": 1641344,
+ "avg_delay_usec": 495,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 1641344,
+ "min_delay_usec": 59,
+ "drop_pct": 0,
+ "max_delay_usec": 5416,
+ "tx_pkts": 1641179,
+ "avg_delay_usec": 513,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 388650368.0,
+ "theoretical_tx_rate_pps": 42229729.72972973
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 1.5625,
+ "duration_sec": 10.0,
+ "l2frame_size": "128",
+ "rate_pps": 329918,
+ "rate_bps": 390625000.0,
+ "time_taken_sec": 137.7171869277954
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 669022.1950312835,
+ "rx_pkts": 4088190,
+ "time_ms": 1646286376431,
+ "drop_pct": 253964761,
+ "total_tx_pps": 25805295,
+ "tx_pps": 42229728,
+ "tx_pkts": 258052951,
+ "warning": "WARNING: There is a significant difference between requested TX rate (42229728) and actual TX rate (25805295). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "drop_percentage": 98.41575537727526
+ },
+ {
+ "rx_pps": 399023.3302773898,
+ "rx_pkts": 3965614,
+ "time_ms": 1646286388930,
+ "drop_pct": 205880262,
+ "total_tx_pps": 20984587,
+ "tx_pps": 21114864,
+ "tx_pkts": 209845876,
+ "drop_percentage": 98.11022543040112
+ },
+ {
+ "rx_pps": 447142.9301377911,
+ "rx_pkts": 4443482,
+ "time_ms": 1646286401505,
+ "drop_pct": 100470978,
+ "total_tx_pps": 10491446,
+ "tx_pps": 10557432,
+ "tx_pkts": 104914460,
+ "drop_percentage": 95.7646619922554
+ },
+ {
+ "rx_pps": 346951.3718415911,
+ "rx_pkts": 3448177,
+ "time_ms": 1646286414004,
+ "drop_pct": 49014354,
+ "total_tx_pps": 5246253,
+ "tx_pps": 5278716,
+ "tx_pkts": 52462531,
+ "drop_percentage": 93.42735294261728
+ },
+ {
+ "rx_pps": 215866.7599879869,
+ "rx_pkts": 2145392,
+ "time_ms": 1646286426523,
+ "drop_pct": 24085870,
+ "total_tx_pps": 2623126,
+ "tx_pps": 2639358,
+ "tx_pkts": 26231262,
+ "drop_percentage": 91.82123986257314
+ },
+ {
+ "rx_pps": 149781.0398090949,
+ "rx_pkts": 1488599,
+ "time_ms": 1646286439020,
+ "drop_pct": 11627022,
+ "total_tx_pps": 1311562,
+ "tx_pps": 1319678,
+ "tx_pkts": 13115621,
+ "drop_percentage": 88.65018286210008
+ },
+ {
+ "rx_pps": 498086.9811686903,
+ "rx_pkts": 4950239,
+ "time_ms": 1646286451572,
+ "drop_pct": 1607563,
+ "total_tx_pps": 655780,
+ "tx_pps": 659838,
+ "tx_pkts": 6557802,
+ "drop_percentage": 24.51374713661681
+ },
+ {
+ "rx_pps": 329918.0,
+ "rx_pkts": 3282523,
+ "time_ms": 1646286464132,
+ "drop_pct": 0,
+ "total_tx_pps": 328252,
+ "tx_pps": 329918,
+ "tx_pkts": 3282523,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 478526.7821332745,
+ "rx_pkts": 4756319,
+ "time_ms": 1646286476632,
+ "drop_pct": 162523,
+ "total_tx_pps": 491884,
+ "tx_pps": 494878,
+ "tx_pkts": 4918842,
+ "drop_percentage": 3.3040906782531336
+ },
+ {
+ "rx_pps": 411878.7378240714,
+ "rx_pkts": 4093705,
+ "time_ms": 1646286489150,
+ "drop_pct": 5161,
+ "total_tx_pps": 409886,
+ "tx_pps": 412398,
+ "tx_pkts": 4098866,
+ "drop_percentage": 0.12591287443893018
+ },
+ {
+ "rx_pps": 371054.5743320845,
+ "rx_pkts": 3688099,
+ "time_ms": 1646286501657,
+ "drop_pct": 1028,
+ "total_tx_pps": 368912,
+ "tx_pps": 371158,
+ "tx_pkts": 3689127,
+ "ndr_pps": 164959,
+ "drop_percentage": 0.027865671200801707
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 10000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "fcb4e242cc2c4c36873e6f0361cb9a5f"
+ },
+ "synthesis": {
+ "avg_delay_usec": 504.00045239591617,
+ "total_tx_rate": 328252
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.intensive",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_256-fc_10k-rate_ndr-2.json",
+ "frame_sizes": [
+ "256"
+ ],
+ "rate": "ndr",
+ "flow_count": "10k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc6_intensive"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-03 05:55:45",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "e09f10fc7dc54e4a9b8a1c58b88028df",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "256"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 10000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_256-fc_10k-rate_ndr-1.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "256"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2504,
+ 2515
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc6_intensive",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.intensive",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_256-fc_10k-rate_ndr-1.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "256": {
+ "ndr": {
+ "load_percent_per_direction": 1.3671875,
+ "timestamp_sec": 1646287087.8915067,
+ "stats": {
+ "total_tx_rate": 307709,
+ "overall": {
+ "rx_pkts": 3077097,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 3367,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 3077097,
+ "avg_delay_usec": 432.50000146241734,
+ "min_delay_usec": 38,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1538548,
+ "min_delay_usec": 38,
+ "drop_pct": 0,
+ "max_delay_usec": 3281,
+ "tx_pkts": 1538549,
+ "avg_delay_usec": 428,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 1538549,
+ "min_delay_usec": 55,
+ "drop_pct": 0,
+ "max_delay_usec": 3367,
+ "tx_pkts": 1538548,
+ "avg_delay_usec": 437,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 679421472.0,
+ "theoretical_tx_rate_pps": 22644927.536231883
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 2.734375,
+ "duration_sec": 10.0,
+ "l2frame_size": "256",
+ "rate_pps": 309598,
+ "rate_bps": 683593750.0,
+ "time_taken_sec": 137.742746591568
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 255672.565299537,
+ "rx_pkts": 2319871,
+ "time_ms": 1646286962658,
+ "drop_pct": 203151166,
+ "total_tx_pps": 20547103,
+ "tx_pps": 22644926,
+ "tx_pkts": 205471037,
+ "drop_percentage": 98.87094987504248
+ },
+ {
+ "rx_pps": 335448.3699684173,
+ "rx_pkts": 3333855,
+ "time_ms": 1646286975189,
+ "drop_pct": 109194480,
+ "total_tx_pps": 11252833,
+ "tx_pps": 11322462,
+ "tx_pkts": 112528335,
+ "drop_percentage": 97.03731953378676
+ },
+ {
+ "rx_pps": 130166.49486928145,
+ "rx_pkts": 1293660,
+ "time_ms": 1646286987760,
+ "drop_pct": 54970487,
+ "total_tx_pps": 5626414,
+ "tx_pps": 5661230,
+ "tx_pkts": 56264147,
+ "drop_percentage": 97.70073826943471
+ },
+ {
+ "rx_pps": 188671.05892669645,
+ "rx_pkts": 1875296,
+ "time_ms": 1646287000320,
+ "drop_pct": 26259592,
+ "total_tx_pps": 2813488,
+ "tx_pps": 2830614,
+ "tx_pkts": 28134888,
+ "drop_percentage": 93.33462425725668
+ },
+ {
+ "rx_pps": 208503.260507737,
+ "rx_pkts": 2075129,
+ "time_ms": 1646287012832,
+ "drop_pct": 12010706,
+ "total_tx_pps": 1408583,
+ "tx_pps": 1415306,
+ "tx_pkts": 14085835,
+ "drop_percentage": 85.2679731091554
+ },
+ {
+ "rx_pps": 401016.7055138048,
+ "rx_pkts": 3985506,
+ "time_ms": 1646287025334,
+ "drop_pct": 3047496,
+ "total_tx_pps": 703300,
+ "tx_pps": 707652,
+ "tx_pkts": 7033002,
+ "drop_percentage": 43.331368311853176
+ },
+ {
+ "rx_pps": 353769.4579762555,
+ "rx_pkts": 3516295,
+ "time_ms": 1646287037843,
+ "drop_pct": 562,
+ "total_tx_pps": 351685,
+ "tx_pps": 353826,
+ "tx_pkts": 3516857,
+ "drop_percentage": 0.01598017775530822
+ },
+ {
+ "rx_pps": 176912.0,
+ "rx_pkts": 1758241,
+ "time_ms": 1646287050350,
+ "drop_pct": 0,
+ "total_tx_pps": 175824,
+ "tx_pps": 176912,
+ "tx_pkts": 1758241,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 265370.0,
+ "rx_pkts": 2637382,
+ "time_ms": 1646287062871,
+ "drop_pct": 0,
+ "total_tx_pps": 263738,
+ "tx_pps": 265370,
+ "tx_pkts": 2637382,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 309598.0,
+ "rx_pkts": 3077097,
+ "time_ms": 1646287075371,
+ "drop_pct": 0,
+ "total_tx_pps": 307709,
+ "tx_pps": 309598,
+ "tx_pkts": 3077097,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 331394.0121815451,
+ "rx_pkts": 3300519,
+ "time_ms": 1646287087890,
+ "drop_pct": 3167,
+ "total_tx_pps": 330368,
+ "tx_pps": 331712,
+ "tx_pkts": 3303686,
+ "ndr_pps": 154799,
+ "drop_percentage": 0.09586262132660307
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 10000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "e09f10fc7dc54e4a9b8a1c58b88028df"
+ },
+ "synthesis": {
+ "avg_delay_usec": 432.50000146241734,
+ "total_tx_rate": 307709
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.intensive",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_512-fc_10k-rate_ndr-2.json",
+ "frame_sizes": [
+ "512"
+ ],
+ "rate": "ndr",
+ "flow_count": "10k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc6_intensive"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-03 06:00:38",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "32f6745439f040fa96de86e0a3ad0abf",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "512"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 10000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_512-fc_10k-rate_ndr-0.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "512"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2504,
+ 2515
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc6_intensive",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.intensive",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_512-fc_10k-rate_ndr-0.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "512": {
+ "ndr": {
+ "load_percent_per_direction": 2.34375,
+ "timestamp_sec": 1646287380.6742508,
+ "stats": {
+ "total_tx_rate": 273652,
+ "overall": {
+ "rx_pkts": 2736528,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 2723,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 2736528,
+ "avg_delay_usec": 410.4993787748563,
+ "min_delay_usec": 41,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1368196,
+ "min_delay_usec": 45,
+ "drop_pct": 0,
+ "max_delay_usec": 2723,
+ "tx_pkts": 1368332,
+ "avg_delay_usec": 423,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 1368332,
+ "min_delay_usec": 41,
+ "drop_pct": 0,
+ "max_delay_usec": 2679,
+ "tx_pkts": 1368196,
+ "avg_delay_usec": 398,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 1164662912.0,
+ "theoretical_tx_rate_pps": 11748120.30075188
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 4.6875,
+ "duration_sec": 10.0,
+ "l2frame_size": "512",
+ "rate_pps": 275346,
+ "rate_bps": 1171875000.0,
+ "time_taken_sec": 137.6094572544098
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 422261.6287427662,
+ "rx_pkts": 4008862,
+ "time_ms": 1646287255615,
+ "drop_pct": 107525288,
+ "total_tx_pps": 11153415,
+ "tx_pps": 11748120,
+ "tx_pkts": 111534150,
+ "drop_percentage": 96.40570892412772
+ },
+ {
+ "rx_pps": 235563.01252603848,
+ "rx_pkts": 2345619,
+ "time_ms": 1646287268137,
+ "drop_pct": 56145341,
+ "total_tx_pps": 5849096,
+ "tx_pps": 5874060,
+ "tx_pkts": 58490960,
+ "drop_percentage": 95.98977517209497
+ },
+ {
+ "rx_pps": 214956.55098821394,
+ "rx_pkts": 2136346,
+ "time_ms": 1646287280641,
+ "drop_pct": 27053331,
+ "total_tx_pps": 2918967,
+ "tx_pps": 2937030,
+ "tx_pkts": 29189677,
+ "drop_percentage": 92.68115916459097
+ },
+ {
+ "rx_pps": 98852.65115506016,
+ "rx_pkts": 982546,
+ "time_ms": 1646287293143,
+ "drop_pct": 13613750,
+ "total_tx_pps": 1459629,
+ "tx_pps": 1468514,
+ "tx_pkts": 14596296,
+ "drop_percentage": 93.26852511075413
+ },
+ {
+ "rx_pps": 374357.7867755638,
+ "rx_pkts": 3720931,
+ "time_ms": 1646287305644,
+ "drop_pct": 3577210,
+ "total_tx_pps": 729814,
+ "tx_pps": 734256,
+ "tx_pkts": 7298141,
+ "drop_percentage": 49.01535884275187
+ },
+ {
+ "rx_pps": 366719.5290001208,
+ "rx_pkts": 3645011,
+ "time_ms": 1646287318156,
+ "drop_pct": 4060,
+ "total_tx_pps": 364907,
+ "tx_pps": 367128,
+ "tx_pkts": 3649071,
+ "drop_percentage": 0.11126119497263824
+ },
+ {
+ "rx_pps": 183564.0,
+ "rx_pkts": 1824537,
+ "time_ms": 1646287330655,
+ "drop_pct": 0,
+ "total_tx_pps": 182453,
+ "tx_pps": 183564,
+ "tx_pkts": 1824537,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 275346.0,
+ "rx_pkts": 2736528,
+ "time_ms": 1646287343177,
+ "drop_pct": 0,
+ "total_tx_pps": 273652,
+ "tx_pps": 275346,
+ "tx_pkts": 2736528,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 321054.59355599707,
+ "rx_pkts": 3190964,
+ "time_ms": 1646287355673,
+ "drop_pct": 1803,
+ "total_tx_pps": 319276,
+ "tx_pps": 321236,
+ "tx_pkts": 3192767,
+ "drop_percentage": 0.056471392995480096
+ },
+ {
+ "rx_pps": 298206.68394270656,
+ "rx_pkts": 2964029,
+ "time_ms": 1646287368173,
+ "drop_pct": 848,
+ "total_tx_pps": 296487,
+ "tx_pps": 298292,
+ "tx_pkts": 2964877,
+ "drop_percentage": 0.028601523773161584
+ },
+ {
+ "rx_pps": 286576.03641464544,
+ "rx_pkts": 2848426,
+ "time_ms": 1646287380673,
+ "drop_pct": 2405,
+ "total_tx_pps": 285083,
+ "tx_pps": 286818,
+ "tx_pkts": 2850831,
+ "ndr_pps": 137673,
+ "drop_percentage": 0.08436136691371744
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 10000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "32f6745439f040fa96de86e0a3ad0abf"
+ },
+ "synthesis": {
+ "avg_delay_usec": 410.4993787748563,
+ "total_tx_rate": 273652
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.intensive",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_768-fc_10k-rate_ndr-2.json",
+ "frame_sizes": [
+ "768"
+ ],
+ "rate": "ndr",
+ "flow_count": "10k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc6_intensive"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-03 06:12:50",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "7df3eeb5c69345d0a0f89371dec4d8c6",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "768"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 10000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_768-fc_10k-rate_ndr-2.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "768"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2504,
+ 2515
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc6_intensive",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.intensive",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_768-fc_10k-rate_ndr-2.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "768": {
+ "ndr": {
+ "load_percent_per_direction": 3.22265625,
+ "timestamp_sec": 1646288112.949391,
+ "stats": {
+ "total_tx_rate": 254057,
+ "overall": {
+ "rx_pkts": 2540579,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 6615,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 2540579,
+ "avg_delay_usec": 476.00064985186447,
+ "min_delay_usec": 33,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1270226,
+ "min_delay_usec": 33,
+ "drop_pct": 0,
+ "max_delay_usec": 6615,
+ "tx_pkts": 1270353,
+ "avg_delay_usec": 463,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 1270353,
+ "min_delay_usec": 36,
+ "drop_pct": 0,
+ "max_delay_usec": 4615,
+ "tx_pkts": 1270226,
+ "avg_delay_usec": 489,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 1601575328.0,
+ "theoretical_tx_rate_pps": 7931472.081218274
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 6.4453125,
+ "duration_sec": 10.0,
+ "l2frame_size": "768",
+ "rate_pps": 255604,
+ "rate_bps": 1611328124.0,
+ "time_taken_sec": 137.60951566696167
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 401443.3266594298,
+ "rx_pkts": 3873721,
+ "time_ms": 1646287987827,
+ "drop_pct": 72660892,
+ "total_tx_pps": 7653461,
+ "tx_pps": 7931472,
+ "tx_pkts": 76534613,
+ "drop_percentage": 94.9386024856492
+ },
+ {
+ "rx_pps": 270999.9900496978,
+ "rx_pkts": 2693334,
+ "time_ms": 1646288000350,
+ "drop_pct": 36720142,
+ "total_tx_pps": 3941347,
+ "tx_pps": 3965736,
+ "tx_pkts": 39413476,
+ "drop_percentage": 93.16646418093141
+ },
+ {
+ "rx_pps": 198550.00234079146,
+ "rx_pkts": 1973488,
+ "time_ms": 1646288012848,
+ "drop_pct": 17735231,
+ "total_tx_pps": 1970871,
+ "tx_pps": 1982868,
+ "tx_pkts": 19708719,
+ "drop_percentage": 89.98672617941328
+ },
+ {
+ "rx_pps": 199910.28390347675,
+ "rx_pkts": 1986809,
+ "time_ms": 1646288025358,
+ "drop_pct": 7866561,
+ "total_tx_pps": 985337,
+ "tx_pps": 991434,
+ "tx_pkts": 9853370,
+ "drop_percentage": 79.83624891788291
+ },
+ {
+ "rx_pps": 472617.2657889759,
+ "rx_pkts": 4697582,
+ "time_ms": 1646288037860,
+ "drop_pct": 229590,
+ "total_tx_pps": 492717,
+ "tx_pps": 495716,
+ "tx_pkts": 4927172,
+ "drop_percentage": 4.6596709024974166
+ },
+ {
+ "rx_pps": 247858.0,
+ "rx_pkts": 2463586,
+ "time_ms": 1646288050400,
+ "drop_pct": 0,
+ "total_tx_pps": 246358,
+ "tx_pps": 247858,
+ "tx_pkts": 2463586,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 369515.96694294043,
+ "rx_pkts": 3672805,
+ "time_ms": 1646288062900,
+ "drop_pct": 22563,
+ "total_tx_pps": 369536,
+ "tx_pps": 371786,
+ "tx_pkts": 3695368,
+ "drop_percentage": 0.6105751849342204
+ },
+ {
+ "rx_pps": 309577.99963821407,
+ "rx_pkts": 3076744,
+ "time_ms": 1646288075398,
+ "drop_pct": 2425,
+ "total_tx_pps": 307916,
+ "tx_pps": 309822,
+ "tx_pkts": 3079169,
+ "drop_percentage": 0.07875501474586162
+ },
+ {
+ "rx_pps": 278814.24160118186,
+ "rx_pkts": 2770997,
+ "time_ms": 1646288087918,
+ "drop_pct": 256,
+ "total_tx_pps": 277125,
+ "tx_pps": 278840,
+ "tx_pkts": 2771253,
+ "drop_percentage": 0.009237698615030819
+ },
+ {
+ "rx_pps": 263259.7617543409,
+ "rx_pkts": 2616539,
+ "time_ms": 1646288100438,
+ "drop_pct": 877,
+ "total_tx_pps": 261741,
+ "tx_pps": 263348,
+ "tx_pkts": 2617416,
+ "drop_percentage": 0.03350632837882859
+ },
+ {
+ "rx_pps": 255604.0,
+ "rx_pkts": 2540579,
+ "time_ms": 1646288112948,
+ "drop_pct": 0,
+ "total_tx_pps": 254057,
+ "tx_pps": 255604,
+ "tx_pkts": 2540579,
+ "ndr_pps": 127802,
+ "drop_percentage": 0.0
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 10000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "7df3eeb5c69345d0a0f89371dec4d8c6"
+ },
+ "synthesis": {
+ "avg_delay_usec": 476.00064985186447,
+ "total_tx_rate": 254057
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.intensive",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1024-fc_10k-rate_ndr-2.json",
+ "frame_sizes": [
+ "1024"
+ ],
+ "rate": "ndr",
+ "flow_count": "10k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc6_intensive"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-03 06:20:09",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "cd0872af22cc4e368a8a824b8f85ff54",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "1024"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 10000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1024-fc_10k-rate_ndr-2.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "1024"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2504,
+ 2515
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc6_intensive",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.intensive",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1024-fc_10k-rate_ndr-2.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "1024": {
+ "ndr": {
+ "load_percent_per_direction": 4.4921875,
+ "timestamp_sec": 1646288552.3423898,
+ "stats": {
+ "total_tx_rate": 267301,
+ "overall": {
+ "rx_pkts": 2673012,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 8541,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 2673012,
+ "avg_delay_usec": 483.49946577119744,
+ "min_delay_usec": 33,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1336438,
+ "min_delay_usec": 38,
+ "drop_pct": 0,
+ "max_delay_usec": 8541,
+ "tx_pkts": 1336574,
+ "avg_delay_usec": 494,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 1336574,
+ "min_delay_usec": 33,
+ "drop_pct": 0,
+ "max_delay_usec": 7095,
+ "tx_pkts": 1336438,
+ "avg_delay_usec": 473,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 2232497952.0,
+ "theoretical_tx_rate_pps": 5986590.038314176
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 8.984375,
+ "duration_sec": 10.0,
+ "l2frame_size": "1024",
+ "rate_pps": 268928,
+ "rate_bps": 2246093750.0,
+ "time_taken_sec": 137.60198616981506
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 288161.597988842,
+ "rx_pkts": 2804152,
+ "time_ms": 1646288427250,
+ "drop_pct": 55452425,
+ "total_tx_pps": 5825657,
+ "tx_pps": 5986590,
+ "tx_pkts": 58256577,
+ "drop_percentage": 95.1865486363883
+ },
+ {
+ "rx_pps": 213298.5964799784,
+ "rx_pkts": 2119868,
+ "time_ms": 1646288439760,
+ "drop_pct": 27628983,
+ "total_tx_pps": 2974885,
+ "tx_pps": 2993294,
+ "tx_pkts": 29748851,
+ "drop_percentage": 92.8741180625766
+ },
+ {
+ "rx_pps": 131366.48872957594,
+ "rx_pkts": 1305586,
+ "time_ms": 1646288452271,
+ "drop_pct": 13568832,
+ "total_tx_pps": 1487441,
+ "tx_pps": 1496646,
+ "tx_pkts": 14874418,
+ "drop_percentage": 91.22260783581582
+ },
+ {
+ "rx_pps": 290509.78790066997,
+ "rx_pkts": 2887523,
+ "time_ms": 1646288464771,
+ "drop_pct": 4550426,
+ "total_tx_pps": 743794,
+ "tx_pps": 748322,
+ "tx_pkts": 7437949,
+ "drop_percentage": 61.17850498840473
+ },
+ {
+ "rx_pps": 373382.29544448643,
+ "rx_pkts": 3711236,
+ "time_ms": 1646288477284,
+ "drop_pct": 7730,
+ "total_tx_pps": 371896,
+ "tx_pps": 374160,
+ "tx_pkts": 3718966,
+ "drop_percentage": 0.20785347325036044
+ },
+ {
+ "rx_pps": 187080.0,
+ "rx_pkts": 1863037,
+ "time_ms": 1646288489810,
+ "drop_pct": 0,
+ "total_tx_pps": 186303,
+ "tx_pps": 187080,
+ "tx_pkts": 1863037,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 280389.9082326065,
+ "rx_pkts": 2786939,
+ "time_ms": 1646288502310,
+ "drop_pct": 2287,
+ "total_tx_pps": 278922,
+ "tx_pps": 280620,
+ "tx_pkts": 2789226,
+ "drop_percentage": 0.0819940729076812
+ },
+ {
+ "rx_pps": 233850.0,
+ "rx_pkts": 2324119,
+ "time_ms": 1646288514811,
+ "drop_pct": 0,
+ "total_tx_pps": 232411,
+ "tx_pps": 233850,
+ "tx_pkts": 2324119,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 257236.0,
+ "rx_pkts": 2556543,
+ "time_ms": 1646288527323,
+ "drop_pct": 0,
+ "total_tx_pps": 255654,
+ "tx_pps": 257236,
+ "tx_pkts": 2556543,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 268928.0,
+ "rx_pkts": 2673012,
+ "time_ms": 1646288539831,
+ "drop_pct": 0,
+ "total_tx_pps": 267301,
+ "tx_pps": 268928,
+ "tx_pkts": 2673012,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 274722.439659442,
+ "rx_pkts": 2733353,
+ "time_ms": 1646288552341,
+ "drop_pct": 513,
+ "total_tx_pps": 273386,
+ "tx_pps": 274774,
+ "tx_pkts": 2733866,
+ "ndr_pps": 134464,
+ "drop_percentage": 0.018764635867302933
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 10000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "cd0872af22cc4e368a8a824b8f85ff54"
+ },
+ "synthesis": {
+ "avg_delay_usec": 483.49946577119744,
+ "total_tx_rate": 267301
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.intensive",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1280-fc_10k-rate_ndr-2.json",
+ "frame_sizes": [
+ "1280"
+ ],
+ "rate": "ndr",
+ "flow_count": "10k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc6_intensive"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-03 06:25:02",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "8be1bcbbe7c94f8f94b64ab8ff667462",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "1280"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 10000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1280-fc_10k-rate_ndr-1.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "1280"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2504,
+ 2515
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc6_intensive",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.intensive",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1280-fc_10k-rate_ndr-1.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "1280": {
+ "ndr": {
+ "load_percent_per_direction": 6.25,
+ "timestamp_sec": 1646288845.323408,
+ "stats": {
+ "total_tx_rate": 298647,
+ "overall": {
+ "rx_pkts": 2986473,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 784,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 2986473,
+ "avg_delay_usec": 509.001702007686,
+ "min_delay_usec": 55,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1493087,
+ "min_delay_usec": 76,
+ "drop_pct": 0,
+ "max_delay_usec": 766,
+ "tx_pkts": 1493386,
+ "avg_delay_usec": 492,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 1493386,
+ "min_delay_usec": 55,
+ "drop_pct": 0,
+ "max_delay_usec": 784,
+ "tx_pkts": 1493087,
+ "avg_delay_usec": 526,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 3105928800.0,
+ "theoretical_tx_rate_pps": 4807692.307692308
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 12.5,
+ "duration_sec": 10.0,
+ "l2frame_size": "1280",
+ "rate_pps": 300480,
+ "rate_bps": 3125000000.0,
+ "time_taken_sec": 137.64375615119934
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 328796.88960086054,
+ "rx_pkts": 3216282,
+ "time_ms": 1646288720187,
+ "drop_pct": 43812427,
+ "total_tx_pps": 4702870,
+ "tx_pps": 4807692,
+ "tx_pkts": 47028709,
+ "drop_percentage": 93.16102425860765
+ },
+ {
+ "rx_pps": 137967.17788955485,
+ "rx_pkts": 1371187,
+ "time_ms": 1646288732685,
+ "drop_pct": 22519440,
+ "total_tx_pps": 2389062,
+ "tx_pps": 2403846,
+ "tx_pkts": 23890627,
+ "drop_percentage": 94.26056503247068
+ },
+ {
+ "rx_pps": 118105.52734564139,
+ "rx_pkts": 1173792,
+ "time_ms": 1646288745223,
+ "drop_pct": 10771512,
+ "total_tx_pps": 1194530,
+ "tx_pps": 1201922,
+ "tx_pkts": 11945304,
+ "drop_percentage": 90.17361132039838
+ },
+ {
+ "rx_pps": 421709.7198215352,
+ "rx_pkts": 4191374,
+ "time_ms": 1646288757729,
+ "drop_pct": 1781569,
+ "total_tx_pps": 597294,
+ "tx_pps": 600960,
+ "tx_pkts": 5972943,
+ "drop_percentage": 29.82732297964337
+ },
+ {
+ "rx_pps": 300480.0,
+ "rx_pkts": 2986473,
+ "time_ms": 1646288770264,
+ "drop_pct": 0,
+ "total_tx_pps": 298647,
+ "tx_pps": 300480,
+ "tx_pkts": 2986473,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 418310.83577366004,
+ "rx_pkts": 4157802,
+ "time_ms": 1646288782786,
+ "drop_pct": 322131,
+ "total_tx_pps": 447993,
+ "tx_pps": 450720,
+ "tx_pkts": 4479933,
+ "drop_percentage": 7.190531644111642
+ },
+ {
+ "rx_pps": 374651.06490817876,
+ "rx_pkts": 3723473,
+ "time_ms": 1646288795289,
+ "drop_pct": 9431,
+ "total_tx_pps": 373290,
+ "tx_pps": 375600,
+ "tx_pkts": 3732904,
+ "drop_percentage": 0.2526451256180175
+ },
+ {
+ "rx_pps": 337828.9123930734,
+ "rx_pkts": 3357682,
+ "time_ms": 1646288807790,
+ "drop_pct": 2098,
+ "total_tx_pps": 335978,
+ "tx_pps": 338040,
+ "tx_pkts": 3359780,
+ "drop_percentage": 0.062444564822696724
+ },
+ {
+ "rx_pps": 318795.6445763084,
+ "rx_pkts": 3168353,
+ "time_ms": 1646288820308,
+ "drop_pct": 4615,
+ "total_tx_pps": 317296,
+ "tx_pps": 319260,
+ "tx_pkts": 3172968,
+ "drop_percentage": 0.14544741705557698
+ },
+ {
+ "rx_pps": 309849.17401039106,
+ "rx_pkts": 3079747,
+ "time_ms": 1646288832818,
+ "drop_pct": 207,
+ "total_tx_pps": 307995,
+ "tx_pps": 309870,
+ "tx_pkts": 3079954,
+ "drop_percentage": 0.006720879597552431
+ },
+ {
+ "rx_pps": 305137.8923991017,
+ "rx_pkts": 3033835,
+ "time_ms": 1646288845322,
+ "drop_pct": 359,
+ "total_tx_pps": 303419,
+ "tx_pps": 305174,
+ "tx_pkts": 3034194,
+ "ndr_pps": 150240,
+ "drop_percentage": 0.011831807722248478
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 10000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "8be1bcbbe7c94f8f94b64ab8ff667462"
+ },
+ "synthesis": {
+ "avg_delay_usec": 509.001702007686,
+ "total_tx_rate": 298647
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.intensive",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1518-fc_10k-rate_ndr-2.json",
+ "frame_sizes": [
+ "1518"
+ ],
+ "rate": "ndr",
+ "flow_count": "10k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc6_intensive"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-03 06:29:56",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "4235eac7551b4b33aa00fd498105e51e",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "1518"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 10000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1518-fc_10k-rate_ndr-0.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "1518"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2504,
+ 2515
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc6_intensive",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.intensive",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1518-fc_10k-rate_ndr-0.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "1518": {
+ "ndr": {
+ "load_percent_per_direction": 6.640625,
+ "timestamp_sec": 1646289138.556028,
+ "stats": {
+ "total_tx_rate": 268223,
+ "overall": {
+ "rx_pkts": 2682236,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 6699,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 2682236,
+ "avg_delay_usec": 468.9993408484563,
+ "min_delay_usec": 54,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1341050,
+ "min_delay_usec": 57,
+ "drop_pct": 0,
+ "max_delay_usec": 6699,
+ "tx_pkts": 1341186,
+ "avg_delay_usec": 482,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 1341186,
+ "min_delay_usec": 54,
+ "drop_pct": 0,
+ "max_delay_usec": 2508,
+ "tx_pkts": 1341050,
+ "avg_delay_usec": 456,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 3300215792.0,
+ "theoretical_tx_rate_pps": 4063719.1157347206
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 13.28125,
+ "duration_sec": 10.0,
+ "l2frame_size": "1518",
+ "rate_pps": 269856,
+ "rate_bps": 3320312500.0,
+ "time_taken_sec": 137.53674697875977
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 280327.64801039256,
+ "rx_pkts": 2747650,
+ "time_ms": 1646289013507,
+ "drop_pct": 37083151,
+ "total_tx_pps": 3983080,
+ "tx_pps": 4063718,
+ "tx_pkts": 39830801,
+ "drop_percentage": 93.10169534376173
+ },
+ {
+ "rx_pps": 139771.86715044265,
+ "rx_pkts": 1389067,
+ "time_ms": 1646289026009,
+ "drop_pct": 18803744,
+ "total_tx_pps": 2019281,
+ "tx_pps": 2031858,
+ "tx_pkts": 20192811,
+ "drop_percentage": 93.12098251204353
+ },
+ {
+ "rx_pps": 207291.5107155712,
+ "rx_pkts": 2060167,
+ "time_ms": 1646289038511,
+ "drop_pct": 8036635,
+ "total_tx_pps": 1009680,
+ "tx_pps": 1015928,
+ "tx_pkts": 10096802,
+ "drop_percentage": 79.59584628875558
+ },
+ {
+ "rx_pps": 448511.248959259,
+ "rx_pkts": 4460221,
+ "time_ms": 1646289051022,
+ "drop_pct": 591228,
+ "total_tx_pps": 505144,
+ "tx_pps": 507964,
+ "tx_pkts": 5051449,
+ "drop_percentage": 11.704126875278757
+ },
+ {
+ "rx_pps": 253982.0,
+ "rx_pkts": 2524203,
+ "time_ms": 1646289063521,
+ "drop_pct": 0,
+ "total_tx_pps": 252420,
+ "tx_pps": 253982,
+ "tx_pkts": 2524203,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 380882.85178005294,
+ "rx_pkts": 3785406,
+ "time_ms": 1646289076021,
+ "drop_pct": 886,
+ "total_tx_pps": 378629,
+ "tx_pps": 380972,
+ "tx_pkts": 3786292,
+ "drop_percentage": 0.02340020262568233
+ },
+ {
+ "rx_pps": 313470.2547614981,
+ "rx_pkts": 3115426,
+ "time_ms": 1646289088528,
+ "drop_pct": 39831,
+ "total_tx_pps": 315525,
+ "tx_pps": 317478,
+ "tx_pkts": 3155257,
+ "drop_percentage": 1.262369436150526
+ },
+ {
+ "rx_pps": 285724.4659684076,
+ "rx_pkts": 2839674,
+ "time_ms": 1646289101027,
+ "drop_pct": 55,
+ "total_tx_pps": 283972,
+ "tx_pps": 285730,
+ "tx_pkts": 2839729,
+ "drop_percentage": 0.001936804533108617
+ },
+ {
+ "rx_pps": 269856.0,
+ "rx_pkts": 2682236,
+ "time_ms": 1646289113526,
+ "drop_pct": 0,
+ "total_tx_pps": 268223,
+ "tx_pps": 269856,
+ "tx_pkts": 2682236,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 277476.3853338296,
+ "rx_pkts": 2758810,
+ "time_ms": 1646289126038,
+ "drop_pct": 3138,
+ "total_tx_pps": 276194,
+ "tx_pps": 277792,
+ "tx_pkts": 2761948,
+ "drop_percentage": 0.11361546270965275
+ },
+ {
+ "rx_pps": 273634.23308427056,
+ "rx_pkts": 2719516,
+ "time_ms": 1646289138555,
+ "drop_pct": 1886,
+ "total_tx_pps": 272140,
+ "tx_pps": 273824,
+ "tx_pkts": 2721402,
+ "ndr_pps": 134928,
+ "drop_percentage": 0.06930251392480788
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 10000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "4235eac7551b4b33aa00fd498105e51e"
+ },
+ "synthesis": {
+ "avg_delay_usec": 468.9993408484563,
+ "total_tx_rate": 268223
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.intensive",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_IMIX-fc_10k-rate_ndr-2.json",
+ "frame_sizes": [
+ "IMIX"
+ ],
+ "rate": "ndr",
+ "flow_count": "10k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc6_intensive"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-03 06:37:15",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "a5aadad5b25f444399ba2b3406c29196",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "IMIX"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 10000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_IMIX-fc_10k-rate_ndr-0.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "IMIX"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2504,
+ 2515
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc6_intensive",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.intensive",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_IMIX-fc_10k-rate_ndr-0.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "IMIX": {
+ "ndr": {
+ "load_percent_per_direction": 1.7578125,
+ "timestamp_sec": 1646289577.9506223,
+ "stats": {
+ "total_tx_rate": 285983,
+ "overall": {
+ "rx_pkts": 2859836,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 2310,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 2859836,
+ "avg_delay_usec": 433.0000503525377,
+ "min_delay_usec": 38,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1429846,
+ "min_delay_usec": 44,
+ "drop_pct": 0,
+ "max_delay_usec": 1917,
+ "tx_pkts": 1429990,
+ "avg_delay_usec": 432,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 1429990,
+ "min_delay_usec": 38,
+ "drop_pct": 0,
+ "max_delay_usec": 2310,
+ "tx_pkts": 1429846,
+ "avg_delay_usec": 434,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 873582737.3333333,
+ "theoretical_tx_rate_pps": 16368398.079441292
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 3.515625,
+ "duration_sec": 10.0,
+ "l2frame_size": "IMIX",
+ "rate_pps": 287724,
+ "rate_bps": 878906250.0,
+ "time_taken_sec": 137.6145327091217
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 427548.78458777367,
+ "rx_pkts": 3713299,
+ "time_ms": 1646289452854,
+ "drop_pct": 138447685,
+ "total_tx_pps": 14216098,
+ "tx_pps": 16368398,
+ "tx_pkts": 142160984,
+ "warning": "WARNING: There is a significant difference between requested TX rate (16368398) and actual TX rate (14216098). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "drop_percentage": 97.38796194601467
+ },
+ {
+ "rx_pps": 409967.19737723225,
+ "rx_pkts": 4074459,
+ "time_ms": 1646289465351,
+ "drop_pct": 77264193,
+ "total_tx_pps": 8133865,
+ "tx_pps": 8184198,
+ "tx_pkts": 81338652,
+ "drop_percentage": 94.99074683460454
+ },
+ {
+ "rx_pps": 260283.02132755163,
+ "rx_pkts": 2586823,
+ "time_ms": 1646289477850,
+ "drop_pct": 38082496,
+ "total_tx_pps": 4066931,
+ "tx_pps": 4092098,
+ "tx_pkts": 40669319,
+ "drop_percentage": 93.63937468439046
+ },
+ {
+ "rx_pps": 169274.29595105443,
+ "rx_pkts": 1682333,
+ "time_ms": 1646289490349,
+ "drop_pct": 18652320,
+ "total_tx_pps": 2033465,
+ "tx_pps": 2046048,
+ "tx_pkts": 20334653,
+ "drop_percentage": 91.72676809385437
+ },
+ {
+ "rx_pps": 213995.76989708896,
+ "rx_pkts": 2126798,
+ "time_ms": 1646289502858,
+ "drop_pct": 8040531,
+ "total_tx_pps": 1016732,
+ "tx_pps": 1023024,
+ "tx_pkts": 10167329,
+ "drop_percentage": 79.0820381636121
+ },
+ {
+ "rx_pps": 485832.8535943681,
+ "rx_pkts": 4828938,
+ "time_ms": 1646289515358,
+ "drop_pct": 255238,
+ "total_tx_pps": 508417,
+ "tx_pps": 511512,
+ "tx_pkts": 5084176,
+ "drop_percentage": 5.020243201651556
+ },
+ {
+ "rx_pps": 255755.89938127328,
+ "rx_pkts": 2541832,
+ "time_ms": 1646289527874,
+ "drop_pct": 1,
+ "total_tx_pps": 254183,
+ "tx_pps": 255756,
+ "tx_pkts": 2541833,
+ "drop_percentage": 3.934168767184941e-05
+ },
+ {
+ "rx_pps": 383459.02405717666,
+ "rx_pkts": 3811011,
+ "time_ms": 1646289540375,
+ "drop_pct": 1739,
+ "total_tx_pps": 381275,
+ "tx_pps": 383634,
+ "tx_pkts": 3812750,
+ "drop_percentage": 0.045610123926299914
+ },
+ {
+ "rx_pps": 319404.44880279334,
+ "rx_pkts": 3174727,
+ "time_ms": 1646289552880,
+ "drop_pct": 2878,
+ "total_tx_pps": 317760,
+ "tx_pps": 319694,
+ "tx_pkts": 3177605,
+ "drop_percentage": 0.09057135798817034
+ },
+ {
+ "rx_pps": 287724.0,
+ "rx_pkts": 2859836,
+ "time_ms": 1646289565399,
+ "drop_pct": 0,
+ "total_tx_pps": 285983,
+ "tx_pps": 287724,
+ "tx_pkts": 2859836,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 303577.59912532725,
+ "rx_pkts": 3017413,
+ "time_ms": 1646289577949,
+ "drop_pct": 1316,
+ "total_tx_pps": 301872,
+ "tx_pps": 303710,
+ "tx_pkts": 3018729,
+ "ndr_pps": 143862,
+ "drop_percentage": 0.043594506164680566
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 10000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "a5aadad5b25f444399ba2b3406c29196"
+ },
+ "synthesis": {
+ "avg_delay_usec": 433.0000503525377,
+ "total_tx_rate": 285983
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.intensive",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_9000-fc_10k-rate_ndr-2.json",
+ "frame_sizes": [
+ "9000"
+ ],
+ "rate": "ndr",
+ "flow_count": "10k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc6_intensive"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-03 06:47:01",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "7a447e0402ad455cad8e943d344bd43d",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "9000"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 10000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_9000-fc_10k-rate_ndr-1.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "9000"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2504,
+ 2515
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc6_intensive",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.intensive",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_9000-fc_10k-rate_ndr-1.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "9000": {
+ "ndr": {
+ "load_percent_per_direction": 25.0,
+ "timestamp_sec": 1646290163.7212827,
+ "stats": {
+ "total_tx_rate": 172160,
+ "overall": {
+ "rx_pkts": 1721608,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 8987,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 1721608,
+ "avg_delay_usec": 803.0008178400658,
+ "min_delay_usec": 86,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 860760,
+ "min_delay_usec": 86,
+ "drop_pct": 0,
+ "max_delay_usec": 7359,
+ "tx_pkts": 860848,
+ "avg_delay_usec": 787,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 860848,
+ "min_delay_usec": 90,
+ "drop_pct": 0,
+ "max_delay_usec": 8987,
+ "tx_pkts": 860760,
+ "avg_delay_usec": 819,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 12423065600.0,
+ "theoretical_tx_rate_pps": 692904.6563192905
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 50.0,
+ "duration_sec": 10.0,
+ "l2frame_size": "9000",
+ "rate_pps": 173226,
+ "rate_bps": 12500000000.0,
+ "time_taken_sec": 137.66240000724792
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 88271.08377210896,
+ "rx_pkts": 877835,
+ "time_ms": 1646290038548,
+ "drop_pct": 6012931,
+ "total_tx_pps": 689076,
+ "tx_pps": 692904,
+ "tx_pkts": 6890766,
+ "drop_percentage": 87.26070512334913
+ },
+ {
+ "rx_pps": 161139.26939074945,
+ "rx_pkts": 1601483,
+ "time_ms": 1646290051049,
+ "drop_pct": 1841731,
+ "total_tx_pps": 344321,
+ "tx_pps": 346452,
+ "tx_pkts": 3443214,
+ "drop_percentage": 53.48871722756704
+ },
+ {
+ "rx_pps": 173226.0,
+ "rx_pkts": 1721608,
+ "time_ms": 1646290063550,
+ "drop_pct": 0,
+ "total_tx_pps": 172160,
+ "tx_pps": 173226,
+ "tx_pkts": 1721608,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 211452.66814074648,
+ "rx_pkts": 2101524,
+ "time_ms": 1646290076054,
+ "drop_pct": 480878,
+ "total_tx_pps": 258240,
+ "tx_pps": 259838,
+ "tx_pkts": 2582402,
+ "drop_percentage": 18.62134555348083
+ },
+ {
+ "rx_pps": 212334.58730374108,
+ "rx_pkts": 2110288,
+ "time_ms": 1646290088562,
+ "drop_pct": 41716,
+ "total_tx_pps": 215200,
+ "tx_pps": 216532,
+ "tx_pkts": 2152004,
+ "drop_percentage": 1.9384722333229865
+ },
+ {
+ "rx_pps": 192487.71171054075,
+ "rx_pkts": 1915062,
+ "time_ms": 1646290101091,
+ "drop_pct": 23781,
+ "total_tx_pps": 193884,
+ "tx_pps": 194878,
+ "tx_pkts": 1938843,
+ "drop_percentage": 1.2265562502997922
+ },
+ {
+ "rx_pps": 183024.18234314685,
+ "rx_pkts": 1819170,
+ "time_ms": 1646290113598,
+ "drop_pct": 10216,
+ "total_tx_pps": 182938,
+ "tx_pps": 184052,
+ "tx_pkts": 1829386,
+ "drop_percentage": 0.5584387329956608
+ },
+ {
+ "rx_pps": 176570.2910542118,
+ "rx_pkts": 1755021,
+ "time_ms": 1646290126107,
+ "drop_pct": 20552,
+ "total_tx_pps": 177557,
+ "tx_pps": 178638,
+ "tx_pkts": 1775573,
+ "drop_percentage": 1.1574854990473498
+ },
+ {
+ "rx_pps": 175689.4205205337,
+ "rx_pkts": 1746179,
+ "time_ms": 1646290138633,
+ "drop_pct": 2411,
+ "total_tx_pps": 174859,
+ "tx_pps": 175932,
+ "tx_pkts": 1748590,
+ "drop_percentage": 0.13788252248954871
+ },
+ {
+ "rx_pps": 174555.66489782277,
+ "rx_pkts": 1734998,
+ "time_ms": 1646290151222,
+ "drop_pct": 222,
+ "total_tx_pps": 173522,
+ "tx_pps": 174578,
+ "tx_pkts": 1735220,
+ "drop_percentage": 0.012793766784615208
+ },
+ {
+ "rx_pps": 173460.8309452305,
+ "rx_pkts": 1724114,
+ "time_ms": 1646290163720,
+ "drop_pct": 4385,
+ "total_tx_pps": 172849,
+ "tx_pps": 173902,
+ "tx_pkts": 1728499,
+ "ndr_pps": 86613,
+ "drop_percentage": 0.2536883157005008
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 10000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "7a447e0402ad455cad8e943d344bd43d"
+ },
+ "synthesis": {
+ "avg_delay_usec": 803.0008178400658,
+ "total_tx_rate": 172160
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.intensive",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_64-fc_100k-rate_ndr-2.json",
+ "frame_sizes": [
+ "64"
+ ],
+ "rate": "ndr",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc6_intensive"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-03 06:54:21",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "c1e2fef7bb47473781a088db8235dca5",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "64"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_64-fc_100k-rate_ndr-1.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "64"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2504,
+ 2515
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc6_intensive",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.intensive",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_64-fc_100k-rate_ndr-1.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "64": {
+ "ndr": {
+ "load_percent_per_direction": 0.390625,
+ "timestamp_sec": 1646290604.5060358,
+ "stats": {
+ "total_tx_rate": 288854,
+ "overall": {
+ "rx_pkts": 2888548,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 5341,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 2888548,
+ "avg_delay_usec": 455.49962091680663,
+ "min_delay_usec": 47,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1444201,
+ "min_delay_usec": 47,
+ "drop_pct": 0,
+ "max_delay_usec": 5341,
+ "tx_pkts": 1444347,
+ "avg_delay_usec": 463,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 1444347,
+ "min_delay_usec": 59,
+ "drop_pct": 0,
+ "max_delay_usec": 5267,
+ "tx_pkts": 1444201,
+ "avg_delay_usec": 448,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 194109888.0,
+ "theoretical_tx_rate_pps": 74404761.90476191
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 0.78125,
+ "duration_sec": 10.0,
+ "l2frame_size": "64",
+ "rate_pps": 290642,
+ "rate_bps": 195312500.0,
+ "time_taken_sec": 137.62960720062256
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 1053954.263475746,
+ "rx_pkts": 3807089,
+ "time_ms": 1646290479366,
+ "drop_pct": 264957461,
+ "total_tx_pps": 26876455,
+ "tx_pps": 74404760,
+ "tx_pkts": 268764550,
+ "warning": "WARNING: There is a significant difference between requested TX rate (74404760) and actual TX rate (26876455). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "drop_percentage": 98.58348543362582
+ },
+ {
+ "rx_pps": 406661.06757053314,
+ "rx_pkts": 2956606,
+ "time_ms": 1646290491895,
+ "drop_pct": 267521167,
+ "total_tx_pps": 27047777,
+ "tx_pps": 37202380,
+ "tx_pkts": 270477773,
+ "warning": "WARNING: There is a significant difference between requested TX rate (37202380) and actual TX rate (27047777). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "drop_percentage": 98.90689502238692
+ },
+ {
+ "rx_pps": 148664.22620742844,
+ "rx_pkts": 1477497,
+ "time_ms": 1646290504402,
+ "drop_pct": 183390128,
+ "total_tx_pps": 18486762,
+ "tx_pps": 18601190,
+ "tx_pkts": 184867625,
+ "drop_percentage": 99.20078109944886
+ },
+ {
+ "rx_pps": 118020.08758137107,
+ "rx_pkts": 1172942,
+ "time_ms": 1646290516918,
+ "drop_pct": 91260961,
+ "total_tx_pps": 9243390,
+ "tx_pps": 9300594,
+ "tx_pkts": 92433903,
+ "drop_percentage": 98.73104784940219
+ },
+ {
+ "rx_pps": 400017.6984889188,
+ "rx_pkts": 3975576,
+ "time_ms": 1646290529444,
+ "drop_pct": 42241392,
+ "total_tx_pps": 4621696,
+ "tx_pps": 4650296,
+ "tx_pkts": 46216968,
+ "drop_percentage": 91.39801641682769
+ },
+ {
+ "rx_pps": 118631.30644199387,
+ "rx_pkts": 1181390,
+ "time_ms": 1646290541984,
+ "drop_pct": 21973599,
+ "total_tx_pps": 2315498,
+ "tx_pps": 2325148,
+ "tx_pkts": 23154989,
+ "drop_percentage": 94.89790299619663
+ },
+ {
+ "rx_pps": 213393.54643034592,
+ "rx_pkts": 2120812,
+ "time_ms": 1646290554504,
+ "drop_pct": 9433431,
+ "total_tx_pps": 1155424,
+ "tx_pps": 1162574,
+ "tx_pkts": 11554243,
+ "drop_percentage": 81.64473431967807
+ },
+ {
+ "rx_pps": 570597.5399708707,
+ "rx_pkts": 5671457,
+ "time_ms": 1646290567004,
+ "drop_pct": 106238,
+ "total_tx_pps": 577769,
+ "tx_pps": 581286,
+ "tx_pkts": 5777695,
+ "drop_percentage": 1.8387609591714342
+ },
+ {
+ "rx_pps": 290642.0,
+ "rx_pkts": 2888548,
+ "time_ms": 1646290579503,
+ "drop_pct": 0,
+ "total_tx_pps": 288854,
+ "tx_pps": 290642,
+ "tx_pkts": 2888548,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 434891.10995581164,
+ "rx_pkts": 4322604,
+ "time_ms": 1646290592004,
+ "drop_pct": 10664,
+ "total_tx_pps": 433326,
+ "tx_pps": 435964,
+ "tx_pkts": 4333268,
+ "drop_percentage": 0.24609601806304157
+ },
+ {
+ "rx_pps": 362705.9824699818,
+ "rx_pkts": 3605119,
+ "time_ms": 1646290604505,
+ "drop_pct": 5944,
+ "total_tx_pps": 361106,
+ "tx_pps": 363304,
+ "tx_pkts": 3611063,
+ "ndr_pps": 145321,
+ "drop_percentage": 0.1646052699717507
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "c1e2fef7bb47473781a088db8235dca5"
+ },
+ "synthesis": {
+ "avg_delay_usec": 455.49962091680663,
+ "total_tx_rate": 288854
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.intensive",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_128-fc_100k-rate_ndr-2.json",
+ "frame_sizes": [
+ "128"
+ ],
+ "rate": "ndr",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc6_intensive"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-03 06:59:13",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "1b62171069bc40c7914f84ffbb050f31",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "128"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_128-fc_100k-rate_ndr-0.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "128"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2504,
+ 2515
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc6_intensive",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.intensive",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_128-fc_100k-rate_ndr-0.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "128": {
+ "ndr": {
+ "load_percent_per_direction": 0.68359375,
+ "timestamp_sec": 1646290896.3823671,
+ "stats": {
+ "total_tx_rate": 286902,
+ "overall": {
+ "rx_pkts": 2869029,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 2743,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 2869029,
+ "avg_delay_usec": 464.9996511014702,
+ "min_delay_usec": 58,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1434443,
+ "min_delay_usec": 62,
+ "drop_pct": 0,
+ "max_delay_usec": 2743,
+ "tx_pkts": 1434586,
+ "avg_delay_usec": 472,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 1434586,
+ "min_delay_usec": 58,
+ "drop_pct": 0,
+ "max_delay_usec": 1909,
+ "tx_pkts": 1434443,
+ "avg_delay_usec": 458,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 339691968.0,
+ "theoretical_tx_rate_pps": 42229729.72972973
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 1.3671875,
+ "duration_sec": 10.0,
+ "l2frame_size": "128",
+ "rate_pps": 288678,
+ "rate_bps": 341796874.0,
+ "time_taken_sec": 137.53828620910645
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 654315.3293594539,
+ "rx_pkts": 4006536,
+ "time_ms": 1646290771352,
+ "drop_pct": 254576624,
+ "total_tx_pps": 25858316,
+ "tx_pps": 42229728,
+ "tx_pkts": 258583160,
+ "warning": "WARNING: There is a significant difference between requested TX rate (42229728) and actual TX rate (25858316). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "drop_percentage": 98.45058123661262
+ },
+ {
+ "rx_pps": 362626.5714189805,
+ "rx_pkts": 3603602,
+ "time_ms": 1646290783851,
+ "drop_pct": 206225385,
+ "total_tx_pps": 20982898,
+ "tx_pps": 21114864,
+ "tx_pkts": 209828987,
+ "drop_percentage": 98.28260048741502
+ },
+ {
+ "rx_pps": 399253.9049378252,
+ "rx_pkts": 3967988,
+ "time_ms": 1646290796350,
+ "drop_pct": 100957131,
+ "total_tx_pps": 10492511,
+ "tx_pps": 10557432,
+ "tx_pkts": 104925119,
+ "drop_percentage": 96.21826685752913
+ },
+ {
+ "rx_pps": 328008.7854675711,
+ "rx_pkts": 3259916,
+ "time_ms": 1646290808847,
+ "drop_pct": 49202614,
+ "total_tx_pps": 5246253,
+ "tx_pps": 5278716,
+ "tx_pkts": 52462530,
+ "drop_percentage": 93.78620131358514
+ },
+ {
+ "rx_pps": 431037.2563654665,
+ "rx_pkts": 4283865,
+ "time_ms": 1646290821368,
+ "drop_pct": 21947402,
+ "total_tx_pps": 2623126,
+ "tx_pps": 2639358,
+ "tx_pkts": 26231267,
+ "drop_percentage": 83.6688597619017
+ },
+ {
+ "rx_pps": 132040.09847098283,
+ "rx_pkts": 1312941,
+ "time_ms": 1646290833872,
+ "drop_pct": 11809280,
+ "total_tx_pps": 1312222,
+ "tx_pps": 1319678,
+ "tx_pkts": 13122221,
+ "drop_percentage": 89.99452150668702
+ },
+ {
+ "rx_pps": 466334.61032833933,
+ "rx_pkts": 4635133,
+ "time_ms": 1646290846377,
+ "drop_pct": 1923327,
+ "total_tx_pps": 655846,
+ "tx_pps": 659838,
+ "tx_pkts": 6558460,
+ "drop_percentage": 29.325893578675483
+ },
+ {
+ "rx_pps": 329647.56411198626,
+ "rx_pkts": 3276535,
+ "time_ms": 1646290858875,
+ "drop_pct": 2688,
+ "total_tx_pps": 327922,
+ "tx_pps": 329918,
+ "tx_pkts": 3279223,
+ "drop_percentage": 0.08197063755651872
+ },
+ {
+ "rx_pps": 164958.0,
+ "rx_pkts": 1639603,
+ "time_ms": 1646290871373,
+ "drop_pct": 0,
+ "total_tx_pps": 163960,
+ "tx_pps": 164958,
+ "tx_pkts": 1639603,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 247438.0,
+ "rx_pkts": 2459165,
+ "time_ms": 1646290883873,
+ "drop_pct": 0,
+ "total_tx_pps": 245916,
+ "tx_pps": 247438,
+ "tx_pkts": 2459165,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 288678.0,
+ "rx_pkts": 2869029,
+ "time_ms": 1646290896381,
+ "drop_pct": 0,
+ "total_tx_pps": 286902,
+ "tx_pps": 288678,
+ "tx_pkts": 2869029,
+ "ndr_pps": 144339,
+ "drop_percentage": 0.0
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "1b62171069bc40c7914f84ffbb050f31"
+ },
+ "synthesis": {
+ "avg_delay_usec": 464.9996511014702,
+ "total_tx_rate": 286902
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.intensive",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_256-fc_100k-rate_ndr-2.json",
+ "frame_sizes": [
+ "256"
+ ],
+ "rate": "ndr",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc6_intensive"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-03 07:11:26",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "d4e52542fffb464dab4ee0f0bbe41424",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "256"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_256-fc_100k-rate_ndr-2.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "256"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2504,
+ 2515
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc6_intensive",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.intensive",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_256-fc_100k-rate_ndr-2.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "256": {
+ "ndr": {
+ "load_percent_per_direction": 1.3671875,
+ "timestamp_sec": 1646291629.1270602,
+ "stats": {
+ "total_tx_rate": 307725,
+ "overall": {
+ "rx_pkts": 3077236,
+ "drop_percentage": 0.0005199444179417221,
+ "drop_pct": 16,
+ "max_delay_usec": 4557,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 3077252,
+ "avg_delay_usec": 448.49974847558,
+ "min_delay_usec": 39,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1538532,
+ "min_delay_usec": 41,
+ "drop_pct": 16,
+ "max_delay_usec": 4557,
+ "tx_pkts": 1538704,
+ "avg_delay_usec": 453,
+ "drop_percentage": 0.0010398361218272
+ },
+ "0": {
+ "rx_pkts": 1538704,
+ "min_delay_usec": 39,
+ "drop_pct": 0,
+ "max_delay_usec": 4475,
+ "tx_pkts": 1538548,
+ "avg_delay_usec": 444,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 679456800.0,
+ "theoretical_tx_rate_pps": 22644927.536231883
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 2.734375,
+ "duration_sec": 10.0,
+ "l2frame_size": "256",
+ "rate_pps": 309598,
+ "rate_bps": 683593750.0,
+ "time_taken_sec": 137.6123342514038
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 454315.7916803991,
+ "rx_pkts": 4114594,
+ "time_ms": 1646291504021,
+ "drop_pct": 200973317,
+ "total_tx_pps": 20508791,
+ "tx_pps": 22644926,
+ "tx_pkts": 205087911,
+ "drop_percentage": 97.99374132783477
+ },
+ {
+ "rx_pps": 341741.1574105596,
+ "rx_pkts": 3396225,
+ "time_ms": 1646291516524,
+ "drop_pct": 109126448,
+ "total_tx_pps": 11252267,
+ "tx_pps": 11322462,
+ "tx_pkts": 112522673,
+ "drop_percentage": 96.98174162641871
+ },
+ {
+ "rx_pps": 161288.4881766711,
+ "rx_pkts": 1602966,
+ "time_ms": 1646291529028,
+ "drop_pct": 54661181,
+ "total_tx_pps": 5626414,
+ "tx_pps": 5661230,
+ "tx_pkts": 56264147,
+ "drop_percentage": 97.15099919669981
+ },
+ {
+ "rx_pps": 115955.83218252,
+ "rx_pkts": 1152543,
+ "time_ms": 1646291541545,
+ "drop_pct": 26982345,
+ "total_tx_pps": 2813488,
+ "tx_pps": 2830614,
+ "tx_pkts": 28134888,
+ "drop_percentage": 95.90350955013577
+ },
+ {
+ "rx_pps": 161080.9212724765,
+ "rx_pkts": 1600903,
+ "time_ms": 1646291554048,
+ "drop_pct": 12465118,
+ "total_tx_pps": 1406602,
+ "tx_pps": 1415306,
+ "tx_pkts": 14066021,
+ "drop_percentage": 88.61865057644944
+ },
+ {
+ "rx_pps": 427270.71843328327,
+ "rx_pkts": 4246431,
+ "time_ms": 1646291566567,
+ "drop_pct": 2786570,
+ "total_tx_pps": 703300,
+ "tx_pps": 707652,
+ "tx_pkts": 7033001,
+ "drop_percentage": 39.62135082875717
+ },
+ {
+ "rx_pps": 353642.3849503518,
+ "rx_pkts": 3524578,
+ "time_ms": 1646291579093,
+ "drop_pct": 1830,
+ "total_tx_pps": 352640,
+ "tx_pps": 353826,
+ "tx_pkts": 3526408,
+ "drop_percentage": 0.051894165394361626
+ },
+ {
+ "rx_pps": 176912.0,
+ "rx_pkts": 1758331,
+ "time_ms": 1646291591612,
+ "drop_pct": 0,
+ "total_tx_pps": 175833,
+ "tx_pps": 176912,
+ "tx_pkts": 1758331,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 265370.0,
+ "rx_pkts": 2637515,
+ "time_ms": 1646291604122,
+ "drop_pct": 0,
+ "total_tx_pps": 263751,
+ "tx_pps": 265370,
+ "tx_pkts": 2637515,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 309596.39026248094,
+ "rx_pkts": 3077236,
+ "time_ms": 1646291616626,
+ "drop_pct": 16,
+ "total_tx_pps": 307725,
+ "tx_pps": 309598,
+ "tx_pkts": 3077252,
+ "drop_percentage": 0.0005199444179417221
+ },
+ {
+ "rx_pps": 331593.3824199975,
+ "rx_pkts": 3295874,
+ "time_ms": 1646291629126,
+ "drop_pct": 1179,
+ "total_tx_pps": 329705,
+ "tx_pps": 331712,
+ "tx_pkts": 3297053,
+ "ndr_pps": 154799,
+ "drop_percentage": 0.035759206782541866
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "d4e52542fffb464dab4ee0f0bbe41424"
+ },
+ "synthesis": {
+ "avg_delay_usec": 448.49974847558,
+ "total_tx_rate": 307725
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.intensive",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_512-fc_100k-rate_ndr-2.json",
+ "frame_sizes": [
+ "512"
+ ],
+ "rate": "ndr",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc6_intensive"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-03 07:13:52",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "25dca33bff7e45b3aef3a47996f30aaa",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "512"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_512-fc_100k-rate_ndr-0.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "512"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2504,
+ 2515
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc6_intensive",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.intensive",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_512-fc_100k-rate_ndr-0.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "512": {
+ "ndr": {
+ "load_percent_per_direction": 2.1484375,
+ "timestamp_sec": 1646291775.9324973,
+ "stats": {
+ "total_tx_rate": 250873,
+ "overall": {
+ "rx_pkts": 2508732,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 4401,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 2508732,
+ "avg_delay_usec": 351.5005273580438,
+ "min_delay_usec": 37,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1254303,
+ "min_delay_usec": 39,
+ "drop_pct": 0,
+ "max_delay_usec": 3459,
+ "tx_pkts": 1254429,
+ "avg_delay_usec": 341,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 1254429,
+ "min_delay_usec": 37,
+ "drop_pct": 0,
+ "max_delay_usec": 4401,
+ "tx_pkts": 1254303,
+ "avg_delay_usec": 362,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 1067715488.0,
+ "theoretical_tx_rate_pps": 11748120.30075188
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 4.296875,
+ "duration_sec": 10.0,
+ "l2frame_size": "512",
+ "rate_pps": 252400,
+ "rate_bps": 1074218750.0,
+ "time_taken_sec": 137.65872263908386
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 396012.6918251163,
+ "rx_pkts": 3753919,
+ "time_ms": 1646291650778,
+ "drop_pct": 107609913,
+ "total_tx_pps": 11136383,
+ "tx_pps": 11748120,
+ "tx_pkts": 111363832,
+ "drop_percentage": 96.62913988089059
+ },
+ {
+ "rx_pps": 366842.0367461427,
+ "rx_pkts": 3645860,
+ "time_ms": 1646291663279,
+ "drop_pct": 54733492,
+ "total_tx_pps": 5837935,
+ "tx_pps": 5874060,
+ "tx_pkts": 58379352,
+ "drop_percentage": 93.75488100655862
+ },
+ {
+ "rx_pps": 145725.16553904826,
+ "rx_pkts": 1448144,
+ "time_ms": 1646291675798,
+ "drop_pct": 27738595,
+ "total_tx_pps": 2918673,
+ "tx_pps": 2937030,
+ "tx_pkts": 29186739,
+ "drop_percentage": 95.03834943670823
+ },
+ {
+ "rx_pps": 117366.44222363783,
+ "rx_pkts": 1166564,
+ "time_ms": 1646291688313,
+ "drop_pct": 13429734,
+ "total_tx_pps": 1459629,
+ "tx_pps": 1468514,
+ "tx_pkts": 14596298,
+ "drop_percentage": 92.00780910337676
+ },
+ {
+ "rx_pps": 388855.0412373564,
+ "rx_pkts": 3865026,
+ "time_ms": 1646291700839,
+ "drop_pct": 3433114,
+ "total_tx_pps": 729814,
+ "tx_pps": 734256,
+ "tx_pkts": 7298140,
+ "drop_percentage": 47.04094467905521
+ },
+ {
+ "rx_pps": 358806.9628110826,
+ "rx_pkts": 3566364,
+ "time_ms": 1646291713349,
+ "drop_pct": 82707,
+ "total_tx_pps": 364907,
+ "tx_pps": 367128,
+ "tx_pkts": 3649071,
+ "drop_percentage": 2.2665220819216727
+ },
+ {
+ "rx_pps": 183564.0,
+ "rx_pkts": 1824354,
+ "time_ms": 1646291725861,
+ "drop_pct": 0,
+ "total_tx_pps": 182435,
+ "tx_pps": 183564,
+ "tx_pkts": 1824354,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 275341.37200471794,
+ "rx_pkts": 2736758,
+ "time_ms": 1646291738359,
+ "drop_pct": 46,
+ "total_tx_pps": 273680,
+ "tx_pps": 275346,
+ "tx_pkts": 2736804,
+ "drop_percentage": 0.001680792632574346
+ },
+ {
+ "rx_pps": 229454.0,
+ "rx_pkts": 2280430,
+ "time_ms": 1646291750900,
+ "drop_pct": 0,
+ "total_tx_pps": 228043,
+ "tx_pps": 229454,
+ "tx_pkts": 2280430,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 252400.0,
+ "rx_pkts": 2508732,
+ "time_ms": 1646291763421,
+ "drop_pct": 0,
+ "total_tx_pps": 250873,
+ "tx_pps": 252400,
+ "tx_pkts": 2508732,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 263683.34931604785,
+ "rx_pkts": 2620750,
+ "time_ms": 1646291775931,
+ "drop_pct": 1875,
+ "total_tx_pps": 262262,
+ "tx_pps": 263872,
+ "tx_pkts": 2622625,
+ "ndr_pps": 126200,
+ "drop_percentage": 0.07149325580286926
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "25dca33bff7e45b3aef3a47996f30aaa"
+ },
+ "synthesis": {
+ "avg_delay_usec": 351.5005273580438,
+ "total_tx_rate": 250873
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.intensive",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_768-fc_100k-rate_ndr-2.json",
+ "frame_sizes": [
+ "768"
+ ],
+ "rate": "ndr",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc6_intensive"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-03 07:26:05",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "99f490ebe6c2437a9632bddc2ea7163b",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "768"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_768-fc_100k-rate_ndr-2.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "768"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2504,
+ 2515
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc6_intensive",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.intensive",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_768-fc_100k-rate_ndr-2.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "768": {
+ "ndr": {
+ "load_percent_per_direction": 3.7109375,
+ "timestamp_sec": 1646292508.196054,
+ "stats": {
+ "total_tx_rate": 292520,
+ "overall": {
+ "rx_pkts": 2925176,
+ "drop_percentage": 0.000854642125447106,
+ "drop_pct": 25,
+ "max_delay_usec": 794,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 2925201,
+ "avg_delay_usec": 440.00094079809213,
+ "min_delay_usec": 38,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1462502,
+ "min_delay_usec": 38,
+ "drop_pct": 25,
+ "max_delay_usec": 698,
+ "tx_pkts": 1462674,
+ "avg_delay_usec": 424,
+ "drop_percentage": 0.0017091983586226321
+ },
+ "0": {
+ "rx_pkts": 1462674,
+ "min_delay_usec": 39,
+ "drop_pct": 0,
+ "max_delay_usec": 794,
+ "tx_pkts": 1462527,
+ "avg_delay_usec": 456,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 1844046080.0,
+ "theoretical_tx_rate_pps": 7931472.081218274
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 7.421875,
+ "duration_sec": 10.0,
+ "l2frame_size": "768",
+ "rate_pps": 294330,
+ "rate_bps": 1855468750.0,
+ "time_taken_sec": 137.6208794116974
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 359474.4042878791,
+ "rx_pkts": 3462705,
+ "time_ms": 1646292383075,
+ "drop_pct": 72938695,
+ "total_tx_pps": 7640140,
+ "tx_pps": 7931472,
+ "tx_pkts": 76401400,
+ "drop_percentage": 95.46774666432815
+ },
+ {
+ "rx_pps": 221917.01896656543,
+ "rx_pkts": 2205522,
+ "time_ms": 1646292395578,
+ "drop_pct": 37207940,
+ "total_tx_pps": 3941346,
+ "tx_pps": 3965736,
+ "tx_pkts": 39413462,
+ "drop_percentage": 94.40414039243748
+ },
+ {
+ "rx_pps": 120218.84357194848,
+ "rx_pkts": 1194795,
+ "time_ms": 1646292408080,
+ "drop_pct": 18511939,
+ "total_tx_pps": 1970673,
+ "tx_pps": 1982868,
+ "tx_pkts": 19706734,
+ "drop_percentage": 93.93712321889564
+ },
+ {
+ "rx_pps": 237679.50037510015,
+ "rx_pkts": 2362178,
+ "time_ms": 1646292420599,
+ "drop_pct": 7491190,
+ "total_tx_pps": 985336,
+ "tx_pps": 991434,
+ "tx_pkts": 9853368,
+ "drop_percentage": 76.02669462867925
+ },
+ {
+ "rx_pps": 467656.5430226268,
+ "rx_pkts": 4647806,
+ "time_ms": 1646292433101,
+ "drop_pct": 278869,
+ "total_tx_pps": 492667,
+ "tx_pps": 495716,
+ "tx_pkts": 4926675,
+ "drop_percentage": 5.660389613684686
+ },
+ {
+ "rx_pps": 247858.0,
+ "rx_pkts": 2463587,
+ "time_ms": 1646292445616,
+ "drop_pct": 0,
+ "total_tx_pps": 246358,
+ "tx_pps": 247858,
+ "tx_pkts": 2463587,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 371611.02398405195,
+ "rx_pkts": 3693258,
+ "time_ms": 1646292458113,
+ "drop_pct": 1739,
+ "total_tx_pps": 369499,
+ "tx_pps": 371786,
+ "tx_pkts": 3694997,
+ "drop_percentage": 0.04706363767007118
+ },
+ {
+ "rx_pps": 309695.5350187483,
+ "rx_pkts": 3078222,
+ "time_ms": 1646292470645,
+ "drop_pct": 1257,
+ "total_tx_pps": 307947,
+ "tx_pps": 309822,
+ "tx_pkts": 3079479,
+ "drop_percentage": 0.04081859301524706
+ },
+ {
+ "rx_pps": 278840.0,
+ "rx_pkts": 2775715,
+ "time_ms": 1646292483196,
+ "drop_pct": 0,
+ "total_tx_pps": 277571,
+ "tx_pps": 278840,
+ "tx_pkts": 2775715,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 294327.48453183216,
+ "rx_pkts": 2925176,
+ "time_ms": 1646292495696,
+ "drop_pct": 25,
+ "total_tx_pps": 292520,
+ "tx_pps": 294330,
+ "tx_pkts": 2925201,
+ "drop_percentage": 0.000854642125447106
+ },
+ {
+ "rx_pps": 301774.3450893266,
+ "rx_pkts": 2999187,
+ "time_ms": 1646292508195,
+ "drop_pct": 2998,
+ "total_tx_pps": 300218,
+ "tx_pps": 302076,
+ "tx_pkts": 3002185,
+ "ndr_pps": 147165,
+ "drop_percentage": 0.09986060152855337
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "99f490ebe6c2437a9632bddc2ea7163b"
+ },
+ "synthesis": {
+ "avg_delay_usec": 440.00094079809213,
+ "total_tx_rate": 292520
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.intensive",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1024-fc_100k-rate_ndr-2.json",
+ "frame_sizes": [
+ "1024"
+ ],
+ "rate": "ndr",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc6_intensive"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-03 07:33:24",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "e7ae74dbcfeb4aaf8774388598c054af",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "1024"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1024-fc_100k-rate_ndr-2.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "1024"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2504,
+ 2515
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc6_intensive",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.intensive",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1024-fc_100k-rate_ndr-2.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "1024": {
+ "ndr": {
+ "load_percent_per_direction": 4.78515625,
+ "timestamp_sec": 1646292947.5717177,
+ "stats": {
+ "total_tx_rate": 284733,
+ "overall": {
+ "rx_pkts": 2847306,
+ "drop_percentage": 0.0009131355247649378,
+ "drop_pct": 26,
+ "max_delay_usec": 4486,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 2847332,
+ "avg_delay_usec": 460.00053735004246,
+ "min_delay_usec": 38,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1423568,
+ "min_delay_usec": 38,
+ "drop_pct": 26,
+ "max_delay_usec": 829,
+ "tx_pkts": 1423738,
+ "avg_delay_usec": 451,
+ "drop_percentage": 0.0018261786929898618
+ },
+ "0": {
+ "rx_pkts": 1423738,
+ "min_delay_usec": 38,
+ "drop_pct": 0,
+ "max_delay_usec": 4486,
+ "tx_pkts": 1423594,
+ "avg_delay_usec": 469,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 2378090016.0,
+ "theoretical_tx_rate_pps": 5986590.038314176
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 9.5703125,
+ "duration_sec": 10.0,
+ "l2frame_size": "1024",
+ "rate_pps": 286466,
+ "rate_bps": 2392578124.0,
+ "time_taken_sec": 137.69065976142883
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 385174.3857818964,
+ "rx_pkts": 3744698,
+ "time_ms": 1646292822382,
+ "drop_pct": 54457437,
+ "total_tx_pps": 5820213,
+ "tx_pps": 5986590,
+ "tx_pkts": 58202135,
+ "drop_percentage": 93.5660470187219
+ },
+ {
+ "rx_pps": 371064.1070337179,
+ "rx_pkts": 3687635,
+ "time_ms": 1646292834881,
+ "drop_pct": 26059720,
+ "total_tx_pps": 2974735,
+ "tx_pps": 2993294,
+ "tx_pkts": 29747355,
+ "drop_percentage": 87.6034860914525
+ },
+ {
+ "rx_pps": 122785.19012242564,
+ "rx_pkts": 1220301,
+ "time_ms": 1646292847393,
+ "drop_pct": 13654120,
+ "total_tx_pps": 1487442,
+ "tx_pps": 1496646,
+ "tx_pkts": 14874421,
+ "drop_percentage": 91.7959764618737
+ },
+ {
+ "rx_pps": 352679.3934021328,
+ "rx_pkts": 3505458,
+ "time_ms": 1646292859908,
+ "drop_pct": 3932491,
+ "total_tx_pps": 743794,
+ "tx_pps": 748322,
+ "tx_pkts": 7437949,
+ "drop_percentage": 52.87063678441463
+ },
+ {
+ "rx_pps": 366733.73037974344,
+ "rx_pkts": 3649920,
+ "time_ms": 1646292872437,
+ "drop_pct": 73910,
+ "total_tx_pps": 372383,
+ "tx_pps": 374160,
+ "tx_pkts": 3723830,
+ "drop_percentage": 1.9847844826428704
+ },
+ {
+ "rx_pps": 187080.0,
+ "rx_pkts": 1859483,
+ "time_ms": 1646292884943,
+ "drop_pct": 0,
+ "total_tx_pps": 185948,
+ "tx_pps": 187080,
+ "tx_pkts": 1859483,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 280617.78649908,
+ "rx_pkts": 2789062,
+ "time_ms": 1646292897503,
+ "drop_pct": 22,
+ "total_tx_pps": 278908,
+ "tx_pps": 280620,
+ "tx_pkts": 2789084,
+ "drop_percentage": 0.0007887894376791807
+ },
+ {
+ "rx_pps": 327295.7202511058,
+ "rx_pkts": 3252831,
+ "time_ms": 1646292910003,
+ "drop_pct": 937,
+ "total_tx_pps": 325376,
+ "tx_pps": 327390,
+ "tx_pkts": 3253768,
+ "drop_percentage": 0.028797381989127683
+ },
+ {
+ "rx_pps": 303993.8263549052,
+ "rx_pkts": 3021548,
+ "time_ms": 1646292922504,
+ "drop_pct": 121,
+ "total_tx_pps": 302166,
+ "tx_pps": 304006,
+ "tx_pkts": 3021669,
+ "drop_percentage": 0.004004409483633052
+ },
+ {
+ "rx_pps": 291422.317994849,
+ "rx_pkts": 2896594,
+ "time_ms": 1646292935071,
+ "drop_pct": 8843,
+ "total_tx_pps": 290543,
+ "tx_pps": 292312,
+ "tx_pkts": 2905437,
+ "drop_percentage": 0.3043604111877146
+ },
+ {
+ "rx_pps": 286463.38417718763,
+ "rx_pkts": 2847306,
+ "time_ms": 1646292947570,
+ "drop_pct": 26,
+ "total_tx_pps": 284733,
+ "tx_pps": 286466,
+ "tx_pkts": 2847332,
+ "ndr_pps": 143233,
+ "drop_percentage": 0.0009131355247649378
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "e7ae74dbcfeb4aaf8774388598c054af"
+ },
+ "synthesis": {
+ "avg_delay_usec": 460.00053735004246,
+ "total_tx_rate": 284733
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.intensive",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1280-fc_100k-rate_ndr-2.json",
+ "frame_sizes": [
+ "1280"
+ ],
+ "rate": "ndr",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc6_intensive"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-03 07:40:43",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "3fddc9f03eab4c30982c44200d95ef6f",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "1280"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1280-fc_100k-rate_ndr-2.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "1280"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2504,
+ 2515
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc6_intensive",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.intensive",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1280-fc_100k-rate_ndr-2.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "1280": {
+ "ndr": {
+ "load_percent_per_direction": 4.98046875,
+ "timestamp_sec": 1646293386.7455893,
+ "stats": {
+ "total_tx_rate": 237983,
+ "overall": {
+ "rx_pkts": 2379828,
+ "drop_percentage": 0.0002941380389816941,
+ "drop_pct": 7,
+ "max_delay_usec": 9438,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 2379835,
+ "avg_delay_usec": 386.4999609215456,
+ "min_delay_usec": 33,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1189917,
+ "min_delay_usec": 33,
+ "drop_pct": 0,
+ "max_delay_usec": 9438,
+ "tx_pkts": 1189918,
+ "avg_delay_usec": 371,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 1189911,
+ "min_delay_usec": 38,
+ "drop_pct": 7,
+ "max_delay_usec": 3960,
+ "tx_pkts": 1189917,
+ "avg_delay_usec": 402,
+ "drop_percentage": 0.000588276325155452
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 2475023200.0,
+ "theoretical_tx_rate_pps": 4807692.307692308
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 9.9609375,
+ "duration_sec": 10.0,
+ "l2frame_size": "1280",
+ "rate_pps": 239444,
+ "rate_bps": 2490234374.0,
+ "time_taken_sec": 137.611346244812
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 358534.3786509994,
+ "rx_pkts": 3500830,
+ "time_ms": 1646293261625,
+ "drop_pct": 43442820,
+ "total_tx_pps": 4694365,
+ "tx_pps": 4807692,
+ "tx_pkts": 46943650,
+ "drop_percentage": 92.54248444677822
+ },
+ {
+ "rx_pps": 334304.0766214427,
+ "rx_pkts": 3322481,
+ "time_ms": 1646293274141,
+ "drop_pct": 20568142,
+ "total_tx_pps": 2389062,
+ "tx_pps": 2403846,
+ "tx_pkts": 23890623,
+ "drop_percentage": 86.09294952249675
+ },
+ {
+ "rx_pps": 116658.3609443631,
+ "rx_pkts": 1159526,
+ "time_ms": 1646293286673,
+ "drop_pct": 10786980,
+ "total_tx_pps": 1194650,
+ "tx_pps": 1201922,
+ "tx_pkts": 11946506,
+ "drop_percentage": 90.29401567286703
+ },
+ {
+ "rx_pps": 285569.6450320203,
+ "rx_pkts": 2838420,
+ "time_ms": 1646293299173,
+ "drop_pct": 3134823,
+ "total_tx_pps": 597324,
+ "tx_pps": 600960,
+ "tx_pkts": 5973243,
+ "drop_percentage": 52.48108941826074
+ },
+ {
+ "rx_pps": 300333.21198330424,
+ "rx_pkts": 2985163,
+ "time_ms": 1646293311671,
+ "drop_pct": 1459,
+ "total_tx_pps": 298662,
+ "tx_pps": 300480,
+ "tx_pkts": 2986622,
+ "drop_percentage": 0.04885117701537054
+ },
+ {
+ "rx_pps": 150240.0,
+ "rx_pkts": 1493236,
+ "time_ms": 1646293324172,
+ "drop_pct": 0,
+ "total_tx_pps": 149323,
+ "tx_pps": 150240,
+ "tx_pkts": 1493236,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 225358.89330561867,
+ "rx_pkts": 2239957,
+ "time_ms": 1646293336698,
+ "drop_pct": 11,
+ "total_tx_pps": 223996,
+ "tx_pps": 225360,
+ "tx_pkts": 2239968,
+ "drop_percentage": 0.0004910784439777711
+ },
+ {
+ "rx_pps": 262884.3287803163,
+ "rx_pkts": 2616225,
+ "time_ms": 1646293349210,
+ "drop_pct": 355,
+ "total_tx_pps": 261658,
+ "tx_pps": 262920,
+ "tx_pkts": 2616580,
+ "drop_percentage": 0.01356732834463307
+ },
+ {
+ "rx_pps": 244032.44942784897,
+ "rx_pkts": 2425563,
+ "time_ms": 1646293361717,
+ "drop_pct": 1069,
+ "total_tx_pps": 242663,
+ "tx_pps": 244140,
+ "tx_pkts": 2426632,
+ "drop_percentage": 0.04405282712829964
+ },
+ {
+ "rx_pps": 234750.0,
+ "rx_pkts": 2333417,
+ "time_ms": 1646293374219,
+ "drop_pct": 0,
+ "total_tx_pps": 233341,
+ "tx_pps": 234750,
+ "tx_pkts": 2333417,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 239443.29570411396,
+ "rx_pkts": 2379828,
+ "time_ms": 1646293386744,
+ "drop_pct": 7,
+ "total_tx_pps": 237983,
+ "tx_pps": 239444,
+ "tx_pkts": 2379835,
+ "ndr_pps": 119722,
+ "drop_percentage": 0.0002941380389816941
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "3fddc9f03eab4c30982c44200d95ef6f"
+ },
+ "synthesis": {
+ "avg_delay_usec": 386.4999609215456,
+ "total_tx_rate": 237983
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.intensive",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1518-fc_100k-rate_ndr-2.json",
+ "frame_sizes": [
+ "1518"
+ ],
+ "rate": "ndr",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc6_intensive"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-03 07:43:10",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "6b244dd30f8e44208781c5d3283e8419",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "1518"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1518-fc_100k-rate_ndr-0.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "1518"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2504,
+ 2515
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc6_intensive",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.intensive",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_1518-fc_100k-rate_ndr-0.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "1518": {
+ "ndr": {
+ "load_percent_per_direction": 6.4453125,
+ "timestamp_sec": 1646293533.4203305,
+ "stats": {
+ "total_tx_rate": 260333,
+ "overall": {
+ "rx_pkts": 2603335,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 7928,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 2603335,
+ "avg_delay_usec": 480.00050320070216,
+ "min_delay_usec": 36,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1301602,
+ "min_delay_usec": 36,
+ "drop_pct": 0,
+ "max_delay_usec": 4539,
+ "tx_pkts": 1301733,
+ "avg_delay_usec": 470,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 1301733,
+ "min_delay_usec": 36,
+ "drop_pct": 0,
+ "max_delay_usec": 7928,
+ "tx_pkts": 1301602,
+ "avg_delay_usec": 490,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 3203137232.0,
+ "theoretical_tx_rate_pps": 4063719.1157347206
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 12.890625,
+ "duration_sec": 10.0,
+ "l2frame_size": "1518",
+ "rate_pps": 261918,
+ "rate_bps": 3222656250.0,
+ "time_taken_sec": 137.72056579589844
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 325019.5206093959,
+ "rx_pkts": 3180144,
+ "time_ms": 1646293408209,
+ "drop_pct": 36581186,
+ "total_tx_pps": 3976133,
+ "tx_pps": 4063718,
+ "tx_pkts": 39761330,
+ "drop_percentage": 92.00191744089044
+ },
+ {
+ "rx_pps": 198729.36341220207,
+ "rx_pkts": 1975072,
+ "time_ms": 1646293420770,
+ "drop_pct": 18218551,
+ "total_tx_pps": 2019362,
+ "tx_pps": 2031858,
+ "tx_pkts": 20193623,
+ "drop_percentage": 90.21932815126834
+ },
+ {
+ "rx_pps": 157447.46203090227,
+ "rx_pkts": 1564792,
+ "time_ms": 1646293433286,
+ "drop_pct": 8532011,
+ "total_tx_pps": 1009680,
+ "tx_pps": 1015928,
+ "tx_pkts": 10096803,
+ "drop_percentage": 84.5021042799389
+ },
+ {
+ "rx_pps": 421490.29917415866,
+ "rx_pkts": 4189406,
+ "time_ms": 1646293445790,
+ "drop_pct": 859506,
+ "total_tx_pps": 504891,
+ "tx_pps": 507964,
+ "tx_pkts": 5048912,
+ "drop_percentage": 17.023588448362737
+ },
+ {
+ "rx_pps": 253980.49087030665,
+ "rx_pkts": 2524440,
+ "time_ms": 1646293458316,
+ "drop_pct": 15,
+ "total_tx_pps": 252445,
+ "tx_pps": 253982,
+ "tx_pkts": 2524455,
+ "drop_percentage": 0.0005941876563456271
+ },
+ {
+ "rx_pps": 378640.39427867,
+ "rx_pkts": 3763497,
+ "time_ms": 1646293470857,
+ "drop_pct": 23175,
+ "total_tx_pps": 378667,
+ "tx_pps": 380972,
+ "tx_pkts": 3786672,
+ "drop_percentage": 0.6120149830774886
+ },
+ {
+ "rx_pps": 316623.8329401139,
+ "rx_pkts": 3147085,
+ "time_ms": 1646293483376,
+ "drop_pct": 8490,
+ "total_tx_pps": 315557,
+ "tx_pps": 317478,
+ "tx_pkts": 3155575,
+ "drop_percentage": 0.26904763791068187
+ },
+ {
+ "rx_pps": 285718.32940377796,
+ "rx_pkts": 2839900,
+ "time_ms": 1646293495874,
+ "drop_pct": 116,
+ "total_tx_pps": 284001,
+ "tx_pps": 285730,
+ "tx_pkts": 2840016,
+ "drop_percentage": 0.004084484031075882
+ },
+ {
+ "rx_pps": 269556.6592924742,
+ "rx_pkts": 2678991,
+ "time_ms": 1646293508370,
+ "drop_pct": 2975,
+ "total_tx_pps": 268196,
+ "tx_pps": 269856,
+ "tx_pkts": 2681966,
+ "drop_percentage": 0.11092608929419687
+ },
+ {
+ "rx_pps": 261918.0,
+ "rx_pkts": 2603335,
+ "time_ms": 1646293520881,
+ "drop_pct": 0,
+ "total_tx_pps": 260333,
+ "tx_pps": 261918,
+ "tx_pkts": 2603335,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 265870.23458103574,
+ "rx_pkts": 2647670,
+ "time_ms": 1646293533419,
+ "drop_pct": 157,
+ "total_tx_pps": 264782,
+ "tx_pps": 265886,
+ "tx_pkts": 2647827,
+ "ndr_pps": 130959,
+ "drop_percentage": 0.005929390402016446
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "6b244dd30f8e44208781c5d3283e8419"
+ },
+ "synthesis": {
+ "avg_delay_usec": 480.00050320070216,
+ "total_tx_rate": 260333
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.intensive",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_IMIX-fc_100k-rate_ndr-2.json",
+ "frame_sizes": [
+ "IMIX"
+ ],
+ "rate": "ndr",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc6_intensive"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-03 07:52:56",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "62ffc44b9e274050bf0a7f2c90f3d093",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "IMIX"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_IMIX-fc_100k-rate_ndr-1.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "IMIX"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2504,
+ 2515
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc6_intensive",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.intensive",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_IMIX-fc_100k-rate_ndr-1.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "IMIX": {
+ "ndr": {
+ "load_percent_per_direction": 1.66015625,
+ "timestamp_sec": 1646294119.6733074,
+ "stats": {
+ "total_tx_rate": 270069,
+ "overall": {
+ "rx_pkts": 2700692,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 6573,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 2700692,
+ "avg_delay_usec": 496.00005109801486,
+ "min_delay_usec": 44,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1350277,
+ "min_delay_usec": 44,
+ "drop_pct": 0,
+ "max_delay_usec": 6573,
+ "tx_pkts": 1350415,
+ "avg_delay_usec": 495,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 1350415,
+ "min_delay_usec": 48,
+ "drop_pct": 0,
+ "max_delay_usec": 6316,
+ "tx_pkts": 1350277,
+ "avg_delay_usec": 497,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 824970772.0,
+ "theoretical_tx_rate_pps": 16368398.079441292
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 3.3203125,
+ "duration_sec": 10.0,
+ "l2frame_size": "IMIX",
+ "rate_pps": 271740,
+ "rate_bps": 830078124.0,
+ "time_taken_sec": 137.6471085548401
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 480448.74165268464,
+ "rx_pkts": 4165250,
+ "time_ms": 1646293994528,
+ "drop_pct": 137740564,
+ "total_tx_pps": 14190581,
+ "tx_pps": 16368398,
+ "tx_pkts": 141905814,
+ "warning": "WARNING: There is a significant difference between requested TX rate (16368398) and actual TX rate (14190581). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "drop_percentage": 97.06477847341759
+ },
+ {
+ "rx_pps": 416594.083252382,
+ "rx_pkts": 4140320,
+ "time_ms": 1646294007091,
+ "drop_pct": 77198326,
+ "total_tx_pps": 8133864,
+ "tx_pps": 8184198,
+ "tx_pkts": 81338646,
+ "drop_percentage": 94.90977511477139
+ },
+ {
+ "rx_pps": 415810.74435162114,
+ "rx_pkts": 4132536,
+ "time_ms": 1646294019594,
+ "drop_pct": 36536789,
+ "total_tx_pps": 4066932,
+ "tx_pps": 4092098,
+ "tx_pkts": 40669325,
+ "drop_percentage": 89.83869046265214
+ },
+ {
+ "rx_pps": 227881.88764751662,
+ "rx_pkts": 2269362,
+ "time_ms": 1646294032114,
+ "drop_pct": 18106209,
+ "total_tx_pps": 2037557,
+ "tx_pps": 2046048,
+ "tx_pkts": 20375571,
+ "drop_percentage": 88.86233912168646
+ },
+ {
+ "rx_pps": 184754.45000274904,
+ "rx_pkts": 1836183,
+ "time_ms": 1646294044616,
+ "drop_pct": 8331146,
+ "total_tx_pps": 1016732,
+ "tx_pps": 1023024,
+ "tx_pkts": 10167329,
+ "drop_percentage": 81.9403601476848
+ },
+ {
+ "rx_pps": 434731.4595380578,
+ "rx_pkts": 4320582,
+ "time_ms": 1646294057121,
+ "drop_pct": 763084,
+ "total_tx_pps": 508366,
+ "tx_pps": 511512,
+ "tx_pkts": 5083666,
+ "drop_percentage": 15.010506197692767
+ },
+ {
+ "rx_pps": 255756.0,
+ "rx_pkts": 2541835,
+ "time_ms": 1646294069630,
+ "drop_pct": 0,
+ "total_tx_pps": 254183,
+ "tx_pps": 255756,
+ "tx_pkts": 2541835,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 381383.3612061213,
+ "rx_pkts": 3790383,
+ "time_ms": 1646294082142,
+ "drop_pct": 22368,
+ "total_tx_pps": 381275,
+ "tx_pps": 383634,
+ "tx_pkts": 3812751,
+ "drop_percentage": 0.5866630157594871
+ },
+ {
+ "rx_pps": 319677.01936570305,
+ "rx_pkts": 3181590,
+ "time_ms": 1646294094664,
+ "drop_pct": 169,
+ "total_tx_pps": 318175,
+ "tx_pps": 319694,
+ "tx_pkts": 3181759,
+ "drop_percentage": 0.005311527365837576
+ },
+ {
+ "rx_pps": 286984.929988342,
+ "rx_pkts": 2852492,
+ "time_ms": 1646294107173,
+ "drop_pct": 7346,
+ "total_tx_pps": 285983,
+ "tx_pps": 287724,
+ "tx_pkts": 2859838,
+ "drop_percentage": 0.2568676967017013
+ },
+ {
+ "rx_pps": 271740.0,
+ "rx_pkts": 2700692,
+ "time_ms": 1646294119672,
+ "drop_pct": 0,
+ "total_tx_pps": 270069,
+ "tx_pps": 271740,
+ "tx_pkts": 2700692,
+ "ndr_pps": 135870,
+ "drop_percentage": 0.0
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "62ffc44b9e274050bf0a7f2c90f3d093"
+ },
+ "synthesis": {
+ "avg_delay_usec": 496.00005109801486,
+ "total_tx_rate": 270069
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.intensive",
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_9000-fc_100k-rate_ndr-2.json",
+ "frame_sizes": [
+ "9000"
+ ],
+ "rate": "ndr",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "user_label": "amical_tc6_intensive"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-03 08:02:44",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "917d50701d4e429dad9083ff419756ca",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "9000"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 0,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_9000-fc_100k-rate_ndr-2.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "9000"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2504,
+ 2515
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": false,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc6_intensive",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.intensive",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/characterization/nfvbench-throughput-fs_9000-fc_100k-rate_ndr-2.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/characterization/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "9000": {
+ "ndr": {
+ "load_percent_per_direction": 22.265625,
+ "timestamp_sec": 1646294707.7233596,
+ "stats": {
+ "total_tx_rate": 153337,
+ "overall": {
+ "rx_pkts": 1533368,
+ "drop_percentage": 0.00019564736779292163,
+ "drop_pct": 3,
+ "max_delay_usec": 18880,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 1533371,
+ "avg_delay_usec": 987.5007708521373,
+ "min_delay_usec": 54,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 766686,
+ "min_delay_usec": 54,
+ "drop_pct": 0,
+ "max_delay_usec": 18880,
+ "tx_pkts": 766685,
+ "avg_delay_usec": 1283,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 766682,
+ "min_delay_usec": 54,
+ "drop_pct": 3,
+ "max_delay_usec": 16438,
+ "tx_pkts": 766686,
+ "avg_delay_usec": 692,
+ "drop_percentage": 0.00039129448040005945
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 11064797920.0,
+ "theoretical_tx_rate_pps": 692904.6563192905
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 44.53125,
+ "duration_sec": 10.0,
+ "l2frame_size": "9000",
+ "rate_pps": 154278,
+ "rate_bps": 11132812500.0,
+ "time_taken_sec": 137.58272123336792
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 90494.832576641,
+ "rx_pkts": 898795,
+ "time_ms": 1646294582631,
+ "drop_pct": 5983130,
+ "total_tx_pps": 688192,
+ "tx_pps": 692904,
+ "tx_pkts": 6881925,
+ "drop_percentage": 86.93977339189253
+ },
+ {
+ "rx_pps": 140749.47686318654,
+ "rx_pkts": 1398839,
+ "time_ms": 1646294595149,
+ "drop_pct": 2044375,
+ "total_tx_pps": 344321,
+ "tx_pps": 346452,
+ "tx_pkts": 3443214,
+ "drop_percentage": 59.374032517293436
+ },
+ {
+ "rx_pps": 173212.0139973792,
+ "rx_pkts": 1721469,
+ "time_ms": 1646294607646,
+ "drop_pct": 139,
+ "total_tx_pps": 172160,
+ "tx_pps": 173226,
+ "tx_pkts": 1721608,
+ "drop_percentage": 0.008073847240486801
+ },
+ {
+ "rx_pps": 86612.0,
+ "rx_pkts": 860795,
+ "time_ms": 1646294620168,
+ "drop_pct": 0,
+ "total_tx_pps": 86079,
+ "tx_pps": 86612,
+ "tx_pkts": 860795,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 129918.0,
+ "rx_pkts": 1291191,
+ "time_ms": 1646294632678,
+ "drop_pct": 0,
+ "total_tx_pps": 129119,
+ "tx_pps": 129918,
+ "tx_pkts": 1291191,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 151570.89330603922,
+ "rx_pkts": 1506541,
+ "time_ms": 1646294645208,
+ "drop_pct": 11,
+ "total_tx_pps": 150655,
+ "tx_pps": 151572,
+ "tx_pkts": 1506552,
+ "drop_percentage": 0.0007301440640615127
+ },
+ {
+ "rx_pps": 162054.72678886072,
+ "rx_pkts": 1611232,
+ "time_ms": 1646294657720,
+ "drop_pct": 3413,
+ "total_tx_pps": 161464,
+ "tx_pps": 162398,
+ "tx_pkts": 1614645,
+ "drop_percentage": 0.2113777331859325
+ },
+ {
+ "rx_pps": 156960.74598503095,
+ "rx_pkts": 1560035,
+ "time_ms": 1646294670223,
+ "drop_pct": 251,
+ "total_tx_pps": 156028,
+ "tx_pps": 156986,
+ "tx_pkts": 1560286,
+ "drop_percentage": 0.016086794344113836
+ },
+ {
+ "rx_pps": 154277.69815915392,
+ "rx_pkts": 1533368,
+ "time_ms": 1646294682722,
+ "drop_pct": 3,
+ "total_tx_pps": 153337,
+ "tx_pps": 154278,
+ "tx_pkts": 1533371,
+ "drop_percentage": 0.0001956473677929216
+ },
+ {
+ "rx_pps": 155550.0040687643,
+ "rx_pkts": 1546092,
+ "time_ms": 1646294695224,
+ "drop_pct": 815,
+ "total_tx_pps": 154690,
+ "tx_pps": 155632,
+ "tx_pkts": 1546907,
+ "drop_percentage": 0.05268577878308134
+ },
+ {
+ "rx_pps": 153977.28138199815,
+ "rx_pkts": 1530304,
+ "time_ms": 1646294707722,
+ "drop_pct": 9727,
+ "total_tx_pps": 154003,
+ "tx_pps": 154956,
+ "tx_pkts": 1540031,
+ "ndr_pps": 77139,
+ "drop_percentage": 0.6316106623827702
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "917d50701d4e429dad9083ff419756ca"
+ },
+ "synthesis": {
+ "avg_delay_usec": 987.5007708521373,
+ "total_tx_rate": 153337
+ }
+ }
+ ]
+ },
+ "fail_tests": 0,
+ "total_tests": 1,
+ "pass_tests": 1
+ }
+ }
+ ]
+}
diff --git a/test/ut_behave_tests/test_data/project=nfvbench&case=non-regression&criteria=PASS&page=1.json b/test/ut_behave_tests/test_data/project=nfvbench&case=non-regression&criteria=PASS&page=1.json
new file mode 100644
index 0000000..6af5404
--- /dev/null
+++ b/test/ut_behave_tests/test_data/project=nfvbench&case=non-regression&criteria=PASS&page=1.json
@@ -0,0 +1,8124 @@
+{
+ "pagination": {
+ "current_page": 1,
+ "total_pages": 1
+ },
+ "results": [
+ {
+ "project_name": "nfvbench",
+ "scenario": "basic",
+ "stop_date": "2022-03-30 06:48:26",
+ "case_name": "non-regression",
+ "build_tag": "RPDOUC5V2ARA",
+ "version": "unknown",
+ "pod_name": "AMICAL",
+ "criteria": "PASS",
+ "installer": "unknown",
+ "_id": "6243fd3bc0d88e001ca15689",
+ "start_date": "2022-03-30 06:15:40",
+ "details": {
+ "tests": [
+ {
+ "status": "passed",
+ "elements": [
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size -- @1.1 Frame sizes",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010585784912109375,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "64 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "64"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.799003601074219e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 0.00010967254638671875,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.608268737792969e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 10.035421133041382,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 449.58826899528503,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00013637542724609375,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0003008842468261719,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "verify throughput result is in same range as the previous result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:14",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:333"
+ },
+ "result": {
+ "duration": 0.02466893196105957,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "verify throughput result is in same range as the characterization result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:15",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:409"
+ },
+ "result": {
+ "duration": 0.6800198554992676,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:19",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size -- @1.2 Frame sizes",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00011587142944335938,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "768 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "768"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 0.00011491775512695312,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.5367431640625e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.322166442871094e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.008649349212646484,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.46048855781555,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00012159347534179688,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.0003330707550048828,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "verify throughput result is in same range as the previous result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:14",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:333"
+ },
+ "result": {
+ "duration": 0.023331880569458008,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "verify throughput result is in same range as the characterization result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:15",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:409"
+ },
+ "result": {
+ "duration": 0.690040111541748,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:20",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size -- @1.3 Frame sizes",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010156631469726562,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "1518 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "1518"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.584426879882812e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.489059448242188e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 9.632110595703125e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.008922100067138672,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 441.5395607948303,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00012230873107910156,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.00034332275390625,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "verify throughput result is in same range as the previous result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:14",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:333"
+ },
+ "result": {
+ "duration": 0.022931814193725586,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "verify throughput result is in same range as the characterization result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:15",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:409"
+ },
+ "result": {
+ "duration": 0.5106196403503418,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:21",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a NDR test for a defined frame size -- @1.4 Frame sizes",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "throughput"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:6",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010037422180175781,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "9000 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:7",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "9000"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.560585021972656e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:8",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.465217590332031e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "ndr rate",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:9",
+ "match": {
+ "arguments": [
+ {
+ "name": "rate",
+ "value": "ndr"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:119"
+ },
+ "result": {
+ "duration": 0.000102996826171875,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:10",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.00852203369140625,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "3 runs are started and waiting for maximum result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:11",
+ "match": {
+ "arguments": [
+ {
+ "name": "repeat",
+ "value": 3,
+ "original": "3"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 439.5287985801697,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:12",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00012087821960449219,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "extract offered rate result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:13",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:327"
+ },
+ "result": {
+ "duration": 0.000316619873046875,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "verify throughput result is in same range as the previous result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:14",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:333"
+ },
+ "result": {
+ "duration": 0.02317047119140625,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "verify throughput result is in same range as the characterization result",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:15",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:409"
+ },
+ "result": {
+ "duration": 0.6906359195709229,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:22",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a latency test for a defined frame size and throughput percentage -- @1.1 Frame sizes and throughput percentages",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "latency"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:27",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.0001735687255859375,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "64 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:28",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "64"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.799003601074219e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:29",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.751319885253906e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "packet rate equal to 70% of max throughput of last characterization",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:30",
+ "match": {
+ "arguments": [
+ {
+ "name": "percentage",
+ "value": "70%"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:137"
+ },
+ "result": {
+ "duration": 3.042870044708252,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:31",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.00884389877319336,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "run is started and waiting for result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:32",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 20.07615303993225,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:33",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00012111663818359375,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "verify latency result is lower than 1000 microseconds",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:34",
+ "match": {
+ "arguments": [
+ {
+ "name": "max_avg_latency_usec",
+ "value": 1000.0,
+ "original": "1000"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:351"
+ },
+ "result": {
+ "duration": 0.0001919269561767578,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:38",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a latency test for a defined frame size and throughput percentage -- @1.2 Frame sizes and throughput percentages",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "latency"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:27",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010085105895996094,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "64 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:28",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "64"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 0.00011873245239257812,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:29",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.560585021972656e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "packet rate equal to 90% of max throughput of last characterization",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:30",
+ "match": {
+ "arguments": [
+ {
+ "name": "percentage",
+ "value": "90%"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:137"
+ },
+ "result": {
+ "duration": 2.90081524848938,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:31",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.008797883987426758,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "run is started and waiting for result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:32",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 20.11899709701538,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:33",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00013256072998046875,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "verify latency result is lower than 1000 microseconds",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:34",
+ "match": {
+ "arguments": [
+ {
+ "name": "max_avg_latency_usec",
+ "value": 1000.0,
+ "original": "1000"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:351"
+ },
+ "result": {
+ "duration": 0.0001926422119140625,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:39",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a latency test for a defined frame size and throughput percentage -- @1.3 Frame sizes and throughput percentages",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "latency"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:27",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.822845458984375e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "768 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:28",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "768"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 0.00011396408081054688,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:29",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.775161743164062e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "packet rate equal to 70% of max throughput of last characterization",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:30",
+ "match": {
+ "arguments": [
+ {
+ "name": "percentage",
+ "value": "70%"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:137"
+ },
+ "result": {
+ "duration": 3.1052234172821045,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:31",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.008736610412597656,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "run is started and waiting for result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:32",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 20.07916784286499,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:33",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00011897087097167969,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "verify latency result is lower than 1000 microseconds",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:34",
+ "match": {
+ "arguments": [
+ {
+ "name": "max_avg_latency_usec",
+ "value": 1000.0,
+ "original": "1000"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:351"
+ },
+ "result": {
+ "duration": 0.0002129077911376953,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:40",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a latency test for a defined frame size and throughput percentage -- @1.4 Frame sizes and throughput percentages",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "latency"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:27",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010061264038085938,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "768 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:28",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "768"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.560585021972656e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:29",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.632110595703125e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "packet rate equal to 90% of max throughput of last characterization",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:30",
+ "match": {
+ "arguments": [
+ {
+ "name": "percentage",
+ "value": "90%"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:137"
+ },
+ "result": {
+ "duration": 2.9584743976593018,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:31",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.008613348007202148,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "run is started and waiting for result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:32",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 20.074522256851196,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:33",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.0001220703125,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "verify latency result is lower than 1000 microseconds",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:34",
+ "match": {
+ "arguments": [
+ {
+ "name": "max_avg_latency_usec",
+ "value": 1000.0,
+ "original": "1000"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:351"
+ },
+ "result": {
+ "duration": 0.00019407272338867188,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:41",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a latency test for a defined frame size and throughput percentage -- @1.5 Frame sizes and throughput percentages",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "latency"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:27",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010061264038085938,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "1518 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:28",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "1518"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.703636169433594e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:29",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 0.00011610984802246094,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "packet rate equal to 70% of max throughput of last characterization",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:30",
+ "match": {
+ "arguments": [
+ {
+ "name": "percentage",
+ "value": "70%"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:137"
+ },
+ "result": {
+ "duration": 3.118863821029663,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:31",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.008606433868408203,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "run is started and waiting for result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:32",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 20.080474376678467,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:33",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00012254714965820312,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "verify latency result is lower than 1000 microseconds",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:34",
+ "match": {
+ "arguments": [
+ {
+ "name": "max_avg_latency_usec",
+ "value": 1000.0,
+ "original": "1000"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:351"
+ },
+ "result": {
+ "duration": 0.00019216537475585938,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:42",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a latency test for a defined frame size and throughput percentage -- @1.6 Frame sizes and throughput percentages",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "latency"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:27",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010013580322265625,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "1518 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:28",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "1518"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.942054748535156e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:29",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.703636169433594e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "packet rate equal to 90% of max throughput of last characterization",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:30",
+ "match": {
+ "arguments": [
+ {
+ "name": "percentage",
+ "value": "90%"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:137"
+ },
+ "result": {
+ "duration": 2.9169235229492188,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:31",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.008793830871582031,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "run is started and waiting for result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:32",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 18.160871744155884,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:33",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00012159347534179688,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "verify latency result is lower than 1000 microseconds",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:34",
+ "match": {
+ "arguments": [
+ {
+ "name": "max_avg_latency_usec",
+ "value": 1000.0,
+ "original": "1000"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:351"
+ },
+ "result": {
+ "duration": 0.00019097328186035156,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:43",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a latency test for a defined frame size and throughput percentage -- @1.7 Frame sizes and throughput percentages",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "latency"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:27",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 9.965896606445312e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "9000 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:28",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "9000"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.918212890625e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:29",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.655952453613281e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "packet rate equal to 70% of max throughput of last characterization",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:30",
+ "match": {
+ "arguments": [
+ {
+ "name": "percentage",
+ "value": "70%"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:137"
+ },
+ "result": {
+ "duration": 2.906872272491455,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:31",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.008602142333984375,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "run is started and waiting for result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:32",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 20.075267791748047,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:33",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00011920928955078125,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "verify latency result is lower than 1000 microseconds",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:34",
+ "match": {
+ "arguments": [
+ {
+ "name": "max_avg_latency_usec",
+ "value": 1000.0,
+ "original": "1000"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:351"
+ },
+ "result": {
+ "duration": 0.00020933151245117188,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:44",
+ "type": "scenario"
+ },
+ {
+ "status": "passed",
+ "name": "Run a latency test for a defined frame size and throughput percentage -- @1.8 Frame sizes and throughput percentages",
+ "keyword": "Scenario Outline",
+ "tags": [
+ "latency"
+ ],
+ "steps": [
+ {
+ "name": "10 sec run duration",
+ "keyword": "Given",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:27",
+ "match": {
+ "arguments": [
+ {
+ "name": "duration",
+ "value": "10"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:124"
+ },
+ "result": {
+ "duration": 0.00010251998901367188,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "9000 frame size",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:28",
+ "match": {
+ "arguments": [
+ {
+ "name": "frame_size",
+ "value": "9000"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:109"
+ },
+ "result": {
+ "duration": 9.72747802734375e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "100k flow count",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:29",
+ "match": {
+ "arguments": [
+ {
+ "name": "flow_count",
+ "value": "100k"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:114"
+ },
+ "result": {
+ "duration": 9.465217590332031e-05,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "packet rate equal to 90% of max throughput of last characterization",
+ "keyword": "And",
+ "step_type": "given",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:30",
+ "match": {
+ "arguments": [
+ {
+ "name": "percentage",
+ "value": "90%"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:137"
+ },
+ "result": {
+ "duration": 2.828930139541626,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "NFVbench API is ready",
+ "keyword": "When",
+ "step_type": "when",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:31",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:210"
+ },
+ "result": {
+ "duration": 0.008794546127319336,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "run is started and waiting for result",
+ "keyword": "Then",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:32",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:264"
+ },
+ "result": {
+ "duration": 20.077053785324097,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "push result to database",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:33",
+ "match": {
+ "arguments": [],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:426"
+ },
+ "result": {
+ "duration": 0.00011849403381347656,
+ "status": "passed"
+ }
+ },
+ {
+ "name": "verify latency result is lower than 1000 microseconds",
+ "keyword": "And",
+ "step_type": "then",
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:34",
+ "match": {
+ "arguments": [
+ {
+ "name": "max_avg_latency_usec",
+ "value": 1000.0,
+ "original": "1000"
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/steps/steps.py:351"
+ },
+ "result": {
+ "duration": 0.0002167224884033203,
+ "status": "passed"
+ }
+ }
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:45",
+ "type": "scenario"
+ }
+ ],
+ "name": "non-regression",
+ "keyword": "Feature",
+ "tags": [
+ "non-regression"
+ ],
+ "location": "../../opt/nfvbench/behave_tests/features/non-regression.feature:2"
+ }
+ ],
+ "skip_tests": 0,
+ "links": [
+ "http://172.20.73.203:8181/RPDOUC5V2ARA/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_non-regression-run-41/xtesting.log",
+ "http://172.20.73.203:8181/RPDOUC5V2ARA/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_non-regression-run-41/non-regression/nfvbench-throughput-fs_768-fc_100k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/RPDOUC5V2ARA/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_non-regression-run-41/non-regression/nfvbench-throughput-fs_1518-fc_100k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/RPDOUC5V2ARA/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_non-regression-run-41/non-regression/nfvbench-throughput-fs_9000-fc_100k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/RPDOUC5V2ARA/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_non-regression-run-41/non-regression/output.html",
+ "http://172.20.73.203:8181/RPDOUC5V2ARA/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_non-regression-run-41/non-regression/nfvbench-throughput-fs_9000-fc_100k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/RPDOUC5V2ARA/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_non-regression-run-41/non-regression/nfvbench-throughput-fs_64-fc_100k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/RPDOUC5V2ARA/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_non-regression-run-41/non-regression/nfvbench-latency-fs_64-fc_100k-rate_70%.json",
+ "http://172.20.73.203:8181/RPDOUC5V2ARA/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_non-regression-run-41/non-regression/nfvbench-throughput-fs_64-fc_100k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/RPDOUC5V2ARA/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_non-regression-run-41/non-regression/nfvbench-throughput-fs_1518-fc_100k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/RPDOUC5V2ARA/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_non-regression-run-41/non-regression/behave_tests.log",
+ "http://172.20.73.203:8181/RPDOUC5V2ARA/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_non-regression-run-41/non-regression/nfvbench-latency-fs_9000-fc_100k-rate_70%.json",
+ "http://172.20.73.203:8181/RPDOUC5V2ARA/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_non-regression-run-41/non-regression/nfvbench-throughput-fs_768-fc_100k-rate_ndr-1.json",
+ "http://172.20.73.203:8181/RPDOUC5V2ARA/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_non-regression-run-41/non-regression/campaign_result.json",
+ "http://172.20.73.203:8181/RPDOUC5V2ARA/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_non-regression-run-41/non-regression/nfvbench-latency-fs_768-fc_100k-rate_90%.json",
+ "http://172.20.73.203:8181/RPDOUC5V2ARA/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_non-regression-run-41/non-regression/nfvbench-throughput-fs_64-fc_100k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/RPDOUC5V2ARA/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_non-regression-run-41/non-regression/nfvbench-latency-fs_1518-fc_100k-rate_90%.json",
+ "http://172.20.73.203:8181/RPDOUC5V2ARA/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_non-regression-run-41/non-regression/nfvbench-throughput-fs_9000-fc_100k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/RPDOUC5V2ARA/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_non-regression-run-41/non-regression/nfvbench-throughput-fs_1518-fc_100k-rate_ndr-0.json",
+ "http://172.20.73.203:8181/RPDOUC5V2ARA/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_non-regression-run-41/non-regression/nfvbench-throughput-fs_768-fc_100k-rate_ndr-2.json",
+ "http://172.20.73.203:8181/RPDOUC5V2ARA/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_non-regression-run-41/non-regression/nfvbench-latency-fs_64-fc_100k-rate_90%.json",
+ "http://172.20.73.203:8181/RPDOUC5V2ARA/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_non-regression-run-41/non-regression/TESTS-non-regression.xml",
+ "http://172.20.73.203:8181/RPDOUC5V2ARA/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_non-regression-run-41/non-regression/nfvbench-latency-fs_768-fc_100k-rate_70%.json",
+ "http://172.20.73.203:8181/RPDOUC5V2ARA/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_non-regression-run-41/non-regression/nfvbench.log",
+ "http://172.20.73.203:8181/RPDOUC5V2ARA/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_non-regression-run-41/non-regression/nfvbench-latency-fs_9000-fc_100k-rate_90%.json",
+ "http://172.20.73.203:8181/RPDOUC5V2ARA/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_non-regression-run-41/non-regression/nfvbench-latency-fs_1518-fc_100k-rate_70%.json",
+ "http://172.20.73.203:8181/RPDOUC5V2ARA/nfvbench-amical-e2e-basic-_-nfvbench-launcher-latest-devel-nfvbench_e2e_only_test_non-regression-run-41/non-regression/output.json"
+ ],
+ "results": {
+ "latency": [
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/non-regression/nfvbench-latency-fs_64-fc_100k-rate_70%.json",
+ "frame_sizes": [
+ "64"
+ ],
+ "rate": "70%",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/non-regression/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-30 06:45:29",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "75ed0568a3cf49929e20d9d4c44a23a0",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "404398pps",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "64"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": false,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/non-regression/nfvbench-latency-fs_64-fc_100k-rate_70%.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": true,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "64"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2512,
+ 2517
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/non-regression/nfvbench-latency-fs_64-fc_100k-rate_70%.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/non-regression/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "64": {
+ "run_config": {
+ "direction-forward": {
+ "rx": {
+ "rate_percent": 0.5414414208000001,
+ "rate_pps": 201429,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 135360355
+ },
+ "tx": {
+ "rate_percent": 0.5414497536,
+ "rate_pps": 201432,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 135362438
+ },
+ "orig": {
+ "rate_percent": 0.543510912,
+ "rate_pps": 202199,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 135877728
+ }
+ },
+ "direction-total": {
+ "rx": {
+ "rate_percent": 1.082844672,
+ "rate_pps": 402843.0,
+ "rate_bps": 270711167.0
+ },
+ "tx": {
+ "rate_percent": 1.0828995072,
+ "rate_pps": 402864.0,
+ "rate_bps": 270724876.0
+ },
+ "orig": {
+ "rate_percent": 1.087021824,
+ "rate_pps": 404398.0,
+ "rate_bps": 271755456.0
+ }
+ },
+ "direction-reverse": {
+ "rx": {
+ "rate_percent": 0.5414032511999999,
+ "rate_pps": 201414,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 135350812
+ },
+ "tx": {
+ "rate_percent": 0.5414497536,
+ "rate_pps": 201432,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 135362438
+ },
+ "orig": {
+ "rate_percent": 0.543510912,
+ "rate_pps": 202199,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 135877728
+ }
+ }
+ },
+ "packet_path_stats": {
+ "Forward": {
+ "interfaces": [
+ "TRex.TX.p0",
+ "TRex.RX.p1"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 9937,
+ 9937
+ ],
+ "lat_max_usec": 4057,
+ "lat_avg_usec": 78,
+ "lat_min_usec": 31,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ },
+ "Reverse": {
+ "interfaces": [
+ "TRex.TX.p1",
+ "TRex.RX.p0"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 9937,
+ 9937
+ ],
+ "lat_max_usec": 5209,
+ "lat_avg_usec": 76,
+ "lat_min_usec": 32,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ }
+ },
+ "stats": {
+ "total_tx_rate": 402864,
+ "overall": {
+ "drop_rate_percent": 0.005063738568113737,
+ "rx": {
+ "dropped_pkts": 204,
+ "pkt_bit_rate": 109803088.0,
+ "pkt_rate": 201839.0,
+ "max_delay_usec": 5209,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "avg_delay_usec": 76.99996475062306,
+ "total_pkt_bytes": 273933920,
+ "total_pkts": 4028440,
+ "min_delay_usec": 31
+ },
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg=",
+ "tx": {
+ "total_pkt_bytes": 273947792,
+ "total_pkts": 4028644,
+ "pkt_bit_rate": 109803752.0,
+ "pkt_rate": 201840.5
+ }
+ },
+ "1": {
+ "drop_rate_percent": 0.0015389793687404496,
+ "rx": {
+ "dropped_pkts": 31,
+ "pkt_bit_rate": 109811680,
+ "pkt_rate": 201855,
+ "max_delay_usec": 5209,
+ "total_pkt_bytes": 136971788,
+ "avg_delay_usec": 76,
+ "total_pkts": 2014291,
+ "min_delay_usec": 32
+ },
+ "tx": {
+ "total_pkt_bytes": 136973896,
+ "total_pkts": 2014322,
+ "pkt_bit_rate": 109806936,
+ "pkt_rate": 201846
+ }
+ },
+ "0": {
+ "drop_rate_percent": 0.008588497767487026,
+ "rx": {
+ "dropped_pkts": 173,
+ "pkt_bit_rate": 109794496,
+ "pkt_rate": 201823,
+ "max_delay_usec": 4057,
+ "total_pkt_bytes": 136962132,
+ "avg_delay_usec": 78,
+ "total_pkts": 2014149,
+ "min_delay_usec": 31
+ },
+ "tx": {
+ "total_pkt_bytes": 136973896,
+ "total_pkts": 2014322,
+ "pkt_bit_rate": 109800568,
+ "pkt_rate": 201835
+ }
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 270724608.0,
+ "theoretical_tx_rate_pps": 74404761.90476191
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "75ed0568a3cf49929e20d9d4c44a23a0"
+ },
+ "synthesis": {
+ "avg_delay_usec": 76.99996475062306,
+ "total_tx_rate": 402864
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/non-regression/nfvbench-latency-fs_64-fc_100k-rate_90%.json",
+ "frame_sizes": [
+ "64"
+ ],
+ "rate": "90%",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/non-regression/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-30 06:45:52",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "79137fde73644833ac7d36e6523616ef",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "519940pps",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "64"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": false,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/non-regression/nfvbench-latency-fs_64-fc_100k-rate_90%.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": true,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "64"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2512,
+ 2517
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/non-regression/nfvbench-latency-fs_64-fc_100k-rate_90%.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/non-regression/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "64": {
+ "run_config": {
+ "direction-forward": {
+ "rx": {
+ "rate_percent": 0.6964035456000001,
+ "rate_pps": 259078,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 174100886
+ },
+ "tx": {
+ "rate_percent": 0.6964035456000001,
+ "rate_pps": 259078,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 174100886
+ },
+ "orig": {
+ "rate_percent": 0.69879936,
+ "rate_pps": 259970,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 174699840
+ }
+ },
+ "direction-total": {
+ "rx": {
+ "rate_percent": 1.3929753599999999,
+ "rate_pps": 518219.0,
+ "rate_bps": 348243839.0
+ },
+ "tx": {
+ "rate_percent": 1.3929753599999999,
+ "rate_pps": 518219.0,
+ "rate_bps": 348243839.0
+ },
+ "orig": {
+ "rate_percent": 1.39759872,
+ "rate_pps": 519940.0,
+ "rate_bps": 349399680.0
+ }
+ },
+ "direction-reverse": {
+ "rx": {
+ "rate_percent": 0.6965718143999999,
+ "rate_pps": 259141,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 174142953
+ },
+ "tx": {
+ "rate_percent": 0.6965718143999999,
+ "rate_pps": 259141,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 174142953
+ },
+ "orig": {
+ "rate_percent": 0.69879936,
+ "rate_pps": 259970,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 174699840
+ }
+ }
+ },
+ "packet_path_stats": {
+ "Forward": {
+ "interfaces": [
+ "TRex.TX.p0",
+ "TRex.RX.p1"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 9943,
+ 9943
+ ],
+ "lat_max_usec": 769,
+ "lat_avg_usec": 108,
+ "lat_min_usec": 36,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ },
+ "Reverse": {
+ "interfaces": [
+ "TRex.TX.p1",
+ "TRex.RX.p0"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 9948,
+ 9948
+ ],
+ "lat_max_usec": 6239,
+ "lat_avg_usec": 113,
+ "lat_min_usec": 34,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ }
+ },
+ "stats": {
+ "total_tx_rate": 518220,
+ "overall": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 141244984.0,
+ "pkt_rate": 259641.0,
+ "max_delay_usec": 6239,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "avg_delay_usec": 110.49969800470842,
+ "total_pkt_bytes": 352389600,
+ "total_pkts": 5182200,
+ "min_delay_usec": 34
+ },
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg=",
+ "tx": {
+ "total_pkt_bytes": 352389600,
+ "total_pkts": 5182200,
+ "pkt_bit_rate": 141253832.0,
+ "pkt_rate": 259656.5
+ }
+ },
+ "1": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 141247136,
+ "pkt_rate": 259645,
+ "max_delay_usec": 6239,
+ "total_pkt_bytes": 176173516,
+ "avg_delay_usec": 113,
+ "total_pkts": 2590787,
+ "min_delay_usec": 34
+ },
+ "tx": {
+ "total_pkt_bytes": 176216084,
+ "total_pkts": 2591413,
+ "pkt_bit_rate": 141261952,
+ "pkt_rate": 259671
+ }
+ },
+ "0": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 141242832,
+ "pkt_rate": 259637,
+ "max_delay_usec": 769,
+ "total_pkt_bytes": 176216084,
+ "avg_delay_usec": 108,
+ "total_pkts": 2591413,
+ "min_delay_usec": 36
+ },
+ "tx": {
+ "total_pkt_bytes": 176173516,
+ "total_pkts": 2590787,
+ "pkt_bit_rate": 141245712,
+ "pkt_rate": 259642
+ }
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 348243840.0,
+ "theoretical_tx_rate_pps": 74404761.90476191
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "79137fde73644833ac7d36e6523616ef"
+ },
+ "synthesis": {
+ "avg_delay_usec": 110.49969800470842,
+ "total_tx_rate": 518220
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/non-regression/nfvbench-latency-fs_768-fc_100k-rate_70%.json",
+ "frame_sizes": [
+ "768"
+ ],
+ "rate": "70%",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/non-regression/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-30 06:46:15",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "018ded21d6884356b306acecf1de061e",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "323313pps",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "768"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": false,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/non-regression/nfvbench-latency-fs_768-fc_100k-rate_70%.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": true,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "768"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2512,
+ 2517
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/non-regression/nfvbench-latency-fs_768-fc_100k-rate_70%.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/non-regression/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "768": {
+ "run_config": {
+ "direction-forward": {
+ "rx": {
+ "rate_percent": 4.060615692799999,
+ "rate_pps": 161033,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 1015153923
+ },
+ "tx": {
+ "rate_percent": 4.060615692799999,
+ "rate_pps": 161033,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 1015153923
+ },
+ "orig": {
+ "rate_percent": 4.076330304,
+ "rate_pps": 161656,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 1019082576
+ }
+ },
+ "direction-total": {
+ "rx": {
+ "rate_percent": 8.1214759808,
+ "rate_pps": 322076.0,
+ "rate_bps": 2030368995.0
+ },
+ "tx": {
+ "rate_percent": 8.1214759808,
+ "rate_pps": 322076.0,
+ "rate_bps": 2030368995.0
+ },
+ "orig": {
+ "rate_percent": 8.152660608,
+ "rate_pps": 323312.0,
+ "rate_bps": 2038165152.0
+ }
+ },
+ "direction-reverse": {
+ "rx": {
+ "rate_percent": 4.060860288,
+ "rate_pps": 161043,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 1015215072
+ },
+ "tx": {
+ "rate_percent": 4.060860288,
+ "rate_pps": 161043,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 1015215072
+ },
+ "orig": {
+ "rate_percent": 4.076330304,
+ "rate_pps": 161656,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 1019082576
+ }
+ }
+ },
+ "packet_path_stats": {
+ "Forward": {
+ "interfaces": [
+ "TRex.TX.p0",
+ "TRex.RX.p1"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 9936,
+ 9936
+ ],
+ "lat_max_usec": 372,
+ "lat_avg_usec": 145,
+ "lat_min_usec": 54,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ },
+ "Reverse": {
+ "interfaces": [
+ "TRex.TX.p1",
+ "TRex.RX.p0"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 9937,
+ 9937
+ ],
+ "lat_max_usec": 4837,
+ "lat_avg_usec": 145,
+ "lat_min_usec": 60,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ }
+ },
+ "stats": {
+ "total_tx_rate": 322076,
+ "overall": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 997521760.0,
+ "pkt_rate": 161515.5,
+ "max_delay_usec": 4837,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "avg_delay_usec": 145.0,
+ "total_pkt_bytes": 2486429036,
+ "total_pkts": 3220763,
+ "min_delay_usec": 54
+ },
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg=",
+ "tx": {
+ "total_pkt_bytes": 2486429036,
+ "total_pkts": 3220763,
+ "pkt_bit_rate": 997554144.0,
+ "pkt_rate": 161520.5
+ }
+ },
+ "1": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 997543808,
+ "pkt_rate": 161519,
+ "max_delay_usec": 4837,
+ "total_pkt_bytes": 1243177076,
+ "avg_delay_usec": 145,
+ "total_pkts": 1610333,
+ "min_delay_usec": 60
+ },
+ "tx": {
+ "total_pkt_bytes": 1243251960,
+ "total_pkts": 1610430,
+ "pkt_bit_rate": 997507712,
+ "pkt_rate": 161513
+ }
+ },
+ "0": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 997499712,
+ "pkt_rate": 161512,
+ "max_delay_usec": 372,
+ "total_pkt_bytes": 1243251960,
+ "avg_delay_usec": 145,
+ "total_pkts": 1610430,
+ "min_delay_usec": 54
+ },
+ "tx": {
+ "total_pkt_bytes": 1243177076,
+ "total_pkts": 1610333,
+ "pkt_bit_rate": 997600576,
+ "pkt_rate": 161528
+ }
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 2030367104.0,
+ "theoretical_tx_rate_pps": 7931472.081218274
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "018ded21d6884356b306acecf1de061e"
+ },
+ "synthesis": {
+ "avg_delay_usec": 145.0,
+ "total_tx_rate": 322076
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/non-regression/nfvbench-latency-fs_768-fc_100k-rate_90%.json",
+ "frame_sizes": [
+ "768"
+ ],
+ "rate": "90%",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/non-regression/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-30 06:46:38",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "ad05bbb2c1a747e2a90c860566eea05b",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "415688pps",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "768"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": false,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/non-regression/nfvbench-latency-fs_768-fc_100k-rate_90%.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": true,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "768"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2512,
+ 2517
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/non-regression/nfvbench-latency-fs_768-fc_100k-rate_90%.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/non-regression/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "768": {
+ "run_config": {
+ "direction-forward": {
+ "rx": {
+ "rate_percent": 5.2271154176,
+ "rate_pps": 207293,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 1306778854
+ },
+ "tx": {
+ "rate_percent": 5.2271154176,
+ "rate_pps": 207293,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 1306778854
+ },
+ "orig": {
+ "rate_percent": 5.240994304,
+ "rate_pps": 207844,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 1310248576
+ }
+ },
+ "direction-total": {
+ "rx": {
+ "rate_percent": 10.454548556800003,
+ "rate_pps": 414599.0,
+ "rate_bps": 2613637138.0
+ },
+ "tx": {
+ "rate_percent": 10.454548556800003,
+ "rate_pps": 414599.0,
+ "rate_bps": 2613637138.0
+ },
+ "orig": {
+ "rate_percent": 10.481988608,
+ "rate_pps": 415688.0,
+ "rate_bps": 2620497152.0
+ }
+ },
+ "direction-reverse": {
+ "rx": {
+ "rate_percent": 5.227433139200001,
+ "rate_pps": 207306,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 1306858284
+ },
+ "tx": {
+ "rate_percent": 5.227433139200001,
+ "rate_pps": 207306,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 1306858284
+ },
+ "orig": {
+ "rate_percent": 5.240994304,
+ "rate_pps": 207844,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 1310248576
+ }
+ }
+ },
+ "packet_path_stats": {
+ "Forward": {
+ "interfaces": [
+ "TRex.TX.p0",
+ "TRex.RX.p1"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 9956,
+ 9956
+ ],
+ "lat_max_usec": 213,
+ "lat_avg_usec": 79,
+ "lat_min_usec": 33,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ },
+ "Reverse": {
+ "interfaces": [
+ "TRex.TX.p1",
+ "TRex.RX.p0"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 9958,
+ 9958
+ ],
+ "lat_max_usec": 3751,
+ "lat_avg_usec": 80,
+ "lat_min_usec": 32,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ }
+ },
+ "stats": {
+ "total_tx_rate": 414599,
+ "overall": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 1277907840.0,
+ "pkt_rate": 206914.5,
+ "max_delay_usec": 3751,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "avg_delay_usec": 79.49998480462364,
+ "total_pkt_bytes": 3200710456,
+ "total_pkts": 4145998,
+ "min_delay_usec": 32
+ },
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg=",
+ "tx": {
+ "total_pkt_bytes": 3200710456,
+ "total_pkts": 4145998,
+ "pkt_bit_rate": 1279049856.0,
+ "pkt_rate": 207099.5
+ }
+ },
+ "1": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 1275807616,
+ "pkt_rate": 206575,
+ "max_delay_usec": 3751,
+ "total_pkt_bytes": 1600306592,
+ "avg_delay_usec": 80,
+ "total_pkts": 2072936,
+ "min_delay_usec": 32
+ },
+ "tx": {
+ "total_pkt_bytes": 1600403864,
+ "total_pkts": 2073062,
+ "pkt_bit_rate": 1279909120,
+ "pkt_rate": 207239
+ }
+ },
+ "0": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 1280008064,
+ "pkt_rate": 207254,
+ "max_delay_usec": 213,
+ "total_pkt_bytes": 1600403864,
+ "avg_delay_usec": 79,
+ "total_pkts": 2073062,
+ "min_delay_usec": 33
+ },
+ "tx": {
+ "total_pkt_bytes": 1600306592,
+ "total_pkts": 2072936,
+ "pkt_bit_rate": 1278190592,
+ "pkt_rate": 206960
+ }
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 2613632096.0,
+ "theoretical_tx_rate_pps": 7931472.081218274
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "ad05bbb2c1a747e2a90c860566eea05b"
+ },
+ "synthesis": {
+ "avg_delay_usec": 79.49998480462364,
+ "total_tx_rate": 414599
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/non-regression/nfvbench-latency-fs_1518-fc_100k-rate_70%.json",
+ "frame_sizes": [
+ "1518"
+ ],
+ "rate": "70%",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/non-regression/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-30 06:47:01",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "cc041b8004d74c0a8d8594f9b1cb7094",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "353370pps",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "1518"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": false,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/non-regression/nfvbench-latency-fs_1518-fc_100k-rate_70%.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": true,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "1518"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2512,
+ 2517
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/non-regression/nfvbench-latency-fs_1518-fc_100k-rate_70%.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/non-regression/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "1518": {
+ "run_config": {
+ "direction-forward": {
+ "rx": {
+ "rate_percent": 8.6593927872,
+ "rate_pps": 175946,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 2164848196
+ },
+ "tx": {
+ "rate_percent": 8.662744396799999,
+ "rate_pps": 176014,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 2165686099
+ },
+ "orig": {
+ "rate_percent": 8.69572896,
+ "rate_pps": 176685,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 2173932240
+ }
+ },
+ "direction-total": {
+ "rx": {
+ "rate_percent": 17.321684396800002,
+ "rate_pps": 351951.0,
+ "rate_bps": 4330421098.0
+ },
+ "tx": {
+ "rate_percent": 17.326015404799996,
+ "rate_pps": 352039.0,
+ "rate_bps": 4331503851.0
+ },
+ "orig": {
+ "rate_percent": 17.39145792,
+ "rate_pps": 353370.0,
+ "rate_bps": 4347864480.0
+ }
+ },
+ "direction-reverse": {
+ "rx": {
+ "rate_percent": 8.6622916096,
+ "rate_pps": 176005,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 2165572902
+ },
+ "tx": {
+ "rate_percent": 8.663271007999999,
+ "rate_pps": 176025,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 2165817752
+ },
+ "orig": {
+ "rate_percent": 8.69572896,
+ "rate_pps": 176685,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 2173932240
+ }
+ }
+ },
+ "packet_path_stats": {
+ "Forward": {
+ "interfaces": [
+ "TRex.TX.p0",
+ "TRex.RX.p1"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 9938,
+ "-4 (-0.0402%)"
+ ],
+ "lat_max_usec": 2443,
+ "lat_avg_usec": 112,
+ "lat_min_usec": 36,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ },
+ "Reverse": {
+ "interfaces": [
+ "TRex.TX.p1",
+ "TRex.RX.p0"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 9939,
+ 9939
+ ],
+ "lat_max_usec": 12936,
+ "lat_avg_usec": 116,
+ "lat_min_usec": 38,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ }
+ },
+ "stats": {
+ "total_tx_rate": 352040,
+ "overall": {
+ "drop_rate_percent": 0.02499713811174459,
+ "rx": {
+ "dropped_pkts": 880,
+ "pkt_bit_rate": 2018299584.0,
+ "pkt_rate": 165760.0,
+ "max_delay_usec": 12936,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "avg_delay_usec": 113.99966529555283,
+ "total_pkt_bytes": 5356714006,
+ "total_pkts": 3519523,
+ "min_delay_usec": 36
+ },
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg=",
+ "tx": {
+ "total_pkt_bytes": 5358053366,
+ "total_pkts": 3520403,
+ "pkt_bit_rate": 2018089472.0,
+ "pkt_rate": 165742.5
+ }
+ },
+ "1": {
+ "drop_rate_percent": 0.03868757651590252,
+ "rx": {
+ "dropped_pkts": 681,
+ "pkt_bit_rate": 2007099776,
+ "pkt_rate": 164840,
+ "max_delay_usec": 12936,
+ "total_pkt_bytes": 2677908774,
+ "avg_delay_usec": 116,
+ "total_pkts": 1759467,
+ "min_delay_usec": 38
+ },
+ "tx": {
+ "total_pkt_bytes": 2679108110,
+ "total_pkts": 1760255,
+ "pkt_bit_rate": 2018672768,
+ "pkt_rate": 165791
+ }
+ },
+ "0": {
+ "drop_rate_percent": 0.011305867461145312,
+ "rx": {
+ "dropped_pkts": 199,
+ "pkt_bit_rate": 2029499392,
+ "pkt_rate": 166680,
+ "max_delay_usec": 2443,
+ "total_pkt_bytes": 2678805232,
+ "avg_delay_usec": 112,
+ "total_pkts": 1760056,
+ "min_delay_usec": 36
+ },
+ "tx": {
+ "total_pkt_bytes": 2678945256,
+ "total_pkts": 1760148,
+ "pkt_bit_rate": 2017506176,
+ "pkt_rate": 165694
+ }
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 4331500160.0,
+ "theoretical_tx_rate_pps": 4063719.1157347206
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "cc041b8004d74c0a8d8594f9b1cb7094"
+ },
+ "synthesis": {
+ "avg_delay_usec": 113.99966529555283,
+ "total_tx_rate": 352040
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/non-regression/nfvbench-latency-fs_1518-fc_100k-rate_90%.json",
+ "frame_sizes": [
+ "1518"
+ ],
+ "rate": "90%",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/non-regression/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-30 06:47:24",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "c882cf33b2e045618c1b76b924573708",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "454333pps",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "1518"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": false,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/non-regression/nfvbench-latency-fs_1518-fc_100k-rate_90%.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": true,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "1518"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2512,
+ 2517
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/non-regression/nfvbench-latency-fs_1518-fc_100k-rate_90%.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/non-regression/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "1518": {
+ "run_config": {
+ "direction-forward": {
+ "rx": {
+ "rate_percent": 11.1361683008,
+ "rate_pps": 226271,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 2784042075
+ },
+ "tx": {
+ "rate_percent": 11.137846566399999,
+ "rate_pps": 226305,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 2784461641
+ },
+ "orig": {
+ "rate_percent": 11.180226464,
+ "rate_pps": 227166,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 2795056616
+ }
+ },
+ "direction-total": {
+ "rx": {
+ "rate_percent": 22.2746891264,
+ "rate_pps": 452590.0,
+ "rate_bps": 5568672281.0
+ },
+ "tx": {
+ "rate_percent": 22.276367391999997,
+ "rate_pps": 452624.0,
+ "rate_bps": 5569091847.0
+ },
+ "orig": {
+ "rate_percent": 22.360452928,
+ "rate_pps": 454332.0,
+ "rate_bps": 5590113232.0
+ }
+ },
+ "direction-reverse": {
+ "rx": {
+ "rate_percent": 11.1385208256,
+ "rate_pps": 226319,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 2784630206
+ },
+ "tx": {
+ "rate_percent": 11.1385208256,
+ "rate_pps": 226319,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 2784630206
+ },
+ "orig": {
+ "rate_percent": 11.180226464,
+ "rate_pps": 227166,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 2795056616
+ }
+ }
+ },
+ "packet_path_stats": {
+ "Forward": {
+ "interfaces": [
+ "TRex.TX.p0",
+ "TRex.RX.p1"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 9937,
+ "-1 (-0.0101%)"
+ ],
+ "lat_max_usec": 198,
+ "lat_avg_usec": 90,
+ "lat_min_usec": 37,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ },
+ "Reverse": {
+ "interfaces": [
+ "TRex.TX.p1",
+ "TRex.RX.p0"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 9938,
+ 9938
+ ],
+ "lat_max_usec": 5322,
+ "lat_avg_usec": 93,
+ "lat_min_usec": 35,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ }
+ },
+ "stats": {
+ "total_tx_rate": 452624,
+ "overall": {
+ "drop_rate_percent": 0.007533838755966591,
+ "rx": {
+ "dropped_pkts": 341,
+ "pkt_bit_rate": 2761265024.0,
+ "pkt_rate": 226779.0,
+ "max_delay_usec": 5322,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "avg_delay_usec": 91.4998415786106,
+ "total_pkt_bytes": 6888425888,
+ "total_pkts": 4525904,
+ "min_delay_usec": 35
+ },
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg=",
+ "tx": {
+ "total_pkt_bytes": 6888944890,
+ "total_pkts": 4526245,
+ "pkt_bit_rate": 2761356672.0,
+ "pkt_rate": 226786.5
+ }
+ },
+ "1": {
+ "drop_rate_percent": 0.015067221458551222,
+ "rx": {
+ "dropped_pkts": 341,
+ "pkt_bit_rate": 2761269504,
+ "pkt_rate": 226779,
+ "max_delay_usec": 5322,
+ "total_pkt_bytes": 3443849186,
+ "avg_delay_usec": 93,
+ "total_pkts": 2262713,
+ "min_delay_usec": 35
+ },
+ "tx": {
+ "total_pkt_bytes": 3444576702,
+ "total_pkts": 2263191,
+ "pkt_bit_rate": 2761352192,
+ "pkt_rate": 226786
+ }
+ },
+ "0": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 2761260544,
+ "pkt_rate": 226779,
+ "max_delay_usec": 198,
+ "total_pkt_bytes": 3444576702,
+ "avg_delay_usec": 90,
+ "total_pkts": 2263191,
+ "min_delay_usec": 37
+ },
+ "tx": {
+ "total_pkt_bytes": 3444368188,
+ "total_pkts": 2263054,
+ "pkt_bit_rate": 2761361152,
+ "pkt_rate": 226787
+ }
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 5569085696.0,
+ "theoretical_tx_rate_pps": 4063719.1157347206
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "c882cf33b2e045618c1b76b924573708"
+ },
+ "synthesis": {
+ "avg_delay_usec": 91.4998415786106,
+ "total_tx_rate": 452624
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/non-regression/nfvbench-latency-fs_9000-fc_100k-rate_70%.json",
+ "frame_sizes": [
+ "9000"
+ ],
+ "rate": "70%",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/non-regression/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-30 06:47:45",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "c78cef8058b74f9885f125b3bf43f1da",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "183574pps",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "9000"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": false,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/non-regression/nfvbench-latency-fs_9000-fc_100k-rate_70%.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": true,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "9000"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2512,
+ 2517
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/non-regression/nfvbench-latency-fs_9000-fc_100k-rate_70%.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/non-regression/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "9000": {
+ "run_config": {
+ "direction-forward": {
+ "rx": {
+ "rate_percent": 26.390961344,
+ "rate_pps": 91432,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 6597740336
+ },
+ "tx": {
+ "rate_percent": 26.390961344,
+ "rate_pps": 91432,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 6597740336
+ },
+ "orig": {
+ "rate_percent": 26.493399680000003,
+ "rate_pps": 91787,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 6623349920
+ }
+ },
+ "direction-total": {
+ "rx": {
+ "rate_percent": 52.783539071999996,
+ "rate_pps": 182869.0,
+ "rate_bps": 13195884768.0
+ },
+ "tx": {
+ "rate_percent": 52.783539071999996,
+ "rate_pps": 182869.0,
+ "rate_bps": 13195884768.0
+ },
+ "orig": {
+ "rate_percent": 52.986799360000006,
+ "rate_pps": 183574.0,
+ "rate_bps": 13246699840.0
+ }
+ },
+ "direction-reverse": {
+ "rx": {
+ "rate_percent": 26.392577728,
+ "rate_pps": 91437,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 6598144432
+ },
+ "tx": {
+ "rate_percent": 26.392577728,
+ "rate_pps": 91437,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 6598144432
+ },
+ "orig": {
+ "rate_percent": 26.493399680000003,
+ "rate_pps": 91787,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 6623349920
+ }
+ }
+ },
+ "packet_path_stats": {
+ "Forward": {
+ "interfaces": [
+ "TRex.TX.p0",
+ "TRex.RX.p1"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 9937,
+ 9937
+ ],
+ "lat_max_usec": 4143,
+ "lat_avg_usec": 306,
+ "lat_min_usec": 66,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ },
+ "Reverse": {
+ "interfaces": [
+ "TRex.TX.p1",
+ "TRex.RX.p0"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 9938,
+ 9938
+ ],
+ "lat_max_usec": 6704,
+ "lat_avg_usec": 322,
+ "lat_min_usec": 65,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ }
+ },
+ "stats": {
+ "total_tx_rate": 182869,
+ "overall": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 6603213824.0,
+ "pkt_rate": 91670.5,
+ "max_delay_usec": 6704,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "avg_delay_usec": 313.9997550169574,
+ "total_pkt_bytes": 16465596792,
+ "total_pkts": 1828698,
+ "min_delay_usec": 65
+ },
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg=",
+ "tx": {
+ "total_pkt_bytes": 16465596792,
+ "total_pkts": 1828698,
+ "pkt_bit_rate": 6603036928.0,
+ "pkt_rate": 91668.5
+ }
+ },
+ "1": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 6603323392,
+ "pkt_rate": 91672,
+ "max_delay_usec": 6704,
+ "total_pkt_bytes": 8232546284,
+ "avg_delay_usec": 322,
+ "total_pkts": 914321,
+ "min_delay_usec": 65
+ },
+ "tx": {
+ "total_pkt_bytes": 8233050508,
+ "total_pkts": 914377,
+ "pkt_bit_rate": 6603299840,
+ "pkt_rate": 91672
+ }
+ },
+ "0": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 6603104256,
+ "pkt_rate": 91669,
+ "max_delay_usec": 4143,
+ "total_pkt_bytes": 8233050508,
+ "avg_delay_usec": 306,
+ "total_pkts": 914377,
+ "min_delay_usec": 66
+ },
+ "tx": {
+ "total_pkt_bytes": 8232546284,
+ "total_pkts": 914321,
+ "pkt_bit_rate": 6602774016,
+ "pkt_rate": 91665
+ }
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 13195827040.0,
+ "theoretical_tx_rate_pps": 692904.6563192905
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "c78cef8058b74f9885f125b3bf43f1da"
+ },
+ "synthesis": {
+ "avg_delay_usec": 313.9997550169574,
+ "total_tx_rate": 182869
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/non-regression/nfvbench-latency-fs_9000-fc_100k-rate_90%.json",
+ "frame_sizes": [
+ "9000"
+ ],
+ "rate": "90%",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/non-regression/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-30 06:48:08",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "4a306639173f4526b3a835abe92c709d",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "236023pps",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "9000"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": false,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/non-regression/nfvbench-latency-fs_9000-fc_100k-rate_90%.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": true,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "9000"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2512,
+ 2517
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/non-regression/nfvbench-latency-fs_9000-fc_100k-rate_90%.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/non-regression/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "9000": {
+ "run_config": {
+ "direction-forward": {
+ "rx": {
+ "rate_percent": 33.933413184,
+ "rate_pps": 117563,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 8483353296
+ },
+ "tx": {
+ "rate_percent": 33.933413184,
+ "rate_pps": 117563,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 8483353296
+ },
+ "orig": {
+ "rate_percent": 34.062839360000005,
+ "rate_pps": 118011,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 8515709840
+ }
+ },
+ "direction-total": {
+ "rx": {
+ "rate_percent": 67.868846848,
+ "rate_pps": 235133.0,
+ "rate_bps": 16967211712.0
+ },
+ "tx": {
+ "rate_percent": 67.868846848,
+ "rate_pps": 235133.0,
+ "rate_bps": 16967211712.0
+ },
+ "orig": {
+ "rate_percent": 68.12567872000001,
+ "rate_pps": 236022.0,
+ "rate_bps": 17031419680.0
+ }
+ },
+ "direction-reverse": {
+ "rx": {
+ "rate_percent": 33.935433663999994,
+ "rate_pps": 117570,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 8483858416
+ },
+ "tx": {
+ "rate_percent": 33.935433663999994,
+ "rate_pps": 117570,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 8483858416
+ },
+ "orig": {
+ "rate_percent": 34.062839360000005,
+ "rate_pps": 118011,
+ "initial_rate_type": "rate_pps",
+ "rate_bps": 8515709840
+ }
+ }
+ },
+ "packet_path_stats": {
+ "Forward": {
+ "interfaces": [
+ "TRex.TX.p0",
+ "TRex.RX.p1"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 9938,
+ 9938
+ ],
+ "lat_max_usec": 3154,
+ "lat_avg_usec": 503,
+ "lat_min_usec": 113,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ },
+ "Reverse": {
+ "interfaces": [
+ "TRex.TX.p1",
+ "TRex.RX.p0"
+ ],
+ "chains": {
+ "0": {
+ "packets": [
+ 9938,
+ 9938
+ ],
+ "lat_max_usec": 6539,
+ "lat_avg_usec": 390,
+ "lat_min_usec": 114,
+ "hdrh": "HISTFAAAAB54nJNpmSzMwMDAyAABzFAawp8xrcH+A1QAAE9IBCo=",
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ }
+ }
+ }
+ }
+ },
+ "stats": {
+ "total_tx_rate": 235133,
+ "overall": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 8493890560.0,
+ "pkt_rate": 117917.5,
+ "max_delay_usec": 6539,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "avg_delay_usec": 446.5016820253371,
+ "total_pkt_bytes": 21171393328,
+ "total_pkts": 2351332,
+ "min_delay_usec": 113
+ },
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg=",
+ "tx": {
+ "total_pkt_bytes": 21171393328,
+ "total_pkts": 2351332,
+ "pkt_bit_rate": 8494719232.0,
+ "pkt_rate": 117929.0
+ }
+ },
+ "1": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 8494009856,
+ "pkt_rate": 117919,
+ "max_delay_usec": 6539,
+ "total_pkt_bytes": 10585381524,
+ "avg_delay_usec": 390,
+ "total_pkts": 1175631,
+ "min_delay_usec": 114
+ },
+ "tx": {
+ "total_pkt_bytes": 10586011804,
+ "total_pkts": 1175701,
+ "pkt_bit_rate": 8494438400,
+ "pkt_rate": 117925
+ }
+ },
+ "0": {
+ "drop_rate_percent": 0.0,
+ "rx": {
+ "dropped_pkts": 0,
+ "pkt_bit_rate": 8493771264,
+ "pkt_rate": 117916,
+ "max_delay_usec": 3154,
+ "total_pkt_bytes": 10586011804,
+ "avg_delay_usec": 503,
+ "total_pkts": 1175701,
+ "min_delay_usec": 113
+ },
+ "tx": {
+ "total_pkt_bytes": 10585381524,
+ "total_pkts": 1175631,
+ "pkt_bit_rate": 8495000064,
+ "pkt_rate": 117933
+ }
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 16967197280.0,
+ "theoretical_tx_rate_pps": 692904.6563192905
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "4a306639173f4526b3a835abe92c709d"
+ },
+ "synthesis": {
+ "avg_delay_usec": 446.5016820253371,
+ "total_tx_rate": 235133
+ }
+ }
+ ],
+ "throughput": [
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/non-regression/nfvbench-throughput-fs_64-fc_100k-rate_ndr-2.json",
+ "frame_sizes": [
+ "64"
+ ],
+ "rate": "ndr",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/non-regression/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-30 06:20:56",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "38389ab0308e45b1a8769cbbff9ef2b2",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "64"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/non-regression/nfvbench-throughput-fs_64-fc_100k-rate_ndr-2.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "64"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2512,
+ 2517
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/non-regression/nfvbench-throughput-fs_64-fc_100k-rate_ndr-2.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/non-regression/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "64": {
+ "ndr": {
+ "load_percent_per_direction": 0.78125,
+ "timestamp_sec": 1648621399.3161063,
+ "stats": {
+ "total_tx_rate": 577711,
+ "overall": {
+ "rx_pkts": 5777112,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 518,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 5777112,
+ "avg_delay_usec": 108.49992470286192,
+ "min_delay_usec": 29,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 2888411,
+ "min_delay_usec": 29,
+ "drop_pct": 0,
+ "max_delay_usec": 263,
+ "tx_pkts": 2888701,
+ "avg_delay_usec": 110,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 2888701,
+ "min_delay_usec": 31,
+ "drop_pct": 0,
+ "max_delay_usec": 518,
+ "tx_pkts": 2888411,
+ "avg_delay_usec": 107,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 388221792.0,
+ "theoretical_tx_rate_pps": 74404761.90476191
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 1.5625,
+ "duration_sec": 10.0,
+ "l2frame_size": "64",
+ "rate_pps": 581286,
+ "rate_bps": 390625000.0,
+ "time_taken_sec": 137.66617798805237
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 1275063.5983414354,
+ "rx_pkts": 7250590,
+ "time_ms": 1648621274137,
+ "drop_pct": 415848626,
+ "total_tx_pps": 42309921,
+ "tx_pps": 74404760,
+ "tx_pkts": 423099216,
+ "warning": "WARNING: There is a significant difference between requested TX rate (74404760) and actual TX rate (42309921). The traffic generator may not have sufficient CPU to achieve the requested TX rate.",
+ "drop_percentage": 98.28631447995876
+ },
+ {
+ "rx_pps": 1826535.749662823,
+ "rx_pkts": 18151199,
+ "time_ms": 1648621286633,
+ "drop_pct": 351547452,
+ "total_tx_pps": 36969865,
+ "tx_pps": 37202380,
+ "tx_pkts": 369698651,
+ "drop_percentage": 95.09027177921729
+ },
+ {
+ "rx_pps": 1361841.6268887145,
+ "rx_pkts": 13533302,
+ "time_ms": 1648621299138,
+ "drop_pct": 171316035,
+ "total_tx_pps": 18484933,
+ "tx_pps": 18601190,
+ "tx_pkts": 184849337,
+ "drop_percentage": 92.678739226422
+ },
+ {
+ "rx_pps": 774061.5668982501,
+ "rx_pkts": 7703074,
+ "time_ms": 1648621311660,
+ "drop_pct": 84851791,
+ "total_tx_pps": 9255486,
+ "tx_pps": 9300594,
+ "tx_pkts": 92554865,
+ "drop_percentage": 91.67728892479072
+ },
+ {
+ "rx_pps": 792412.735924586,
+ "rx_pkts": 7874998,
+ "time_ms": 1648621324177,
+ "drop_pct": 38339645,
+ "total_tx_pps": 4621464,
+ "tx_pps": 4650296,
+ "tx_pkts": 46214643,
+ "drop_percentage": 82.9599505940141
+ },
+ {
+ "rx_pps": 1930194.9831442875,
+ "rx_pkts": 19183245,
+ "time_ms": 1648621336700,
+ "drop_pct": 3925241,
+ "total_tx_pps": 2310848,
+ "tx_pps": 2325148,
+ "tx_pkts": 23108486,
+ "drop_percentage": 16.986145262826824
+ },
+ {
+ "rx_pps": 1161679.8008522235,
+ "rx_pkts": 11545357,
+ "time_ms": 1648621349196,
+ "drop_pct": 8887,
+ "total_tx_pps": 1155424,
+ "tx_pps": 1162574,
+ "tx_pkts": 11554244,
+ "drop_percentage": 0.07691546067401726
+ },
+ {
+ "rx_pps": 581286.0,
+ "rx_pkts": 5777112,
+ "time_ms": 1648621361693,
+ "drop_pct": 0,
+ "total_tx_pps": 577711,
+ "tx_pps": 581286,
+ "tx_pkts": 5777112,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 871250.6221139021,
+ "rx_pkts": 8658928,
+ "time_ms": 1648621374223,
+ "drop_pct": 6752,
+ "total_tx_pps": 866568,
+ "tx_pps": 871930,
+ "tx_pkts": 8665680,
+ "drop_percentage": 0.07791656280868899
+ },
+ {
+ "rx_pps": 726098.0996491228,
+ "rx_pkts": 7223952,
+ "time_ms": 1648621386809,
+ "drop_pct": 5073,
+ "total_tx_pps": 722902,
+ "tx_pps": 726608,
+ "tx_pkts": 7229025,
+ "drop_percentage": 0.07017543859649122
+ },
+ {
+ "rx_pps": 653878.4654382298,
+ "rx_pkts": 6497920,
+ "time_ms": 1648621399315,
+ "drop_pct": 691,
+ "total_tx_pps": 649861,
+ "tx_pps": 653948,
+ "tx_pkts": 6498611,
+ "ndr_pps": 290643,
+ "drop_percentage": 0.010633041429930181
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "38389ab0308e45b1a8769cbbff9ef2b2"
+ },
+ "synthesis": {
+ "avg_delay_usec": 108.49992470286192,
+ "total_tx_rate": 577711
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/non-regression/nfvbench-throughput-fs_768-fc_100k-rate_ndr-2.json",
+ "frame_sizes": [
+ "768"
+ ],
+ "rate": "ndr",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/non-regression/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-30 06:25:50",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "42bb799d87974e05a9480378a9074174",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "768"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/non-regression/nfvbench-throughput-fs_768-fc_100k-rate_ndr-1.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "768"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2512,
+ 2517
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/non-regression/nfvbench-throughput-fs_768-fc_100k-rate_ndr-1.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/non-regression/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "768": {
+ "ndr": {
+ "load_percent_per_direction": 6.640625,
+ "timestamp_sec": 1648621693.1637194,
+ "stats": {
+ "total_tx_rate": 523406,
+ "overall": {
+ "rx_pkts": 5234062,
+ "drop_percentage": 1.910561642074236e-05,
+ "drop_pct": 1,
+ "max_delay_usec": 318,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 5234063,
+ "avg_delay_usec": 106.50022525526063,
+ "min_delay_usec": 32,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 2616900,
+ "min_delay_usec": 32,
+ "drop_pct": 0,
+ "max_delay_usec": 273,
+ "tx_pkts": 2617163,
+ "avg_delay_usec": 102,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 2617162,
+ "min_delay_usec": 32,
+ "drop_pct": 1,
+ "max_delay_usec": 318,
+ "tx_pkts": 2616900,
+ "avg_delay_usec": 111,
+ "drop_percentage": 3.821315296725133e-05
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 3299551424.0,
+ "theoretical_tx_rate_pps": 7931472.081218274
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 13.28125,
+ "duration_sec": 10.0,
+ "l2frame_size": "768",
+ "rate_pps": 526698,
+ "rate_bps": 3320312500.0,
+ "time_taken_sec": 137.53268241882324
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 1419133.1802420425,
+ "rx_pkts": 13668934,
+ "time_ms": 1648621568128,
+ "drop_pct": 62726128,
+ "total_tx_pps": 7639506,
+ "tx_pps": 7931472,
+ "tx_pkts": 76395062,
+ "drop_percentage": 82.10756868028983
+ },
+ {
+ "rx_pps": 1499465.703933795,
+ "rx_pkts": 14900941,
+ "time_ms": 1648621580622,
+ "drop_pct": 24508562,
+ "total_tx_pps": 3940950,
+ "tx_pps": 3965736,
+ "tx_pkts": 39409503,
+ "drop_percentage": 62.189472422425624
+ },
+ {
+ "rx_pps": 1746588.0892852556,
+ "rx_pkts": 17356722,
+ "time_ms": 1648621593115,
+ "drop_pct": 2348032,
+ "total_tx_pps": 1970475,
+ "tx_pps": 1982868,
+ "tx_pkts": 19704754,
+ "drop_percentage": 11.916068579186526
+ },
+ {
+ "rx_pps": 991022.0667012471,
+ "rx_pkts": 9849275,
+ "time_ms": 1648621605613,
+ "drop_pct": 4094,
+ "total_tx_pps": 985336,
+ "tx_pps": 991434,
+ "tx_pkts": 9853369,
+ "drop_percentage": 0.0415492406708812
+ },
+ {
+ "rx_pps": 495716.0,
+ "rx_pkts": 4926180,
+ "time_ms": 1648621618110,
+ "drop_pct": 0,
+ "total_tx_pps": 492618,
+ "tx_pps": 495716,
+ "tx_pkts": 4926180,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 743159.3083655083,
+ "rx_pkts": 7385149,
+ "time_ms": 1648621630627,
+ "drop_pct": 4121,
+ "total_tx_pps": 738927,
+ "tx_pps": 743574,
+ "tx_pkts": 7389270,
+ "drop_percentage": 0.05577005577005577
+ },
+ {
+ "rx_pps": 619263.0064059279,
+ "rx_pkts": 6153928,
+ "time_ms": 1648621643143,
+ "drop_pct": 3806,
+ "total_tx_pps": 615773,
+ "tx_pps": 619646,
+ "tx_pkts": 6157734,
+ "drop_percentage": 0.06180845096589102
+ },
+ {
+ "rx_pps": 557594.6752731256,
+ "rx_pkts": 5541656,
+ "time_ms": 1648621655641,
+ "drop_pct": 848,
+ "total_tx_pps": 554250,
+ "tx_pps": 557680,
+ "tx_pkts": 5542504,
+ "drop_percentage": 0.015299943852092844
+ },
+ {
+ "rx_pps": 526697.8993711005,
+ "rx_pkts": 5234062,
+ "time_ms": 1648621668148,
+ "drop_pct": 1,
+ "total_tx_pps": 523406,
+ "tx_pps": 526698,
+ "tx_pkts": 5234063,
+ "drop_percentage": 1.9105616420742355e-05
+ },
+ {
+ "rx_pps": 542111.0142915759,
+ "rx_pkts": 5387774,
+ "time_ms": 1648621680646,
+ "drop_pct": 785,
+ "total_tx_pps": 538855,
+ "tx_pps": 542190,
+ "tx_pkts": 5388559,
+ "drop_percentage": 0.01456790210518248
+ },
+ {
+ "rx_pps": 534373.8016685186,
+ "rx_pkts": 5321028,
+ "time_ms": 1648621693162,
+ "drop_pct": 699,
+ "total_tx_pps": 532172,
+ "tx_pps": 534444,
+ "tx_pkts": 5321727,
+ "ndr_pps": 263349,
+ "drop_percentage": 0.013134833861263458
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "42bb799d87974e05a9480378a9074174"
+ },
+ "synthesis": {
+ "avg_delay_usec": 106.50022525526063,
+ "total_tx_rate": 523406
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/non-regression/nfvbench-throughput-fs_1518-fc_100k-rate_ndr-2.json",
+ "frame_sizes": [
+ "1518"
+ ],
+ "rate": "ndr",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/non-regression/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-30 06:30:43",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "53e4dda50a71447681903270ab2e5a3e",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "1518"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/non-regression/nfvbench-throughput-fs_1518-fc_100k-rate_ndr-0.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "1518"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2512,
+ 2517
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/non-regression/nfvbench-throughput-fs_1518-fc_100k-rate_ndr-0.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/non-regression/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "1518": {
+ "ndr": {
+ "load_percent_per_direction": 12.6953125,
+ "timestamp_sec": 1648621986.5806987,
+ "stats": {
+ "total_tx_rate": 512701,
+ "overall": {
+ "rx_pkts": 5127015,
+ "drop_percentage": 3.900903780892476e-05,
+ "drop_pct": 2,
+ "max_delay_usec": 304,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 5127017,
+ "avg_delay_usec": 148.00000409595057,
+ "min_delay_usec": 34,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 2563507,
+ "min_delay_usec": 34,
+ "drop_pct": 2,
+ "max_delay_usec": 304,
+ "tx_pkts": 2563508,
+ "avg_delay_usec": 127,
+ "drop_percentage": 7.801809083490279e-05
+ },
+ "0": {
+ "rx_pkts": 2563508,
+ "min_delay_usec": 35,
+ "drop_pct": 0,
+ "max_delay_usec": 301,
+ "tx_pkts": 2563509,
+ "avg_delay_usec": 169,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 6308273104.0,
+ "theoretical_tx_rate_pps": 4063719.1157347206
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 25.390625,
+ "duration_sec": 10.0,
+ "l2frame_size": "1518",
+ "rate_pps": 515900,
+ "rate_bps": 6347656250.0,
+ "time_taken_sec": 137.57492327690125
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 1534778.8969990357,
+ "rx_pkts": 15015623,
+ "time_ms": 1648621861490,
+ "drop_pct": 24742063,
+ "total_tx_pps": 3975768,
+ "tx_pps": 4063718,
+ "tx_pkts": 39757686,
+ "drop_percentage": 62.23215053310698
+ },
+ {
+ "rx_pps": 1446228.6489812837,
+ "rx_pkts": 14371898,
+ "time_ms": 1648621874016,
+ "drop_pct": 5819692,
+ "total_tx_pps": 2019159,
+ "tx_pps": 2031858,
+ "tx_pkts": 20191590,
+ "drop_percentage": 28.822356238414113
+ },
+ {
+ "rx_pps": 1015743.6478261326,
+ "rx_pkts": 10093954,
+ "time_ms": 1648621886513,
+ "drop_pct": 1832,
+ "total_tx_pps": 1009578,
+ "tx_pps": 1015928,
+ "tx_pkts": 10095786,
+ "drop_percentage": 0.018146184952811003
+ },
+ {
+ "rx_pps": 507963.59748457576,
+ "rx_pkts": 5047892,
+ "time_ms": 1648621899009,
+ "drop_pct": 4,
+ "total_tx_pps": 504789,
+ "tx_pps": 507964,
+ "tx_pkts": 5047896,
+ "drop_percentage": 7.9240935233214e-05
+ },
+ {
+ "rx_pps": 761669.4717574592,
+ "rx_pkts": 7569092,
+ "time_ms": 1648621911525,
+ "drop_pct": 2748,
+ "total_tx_pps": 757184,
+ "tx_pps": 761946,
+ "tx_pkts": 7571840,
+ "drop_percentage": 0.0362923675090863
+ },
+ {
+ "rx_pps": 634709.9871290971,
+ "rx_pkts": 6308068,
+ "time_ms": 1648621924063,
+ "drop_pct": 2445,
+ "total_tx_pps": 631051,
+ "tx_pps": 634956,
+ "tx_pkts": 6310513,
+ "drop_percentage": 0.038744869077997304
+ },
+ {
+ "rx_pps": 570817.786304882,
+ "rx_pkts": 5672503,
+ "time_ms": 1648621936573,
+ "drop_pct": 6382,
+ "total_tx_pps": 567888,
+ "tx_pps": 571460,
+ "tx_pkts": 5678885,
+ "drop_percentage": 0.11238121567878201
+ },
+ {
+ "rx_pps": 539659.9475749807,
+ "rx_pkts": 5370429,
+ "time_ms": 1648621949076,
+ "drop_pct": 518,
+ "total_tx_pps": 537094,
+ "tx_pps": 539712,
+ "tx_pkts": 5370947,
+ "drop_percentage": 0.009644481690100461
+ },
+ {
+ "rx_pps": 523812.0403582982,
+ "rx_pkts": 5205908,
+ "time_ms": 1648621961578,
+ "drop_pct": 258,
+ "total_tx_pps": 520616,
+ "tx_pps": 523838,
+ "tx_pkts": 5206166,
+ "drop_percentage": 0.004955662189795715
+ },
+ {
+ "rx_pps": 515899.79875237396,
+ "rx_pkts": 5127015,
+ "time_ms": 1648621974085,
+ "drop_pct": 2,
+ "total_tx_pps": 512701,
+ "tx_pps": 515900,
+ "tx_pkts": 5127017,
+ "drop_percentage": 3.900903780892476e-05
+ },
+ {
+ "rx_pps": 519853.3979002963,
+ "rx_pkts": 5166564,
+ "time_ms": 1648621986579,
+ "drop_pct": 165,
+ "total_tx_pps": 516672,
+ "tx_pps": 519870,
+ "tx_pkts": 5166729,
+ "ndr_pps": 257950,
+ "drop_percentage": 0.003193509858945573
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "53e4dda50a71447681903270ab2e5a3e"
+ },
+ "synthesis": {
+ "avg_delay_usec": 148.00000409595057,
+ "total_tx_rate": 512701
+ }
+ },
+ {
+ "input": {
+ "duration_sec": "10",
+ "flavor_type": "nfvbench.loop.basic",
+ "json": "/var/lib/xtesting/results/non-regression/nfvbench-throughput-fs_9000-fc_100k-rate_ndr-2.json",
+ "frame_sizes": [
+ "9000"
+ ],
+ "rate": "ndr",
+ "flow_count": "100k",
+ "log_file": "/var/lib/xtesting/results/non-regression/nfvbench.log",
+ "user_label": "amical_tc12_basic"
+ },
+ "output": {
+ "status": "OK",
+ "result": {
+ "date": "2022-03-30 06:42:59",
+ "nfvbench_version": "5.0.4.dev29",
+ "config": {
+ "compute_nodes": null,
+ "traffic_generator": {
+ "mac_addrs_left": null,
+ "gateway_ip_addrs": [
+ "192.168.30.2",
+ "192.168.31.2"
+ ],
+ "mac_addrs_right": null,
+ "default_profile": "trex-local",
+ "src_vteps": null,
+ "generator_profile": [
+ {
+ "intf_speed": null,
+ "name": "trex-local",
+ "ip": "127.0.0.1",
+ "zmq_rpc_port": 4501,
+ "tool": "TRex",
+ "platform": {
+ "master_thread_id": "0",
+ "latency_thread_id": "1",
+ "dual_if": [
+ {
+ "threads": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "socket": 0
+ }
+ ]
+ },
+ "zmq_pub_port": 4500,
+ "interfaces": [
+ {
+ "switch": null,
+ "pci": "0000:00:05.0",
+ "port": 0
+ },
+ {
+ "switch": null,
+ "pci": "0000:00:06.0",
+ "port": 1
+ }
+ ],
+ "cores": 5,
+ "software_mode": false
+ }
+ ],
+ "vtep_gateway_ips": null,
+ "tg_gateway_ip_addrs_step": "0.0.0.1",
+ "udp_port_step": "1",
+ "udp_src_port": [
+ "49152",
+ "49168"
+ ],
+ "gateway_ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_addrs": [
+ "192.168.30.1",
+ "192.168.31.1"
+ ],
+ "ip_addrs": [
+ "198.18.0.0/16",
+ "198.19.0.0/16"
+ ],
+ "ip_src_static": true,
+ "host_name": "nfvbench_tg",
+ "ip_addrs_step": "0.0.0.1",
+ "tg_gateway_ip_cidrs": [
+ "192.168.1.0/24",
+ "192.168.2.0/24"
+ ],
+ "dst_vtep": null,
+ "vtep_vlan": null,
+ "udp_dst_port": [
+ "49152",
+ "49168"
+ ]
+ },
+ "availability_zone": "nova",
+ "vif_multiqueue_size": 8,
+ "periodic_gratuitous_arp": false,
+ "flavor": {
+ "vcpus": 2,
+ "disk": 0,
+ "extra_specs": {
+ "hw:cpu_policy": "dedicated",
+ "hw:mem_page_size": "large"
+ },
+ "ram": 4096
+ },
+ "floating_network": {
+ "subnet": "nfvbench-floating-subnet",
+ "name": "nfvbench-floating-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "network_type": "vlan"
+ },
+ "user_info": null,
+ "service_chain": "PVP",
+ "sriov": false,
+ "vxlan": false,
+ "intf_speed_detected": 25000000000.0,
+ "pause_sec": 2.0,
+ "internal_networks": {
+ "middle": {
+ "subnet": "nfvbench-msubnet",
+ "name": "nfvbench-mnet",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.3.0/24",
+ "network_type": "vlan"
+ },
+ "right": {
+ "subnet": "subnet_nfvbench_vn2bis",
+ "name": "net_nfvbench_vn2bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.31.0/24",
+ "network_type": "vlan"
+ },
+ "left": {
+ "subnet": "subnet_nfvbench_vn1bis",
+ "name": "net_nfvbench_vn1bis",
+ "segmentation_id": null,
+ "physical_network": null,
+ "mpls_transport_labels": null,
+ "cidr": "192.168.30.0/24",
+ "network_type": "vlan"
+ }
+ },
+ "no_vswitch_access": false,
+ "traffic": {
+ "bidirectional": true,
+ "profile": "custom_traffic_profile"
+ },
+ "restart": false,
+ "vm_image_file": "nfvbenchvm-0.15.0901.qcow2",
+ "name": "nfvbench.conf",
+ "std_json": null,
+ "l2_loopback": false,
+ "request_id": "f621b77faf384c08b3fcb9b6a3ec9523",
+ "debug": false,
+ "group_id": null,
+ "loop_vm_name": "nfvbench-loop-vm",
+ "check_traffic_time_sec": 200,
+ "num_mbufs": 128000,
+ "rate": "ndr",
+ "service_chain_count": 1,
+ "service_chain_shared_net": true,
+ "measurement": {
+ "NDR": 0.001,
+ "PDR": 0.1,
+ "load_epsilon": 0.1
+ },
+ "l3_router": false,
+ "debug_mask": 0,
+ "factory_class": "BasicFactory",
+ "tg-tool": "TRex",
+ "frame_sizes": [
+ "9000"
+ ],
+ "service_mode": false,
+ "edge_networks": {
+ "right": {
+ "subnet": "nfvbench-subnet3",
+ "name": "nfvbench-net3",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.4.0/24",
+ "router_name": "router_right",
+ "gateway": null
+ },
+ "left": {
+ "subnet": "nfvbench-subnet2",
+ "name": "nfvbench-net2",
+ "segmentation_id": null,
+ "network_type": null,
+ "physical_network": null,
+ "cidr": "192.168.3.0/24",
+ "router_name": "router_left",
+ "gateway": null
+ }
+ },
+ "ndr_run": true,
+ "use_management_port": false,
+ "hypervisor_hostname": "localdomain",
+ "cache_size": 16,
+ "pdr_run": false,
+ "vlan_tagging": false,
+ "fluentd": [
+ {
+ "ip": "172.20.73.203",
+ "result_tag": "nfvbench.results.amical",
+ "logging_tag": "nfvbench.logs.amical",
+ "port": 25225
+ }
+ ],
+ "use_floating_ip": false,
+ "flow_count": 100000,
+ "loop_vm_arp": false,
+ "user_id": null,
+ "openrc_file": null,
+ "disable_hdrh": false,
+ "json": "/var/lib/xtesting/results/non-regression/nfvbench-throughput-fs_9000-fc_100k-rate_ndr-2.json",
+ "vm_forwarder": "vpp",
+ "factory_module": "nfvbench.factory",
+ "no_latency_streams": false,
+ "single_run": false,
+ "no_arp": false,
+ "cores_used": 5,
+ "traffic_profile": [
+ {
+ "l2frame_size": [
+ "9000"
+ ],
+ "name": "custom_traffic_profile"
+ }
+ ],
+ "vlans": [
+ 2512,
+ 2517
+ ],
+ "tg-name": "trex-local",
+ "management_network": {
+ "subnet": "nfvbench-management-subnet",
+ "name": "nfvbench-management-net",
+ "segmentation_id": null,
+ "network_type": "vlan",
+ "physical_network": null,
+ "cidr": "192.168.0.0/24",
+ "gateway": "192.168.0.254"
+ },
+ "no_traffic": false,
+ "mpls": false,
+ "duration_sec": 10.0,
+ "clouds_detail": "openstack",
+ "mbuf_64": null,
+ "generic_poll_sec": 2,
+ "idle_interfaces_per_vm": 0,
+ "no_flow_stats": true,
+ "lat_percentiles": [
+ 25,
+ 75,
+ 99
+ ],
+ "no_cleanup": true,
+ "no_e2e_check": false,
+ "intf_speed_used": 25000000000.0,
+ "generator_profile": "trex-local",
+ "mbuf_factor": 0.2,
+ "user_label": "amical_tc12_basic",
+ "intf_speed": null,
+ "generic_retry_count": 100,
+ "flavor_type": "nfvbench.loop.basic",
+ "use_sriov_middle_net": false,
+ "json_file": "/var/lib/xtesting/results/non-regression/nfvbench-throughput-fs_9000-fc_100k-rate_ndr-2.json",
+ "std_json_path": null,
+ "unidir_reverse_traffic_pps": 1,
+ "i40e_mixed": "ignore",
+ "gratuitous_arp_pps": 1,
+ "idle_networks": {
+ "subnet": "nfvbench-idle-subnet",
+ "name": "nfvbench-idle-net",
+ "segmentation_id": null,
+ "physical_network": null,
+ "cidr": "192.169.1.0/24",
+ "network_type": "vlan"
+ },
+ "interval_sec": 10.0,
+ "no_latency_stats": false,
+ "cores": null,
+ "log_file": "/var/lib/xtesting/results/non-regression/nfvbench.log",
+ "external_networks": {
+ "right": null,
+ "left": null
+ }
+ },
+ "benchmarks": {
+ "network": {
+ "service_chain": {
+ "PVP": {
+ "result": {
+ "compute_nodes": {},
+ "profile": "custom_traffic_profile",
+ "service_chain_count": 1,
+ "result": {
+ "9000": {
+ "ndr": {
+ "load_percent_per_direction": 39.84375,
+ "timestamp_sec": 1648622722.125216,
+ "stats": {
+ "total_tx_rate": 274380,
+ "overall": {
+ "rx_pkts": 2743802,
+ "drop_percentage": 0.0,
+ "drop_pct": 0,
+ "max_delay_usec": 1244,
+ "lat_percentile": {
+ "99": "n/a",
+ "25": "n/a",
+ "75": "n/a"
+ },
+ "tx_pkts": 2743802,
+ "avg_delay_usec": 641.5002263282846,
+ "min_delay_usec": 72,
+ "hdrh": "HISTFAAAABt4nJNpmSzMgADMUJoRTM6Y1mD/ASIAAEr9BCg="
+ },
+ "1": {
+ "rx_pkts": 1371832,
+ "min_delay_usec": 74,
+ "drop_pct": 0,
+ "max_delay_usec": 1244,
+ "tx_pkts": 1371970,
+ "avg_delay_usec": 637,
+ "drop_percentage": 0.0
+ },
+ "0": {
+ "rx_pkts": 1371970,
+ "min_delay_usec": 72,
+ "drop_pct": 0,
+ "max_delay_usec": 1235,
+ "tx_pkts": 1371832,
+ "avg_delay_usec": 646,
+ "drop_percentage": 0.0
+ },
+ "theoretical_tx_rate_bps": 50000000000.0,
+ "offered_tx_rate_bps": 19799260800.0,
+ "theoretical_tx_rate_pps": 692904.6563192905
+ },
+ "initial_rate_type": "rate_percent",
+ "rate_percent": 79.6875,
+ "duration_sec": 10.0,
+ "l2frame_size": "9000",
+ "rate_pps": 276078,
+ "rate_bps": 19921875000.0,
+ "time_taken_sec": 137.65054941177368
+ },
+ "iteration_stats": {
+ "ndr_pdr": [
+ {
+ "rx_pps": 273698.46051110676,
+ "rx_pkts": 2718128,
+ "time_ms": 1648622596961,
+ "drop_pct": 4163174,
+ "total_tx_pps": 688130,
+ "tx_pps": 692904,
+ "tx_pkts": 6881302,
+ "drop_percentage": 60.49980076444836
+ },
+ {
+ "rx_pps": 276582.23920405895,
+ "rx_pkts": 2748537,
+ "time_ms": 1648622609474,
+ "drop_pct": 694331,
+ "total_tx_pps": 344286,
+ "tx_pps": 346452,
+ "tx_pkts": 3442868,
+ "drop_percentage": 20.167226858537706
+ },
+ {
+ "rx_pps": 173226.0,
+ "rx_pkts": 1721434,
+ "time_ms": 1648622622000,
+ "drop_pct": 0,
+ "total_tx_pps": 172143,
+ "tx_pps": 173226,
+ "tx_pkts": 1721434,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 259838.0,
+ "rx_pkts": 2582143,
+ "time_ms": 1648622634517,
+ "drop_pct": 0,
+ "total_tx_pps": 258214,
+ "tx_pps": 259838,
+ "tx_pkts": 2582143,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 276973.17842007434,
+ "rx_pkts": 2752701,
+ "time_ms": 1648622647105,
+ "drop_pct": 260099,
+ "total_tx_pps": 301280,
+ "tx_pps": 303144,
+ "tx_pkts": 3012800,
+ "drop_percentage": 8.633131970260223
+ },
+ {
+ "rx_pps": 276794.44570930133,
+ "rx_pkts": 2750648,
+ "time_ms": 1648622659614,
+ "drop_pct": 46682,
+ "total_tx_pps": 279733,
+ "tx_pps": 281492,
+ "tx_pkts": 2797330,
+ "drop_percentage": 1.6688056110648368
+ },
+ {
+ "rx_pps": 270664.0,
+ "rx_pkts": 2694191,
+ "time_ms": 1648622672130,
+ "drop_pct": 0,
+ "total_tx_pps": 269419,
+ "tx_pps": 270664,
+ "tx_pkts": 2694191,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 276078.0,
+ "rx_pkts": 2743802,
+ "time_ms": 1648622684633,
+ "drop_pct": 0,
+ "total_tx_pps": 274380,
+ "tx_pps": 276078,
+ "tx_pkts": 2743802,
+ "drop_percentage": 0.0
+ },
+ {
+ "rx_pps": 276955.355288579,
+ "rx_pkts": 2752523,
+ "time_ms": 1648622697132,
+ "drop_pct": 18174,
+ "total_tx_pps": 277069,
+ "tx_pps": 278784,
+ "tx_pkts": 2770697,
+ "drop_percentage": 0.6559360334240807
+ },
+ {
+ "rx_pps": 276409.30910346564,
+ "rx_pkts": 2746820,
+ "time_ms": 1648622709624,
+ "drop_pct": 10163,
+ "total_tx_pps": 275698,
+ "tx_pps": 277432,
+ "tx_pkts": 2756983,
+ "drop_percentage": 0.3686275903768721
+ },
+ {
+ "rx_pps": 276744.94431529724,
+ "rx_pkts": 2750432,
+ "time_ms": 1648622722124,
+ "drop_pct": 90,
+ "total_tx_pps": 275052,
+ "tx_pps": 276754,
+ "tx_pkts": 2750522,
+ "ndr_pps": 138039,
+ "drop_percentage": 0.003272106167483845
+ }
+ ]
+ }
+ }
+ },
+ "flow_count": 100000,
+ "bidirectional": true
+ }
+ }
+ },
+ "versions": {
+ "Traffic_Generator": {
+ "build_date": "Apr 14 2021",
+ "version": "v2.89",
+ "built_by": "hhaim",
+ "mode": "STL",
+ "build_time": "11:22:15"
+ }
+ }
+ }
+ }
+ },
+ "request_id": "f621b77faf384c08b3fcb9b6a3ec9523"
+ },
+ "synthesis": {
+ "avg_delay_usec": 641.5002263282846,
+ "total_tx_rate": 274380
+ }
+ }
+ ]
+ },
+ "fail_tests": 0,
+ "total_tests": 1,
+ "pass_tests": 1
+ }
+ }
+ ]
+}
diff --git a/test/ut_behave_tests/test_steps.py b/test/ut_behave_tests/test_steps.py
new file mode 100644
index 0000000..ae6df45
--- /dev/null
+++ b/test/ut_behave_tests/test_steps.py
@@ -0,0 +1,151 @@
+#!/usr/bin/env python
+# Copyright 2022 Orange
+#
+# 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.
+#
+
+"""
+Unit tests for some of the functions found in behave_tests/features/steps/steps.py
+"""
+
+import logging
+import unittest
+from unittest.mock import call, Mock, patch
+
+from behave_tests.features.steps.steps import get_last_result
+from .test_utils import setup_logging, stub_requests_get
+
+
+def setUpModule():
+ setup_logging()
+
+
+class TestGetLastResult(unittest.TestCase):
+ def setUp(self):
+ # Mock requests.get() so that TestAPI results come from JSON files
+ # found in test_data/ directory.
+ patcher = patch('behave_tests.features.steps.testapi.requests')
+ self._mock_requests = patcher.start()
+ self._mock_requests.get.side_effect = stub_requests_get
+ self.addCleanup(patcher.stop)
+
+ # Setup a mock for behave context
+ self._context = Mock()
+ self._context.data = {
+ 'PROJECT_NAME': "nfvbench",
+ 'TEST_DB_URL': "http://127.0.0.1:8000/api/v1/results"
+ }
+ self._context.logger = logging.getLogger("behave_tests")
+
+ def test_get_last_result_throughput_characterization(self):
+ self._context.json = {
+ "frame_sizes": ['64'],
+ "flow_count": "100k",
+ "duration_sec": '10',
+ "rate": "ndr",
+ "user_label": "amical_tc18_loopback"
+ }
+ self._context.tag = "throughput"
+
+ last_result = get_last_result(self._context, reference=True)
+
+ self.assertIsNotNone(last_result)
+ self.assertEqual(16765582, last_result["synthesis"]["total_tx_rate"])
+ self.assertEqual(25, round(last_result["synthesis"]["avg_delay_usec"]))
+
+ self._mock_requests.get.assert_called_once_with(
+ "http://127.0.0.1:8000/api/v1/results?"
+ "project=nfvbench&case=characterization&criteria=PASS&page=1")
+
+ def test_get_last_result_latency_characterization(self):
+ self._context.json = {
+ "frame_sizes": ['768'],
+ "flow_count": "100k",
+ "duration_sec": '10',
+ "rate": "90%",
+ "user_label": "amical_tc6_intensive"
+ }
+ self._context.tag = "latency"
+
+ last_result = get_last_result(self._context, reference=True)
+
+ self.assertIsNotNone(last_result)
+ self.assertEqual(262275, last_result["synthesis"]["total_tx_rate"])
+ self.assertEqual(353, round(last_result["synthesis"]["avg_delay_usec"]))
+
+ self._mock_requests.get.assert_has_calls([
+ call("http://127.0.0.1:8000/api/v1/results?"
+ "project=nfvbench&case=characterization&criteria=PASS&page=1"),
+ call("http://127.0.0.1:8000/api/v1/results?"
+ "project=nfvbench&case=characterization&criteria=PASS&page=2")])
+
+ def test_last_result_not_found(self):
+ self._context.json = {
+ "frame_sizes": ['64'],
+ "flow_count": "100k",
+ "duration_sec": '10',
+ "rate": "ndr",
+ "user_label": "toto_titi_tata" # User label not in test data
+ }
+ self._context.tag = "throughput"
+
+ with self.assertRaises(AssertionError):
+ get_last_result(self._context, reference=True)
+
+ self._mock_requests.get.assert_has_calls([
+ call("http://127.0.0.1:8000/api/v1/results?"
+ "project=nfvbench&case=characterization&criteria=PASS&page=1"),
+ call("http://127.0.0.1:8000/api/v1/results?"
+ "project=nfvbench&case=characterization&criteria=PASS&page=2")])
+
+ def test_get_last_result_throughput_non_regression(self):
+ self._context.CASE_NAME = "non-regression"
+ self._context.json = {
+ "frame_sizes": ['1518'],
+ "flow_count": "100k",
+ "duration_sec": '10',
+ "rate": "ndr",
+ "user_label": "amical_tc12_basic"
+ }
+ self._context.tag = "throughput"
+
+ last_result = get_last_result(self._context)
+
+ self.assertIsNotNone(last_result)
+ self.assertEqual(512701, last_result["synthesis"]["total_tx_rate"])
+ self.assertEqual(148, round(last_result["synthesis"]["avg_delay_usec"]))
+
+ self._mock_requests.get.assert_called_once_with(
+ "http://127.0.0.1:8000/api/v1/results?"
+ "project=nfvbench&case=non-regression&criteria=PASS&page=1")
+
+ def test_get_last_result_latency_non_regression(self):
+ self._context.CASE_NAME = "non-regression"
+ self._context.json = {
+ "frame_sizes": ['1518'],
+ "flow_count": "100k",
+ "duration_sec": '10',
+ "rate": "70%",
+ "user_label": "amical_tc12_basic"
+ }
+ self._context.tag = "latency"
+
+ last_result = get_last_result(self._context)
+
+ self.assertIsNotNone(last_result)
+ self.assertEqual(352040, last_result["synthesis"]["total_tx_rate"])
+ self.assertEqual(114, round(last_result["synthesis"]["avg_delay_usec"]))
+
+ self._mock_requests.get.assert_called_once_with(
+ "http://127.0.0.1:8000/api/v1/results?"
+ "project=nfvbench&case=non-regression&criteria=PASS&page=1")
diff --git a/test/ut_behave_tests/test_testapi.py b/test/ut_behave_tests/test_testapi.py
new file mode 100644
index 0000000..0fbcd96
--- /dev/null
+++ b/test/ut_behave_tests/test_testapi.py
@@ -0,0 +1,132 @@
+#!/usr/bin/env python
+# Copyright 2022 Orange
+#
+# 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.
+#
+
+"""
+Unit tests for the testapi module found in behave_tests/features/steps.
+"""
+
+import unittest
+from unittest.mock import call, patch
+
+from behave_tests.features.steps.testapi import TestapiClient
+from .test_utils import setup_logging, stub_requests_get
+
+
+def setUpModule():
+ setup_logging(log_filename="ut_behave_tests_testapi.log")
+
+
+class TestTestapiClient(unittest.TestCase):
+ def setUp(self):
+ patcher = patch('behave_tests.features.steps.testapi.requests')
+ self.mock_requests = patcher.start()
+ self.mock_requests.get.side_effect = stub_requests_get
+ self.addCleanup(patcher.stop)
+
+ def test_find_characterization_throughput_on_page_1(self):
+ client = TestapiClient("http://127.0.0.1:8000/api/v1/results")
+ testapi_params = {"project_name": "nfvbench", "case_name": "characterization"}
+ nfvbench_test_input = {"frame_sizes": ['64'],
+ "flow_count": "100k",
+ "duration_sec": '10',
+ "rate": "ndr",
+ "user_label": "amical_tc18_loopback"}
+ last_result = client.find_last_result(testapi_params,
+ scenario_tag="throughput",
+ nfvbench_test_input=nfvbench_test_input)
+ self.assertIsNotNone(last_result)
+ self.assertEqual(16765582, last_result["synthesis"]["total_tx_rate"])
+ self.assertEqual(25, round(last_result["synthesis"]["avg_delay_usec"]))
+
+ self.mock_requests.get.assert_called_once_with(
+ "http://127.0.0.1:8000/api/v1/results?"
+ "project=nfvbench&case=characterization&criteria=PASS&page=1")
+
+ def test_find_characterization_latency_on_page_2(self):
+ client = TestapiClient("http://127.0.0.1:8000/api/v1/results")
+ testapi_params = {"project_name": "nfvbench", "case_name": "characterization"}
+ nfvbench_test_input = {"frame_sizes": ['768'],
+ "flow_count": "100k",
+ "duration_sec": '10',
+ "rate": "90%",
+ "user_label": "amical_tc6_intensive"}
+ last_result = client.find_last_result(testapi_params,
+ scenario_tag="latency",
+ nfvbench_test_input=nfvbench_test_input)
+ self.assertIsNotNone(last_result)
+ self.assertEqual(262275, last_result["synthesis"]["total_tx_rate"])
+ self.assertEqual(353, round(last_result["synthesis"]["avg_delay_usec"]))
+
+ self.mock_requests.get.assert_has_calls([
+ call("http://127.0.0.1:8000/api/v1/results?"
+ "project=nfvbench&case=characterization&criteria=PASS&page=1"),
+ call("http://127.0.0.1:8000/api/v1/results?"
+ "project=nfvbench&case=characterization&criteria=PASS&page=2")])
+
+ def test_no_result_found(self):
+ client = TestapiClient("http://127.0.0.1:8000/api/v1/results")
+ testapi_params = {"project_name": "nfvbench", "case_name": "characterization"}
+ nfvbench_test_input = {"frame_sizes": ['768'],
+ "flow_count": "100k",
+ "duration_sec": '10',
+ "rate": "90%",
+ "user_label": "toto_titi_tata"} # User label not in test data
+ last_result = client.find_last_result(testapi_params,
+ scenario_tag="throughput",
+ nfvbench_test_input=nfvbench_test_input)
+ self.assertIsNone(last_result)
+
+ self.mock_requests.get.assert_has_calls([
+ call("http://127.0.0.1:8000/api/v1/results?"
+ "project=nfvbench&case=characterization&criteria=PASS&page=1"),
+ call("http://127.0.0.1:8000/api/v1/results?"
+ "project=nfvbench&case=characterization&criteria=PASS&page=2")])
+
+ def test_requests_errors(self):
+ """Check that an exception is raised in case of problem with requests."""
+ client = TestapiClient("http://127.0.0.1:8000/api/v1/results")
+ testapi_params = {"project_name": "foo", # non-existent project
+ "case_name": "characterization"}
+ nfvbench_test_input = {"frame_sizes": ['768'],
+ "flow_count": "100k",
+ "duration_sec": '10',
+ "rate": "90%",
+ "user_label": "amical_tc6_intensive"}
+
+ with self.assertRaises(ValueError):
+ client.find_last_result(testapi_params, scenario_tag="throughput",
+ nfvbench_test_input=nfvbench_test_input)
+
+ def test_flavor_is_ignored(self):
+ """Check that lookup in TestAPI does not filter on the flavor_type."""
+ client = TestapiClient("http://127.0.0.1:8000/api/v1/results")
+ testapi_params = {"project_name": "nfvbench", "case_name": "characterization"}
+ nfvbench_test_input = {"frame_sizes": ['64'],
+ "flow_count": "100k",
+ "duration_sec": '10',
+ "rate": "ndr",
+ "user_label": "amical_tc18_loopback",
+ "flavor_type": "no_such_flavor"}
+ last_result = client.find_last_result(testapi_params,
+ scenario_tag="throughput",
+ nfvbench_test_input=nfvbench_test_input)
+ self.assertIsNotNone(last_result)
+ self.assertEqual(16765582, last_result["synthesis"]["total_tx_rate"])
+ self.assertEqual(25, round(last_result["synthesis"]["avg_delay_usec"]))
+
+ self.mock_requests.get.assert_called_once_with(
+ "http://127.0.0.1:8000/api/v1/results?"
+ "project=nfvbench&case=characterization&criteria=PASS&page=1")
diff --git a/test/ut_behave_tests/test_utils.py b/test/ut_behave_tests/test_utils.py
new file mode 100644
index 0000000..0d06707
--- /dev/null
+++ b/test/ut_behave_tests/test_utils.py
@@ -0,0 +1,119 @@
+#!/usr/bin/env python
+# Copyright 2022 Orange
+#
+# 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.
+#
+
+"""
+Utility functions for unit tests.
+"""
+
+import json
+import logging
+import pathlib
+import unittest
+from unittest.mock import Mock
+
+
+# -----------------------------------------------------------------------------------------
+# Logging helpers
+# -----------------------------------------------------------------------------------------
+
+def setup_logging(log_filename="ut_behave_tests.log", *, log_to_console=False):
+ """Setup logging for unit tests.
+
+ Principles:
+ - re-use the global "behave_tests" logger
+ - if `log_to_console` is True, log messages up to INFO level to the console
+ (can be useful when running tests with unittest instead of pytest)
+ - if `log_filename` is provided, log messages up to DEBUG level to the log file
+ """
+ logger = logging.getLogger("behave_tests")
+ logger.setLevel(logging.DEBUG)
+ formatter = logging.Formatter("%(levelname)s:%(filename)s:%(lineno)s: %(message)s")
+
+ # Configure logging to the console
+ if log_to_console:
+ ch = logging.StreamHandler()
+ ch.setLevel(logging.INFO)
+ ch.setFormatter(formatter)
+ logger.addHandler(ch)
+
+ # Configure logging to the log file
+ if log_filename is not None:
+ fh = logging.FileHandler(filename=log_filename, mode='w')
+ fh.setLevel(logging.DEBUG)
+ fh.setFormatter(formatter)
+ logger.addHandler(fh)
+
+ return logger
+
+
+# -----------------------------------------------------------------------------------------
+# Test data helpers
+# -----------------------------------------------------------------------------------------
+
+def get_test_data_dir() -> pathlib.Path:
+ """Get absolute path of the test_data/ dir.
+
+ We need this because the unit tests can be run from different locations
+ depending on the context (tox, development, ...)
+ """
+ return pathlib.Path(__file__).parent / 'test_data'
+
+
+def stub_requests_get(testapi_url):
+ """Mock a request to TestAPI results database.
+
+ Instead of doing a real request, build a filename from the URL suffix, find
+ the file in the `test_data` directory and return the contents of the file.
+
+ Args:
+ testapi_url: a URL starting with `http://127.0.0.1:8000/api/v1/results?`
+ and followed by the results file name without extension.
+
+ Returns:
+ A mock of a `requests.Response` object with the attributes `text` and
+ `status_code` and the method `json()`.
+ """
+ response = Mock()
+ filename_prefix = testapi_url.replace('http://127.0.0.1:8000/api/v1/results?', '')
+ if filename_prefix == testapi_url:
+ raise ValueError("For unit tests, TestAPI URL must start with "
+ "http://127.0.0.1:8000/api/v1/results?")
+ page_filename = get_test_data_dir() / (filename_prefix + ".json")
+ try:
+ with open(page_filename, 'r', encoding='utf-8') as results:
+ response.text = results.read()
+ response.json = lambda: json.loads(response.text)
+ response.status_code = 200
+ return response
+ except FileNotFoundError as e:
+ logging.getLogger("behave_tests").exception(e)
+ raise ValueError(f"No test data available for TestAPI URL: {testapi_url}") from e
+
+
+class TestStubRequestsGet(unittest.TestCase):
+ def test_valid_url(self):
+ response = stub_requests_get("http://127.0.0.1:8000/api/v1/results?"
+ "project=nfvbench&case=characterization&criteria=PASS&page=1")
+ self.assertEqual(200, response.status_code)
+ self.assertEqual("nfvbench", response.json()["results"][0]["project_name"])
+
+ def test_bad_prefix(self):
+ with self.assertRaises(ValueError):
+ stub_requests_get("http://no.way/api/v1/results?" "dummy_suffix")
+
+ def test_file_not_found(self):
+ with self.assertRaises(ValueError):
+ stub_requests_get("http://127.0.0.1:8000/api/v1/results?" "dummy_suffix")
diff --git a/tox.ini b/tox.ini
index 5aa8997..9b4d218 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,6 +1,6 @@
[tox]
minversion = 1.6
-envlist = py27,pep8, lint
+envlist = py38,pep8,lint,docs,docs-linkcheck
skipsdist = True
[testenv]
@@ -8,38 +8,77 @@ usedevelop = True
install_command = pip install -U {opts} {packages}
setenv =
VIRTUAL_ENV={envdir}
-deps = -r{toxinidir}/requirements.txt
- -r{toxinidir}/test-requirements.txt
-commands = py.test -q --basetemp={envtmpdir} {posargs}
+deps =
+ -chttps://opendev.org/openstack/requirements/raw/branch/stable/yoga/upper-constraints.txt
+ -r{toxinidir}/requirements.txt
+ -r{toxinidir}/test-requirements.txt
+commands = py.test -q --basetemp={envtmpdir} {posargs} test/
[testenv:pep8]
+basepython = python3.8
+skip_install = True
commands = flake8 {toxinidir}
[testenv:lint]
+basepython = python3.8
+skip_install = True
commands = pylint --rcfile pylint.rc nfvbench test
-[testenv:venv]
-commands = {posargs}
-
-[testenv:cover]
-commands = python setup.py testr --coverage --testr-args='{posargs}'
-
-[testenv:docs]
-commands = python setup.py build_sphinx
-
[flake8]
# H803 skipped on purpose per list discussion.
# E123, E125 skipped as they are invalid PEP-8.
+# E117,E126,E127,E128,E211,E226,E231,E252,E305,E731,W503,W504 skipped as they
+# are introduced by newer versions of flake8 (update from 2.2.4 to 3.9.2)
+# H216,H301,H401 skipped as they are introduced by newer version of hacking
+# (update from 0.10.3 to 4.1.0)
max-line-length = 100
show-source = True
+#E117: over-indented (comment)
+#E126: continuation line over-indented for hanging indent
+#E127: continuation line over-indented for visual indent
+#E128: continuation line under-indented for visual indent
+#E211: whitespace before '('
+#E226: missing whitespace around arithmetic operator
+#E231: missing whitespace after ','
+#E252: missing whitespace around parameter equals
#E302: expected 2 blank linee
#E303: too many blank lines (2)
+#E305: expected 2 blank lines after class or function definition, found 1
+#E731: do not assign a lambda expression, use a def
+#W503: line break before binary operator
+#W504: line break after binary operator
+#H101: Use TODO(NAME)
+#H216: The unittest.mock module should be used rather than the third party mock package unless actually needed. If so, disable the H216 check in hacking config and ensure mock is declared in the project's requirements.
#H233: Python 3.x incompatible use of print operator
#H236: Python 3.x incompatible __metaclass__, use six.add_metaclass()
+#H301: one import per line
#H302: import only modules.
+#H304: No relative imports
+#H306: imports not in alphabetical order
+#H401: docstring should not start with a space
#H404: multi line docstring should start without a leading new line
#H405: multi line docstring summary not separated with an empty line
#H904: Wrap long lines in parentheses instead of a backslash
-ignore = E123,E125,H803,E302,E303,H104,H233,H236,H302,H404,H405,H904
+ignore = E117,E123,E125,E126,E127,E128,E211,E226,E231,E252,E302,E303,E305,E731,W503,W504,H101,H104,H216,H233,H236,H301,H302,H304,H306,H401,H404,H405,H803,H904,D102,D100,D107
builtins = _
-exclude=venv,.git,.tox,dist,doc,*openstack/common*,*lib/python*,*egg,build,dib-venv
+exclude=venv,.git,.tox,dist,doc,*openstack/common*,*lib/python*,*egg,build,nfvbenchvm
+
+[testenv:docs]
+basepython = python3.8
+deps =
+ -chttps://opendev.org/openstack/requirements/raw/branch/stable/yoga/upper-constraints.txt
+ -rdocs/requirements.txt
+skip_install = True
+commands =
+ sphinx-build -b html -n -d {envtmpdir}/doctrees ./docs/ {toxinidir}/docs/_build/html
+ echo "Generated docs available in {toxinidir}/docs/_build/html"
+whitelist_externals = echo
+
+[testenv:docs-linkcheck]
+basepython = python3.8
+deps =
+ -chttps://opendev.org/openstack/requirements/raw/branch/stable/yoga/upper-constraints.txt
+ -rdocs/requirements.txt
+skip_install = True
+passenv = http_proxy https_proxy no_proxy
+commands = sphinx-build -b linkcheck -d {envtmpdir}/doctrees ./docs/ {toxinidir}/docs/_build/linkcheck
diff --git a/xtesting/ansible/host_vars/127.0.0.1 b/xtesting/ansible/host_vars/127.0.0.1
new file mode 100644
index 0000000..52d44a6
--- /dev/null
+++ b/xtesting/ansible/host_vars/127.0.0.1
@@ -0,0 +1,10 @@
+docker_args:
+ env: {}
+ params:
+ net: host
+ privileged: true
+ volumes:
+ - /lib/modules/$(uname -r):/lib/modules/$(uname -r)
+ - /usr/src/kernels:/usr/src/kernels -v /dev:/dev
+ - /home/opnfv/nfvbench/config:/etc/nfvbench
+ - /home/opnfv/nfvbench/results:/var/lib/xtesting/results
diff --git a/xtesting/ansible/site.yml b/xtesting/ansible/site.yml
new file mode 100644
index 0000000..37fa6c3
--- /dev/null
+++ b/xtesting/ansible/site.yml
@@ -0,0 +1,22 @@
+---
+- hosts:
+ - 127.0.0.1
+ roles:
+ - role: collivier.xtesting
+ project: nfvbench
+ gerrit_project: nfvbench
+ builds:
+ steps:
+ - name: build opnfv/nfvbench
+ containers:
+ - name: nfvbench
+ ref_arg: BRANCH
+ path: docker
+ suites:
+ - container: nfvbench
+ tests:
+ - 10kpps-pvp-run
+ - characterization
+ - non-regression
+ properties:
+ execution-type: SEQUENTIALLY \ No newline at end of file
diff --git a/xtesting/testcases.yaml b/xtesting/testcases.yaml
new file mode 100644
index 0000000..03579b7
--- /dev/null
+++ b/xtesting/testcases.yaml
@@ -0,0 +1,101 @@
+---
+tiers:
+ -
+ name: nfvbench
+ order: 1
+ description: 'Data Plane Performance Testing'
+ testcases:
+ -
+ case_name: characterization
+ project_name: nfvbench
+ criteria: 100
+ blocking: true
+ clean_flag: false
+ description: ''
+ run:
+ name: 'nfvbench_behaveframework'
+ args:
+ suites:
+ - /opt/nfvbench/behave_tests/features/characterization-full.feature
+ tags:
+ - characterization
+ console:
+ - true
+ -
+ case_name: non-regression
+ project_name: nfvbench
+ criteria: 100
+ blocking: true
+ clean_flag: false
+ description: ''
+ run:
+ name: 'nfvbench_behaveframework'
+ args:
+ suites:
+ - /opt/nfvbench/behave_tests/features/non-regression.feature
+ tags:
+ - non-regression
+ console:
+ - true
+
+ -
+ name: nfvbench-rapid-characterization
+ order: 2
+ description: 'Data Plane Performance Testing'
+ testcases:
+ -
+ case_name: rapid-characterization
+ project_name: nfvbench
+ criteria: 100
+ blocking: true
+ clean_flag: false
+ description: ''
+ run:
+ name: 'nfvbench_behaveframework'
+ args:
+ suites:
+ - /opt/nfvbench/behave_tests/features/characterization-samples.feature
+ tags:
+ - characterization
+ console:
+ - true
+ -
+ name: quick-test-10kpps
+ order: 3
+ description: 'Quick nfvbench test at low packet rate'
+ testcases:
+ -
+ case_name: quick-test-10kpps
+ project_name: nfvbench
+ criteria: 100
+ blocking: true
+ clean_flag: false
+ description: ''
+ run:
+ name: 'nfvbench_behaveframework'
+ args:
+ suites:
+ - /opt/nfvbench/behave_tests/features/quick-test-10kpps.feature
+ tags:
+ - quick-test-10kpps
+ console:
+ - true
+ -
+ name: nfvbench-demo
+ order: 4
+ description: 'Data Plane Performance Testing'
+ testcases:
+ -
+ case_name: 10kpps-pvp-run
+ project_name: nfvbench
+ criteria: 100
+ blocking: true
+ clean_flag: false
+ description: ''
+ run:
+ name: 'bashfeature'
+ args:
+ cmd:
+ - nfvbench -c /etc/nfvbench/nfvbench.cfg --rate 10kpps
+ console:
+ - true