summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ansible/build_yardstick_image.yml8
-rw-r--r--ansible/group_vars/all.yml4
-rw-r--r--ansible/install.yaml12
-rw-r--r--ansible/prepare_openstack.yml1
-rw-r--r--ansible/roles/add_repos_jumphost/tasks/Debian.yml1
-rw-r--r--ansible/roles/build_yardstick_image/vars/main.yml8
-rw-r--r--ansible/roles/configure_gui/tasks/main.yml5
-rw-r--r--ansible/roles/configure_rabbitmq/tasks/main.yml20
-rw-r--r--ansible/roles/configure_rabbitmq/templates/rabbitmq.config.j25
-rw-r--r--ansible/roles/configure_rabbitmq/templates/user_definitions.json.j223
-rw-r--r--ansible/roles/download_drivers/defaults/main.yml3
-rw-r--r--ansible/roles/enable_iommu_on_boot/tasks/main.yml94
-rwxr-xr-xansible/roles/install_dependencies_jumphost/tasks/Debian.yml32
-rw-r--r--ansible/roles/install_dependencies_jumphost/tasks/RedHat.yml1
-rw-r--r--ansible/roles/install_dependencies_jumphost/tasks/Suse.yml6
-rwxr-xr-xansible/roles/install_dpdk/tasks/Debian.yml1
-rw-r--r--ansible/roles/install_yardstick/tasks/main.yml8
-rw-r--r--docker/Dockerfile_ubuntu1862
-rwxr-xr-xdocker/supervisor.sh14
-rw-r--r--docs/release/release-notes/release-notes.rst64
-rw-r--r--docs/testing/user/userguide/04-installation.rst4
-rw-r--r--docs/testing/user/userguide/10-yardstick-user-interface.rst4
-rw-r--r--docs/testing/user/userguide/nsb/nsb-list-of-tcs.rst3
-rw-r--r--docs/testing/user/userguide/nsb/tc_vfw_rfc2544.rst189
-rw-r--r--docs/testing/user/userguide/nsb/tc_vfw_rfc2544_correlated.rst130
-rw-r--r--docs/testing/user/userguide/nsb/tc_vfw_rfc3511.rst133
-rw-r--r--samples/vnf_samples/nsut/bng/tc_bng_pppoe_rfc2544_ixia_8ports_1port_congested_IMIX.yaml (renamed from samples/vnf_samples/nsut/bng/tc_bng_pppoe_rfc2544_ixia_4port_IMIX.yaml)28
-rw-r--r--samples/vnf_samples/nsut/bng/tc_bng_pppoe_rfc2544_ixia_IMIX_scale_up.yaml (renamed from samples/vnf_samples/nsut/bng/tc_bng_pppoe_rfc2544_ixia_IMIX.yaml)49
-rw-r--r--samples/vnf_samples/nsut/vpe/tc_baremetal_rfc2544_ipv4_1flow_64B_ixia.yaml3
-rw-r--r--samples/vnf_samples/nsut/vpe/vpe_config/action_bulk_512.txt14
-rw-r--r--samples/vnf_samples/nsut/vpe/vpe_config/vpe_config_2_ports14
-rw-r--r--samples/vnf_samples/nsut/vpe/vpe_config/vpe_script_sample631
-rw-r--r--samples/vnf_samples/traffic_profiles/ixia_ipv4_latency_vbng_1port_congested-8.yaml412
-rw-r--r--samples/vnf_samples/traffic_profiles/ixia_ipv4_latency_vbng_scale_up.yaml (renamed from samples/vnf_samples/traffic_profiles/ixia_ipv4_latency_vbng-4.yaml)82
-rw-r--r--yardstick/benchmark/core/report.py11
-rw-r--r--yardstick/benchmark/runners/iteration.py1
-rw-r--r--yardstick/common/nsb_report.css2
-rw-r--r--yardstick/common/nsb_report.html.j2128
-rw-r--r--yardstick/common/nsb_report.js146
-rw-r--r--yardstick/common/report.html.j2133
-rw-r--r--yardstick/network_services/libs/ixia_libs/ixnet/ixnet_api.py12
-rw-r--r--yardstick/network_services/traffic_profile/base.py4
-rw-r--r--yardstick/network_services/traffic_profile/ixia_rfc2544.py40
-rw-r--r--yardstick/network_services/vnf_generic/vnf/sample_vnf.py4
-rw-r--r--yardstick/network_services/vnf_generic/vnf/tg_rfc2544_ixia.py163
-rw-r--r--yardstick/network_services/vnf_generic/vnf/vpe_vnf.py16
-rw-r--r--yardstick/tests/unit/benchmark/runner/test_iteration.py45
-rw-r--r--yardstick/tests/unit/benchmark/scenarios/availability/test_attacker_baremetal.py73
-rw-r--r--yardstick/tests/unit/network_services/traffic_profile/test_base.py16
-rw-r--r--yardstick/tests/unit/network_services/traffic_profile/test_ixia_rfc2544.py40
-rw-r--r--yardstick/tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_ixia.py112
51 files changed, 2542 insertions, 472 deletions
diff --git a/ansible/build_yardstick_image.yml b/ansible/build_yardstick_image.yml
index 072c12c66..495a547bb 100644
--- a/ansible/build_yardstick_image.yml
+++ b/ansible/build_yardstick_image.yml
@@ -19,11 +19,13 @@
'amd64': disk1
'arm64': uefi1
boot_mode: "{{ boot_modes[YARD_IMG_ARCH] }}"
- image_filename: "{{ release }}-server-cloudimg-{{ YARD_IMG_ARCH }}-{{ boot_mode }}.img"
- image_path: "{{ release }}/current/{{ image_filename }}"
+ image_filename:
+ 'xenial': "{{ release }}-server-cloudimg-{{ YARD_IMG_ARCH }}-{{ boot_mode }}.img"
+ 'bionic': "{{ release }}-server-cloudimg-{{ YARD_IMG_ARCH }}.img"
+ image_path: "{{ release }}/current/{{ image_filename[release] }}"
host: "{{ lookup('env', 'HOST')|default('cloud-images.ubuntu.com', true)}}"
image_url: "{{ lookup('env', 'IMAGE_URL')|default('https://' ~ host ~ '/' ~ image_path, true) }}"
- image_dest: "{{ workspace }}/{{ image_filename }}"
+ image_dest: "{{ workspace }}/{{ image_filename[release] }}"
sha256sums_path: "{{ release }}/current/SHA256SUMS"
sha256sums_filename: "{{ sha256sums_path|basename }}"
sha256sums_url: "{{ lookup('env', 'SHA256SUMS_URL')|default('https://' ~ host ~ '/' ~ sha256sums_path, true) }}"
diff --git a/ansible/group_vars/all.yml b/ansible/group_vars/all.yml
index 596560508..0e8ad5bc5 100644
--- a/ansible/group_vars/all.yml
+++ b/ansible/group_vars/all.yml
@@ -1,9 +1,9 @@
---
target_os: "Ubuntu"
YARD_IMG_ARCH: "amd64"
-IMG_PROPERTY: "normal"
+IMG_PROPERTY: "{{ IMAGE_PROPERTY | default('normal') }}"
clone_dest: /opt/tempT
-release: xenial
+release: "{{ OS_RELEASE | default('xenial') }}"
normal_image_file: "{{ workspace }}/yardstick-image.img"
nsb_image_file: "{{ workspace }}/yardstick-nsb-image.img"
ubuntu_image_file: /tmp/workspace/yardstick/yardstick-trusty-server.raw
diff --git a/ansible/install.yaml b/ansible/install.yaml
index 01478fb12..0c7ad7e92 100644
--- a/ansible/install.yaml
+++ b/ansible/install.yaml
@@ -21,7 +21,7 @@
pre_tasks:
- - name: Create NSB binaries directory, accesible to any user
+ - name: Create NSB binaries directory, accessible to any user
file:
path: "{{ nsb_dir }}"
state: directory
@@ -31,15 +31,15 @@
- installation_mode != inst_mode_container_pull
roles:
- - { role: add_repos_jumphost, when: installation_mode != inst_mode_container_pull }
- - { role: install_dependencies_jumphost, when: installation_mode != inst_mode_container_pull }
+ - add_repos_jumphost
+ - install_dependencies_jumphost
- { role: install_yardstick, when: installation_mode != inst_mode_container_pull }
- { role: configure_uwsgi, when: installation_mode != inst_mode_container_pull }
- { role: configure_nginx, when: installation_mode != inst_mode_container_pull }
- { role: configure_gui, when: installation_mode != inst_mode_container_pull }
- { role: download_trex, when: installation_mode != inst_mode_container_pull }
- { role: install_trex, when: installation_mode != inst_mode_container_pull }
- - { role: configure_rabbitmq, when: installation_mode != inst_mode_container_pull }
+ - { role: configure_rabbitmq, when: installation_mode == inst_mode_baremetal }
post_tasks:
@@ -142,10 +142,6 @@
tasks:
- include_role:
- name: install_dependencies_jumphost
- when: installation_mode == inst_mode_container_pull
-
- - include_role:
name: docker
when: installation_mode == inst_mode_container_pull
diff --git a/ansible/prepare_openstack.yml b/ansible/prepare_openstack.yml
index 6f54ef522..c9067c9fb 100644
--- a/ansible/prepare_openstack.yml
+++ b/ansible/prepare_openstack.yml
@@ -23,7 +23,6 @@
include: build_yardstick_image.yml
vars:
YARD_IMG_ARCH: amd64
- release: xenial
img_property: nsb
- name: Cleanup old OpenStack images and upload the new one
diff --git a/ansible/roles/add_repos_jumphost/tasks/Debian.yml b/ansible/roles/add_repos_jumphost/tasks/Debian.yml
index 626f0b037..e15699617 100644
--- a/ansible/roles/add_repos_jumphost/tasks/Debian.yml
+++ b/ansible/roles/add_repos_jumphost/tasks/Debian.yml
@@ -71,7 +71,6 @@
deb [arch={{ extra_arch }}] {{ extra_repo }} {{ ansible_distribution_release }} main universe multiverse restricted
deb [arch={{ extra_arch }}] {{ extra_repo }} {{ ansible_distribution_release }}-updates main universe multiverse restricted
deb [arch={{ extra_arch }}] {{ extra_repo }} {{ ansible_distribution_release }}-security main universe multiverse restricted
- deb [arch={{ extra_arch }}] {{ extra_repo }} {{ ansible_distribution_release }}-proposed main universe multiverse restricted
when: installation_mode == "container"
- name: Remove the marker
diff --git a/ansible/roles/build_yardstick_image/vars/main.yml b/ansible/roles/build_yardstick_image/vars/main.yml
index 6728e5afb..3d4054408 100644
--- a/ansible/roles/build_yardstick_image/vars/main.yml
+++ b/ansible/roles/build_yardstick_image/vars/main.yml
@@ -16,11 +16,13 @@ boot_modes:
'amd64': disk1
'arm64': uefi1
boot_mode: "{{ boot_modes[YARD_IMG_ARCH] }}"
-image_filename: "{{ release }}-server-cloudimg-{{ YARD_IMG_ARCH }}-{{ boot_mode }}.img"
-image_path: "{{ release }}/current/{{ image_filename }}"
+image_filename:
+ 'xenial': "{{ release }}-server-cloudimg-{{ YARD_IMG_ARCH }}-{{ boot_mode }}.img"
+ 'bionic': "{{ release }}-server-cloudimg-{{ YARD_IMG_ARCH }}.img"
+image_path: "{{ release }}/current/{{ image_filename[release] }}"
host: "{{ lookup('env', 'HOST')|default('cloud-images.ubuntu.com', true)}}"
image_url: "{{ lookup('env', 'IMAGE_URL')|default('https://' ~ host ~ '/' ~ image_path, true) }}"
-image_dest: "{{ workspace }}/{{ image_filename }}"
+image_dest: "{{ workspace }}/{{ image_filename[release] }}"
sha256sums_path: "{{ release }}/current/SHA256SUMS"
sha256sums_filename: "{{ sha256sums_path|basename }}"
sha256sums_url: "{{ lookup('env', 'SHA256SUMS_URL')|default('https://' ~ host ~ '/' ~ sha256sums_path, true) }}"
diff --git a/ansible/roles/configure_gui/tasks/main.yml b/ansible/roles/configure_gui/tasks/main.yml
index 846a9cb47..665053ccf 100644
--- a/ansible/roles/configure_gui/tasks/main.yml
+++ b/ansible/roles/configure_gui/tasks/main.yml
@@ -27,6 +27,11 @@
state: directory
recurse: yes
+- name: Remove /etc/nginx/yardstick/gui/dist directory if it exists
+ file:
+ path: /etc/nginx/yardstick/gui/dist
+ state: absent
+
- name: Move dist to /etc/nginx/yardstick/gui
shell:
cmd: mv dist /etc/nginx/yardstick/gui
diff --git a/ansible/roles/configure_rabbitmq/tasks/main.yml b/ansible/roles/configure_rabbitmq/tasks/main.yml
index 4ff4222dc..3ad60c1ea 100644
--- a/ansible/roles/configure_rabbitmq/tasks/main.yml
+++ b/ansible/roles/configure_rabbitmq/tasks/main.yml
@@ -12,16 +12,6 @@
# See the License for the specific language governing permissions and
# limitations under the License.
---
-- name: Create rabbitmq configuration
- template:
- src: rabbitmq.config.j2
- dest: /etc/rabbitmq/rabbitmq.config
-
-- name: Define user definitions file
- template:
- src: user_definitions.json.j2
- dest: /etc/rabbitmq/definitions.json
-
- name: Restart rabbitmq
service:
name: rabbitmq-server
@@ -30,5 +20,11 @@
- name: rabbitmqctl start_app
shell: rabbitmqctl start_app
-- name: Enable management plugin
- shell: rabbitmq-plugins enable rabbitmq_management
+- name: Configure rabbitmq
+ rabbitmq_user:
+ user: yardstick
+ password: yardstick
+ configure_priv: .*
+ read_priv: .*
+ write_priv: .*
+ state: present
diff --git a/ansible/roles/configure_rabbitmq/templates/rabbitmq.config.j2 b/ansible/roles/configure_rabbitmq/templates/rabbitmq.config.j2
deleted file mode 100644
index 8f07edf5c..000000000
--- a/ansible/roles/configure_rabbitmq/templates/rabbitmq.config.j2
+++ /dev/null
@@ -1,5 +0,0 @@
- [
- {rabbitmq_management, [
- {load_definitions, "/etc/rabbitmq/definitions.json"}
- ]}
-]. \ No newline at end of file
diff --git a/ansible/roles/configure_rabbitmq/templates/user_definitions.json.j2 b/ansible/roles/configure_rabbitmq/templates/user_definitions.json.j2
deleted file mode 100644
index 7c811f16d..000000000
--- a/ansible/roles/configure_rabbitmq/templates/user_definitions.json.j2
+++ /dev/null
@@ -1,23 +0,0 @@
- {
- "users": [{
- "name": "yardstick",
- "password_hash": "XHp9fBOE3vjTEf7ktiUBHqefW2g=",
- "hashing_algorithm": "rabbit_password_hashing_sha256",
- "tags": ""
- }],
- "vhosts": [{
- "name": "/"
- }],
- "permissions": [{
- "user": "yardstick",
- "vhost": "/",
- "configure": ".*",
- "write": ".*",
- "read": ".*"
- }],
- "parameters": [],
- "policies": [],
- "queues": [],
- "exchanges": [],
- "bindings": []
-}
diff --git a/ansible/roles/download_drivers/defaults/main.yml b/ansible/roles/download_drivers/defaults/main.yml
index ab68a3c6d..bf1e48a23 100644
--- a/ansible/roles/download_drivers/defaults/main.yml
+++ b/ansible/roles/download_drivers/defaults/main.yml
@@ -12,10 +12,11 @@
# See the License for the specific language governing permissions and
# limitations under the License.
---
-i40evf_version: "3.4.2"
+i40evf_version: "3.5.13"
i40evf_gzfile: "i40evf-{{ i40evf_version }}.tar.gz"
i40evf_url: "https://netix.dl.sourceforge.net/project/e1000/i40evf%20stable/{{ i40evf_version }}/{{ i40evf_gzfile }}"
i40evf_dest: "{{ clone_dest }}/"
i40evf_path: "{{ i40evf_dest }}/{{ i40evf_gzfile|regex_replace('[.]tar[.]gz$', '') }}"
i40evf_checksum:
"3.4.2": "sha256:a8e2a722fb2f8ac874cb39545a331761841f1724830ff1581d2012dd37314645"
+ "3.5.13": "sha256:e57b95b694c8480b905e72ea13caac8714d6bb0c9eabe37cca655505b808f033" \ No newline at end of file
diff --git a/ansible/roles/enable_iommu_on_boot/tasks/main.yml b/ansible/roles/enable_iommu_on_boot/tasks/main.yml
index e406fcc1e..188b32915 100644
--- a/ansible/roles/enable_iommu_on_boot/tasks/main.yml
+++ b/ansible/roles/enable_iommu_on_boot/tasks/main.yml
@@ -22,55 +22,57 @@
iommu_boot_params: ' amd_iommu=on iommu=pt'
when: hostvars[inventory_hostname]['ansible_system_vendor'] == "AuthenticAMD"
-- name: Define grub string for IOMMU
- set_fact:
- enable_iommu: 'GRUB_CMDLINE_LINUX="$GRUB_CMDLINE_LINUX{{ iommu_boot_params }}'
+- block:
+ - name: Define grub string for IOMMU
+ set_fact:
+ enable_iommu: 'GRUB_CMDLINE_LINUX="$GRUB_CMDLINE_LINUX{{ iommu_boot_params }}'
-- name: check if iommu is set by this role in {{ grub_file}}
- lineinfile:
- path: "{{ grub_file}}"
- regexp: '{{ iommu_help_string }}'
- line: '{{ iommu_help_string }}'
- state: absent
- check_mode: yes
- register: is_nsb_iommu_role
- ignore_errors: True
+ - name: check if iommu is set by this role in {{ grub_file}}
+ lineinfile:
+ path: "{{ grub_file}}"
+ regexp: '{{ iommu_help_string }}'
+ line: '{{ iommu_help_string }}'
+ state: absent
+ check_mode: yes
+ register: is_nsb_iommu_role
+ ignore_errors: True
-- name: Check if IOMMU is set by someone else
- lineinfile:
- path: "{{ grub_file}}"
- regexp: "_iommu="
- line: '{{ iommu_help_string }}'
- state: absent
- check_mode: yes
- register: is_iommu
- ignore_errors: True
+ - name: Check if IOMMU is set by someone else
+ lineinfile:
+ path: "{{ grub_file}}"
+ regexp: "_iommu="
+ line: '{{ iommu_help_string }}'
+ state: absent
+ check_mode: yes
+ register: is_iommu
+ ignore_errors: True
-- name: Send info that IOMMU is configured by someone else
- debug:
- msg: "INFO: NOT modified, IOMMU is already configured by someone."
- when:
- - not is_nsb_iommu_role.changed
- - is_iommu.changed
+ - name: Send info that IOMMU is configured by someone else
+ debug:
+ msg: "INFO: NOT modified, IOMMU is already configured by someone."
+ when:
+ - not is_nsb_iommu_role.changed
+ - is_iommu.changed
-- name: Add IOMMU when it is not set
- lineinfile:
- path: "{{ grub_file }}"
- regexp: "{{ iommu_help_string }}"
- line: '{{ enable_iommu }}" {{ iommu_help_string }}'
- when:
- - not is_nsb_iommu_role.changed
- - not is_iommu.changed
+ - name: Add IOMMU when it is not set
+ lineinfile:
+ path: "{{ grub_file }}"
+ regexp: "{{ iommu_help_string }}"
+ line: '{{ enable_iommu }}" {{ iommu_help_string }}'
+ when:
+ - not is_nsb_iommu_role.changed
+ - not is_iommu.changed
-- name: find boot grub.cfg
- find:
- paths: /boot
- file_type: file
- patterns: 'grub*.cfg'
- recurse: yes
- register: grub_files
+ - name: find boot grub.cfg
+ find:
+ paths: /boot
+ file_type: file
+ patterns: 'grub*.cfg'
+ recurse: yes
+ register: grub_files
-- include: manual_modify_grub.yml
- # only tested on Ubuntu, kernel line is probably different on other distros
- with_items: "{{ grub_files.files }}"
- when: ansible_distribution == "Ubuntu"
+ - include: manual_modify_grub.yml
+ # only tested on Ubuntu, kernel line is probably different on other distros
+ with_items: "{{ grub_files.files }}"
+ when: ansible_distribution == "Ubuntu"
+ when: iommu_boot_params is defined
diff --git a/ansible/roles/install_dependencies_jumphost/tasks/Debian.yml b/ansible/roles/install_dependencies_jumphost/tasks/Debian.yml
index 9baf7e59e..6c3900d26 100755
--- a/ansible/roles/install_dependencies_jumphost/tasks/Debian.yml
+++ b/ansible/roles/install_dependencies_jumphost/tasks/Debian.yml
@@ -16,6 +16,12 @@
apt:
update_cache: yes
+- name: Install dependency for Ubuntu 18
+ action: "{{ ansible_pkg_mgr }} name=libssl1.0-dev state=present"
+ when:
+ - ansible_distribution == 'Ubuntu'
+ - ansible_distribution_major_version|int >= 17
+
- name: Install core packages
action: "{{ ansible_pkg_mgr }} name={{ item }} state=present"
with_items:
@@ -29,20 +35,17 @@
- vim
- libffi-dev
- libfuse-dev
- - libssl-dev
- libxft-dev
- libxml2-dev
- libxss-dev
- - libxslt-dev
- libxslt1-dev
- - libzmq-dev
+ - libzmq3-dev
- qemu-user-static
- qemu-utils
- kpartx
- python
- python-setuptools
- python-dev
- - python-pip
- python-libvirt
- python-virtualenv
- bridge-utils
@@ -54,7 +57,6 @@
- uwsgi-plugin-python
- supervisor
- lsof
- - nodejs
- npm
- rabbitmq-server
@@ -74,3 +76,23 @@
- name: Remove useless packages from the cache
apt:
autoclean: yes
+
+# There is a bug with the easy install ansible module in Ubuntu 16.04 linux.
+# Refer https://github.com/ansible/ansible/issues/23534
+- name: Install pip
+ shell: easy_install -U pip
+ when:
+ - ansible_distribution == 'Ubuntu'
+ - ansible_distribution_major_version|int <= 16
+
+- name: Install python-pip
+ action: "{{ ansible_pkg_mgr }} name=python-pip state=present"
+ when:
+ - ansible_distribution == 'Ubuntu'
+ - ansible_distribution_major_version|int >= 17
+
+- name: Install required docker-py module
+ pip:
+ name: docker-py
+ state: latest
+ environment: "{{ proxy_env }}"
diff --git a/ansible/roles/install_dependencies_jumphost/tasks/RedHat.yml b/ansible/roles/install_dependencies_jumphost/tasks/RedHat.yml
index 85eb1156a..cb5315adb 100644
--- a/ansible/roles/install_dependencies_jumphost/tasks/RedHat.yml
+++ b/ansible/roles/install_dependencies_jumphost/tasks/RedHat.yml
@@ -52,3 +52,4 @@
- openssl
- python-virtualenv
- ccze
+ - python-pip
diff --git a/ansible/roles/install_dependencies_jumphost/tasks/Suse.yml b/ansible/roles/install_dependencies_jumphost/tasks/Suse.yml
index af53c9cd5..7932ed96d 100644
--- a/ansible/roles/install_dependencies_jumphost/tasks/Suse.yml
+++ b/ansible/roles/install_dependencies_jumphost/tasks/Suse.yml
@@ -47,3 +47,9 @@
- openssl
- python-virtualenv
- ccze
+
+# There is a bug with the easy install ansible module in suse linux.
+# Until this is fixed the shell command must be used
+# Refer https://github.com/ansible/ansible/issues/37296
+- name: Install pip
+ shell: easy_install -U pip
diff --git a/ansible/roles/install_dpdk/tasks/Debian.yml b/ansible/roles/install_dpdk/tasks/Debian.yml
index 4f0c3c881..b76a0fbf8 100755
--- a/ansible/roles/install_dpdk/tasks/Debian.yml
+++ b/ansible/roles/install_dpdk/tasks/Debian.yml
@@ -17,6 +17,7 @@
with_items:
- libpcap-dev
- pciutils
+ - libelf-dev
- name: Install kernel headers
action: "{{ ansible_pkg_mgr }} name=linux-headers-{{ dpdk_kernel }} state=present"
diff --git a/ansible/roles/install_yardstick/tasks/main.yml b/ansible/roles/install_yardstick/tasks/main.yml
index 203acc3e5..f93f8eec3 100644
--- a/ansible/roles/install_yardstick/tasks/main.yml
+++ b/ansible/roles/install_yardstick/tasks/main.yml
@@ -29,14 +29,6 @@
scope: global
value: False
-# There is a bug with the easy install ansible module in suse linux.
-# Until this is fixed the shell command must be used
-- name: Install pip
- shell: easy_install -U pip
-# easy_install:
-# name: pip
-# state: latest
-
- name: Install Yardstick requirements (venv)
pip:
requirements: "{{ yardstick_dir }}/requirements.txt"
diff --git a/docker/Dockerfile_ubuntu18 b/docker/Dockerfile_ubuntu18
new file mode 100644
index 000000000..a9dfaeb6a
--- /dev/null
+++ b/docker/Dockerfile_ubuntu18
@@ -0,0 +1,62 @@
+##############################################################################
+# Copyright (c) 2015 Ericsson AB and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+FROM ubuntu:18.04
+
+LABEL image=opnfv/yardstick
+
+ARG BRANCH=master
+
+# GIT repo directory
+ENV REPOS_DIR="/home/opnfv/repos" \
+ IMAGE_DIR="/home/opnfv/images/"
+
+# Set work directory
+
+# Yardstick repo
+ENV YARDSTICK_REPO_DIR="${REPOS_DIR}/yardstick/" \
+ RELENG_REPO_DIR="${REPOS_DIR}/releng" \
+ STORPERF_REPO_DIR="${REPOS_DIR}/storperf"
+
+RUN apt-get update && apt-get install -y git python python-setuptools python-pip iputils-ping && apt-get -y autoremove && apt-get clean
+
+RUN pip install appdirs==1.4.0 pyopenssl==17.5.0 openstacksdk==0.9.17 python-openstackclient==3.12.1 python-heatclient==1.11.1 ansible==2.5.5
+
+RUN mkdir -p ${REPOS_DIR}
+
+RUN git config --global http.sslVerify false
+#For developers: To test your changes you must comment out the git clone for ${YARDSTICK_REPO_DIR}.
+#You must also uncomment the RUN and COPY commands below.
+#You must run docker build from your yardstick directory on the host.
+RUN git clone --depth 1 -b $BRANCH https://gerrit.opnfv.org/gerrit/yardstick ${YARDSTICK_REPO_DIR}
+#RUN mkdir ${YARDSTICK_REPO_DIR}
+#COPY ./ ${YARDSTICK_REPO_DIR}
+RUN git clone --depth 1 https://gerrit.opnfv.org/gerrit/releng ${RELENG_REPO_DIR}
+RUN git clone --depth 1 -b $BRANCH https://gerrit.opnfv.org/gerrit/storperf ${STORPERF_REPO_DIR}
+
+RUN ansible-playbook -i ${YARDSTICK_REPO_DIR}/ansible/install-inventory.ini -c local -vvv -e INSTALLATION_MODE="container" ${YARDSTICK_REPO_DIR}/ansible/install.yaml
+
+RUN ${YARDSTICK_REPO_DIR}/docker/supervisor.sh
+
+RUN echo "daemon off;" >> /etc/nginx/nginx.conf
+# nginx=5000, rabbitmq=5672
+EXPOSE 5000 5672
+
+ADD http://download.cirros-cloud.net/0.3.5/cirros-0.3.5-x86_64-disk.img ${IMAGE_DIR}
+ADD http://cloud-images.ubuntu.com/xenial/current/xenial-server-cloudimg-amd64-disk1.img ${IMAGE_DIR}
+
+# For developers: when `docker build ...` is running from YARDSTICK_REPO_DIR, please change
+# path `./exec_tests.sh` -> `./docker/exec_tests.sh``.
+COPY ./exec_tests.sh /usr/local/bin/
+
+ENV NSB_DIR="/opt/nsb_bin"
+ENV PYTHONPATH="${PYTHONPATH}:${NSB_DIR}/trex_client:${NSB_DIR}/trex_client/stl"
+
+WORKDIR ${REPOS_DIR}
+CMD ["/usr/bin/supervisord"]
diff --git a/docker/supervisor.sh b/docker/supervisor.sh
index 44e34fb38..bd17cfbc4 100755
--- a/docker/supervisor.sh
+++ b/docker/supervisor.sh
@@ -10,8 +10,10 @@
# nginx service start when boot
supervisor_config='/etc/supervisor/conf.d/yardstick.conf'
+rabbitmq_config='/etc/supervisor/conf.d/rabbitmq.conf'
if [[ ! -e "${supervisor_config}" ]]; then
+
cat << EOF > "${supervisor_config}"
[supervisord]
nodaemon = true
@@ -22,8 +24,18 @@ command = service nginx restart
[program:yardstick_uwsgi]
directory = /etc/yardstick
command = uwsgi -i yardstick.ini
+EOF
+
+fi
+
+if [[ ! -e "${rabbitmq_config}" ]]; then
+ cat << EOF > "${rabbitmq_config}"
[program:rabbitmq]
-command = service rabbitmq-server restart
+command = /bin/bash -c "service rabbitmq-server restart
+ rabbitmqctl start_app
+ rabbitmqctl add_user yardstick yardstick
+ rabbitmqctl set_permissions -p / yardstick '.*' '.*'"
EOF
+
fi
diff --git a/docs/release/release-notes/release-notes.rst b/docs/release/release-notes/release-notes.rst
index 4b3f12bcf..914daa3a4 100644
--- a/docs/release/release-notes/release-notes.rst
+++ b/docs/release/release-notes/release-notes.rst
@@ -33,6 +33,9 @@ Version History
| November 9, 2018 | 7.0.0 | Yardstick for Gambia release |
| | | |
+-------------------+-----------+---------------------------------+
+| December 14, 2018 | 7.1.0 | Yardstick for Gambia release |
+| | | |
++-------------------+-----------+---------------------------------+
Important Notes
@@ -111,19 +114,19 @@ Release Data
| **Project** | Yardstick |
| | |
+--------------------------------+-----------------------+
-| **Repo/tag** | yardstick/opnfv-7.0.0 |
+| **Repo/tag** | yardstick/opnfv-7.1.0 |
| | |
+--------------------------------+-----------------------+
-| **Yardstick Docker image tag** | opnfv-7.0.0 |
+| **Yardstick Docker image tag** | opnfv-7.1.0 |
| | |
+--------------------------------+-----------------------+
-| **Release designation** | Gambia 7.0 |
+| **Release designation** | Gambia 7.1 |
| | |
+--------------------------------+-----------------------+
-| **Release date** | November 9, 2018 |
+| **Release date** | December 14, 2018 |
| | |
+--------------------------------+-----------------------+
-| **Purpose of the delivery** | OPNFV Gambia 7.0.0 |
+| **Purpose of the delivery** | OPNFV Gambia 7.1.0 |
| | |
+--------------------------------+-----------------------+
@@ -269,7 +272,7 @@ List of Scenarios
New Test cases
--------------
-.. note:: Yardstick Gambia 7.0.0 adds no new test cases.
+.. note:: Yardstick Gambia 7.1.0 adds no new test cases.
* Generic NFVI test cases
@@ -326,7 +329,7 @@ Feature additions
Scenario Matrix
===============
-For Gambia 7.0.0, Yardstick was tested on the following scenarios:
+For Gambia 7.1.0, Yardstick was tested on the following scenarios:
+-------------------------+------+---------+----------+------+
| Scenario | Apex | Compass | Fuel-arm | Fuel |
@@ -370,58 +373,35 @@ Known Issues/Faults
Corrected Faults
----------------
-Gambia 7.0.0:
+Gambia 7.1.0:
+--------------------+--------------------------------------------------------------------------+
| **JIRA REFERENCE** | **DESCRIPTION** |
+====================+==========================================================================+
-| YARDSTICK-1137 | Fix CLI argument handling in nsb_setup.sh |
-+--------------------+--------------------------------------------------------------------------+
-| YARDSTICK-1220 | Get stats for multiple port simultaneously |
-+--------------------+--------------------------------------------------------------------------+
-| YARDSTICK-1260 | Added missing functionality to start VM and access it using SSH keys |
-| | in Standalone contexts. |
-+--------------------+--------------------------------------------------------------------------+
-| YARDSTICK-1298 | Allows for in-line overriding/modification of traffic profile variables |
-| | from the testcase file. |
+| YARDSTICK-1241 | Update NSB PROX devguide. |
+--------------------+--------------------------------------------------------------------------+
-| YARDSTICK-1368 | Updated existing test cases in Yardstick to minimize changes done |
-| | manually to run standalone tests for Trex. |
+| YARDSTICK-1458 | NSB NFVi PROX Should report realtime port activity not historical data. |
+--------------------+--------------------------------------------------------------------------+
-| YARDSTICK-1389 | Add status filed for RFC2544 TC iterations |
+| YARDSTICK-1471 | Add Testcase Prox Standalone SRIOV. |
+--------------------+--------------------------------------------------------------------------+
-| YARDSTICK-1395 | Update 'configure_uwsgi' role to work in baremetal/container modes. |
+| YARDSTICK-1475 | Adding Testcase for Prox Stanalone OvS-DPDK. |
+--------------------+--------------------------------------------------------------------------+
-| YARDSTICK-1402 | Change IP assignment for VM to static for standalone context |
+| YARDSTICK-1500 | Adding Testcase for Prox L2FWD PktTouch Stanalone OvS-DPDK. |
+--------------------+--------------------------------------------------------------------------+
-| YARDSTICK-1404 | CPU Utilization for VNF and traffic generator are now graphed on Grafana |
+| YARDSTICK-1517 | Missing opnfv "os-ovn-nofeature-ha" scenario test suite. |
+--------------------+--------------------------------------------------------------------------+
-| YARDSTICK-1411 | Fix Yardstick Docker image ARM build |
+| YARDSTICK-l526 | Run testcase 074 result overridden by job status. |
+--------------------+--------------------------------------------------------------------------+
-| YARDSTICK-1414 | Update the pinned sampleVNF version to use a commit instead of a branch |
+| YARDSTICK-1547 | Adding scale up test case for l3fwd OvS-DPDK. |
+--------------------+--------------------------------------------------------------------------+
-| YARDSTICK-1418 | NSB PROX NFVi test now stops after reaching expected precision |
+| YARDSTICK-1560 | Fix pip environment. |
+--------------------+--------------------------------------------------------------------------+
-| YARDSTICK-1457 | Fix influxdb "field type conflict" error |
+| YARDSTICK-1561 | L3FWD Gradana Dashboards Out-of-date and incorrect. |
+--------------------+--------------------------------------------------------------------------+
-| YARDSTICK-1458 | Update Grafana to display "real-time" data instead of historical data. |
-+--------------------+--------------------------------------------------------------------------+
-| YARDSTICK-1462 | NSB: Add OvS 2.8.1 support in SA context |
-+--------------------+--------------------------------------------------------------------------+
-| YARDSTICK-1492 | Make OvS server to listen on TCP |
-+--------------------+--------------------------------------------------------------------------+
-| YARDSTICK-1493 | The RX queues number is hard-codded and cannot be changed |
-+--------------------+--------------------------------------------------------------------------+
-
-Gambia 7.0.0 known restrictions/issues
+Gambia 7.1.0 known restrictions/issues
======================================
-+-----------+-----------------------+------------------+
-| Installer | Scenario | Issue |
-+===========+=======================+==================+
-| apex | os-ovn-nofeature-ha | YARDSTICK-1517 |
-+-----------+-----------------------+------------------+
Useful links
============
diff --git a/docs/testing/user/userguide/04-installation.rst b/docs/testing/user/userguide/04-installation.rst
index 2f8175c25..3ba312ce7 100644
--- a/docs/testing/user/userguide/04-installation.rst
+++ b/docs/testing/user/userguide/04-installation.rst
@@ -613,15 +613,15 @@ Run influxDB::
sudo -EH docker run -d --name influxdb \
-p 8083:8083 -p 8086:8086 --expose 8090 --expose 8099 \
tutum/influxdb
- docker exec -it influxdb influx
Configure influxDB::
+ docker exec -it influxdb influx
> CREATE USER root WITH PASSWORD 'root' WITH ALL PRIVILEGES
> CREATE DATABASE yardstick;
> use yardstick;
> show MEASUREMENTS;
- > quit
+ > exit
Run Grafana::
diff --git a/docs/testing/user/userguide/10-yardstick-user-interface.rst b/docs/testing/user/userguide/10-yardstick-user-interface.rst
index 76890b29a..5f9414974 100644
--- a/docs/testing/user/userguide/10-yardstick-user-interface.rst
+++ b/docs/testing/user/userguide/10-yardstick-user-interface.rst
@@ -27,8 +27,8 @@ Description
The graph is framed with Timestamp on x-axis and output values
(differ from testcase to testcase) on y-axis with the help of
-`Highcharts`_.
+`Chart.js`_.
.. _InfluxDB: https://www.influxdata.com/time-series-platform/influxdb/
.. _Jinja2: http://jinja.pocoo.org/docs/2.10/
-.. _Highcharts: https://www.highcharts.com/products/highcharts/
+.. _Chart.js: https://www.chartjs.org/
diff --git a/docs/testing/user/userguide/nsb/nsb-list-of-tcs.rst b/docs/testing/user/userguide/nsb/nsb-list-of-tcs.rst
index 723cd6f99..6c18c7d89 100644
--- a/docs/testing/user/userguide/nsb/nsb-list-of-tcs.rst
+++ b/docs/testing/user/userguide/nsb/nsb-list-of-tcs.rst
@@ -33,3 +33,6 @@ NSB PROX Test Case Descriptions
tc_epc_saegw_tput_relocation_landslide
tc_epc_network_service_request_landslide
tc_epc_ue_service_request_landslide
+ tc_vfw_rfc2544
+ tc_vfw_rfc2544_correlated
+ tc_vfw_rfc3511
diff --git a/docs/testing/user/userguide/nsb/tc_vfw_rfc2544.rst b/docs/testing/user/userguide/nsb/tc_vfw_rfc2544.rst
new file mode 100644
index 000000000..139990bc3
--- /dev/null
+++ b/docs/testing/user/userguide/nsb/tc_vfw_rfc2544.rst
@@ -0,0 +1,189 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International
+.. License.
+.. http://creativecommons.org/licenses/by/4.0
+.. (c) OPNFV, 2018 Intel Corporation.
+
+************************************************
+Yardstick Test Case Description: NSB vFW RFC2544
+************************************************
+
++------------------------------------------------------------------------------+
+| NSB vFW test for VNF characterization |
+| |
++---------------+--------------------------------------------------------------+
+| test case id | tc_{context}_rfc2544_ipv4_1rule_1flow_{pkt_size}_{tg_type} |
+| | |
+| | * context = baremetal, heat, heat_external, ovs, sriov |
+| | heat_sriov_external contexts; |
+| | * tg_type = ixia (context != heat,heat_sriov_external), |
+| | trex; |
+| | * pkt_size = 64B - all contexts; |
+| | 128B, 256B, 512B, 1024B, 1280B, 1518B - |
+| | (context = heat, tg_type = ixia) |
+| | |
++---------------+--------------------------------------------------------------+
+| metric | * Network Throughput; |
+| | * TG Packets Out; |
+| | * TG Packets In; |
+| | * TG Latency; |
+| | * VNF Packets Out; |
+| | * VNF Packets In; |
+| | * VNF Packets Fwd; |
+| | * Dropped packets; |
+| | |
++---------------+--------------------------------------------------------------+
+| test purpose | The VFW RFC2544 tests measure performance characteristics of |
+| | the SUT (multiple ports) and sends UDP bidirectional traffic |
+| | from all TG ports to SampleVNF vFW application. The |
+| | application forwards received traffic based on rules |
+| | provided by the user in the TC configuration and default |
+| | rules created by vFW to send traffic from uplink ports to |
+| | downlink and voice versa. |
+| | |
++---------------+--------------------------------------------------------------+
+| configuration | The 2 ports RFC2544 test cases are listed below: |
+| | |
+| | * tc_baremetal_rfc2544_ipv4_1rule_1flow_64B_ixia.yaml |
+| | * tc_baremetal_rfc2544_ipv4_1rule_1flow_64B_trex.yaml |
+| | * tc_heat_external_rfc2544_ipv4_1rule_1flow_1024B_ixia.yaml |
+| | * tc_heat_external_rfc2544_ipv4_1rule_1flow_1280B_ixia.yaml |
+| | * tc_heat_external_rfc2544_ipv4_1rule_1flow_128B_ixia.yaml |
+| | * tc_heat_external_rfc2544_ipv4_1rule_1flow_1518B_ixia.yaml |
+| | * tc_heat_external_rfc2544_ipv4_1rule_1flow_256B_ixia.yaml |
+| | * tc_heat_external_rfc2544_ipv4_1rule_1flow_512B_ixia.yaml |
+| | * tc_heat_external_rfc2544_ipv4_1rule_1flow_64B_ixia.yaml |
+| | * tc_heat_external_rfc2544_ipv4_1rule_1flow_64B_trex.yaml |
+| | * tc_heat_sriov_external_rfc2544_ipv4_1rule_1flow_64B_trex. |
+| | yaml |
+| | * tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex.yaml |
+| | * tc_ovs_rfc2544_ipv4_1rule_1flow_64B_ixia.yaml |
+| | * tc_ovs_rfc2544_ipv4_1rule_1flow_64B_trex.yaml |
+| | * tc_sriov_rfc2544_ipv4_1rule_1flow_64B_ixia.yaml |
+| | * tc_sriov_rfc2544_ipv4_1rule_1flow_64B_trex.yaml |
+| | |
+| | The 4 ports RFC2544 test cases are listed below: |
+| | |
+| | * tc_baremetal_rfc2544_ipv4_1rule_1flow_64B_ixia_4port.yaml |
+| | * tc_tc_baremetal_rfc2544_ipv4_1rule_1flow_64B_trex_4port. |
+| | yaml |
+| | * tc_tc_heat_external_rfc2544_ipv4_1rule_1flow_64B_trex_4 |
+| | port.yaml |
+| | * tc_tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex_4port.yaml |
+| | |
+| | The scale-up RFC2544 test cases are listed below: |
+| | |
+| | * tc_tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex_scale-up.yaml |
+| | |
+| | The scale-out RFC2544 test cases are listed below: |
+| | |
+| | * tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex_scale_out.yaml |
+| | |
+| | Test duration is set as 30 sec for each test and default |
+| | number of rules are applied. These can be configured |
+| | |
++---------------+--------------------------------------------------------------+
+| test tool | The vFW is a DPDK application that performs basic filtering |
+| | for malformed packets and dynamic packet filtering of |
+| | incoming packets using the connection tracker library. |
+| | |
++---------------+--------------------------------------------------------------+
+| applicability | The vFW RFC2544 test cases can be configured with different: |
+| | |
+| | * packet sizes; |
+| | * test duration; |
+| | * tolerated loss; |
+| | * traffic flows; |
+| | * rules; |
+| | |
+| | Default values exist. |
+| | |
++---------------+--------------------------------------------------------------+
+| pre-test | For OpenStack test case image (yardstick-samplevnf) needs |
+| conditions | to be installed into Glance with vFW and DPDK included in |
+| | it (NSB install). |
+| | |
+| | For Baremetal tests cases vFW and DPDK must be installed on |
+| | the hosts where the test is executed. The pod.yaml file must |
+| | have the necessary system and NIC information. |
+| | |
+| | For standalone (SA) SRIOV/OvS test cases the |
+| | yardstick-samplevnf image needs to be installed on hosts and |
+| | pod.yaml file must be provided with necessary system, NIC |
+| | information. |
+| | |
++---------------+--------------------------------------------------------------+
+| test sequence | Description and expected result |
+| | |
++---------------+--------------------------------------------------------------+
+| step 1 | For Baremetal test: The TG (except IXIA) and VNF are started |
+| | on the hosts based on the pod file. |
+| | |
+| | For Heat test: Two host VMs are booted, as Traffic generator |
+| | and VNF(vFW) based on the test flavor. In case of scale-out |
+| | scenario the multiple VNF VMs will be started. |
+| | |
+| | For Heat external test: vFW VM is booted and TG (except IXIA)|
+| | generator is started on the external host based on the pod |
+| | file. In case of scale-out scenario the multiple VNF VMs |
+| | will be deployed. |
+| | |
+| | For Heat SRIOV external test: vFW VM is booted with network |
+| | interfaces of `direct` type which are mapped to VFs that are |
+| | available to OpenStack. TG (except IXIA) is started on the |
+| | external host based on the pod file. In case of scale-out |
+| | scenario the multiple VNF VMs will be deployed. |
+| | |
+| | For SRIOV test: VF ports are created on host's PFs specified |
+| | in the TC file and VM is booed using those ports and image |
+| | provided in the configuration. TG (except IXIA) is started |
+| | on other host connected to VNF machine based on the pod |
+| | file. The vFW is started in the booted VM. In case of |
+| | scale-out scenario the multiple VNF VMs will be created. |
+| | |
+| | For OvS-DPDK test: OvS DPDK switch is started and bridges |
+| | are created with ports specified in the TC file. DPDK vHost |
+| | ports are added to corresponding bridge and VM is booed |
+| | using those ports and image provided in the configuration. |
+| | TG (except IXIA) is started on other host connected to VNF |
+| | machine based on the pod file. The vFW is started in the |
+| | booted VM. In case of scale-out scenario the multiple VNF |
+| | VMs will be deployed. |
+| | |
++---------------+--------------------------------------------------------------+
+| step 2 | Yardstick is connected with the TG and VNF by using ssh (in |
+| | case of IXIA TG is connected via TCL interface). The test |
+| | will resolve the topology and instantiate all VNFs |
+| | and TG and collect the KPI's/metrics. |
+| | |
++---------------+--------------------------------------------------------------+
+| step 3 | The TG will send packets to the VNFs. If the number of |
+| | dropped packets is more than the tolerated loss the line |
+| | rate or throughput is halved. This is done until the dropped |
+| | packets are within an acceptable tolerated loss. |
+| | |
+| | The KPI is the number of packets per second for different |
+| | packet size with an accepted minimal packet loss for the |
+| | default configuration. |
+| | |
++---------------+--------------------------------------------------------------+
+| step 4 | In Baremetal test: The test quits the application and unbind |
+| | the DPDK ports. |
+| | |
+| | In Heat test: All VNF VMs and TG are deleted on test |
+| | completion. |
+| | |
+| | In SRIOV test: The deployed VM with vFW is destroyed on the |
+| | host and TG (exclude IXIA) is stopped. |
+| | |
+| | In Heat SRIOV test: The deployed VM with vFW is destroyed, |
+| | VFs are released and TG (exclude IXIA) is stopped. |
+| | |
+| | In OvS test: The deployed VM with vFW is destroyed on the |
+| | host and OvS DPDK switch is stopped and ports are unbinded. |
+| | The TG (exclude IXIA) is stopped. |
+| | |
++---------------+--------------------------------------------------------------+
+| test verdict | The test case will achieve a Throughput with an accepted |
+| | minimal tolerated packet loss. |
++---------------+--------------------------------------------------------------+
+
diff --git a/docs/testing/user/userguide/nsb/tc_vfw_rfc2544_correlated.rst b/docs/testing/user/userguide/nsb/tc_vfw_rfc2544_correlated.rst
new file mode 100644
index 000000000..de490900d
--- /dev/null
+++ b/docs/testing/user/userguide/nsb/tc_vfw_rfc2544_correlated.rst
@@ -0,0 +1,130 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International
+.. License.
+.. http://creativecommons.org/licenses/by/4.0
+.. (c) OPNFV, 2018 Intel Corporation.
+
+*************************************************************
+Yardstick Test Case Description: NSB vFW RFC2544 (correlated)
+*************************************************************
+
++------------------------------------------------------------------------------+
+| NSB vFW test for VNF characterization using correlated traffic |
+| |
++---------------+--------------------------------------------------------------+
+| test case id | tc_{context}_rfc2544_ipv4_1rule_1flow_64B_trex_corelated |
+| | |
+| | * context = baremetal, heat |
+| | |
++---------------+--------------------------------------------------------------+
+| metric | * Network Throughput; |
+| | * TG Packets Out; |
+| | * TG Packets In; |
+| | * TG Latency; |
+| | * VNF Packets Out; |
+| | * VNF Packets In; |
+| | * VNF Packets Fwd; |
+| | * Dropped packets; |
+| | |
+| | NOTE: For correlated TCs the TG metrics are available on |
+| | uplink ports. |
+| | |
++---------------+--------------------------------------------------------------+
+| test purpose | The VFW RFC2544 correlated tests measure performance |
+| | characteristics of the SUT (multiple ports) and sends UDP |
+| | traffic from uplink TG ports to SampleVNF vFW application. |
+| | The application forwards received traffic from uplink ports |
+| | to downlink ports based on rules provided by the user in the |
+| | TC configuration and default rules created by vFW. The VNF |
+| | downlink traffic is received by another UDPReplay VNF and it |
+| | is mirrored back to the VNF on the same port. Finally, the |
+| | traffic is received back to the TG uplink port. |
+| | |
++---------------+--------------------------------------------------------------+
+| configuration | The 2 ports RFC2544 correlated test cases are listed below: |
+| | |
+| | * tc_baremetal_rfc2544_ipv4_1rule_1flow_64B_trex_corelated |
+| | _traffic.yaml |
+| | |
+| | Multiple VNF (2, 4, 10) RFC2544 correlated test cases are |
+| | listed below: |
+| | |
+| | * tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex_correlated |
+| | _scale_10.yaml |
+| | * tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex_correlated_scale |
+| | _2.yaml |
+| | * tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex_correlated_scale |
+| | _4.yaml |
+| | |
+| | The scale-out RFC2544 test cases are listed below: |
+| | |
+| | * tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex_correlated_scale |
+| | _out.yaml |
+| | |
+| | Test duration is set as 30 sec for each test and default |
+| | number of rules are applied. These can be configured |
+| | |
++---------------+--------------------------------------------------------------+
+| test tool | The vFW is a DPDK application that performs basic filtering |
+| | for malformed packets and dynamic packet filtering of |
+| | incoming packets using the connection tracker library. |
+| | |
++---------------+--------------------------------------------------------------+
+| applicability | The vFW RFC2544 test cases can be configured with different: |
+| | |
+| | * packet sizes; |
+| | * test duration; |
+| | * tolerated loss; |
+| | * traffic flows; |
+| | * rules; |
+| | |
+| | Default values exist. |
+| | |
++---------------+--------------------------------------------------------------+
+| pre-test | For OpenStack test case image (yardstick-samplevnf) needs |
+| conditions | to be installed into Glance with vFW and DPDK included in |
+| | it (NSB install). |
+| | |
+| | For Baremetal tests cases vFW and DPDK must be installed on |
+| | the hosts where the test is executed. The pod.yaml file must |
+| | have the necessary system and NIC information. |
+| | |
++---------------+--------------------------------------------------------------+
+| test sequence | Description and expected result |
+| | |
++---------------+--------------------------------------------------------------+
+| step 1 | For Baremetal test: The TG (except IXIA), vFW and UDPReplay |
+| | VNFs are started on the hosts based on the pod file. |
+| | |
+| | For Heat test: Three host VMs are booted, as Traffic |
+| | generator, vFW and UDPReplay VNF(vFW) based on the test |
+| | flavor. In case of scale-out scenario the multiple vFW VNF |
+| | VMs will be started. |
+| | |
++---------------+--------------------------------------------------------------+
+| step 2 | Yardstick is connected with the TG, vFW and UDPReplay VNF by |
+| | using ssh (in case of IXIA TG is connected via TCL |
+| | interface). The test will resolve the topology and |
+| | instantiate all VNFs and TG and collect the KPI's/metrics. |
+| | |
++---------------+--------------------------------------------------------------+
+| step 3 | The TG will send packets to the VNFs. If the number of |
+| | dropped packets is more than the tolerated loss the line |
+| | rate or throughput is halved. This is done until the dropped |
+| | packets are within an acceptable tolerated loss. |
+| | |
+| | The KPI is the number of packets per second for 64B packet |
+| | size with an accepted minimal packet loss for the default |
+| | configuration. |
+| | |
++---------------+--------------------------------------------------------------+
+| step 4 | In Baremetal test: The test quits the application and unbind |
+| | the DPDK ports. |
+| | |
+| | In Heat test: All VNF VMs and TG are deleted on test |
+| | completion. |
+| | |
++---------------+--------------------------------------------------------------+
+| test verdict | The test case will achieve a Throughput with an accepted |
+| | minimal tolerated packet loss. |
++---------------+--------------------------------------------------------------+
+
diff --git a/docs/testing/user/userguide/nsb/tc_vfw_rfc3511.rst b/docs/testing/user/userguide/nsb/tc_vfw_rfc3511.rst
new file mode 100644
index 000000000..9051fc4df
--- /dev/null
+++ b/docs/testing/user/userguide/nsb/tc_vfw_rfc3511.rst
@@ -0,0 +1,133 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International
+.. License.
+.. http://creativecommons.org/licenses/by/4.0
+.. (c) OPNFV, 2018 Intel Corporation.
+
+*******************************************************
+Yardstick Test Case Description: NSB vFW RFC3511 (HTTP)
+*******************************************************
+
++------------------------------------------------------------------------------+
+| NSB vFW test for VNF characterization based on RFC3511 and IXIA |
+| |
++---------------+--------------------------------------------------------------+
+| test case id | tc_{context}_http_ixload_{http_size}_Requests-65000_{type} |
+| | |
+| | * context = baremetal, heat_external |
+| | * http_size = 1b, 4k, 64k, 256k, 512k, 1024k payload size |
+| | * type = Concurrency, Connections, Throughput |
+| | |
++---------------+--------------------------------------------------------------+
+| metric | * HTTP Total Throughput (Kbps); |
+| | * HTTP Simulated Users; |
+| | * HTTP Concurrent Connections; |
+| | * HTTP Connection Rate; |
+| | * HTTP Transaction Rate |
+| | |
++---------------+--------------------------------------------------------------+
+| test purpose | The vFW RFC3511 tests measure performance characteristics of |
+| | the SUT by sending the HTTP traffic from uplink to downlink |
+| | TG ports through vFW VNF. The application forwards received |
+| | traffic based on rules provided by the user in the TC |
+| | configuration and default rules created by vFW to send |
+| | traffic from uplink ports to downlink and voice versa. |
+| | |
++---------------+--------------------------------------------------------------+
+| configuration | The 2 ports RFC3511 test cases are listed below: |
+| | |
+| | * tc_baremetal_http_ixload_1024k_Requests-65000 |
+| | _Concurrency.yaml |
+| | * tc_baremetal_http_ixload_1b_Requests-65000 |
+| | _Concurrency.yaml |
+| | * tc_baremetal_http_ixload_256k_Requests-65000 |
+| | _Concurrency.yaml |
+| | * tc_baremetal_http_ixload_4k_Requests-65000 |
+| | _Concurrency.yaml |
+| | * tc_baremetal_http_ixload_512k_Requests-65000 |
+| | _Concurrency.yaml |
+| | * tc_baremetal_http_ixload_64k_Requests-65000 |
+| | _Concurrency.yaml |
+| | * tc_heat_external_http_ixload_1b_Requests-10Gbps |
+| | _Throughput.yaml |
+| | * tc_heat_external_http_ixload_1b_Requests-65000 |
+| | _Concurrency.yaml |
+| | * tc_heat_external_http_ixload_1b_Requests-65000 |
+| | _Connections.yaml |
+| | |
+| | The 4 ports RFC3511 test cases are listed below: |
+| | |
+| | * tc_baremetal_http_ixload_1b_Requests-65000 |
+| | _Concurrency_4port.yaml |
+| | |
++---------------+--------------------------------------------------------------+
+| test tool | The vFW is a DPDK application that performs basic filtering |
+| | for malformed packets and dynamic packet filtering of |
+| | incoming packets using the connection tracker library. |
+| | |
++---------------+--------------------------------------------------------------+
+| applicability | The vFW RFC3511 test cases can be configured with different: |
+| | |
+| | * http payload sizes; |
+| | * traffic flows; |
+| | * rules; |
+| | |
+| | Default values exist. |
+| | |
++---------------+--------------------------------------------------------------+
+| pre-test | For OpenStack test case image (yardstick-samplevnf) needs |
+| conditions | to be installed into Glance with vFW and DPDK included in |
+| | it (NSB install). |
+| | |
+| | For Baremetal tests cases vFW and DPDK must be installed on |
+| | the hosts where the test is executed. The pod.yaml file must |
+| | have the necessary system and NIC information. |
+| | |
++---------------+--------------------------------------------------------------+
+| test sequence | Description and expected result |
+| | |
++---------------+--------------------------------------------------------------+
+| step 1 | For Baremetal test: The vFW VNF is started on the hosts |
+| | based on the pod file. |
+| | |
+| | For Heat external test: The vFW VM are deployed and booted. |
+| | |
++---------------+--------------------------------------------------------------+
+| step 2 | Yardstick is connected with the TG (IxLoad) via IxLoad API |
+| | and VNF by using ssh. The test will resolve the topology and |
+| | instantiate all VNFs and TG and collect the KPI's/metrics. |
+| | |
++---------------+--------------------------------------------------------------+
+| step 3 | The TG simulates HTTP traffic based on selected type of TC. |
+| | |
+| | Concurrency: |
+| | The TC attempts to simulate some number of human users. |
+| | The simulated users are gradually brought online until 64K |
+| | users is met (the Ramp-Up phase), then taken offline (the |
+| | Ramp Down phase). |
+| | |
+| | Connections: |
+| | The TC creates some number of HTTP connections per second. |
+| | It will attempt to generate the 64K of HTTP connections |
+| | per second. |
+| | |
+| | Throughput: |
+| | TC simultaneously transmits and receives TCP payload |
+| | (bytes) at a certain rate measured in Megabits per second |
+| | (Mbps), Kilobits per second (Kbps), or Gigabits per |
+| | second. The 10 Gbits is default throughput. |
+| | |
+| | At the end of the TC, the KPIs are collected and stored |
+| | (depends on the selected dispatcher). |
+| | |
++---------------+--------------------------------------------------------------+
+| step 4 | In Baremetal test: The test quits the application and |
+| | unbinds the DPDK ports. |
+| | |
+| | In Heat test: All VNF VMs are deleted and connections to TG |
+| | are terminated. |
+| | |
++---------------+--------------------------------------------------------------+
+| test verdict | The test case will try to achieve the configured HTTP |
+| | Concurrency/Throughput/Connections. |
++---------------+--------------------------------------------------------------+
+
diff --git a/samples/vnf_samples/nsut/bng/tc_bng_pppoe_rfc2544_ixia_4port_IMIX.yaml b/samples/vnf_samples/nsut/bng/tc_bng_pppoe_rfc2544_ixia_8ports_1port_congested_IMIX.yaml
index 14aa97a4a..2c2010a11 100644
--- a/samples/vnf_samples/nsut/bng/tc_bng_pppoe_rfc2544_ixia_4port_IMIX.yaml
+++ b/samples/vnf_samples/nsut/bng/tc_bng_pppoe_rfc2544_ixia_8ports_1port_congested_IMIX.yaml
@@ -13,29 +13,37 @@
# limitations under the License.
---
+{% set sessions_per_port = sessions_per_port or 4000 %}
+{% set sessions_per_svlan = sessions_per_svlan or 1000 %}
schema: yardstick:task:0.1
+description: >
+ vBNG RFC2544 test case with QoS base line with link congestion.
+ Test case creates PPPoE sessions, runs traffic from two core ports
+ to one access port causing congestion of that port (traffic from
+ other access ports are splitting between remaining core ports)
+ and measures packets drop rate on all ports for each priority flow.
scenarios:
- type: NSPerf
- traffic_profile: "../../traffic_profiles/ixia_ipv4_latency_vbng-4.yaml"
- topology: "../agnostic/agnostic_vnf_topology_ixia_4ports.yaml"
+ traffic_profile: "../../traffic_profiles/ixia_ipv4_latency_vbng_1port_congested-8.yaml"
+ topology: "../agnostic/agnostic_vnf_topology_ixia_8ports.yaml"
ixia_config: IxiaPppoeClient
nodes:
tg__0: tg_0.yardstick
vnf__0: vnf_0.yardstick
options:
pppoe_client: # access network
- sessions_per_port: 4000
- sessions_per_svlan: 1000
+ sessions_per_port: {{ sessions_per_port }}
+ sessions_per_svlan: {{ sessions_per_svlan }}
pap_user: 'wfnos'
pap_password: ''
- ip: [{'tg__0': 'xe0'}, {'tg__0': 'xe2'}]
+ ip: [{'tg__0': 'xe0'}, {'tg__0': 'xe2'}, {'tg__0': 'xe4'}, {'tg__0': 'xe6'}]
s_vlan: 100 # s-vlan applies per device group
c_vlan: 1000 # c-vlan applies per subscriber
ipv4_client: # core network
sessions_per_port: 1
sessions_per_vlan: 1
- ip: [{'tg__0': 'xe1'}, {'tg__0': 'xe3'}]
- gateway_ip: [{'vnf__0': 'xe1'}, {'vnf__0': 'xe3'}]
+ ip: [{'tg__0': 'xe1'}, {'tg__0': 'xe3'}, {'tg__0': 'xe5'}, {'tg__0': 'xe7'}]
+ gateway_ip: [{'vnf__0': 'xe1'}, {'vnf__0': 'xe3'}, {'vnf__0': 'xe5'}, {'vnf__0': 'xe7'}]
vlan: 101
bgp:
bgp_type: external
@@ -45,8 +53,8 @@ scenarios:
uplink: {70B: 33, 940B: 33, 1470B: 34}
downlink: {68B: 3, 932B: 1, 1470B: 96}
flow:
- src_ip: [{'tg__0': 'xe0'}, {'tg__0': 'xe2'}]
- dst_ip: [{'tg__0': 'xe1'}, {'tg__0': 'xe3'}]
+ src_ip: [{'tg__0': 'xe0'}, {'tg__0': 'xe2'}, {'tg__0': 'xe4'}, {'tg__0': 'xe6'}]
+ dst_ip: [{'tg__0': 'xe1'}, {'tg__0': 'xe3'}, {'tg__0': 'xe5'}, {'tg__0': 'xe7'}]
count: 1
traffic_type: 4
rfc2544:
@@ -59,4 +67,4 @@ context:
type: Node
name: yardstick
nfvi_type: baremetal
- file: /etc/yardstick/nodes/pod_ixia_4port.yaml
+ file: /etc/yardstick/nodes/pod_ixia.yaml
diff --git a/samples/vnf_samples/nsut/bng/tc_bng_pppoe_rfc2544_ixia_IMIX.yaml b/samples/vnf_samples/nsut/bng/tc_bng_pppoe_rfc2544_ixia_IMIX_scale_up.yaml
index 5fbe0c70a..f0696ab24 100644
--- a/samples/vnf_samples/nsut/bng/tc_bng_pppoe_rfc2544_ixia_IMIX.yaml
+++ b/samples/vnf_samples/nsut/bng/tc_bng_pppoe_rfc2544_ixia_IMIX_scale_up.yaml
@@ -13,41 +13,66 @@
# limitations under the License.
---
+{% set sessions_per_port = sessions_per_port or 4000 %}
+{% set sessions_per_svlan = sessions_per_svlan or 1000 %}
+{% set vports = vports or 2 %}
+{% set svlans_per_port = sessions_per_port / sessions_per_svlan %}
schema: yardstick:task:0.1
+description: >
+ vBNG RFC2544 test case with QoS base line without link congestion.
+ Test case creates PPPoE sessions, runs traffic on maximum throughput
+ and measures packets drop rate on all ports for each priority flow.
scenarios:
- type: NSPerf
- traffic_profile: "../../traffic_profiles/ixia_ipv4_latency_vbng-4.yaml"
- topology: "../agnostic/agnostic_vnf_topology_ixia_2ports.yaml"
+ traffic_profile: "../../traffic_profiles/ixia_ipv4_latency_vbng_scale_up.yaml"
+ topology: "../agnostic/agnostic_vnf_topology_ixia_{{ vports }}ports.yaml"
ixia_config: IxiaPppoeClient
+ extra_args:
+ svlans_per_port: {{ svlans_per_port|int }}
+ access_vports_num: {{ vports|int / 2 }}
nodes:
tg__0: tg_0.yardstick
vnf__0: vnf_0.yardstick
options:
pppoe_client: # access network
- sessions_per_port: 4000
- sessions_per_svlan: 1000
+ sessions_per_port: {{ sessions_per_port }}
+ sessions_per_svlan: {{ sessions_per_svlan }}
pap_user: 'wfnos'
pap_password: ''
- ip: [{'tg__0': 'xe0'}]
+ ip:
+{% for vnf_num in range(0, vports|int, 2) %}
+ - {'tg__0': 'xe{{ vnf_num }}'}
+{% endfor %}
s_vlan: 100 # s-vlan applies per device group
c_vlan: 1000 # c-vlan applies per subscriber
ipv4_client: # core network
sessions_per_port: 1
sessions_per_vlan: 1
- ip: [{'tg__0': 'xe1'}]
- gateway_ip: [{'vnf__0': 'xe1'}]
- prefix: '24'
+ ip:
+{% for vnf_num in range(1, vports|int, 2) %}
+ - {'tg__0': 'xe{{ vnf_num }}'}
+{% endfor %}
+ gateway_ip:
+{% for vnf_num in range(1, vports|int, 2) %}
+ - {'vnf__0': 'xe{{ vnf_num }}'}
+{% endfor %}
vlan: 101
bgp:
bgp_type: external
dut_ip: 10.0.0.3
as_number: 65000
framesize:
- uplink: {64B: 100}
- downlink: {64B: 100}
+ uplink: {70B: 33, 940B: 33, 1470B: 34}
+ downlink: {68B: 3, 932B: 1, 1470B: 96}
flow:
- src_ip: [{'tg__0': 'xe0'}]
- dst_ip: [{'tg__0': 'xe1'}]
+ src_ip:
+{% for vnf_num in range(0, vports|int, 2) %}
+ - {'tg__0': 'xe{{ vnf_num }}'}
+{% endfor %}
+ dst_ip:
+{% for vnf_num in range(1, vports|int, 2) %}
+ - {'tg__0': 'xe{{ vnf_num }}'}
+{% endfor %}
count: 1
traffic_type: 4
rfc2544:
diff --git a/samples/vnf_samples/nsut/vpe/tc_baremetal_rfc2544_ipv4_1flow_64B_ixia.yaml b/samples/vnf_samples/nsut/vpe/tc_baremetal_rfc2544_ipv4_1flow_64B_ixia.yaml
index 330d8e85e..399de9cc3 100644
--- a/samples/vnf_samples/nsut/vpe/tc_baremetal_rfc2544_ipv4_1flow_64B_ixia.yaml
+++ b/samples/vnf_samples/nsut/vpe/tc_baremetal_rfc2544_ipv4_1flow_64B_ixia.yaml
@@ -36,7 +36,8 @@ scenarios:
nfvi_enable: True
vnf_config: {file: './vpe_config/vpe_config_2_ports',
action_bulk_file: './vpe_config/action_bulk_512.txt',
- full_tm_profile_file: './vpe_config/full_tm_profile_10G.cfg'}
+ full_tm_profile_file: './vpe_config/full_tm_profile_10G.cfg',
+ script_file: './vpe_config/vpe_script_sample'}
runner:
type: Iteration
iterations: 10
diff --git a/samples/vnf_samples/nsut/vpe/vpe_config/action_bulk_512.txt b/samples/vnf_samples/nsut/vpe/vpe_config/action_bulk_512.txt
index 21731cd45..6fb3bdd7d 100644
--- a/samples/vnf_samples/nsut/vpe/vpe_config/action_bulk_512.txt
+++ b/samples/vnf_samples/nsut/vpe/vpe_config/action_bulk_512.txt
@@ -1,3 +1,17 @@
+# Copyright (c) 2016-2018 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
flow 0 meter 0 trtcm 1250000000 1250000000 1000000 1000000 policer 0 g G y Y r R meter 1 trtcm 1250000000 1250000000 1000000 1000000 policer 1 g G y Y r R meter 2 trtcm 1250000000 1250000000 1000000 1000000 policer 2 g G y Y r R meter 3 trtcm 1250000000 1250000000 1000000 1000000 policer 3 g G y Y r R port 0
flow 1 meter 0 trtcm 1250000000 1250000000 1000000 1000000 policer 0 g G y Y r R meter 1 trtcm 1250000000 1250000000 1000000 1000000 policer 1 g G y Y r R meter 2 trtcm 1250000000 1250000000 1000000 1000000 policer 2 g G y Y r R meter 3 trtcm 1250000000 1250000000 1000000 1000000 policer 3 g G y Y r R port 0
flow 2 meter 0 trtcm 1250000000 1250000000 1000000 1000000 policer 0 g G y Y r R meter 1 trtcm 1250000000 1250000000 1000000 1000000 policer 1 g G y Y r R meter 2 trtcm 1250000000 1250000000 1000000 1000000 policer 2 g G y Y r R meter 3 trtcm 1250000000 1250000000 1000000 1000000 policer 3 g G y Y r R port 0
diff --git a/samples/vnf_samples/nsut/vpe/vpe_config/vpe_config_2_ports b/samples/vnf_samples/nsut/vpe/vpe_config/vpe_config_2_ports
index 35443c877..44aa9854e 100644
--- a/samples/vnf_samples/nsut/vpe/vpe_config/vpe_config_2_ports
+++ b/samples/vnf_samples/nsut/vpe/vpe_config/vpe_config_2_ports
@@ -1,3 +1,17 @@
+# Copyright (c) 2016-2018 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
[PIPELINE0]
type = MASTER
core = 0
diff --git a/samples/vnf_samples/nsut/vpe/vpe_config/vpe_script_sample b/samples/vnf_samples/nsut/vpe/vpe_config/vpe_script_sample
new file mode 100644
index 000000000..ebf59ccfb
--- /dev/null
+++ b/samples/vnf_samples/nsut/vpe/vpe_config/vpe_script_sample
@@ -0,0 +1,631 @@
+# Copyright (c) 2016-2018 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+p 1 firewall add priority 1 ipv4 152.16.0.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.1.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.2.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.3.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.4.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.5.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.6.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.7.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.8.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.9.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.10.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.11.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.12.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.13.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.14.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.15.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.16.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.17.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.18.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.19.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.20.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.21.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.22.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.23.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.24.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.25.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.26.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.27.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.28.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.29.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.30.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.31.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.32.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.33.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.34.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.35.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.36.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.37.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.38.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.39.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.40.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.41.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.42.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.43.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.44.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.45.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.46.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.47.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.48.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.49.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.50.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.51.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.52.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.53.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.54.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.55.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.56.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.57.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.58.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.59.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.60.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.61.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.62.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.63.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.64.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.65.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.66.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.67.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.68.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.69.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.70.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.71.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.72.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.73.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.74.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.75.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.76.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.77.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.78.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.79.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.80.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.81.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.82.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.83.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.84.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.85.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.86.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.87.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.88.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.89.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.90.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.91.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.92.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.93.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.94.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.95.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.96.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.97.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.98.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.99.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.100.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.101.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.102.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.103.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.104.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.105.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.106.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.107.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.108.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.109.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.110.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.111.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.112.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.113.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.114.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.115.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.116.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.117.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.118.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.119.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.120.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.121.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.122.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.123.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.124.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.125.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.126.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.127.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.128.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.129.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.130.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.131.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.132.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.133.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.134.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.135.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.136.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.137.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.138.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.139.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.140.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.141.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.142.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.143.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.144.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.145.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.146.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.147.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.148.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.149.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.150.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.151.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.152.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.153.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.154.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.155.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.156.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.157.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.158.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.159.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.160.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.161.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.162.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.163.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.164.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.165.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.166.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.167.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.168.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.169.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.170.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.171.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.172.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.173.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.174.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.175.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.176.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.177.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.178.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.179.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.180.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.181.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.182.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.183.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.184.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.185.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.186.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.187.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.188.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.189.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.190.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.191.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.192.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.193.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.194.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.195.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.196.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.197.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.198.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.199.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.200.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.201.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.202.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.203.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.204.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.205.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.206.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.207.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.208.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.209.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.210.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.211.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.212.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.213.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.214.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.215.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.216.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.217.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.218.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.219.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.220.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.221.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.222.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.223.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.224.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.225.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.226.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.227.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.228.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.229.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.230.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.231.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.232.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.233.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.234.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.235.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.236.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.237.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.238.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.239.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.240.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.241.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.242.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.243.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.244.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.245.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.246.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.247.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.248.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.249.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.250.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.251.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.252.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.253.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.254.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add priority 1 ipv4 152.16.255.0 24 0.0.0.0 0 0 65535 0 65535 17 0xFF port 0
+p 1 firewall add default 1
+
+p 2 flow add qinq 128 512 port 0 id 1
+p 2 flow add default 1
+p 3 action flow bulk /tmp/action_bulk_512.txt
+p 4 action flow bulk /tmp/action_bulk_512.txt
+p 4 action dscp 0 class 0 color G
+p 4 action dscp 1 class 1 color Y
+p 4 action dscp 2 class 2 color R
+p 4 action dscp 3 class 3 color G
+p 4 action dscp 4 class 0 color Y
+p 4 action dscp 5 class 1 color R
+p 4 action dscp 6 class 2 color G
+p 4 action dscp 7 class 3 color Y
+p 4 action dscp 8 class 0 color R
+p 4 action dscp 9 class 1 color G
+p 4 action dscp 10 class 2 color Y
+p 4 action dscp 11 class 3 color R
+p 4 action dscp 12 class 0 color G
+p 4 action dscp 13 class 1 color Y
+p 4 action dscp 14 class 2 color R
+p 4 action dscp 15 class 3 color G
+p 4 action dscp 16 class 0 color Y
+p 4 action dscp 17 class 1 color R
+p 4 action dscp 18 class 2 color G
+p 4 action dscp 19 class 3 color Y
+p 4 action dscp 20 class 0 color R
+p 4 action dscp 21 class 1 color G
+p 4 action dscp 22 class 2 color Y
+p 4 action dscp 23 class 3 color R
+p 4 action dscp 24 class 0 color G
+p 4 action dscp 25 class 1 color Y
+p 4 action dscp 26 class 2 color R
+p 4 action dscp 27 class 3 color G
+p 4 action dscp 28 class 0 color Y
+p 4 action dscp 29 class 1 color R
+p 4 action dscp 30 class 2 color G
+p 4 action dscp 31 class 3 color Y
+p 4 action dscp 32 class 0 color R
+p 4 action dscp 33 class 1 color G
+p 4 action dscp 34 class 2 color Y
+p 4 action dscp 35 class 3 color R
+p 4 action dscp 36 class 0 color G
+p 4 action dscp 37 class 1 color Y
+p 4 action dscp 38 class 2 color R
+p 4 action dscp 39 class 3 color G
+p 4 action dscp 40 class 0 color Y
+p 4 action dscp 41 class 1 color R
+p 4 action dscp 42 class 2 color G
+p 4 action dscp 43 class 3 color Y
+p 4 action dscp 44 class 0 color R
+p 4 action dscp 45 class 1 color G
+p 4 action dscp 46 class 2 color Y
+p 4 action dscp 47 class 3 color R
+p 4 action dscp 48 class 0 color G
+p 4 action dscp 49 class 1 color Y
+p 4 action dscp 50 class 2 color R
+p 4 action dscp 51 class 3 color G
+p 4 action dscp 52 class 0 color Y
+p 4 action dscp 53 class 1 color R
+p 4 action dscp 54 class 2 color G
+p 4 action dscp 55 class 3 color Y
+p 4 action dscp 56 class 0 color R
+p 4 action dscp 57 class 1 color G
+p 4 action dscp 58 class 2 color Y
+p 4 action dscp 59 class 3 color R
+p 4 action dscp 60 class 0 color G
+p 4 action dscp 61 class 1 color Y
+p 4 action dscp 62 class 2 color R
+p 4 action dscp 63 class 3 color G
+p 5 route add 152.40.0.0 21 port 0 ether 00:98:28:28:14:00 mpls 0:0
+p 5 route add 152.40.8.0 21 port 0 ether 00:98:28:28:14:00 mpls 0:8
+p 5 route add 152.40.16.0 21 port 0 ether 00:98:28:28:14:00 mpls 0:16
+p 5 route add 152.40.24.0 21 port 0 ether 00:98:28:28:14:00 mpls 0:24
+p 5 route add 152.40.32.0 21 port 0 ether 00:98:28:28:14:00 mpls 0:32
+p 5 route add 152.40.40.0 21 port 0 ether 00:98:28:28:14:00 mpls 0:40
+p 5 route add 152.40.48.0 21 port 0 ether 00:98:28:28:14:00 mpls 0:48
+p 5 route add 152.40.56.0 21 port 0 ether 00:98:28:28:14:00 mpls 0:56
+p 5 route add 152.40.64.0 21 port 0 ether 00:98:28:28:14:00 mpls 0:64
+p 5 route add 152.40.72.0 21 port 0 ether 00:98:28:28:14:00 mpls 0:72
+p 5 route add 152.40.80.0 21 port 0 ether 00:98:28:28:14:00 mpls 0:80
+p 5 route add 152.40.88.0 21 port 0 ether 00:98:28:28:14:00 mpls 0:88
+p 5 route add 152.40.96.0 21 port 0 ether 00:98:28:28:14:00 mpls 0:96
+p 5 route add 152.40.104.0 21 port 0 ether 00:98:28:28:14:00 mpls 0:104
+p 5 route add 152.40.112.0 21 port 0 ether 00:98:28:28:14:00 mpls 0:112
+p 5 route add 152.40.120.0 21 port 0 ether 00:98:28:28:14:00 mpls 0:120
+p 5 route add 152.40.128.0 21 port 0 ether 00:98:28:28:14:00 mpls 0:128
+p 5 route add 152.40.136.0 21 port 0 ether 00:98:28:28:14:00 mpls 0:136
+p 5 route add 152.40.144.0 21 port 0 ether 00:98:28:28:14:00 mpls 0:144
+p 5 route add 152.40.152.0 21 port 0 ether 00:98:28:28:14:00 mpls 0:152
+p 5 route add 152.40.160.0 21 port 0 ether 00:98:28:28:14:00 mpls 0:160
+p 5 route add 152.40.168.0 21 port 0 ether 00:98:28:28:14:00 mpls 0:168
+p 5 route add 152.40.176.0 21 port 0 ether 00:98:28:28:14:00 mpls 0:176
+p 5 route add 152.40.184.0 21 port 0 ether 00:98:28:28:14:00 mpls 0:184
+p 5 route add 152.40.192.0 21 port 0 ether 00:98:28:28:14:00 mpls 0:192
+p 5 route add 152.40.200.0 21 port 0 ether 00:98:28:28:14:00 mpls 0:200
+p 5 route add 152.40.208.0 21 port 0 ether 00:98:28:28:14:00 mpls 0:208
+p 5 route add 152.40.216.0 21 port 0 ether 00:98:28:28:14:00 mpls 0:216
+p 5 route add 152.40.224.0 21 port 0 ether 00:98:28:28:14:00 mpls 0:224
+p 5 route add 152.40.232.0 21 port 0 ether 00:98:28:28:14:00 mpls 0:232
+p 5 route add 152.40.240.0 21 port 0 ether 00:98:28:28:14:00 mpls 0:240
+p 5 route add 152.40.248.0 21 port 0 ether 00:98:28:28:14:00 mpls 0:248
+p 5 route add default 1
+
+p 6 route add 152.16.0.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 0
+p 6 route add 152.16.1.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 1
+p 6 route add 152.16.2.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 2
+p 6 route add 152.16.3.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 3
+p 6 route add 152.16.4.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 4
+p 6 route add 152.16.5.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 5
+p 6 route add 152.16.6.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 6
+p 6 route add 152.16.7.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 7
+p 6 route add 152.16.8.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 8
+p 6 route add 152.16.9.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 9
+p 6 route add 152.16.10.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 10
+p 6 route add 152.16.11.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 11
+p 6 route add 152.16.12.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 12
+p 6 route add 152.16.13.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 13
+p 6 route add 152.16.14.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 14
+p 6 route add 152.16.15.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 15
+p 6 route add 152.16.16.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 16
+p 6 route add 152.16.17.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 17
+p 6 route add 152.16.18.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 18
+p 6 route add 152.16.19.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 19
+p 6 route add 152.16.20.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 20
+p 6 route add 152.16.21.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 21
+p 6 route add 152.16.22.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 22
+p 6 route add 152.16.23.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 23
+p 6 route add 152.16.24.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 24
+p 6 route add 152.16.25.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 25
+p 6 route add 152.16.26.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 26
+p 6 route add 152.16.27.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 27
+p 6 route add 152.16.28.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 28
+p 6 route add 152.16.29.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 29
+p 6 route add 152.16.30.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 30
+p 6 route add 152.16.31.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 31
+p 6 route add 152.16.32.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 32
+p 6 route add 152.16.33.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 33
+p 6 route add 152.16.34.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 34
+p 6 route add 152.16.35.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 35
+p 6 route add 152.16.36.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 36
+p 6 route add 152.16.37.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 37
+p 6 route add 152.16.38.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 38
+p 6 route add 152.16.39.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 39
+p 6 route add 152.16.40.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 40
+p 6 route add 152.16.41.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 41
+p 6 route add 152.16.42.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 42
+p 6 route add 152.16.43.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 43
+p 6 route add 152.16.44.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 44
+p 6 route add 152.16.45.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 45
+p 6 route add 152.16.46.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 46
+p 6 route add 152.16.47.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 47
+p 6 route add 152.16.48.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 48
+p 6 route add 152.16.49.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 49
+p 6 route add 152.16.50.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 50
+p 6 route add 152.16.51.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 51
+p 6 route add 152.16.52.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 52
+p 6 route add 152.16.53.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 53
+p 6 route add 152.16.54.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 54
+p 6 route add 152.16.55.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 55
+p 6 route add 152.16.56.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 56
+p 6 route add 152.16.57.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 57
+p 6 route add 152.16.58.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 58
+p 6 route add 152.16.59.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 59
+p 6 route add 152.16.60.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 60
+p 6 route add 152.16.61.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 61
+p 6 route add 152.16.62.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 62
+p 6 route add 152.16.63.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 63
+p 6 route add 152.16.64.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 64
+p 6 route add 152.16.65.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 65
+p 6 route add 152.16.66.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 66
+p 6 route add 152.16.67.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 67
+p 6 route add 152.16.68.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 68
+p 6 route add 152.16.69.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 69
+p 6 route add 152.16.70.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 70
+p 6 route add 152.16.71.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 71
+p 6 route add 152.16.72.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 72
+p 6 route add 152.16.73.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 73
+p 6 route add 152.16.74.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 74
+p 6 route add 152.16.75.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 75
+p 6 route add 152.16.76.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 76
+p 6 route add 152.16.77.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 77
+p 6 route add 152.16.78.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 78
+p 6 route add 152.16.79.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 79
+p 6 route add 152.16.80.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 80
+p 6 route add 152.16.81.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 81
+p 6 route add 152.16.82.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 82
+p 6 route add 152.16.83.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 83
+p 6 route add 152.16.84.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 84
+p 6 route add 152.16.85.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 85
+p 6 route add 152.16.86.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 86
+p 6 route add 152.16.87.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 87
+p 6 route add 152.16.88.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 88
+p 6 route add 152.16.89.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 89
+p 6 route add 152.16.90.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 90
+p 6 route add 152.16.91.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 91
+p 6 route add 152.16.92.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 92
+p 6 route add 152.16.93.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 93
+p 6 route add 152.16.94.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 94
+p 6 route add 152.16.95.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 95
+p 6 route add 152.16.96.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 96
+p 6 route add 152.16.97.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 97
+p 6 route add 152.16.98.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 98
+p 6 route add 152.16.99.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 99
+p 6 route add 152.16.100.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 100
+p 6 route add 152.16.101.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 101
+p 6 route add 152.16.102.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 102
+p 6 route add 152.16.103.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 103
+p 6 route add 152.16.104.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 104
+p 6 route add 152.16.105.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 105
+p 6 route add 152.16.106.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 106
+p 6 route add 152.16.107.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 107
+p 6 route add 152.16.108.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 108
+p 6 route add 152.16.109.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 109
+p 6 route add 152.16.110.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 110
+p 6 route add 152.16.111.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 111
+p 6 route add 152.16.112.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 112
+p 6 route add 152.16.113.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 113
+p 6 route add 152.16.114.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 114
+p 6 route add 152.16.115.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 115
+p 6 route add 152.16.116.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 116
+p 6 route add 152.16.117.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 117
+p 6 route add 152.16.118.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 118
+p 6 route add 152.16.119.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 119
+p 6 route add 152.16.120.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 120
+p 6 route add 152.16.121.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 121
+p 6 route add 152.16.122.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 122
+p 6 route add 152.16.123.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 123
+p 6 route add 152.16.124.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 124
+p 6 route add 152.16.125.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 125
+p 6 route add 152.16.126.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 126
+p 6 route add 152.16.127.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 127
+p 6 route add 152.16.128.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 128
+p 6 route add 152.16.129.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 129
+p 6 route add 152.16.130.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 130
+p 6 route add 152.16.131.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 131
+p 6 route add 152.16.132.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 132
+p 6 route add 152.16.133.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 133
+p 6 route add 152.16.134.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 134
+p 6 route add 152.16.135.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 135
+p 6 route add 152.16.136.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 136
+p 6 route add 152.16.137.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 137
+p 6 route add 152.16.138.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 138
+p 6 route add 152.16.139.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 139
+p 6 route add 152.16.140.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 140
+p 6 route add 152.16.141.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 141
+p 6 route add 152.16.142.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 142
+p 6 route add 152.16.143.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 143
+p 6 route add 152.16.144.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 144
+p 6 route add 152.16.145.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 145
+p 6 route add 152.16.146.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 146
+p 6 route add 152.16.147.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 147
+p 6 route add 152.16.148.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 148
+p 6 route add 152.16.149.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 149
+p 6 route add 152.16.150.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 150
+p 6 route add 152.16.151.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 151
+p 6 route add 152.16.152.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 152
+p 6 route add 152.16.153.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 153
+p 6 route add 152.16.154.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 154
+p 6 route add 152.16.155.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 155
+p 6 route add 152.16.156.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 156
+p 6 route add 152.16.157.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 157
+p 6 route add 152.16.158.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 158
+p 6 route add 152.16.159.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 159
+p 6 route add 152.16.160.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 160
+p 6 route add 152.16.161.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 161
+p 6 route add 152.16.162.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 162
+p 6 route add 152.16.163.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 163
+p 6 route add 152.16.164.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 164
+p 6 route add 152.16.165.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 165
+p 6 route add 152.16.166.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 166
+p 6 route add 152.16.167.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 167
+p 6 route add 152.16.168.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 168
+p 6 route add 152.16.169.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 169
+p 6 route add 152.16.170.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 170
+p 6 route add 152.16.171.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 171
+p 6 route add 152.16.172.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 172
+p 6 route add 152.16.173.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 173
+p 6 route add 152.16.174.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 174
+p 6 route add 152.16.175.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 175
+p 6 route add 152.16.176.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 176
+p 6 route add 152.16.177.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 177
+p 6 route add 152.16.178.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 178
+p 6 route add 152.16.179.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 179
+p 6 route add 152.16.180.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 180
+p 6 route add 152.16.181.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 181
+p 6 route add 152.16.182.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 182
+p 6 route add 152.16.183.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 183
+p 6 route add 152.16.184.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 184
+p 6 route add 152.16.185.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 185
+p 6 route add 152.16.186.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 186
+p 6 route add 152.16.187.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 187
+p 6 route add 152.16.188.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 188
+p 6 route add 152.16.189.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 189
+p 6 route add 152.16.190.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 190
+p 6 route add 152.16.191.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 191
+p 6 route add 152.16.192.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 192
+p 6 route add 152.16.193.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 193
+p 6 route add 152.16.194.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 194
+p 6 route add 152.16.195.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 195
+p 6 route add 152.16.196.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 196
+p 6 route add 152.16.197.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 197
+p 6 route add 152.16.198.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 198
+p 6 route add 152.16.199.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 199
+p 6 route add 152.16.200.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 200
+p 6 route add 152.16.201.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 201
+p 6 route add 152.16.202.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 202
+p 6 route add 152.16.203.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 203
+p 6 route add 152.16.204.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 204
+p 6 route add 152.16.205.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 205
+p 6 route add 152.16.206.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 206
+p 6 route add 152.16.207.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 207
+p 6 route add 152.16.208.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 208
+p 6 route add 152.16.209.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 209
+p 6 route add 152.16.210.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 210
+p 6 route add 152.16.211.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 211
+p 6 route add 152.16.212.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 212
+p 6 route add 152.16.213.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 213
+p 6 route add 152.16.214.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 214
+p 6 route add 152.16.215.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 215
+p 6 route add 152.16.216.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 216
+p 6 route add 152.16.217.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 217
+p 6 route add 152.16.218.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 218
+p 6 route add 152.16.219.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 219
+p 6 route add 152.16.220.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 220
+p 6 route add 152.16.221.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 221
+p 6 route add 152.16.222.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 222
+p 6 route add 152.16.223.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 223
+p 6 route add 152.16.224.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 224
+p 6 route add 152.16.225.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 225
+p 6 route add 152.16.226.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 226
+p 6 route add 152.16.227.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 227
+p 6 route add 152.16.228.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 228
+p 6 route add 152.16.229.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 229
+p 6 route add 152.16.230.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 230
+p 6 route add 152.16.231.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 231
+p 6 route add 152.16.232.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 232
+p 6 route add 152.16.233.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 233
+p 6 route add 152.16.234.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 234
+p 6 route add 152.16.235.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 235
+p 6 route add 152.16.236.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 236
+p 6 route add 152.16.237.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 237
+p 6 route add 152.16.238.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 238
+p 6 route add 152.16.239.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 239
+p 6 route add 152.16.240.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 240
+p 6 route add 152.16.241.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 241
+p 6 route add 152.16.242.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 242
+p 6 route add 152.16.243.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 243
+p 6 route add 152.16.244.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 244
+p 6 route add 152.16.245.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 245
+p 6 route add 152.16.246.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 246
+p 6 route add 152.16.247.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 247
+p 6 route add 152.16.248.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 248
+p 6 route add 152.16.249.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 249
+p 6 route add 152.16.250.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 250
+p 6 route add 152.16.251.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 251
+p 6 route add 152.16.252.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 252
+p 6 route add 152.16.253.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 253
+p 6 route add 152.16.254.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 254
+p 6 route add 152.16.255.0 24 port 0 ether 00:98:10:64:14:00 qinq 0 255
+p 6 route add default 1
diff --git a/samples/vnf_samples/traffic_profiles/ixia_ipv4_latency_vbng_1port_congested-8.yaml b/samples/vnf_samples/traffic_profiles/ixia_ipv4_latency_vbng_1port_congested-8.yaml
new file mode 100644
index 000000000..a3170048a
--- /dev/null
+++ b/samples/vnf_samples/traffic_profiles/ixia_ipv4_latency_vbng_1port_congested-8.yaml
@@ -0,0 +1,412 @@
+# Copyright (c) 2018 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+---
+schema: "nsb:traffic_profile:0.1"
+
+# This file is a template, it will be filled with values from tc.yaml before passing to the traffic generator
+
+name: rfc2544
+description: Traffic profile to run RFC2544 latency
+traffic_profile:
+ traffic_type : IXIARFC2544PppoeScenarioProfile # defines traffic behavior - constant or look for highest possible throughput
+ frame_rate : 12.5% # pc of linerate
+ duration: {{ duration }}
+ enable_latency: True
+
+uplink_0:
+ ipv4:
+ id: 1
+ port: xe0
+ outer_l2:
+ framesize: &uplink_framesize
+ 64B: "{{get(imix, 'imix.uplink.64B', '0') }}"
+ 68B: "{{get(imix, 'imix.uplink.68B', '0') }}"
+ 70B: "{{get(imix, 'imix.uplink.70B', '0') }}"
+ 128B: "{{get(imix, 'imix.uplink.128B', '0') }}"
+ 256B: "{{get(imix, 'imix.uplink.256B', '0') }}"
+ 373B: "{{get(imix, 'imix.uplink.373B', '0') }}"
+ 512B: "{{get(imix, 'imix.uplink.512B', '0') }}"
+ 570B: "{{get(imix, 'imix.uplink.570B', '0') }}"
+ 932B: "{{get(imix, 'imix.uplink.932B', '0') }}"
+ 940B: "{{get(imix, 'imix.uplink.940B', '0') }}"
+ 1024B: "{{get(imix, 'imix.uplink.1024B', '0') }}"
+ 1280B: "{{get(imix, 'imix.uplink.1280B', '0') }}"
+ 1400B: "{{get(imix, 'imix.uplink.1400B', '0') }}"
+ 1470B: "{{get(imix, 'imix.uplink.1470B', '0') }}"
+ 1500B: "{{get(imix, 'imix.uplink.1500B', '0') }}"
+ 1518B: "{{get(imix, 'imix.uplink.1518B', '0') }}"
+
+ outer_l3v4:
+ priority:
+ tos:
+ precedence: &uplink_precedence [0, 4, 7]
+downlink_0:
+ ipv4:
+ id: 2
+ port: xe1
+ outer_l2:
+ framesize: &downlink_framesize
+ 64B: "{{get(imix, 'imix.downlink.64B', '0') }}"
+ 68B: "{{get(imix, 'imix.downlink.68B', '0') }}"
+ 70B: "{{get(imix, 'imix.downlink.70B', '0') }}"
+ 128B: "{{get(imix, 'imix.downlink.128B', '0') }}"
+ 256B: "{{get(imix, 'imix.downlink.256B', '0') }}"
+ 373B: "{{get(imix, 'imix.downlink.373B', '0') }}"
+ 512B: "{{get(imix, 'imix.downlink.512B', '0') }}"
+ 570B: "{{get(imix, 'imix.downlink.570B', '0') }}"
+ 932B: "{{get(imix, 'imix.downlink.932B', '0') }}"
+ 940B: "{{get(imix, 'imix.downlink.940B', '0') }}"
+ 1024B: "{{get(imix, 'imix.downlink.1024B', '0') }}"
+ 1280B: "{{get(imix, 'imix.downlink.1280B', '0') }}"
+ 1400B: "{{get(imix, 'imix.downlink.1400B', '0') }}"
+ 1470B: "{{get(imix, 'imix.downlink.1470B', '0') }}"
+ 1500B: "{{get(imix, 'imix.downlink.1500B', '0') }}"
+ 1518B: "{{get(imix, 'imix.downlink.1518B', '0') }}"
+
+ outer_l3v4:
+ priority:
+ tos:
+ precedence: &downlink_precedence [0, 4, 7]
+uplink_1:
+ ipv4:
+ id: 3
+ port: xe0
+ outer_l2:
+ framesize: *uplink_framesize
+
+ outer_l3v4:
+ priority:
+ tos:
+ precedence: *uplink_precedence
+downlink_1:
+ ipv4:
+ id: 4
+ port: xe1
+ outer_l2:
+ framesize: *downlink_framesize
+
+ outer_l3v4:
+ priority:
+ tos:
+ precedence: *downlink_precedence
+uplink_2:
+ ipv4:
+ id: 5
+ port: xe0
+ outer_l2:
+ framesize: *uplink_framesize
+
+ outer_l3v4:
+ priority:
+ tos:
+ precedence: *uplink_precedence
+downlink_2:
+ ipv4:
+ id: 6
+ port: xe3
+ outer_l2:
+ framesize: *downlink_framesize
+
+ outer_l3v4:
+ priority:
+ tos:
+ precedence: *downlink_precedence
+uplink_3:
+ ipv4:
+ id: 7
+ port: xe0
+ outer_l2:
+ framesize: *uplink_framesize
+
+ outer_l3v4:
+ priority:
+ tos:
+ precedence: *uplink_precedence
+downlink_3:
+ ipv4:
+ id: 8
+ port: xe3
+ outer_l2:
+ framesize: *downlink_framesize
+
+ outer_l3v4:
+ priority:
+ tos:
+ precedence: *downlink_precedence
+uplink_4:
+ ipv4:
+ id: 9
+ port: xe2
+ outer_l2:
+ framesize: *uplink_framesize
+
+ outer_l3v4:
+ priority:
+ tos:
+ precedence: *uplink_precedence
+downlink_4:
+ ipv4:
+ id: 10
+ port: xe5
+ outer_l2:
+ framesize: *downlink_framesize
+
+ outer_l3v4:
+ priority:
+ tos:
+ precedence: *downlink_precedence
+uplink_5:
+ ipv4:
+ id: 11
+ port: xe2
+ outer_l2:
+ framesize: *uplink_framesize
+
+ outer_l3v4:
+ priority:
+ tos:
+ precedence: *uplink_precedence
+downlink_5:
+ ipv4:
+ id: 12
+ port: xe5
+ outer_l2:
+ framesize: *downlink_framesize
+
+ outer_l3v4:
+ priority:
+ tos:
+ precedence: *downlink_precedence
+uplink_6:
+ ipv4:
+ id: 13
+ port: xe2
+ outer_l2:
+ framesize: *uplink_framesize
+
+ outer_l3v4:
+ priority:
+ tos:
+ precedence: *uplink_precedence
+downlink_6:
+ ipv4:
+ id: 14
+ port: xe5
+ outer_l2:
+ framesize: *downlink_framesize
+
+ outer_l3v4:
+ priority:
+ tos:
+ precedence: *downlink_precedence
+uplink_7:
+ ipv4:
+ id: 15
+ port: xe2
+ outer_l2:
+ framesize: *uplink_framesize
+
+ outer_l3v4:
+ priority:
+ tos:
+ precedence: *uplink_precedence
+downlink_7:
+ ipv4:
+ id: 16
+ port: xe5
+ outer_l2:
+ framesize: *downlink_framesize
+
+ outer_l3v4:
+ priority:
+ tos:
+ precedence: *downlink_precedence
+uplink_8:
+ ipv4:
+ id: 17
+ port: xe4
+ outer_l2:
+ framesize: *uplink_framesize
+
+ outer_l3v4:
+ priority:
+ tos:
+ precedence: *uplink_precedence
+downlink_8:
+ ipv4:
+ id: 18
+ port: xe5
+ outer_l2:
+ framesize: *downlink_framesize
+
+ outer_l3v4:
+ priority:
+ tos:
+ precedence: *downlink_precedence
+uplink_9:
+ ipv4:
+ id: 19
+ port: xe4
+ outer_l2:
+ framesize: *uplink_framesize
+
+ outer_l3v4:
+ priority:
+ tos:
+ precedence: *uplink_precedence
+downlink_9:
+ ipv4:
+ id: 20
+ port: xe5
+ outer_l2:
+ framesize: *downlink_framesize
+
+ outer_l3v4:
+ priority:
+ tos:
+ precedence: *downlink_precedence
+uplink_10:
+ ipv4:
+ id: 21
+ port: xe4
+ outer_l2:
+ framesize: *uplink_framesize
+
+ outer_l3v4:
+ priority:
+ tos:
+ precedence: *uplink_precedence
+downlink_10:
+ ipv4:
+ id: 22
+ port: xe7
+ outer_l2:
+ framesize: *downlink_framesize
+
+ outer_l3v4:
+ priority:
+ tos:
+ precedence: *downlink_precedence
+uplink_11:
+ ipv4:
+ id: 23
+ port: xe4
+ outer_l2:
+ framesize: *uplink_framesize
+
+ outer_l3v4:
+ priority:
+ tos:
+ precedence: *uplink_precedence
+downlink_11:
+ ipv4:
+ id: 24
+ port: xe7
+ outer_l2:
+ framesize: *downlink_framesize
+
+ outer_l3v4:
+ priority:
+ tos:
+ precedence: *downlink_precedence
+
+uplink_12:
+ ipv4:
+ id: 25
+ port: xe6
+ outer_l2:
+ framesize: *uplink_framesize
+
+ outer_l3v4:
+ priority:
+ tos:
+ precedence: *uplink_precedence
+downlink_12:
+ ipv4:
+ id: 26
+ port: xe7
+ outer_l2:
+ framesize: *downlink_framesize
+
+ outer_l3v4:
+ priority:
+ tos:
+ precedence: *downlink_precedence
+uplink_13:
+ ipv4:
+ id: 27
+ port: xe6
+ outer_l2:
+ framesize: *uplink_framesize
+
+ outer_l3v4:
+ priority:
+ tos:
+ precedence: *uplink_precedence
+downlink_13:
+ ipv4:
+ id: 28
+ port: xe7
+ outer_l2:
+ framesize: *downlink_framesize
+
+ outer_l3v4:
+ priority:
+ tos:
+ precedence: *downlink_precedence
+uplink_14:
+ ipv4:
+ id: 29
+ port: xe6
+ outer_l2:
+ framesize: *uplink_framesize
+
+ outer_l3v4:
+ priority:
+ tos:
+ precedence: *uplink_precedence
+downlink_14:
+ ipv4:
+ id: 30
+ port: xe7
+ outer_l2:
+ framesize: *downlink_framesize
+
+ outer_l3v4:
+ priority:
+ tos:
+ precedence: *downlink_precedence
+uplink_15:
+ ipv4:
+ id: 31
+ port: xe6
+ outer_l2:
+ framesize: *uplink_framesize
+
+ outer_l3v4:
+ priority:
+ tos:
+ precedence: *uplink_precedence
+downlink_15:
+ ipv4:
+ id: 32
+ port: xe7
+ outer_l2:
+ framesize: *downlink_framesize
+
+ outer_l3v4:
+ priority:
+ tos:
+ precedence: *downlink_precedence
diff --git a/samples/vnf_samples/traffic_profiles/ixia_ipv4_latency_vbng-4.yaml b/samples/vnf_samples/traffic_profiles/ixia_ipv4_latency_vbng_scale_up.yaml
index e65876c30..4f427b76a 100644
--- a/samples/vnf_samples/traffic_profiles/ixia_ipv4_latency_vbng-4.yaml
+++ b/samples/vnf_samples/traffic_profiles/ixia_ipv4_latency_vbng_scale_up.yaml
@@ -12,6 +12,9 @@
# See the License for the specific language governing permissions and
# limitations under the License.
+---
+{% set svlan_per_port = get(extra_args, 'svlans_per_port') %}
+{% set ports = get(extra_args, 'access_vports_num')|int %}
schema: "nsb:traffic_profile:0.1"
# This file is a template, it will be filled with values from tc.yaml before passing to the traffic generator
@@ -19,14 +22,15 @@ schema: "nsb:traffic_profile:0.1"
name: rfc2544
description: Traffic profile to run RFC2544 latency
traffic_profile:
- traffic_type : IXIARFC2544Profile # defines traffic behavior - constant or look for highest possible throughput
- frame_rate : 25% # pc of linerate
+ traffic_type : IXIARFC2544PppoeScenarioProfile # defines traffic behavior - constant or look for highest possible throughput
+ frame_rate : 12.5% # pc of linerate
duration: {{ duration }}
enable_latency: True
-uplink_0:
+{% for i in range(svlan_per_port|int * ports|int) %}
+uplink_{{ i }}:
ipv4:
- id: 1
+ id: {{ (i * 2) + 1 }}
outer_l2:
framesize:
64B: "{{get(imix, 'imix.uplink.64B', '0') }}"
@@ -34,7 +38,7 @@ uplink_0:
70B: "{{get(imix, 'imix.uplink.70B', '0') }}"
128B: "{{get(imix, 'imix.uplink.128B', '0') }}"
256B: "{{get(imix, 'imix.uplink.256B', '0') }}"
- 373b: "{{get(imix, 'imix.uplink.373B', '0') }}"
+ 373B: "{{get(imix, 'imix.uplink.373B', '0') }}"
512B: "{{get(imix, 'imix.uplink.512B', '0') }}"
570B: "{{get(imix, 'imix.uplink.570B', '0') }}"
932B: "{{get(imix, 'imix.uplink.932B', '0') }}"
@@ -49,19 +53,10 @@ uplink_0:
outer_l3v4:
priority:
tos:
- # Precedence values:
- # 0 - (000) Routine
- # 1 - (001) Priority
- # 2 - (010) Immediate
- # 3 - (011) Flash
- # 4 - (100) Flash Override
- # 5 - (101) CRITIC/ECP
- # 6 - (110) Internetwork Control
- # 7 - (111) Network Control
precedence: [0, 4, 7]
-downlink_0:
+downlink_{{ i }}:
ipv4:
- id: 2
+ id: {{ (i * 2) + 2 }}
outer_l2:
framesize:
64B: "{{get(imix, 'imix.downlink.64B', '0') }}"
@@ -69,59 +64,7 @@ downlink_0:
70B: "{{get(imix, 'imix.downlink.70B', '0') }}"
128B: "{{get(imix, 'imix.downlink.128B', '0') }}"
256B: "{{get(imix, 'imix.downlink.256B', '0') }}"
- 373b: "{{get(imix, 'imix.downlink.373B', '0') }}"
- 512B: "{{get(imix, 'imix.downlink.512B', '0') }}"
- 570B: "{{get(imix, 'imix.downlink.570B', '0') }}"
- 932B: "{{get(imix, 'imix.downlink.932B', '0') }}"
- 940B: "{{get(imix, 'imix.downlink.940B', '0') }}"
- 1024B: "{{get(imix, 'imix.downlink.1024B', '0') }}"
- 1280B: "{{get(imix, 'imix.downlink.1280B', '0') }}"
- 1400B: "{{get(imix, 'imix.downlink.1400B', '0') }}"
- 1470B: "{{get(imix, 'imix.downlink.1470B', '0') }}"
- 1500B: "{{get(imix, 'imix.downlink.1500B', '0') }}"
- 1518B: "{{get(imix, 'imix.downlink.1518B', '0') }}"
-
- outer_l3v4:
- priority:
- tos:
- precedence: [0, 4, 7]
-uplink_1:
- ipv4:
- id: 3
- outer_l2:
- framesize:
- 64B: "{{get(imix, 'imix.uplink.64B', '0') }}"
- 68B: "{{get(imix, 'imix.uplink.68B', '0') }}"
- 70B: "{{get(imix, 'imix.uplink.70B', '0') }}"
- 128B: "{{get(imix, 'imix.uplink.128B', '0') }}"
- 256B: "{{get(imix, 'imix.uplink.256B', '0') }}"
- 373b: "{{get(imix, 'imix.uplink.373B', '0') }}"
- 512B: "{{get(imix, 'imix.uplink.512B', '0') }}"
- 570B: "{{get(imix, 'imix.uplink.570B', '0') }}"
- 932B: "{{get(imix, 'imix.uplink.932B', '0') }}"
- 940B: "{{get(imix, 'imix.uplink.940B', '0') }}"
- 1024B: "{{get(imix, 'imix.uplink.1024B', '0') }}"
- 1280B: "{{get(imix, 'imix.uplink.1280B', '0') }}"
- 1400B: "{{get(imix, 'imix.uplink.1400B', '0') }}"
- 1470B: "{{get(imix, 'imix.uplink.1470B', '0') }}"
- 1500B: "{{get(imix, 'imix.uplink.1500B', '0') }}"
- 1518B: "{{get(imix, 'imix.uplink.1518B', '0') }}"
-
- outer_l3v4:
- priority:
- tos:
- precedence: [0, 4, 7]
-downlink_1:
- ipv4:
- id: 4
- outer_l2:
- framesize:
- 64B: "{{get(imix, 'imix.downlink.64B', '0') }}"
- 68B: "{{get(imix, 'imix.downlink.68B', '0') }}"
- 70B: "{{get(imix, 'imix.downlink.70B', '0') }}"
- 128B: "{{get(imix, 'imix.downlink.128B', '0') }}"
- 256B: "{{get(imix, 'imix.downlink.256B', '0') }}"
- 373b: "{{get(imix, 'imix.downlink.373B', '0') }}"
+ 373B: "{{get(imix, 'imix.downlink.373B', '0') }}"
512B: "{{get(imix, 'imix.downlink.512B', '0') }}"
570B: "{{get(imix, 'imix.downlink.570B', '0') }}"
932B: "{{get(imix, 'imix.downlink.932B', '0') }}"
@@ -137,3 +80,4 @@ downlink_1:
priority:
tos:
precedence: [0, 4, 7]
+{% endfor %}
diff --git a/yardstick/benchmark/core/report.py b/yardstick/benchmark/core/report.py
index a484a49f3..530fbf165 100644
--- a/yardstick/benchmark/core/report.py
+++ b/yardstick/benchmark/core/report.py
@@ -135,7 +135,7 @@ class Report(object):
self.db_task = self._get_tasks()
field_keys = []
- temp_series = []
+ datasets = []
table_vals = {}
field_keys = [encodeutils.to_utf8(field['fieldKey'])
@@ -143,7 +143,6 @@ class Report(object):
for key in field_keys:
self.Timestamp = []
- series = {}
values = []
for task in self.db_task:
task_time = encodeutils.to_utf8(task['time'])
@@ -155,16 +154,14 @@ class Report(object):
task_time = head + "." + tail[:6]
self.Timestamp.append(task_time)
if task[key] is None:
- values.append('')
+ values.append(None)
elif isinstance(task[key], (int, float)) is True:
values.append(task[key])
else:
values.append(ast.literal_eval(task[key]))
+ datasets.append({'label': key, 'data': values})
table_vals['Timestamp'] = self.Timestamp
table_vals[key] = values
- series['name'] = key
- series['data'] = values
- temp_series.append(series)
template_dir = consts.YARDSTICK_ROOT_PATH + "yardstick/common"
template_environment = jinja2.Environment(
@@ -173,7 +170,7 @@ class Report(object):
trim_blocks=False)
context = {
- "series": temp_series,
+ "datasets": datasets,
"Timestamps": self.Timestamp,
"task_id": self.task_id,
"table": table_vals,
diff --git a/yardstick/benchmark/runners/iteration.py b/yardstick/benchmark/runners/iteration.py
index 4c88f3671..58ab06a32 100644
--- a/yardstick/benchmark/runners/iteration.py
+++ b/yardstick/benchmark/runners/iteration.py
@@ -96,6 +96,7 @@ def _worker_process(queue, cls, method_name, scenario_cfg,
except Exception: # pylint: disable=broad-except
errors = traceback.format_exc()
LOG.exception("")
+ raise
else:
if result:
# add timeout for put so we don't block test
diff --git a/yardstick/common/nsb_report.css b/yardstick/common/nsb_report.css
index 0c47791e2..2beb91c53 100644
--- a/yardstick/common/nsb_report.css
+++ b/yardstick/common/nsb_report.css
@@ -19,7 +19,7 @@ table {
}
header {
- font-family: Frutiger;
+ font-family: Frutiger, "Helvetica Neue", Helvetica, Arial, sans-serif;
clear: left;
text-align: center;
}
diff --git a/yardstick/common/nsb_report.html.j2 b/yardstick/common/nsb_report.html.j2
index f1b4ae1c2..a3087d746 100644
--- a/yardstick/common/nsb_report.html.j2
+++ b/yardstick/common/nsb_report.html.j2
@@ -15,12 +15,17 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.3.5/themes/default/style.min.css">
- <link rel="stylesheet" href="{{template_dir}}/nsb_report.css">
- <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.3.7/themes/default/style.min.css">
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
- <script src="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/jstree.min.js"></script>
- <script src="https://code.highcharts.com/highcharts.js"></script>
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.3.7/jstree.min.js"></script>
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.3/Chart.bundle.min.js"></script>
+ <style>
+ {% include 'nsb_report.css' %}
+ </style>
+ <script>
+ {% include 'nsb_report.js' %}
+ </script>
</head>
<body>
@@ -31,12 +36,12 @@
<h4>Report of {{task_id}} Generated</h4>
</header>
</div>
- <div class="row" style="height:500px">
+ <div class="row">
<div class="col-md-2 control-pane">
<div id="data_selector"></div>
</div>
<div class="col-md-10 data-pane">
- <div id="graph"></div>
+ <canvas id="cnvGraph" style="width: 100%; height: 500px"></canvas>
</div>
</div>
<div class="row">
@@ -47,112 +52,29 @@
</div>
<script>
- var arr, tab, tr, td, tbody, keys, key, curr_data;
+ var arr, jstree_data, timestamps;
arr = {{table|safe}};
-
- tab = document.getElementsByTagName('table')[0];
- tbody = document.createElement('tbody');
- keys = Object.keys(arr);
- // for each metric
- for (var i = 0; i < keys.length; i++) {
- tr = document.createElement('tr');
- td = document.createElement('td');
- key = keys[i];
- td.append(key);
- tr.append(td);
- curr_data = arr[key];
- // add each piece of data as its own column
- for (var j = 0; j < curr_data.length; j++) {
- td = document.createElement('td');
- td.append(curr_data[j]);
- tr.append(td);
- }
- tbody.append(tr);
- }
- tab.appendChild(tbody);
+ timestamps = {{Timestamps|safe}};
+ jstree_data = {{jstree_nodes|safe}};
$(function() {
- $('#data_selector').jstree({
- plugins: ['checkbox'],
- checkbox: {
- three_state: false,
- whole_node: true,
- tie_selection: false,
- },
- core: {
- themes: {
- icons: false,
- stripes: true,
- },
- data: {{jstree_nodes|safe}},
- },
- });
+ create_table(arr);
+ create_tree(jstree_data);
+ var objGraph = create_graph($('#cnvGraph'), timestamps);
$('#data_selector').on('check_node.jstree uncheck_node.jstree', function(e, data) {
- var selected_leaves = [];
+ var selected_datasets = [];
for (var i = 0; i < data.selected.length; i++) {
var node = data.instance.get_node(data.selected[i]);
if (node.children.length == 0) {
- var point = {name: node.id, data: arr[node.id]};
- selected_leaves.push(point);
- }
- }
-
- $('#graph').highcharts({
- title: {
- text: 'Yardstick Graphs',
- x: -20, //center
- },
- chart: {
- marginLeft: 400,
- zoomType: 'x',
- type: 'spline',
- },
- xAxis: {
- crosshair: {
- width: 1,
- color: 'black',
- },
- title: {
- text: 'Timestamp',
- },
- categories: {{Timestamps|safe}},
- },
- yAxis: {
- crosshair: {
- width: 1,
- color: 'black',
- },
- plotLines: [{
- value: 0,
- width: 1,
- color: '#808080',
- }],
- },
- plotOptions: {
- series: {
- showCheckbox: false,
- visible: false,
- },
- },
- tooltip: {
- valueSuffix: '',
- },
- legend: {
- enabled: true,
- },
- series: selected_leaves,
- });
-
- var chart = $('#graph').highcharts();
- for (var i = 0; i < chart.series.length; i++) {
- var series = chart.series[i];
- if (series.visible) {
- series.hide();
- } else {
- series.show();
+ var dataset = {
+ label: node.id,
+ data: arr[node.id],
+ };
+ selected_datasets.push(dataset);
}
}
+ update_graph(objGraph, selected_datasets);
});
});
</script>
diff --git a/yardstick/common/nsb_report.js b/yardstick/common/nsb_report.js
new file mode 100644
index 000000000..cc5e14ee7
--- /dev/null
+++ b/yardstick/common/nsb_report.js
@@ -0,0 +1,146 @@
+/*******************************************************************************
+ * Copyright (c) 2017 Rajesh Kudaka <4k.rajesh@gmail.com>
+ * Copyright (c) 2018 Intel Corporation.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Apache License, Version 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ ******************************************************************************/
+
+var None = null;
+
+function create_tree(jstree_data)
+{
+ $('#data_selector').jstree({
+ plugins: ['checkbox'],
+ checkbox: {
+ three_state: false,
+ whole_node: true,
+ tie_selection: false,
+ },
+ core: {
+ themes: {
+ icons: false,
+ stripes: true,
+ },
+ data: jstree_data,
+ },
+ });
+}
+
+// may need to pass timestamps too...
+function create_table(table_data)
+{
+ var tab, tr, td, tn, tbody, keys, key, curr_data, val;
+ // create table
+ tab = document.getElementsByTagName('table')[0];
+ tbody = document.createElement('tbody');
+ // for each metric
+ keys = Object.keys(table_data);
+ for (var i = 0; i < keys.length; i++) {
+ key = keys[i];
+ tr = document.createElement('tr');
+ td = document.createElement('td');
+ tn = document.createTextNode(key);
+ td.appendChild(tn);
+ tr.appendChild(td);
+ // add each piece of data as its own column
+ curr_data = table_data[key];
+ for (var j = 0; j < curr_data.length; j++) {
+ val = curr_data[j];
+ td = document.createElement('td');
+ tn = document.createTextNode(val === None ? '' : val);
+ td.appendChild(tn);
+ tr.appendChild(td);
+ }
+ tbody.appendChild(tr);
+ }
+ tab.appendChild(tbody);
+}
+
+function create_graph(cnvGraph, timestamps)
+{
+ return new Chart(cnvGraph, {
+ type: 'line',
+ data: {
+ labels: timestamps,
+ datasets: [],
+ },
+ options: {
+ elements: {
+ line: {
+ borderWidth: 2,
+ fill: false,
+ tension: 0,
+ },
+ },
+ scales: {
+ xAxes: [{
+ type: 'category',
+ }],
+ yAxes: [{
+ type: 'linear',
+ }],
+ },
+ tooltips: {
+ mode: 'point',
+ intersect: true,
+ },
+ hover: {
+ mode: 'index',
+ intersect: false,
+ animationDuration: 0,
+ },
+ legend: {
+ position: 'bottom',
+ labels: {
+ usePointStyle: true,
+ },
+ },
+ animation: {
+ duration: 0,
+ },
+ responsive: true,
+ responsiveAnimationDuration: 0,
+ maintainAspectRatio: false,
+ },
+ });
+}
+
+function update_graph(objGraph, datasets)
+{
+ var colors = [
+ '#FF0000', // Red
+ '#228B22', // ForestGreen
+ '#FF8C00', // DarkOrange
+ '#00008B', // DarkBlue
+ '#FF00FF', // Fuchsia
+ '#9ACD32', // YellowGreen
+ '#FFD700', // Gold
+ '#4169E1', // RoyalBlue
+ '#A0522D', // Sienna
+ '#20B2AA', // LightSeaGreen
+ '#8A2BE2', // BlueViolet
+ ];
+
+ var points = [
+ {s: 'circle', r: 3},
+ {s: 'rect', r: 4},
+ {s: 'triangle', r: 4},
+ {s: 'star', r: 4},
+ {s: 'rectRot', r: 5},
+ ];
+
+ datasets.forEach(function(d, i) {
+ var color = colors[i % colors.length];
+ var point = points[i % points.length];
+ d.borderColor = color;
+ d.backgroundColor = color;
+ d.pointStyle = point.s;
+ d.pointRadius = point.r;
+ d.pointHoverRadius = point.r + 1;
+ });
+ objGraph.data.datasets = datasets;
+ objGraph.update();
+}
diff --git a/yardstick/common/report.html.j2 b/yardstick/common/report.html.j2
index ab76510ca..1dc7b1db1 100644
--- a/yardstick/common/report.html.j2
+++ b/yardstick/common/report.html.j2
@@ -15,9 +15,9 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
- <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
- <script src="https://code.highcharts.com/highcharts.js"></script>
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.3/Chart.bundle.min.js"></script>
<style>
table {
@@ -26,7 +26,7 @@
display: block;
}
header {
- font-family: Frutiger;
+ font-family: Frutiger, "Helvetica Neue", Helvetica, Arial, sans-serif;
clear: left;
text-align: center;
}
@@ -47,13 +47,14 @@
</div>
</div>
<div class="col-md-8">
- <div id="container"></div>
+ <canvas id="cnvGraph" style="width: 100%; height: 500px"></canvas>
</div>
</div>
</div>
<script>
- var arr, tab, th, tr, td, tn, row, col, thead, tbody;
+ var None = null;
+ var arr, tab, th, tr, td, tn, row, col, thead, tbody, val;
arr = {{table|safe}};
tab = document.getElementsByTagName('table')[0];
@@ -64,16 +65,17 @@
tn = document.createTextNode(Object.keys(arr).sort()[col]);
th.appendChild(tn);
tr.appendChild(th);
- thead.appendChild(tr);
}
+ thead.appendChild(tr);
tab.appendChild(thead);
tbody = document.createElement('tbody');
for (row = 0; row < arr[Object.keys(arr)[0]].length; row++) {
tr = document.createElement('tr');
for (col = 0; col < Object.keys(arr).length; col++) {
+ val = arr[Object.keys(arr).sort()[col]][row];
td = document.createElement('td');
- tn = document.createTextNode(arr[Object.keys(arr).sort()[col]][row]);
+ tn = document.createTextNode(val === None ? '' : val);
td.appendChild(tn);
tr.appendChild(td);
}
@@ -82,38 +84,99 @@
tab.appendChild(tbody);
$(function() {
- $('#container').highcharts({
- title: {
- text: 'Yardstick test results',
- x: -20, //center
- },
- subtitle: {
- text: 'Report of {{task_id}} Task Generated',
- x: -20,
+ var datasets = {{datasets|safe}};
+
+ var colors = [
+ '#FF0000', // Red
+ '#228B22', // ForestGreen
+ '#FF8C00', // DarkOrange
+ '#00008B', // DarkBlue
+ '#FF00FF', // Fuchsia
+ '#9ACD32', // YellowGreen
+ '#FFD700', // Gold
+ '#4169E1', // RoyalBlue
+ '#A0522D', // Sienna
+ '#20B2AA', // LightSeaGreen
+ '#8A2BE2', // BlueViolet
+ ];
+
+ var points = [
+ {s: 'circle', r: 3},
+ {s: 'rect', r: 4},
+ {s: 'triangle', r: 4},
+ {s: 'star', r: 4},
+ {s: 'rectRot', r: 5},
+ ];
+
+ datasets.forEach(function(d, i) {
+ var color = colors[i % colors.length];
+ var point = points[i % points.length];
+ d.borderColor = color;
+ d.backgroundColor = color;
+ d.pointStyle = point.s;
+ d.pointRadius = point.r;
+ d.pointHoverRadius = point.r + 1;
+ });
+
+ new Chart($('#cnvGraph'), {
+ type: 'line',
+ data: {
+ labels: {{Timestamps|safe}},
+ datasets: datasets,
},
- xAxis: {
+ options: {
+ elements: {
+ line: {
+ borderWidth: 2,
+ fill: false,
+ tension: 0,
+ },
+ },
title: {
- text: 'Timestamp',
+ text: [
+ 'Yardstick test results',
+ 'Report of {{task_id}} Task Generated',
+ ],
+ display: true,
},
- categories: {{Timestamps|safe}},
- },
- yAxis: {
- plotLines: [{
- value: 0,
- width: 1,
- color: '#808080',
- }],
- },
- tooltip: {
- valueSuffix: '',
- },
- legend: {
- layout: 'vertical',
- align: 'right',
- verticalAlign: 'middle',
- borderWidth: 0,
+ scales: {
+ xAxes: [{
+ type: 'category',
+ scaleLabel: {
+ display: true,
+ labelString: 'Timestamp',
+ },
+ }],
+ yAxes: [{
+ type: 'linear',
+ scaleLabel: {
+ display: true,
+ labelString: 'Values',
+ },
+ }],
+ },
+ tooltips: {
+ mode: 'point',
+ intersect: true,
+ },
+ hover: {
+ mode: 'index',
+ intersect: false,
+ animationDuration: 0,
+ },
+ legend: {
+ position: 'right',
+ labels: {
+ usePointStyle: true,
+ },
+ },
+ animation: {
+ duration: 0,
+ },
+ responsive: true,
+ responsiveAnimationDuration: 0,
+ maintainAspectRatio: false,
},
- series: {{series|safe}},
});
});
</script>
diff --git a/yardstick/network_services/libs/ixia_libs/ixnet/ixnet_api.py b/yardstick/network_services/libs/ixia_libs/ixnet/ixnet_api.py
index d8297d10f..6645d45fe 100644
--- a/yardstick/network_services/libs/ixia_libs/ixnet/ixnet_api.py
+++ b/yardstick/network_services/libs/ixia_libs/ixnet/ixnet_api.py
@@ -216,6 +216,14 @@ class IxNextgen(object): # pragma: no cover
"""
return self.ixnet.getAttribute(proto, '-sessionStatus')
+ def get_topology_device_groups(self, topology):
+ """Get list of device groups in topology
+
+ :param topology: (str) topology descriptor
+ :return: (list) list of device groups descriptors
+ """
+ return self.ixnet.getList(topology, 'deviceGroup')
+
def is_traffic_running(self):
"""Returns true if traffic state == TRAFFIC_STATUS_STARTED"""
return self._get_traffic_state() == TRAFFIC_STATUS_STARTED
@@ -406,7 +414,7 @@ class IxNextgen(object): # pragma: no cover
self._create_flow_groups(uplink_endpoints, downlink_endpoints)
self._setup_config_elements()
- def create_ipv4_traffic_model(self, uplink_topologies, downlink_topologies):
+ def create_ipv4_traffic_model(self, uplink_endpoints, downlink_endpoints):
"""Create a traffic item and the needed flow groups
Each flow group inside the traffic item (only one is present)
@@ -418,7 +426,7 @@ class IxNextgen(object): # pragma: no cover
FlowGroup4: uplink2 <- downlink2
"""
self._create_traffic_item('ipv4')
- self._create_flow_groups(uplink_topologies, downlink_topologies)
+ self._create_flow_groups(uplink_endpoints, downlink_endpoints)
self._setup_config_elements(False)
def _update_frame_mac(self, ethernet_descriptor, field, mac_address):
diff --git a/yardstick/network_services/traffic_profile/base.py b/yardstick/network_services/traffic_profile/base.py
index ea3f17874..2fdf6ce4a 100644
--- a/yardstick/network_services/traffic_profile/base.py
+++ b/yardstick/network_services/traffic_profile/base.py
@@ -36,7 +36,7 @@ class TrafficProfileConfig(object):
self.description = tp_config.get('description')
tprofile = tp_config['traffic_profile']
self.traffic_type = tprofile.get('traffic_type')
- self.frame_rate, self.rate_unit = self._parse_rate(
+ self.frame_rate, self.rate_unit = self.parse_rate(
tprofile.get('frame_rate', self.DEFAULT_FRAME_RATE))
self.test_precision = tprofile.get('test_precision')
self.packet_sizes = tprofile.get('packet_sizes')
@@ -46,7 +46,7 @@ class TrafficProfileConfig(object):
self.step_interval = tprofile.get('step_interval')
self.enable_latency = tprofile.get('enable_latency', False)
- def _parse_rate(self, rate):
+ def parse_rate(self, rate):
"""Parse traffic profile rate
The line rate can be defined in fps or percentage over the maximum line
diff --git a/yardstick/network_services/traffic_profile/ixia_rfc2544.py b/yardstick/network_services/traffic_profile/ixia_rfc2544.py
index 83d24a412..35038891b 100644
--- a/yardstick/network_services/traffic_profile/ixia_rfc2544.py
+++ b/yardstick/network_services/traffic_profile/ixia_rfc2544.py
@@ -13,6 +13,7 @@
# limitations under the License.
import logging
+import collections
from yardstick.common import utils
from yardstick.network_services.traffic_profile import base as tp_base
@@ -35,6 +36,7 @@ class IXIARFC2544Profile(trex_traffic_profile.TrexProfile):
super(IXIARFC2544Profile, self).__init__(yaml_data)
self.rate = self.config.frame_rate
self.rate_unit = self.config.rate_unit
+ self.full_profile = {}
def _get_ip_and_mask(self, ip_range):
_ip_range = ip_range.split('-')
@@ -78,6 +80,12 @@ class IXIARFC2544Profile(trex_traffic_profile.TrexProfile):
'outer_l4': {},
}
+ frame_rate = value.get('frame_rate')
+ if frame_rate:
+ flow_rate, flow_rate_unit = self.config.parse_rate(frame_rate)
+ result[traffickey]['rate'] = flow_rate
+ result[traffickey]['rate_unit'] = flow_rate_unit
+
outer_l2 = value.get('outer_l2')
if outer_l2:
result[traffickey]['outer_l2'].update({
@@ -164,9 +172,7 @@ class IXIARFC2544Profile(trex_traffic_profile.TrexProfile):
first_run = self.first_run
if self.first_run:
self.first_run = False
- self.full_profile = {}
self.pg_id = 0
- self.update_traffic_profile(traffic_generator)
self.max_rate = self.rate
self.min_rate = 0.0
else:
@@ -237,3 +243,33 @@ class IXIARFC2544Profile(trex_traffic_profile.TrexProfile):
samples['latency_ns_max'] = latency_ns_max
return completed, samples
+
+
+class IXIARFC2544PppoeScenarioProfile(IXIARFC2544Profile):
+ """Class handles BNG PPPoE scenario tests traffic profile"""
+
+ def __init__(self, yaml_data):
+ super(IXIARFC2544PppoeScenarioProfile, self).__init__(yaml_data)
+ self.full_profile = collections.OrderedDict()
+
+ def _get_flow_groups_params(self):
+ flows_data = [key for key in self.params.keys()
+ if key.split('_')[0] in [self.UPLINK, self.DOWNLINK]]
+ for i in range(len(flows_data)):
+ uplink = '_'.join([self.UPLINK, str(i)])
+ downlink = '_'.join([self.DOWNLINK, str(i)])
+ if uplink in flows_data:
+ self.full_profile.update({uplink: self.params[uplink]})
+ if downlink in flows_data:
+ self.full_profile.update({downlink: self.params[downlink]})
+
+ def update_traffic_profile(self, traffic_generator):
+ def port_generator():
+ for vld_id, intfs in sorted(traffic_generator.networks.items()):
+ if not vld_id.startswith((self.UPLINK, self.DOWNLINK)):
+ continue
+ for intf in intfs:
+ yield traffic_generator.vnfd_helper.port_num(intf)
+
+ self._get_flow_groups_params()
+ self.ports = [port for port in port_generator()]
diff --git a/yardstick/network_services/vnf_generic/vnf/sample_vnf.py b/yardstick/network_services/vnf_generic/vnf/sample_vnf.py
index ebe3ff774..8833b88f2 100644
--- a/yardstick/network_services/vnf_generic/vnf/sample_vnf.py
+++ b/yardstick/network_services/vnf_generic/vnf/sample_vnf.py
@@ -180,7 +180,7 @@ class DpdkVnfSetupEnvHelper(SetupEnvHelper):
"""No actions/rules (flows) by default"""
return None
- def _build_pipeline_kwargs(self, cfg_file=None):
+ def _build_pipeline_kwargs(self, cfg_file=None, script=None):
tool_path = self.ssh_helper.provision_tool(tool_file=self.APP_NAME)
# count the number of actual ports in the list of pairs
# remove duplicate ports
@@ -201,7 +201,7 @@ class DpdkVnfSetupEnvHelper(SetupEnvHelper):
self.pipeline_kwargs = {
'cfg_file': cfg_file if cfg_file else self.CFG_CONFIG,
- 'script': self.CFG_SCRIPT,
+ 'script': script if script else self.CFG_SCRIPT,
'port_mask_hex': ports_mask_hex,
'tool_path': tool_path,
'hwlb': hwlb,
diff --git a/yardstick/network_services/vnf_generic/vnf/tg_rfc2544_ixia.py b/yardstick/network_services/vnf_generic/vnf/tg_rfc2544_ixia.py
index 4c13112be..1d37f8f6f 100644
--- a/yardstick/network_services/vnf_generic/vnf/tg_rfc2544_ixia.py
+++ b/yardstick/network_services/vnf_generic/vnf/tg_rfc2544_ixia.py
@@ -43,7 +43,8 @@ class IxiaBasicScenario(object):
def apply_config(self):
pass
- def create_traffic_model(self):
+ def create_traffic_model(self, traffic_profile=None):
+ # pylint: disable=unused-argument
vports = self.client.get_vports()
self._uplink_vports = vports[::2]
self._downlink_vports = vports[1::2]
@@ -71,6 +72,7 @@ class IxiaPppoeClientScenario(object):
self._context_cfg = context_cfg
self._ixia_cfg = ixia_cfg
self.protocols = []
+ self.device_groups = []
def apply_config(self):
vports = self.client.get_vports()
@@ -80,9 +82,15 @@ class IxiaPppoeClientScenario(object):
self._apply_access_network_config()
self._apply_core_network_config()
- def create_traffic_model(self):
- self.client.create_ipv4_traffic_model(self._access_topologies,
- self._core_topologies)
+ def create_traffic_model(self, traffic_profile):
+ endpoints_id_pairs = self._get_endpoints_src_dst_id_pairs(
+ traffic_profile.full_profile)
+ endpoints_obj_pairs = \
+ self._get_endpoints_src_dst_obj_pairs(endpoints_id_pairs)
+ uplink_endpoints = endpoints_obj_pairs[::2]
+ downlink_endpoints = endpoints_obj_pairs[1::2]
+ self.client.create_ipv4_traffic_model(uplink_endpoints,
+ downlink_endpoints)
def run_protocols(self):
LOG.info('PPPoE Scenario - Start Protocols')
@@ -116,6 +124,144 @@ class IxiaPppoeClientScenario(object):
strict=False)
return ip, ipaddr.prefixlen
+ @staticmethod
+ def _get_endpoints_src_dst_id_pairs(flows_params):
+ """Get list of flows src/dst port pairs
+
+ Create list of flows src/dst port pairs based on traffic profile
+ flows data. Each uplink/downlink pair in traffic profile represents
+ specific flows between the pair of ports.
+
+ Example ('port' key represents port on which flow will be created):
+
+ Input flows data:
+ uplink_0:
+ ipv4:
+ id: 1
+ port: xe0
+ downlink_0:
+ ipv4:
+ id: 2
+ port: xe1
+ uplink_1:
+ ipv4:
+ id: 3
+ port: xe2
+ downlink_1:
+ ipv4:
+ id: 4
+ port: xe3
+
+ Result list: ['xe0', 'xe1', 'xe2', 'xe3']
+
+ Result list means that the following flows pairs will be created:
+ - uplink 0: port xe0 <-> port xe1
+ - downlink 0: port xe1 <-> port xe0
+ - uplink 1: port xe2 <-> port xe3
+ - downlink 1: port xe3 <-> port xe2
+
+ :param flows_params: ordered dict of traffic profile flows params
+ :return: (list) list of flows src/dst ports
+ """
+ if len(flows_params) % 2:
+ raise RuntimeError('Number of uplink/downlink pairs'
+ ' in traffic profile is not equal')
+ endpoint_pairs = []
+ for flow in flows_params:
+ port = flows_params[flow]['ipv4'].get('port')
+ if port is None:
+ continue
+ endpoint_pairs.append(port)
+ return endpoint_pairs
+
+ def _get_endpoints_src_dst_obj_pairs(self, endpoints_id_pairs):
+ """Create list of uplink/downlink device groups pairs
+
+ Based on traffic profile options, create list of uplink/downlink
+ device groups pairs between which flow groups will be created:
+
+ 1. In case uplink/downlink flows in traffic profile doesn't have
+ specified 'port' key, flows will be created between each device
+ group on access port and device group on corresponding core port.
+ E.g.:
+ Device groups created on access port xe0: dg1, dg2, dg3
+ Device groups created on core port xe1: dg4
+ Flows will be created between:
+ dg1 -> dg4
+ dg4 -> dg1
+ dg2 -> dg4
+ dg4 -> dg2
+ dg3 -> dg4
+ dg4 -> dg3
+
+ 2. In case uplink/downlink flows in traffic profile have specified
+ 'port' key, flows will be created between device groups on this
+ port.
+ E.g., for the following traffic profile
+ uplink_0:
+ port: xe0
+ downlink_0:
+ port: xe1
+ uplink_1:
+ port: xe0
+ downlink_0:
+ port: xe3
+ Flows will be created between:
+ Port xe0 (dg1) -> Port xe1 (dg1)
+ Port xe1 (dg1) -> Port xe0 (dg1)
+ Port xe0 (dg2) -> Port xe3 (dg1)
+ Port xe3 (dg3) -> Port xe0 (dg1)
+
+ :param endpoints_id_pairs: (list) List of uplink/downlink flows ports
+ pairs
+ :return: (list) list of uplink/downlink device groups descriptors pairs
+ """
+ pppoe = self._ixia_cfg['pppoe_client']
+ sessions_per_port = pppoe['sessions_per_port']
+ sessions_per_svlan = pppoe['sessions_per_svlan']
+ svlan_count = int(sessions_per_port / sessions_per_svlan)
+
+ uplink_ports = [p['tg__0'] for p in self._ixia_cfg['flow']['src_ip']]
+ downlink_ports = [p['tg__0'] for p in self._ixia_cfg['flow']['dst_ip']]
+ uplink_port_topology_map = zip(uplink_ports, self._access_topologies)
+ downlink_port_topology_map = zip(downlink_ports, self._core_topologies)
+
+ port_to_dev_group_mapping = {}
+ for port, topology in uplink_port_topology_map:
+ topology_dgs = self.client.get_topology_device_groups(topology)
+ port_to_dev_group_mapping[port] = topology_dgs
+ for port, topology in downlink_port_topology_map:
+ topology_dgs = self.client.get_topology_device_groups(topology)
+ port_to_dev_group_mapping[port] = topology_dgs
+
+ uplink_endpoints = endpoints_id_pairs[::2]
+ downlink_endpoints = endpoints_id_pairs[1::2]
+
+ uplink_dev_groups = []
+ group_up = [uplink_endpoints[i:i + svlan_count]
+ for i in range(0, len(uplink_endpoints), svlan_count)]
+
+ for group in group_up:
+ for i, port in enumerate(group):
+ uplink_dev_groups.append(port_to_dev_group_mapping[port][i])
+
+ downlink_dev_groups = []
+ for port in downlink_endpoints:
+ downlink_dev_groups.append(port_to_dev_group_mapping[port][0])
+
+ endpoint_obj_pairs = []
+ [endpoint_obj_pairs.extend([up, down])
+ for up, down in zip(uplink_dev_groups, downlink_dev_groups)]
+
+ if not endpoint_obj_pairs:
+ for up, down in zip(uplink_ports, downlink_ports):
+ uplink_dev_groups = port_to_dev_group_mapping[up]
+ downlink_dev_groups = \
+ port_to_dev_group_mapping[down] * len(uplink_dev_groups)
+ [endpoint_obj_pairs.extend(list(i))
+ for i in zip(uplink_dev_groups, downlink_dev_groups)]
+ return endpoint_obj_pairs
+
def _fill_ixia_config(self):
pppoe = self._ixia_cfg["pppoe_client"]
ipv4 = self._ixia_cfg["ipv4_client"]
@@ -151,6 +297,7 @@ class IxiaPppoeClientScenario(object):
c_vlan = ixnet_api.Vlan(vlan_id=pppoe['c_vlan'], vlan_id_step=1)
name = 'SVLAN {}'.format(s_vlan_id)
dg = self.client.add_device_group(tp, name, sessions_per_svlan)
+ self.device_groups.append(dg)
# add ethernet layer to device group
ethernet = self.client.add_ethernet(dg, 'Ethernet')
self.protocols.append(ethernet)
@@ -181,6 +328,7 @@ class IxiaPppoeClientScenario(object):
for dg_id in range(vlan_count):
name = 'Core port {}'.format(core_tp_id)
dg = self.client.add_device_group(tp, name, sessions_per_vlan)
+ self.device_groups.append(dg)
# add ethernet layer to device group
ethernet = self.client.add_ethernet(dg, 'Ethernet')
self.protocols.append(ethernet)
@@ -295,12 +443,12 @@ class IxiaResourceHelper(ClientResourceHelper):
raise RuntimeError(
"IXIA config type '{}' not supported".format(ixia_config))
- def _initialize_client(self):
+ def _initialize_client(self, traffic_profile):
"""Initialize the IXIA IxNetwork client and configure the server"""
self.client.clear_config()
self.client.assign_ports()
self._ix_scenario.apply_config()
- self._ix_scenario.create_traffic_model()
+ self._ix_scenario.create_traffic_model(traffic_profile)
def run_traffic(self, traffic_profile, *args):
if self._terminated.value:
@@ -312,7 +460,8 @@ class IxiaResourceHelper(ClientResourceHelper):
default = "00:00:00:00:00:00"
self._build_ports()
- self._initialize_client()
+ traffic_profile.update_traffic_profile(self)
+ self._initialize_client(traffic_profile)
mac = {}
for port_name in self.vnfd_helper.port_pairs.all_ports:
diff --git a/yardstick/network_services/vnf_generic/vnf/vpe_vnf.py b/yardstick/network_services/vnf_generic/vnf/vpe_vnf.py
index 349ef7888..dd3221386 100644
--- a/yardstick/network_services/vnf_generic/vnf/vpe_vnf.py
+++ b/yardstick/network_services/vnf_generic/vnf/vpe_vnf.py
@@ -106,6 +106,7 @@ class VpeApproxSetupEnvHelper(DpdkVnfSetupEnvHelper):
action_bulk_file = vnf_cfg.get('action_bulk_file', '/tmp/action_bulk_512.txt')
full_tm_profile_file = vnf_cfg.get('full_tm_profile_file', '/tmp/full_tm_profile_10G.cfg')
config_file = vnf_cfg.get('file', '/tmp/vpe_config')
+ script_file = vnf_cfg.get('script_file', None)
vpe_vars = {
"bin_path": self.ssh_helper.bin_path,
"socket": self.socket,
@@ -113,8 +114,16 @@ class VpeApproxSetupEnvHelper(DpdkVnfSetupEnvHelper):
self._build_vnf_ports()
vpe_conf = ConfigCreate(self.vnfd_helper, self.socket)
+ if script_file is None:
+ # autogenerate vpe_script if not given
+ vpe_script = vpe_conf.generate_vpe_script(self.vnfd_helper.interfaces)
+ script_file = self.CFG_SCRIPT
+ else:
+ with utils.open_relative_file(script_file, task_path) as handle:
+ vpe_script = handle.read()
+
config_basename = posixpath.basename(config_file)
- script_basename = posixpath.basename(self.CFG_SCRIPT)
+ script_basename = posixpath.basename(script_file)
with utils.open_relative_file(action_bulk_file, task_path) as handle:
action_bulk = handle.read()
@@ -125,8 +134,6 @@ class VpeApproxSetupEnvHelper(DpdkVnfSetupEnvHelper):
with utils.open_relative_file(config_file, task_path) as handle:
vpe_config = handle.read()
- # vpe_script needs to be autogenerated
- vpe_script = vpe_conf.generate_vpe_script(self.vnfd_helper.interfaces)
# upload the 4 config files to the target server
self.ssh_helper.upload_config_file(config_basename, vpe_config.format(**vpe_vars))
self.ssh_helper.upload_config_file(script_basename, vpe_script.format(**vpe_vars))
@@ -138,7 +145,8 @@ class VpeApproxSetupEnvHelper(DpdkVnfSetupEnvHelper):
LOG.info("Provision and start the %s", self.APP_NAME)
LOG.info(config_file)
LOG.info(self.CFG_SCRIPT)
- self._build_pipeline_kwargs(cfg_file='/tmp/' + config_basename)
+ self._build_pipeline_kwargs(cfg_file='/tmp/' + config_basename,
+ script='/tmp/' + script_basename)
return self.PIPELINE_COMMAND.format(**self.pipeline_kwargs)
diff --git a/yardstick/tests/unit/benchmark/runner/test_iteration.py b/yardstick/tests/unit/benchmark/runner/test_iteration.py
new file mode 100644
index 000000000..783b236f5
--- /dev/null
+++ b/yardstick/tests/unit/benchmark/runner/test_iteration.py
@@ -0,0 +1,45 @@
+##############################################################################
+# Copyright (c) 2018 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+import mock
+import unittest
+import multiprocessing
+from yardstick.benchmark.runners import iteration
+from yardstick.common import exceptions as y_exc
+
+
+class IterationRunnerTest(unittest.TestCase):
+ def setUp(self):
+ self.scenario_cfg = {
+ 'runner': {'interval': 0, "duration": 0},
+ 'type': 'some_type'
+ }
+
+ self.benchmark = mock.Mock()
+ self.benchmark_cls = mock.Mock(return_value=self.benchmark)
+
+ def _assert_defaults__worker_run_setup_and_teardown(self):
+ self.benchmark_cls.assert_called_once_with(self.scenario_cfg, {})
+ self.benchmark.setup.assert_called_once()
+
+ def _assert_defaults__worker_run_one_iteration(self):
+ self.benchmark.pre_run_wait_time.assert_called_once_with(0)
+ self.benchmark.my_method.assert_called_once_with({})
+
+ def test__worker_process_broad_exception(self):
+ self.benchmark.my_method = mock.Mock(
+ side_effect=y_exc.YardstickException)
+
+ with self.assertRaises(Exception):
+ iteration._worker_process(mock.Mock(), self.benchmark_cls, 'my_method',
+ self.scenario_cfg, {},
+ multiprocessing.Event(), mock.Mock())
+
+ self._assert_defaults__worker_run_one_iteration()
+ self._assert_defaults__worker_run_setup_and_teardown()
diff --git a/yardstick/tests/unit/benchmark/scenarios/availability/test_attacker_baremetal.py b/yardstick/tests/unit/benchmark/scenarios/availability/test_attacker_baremetal.py
index 0f68753fd..35455a49c 100644
--- a/yardstick/tests/unit/benchmark/scenarios/availability/test_attacker_baremetal.py
+++ b/yardstick/tests/unit/benchmark/scenarios/availability/test_attacker_baremetal.py
@@ -7,10 +7,6 @@
# http://www.apache.org/licenses/LICENSE-2.0
##############################################################################
-# Unittest for
-# yardstick.benchmark.scenarios.availability.attacker.attacker_baremetal
-
-from __future__ import absolute_import
import mock
import unittest
@@ -18,33 +14,44 @@ from yardstick.benchmark.scenarios.availability.attacker import \
attacker_baremetal
-# pylint: disable=unused-argument
-# disable this for now because I keep forgetting mock patch arg ordering
+class ExecuteShellTestCase(unittest.TestCase):
+ def setUp(self):
+ self._mock_subprocess = mock.patch.object(attacker_baremetal,
+ 'subprocess')
+ self.mock_subprocess = self._mock_subprocess.start()
-@mock.patch('yardstick.benchmark.scenarios.availability.attacker.attacker_baremetal.subprocess')
-class ExecuteShellTestCase(unittest.TestCase):
+ self.addCleanup(self._stop_mocks)
- def test__fun_execute_shell_command_successful(self, mock_subprocess):
- cmd = "env"
- mock_subprocess.check_output.return_value = (0, 'unittest')
- exitcode, _ = attacker_baremetal._execute_shell_command(cmd)
+ def _stop_mocks(self):
+ self._mock_subprocess.stop()
+
+ def test__execute_shell_command_successful(self):
+ self.mock_subprocess.check_output.return_value = (0, 'unittest')
+ exitcode, _ = attacker_baremetal._execute_shell_command("env")
self.assertEqual(exitcode, 0)
- @mock.patch('yardstick.benchmark.scenarios.availability.attacker.attacker_baremetal.LOG')
- def test__fun_execute_shell_command_fail_cmd_exception(self, mock_log, mock_subprocess):
- cmd = "env"
- mock_subprocess.check_output.side_effect = RuntimeError
- exitcode, _ = attacker_baremetal._execute_shell_command(cmd)
+ @mock.patch.object(attacker_baremetal, 'LOG')
+ def test__execute_shell_command_fail_cmd_exception(self, mock_log):
+ self.mock_subprocess.check_output.side_effect = RuntimeError
+ exitcode, _ = attacker_baremetal._execute_shell_command("env")
self.assertEqual(exitcode, -1)
mock_log.error.assert_called_once()
-@mock.patch('yardstick.benchmark.scenarios.availability.attacker.attacker_baremetal.subprocess')
-@mock.patch('yardstick.benchmark.scenarios.availability.attacker.attacker_baremetal.ssh')
class AttackerBaremetalTestCase(unittest.TestCase):
def setUp(self):
+ self._mock_ssh = mock.patch.object(attacker_baremetal, 'ssh')
+ self.mock_ssh = self._mock_ssh.start()
+ self._mock_subprocess = mock.patch.object(attacker_baremetal,
+ 'subprocess')
+ self.mock_subprocess = self._mock_subprocess.start()
+ self.addCleanup(self._stop_mocks)
+
+ self.mock_ssh.SSH.from_node().execute.return_value = (
+ 0, "running", '')
+
host = {
"ipmi_ip": "10.20.0.5",
"ipmi_user": "root",
@@ -59,26 +66,26 @@ class AttackerBaremetalTestCase(unittest.TestCase):
'host': 'node1',
}
- def test__attacker_baremetal_all_successful(self, mock_ssh, mock_subprocess):
- mock_ssh.SSH.from_node().execute.return_value = (0, "running", '')
- ins = attacker_baremetal.BaremetalAttacker(self.attacker_cfg,
- self.context)
+ self.ins = attacker_baremetal.BaremetalAttacker(self.attacker_cfg,
+ self.context)
- ins.setup()
- ins.inject_fault()
- ins.recover()
+ def _stop_mocks(self):
+ self._mock_ssh.stop()
+ self._mock_subprocess.stop()
- def test__attacker_baremetal_check_failuer(self, mock_ssh, mock_subprocess):
- mock_ssh.SSH.from_node().execute.return_value = (0, "error check", '')
- ins = attacker_baremetal.BaremetalAttacker(self.attacker_cfg,
- self.context)
- ins.setup()
+ def test__attacker_baremetal_all_successful(self):
+ self.ins.setup()
+ self.ins.inject_fault()
+ self.ins.recover()
- def test__attacker_baremetal_recover_successful(self, mock_ssh, mock_subprocess):
+ def test__attacker_baremetal_check_failure(self):
+ self.mock_ssh.SSH.from_node().execute.return_value = (
+ 0, "error check", '')
+ self.ins.setup()
+ def test__attacker_baremetal_recover_successful(self):
self.attacker_cfg["jump_host"] = 'node1'
self.context["node1"]["password"] = "123456"
- mock_ssh.SSH.from_node().execute.return_value = (0, "running", '')
ins = attacker_baremetal.BaremetalAttacker(self.attacker_cfg,
self.context)
diff --git a/yardstick/tests/unit/network_services/traffic_profile/test_base.py b/yardstick/tests/unit/network_services/traffic_profile/test_base.py
index 0dc3e0579..d9244e31b 100644
--- a/yardstick/tests/unit/network_services/traffic_profile/test_base.py
+++ b/yardstick/tests/unit/network_services/traffic_profile/test_base.py
@@ -95,18 +95,18 @@ class TrafficProfileConfigTestCase(unittest.TestCase):
def test__parse_rate(self):
tp_config = {'traffic_profile': {'packet_sizes': {'64B': 100}}}
tp_config_obj = base.TrafficProfileConfig(tp_config)
- self.assertEqual((100.0, 'fps'), tp_config_obj._parse_rate('100 '))
- self.assertEqual((200.5, 'fps'), tp_config_obj._parse_rate('200.5'))
- self.assertEqual((300.8, 'fps'), tp_config_obj._parse_rate('300.8fps'))
+ self.assertEqual((100.0, 'fps'), tp_config_obj.parse_rate('100 '))
+ self.assertEqual((200.5, 'fps'), tp_config_obj.parse_rate('200.5'))
+ self.assertEqual((300.8, 'fps'), tp_config_obj.parse_rate('300.8fps'))
self.assertEqual((400.2, 'fps'),
- tp_config_obj._parse_rate('400.2 fps'))
- self.assertEqual((500.3, '%'), tp_config_obj._parse_rate('500.3%'))
- self.assertEqual((600.1, '%'), tp_config_obj._parse_rate('600.1 %'))
+ tp_config_obj.parse_rate('400.2 fps'))
+ self.assertEqual((500.3, '%'), tp_config_obj.parse_rate('500.3%'))
+ self.assertEqual((600.1, '%'), tp_config_obj.parse_rate('600.1 %'))
def test__parse_rate_exception(self):
tp_config = {'traffic_profile': {'packet_sizes': {'64B': 100}}}
tp_config_obj = base.TrafficProfileConfig(tp_config)
with self.assertRaises(exceptions.TrafficProfileRate):
- tp_config_obj._parse_rate('100Fps')
+ tp_config_obj.parse_rate('100Fps')
with self.assertRaises(exceptions.TrafficProfileRate):
- tp_config_obj._parse_rate('100 kbps')
+ tp_config_obj.parse_rate('100 kbps')
diff --git a/yardstick/tests/unit/network_services/traffic_profile/test_ixia_rfc2544.py b/yardstick/tests/unit/network_services/traffic_profile/test_ixia_rfc2544.py
index 5b39b6cd1..ef16676c7 100644
--- a/yardstick/tests/unit/network_services/traffic_profile/test_ixia_rfc2544.py
+++ b/yardstick/tests/unit/network_services/traffic_profile/test_ixia_rfc2544.py
@@ -16,6 +16,7 @@ import copy
import mock
import unittest
+import collections
from yardstick.network_services.traffic_profile import ixia_rfc2544
from yardstick.network_services.traffic_profile import trex_traffic_profile
@@ -511,9 +512,7 @@ class TestIXIARFC2544Profile(unittest.TestCase):
with mock.patch.object(rfc2544_profile, '_get_ixia_traffic_profile') \
as mock_get_tp, \
mock.patch.object(rfc2544_profile, '_ixia_traffic_generate') \
- as mock_tgenerate, \
- mock.patch.object(rfc2544_profile, 'update_traffic_profile') \
- as mock_update_tp:
+ as mock_tgenerate:
mock_get_tp.return_value = 'fake_tprofile'
output = rfc2544_profile.execute_traffic(mock.ANY,
ixia_obj=mock.ANY)
@@ -524,7 +523,6 @@ class TestIXIARFC2544Profile(unittest.TestCase):
self.assertEqual(0, rfc2544_profile.min_rate)
mock_get_tp.assert_called_once()
mock_tgenerate.assert_called_once()
- mock_update_tp.assert_called_once()
def test_execute_traffic_not_first_run(self):
rfc2544_profile = ixia_rfc2544.IXIARFC2544Profile(self.TRAFFIC_PROFILE)
@@ -683,3 +681,37 @@ class TestIXIARFC2544Profile(unittest.TestCase):
self.assertEqual(66.833, samples['RxThroughput'])
self.assertEqual(0.099651, samples['DropPercentage'])
self.assertEqual(33.45, rfc2544_profile.rate)
+
+
+class TestIXIARFC2544PppoeScenarioProfile(unittest.TestCase):
+
+ TRAFFIC_PROFILE = {
+ "schema": "nsb:traffic_profile:0.1",
+ "name": "fixed",
+ "description": "Fixed traffic profile to run UDP traffic",
+ "traffic_profile": {
+ "traffic_type": "FixedTraffic",
+ "frame_rate": 100},
+ 'uplink_0': {'ipv4': {'port': 'xe0', 'id': 1}},
+ 'downlink_0': {'ipv4': {'port': 'xe2', 'id': 2}},
+ 'uplink_1': {'ipv4': {'port': 'xe1', 'id': 3}},
+ 'downlink_1': {'ipv4': {'port': 'xe2', 'id': 4}}
+ }
+
+ def setUp(self):
+ self.ixia_tp = ixia_rfc2544.IXIARFC2544PppoeScenarioProfile(
+ self.TRAFFIC_PROFILE)
+
+ def test___init__(self):
+ self.assertIsInstance(self.ixia_tp.full_profile,
+ collections.OrderedDict)
+
+ def test__get_flow_groups_params(self):
+ expected_tp = collections.OrderedDict([
+ ('uplink_0', {'ipv4': {'id': 1, 'port': 'xe0'}}),
+ ('downlink_0', {'ipv4': {'id': 2, 'port': 'xe2'}}),
+ ('uplink_1', {'ipv4': {'id': 3, 'port': 'xe1'}}),
+ ('downlink_1', {'ipv4': {'id': 4, 'port': 'xe2'}})])
+
+ self.ixia_tp._get_flow_groups_params()
+ self.assertDictEqual(self.ixia_tp.full_profile, expected_tp)
diff --git a/yardstick/tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_ixia.py b/yardstick/tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_ixia.py
index e22398847..65bf56f1e 100644
--- a/yardstick/tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_ixia.py
+++ b/yardstick/tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_ixia.py
@@ -18,6 +18,7 @@ import mock
import six
import unittest
import ipaddress
+from collections import OrderedDict
from yardstick.common import utils
from yardstick.common import exceptions
@@ -105,6 +106,7 @@ class TestIxiaResourceHelper(unittest.TestCase):
ixia_rhelper.run_traffic(mock_tprofile)
self.assertEqual('fake_samples', ixia_rhelper._queue.get())
+ mock_tprofile.update_traffic_profile.assert_called_once()
@mock.patch.object(tg_rfc2544_ixia, 'ixnet_api')
@@ -524,12 +526,112 @@ class TestIxiaPppoeClientScenario(unittest.TestCase):
mock_apply_core_net_cfg.assert_called_once()
mock_apply_access_net_cfg.assert_called_once()
- def test_create_traffic_model(self):
- self.scenario._access_topologies = 'access'
- self.scenario._core_topologies = 'core'
- self.scenario.create_traffic_model()
+ @mock.patch.object(tg_rfc2544_ixia.IxiaPppoeClientScenario,
+ '_get_endpoints_src_dst_id_pairs')
+ @mock.patch.object(tg_rfc2544_ixia.IxiaPppoeClientScenario,
+ '_get_endpoints_src_dst_obj_pairs')
+ def test_create_traffic_model(self, mock_obj_pairs, mock_id_pairs):
+ uplink_endpoints = ['group1', 'group2']
+ downlink_endpoints = ['group3', 'group3']
+ mock_id_pairs.return_value = ['xe0', 'xe1', 'xe0', 'xe1']
+ mock_obj_pairs.return_value = ['group1', 'group3', 'group2', 'group3']
+ mock_tp = mock.Mock()
+ mock_tp.full_profile = {'uplink_0': 'data',
+ 'downlink_0': 'data',
+ 'uplink_1': 'data',
+ 'downlink_1': 'data'
+ }
+ self.scenario.create_traffic_model(mock_tp)
+ mock_id_pairs.assert_called_once_with(mock_tp.full_profile)
+ mock_obj_pairs.assert_called_once_with(['xe0', 'xe1', 'xe0', 'xe1'])
self.scenario.client.create_ipv4_traffic_model.assert_called_once_with(
- 'access', 'core')
+ uplink_endpoints, downlink_endpoints)
+
+ def test__get_endpoints_src_dst_id_pairs(self):
+ full_tp = OrderedDict([
+ ('uplink_0', {'ipv4': {'port': 'xe0'}}),
+ ('downlink_0', {'ipv4': {'port': 'xe1'}}),
+ ('uplink_1', {'ipv4': {'port': 'xe0'}}),
+ ('downlink_1', {'ipv4': {'port': 'xe3'}})])
+ endpoints_src_dst_pairs = ['xe0', 'xe1', 'xe0', 'xe3']
+ res = self.scenario._get_endpoints_src_dst_id_pairs(full_tp)
+ self.assertEqual(res, endpoints_src_dst_pairs)
+
+ def test__get_endpoints_src_dst_id_pairs_wrong_flows_number(self):
+ full_tp = OrderedDict([
+ ('uplink_0', {'ipv4': {'port': 'xe0'}}),
+ ('downlink_0', {'ipv4': {'port': 'xe1'}}),
+ ('uplink_1', {'ipv4': {'port': 'xe0'}})])
+ with self.assertRaises(RuntimeError):
+ self.scenario._get_endpoints_src_dst_id_pairs(full_tp)
+
+ def test__get_endpoints_src_dst_id_pairs_no_port_key(self):
+ full_tp = OrderedDict([
+ ('uplink_0', {'ipv4': {'id': 1}}),
+ ('downlink_0', {'ipv4': {'id': 2}})])
+ self.assertEqual(
+ self.scenario._get_endpoints_src_dst_id_pairs(full_tp), [])
+
+ def test__get_endpoints_src_dst_obj_pairs_tp_with_port_key(self):
+ endpoints_id_pairs = ['xe0', 'xe1',
+ 'xe0', 'xe1',
+ 'xe0', 'xe3',
+ 'xe0', 'xe3']
+ ixia_cfg = {
+ 'pppoe_client': {
+ 'sessions_per_port': 4,
+ 'sessions_per_svlan': 1
+ },
+ 'flow': {
+ 'src_ip': [{'tg__0': 'xe0'}, {'tg__0': 'xe2'}],
+ 'dst_ip': [{'tg__0': 'xe1'}, {'tg__0': 'xe3'}]
+ }
+ }
+
+ expected_result = ['tp1_dg1', 'tp3_dg1', 'tp1_dg2', 'tp3_dg1',
+ 'tp1_dg3', 'tp4_dg1', 'tp1_dg4', 'tp4_dg1']
+
+ self.scenario._ixia_cfg = ixia_cfg
+ self.scenario._access_topologies = ['topology1', 'topology2']
+ self.scenario._core_topologies = ['topology3', 'topology4']
+ self.mock_IxNextgen.get_topology_device_groups.side_effect = \
+ [['tp1_dg1', 'tp1_dg2', 'tp1_dg3', 'tp1_dg4'],
+ ['tp2_dg1', 'tp2_dg2', 'tp2_dg3', 'tp2_dg4'],
+ ['tp3_dg1'],
+ ['tp4_dg1']]
+ res = self.scenario._get_endpoints_src_dst_obj_pairs(
+ endpoints_id_pairs)
+ self.assertEqual(res, expected_result)
+
+ def test__get_endpoints_src_dst_obj_pairs_default_flows_mapping(self):
+ endpoints_id_pairs = []
+ ixia_cfg = {
+ 'pppoe_client': {
+ 'sessions_per_port': 4,
+ 'sessions_per_svlan': 1
+ },
+ 'flow': {
+ 'src_ip': [{'tg__0': 'xe0'}, {'tg__0': 'xe2'}],
+ 'dst_ip': [{'tg__0': 'xe1'}, {'tg__0': 'xe3'}]
+ }
+ }
+
+ expected_result = ['tp1_dg1', 'tp3_dg1', 'tp1_dg2', 'tp3_dg1',
+ 'tp1_dg3', 'tp3_dg1', 'tp1_dg4', 'tp3_dg1',
+ 'tp2_dg1', 'tp4_dg1', 'tp2_dg2', 'tp4_dg1',
+ 'tp2_dg3', 'tp4_dg1', 'tp2_dg4', 'tp4_dg1']
+
+ self.scenario._ixia_cfg = ixia_cfg
+ self.scenario._access_topologies = ['topology1', 'topology2']
+ self.scenario._core_topologies = ['topology3', 'topology4']
+ self.mock_IxNextgen.get_topology_device_groups.side_effect = \
+ [['tp1_dg1', 'tp1_dg2', 'tp1_dg3', 'tp1_dg4'],
+ ['tp2_dg1', 'tp2_dg2', 'tp2_dg3', 'tp2_dg4'],
+ ['tp3_dg1'],
+ ['tp4_dg1']]
+ res = self.scenario._get_endpoints_src_dst_obj_pairs(
+ endpoints_id_pairs)
+ self.assertEqual(res, expected_result)
def test_run_protocols(self):
self.scenario.client.is_protocols_running.return_value = True