diff options
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 |